summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/orm
diff options
context:
space:
mode:
authorAlexandru DAMIAN <alexandru.damian@intel.com>2015-02-02 17:57:36 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-02-10 23:07:48 +0000
commit202d808f890b03958cd6873486e6a37f3f437098 (patch)
tree7b88e2cb5ab7b85648821bec4d2f4c16d290207f /bitbake/lib/toaster/orm
parentb741c9a4b4047439c6c5428e36a72c22a784feda (diff)
downloadpoky-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.py23
-rw-r--r--bitbake/lib/toaster/orm/tests.py131
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
2from orm.models import LocalLayerSource, LayerIndexLayerSource, ImportedLayerSource, LayerSource 2from orm.models import LocalLayerSource, LayerIndexLayerSource, ImportedLayerSource, LayerSource
3from orm.models import Branch 3from orm.models import Branch
4 4
5from orm.models import Project, Build, Layer, Layer_Version, Branch, ProjectLayer
6from orm.models import Release, ReleaseLayerSourcePriority, BitbakeVersion
7
8from django.utils import timezone
9
10# tests to verify inheritance for the LayerSource proxy-inheritance classes
5class LayerSourceVerifyInheritanceSaveLoad(TestCase): 11class 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
27class LILSUpdateTestCase(TestCase): 33class 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
50class 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
118class 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)