diff options
Diffstat (limited to 'morphlib')
-rw-r--r-- | morphlib/builder2.py | 30 | ||||
-rw-r--r-- | morphlib/builder2_tests.py | 24 |
2 files changed, 45 insertions, 9 deletions
diff --git a/morphlib/builder2.py b/morphlib/builder2.py index bc7070d4..4622467d 100644 --- a/morphlib/builder2.py +++ b/morphlib/builder2.py @@ -61,7 +61,7 @@ def ldconfig(runcmd, rootdir): # pragma: no cover else: logging.debug('No %s, not running ldconfig' % conf) -def download_depends(constituents, lac, rac): +def download_depends(constituents, lac, rac, metadatas=None): for constituent in constituents: if not lac.has(constituent): source = rac.get(constituent) @@ -69,6 +69,15 @@ def download_depends(constituents, lac, rac): shutil.copyfileobj(source, target) target.close() source.close() + if metadatas is not None: + for metadata in metadatas: + if (rac.has_artifact_metadata(constituent, metadata) and + not lac.has_artifact_metadata(constituent, metadata)): + src = rac.get_artifact_metadata(constituent, metadata) + dst = lac.put_artifact_metadata(constituent, metadata) + shutil.copyfileobj(src, dst) + dst.close() + src.close() def get_chunk_files(f): # pragma: no cover tar = tarfile.open(fileobj=f) @@ -374,8 +383,6 @@ class StratumBuilder(BuilderBase): def build_and_cache(self): # pragma: no cover with self.build_watch('overall-build'): - destdir = self.staging_area.destdir(self.artifact.source) - constituents = [dependency for dependency in self.artifact.dependencies if dependency.source.morphology['kind'] == 'chunk'] @@ -397,9 +404,12 @@ class StratumBuilder(BuilderBase): self.local_artifact_cache) with self.build_watch('create-chunk-list'): + lac = self.local_artifact_cache artifact_name = self.artifact.source.morphology['name'] - self.write_metadata(destdir, artifact_name) artifact = self.new_artifact(artifact_name) + meta = self.create_metadata(artifact_name) + with lac.put_artifact_metadata(artifact, 'meta') as f: + json.dump(meta, f, indent=4, sort_keys=True) with self.local_artifact_cache.put(artifact) as f: json.dump([c.basename() for c in constituents], f) self.save_build_times() @@ -513,7 +523,8 @@ class SystemBuilder(BuilderBase): # pragma: no cover # download the stratum artifacts if necessary download_depends(self.artifact.dependencies, self.local_artifact_cache, - self.remote_artifact_cache) + self.remote_artifact_cache, + ('meta',)) # download the chunk artifacts if necessary for stratum_artifact in self.artifact.dependencies: @@ -542,6 +553,15 @@ class SystemBuilder(BuilderBase): # pragma: no cover morphlib.bins.unpack_binary_from_file(chunk_handle, path) chunk_handle.close() f.close() + meta = self.local_artifact_cache.get_artifact_metadata( + stratum_artifact, 'meta') + dst = morphlib.savefile.SaveFile( + os.path.join(path, 'baserock', + '%s.meta' % stratum_artifact.name), 'w') + shutil.copyfileobj(meta, dst) + dst.close() + meta.close() + ldconfig(self.app.runcmd, path) def _create_fstab(self, path): diff --git a/morphlib/builder2_tests.py b/morphlib/builder2_tests.py index 5a86fe75..6214891d 100644 --- a/morphlib/builder2_tests.py +++ b/morphlib/builder2_tests.py @@ -217,15 +217,31 @@ class BuilderBaseTests(unittest.TestCase): def test_downloads_depends(self): lac = FakeArtifactCache() - rac = FakeArtifactCache() - afacts = [FakeArtifact(name) for name in ('a', 'b', 'c')] - for a in afacts: + rac = FakeArtifactCache() + afacts = [FakeArtifact(name) for name in ('a', 'b', 'c')] + for a in afacts: fh = rac.put(a) fh.write(a.name) fh.close() - morphlib.builder2.download_depends(afacts, lac, rac) + morphlib.builder2.download_depends(afacts, lac, rac) self.assertTrue(all(lac.has(a) for a in afacts)) + def test_downloads_depends_metadata(self): + lac = FakeArtifactCache() + rac = FakeArtifactCache() + afacts = [FakeArtifact(name) for name in ('a', 'b', 'c')] + for a in afacts: + fh = rac.put(a) + fh.write(a.name) + fh.close() + fh = rac.put_artifact_metadata(a, 'meta') + fh.write('metadata') + fh.close() + morphlib.builder2.download_depends(afacts, lac, rac, ('meta',)) + self.assertTrue(all(lac.has(a) for a in afacts)) + self.assertTrue(all(lac.has_artifact_metadata(a, 'meta') + for a in afacts)) + class ChunkBuilderTests(unittest.TestCase): |