diff options
authorAdam Coldrick <>2015-03-03 13:32:43 (GMT)
committerAdam Coldrick <>2015-04-10 13:52:25 (GMT)
commit4e1c8324696fd86b7c7dd2490a15942d31ad6ffd (patch)
parent2c821d1346389b11ca6023da682a5677985d5528 (diff)
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.
1 files changed, 30 insertions, 7 deletions
diff --git a/morphlib/plugins/ b/morphlib/plugins/
index b85c5e8..f68d004 100644
--- a/morphlib/plugins/
+++ b/morphlib/plugins/
@@ -24,6 +24,7 @@ import uuid
import cliapp
import morphlib
+from morphlib.artifactcachereference import ArtifactCacheReference
class DeployPlugin(cliapp.Plugin):
@@ -540,6 +541,27 @@ class DeployPlugin(cliapp.Plugin):
except morphlib.extensions.ExtensionNotFoundError:
+ 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:
+'Checkout chunk %(name)s.',
+ name=chunk.basename(), chatty=True)
+ lac.get(chunk, path)
+ metadata = os.path.join(path, 'baserock', '%s.meta' %
+ 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(, 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
@@ -561,24 +583,25 @@ class DeployPlugin(cliapp.Plugin):
deploy_tree = os.path.join(deployment_dir,
'overlay-deploy-%s' %
- # Unpack the artifact (tarball) to a temporary directory.
-'Unpacking system for configuration')
+ # Checkout the strata involved in the artifact into a tempdir
+'Checking out strata in system')
+ self.checkout_strata(system_tree, artifact,
+ build_command.lac, build_command.rac)
+'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):
- f = build_command.lac.get(artifact)
+ build_command.lac.get(artifact, system_tree)
raise cliapp.AppException('Deployment failed as system is'
' not yet built.\nPlease ensure'
' the system is built before'
' deployment.')
- tf =
- tf.extractall(path=system_tree)
- msg='System unpacked at %(system_tree)s',
+ msg='System checked out at %(system_tree)s',
union_filesystem =['union-filesystem']