Factor to help testing + add 'finally' to ALWAYS remove tmpdir

parent 02c94a10
...@@ -90,58 +90,41 @@ class Software(object): ...@@ -90,58 +90,41 @@ class Software(object):
Installs from buildout otherwise. Installs from buildout otherwise.
""" """
self.logger.info("Installing software release %s..." % self.url) self.logger.info("Installing software release %s..." % self.url)
tarname = self.software_url_hash
cache_dir = tempfile.mkdtemp() cache_dir = tempfile.mkdtemp()
tarpath = os.path.join(cache_dir, tarname) try:
# Check if we can download from cache tarpath = os.path.join(cache_dir, self.software_url_hash)
if (not os.path.exists(self.software_path)) \ # Check if we can download from cache
and download_network_cached( if (not os.path.exists(self.software_path)) \
self.download_binary_cache_url, and download_network_cached(
self.download_binary_dir_url, self.download_binary_cache_url,
self.url, self.software_root, self.download_binary_dir_url,
self.software_url_hash, self.url, self.software_root,
tarpath, self.logger, self.software_url_hash,
self.signature_certificate_list, tarpath, self.logger,
self.download_from_binary_cache_url_blacklist): self.signature_certificate_list,
tar = tarfile.open(tarpath) self.download_from_binary_cache_url_blacklist):
try: tar = tarfile.open(tarpath)
self.logger.info("Extracting archive of cached software release...")
tar.extractall(path=self.software_root)
finally:
tar.close()
else:
self._install_from_buildout()
# Upload to binary cache if possible
blacklisted = False
for url in self.upload_to_binary_cache_url_blacklist:
if self.url.startswith(url):
blacklisted = True
self.logger.debug("Can't download from binary cache: "
"Software Release URL is blacklisted.")
if (self.software_root and self.url and self.software_url_hash \
and self.upload_binary_cache_url \
and self.upload_binary_dir_url \
and not blacklisted):
self.logger.info("Creating archive of software release...")
tar = tarfile.open(tarpath, "w:gz")
try: try:
tar.add(self.software_path, arcname=self.software_url_hash) self.logger.info("Extracting archive of cached software release...")
tar.extractall(path=self.software_root)
finally: finally:
tar.close() tar.close()
self.logger.info("Trying to upload archive of software release...") else:
upload_network_cached( self._install_from_buildout()
self.software_root, # Upload to binary cache if possible
self.url, self.software_url_hash, blacklisted = False
self.upload_binary_cache_url, for url in self.upload_to_binary_cache_url_blacklist:
self.upload_binary_dir_url, if self.url.startswith(url):
tarpath, self.logger, blacklisted = True
self.signature_private_key_file, self.logger.debug("Can't upload from binary cache: "
self.shacache_cert_file, "Software Release URL is blacklisted.")
self.shacache_key_file, if (self.software_root and self.url and self.software_url_hash \
self.shadir_cert_file, and self.upload_binary_cache_url \
self.shadir_key_file) and self.upload_binary_dir_url \
shutil.rmtree(cache_dir) and not blacklisted):
self.uploadSoftwareRelease(tarpath)
finally:
shutil.rmtree(cache_dir)
def _install_from_buildout(self): def _install_from_buildout(self):
""" Fetches buildout configuration from the server, run buildout with """ Fetches buildout configuration from the server, run buildout with
...@@ -192,6 +175,29 @@ class Software(object): ...@@ -192,6 +175,29 @@ class Software(object):
finally: finally:
shutil.rmtree(extends_cache) shutil.rmtree(extends_cache)
def uploadSoftwareRelease(self, tarpath):
"""
Try to tar and upload an installed Software Release.
"""
self.logger.info("Creating archive of software release...")
tar = tarfile.open(tarpath, "w:gz")
try:
tar.add(self.software_path, arcname=self.software_url_hash)
finally:
tar.close()
self.logger.info("Trying to upload archive of software release...")
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 destroy(self): def destroy(self):
"""Removes software release.""" """Removes software release."""
def retry(func, path, exc): def retry(func, path, exc):
......
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