Commit f0c93b97 authored by Yingjie Xu's avatar Yingjie Xu

Implement upload.

parent cb810ffa
......@@ -38,6 +38,8 @@ import utils
from svcbackend import getSupervisorRPC
from exception import BuildoutFailedError, WrongPermissionError, \
PathDoesNotExistError
from networkcache import download_network_cached, upload_network_cached
import tarfile
REQUIRED_COMPUTER_PARTITION_PERMISSION = '0750'
......@@ -45,27 +47,62 @@ REQUIRED_COMPUTER_PARTITION_PERMISSION = '0750'
class Software(object):
"""This class is responsible of installing a software release"""
def __init__(self, url, software_root, console, buildout,
signature_private_key_file=None, upload_cache_url=None,
upload_dir_url=None, shacache_cert_file=None, shacache_key_file=None,
shadir_cert_file=None, shadir_key_file=None):
signature_private_key_file=None, signature_certificate_list=None,
upload_cache_url=None, upload_dir_url=None, shacache_cert_file=None,
shacache_key_file=None, shadir_cert_file=None, shadir_key_file=None,
download_binary_cache_url=None, upload_binary_cache_url=None,
download_binary_dir_url=None, upload_binary_dir_url=None):
"""Initialisation of class parameters
"""
self.url = url
self.software_root = software_root
self.software_url_hash = utils.getSoftwareUrlHash(self.url)
self.software_path = os.path.join(self.software_root,
utils.getSoftwareUrlHash(self.url))
self.software_url_hash)
self.buildout = buildout
self.logger = logging.getLogger('BuildoutManager')
self.console = console
self.signature_private_key_file = signature_private_key_file
self.signature_certificate_list = signature_certificate_list
self.upload_cache_url = upload_cache_url
self.upload_dir_url = upload_dir_url
self.shacache_cert_file = shacache_cert_file
self.shacache_key_file = shacache_key_file
self.shadir_cert_file = shadir_cert_file
self.shadir_key_file = shadir_key_file
self.download_binary_cache_url = download_binary_cache_url
self.upload_binary_cache_url = upload_binary_cache_url
self.download_binary_dir_url = download_binary_dir_url
self.upload_binary_dir_url = upload_binary_dir_url
def install(self):
""" Fetches binary cache if possible.
Installs from buildout otherwise.
"""
tarname = self.software_url_hash
cache_dir = tempfile.mkdtemp()
tarpath = os.path.join(cache_dir, tarname)
self._install_from_buildout()
tar = tarfile.open(tarpath, "w:gz")
try:
tar.add(self.software_path, arcname=self.software_url_hash)
finally:
tar.close()
upload_network_cached(
self.software_root,
self.url,
self.software_url_hash,
self.upload_binary_cache_url,
self.upload_binary_dir_url,
tarpath, self.logger,
self.signature_private_key_file,
self.shacache_cert_file,
self.shacache_key_file,
self.shadir_cert_file,
self.shadir_key_file
)
def _install_from_buildout(self):
""" Fetches buildout configuration from the server, run buildout with
it. If it fails, we notify the server.
"""
......
......@@ -204,6 +204,17 @@ def parseArgumentTupleAndReturnSlapgridObject(*argument_tuple):
if not option_dict.get('supervisord_socket'):
option_dict['supervisord_socket'] = \
os.path.join(option_dict['instance_root'], 'supervisord.socket')
signature_certificate_list_string = \
option_dict.get('signature-certificate-list', None)
if signature_certificate_list_string is not None:
cert_marker = "-----BEGIN CERTIFICATE-----"
signature_certificate_list = [cert_marker + '\n' + q.strip() \
for q in signature_certificate_list_string.split(cert_marker) \
if q.strip()]
else:
signature_certificate_list = None
# Returning new Slapgrid instance and options
return ([Slapgrid(software_root=option_dict['software_root'],
instance_root=option_dict['instance_root'],
......@@ -218,7 +229,16 @@ def parseArgumentTupleAndReturnSlapgridObject(*argument_tuple):
master_ca_file=master_ca_file,
certificate_repository_path=certificate_repository_path,
signature_private_key_file=signature_private_key_file,
signature_certificate_list=signature_certificate_list,
download_binary_cache_url=\
option_dict.get('download-binary-cache-url', None),
upload_binary_cache_url=\
option_dict.get('upload-binary-cache-url', None),
upload_cache_url=option_dict.get('upload-cache-url', None),
download_binary_dir_url=\
option_dict.get('download-binary-dir-url', None),
upload_binary_dir_url=\
option_dict.get('upload-binary-dir-url', None),
upload_dir_url=option_dict.get('upload-dir-url', None),
console=option_dict['console'],
buildout=option_dict.get('buildout'),
......@@ -299,7 +319,12 @@ class Slapgrid(object):
key_file=None,
cert_file=None,
signature_private_key_file=None,
signature_certificate_list=None,
download_binary_cache_url=None,
upload_binary_cache_url=None,
upload_cache_url=None,
download_binary_dir_url=None,
upload_binary_dir_url=None,
upload_dir_url=None,
master_ca_file=None,
certificate_repository_path=None,
......@@ -323,7 +348,12 @@ class Slapgrid(object):
self.master_ca_file = master_ca_file
self.certificate_repository_path = certificate_repository_path
self.signature_private_key_file = signature_private_key_file
self.signature_certificate_list = signature_certificate_list
self.download_binary_cache_url = download_binary_cache_url
self.upload_binary_cache_url = upload_binary_cache_url
self.upload_cache_url = upload_cache_url
self.download_binary_dir_url = download_binary_dir_url
self.upload_binary_dir_url = upload_binary_dir_url
self.upload_dir_url = upload_dir_url
self.shacache_cert_file = shacache_cert_file
self.shacache_key_file = shacache_key_file
......@@ -403,7 +433,12 @@ class Slapgrid(object):
Software(url=software_release_uri, software_root=self.software_root,
console=self.console, buildout=self.buildout,
signature_private_key_file=self.signature_private_key_file,
signature_certificate_list=self.signature_certificate_list,
download_binary_cache_url=self.download_binary_cache_url,
upload_binary_cache_url=self.upload_binary_cache_url,
upload_cache_url=self.upload_cache_url,
download_binary_dir_url=self.download_binary_dir_url,
upload_binary_dir_url=self.upload_binary_dir_url,
upload_dir_url=self.upload_dir_url,
shacache_cert_file=self.shacache_cert_file,
shacache_key_file=self.shacache_key_file,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment