summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Coldrick <adam.coldrick@codethink.co.uk>2015-03-03 13:32:43 +0000
committerAdam Coldrick <adam.coldrick@codethink.co.uk>2015-03-03 18:41:49 +0000
commit8586e8075890b823b89adf5a7c09d9cc09ee5e06 (patch)
tree0a807b8d854906fcf3e593acdf31dcfdf96e45b2
parent73631c6dc741960292560807a052deff98a72d89 (diff)
downloadmorph-8586e8075890b823b89adf5a7c09d9cc09ee5e06.tar.gz
deploy: Use OSTree to checkout the system for deployment
Now that we have an OSTree artifact cache, the deploy plugin needs to use that to get the system to be deployed. Due to the changes in how we store systems, we need to get the contents of each stratum then put the system delta on top of that. This is still much quicker than unpacking stuff from tarballs.
-rw-r--r--morphlib/plugins/deploy_plugin.py37
1 files changed, 30 insertions, 7 deletions
diff --git a/morphlib/plugins/deploy_plugin.py b/morphlib/plugins/deploy_plugin.py
index 036f5225..c993f1e5 100644
--- a/morphlib/plugins/deploy_plugin.py
+++ b/morphlib/plugins/deploy_plugin.py
@@ -25,6 +25,7 @@ import uuid
import cliapp
import morphlib
+from morphlib.artifactcachereference import ArtifactCacheReference
class DeployPlugin(cliapp.Plugin):
@@ -541,6 +542,27 @@ class DeployPlugin(cliapp.Plugin):
except morphlib.extensions.ExtensionNotFoundError:
pass
+ def checkout_stratum(self, path, artifact, lac, rac):
+ with open(lac.get(artifact), 'r') as stratum:
+ chunks = [ArtifactCacheReference(c) for c in json.load(stratum)]
+ morphlib.builder.download_depends(chunks, lac, rac)
+ for chunk in chunks:
+ self.app.status(msg='Checkout chunk %(name)s.',
+ name=chunk.basename(), chatty=True)
+ lac.get(chunk, path)
+
+ metadata = os.path.join(path, 'baserock', '%s.meta' % artifact.name)
+ with lac.get_artifact_metadata(artifact, 'meta') as meta_src:
+ with morphlib.savefile.SaveFile(metadata, 'w') as meta_dst:
+ shutil.copyfileobj(meta_src, meta_dst)
+
+ def checkout_strata(self, path, artifact, lac, rac):
+ deps = artifact.source.dependencies
+ morphlib.builder.download_depends(deps, lac, rac)
+ for stratum in deps:
+ self.checkout_stratum(path, stratum, lac, rac)
+ morphlib.builder.ldconfig(self.app.runcmd, path)
+
def setup_deploy(self, build_command, deploy_tempdir, root_repo_dir, ref,
artifact, deployment_type, location, env):
# deployment_type, location and env are only used for saving metadata
@@ -562,24 +584,25 @@ class DeployPlugin(cliapp.Plugin):
deploy_tree = os.path.join(deployment_dir,
'overlay-deploy-%s' % artifact.name)
try:
- # Unpack the artifact (tarball) to a temporary directory.
- self.app.status(msg='Unpacking system for configuration')
+ # Checkout the strata involved in the artifact into a tempdir
+ self.app.status(msg='Checking out strata in system')
+ self.checkout_strata(system_tree, artifact,
+ build_command.lac, build_command.rac)
+ self.app.status(msg='Checking out system for configuration')
if build_command.lac.has(artifact):
- f = build_command.lac.get(artifact)
+ build_command.lac.get(artifact, system_tree)
elif build_command.rac.has(artifact):
build_command.cache_artifacts_locally([artifact])
- f = build_command.lac.get(artifact)
+ build_command.lac.get(artifact, system_tree)
else:
raise cliapp.AppException('Deployment failed as system is'
' not yet built.\nPlease ensure'
' the system is built before'
' deployment.')
- tf = tarfile.open(fileobj=f)
- tf.extractall(path=system_tree)
self.app.status(
- msg='System unpacked at %(system_tree)s',
+ msg='System checked out at %(system_tree)s',
system_tree=system_tree)
union_filesystem = self.app.settings['union-filesystem']