summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--morphlib/morphologyfactory.py76
-rw-r--r--morphlib/morphologyfactory_tests.py165
2 files changed, 75 insertions, 166 deletions
diff --git a/morphlib/morphologyfactory.py b/morphlib/morphologyfactory.py
index cd1972be..fd78c94f 100644
--- a/morphlib/morphologyfactory.py
+++ b/morphlib/morphologyfactory.py
@@ -37,31 +37,6 @@ class NotcachedError(MorphologyFactoryError):
"remote cache specified" % repo_name)
-class StratumError(MorphologyFactoryError):
- pass
-
-
-class NoChunkBuildDependsError(StratumError):
- def __init__(self, stratum, chunk):
- StratumError.__init__(
- self, 'No build dependencies in stratum %s for chunk %s '
- '(build-depends is a mandatory field)' % (stratum, chunk))
-
-
-class EmptyStratumError(StratumError):
-
- def __init__(self, stratum):
- cliapp.AppException.__init__(self,
- "Stratum %s is empty (has no dependencies)" % stratum)
-
-
-class NoStratumBuildDependsError(StratumError):
- def __init__(self, stratum):
- StratumError.__init__(
- self, 'Stratum %s has no build-dependencies listed '
- 'and has no bootstrap chunks.' % stratum)
-
-
class MorphologyFactory(object):
'''A way of creating morphologies which will provide a default'''
@@ -112,16 +87,8 @@ class MorphologyFactory(object):
def get_morphology(self, reponame, sha1, filename):
morph_name, text = self._get_morphology_text(reponame, sha1, filename)
- try:
- morphology = morphlib.morph2.Morphology(text)
- except morphlib.YAMLError as e: # pragma: no cover
- raise morphlib.Error("Error parsing %s: %s" %
- (filename, str(e)))
-
- if morph_name != morphology['name']:
- raise morphlib.Error(
- "Name %s does not match basename of morphology file %s" %
- (morphology['name'], filename))
+ loader = morphlib.morphloader.MorphologyLoader()
+ morphology = loader.load_from_string(text)
method_name = '_check_and_tweak_%s' % morphology['kind']
if hasattr(self, method_name):
@@ -133,54 +100,17 @@ class MorphologyFactory(object):
def _check_and_tweak_system(self, morphology, reponame, sha1, filename):
'''Check and tweak a system morphology.'''
- if morphology['arch'] is None: # pragma: no cover
- raise morphlib.Error('No arch specified in system %s '
- '(arch is a mandatory field)' %
- filename)
-
- if morphology['arch'] == 'armv7':
- morphology._dict['arch'] = 'armv7l'
-
- if morphology['arch'] not in morphlib.valid_archs:
- raise morphlib.Error('Unknown arch %s. This version of Morph '
- 'supports the following architectures: %s' %
- (morphology['arch'],
- ', '.join(morphlib.valid_archs)))
-
name = morphology['name']
morphology.builds_artifacts = [name + '-rootfs']
morphology.needs_artifact_metadata_cached = False
- morphlib.morphloader.MorphologyLoader._validate_stratum_specs_fields(
- morphology, 'strata')
- morphlib.morphloader.MorphologyLoader._set_stratum_specs_defaults(
- morphology, 'strata')
-
def _check_and_tweak_stratum(self, morphology, reponame, sha1, filename):
'''Check and tweak a stratum morphology.'''
- if len(morphology['chunks']) == 0:
- raise EmptyStratumError(morphology['name'])
-
- for source in morphology['chunks']:
- if source.get('build-depends', None) is None:
- name = source.get('name', source.get('repo', 'unknown'))
- raise NoChunkBuildDependsError(filename, name)
-
- if (len(morphology['build-depends'] or []) == 0 and
- not any(c.get('build-mode') in ('bootstrap', 'test')
- for c in morphology['chunks'])):
- raise NoStratumBuildDependsError(filename)
-
morphology.builds_artifacts = [morphology['name']]
morphology.needs_artifact_metadata_cached = True
- morphlib.morphloader.MorphologyLoader._validate_stratum_specs_fields(
- morphology, 'build-depends')
- morphlib.morphloader.MorphologyLoader._set_stratum_specs_defaults(
- morphology, 'build-depends')
-
def _check_and_tweak_chunk(self, morphology, reponame, sha1, filename):
'''Check and tweak a chunk morphology.'''
@@ -191,5 +121,3 @@ class MorphologyFactory(object):
morphology.builds_artifacts = [morphology['name']]
morphology.needs_artifact_metadata_cached = False
-
- morphlib.morphloader.MorphologyLoader._validate_chunk(morphology)
diff --git a/morphlib/morphologyfactory_tests.py b/morphlib/morphologyfactory_tests.py
index 47bf3153..347d93f7 100644
--- a/morphlib/morphologyfactory_tests.py
+++ b/morphlib/morphologyfactory_tests.py
@@ -17,7 +17,6 @@
import unittest
import morphlib
-from morphlib.morph2 import Morphology
from morphlib.morphologyfactory import (MorphologyFactory,
MorphologyNotFoundError,
NotcachedError)
@@ -41,94 +40,76 @@ class FakeRemoteRepoCache(object):
class FakeLocalRepo(object):
morphologies = {
- 'chunk.morph': '''{
- "name": "chunk",
- "kind": "chunk",
- "build-system": "bar"
- }''',
- 'chunk-split.morph': '''{
- "name": "chunk-split",
- "kind": "chunk",
- "build-system": "bar",
- "products": [
- {
- "artifact": "chunk-split-runtime",
- "include": []
- },
- {
- "artifact": "chunk-split-devel",
- "include": []
- }
- ]
- }''',
- 'stratum.morph': '''{
- "name": "stratum",
- "kind": "stratum",
- "chunks": [
- {
- "name": "chunk",
- "repo": "test:repo",
- "ref": "sha1",
- "build-mode": "bootstrap",
- "build-depends": []
- }
- ]
- }''',
- 'stratum-no-chunk-bdeps.morph': '''{
- "name": "stratum-no-chunk-bdeps",
- "kind": "stratum",
- "chunks": [
- {
- "name": "chunk",
- "repo": "test:repo",
- "ref": "sha1",
- "build-mode": "bootstrap"
- }
- ]
- }''',
- 'stratum-no-bdeps-no-bootstrap.morph': '''{
- "name": "stratum-no-bdeps-no-bootstrap",
- "kind": "stratum",
- "chunks": [
- {
- "name": "chunk",
- "repo": "test:repo",
- "ref": "sha1",
- "build-depends": []
- }
- ]
- }''',
- 'stratum-bdeps-no-bootstrap.morph': '''{
- "name": "stratum-bdeps-no-bootstrap",
- "kind": "stratum",
- "build-depends": [
- {
- "morph": "stratum"
- }
- ],
- "chunks": [
- {
- "name": "chunk",
- "repo": "test:repo",
- "ref": "sha1",
- "build-depends": []
- }
- ]
- }''',
- 'stratum-empty.morph': '''{
- "name": "stratum-empty",
- "kind": "stratum"
- }''',
- 'system.morph': '''{
- "name": "system",
- "kind": "system",
- "arch": "%(arch)s"
- }''',
- 'parse-error.morph': '''{ "name"''',
- 'name-mismatch.morph': '''{
- "name": "fred",
- "kind": "stratum"
- }''',
+ 'chunk.morph': '''
+ name: chunk
+ kind: chunk
+ build-system: bar
+ ''',
+ 'chunk-split.morph': '''
+ name: chunk-split
+ kind: chunk
+ build-system: bar
+ products:
+ - artifact: chunk-split-runtime
+ include: []
+ - artifact: chunk-split-devel
+ include: []
+ ''',
+ 'stratum.morph': '''
+ name: stratum
+ kind: stratum
+ chunks:
+ - name: chunk
+ repo: test:repo
+ ref: sha1
+ build-mode: bootstrap
+ build-depends: []
+ ''',
+ 'stratum-no-chunk-bdeps.morph': '''
+ name: stratum-no-chunk-bdeps
+ kind: stratum
+ chunks:
+ - name: chunk
+ repo: test:repo
+ ref: sha1
+ build-mode: bootstrap
+ ''',
+ 'stratum-no-bdeps-no-bootstrap.morph': '''
+ name: stratum-no-bdeps-no-bootstrap
+ kind: stratum
+ chunks:
+ - name: chunk
+ repo: test:repo
+ ref: sha1
+ build-depends: []
+ ''',
+ 'stratum-bdeps-no-bootstrap.morph': '''
+ name: stratum-bdeps-no-bootstrap
+ kind: stratum
+ build-depends:
+ - morph: stratum
+ chunks:
+ - name: chunk
+ repo: test:repo
+ ref: sha1
+ build-depends: []
+ ''',
+ 'stratum-empty.morph': '''
+ name: stratum-empty
+ kind: stratum
+ ''',
+ 'system.morph': '''
+ name: system
+ kind: system
+ arch: %(arch)s
+ strata:
+ - morph: stratum
+ ''',
+ 'parse-error.morph': ''' name''',
+ 'name-mismatch.morph': '''
+ name: fred
+ kind: stratum
+ ''',
}
def __init__(self):
@@ -313,13 +294,13 @@ class MorphologyFactoryTests(unittest.TestCase):
'reponame', 'sha1', 'parse-error.morph')
def test_fails_on_no_chunk_bdeps(self):
- self.assertRaises(morphlib.morphologyfactory.NoChunkBuildDependsError,
+ self.assertRaises(morphlib.morphloader.NoBuildDependenciesError,
self.mf.get_morphology, 'reponame', 'sha1',
'stratum-no-chunk-bdeps.morph')
def test_fails_on_no_bdeps_or_bootstrap(self):
self.assertRaises(
- morphlib.morphologyfactory.NoStratumBuildDependsError,
+ morphlib.morphloader.NoStratumBuildDependenciesError,
self.mf.get_morphology, 'reponame', 'sha1',
'stratum-no-bdeps-no-bootstrap.morph')
@@ -330,6 +311,6 @@ class MorphologyFactoryTests(unittest.TestCase):
def test_fails_on_empty_stratum(self):
self.assertRaises(
- morphlib.morphologyfactory.EmptyStratumError,
+ morphlib.morphloader.EmptyStratumError,
self.mf.get_morphology, 'reponame', 'sha1', 'stratum-empty.morph')