diff options
author | Alexandru DAMIAN <alexandru.damian@intel.com> | 2015-02-02 17:57:36 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-02-10 23:07:48 +0000 |
commit | 202d808f890b03958cd6873486e6a37f3f437098 (patch) | |
tree | 7b88e2cb5ab7b85648821bec4d2f4c16d290207f /bitbake/lib/toaster/orm | |
parent | b741c9a4b4047439c6c5428e36a72c22a784feda (diff) | |
download | poky-202d808f890b03958cd6873486e6a37f3f437098.tar.gz |
bitbake: toastergui: improvements in layer selection logic
This patch clearers and bring fixes for the layer selection
logic in order to enable information collected during build to be used
in configuring projects, specifically targeting the recipes
learned through the building process.
The patch also adds tests to verify the layer selection logic.
[YOCTO #7189]
(Bitbake rev: f0faba8ef0f08c98ac4bddf5b3954d540820d215)
Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/toaster/orm')
-rw-r--r-- | bitbake/lib/toaster/orm/models.py | 23 | ||||
-rw-r--r-- | bitbake/lib/toaster/orm/tests.py | 131 |
2 files changed, 149 insertions, 5 deletions
diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py index 5eff955453..454f3692be 100644 --- a/bitbake/lib/toaster/orm/models.py +++ b/bitbake/lib/toaster/orm/models.py | |||
@@ -103,7 +103,7 @@ class Project(models.Model): | |||
103 | if release == None: | 103 | if release == None: |
104 | release = self.release | 104 | release = self.release |
105 | # layers on the same branch or layers specifically set for this project | 105 | # layers on the same branch or layers specifically set for this project |
106 | queryset = Layer_Version.objects.filter((Q(up_branch__name = release.branch_name) & Q(project = None)) | Q(project = self)) | 106 | queryset = Layer_Version.objects.filter((Q(up_branch__name = release.branch_name) & Q(project = None)) | Q(project = self) | Q(build__project = self)) |
107 | if layer_name is not None: | 107 | if layer_name is not None: |
108 | # we select only a layer name | 108 | # we select only a layer name |
109 | queryset = queryset.filter(layer__name = layer_name) | 109 | queryset = queryset.filter(layer__name = layer_name) |
@@ -952,11 +952,24 @@ class Layer_Version(models.Model): | |||
952 | """ Returns an ordered layerversion list that satisfies a LayerVersionDependency using the layer name and the current Project Releases' LayerSource priority """ | 952 | """ Returns an ordered layerversion list that satisfies a LayerVersionDependency using the layer name and the current Project Releases' LayerSource priority """ |
953 | def _get_ls_priority(ls): | 953 | def _get_ls_priority(ls): |
954 | try: | 954 | try: |
955 | # if there is no layer source, we have minus infinite priority, as we don't want this layer selected | ||
956 | if ls == None: | ||
957 | return -10000 | ||
955 | return ls.releaselayersourcepriority_set.get(release=project.release).priority | 958 | return ls.releaselayersourcepriority_set.get(release=project.release).priority |
956 | except ReleaseLayerSourcePriority.DoesNotExist: | 959 | except ReleaseLayerSourcePriority.DoesNotExist: |
957 | raise | 960 | raise |
961 | |||
962 | # layers created for this project, or coming from a build inthe project | ||
963 | query = Q(project = project) | Q(build__project = project) | ||
964 | if self.up_branch is not None: | ||
965 | # the same up_branch name | ||
966 | query |= Q(up_branch__name=self.up_branch.name) | ||
967 | else: | ||
968 | # or we have a layer in the project that's similar to mine (See the layer.name constraint below) | ||
969 | query |= Q(projectlayer__project=project) | ||
970 | |||
958 | return sorted( | 971 | return sorted( |
959 | Layer_Version.objects.filter( layer__name = self.layer.name, up_branch__name = self.up_branch.name ), | 972 | Layer_Version.objects.filter(layer__name = self.layer.name).filter(query).select_related('layer_source', 'layer'), |
960 | key = lambda x: _get_ls_priority(x.layer_source), | 973 | key = lambda x: _get_ls_priority(x.layer_source), |
961 | reverse = True) | 974 | reverse = True) |
962 | 975 | ||
@@ -965,10 +978,12 @@ class Layer_Version(models.Model): | |||
965 | return self.commit | 978 | return self.commit |
966 | if self.branch is not None and len(self.branch) > 0: | 979 | if self.branch is not None and len(self.branch) > 0: |
967 | return self.branch | 980 | return self.branch |
968 | return self.up_branch.name | 981 | if self.up_branch is not None: |
982 | return self.up_branch.name | ||
983 | raise Exception("Cannot determine the vcs_reference for layer version %s" % vars(self)) | ||
969 | 984 | ||
970 | def __unicode__(self): | 985 | def __unicode__(self): |
971 | return str(self.layer) + " (" + self.commit +")" | 986 | return str(self.layer) + "(%s,%s)" % (self.get_vcs_reference(), self.build.project if self.build is not None else "None") |
972 | 987 | ||
973 | class Meta: | 988 | class Meta: |
974 | unique_together = ("layer_source", "up_id") | 989 | unique_together = ("layer_source", "up_id") |
diff --git a/bitbake/lib/toaster/orm/tests.py b/bitbake/lib/toaster/orm/tests.py index b965d8e50e..7b1b9633f9 100644 --- a/bitbake/lib/toaster/orm/tests.py +++ b/bitbake/lib/toaster/orm/tests.py | |||
@@ -2,6 +2,12 @@ from django.test import TestCase | |||
2 | from orm.models import LocalLayerSource, LayerIndexLayerSource, ImportedLayerSource, LayerSource | 2 | from orm.models import LocalLayerSource, LayerIndexLayerSource, ImportedLayerSource, LayerSource |
3 | from orm.models import Branch | 3 | from orm.models import Branch |
4 | 4 | ||
5 | from orm.models import Project, Build, Layer, Layer_Version, Branch, ProjectLayer | ||
6 | from orm.models import Release, ReleaseLayerSourcePriority, BitbakeVersion | ||
7 | |||
8 | from django.utils import timezone | ||
9 | |||
10 | # tests to verify inheritance for the LayerSource proxy-inheritance classes | ||
5 | class LayerSourceVerifyInheritanceSaveLoad(TestCase): | 11 | class LayerSourceVerifyInheritanceSaveLoad(TestCase): |
6 | def test_object_creation(self): | 12 | def test_object_creation(self): |
7 | lls = LayerSource.objects.create(name = "a1", sourcetype = LayerSource.TYPE_LOCAL, apiurl = "") | 13 | lls = LayerSource.objects.create(name = "a1", sourcetype = LayerSource.TYPE_LOCAL, apiurl = "") |
@@ -23,7 +29,7 @@ class LayerSourceVerifyInheritanceSaveLoad(TestCase): | |||
23 | self.assertRaises(Exception, duplicate) | 29 | self.assertRaises(Exception, duplicate) |
24 | 30 | ||
25 | 31 | ||
26 | 32 | # test to verify the layer source update functionality for layerindex. edit to pass the URL to a layerindex application | |
27 | class LILSUpdateTestCase(TestCase): | 33 | class LILSUpdateTestCase(TestCase): |
28 | def test_update(self): | 34 | def test_update(self): |
29 | lils = LayerSource.objects.create(name = "b1", sourcetype = LayerSource.TYPE_LAYERINDEX, apiurl = "http://adamian-desk.local:8080/layerindex/api/") | 35 | lils = LayerSource.objects.create(name = "b1", sourcetype = LayerSource.TYPE_LAYERINDEX, apiurl = "http://adamian-desk.local:8080/layerindex/api/") |
@@ -34,3 +40,126 @@ class LILSUpdateTestCase(TestCase): | |||
34 | 40 | ||
35 | # print vars(lils) | 41 | # print vars(lils) |
36 | #print map(lambda x: vars(x), Branch.objects.all()) | 42 | #print map(lambda x: vars(x), Branch.objects.all()) |
43 | |||
44 | # run asserts | ||
45 | self.assertTrue(lils.branch_set.all().count() > 0, "update() needs to fetch some branches") | ||
46 | |||
47 | |||
48 | |||
49 | # tests to verify layer_version priority selection | ||
50 | class LayerVersionEquivalenceTestCase(TestCase): | ||
51 | def setUp(self): | ||
52 | # create layer sources | ||
53 | ls = LayerSource.objects.create(name = "dummy-layersource", sourcetype = LayerSource.TYPE_LOCAL) | ||
54 | |||
55 | # create bitbake version | ||
56 | bbv = BitbakeVersion.objects.create(name="master", giturl="git://git.openembedded.org/bitbake") | ||
57 | # create release | ||
58 | release = Release.objects.create(name="default-release", bitbake_version = bbv, branch_name = "master") | ||
59 | # attach layer source to release | ||
60 | ReleaseLayerSourcePriority.objects.create(release = release, layer_source = ls, priority = 1) | ||
61 | |||
62 | # create layer attach | ||
63 | self.layer = Layer.objects.create(name="meta-testlayer", layer_source = ls) | ||
64 | # create branch | ||
65 | self.branch = Branch.objects.create(name="master", layer_source = ls) | ||
66 | |||
67 | # set a layer version for the layer on the specified branch | ||
68 | self.layerversion = Layer_Version.objects.create(layer = self.layer, layer_source = ls, up_branch = self.branch) | ||
69 | |||
70 | # create spoof layer that should not appear in the search results | ||
71 | Layer_Version.objects.create(layer = Layer.objects.create(name="meta-notvalid", layer_source = ls), layer_source = ls, up_branch = self.branch) | ||
72 | |||
73 | |||
74 | # create a project ... | ||
75 | self.project = Project.objects.create_project(name="test-project", release = release) | ||
76 | # ... and set it up with a single layer version | ||
77 | ProjectLayer.objects.create(project= self.project, layercommit = self.layerversion) | ||
78 | |||
79 | def test_single_layersource(self): | ||
80 | # when we have a single layer version, get_equivalents_wpriority() should return a list with just this layer_version | ||
81 | equivalent_list = self.layerversion.get_equivalents_wpriority(self.project) | ||
82 | self.assertTrue(len(equivalent_list) == 1) | ||
83 | self.assertTrue(equivalent_list[0] == self.layerversion) | ||
84 | |||
85 | def test_dual_layersource(self): | ||
86 | # if we have two layers with the same name, from different layer sources, we expect both layers in, in increasing priority of the layer source | ||
87 | ls2 = LayerSource.objects.create(name = "dummy-layersource2", sourcetype = LayerSource.TYPE_LOCAL) | ||
88 | |||
89 | # assign a lower priority for the second layer source | ||
90 | Release.objects.get(name="default-release").releaselayersourcepriority_set.create(layer_source = ls2, priority = 2) | ||
91 | |||
92 | # create a new layer_version for a layer with the same name coming from the second layer source | ||
93 | self.layer2 = Layer.objects.create(name="meta-testlayer", layer_source = ls2) | ||
94 | self.layerversion2 = Layer_Version.objects.create(layer = self.layer2, layer_source = ls2, up_branch = self.branch) | ||
95 | |||
96 | # expect two layer versions, in the priority order | ||
97 | equivalent_list = self.layerversion.get_equivalents_wpriority(self.project) | ||
98 | self.assertTrue(len(equivalent_list) == 2) | ||
99 | self.assertTrue(equivalent_list[0] == self.layerversion2) | ||
100 | self.assertTrue(equivalent_list[1] == self.layerversion) | ||
101 | |||
102 | def test_build_layerversion(self): | ||
103 | # any layer version coming from the build should show up before any layer version coming from upstream | ||
104 | build = Build.objects.create(project = self.project, started_on = timezone.now(), completed_on = timezone.now()) | ||
105 | self.layerversion_build = Layer_Version.objects.create(layer = self.layer, build = build, commit = "deadbeef") | ||
106 | |||
107 | # a build layerversion must be in the equivalence list for the original layerversion | ||
108 | equivalent_list = self.layerversion.get_equivalents_wpriority(self.project) | ||
109 | self.assertTrue(len(equivalent_list) == 2) | ||
110 | self.assertTrue(equivalent_list[0] == self.layerversion) | ||
111 | self.assertTrue(equivalent_list[1] == self.layerversion_build) | ||
112 | |||
113 | # getting the build layerversion equivalent list must return the same list as the original layer | ||
114 | build_equivalent_list = self.layerversion_build.get_equivalents_wpriority(self.project) | ||
115 | |||
116 | self.assertTrue(equivalent_list == build_equivalent_list, "%s is not %s" % (equivalent_list, build_equivalent_list)) | ||
117 | |||
118 | class ProjectLVSelectionTestCase(TestCase): | ||
119 | def setUp(self): | ||
120 | # create layer sources | ||
121 | ls = LayerSource.objects.create(name = "dummy-layersource", sourcetype = LayerSource.TYPE_LOCAL) | ||
122 | |||
123 | # create bitbake version | ||
124 | bbv = BitbakeVersion.objects.create(name="master", giturl="git://git.openembedded.org/bitbake") | ||
125 | # create release | ||
126 | release = Release.objects.create(name="default-release", bitbake_version = bbv, branch_name="master") | ||
127 | # attach layer source to release | ||
128 | ReleaseLayerSourcePriority.objects.create(release = release, layer_source = ls, priority = 1) | ||
129 | |||
130 | # create layer attach | ||
131 | self.layer = Layer.objects.create(name="meta-testlayer", layer_source = ls) | ||
132 | # create branch | ||
133 | self.branch = Branch.objects.create(name="master", layer_source = ls) | ||
134 | |||
135 | # set a layer version for the layer on the specified branch | ||
136 | self.layerversion = Layer_Version.objects.create(layer = self.layer, layer_source = ls, up_branch = self.branch) | ||
137 | |||
138 | |||
139 | # create a project ... | ||
140 | self.project = Project.objects.create_project(name="test-project", release = release) | ||
141 | # ... and set it up with a single layer version | ||
142 | ProjectLayer.objects.create(project= self.project, layercommit = self.layerversion) | ||
143 | |||
144 | def test_single_layersource(self): | ||
145 | compatible_layerversions = self.project.compatible_layerversions() | ||
146 | self.assertTrue(len(compatible_layerversions) == 1) | ||
147 | self.assertTrue(compatible_layerversions[0] == self.layerversion) | ||
148 | |||
149 | |||
150 | def test_dual_layersource(self): | ||
151 | # if we have two layers with the same name, from different layer sources, we expect both layers in, in increasing priority of the layer source | ||
152 | ls2 = LayerSource.objects.create(name = "dummy-layersource2", sourcetype = LayerSource.TYPE_LOCAL) | ||
153 | |||
154 | # assign a lower priority for the second layer source | ||
155 | Release.objects.get(name="default-release").releaselayersourcepriority_set.create(layer_source = ls2, priority = 2) | ||
156 | |||
157 | # create a new layer_version for a layer with the same name coming from the second layer source | ||
158 | self.layer2 = Layer.objects.create(name="meta-testlayer", layer_source = ls2) | ||
159 | self.layerversion2 = Layer_Version.objects.create(layer = self.layer2, layer_source = ls2, up_branch = self.branch) | ||
160 | |||
161 | # expect two layer versions, in the priority order | ||
162 | equivalent_list = self.project.compatible_layerversions() | ||
163 | self.assertTrue(len(equivalent_list) == 2) | ||
164 | self.assertTrue(equivalent_list[0] == self.layerversion2) | ||
165 | self.assertTrue(equivalent_list[1] == self.layerversion) | ||