Merge lp:~julian-edwards/maas/nodegroup-on-bootimage-schema-part2 into lp:~maas-committers/maas/trunk
- nodegroup-on-bootimage-schema-part2
- Merge into trunk
Proposed by
Julian Edwards
Status: | Merged |
---|---|
Merged at revision: | 1297 |
Proposed branch: | lp:~julian-edwards/maas/nodegroup-on-bootimage-schema-part2 |
Merge into: | lp:~maas-committers/maas/trunk |
Prerequisite: | lp:~julian-edwards/maas/nodegroup-on-bootimage-schema |
Diff against target: |
356 lines (+85/-52) 11 files modified
src/maasserver/api.py (+4/-1) src/maasserver/models/bootimage.py (+15/-10) src/maasserver/preseed.py (+1/-1) src/maasserver/testing/factory.py (+4/-1) src/maasserver/tests/test_api.py (+27/-19) src/maasserver/tests/test_bootimage.py (+20/-9) src/maasserver/tests/test_preseed.py (+2/-2) src/maasserver/tests/test_start_up.py (+1/-1) src/provisioningserver/boot_images.py (+2/-1) src/provisioningserver/testing/boot_images.py (+2/-4) src/provisioningserver/tests/test_boot_images.py (+7/-3) |
To merge this branch: | bzr merge lp:~julian-edwards/maas/nodegroup-on-bootimage-schema-part2 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Julian Edwards (community) | Approve | ||
Gavin Panella (community) | Approve | ||
Review via email: mp+131331@code.launchpad.net |
Commit message
Enable handling of NodeGroup as a FK on BootImage. All boot images must now be associated with a node group.
Description of the change
Enable handling of NodeGroup as a FK on BootImage. All boot images must now be associated with a node group.
To post a comment you must log in.
Revision history for this message
Gavin Panella (allenap) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'src/maasserver/api.py' | |||
2 | --- src/maasserver/api.py 2012-10-19 13:55:51 +0000 | |||
3 | +++ src/maasserver/api.py 2012-10-25 07:51:20 +0000 | |||
4 | @@ -1861,11 +1861,14 @@ | |||
5 | 1861 | `purpose`, all as in the code that determines TFTP paths for | 1861 | `purpose`, all as in the code that determines TFTP paths for |
6 | 1862 | these images. | 1862 | these images. |
7 | 1863 | """ | 1863 | """ |
9 | 1864 | check_nodegroup_access(request, NodeGroup.objects.ensure_master()) | 1864 | nodegroup_uuid = get_mandatory_param(request.data, "nodegroup") |
10 | 1865 | nodegroup = get_object_or_404(NodeGroup, uuid=nodegroup_uuid) | ||
11 | 1866 | check_nodegroup_access(request, nodegroup) | ||
12 | 1865 | images = json.loads(get_mandatory_param(request.data, 'images')) | 1867 | images = json.loads(get_mandatory_param(request.data, 'images')) |
13 | 1866 | 1868 | ||
14 | 1867 | for image in images: | 1869 | for image in images: |
15 | 1868 | BootImage.objects.register_image( | 1870 | BootImage.objects.register_image( |
16 | 1871 | nodegroup=nodegroup, | ||
17 | 1869 | architecture=image['architecture'], | 1872 | architecture=image['architecture'], |
18 | 1870 | subarchitecture=image.get('subarchitecture', 'generic'), | 1873 | subarchitecture=image.get('subarchitecture', 'generic'), |
19 | 1871 | release=image['release'], | 1874 | release=image['release'], |
20 | 1872 | 1875 | ||
21 | === modified file 'src/maasserver/models/bootimage.py' | |||
22 | --- src/maasserver/models/bootimage.py 2012-10-25 07:51:20 +0000 | |||
23 | +++ src/maasserver/models/bootimage.py 2012-10-25 07:51:20 +0000 | |||
24 | @@ -31,25 +31,30 @@ | |||
25 | 31 | Don't import or instantiate this directly; access as `BootImage.objects`. | 31 | Don't import or instantiate this directly; access as `BootImage.objects`. |
26 | 32 | """ | 32 | """ |
27 | 33 | 33 | ||
30 | 34 | def get_by_natural_key(self, architecture, subarchitecture, release, | 34 | def get_by_natural_key(self, nodegroup, architecture, subarchitecture, |
31 | 35 | purpose): | 35 | release, purpose): |
32 | 36 | """Look up a specific image.""" | 36 | """Look up a specific image.""" |
33 | 37 | return self.get( | 37 | return self.get( |
36 | 38 | architecture=architecture, subarchitecture=subarchitecture, | 38 | nodegroup=nodegroup, architecture=architecture, |
37 | 39 | release=release, purpose=purpose) | 39 | subarchitecture=subarchitecture, release=release, |
38 | 40 | purpose=purpose) | ||
39 | 40 | 41 | ||
41 | 41 | def register_image(self, architecture, subarchitecture, release, purpose): | 42 | def register_image(self, nodegroup, architecture, subarchitecture, |
42 | 43 | release, purpose): | ||
43 | 42 | """Register an image if it wasn't already registered.""" | 44 | """Register an image if it wasn't already registered.""" |
44 | 43 | self.get_or_create( | 45 | self.get_or_create( |
47 | 44 | architecture=architecture, subarchitecture=subarchitecture, | 46 | nodegroup=nodegroup, architecture=architecture, |
48 | 45 | release=release, purpose=purpose) | 47 | subarchitecture=subarchitecture, release=release, |
49 | 48 | purpose=purpose) | ||
50 | 46 | 49 | ||
52 | 47 | def have_image(self, architecture, subarchitecture, release, purpose): | 50 | def have_image(self, nodegroup, architecture, subarchitecture, release, |
53 | 51 | purpose): | ||
54 | 48 | """Is an image for the given kind of boot available?""" | 52 | """Is an image for the given kind of boot available?""" |
55 | 49 | try: | 53 | try: |
56 | 50 | self.get_by_natural_key( | 54 | self.get_by_natural_key( |
59 | 51 | architecture=architecture, subarchitecture=subarchitecture, | 55 | nodegroup=nodegroup, architecture=architecture, |
60 | 52 | release=release, purpose=purpose) | 56 | subarchitecture=subarchitecture, release=release, |
61 | 57 | purpose=purpose) | ||
62 | 53 | return True | 58 | return True |
63 | 54 | except BootImage.DoesNotExist: | 59 | except BootImage.DoesNotExist: |
64 | 55 | return False | 60 | return False |
65 | 56 | 61 | ||
66 | === modified file 'src/maasserver/preseed.py' | |||
67 | --- src/maasserver/preseed.py 2012-10-02 21:07:00 +0000 | |||
68 | +++ src/maasserver/preseed.py 2012-10-25 07:51:20 +0000 | |||
69 | @@ -242,7 +242,7 @@ | |||
70 | 242 | """Whether or not the SquashFS image can be used during installation.""" | 242 | """Whether or not the SquashFS image can be used during installation.""" |
71 | 243 | arch, subarch = node.architecture.split("/") | 243 | arch, subarch = node.architecture.split("/") |
72 | 244 | return BootImage.objects.have_image( | 244 | return BootImage.objects.have_image( |
74 | 245 | arch, subarch, node.get_distro_series(), "filesystem") | 245 | node.nodegroup, arch, subarch, node.get_distro_series(), "filesystem") |
75 | 246 | 246 | ||
76 | 247 | 247 | ||
77 | 248 | def render_preseed(node, prefix, release=''): | 248 | def render_preseed(node, prefix, release=''): |
78 | 249 | 249 | ||
79 | === modified file 'src/maasserver/testing/factory.py' | |||
80 | --- src/maasserver/testing/factory.py 2012-10-02 22:28:07 +0000 | |||
81 | +++ src/maasserver/testing/factory.py 2012-10-25 07:51:20 +0000 | |||
82 | @@ -325,7 +325,7 @@ | |||
83 | 325 | '%s="%s"' % (key, value) for key, value in items.items()]) | 325 | '%s="%s"' % (key, value) for key, value in items.items()]) |
84 | 326 | 326 | ||
85 | 327 | def make_boot_image(self, architecture=None, subarchitecture=None, | 327 | def make_boot_image(self, architecture=None, subarchitecture=None, |
87 | 328 | release=None, purpose=None): | 328 | release=None, purpose=None, nodegroup=None): |
88 | 329 | if architecture is None: | 329 | if architecture is None: |
89 | 330 | architecture = self.make_name('architecture') | 330 | architecture = self.make_name('architecture') |
90 | 331 | if subarchitecture is None: | 331 | if subarchitecture is None: |
91 | @@ -334,7 +334,10 @@ | |||
92 | 334 | release = self.make_name('release') | 334 | release = self.make_name('release') |
93 | 335 | if purpose is None: | 335 | if purpose is None: |
94 | 336 | purpose = self.make_name('purpose') | 336 | purpose = self.make_name('purpose') |
95 | 337 | if nodegroup is None: | ||
96 | 338 | nodegroup = self.make_node_group() | ||
97 | 337 | return BootImage.objects.create( | 339 | return BootImage.objects.create( |
98 | 340 | nodegroup=nodegroup, | ||
99 | 338 | architecture=architecture, | 341 | architecture=architecture, |
100 | 339 | subarchitecture=subarchitecture, | 342 | subarchitecture=subarchitecture, |
101 | 340 | release=release, | 343 | release=release, |
102 | 341 | 344 | ||
103 | === modified file 'src/maasserver/tests/test_api.py' | |||
104 | --- src/maasserver/tests/test_api.py 2012-10-19 13:33:31 +0000 | |||
105 | +++ src/maasserver/tests/test_api.py 2012-10-25 07:51:20 +0000 | |||
106 | @@ -4026,48 +4026,55 @@ | |||
107 | 4026 | ('celery', FixtureResource(CeleryFixture())), | 4026 | ('celery', FixtureResource(CeleryFixture())), |
108 | 4027 | ) | 4027 | ) |
109 | 4028 | 4028 | ||
111 | 4029 | def report_images(self, images, client=None): | 4029 | def report_images(self, nodegroup, images, client=None): |
112 | 4030 | if client is None: | 4030 | if client is None: |
113 | 4031 | client = self.client | 4031 | client = self.client |
114 | 4032 | return client.post( | 4032 | return client.post( |
117 | 4033 | reverse('boot_images_handler'), | 4033 | reverse('boot_images_handler'), { |
118 | 4034 | {'op': 'report_boot_images', 'images': json.dumps(images)}) | 4034 | 'images': json.dumps(images), |
119 | 4035 | 'nodegroup': nodegroup.uuid, | ||
120 | 4036 | 'op': 'report_boot_images', | ||
121 | 4037 | }) | ||
122 | 4035 | 4038 | ||
123 | 4036 | def test_report_boot_images_does_not_work_for_normal_user(self): | 4039 | def test_report_boot_images_does_not_work_for_normal_user(self): |
125 | 4037 | NodeGroup.objects.ensure_master() | 4040 | nodegroup = NodeGroup.objects.ensure_master() |
126 | 4038 | log_in_as_normal_user(self.client) | 4041 | log_in_as_normal_user(self.client) |
129 | 4039 | response = self.report_images([]) | 4042 | response = self.report_images(nodegroup, []) |
130 | 4040 | self.assertEqual(httplib.FORBIDDEN, response.status_code) | 4043 | self.assertEqual( |
131 | 4044 | httplib.FORBIDDEN, response.status_code, response.content) | ||
132 | 4041 | 4045 | ||
133 | 4042 | def test_report_boot_images_works_for_master_worker(self): | 4046 | def test_report_boot_images_works_for_master_worker(self): |
136 | 4043 | client = make_worker_client(NodeGroup.objects.ensure_master()) | 4047 | nodegroup = NodeGroup.objects.ensure_master() |
137 | 4044 | response = self.report_images([], client=client) | 4048 | client = make_worker_client(nodegroup) |
138 | 4049 | response = self.report_images(nodegroup, [], client=client) | ||
139 | 4045 | self.assertEqual(httplib.OK, response.status_code) | 4050 | self.assertEqual(httplib.OK, response.status_code) |
140 | 4046 | 4051 | ||
141 | 4047 | def test_report_boot_images_stores_images(self): | 4052 | def test_report_boot_images_stores_images(self): |
142 | 4053 | nodegroup = NodeGroup.objects.ensure_master() | ||
143 | 4048 | image = make_boot_image_params() | 4054 | image = make_boot_image_params() |
146 | 4049 | client = make_worker_client(NodeGroup.objects.ensure_master()) | 4055 | client = make_worker_client(nodegroup) |
147 | 4050 | response = self.report_images([image], client=client) | 4056 | response = self.report_images(nodegroup, [image], client=client) |
148 | 4051 | self.assertEqual( | 4057 | self.assertEqual( |
149 | 4052 | (httplib.OK, "OK"), | 4058 | (httplib.OK, "OK"), |
150 | 4053 | (response.status_code, response.content)) | 4059 | (response.status_code, response.content)) |
151 | 4054 | self.assertTrue( | 4060 | self.assertTrue( |
153 | 4055 | BootImage.objects.have_image(**image)) | 4061 | BootImage.objects.have_image(nodegroup=nodegroup, **image)) |
154 | 4056 | 4062 | ||
155 | 4057 | def test_report_boot_images_ignores_unknown_image_properties(self): | 4063 | def test_report_boot_images_ignores_unknown_image_properties(self): |
156 | 4064 | nodegroup = NodeGroup.objects.ensure_master() | ||
157 | 4058 | image = make_boot_image_params() | 4065 | image = make_boot_image_params() |
158 | 4059 | image['nonesuch'] = factory.make_name('nonesuch'), | 4066 | image['nonesuch'] = factory.make_name('nonesuch'), |
161 | 4060 | client = make_worker_client(NodeGroup.objects.ensure_master()) | 4067 | client = make_worker_client(nodegroup) |
162 | 4061 | response = self.report_images([image], client=client) | 4068 | response = self.report_images(nodegroup, [image], client=client) |
163 | 4062 | self.assertEqual( | 4069 | self.assertEqual( |
164 | 4063 | (httplib.OK, "OK"), | 4070 | (httplib.OK, "OK"), |
165 | 4064 | (response.status_code, response.content)) | 4071 | (response.status_code, response.content)) |
166 | 4065 | 4072 | ||
167 | 4066 | def test_report_boot_images_warns_if_no_images_found(self): | 4073 | def test_report_boot_images_warns_if_no_images_found(self): |
168 | 4074 | nodegroup = NodeGroup.objects.ensure_master() | ||
169 | 4067 | recorder = self.patch(api, 'register_persistent_error') | 4075 | recorder = self.patch(api, 'register_persistent_error') |
173 | 4068 | client = make_worker_client(NodeGroup.objects.ensure_master()) | 4076 | client = make_worker_client(nodegroup) |
174 | 4069 | 4077 | response = self.report_images(nodegroup, [], client=client) | |
172 | 4070 | response = self.report_images([], client=client) | ||
175 | 4071 | self.assertEqual( | 4078 | self.assertEqual( |
176 | 4072 | (httplib.OK, "OK"), | 4079 | (httplib.OK, "OK"), |
177 | 4073 | (response.status_code, response.content)) | 4080 | (response.status_code, response.content)) |
178 | @@ -4079,10 +4086,11 @@ | |||
179 | 4079 | def test_report_boot_images_removes_warning_if_images_found(self): | 4086 | def test_report_boot_images_removes_warning_if_images_found(self): |
180 | 4080 | self.patch(api, 'register_persistent_error') | 4087 | self.patch(api, 'register_persistent_error') |
181 | 4081 | self.patch(api, 'discard_persistent_error') | 4088 | self.patch(api, 'discard_persistent_error') |
183 | 4082 | client = make_worker_client(NodeGroup.objects.ensure_master()) | 4089 | nodegroup = factory.make_node_group() |
184 | 4090 | image = make_boot_image_params() | ||
185 | 4091 | client = make_worker_client(nodegroup) | ||
186 | 4083 | 4092 | ||
189 | 4084 | response = self.report_images( | 4093 | response = self.report_images(nodegroup, [image], client=client) |
188 | 4085 | [make_boot_image_params()], client=client) | ||
190 | 4086 | self.assertEqual( | 4094 | self.assertEqual( |
191 | 4087 | (httplib.OK, "OK"), | 4095 | (httplib.OK, "OK"), |
192 | 4088 | (response.status_code, response.content)) | 4096 | (response.status_code, response.content)) |
193 | 4089 | 4097 | ||
194 | === modified file 'src/maasserver/tests/test_bootimage.py' | |||
195 | --- src/maasserver/tests/test_bootimage.py 2012-09-14 14:16:01 +0000 | |||
196 | +++ src/maasserver/tests/test_bootimage.py 2012-10-25 07:51:20 +0000 | |||
197 | @@ -12,7 +12,10 @@ | |||
198 | 12 | __metaclass__ = type | 12 | __metaclass__ = type |
199 | 13 | __all__ = [] | 13 | __all__ = [] |
200 | 14 | 14 | ||
202 | 15 | from maasserver.models import BootImage | 15 | from maasserver.models import ( |
203 | 16 | BootImage, | ||
204 | 17 | NodeGroup, | ||
205 | 18 | ) | ||
206 | 16 | from maasserver.testing.factory import factory | 19 | from maasserver.testing.factory import factory |
207 | 17 | from maasserver.testing.testcase import TestCase | 20 | from maasserver.testing.testcase import TestCase |
208 | 18 | from provisioningserver.testing.boot_images import make_boot_image_params | 21 | from provisioningserver.testing.boot_images import make_boot_image_params |
209 | @@ -20,22 +23,30 @@ | |||
210 | 20 | 23 | ||
211 | 21 | class TestBootImageManager(TestCase): | 24 | class TestBootImageManager(TestCase): |
212 | 22 | 25 | ||
213 | 26 | def setUp(self): | ||
214 | 27 | super(TestBootImageManager, self).setUp() | ||
215 | 28 | self.nodegroup = NodeGroup.objects.ensure_master() | ||
216 | 29 | |||
217 | 23 | def test_have_image_returns_False_if_image_not_available(self): | 30 | def test_have_image_returns_False_if_image_not_available(self): |
218 | 24 | self.assertFalse( | 31 | self.assertFalse( |
220 | 25 | BootImage.objects.have_image(**make_boot_image_params())) | 32 | BootImage.objects.have_image( |
221 | 33 | self.nodegroup, **make_boot_image_params())) | ||
222 | 26 | 34 | ||
223 | 27 | def test_have_image_returns_True_if_image_available(self): | 35 | def test_have_image_returns_True_if_image_available(self): |
224 | 28 | params = make_boot_image_params() | 36 | params = make_boot_image_params() |
227 | 29 | factory.make_boot_image(**params) | 37 | factory.make_boot_image(nodegroup=self.nodegroup, **params) |
228 | 30 | self.assertTrue(BootImage.objects.have_image(**params)) | 38 | self.assertTrue( |
229 | 39 | BootImage.objects.have_image(self.nodegroup, **params)) | ||
230 | 31 | 40 | ||
231 | 32 | def test_register_image_registers_new_image(self): | 41 | def test_register_image_registers_new_image(self): |
232 | 33 | params = make_boot_image_params() | 42 | params = make_boot_image_params() |
235 | 34 | BootImage.objects.register_image(**params) | 43 | BootImage.objects.register_image(self.nodegroup, **params) |
236 | 35 | self.assertTrue(BootImage.objects.have_image(**params)) | 44 | self.assertTrue( |
237 | 45 | BootImage.objects.have_image(self.nodegroup, **params)) | ||
238 | 36 | 46 | ||
239 | 37 | def test_register_image_leaves_existing_image_intact(self): | 47 | def test_register_image_leaves_existing_image_intact(self): |
240 | 38 | params = make_boot_image_params() | 48 | params = make_boot_image_params() |
244 | 39 | factory.make_boot_image(**params) | 49 | factory.make_boot_image(nodegroup=self.nodegroup, **params) |
245 | 40 | BootImage.objects.register_image(**params) | 50 | BootImage.objects.register_image(self.nodegroup, **params) |
246 | 41 | self.assertTrue(BootImage.objects.have_image(**params)) | 51 | self.assertTrue( |
247 | 52 | BootImage.objects.have_image(self.nodegroup, **params)) | ||
248 | 42 | 53 | ||
249 | === modified file 'src/maasserver/tests/test_preseed.py' | |||
250 | --- src/maasserver/tests/test_preseed.py 2012-10-05 04:21:12 +0000 | |||
251 | +++ src/maasserver/tests/test_preseed.py 2012-10-25 07:51:20 +0000 | |||
252 | @@ -330,10 +330,10 @@ | |||
253 | 330 | ) | 330 | ) |
254 | 331 | 331 | ||
255 | 332 | def test_squashfs_available(self): | 332 | def test_squashfs_available(self): |
256 | 333 | BootImage.objects.register_image( | ||
257 | 334 | self.arch, self.subarch, self.series, self.purpose) | ||
258 | 335 | node = factory.make_node( | 333 | node = factory.make_node( |
259 | 336 | architecture="i386/generic", distro_series="quantal") | 334 | architecture="i386/generic", distro_series="quantal") |
260 | 335 | BootImage.objects.register_image( | ||
261 | 336 | node.nodegroup, self.arch, self.subarch, self.series, self.purpose) | ||
262 | 337 | self.assertEqual(self.present, is_squashfs_image_present(node)) | 337 | self.assertEqual(self.present, is_squashfs_image_present(node)) |
263 | 338 | 338 | ||
264 | 339 | 339 | ||
265 | 340 | 340 | ||
266 | === modified file 'src/maasserver/tests/test_start_up.py' | |||
267 | --- src/maasserver/tests/test_start_up.py 2012-09-28 18:42:16 +0000 | |||
268 | +++ src/maasserver/tests/test_start_up.py 2012-10-25 07:51:20 +0000 | |||
269 | @@ -32,9 +32,9 @@ | |||
270 | 32 | NodeGroup, | 32 | NodeGroup, |
271 | 33 | ) | 33 | ) |
272 | 34 | from maasserver.testing.factory import factory | 34 | from maasserver.testing.factory import factory |
273 | 35 | from maasserver.testing.testcase import TestCase | ||
274 | 35 | from maastesting.celery import CeleryFixture | 36 | from maastesting.celery import CeleryFixture |
275 | 36 | from maastesting.fakemethod import FakeMethod | 37 | from maastesting.fakemethod import FakeMethod |
276 | 37 | from maastesting.testcase import TestCase | ||
277 | 38 | from mock import Mock | 38 | from mock import Mock |
278 | 39 | from provisioningserver import tasks | 39 | from provisioningserver import tasks |
279 | 40 | from testresources import FixtureResource | 40 | from testresources import FixtureResource |
280 | 41 | 41 | ||
281 | === modified file 'src/provisioningserver/boot_images.py' | |||
282 | --- src/provisioningserver/boot_images.py 2012-10-19 15:08:52 +0000 | |||
283 | +++ src/provisioningserver/boot_images.py 2012-10-25 07:51:20 +0000 | |||
284 | @@ -32,6 +32,7 @@ | |||
285 | 32 | ) | 32 | ) |
286 | 33 | from provisioningserver.config import Config | 33 | from provisioningserver.config import Config |
287 | 34 | from provisioningserver.pxe import tftppath | 34 | from provisioningserver.pxe import tftppath |
288 | 35 | from provisioningserver.start_cluster_controller import get_cluster_uuid | ||
289 | 35 | 36 | ||
290 | 36 | 37 | ||
291 | 37 | task_logger = get_task_logger(name=__name__) | 38 | task_logger = get_task_logger(name=__name__) |
292 | @@ -56,7 +57,7 @@ | |||
293 | 56 | """Submit images to server.""" | 57 | """Submit images to server.""" |
294 | 57 | MAASClient(MAASOAuth(*api_credentials), MAASDispatcher(), maas_url).post( | 58 | MAASClient(MAASOAuth(*api_credentials), MAASDispatcher(), maas_url).post( |
295 | 58 | 'api/1.0/boot-images/', 'report_boot_images', | 59 | 'api/1.0/boot-images/', 'report_boot_images', |
297 | 59 | images=json.dumps(images)) | 60 | nodegroup=get_cluster_uuid(), images=json.dumps(images)) |
298 | 60 | 61 | ||
299 | 61 | 62 | ||
300 | 62 | def report_to_server(): | 63 | def report_to_server(): |
301 | 63 | 64 | ||
302 | === modified file 'src/provisioningserver/testing/boot_images.py' | |||
303 | --- src/provisioningserver/testing/boot_images.py 2012-09-14 14:16:01 +0000 | |||
304 | +++ src/provisioningserver/testing/boot_images.py 2012-10-25 07:51:20 +0000 | |||
305 | @@ -17,7 +17,7 @@ | |||
306 | 17 | from maastesting.factory import factory | 17 | from maastesting.factory import factory |
307 | 18 | 18 | ||
308 | 19 | 19 | ||
310 | 20 | def make_boot_image_params(**kwargs): | 20 | def make_boot_image_params(): |
311 | 21 | """Create an arbitrary dict of boot-image parameters. | 21 | """Create an arbitrary dict of boot-image parameters. |
312 | 22 | 22 | ||
313 | 23 | These are the parameters that together describe a kind of boot that we | 23 | These are the parameters that together describe a kind of boot that we |
314 | @@ -25,10 +25,8 @@ | |||
315 | 25 | Ubuntu release, and boot purpose. See the `tftppath` module for how | 25 | Ubuntu release, and boot purpose. See the `tftppath` module for how |
316 | 26 | these fit together. | 26 | these fit together. |
317 | 27 | """ | 27 | """ |
319 | 28 | fields = dict( | 28 | return dict( |
320 | 29 | architecture=factory.make_name('architecture'), | 29 | architecture=factory.make_name('architecture'), |
321 | 30 | subarchitecture=factory.make_name('subarchitecture'), | 30 | subarchitecture=factory.make_name('subarchitecture'), |
322 | 31 | release=factory.make_name('release'), | 31 | release=factory.make_name('release'), |
323 | 32 | purpose=factory.make_name('purpose')) | 32 | purpose=factory.make_name('purpose')) |
324 | 33 | fields.update(kwargs) | ||
325 | 34 | return fields | ||
326 | 35 | 33 | ||
327 | === modified file 'src/provisioningserver/tests/test_boot_images.py' | |||
328 | --- src/provisioningserver/tests/test_boot_images.py 2012-10-04 05:49:09 +0000 | |||
329 | +++ src/provisioningserver/tests/test_boot_images.py 2012-10-25 07:51:20 +0000 | |||
330 | @@ -15,7 +15,10 @@ | |||
331 | 15 | import json | 15 | import json |
332 | 16 | 16 | ||
333 | 17 | from apiclient.maas_client import MAASClient | 17 | from apiclient.maas_client import MAASClient |
335 | 18 | from mock import Mock | 18 | from mock import ( |
336 | 19 | Mock, | ||
337 | 20 | sentinel, | ||
338 | 21 | ) | ||
339 | 19 | from provisioningserver import boot_images | 22 | from provisioningserver import boot_images |
340 | 20 | from provisioningserver.pxe import tftppath | 23 | from provisioningserver.pxe import tftppath |
341 | 21 | from provisioningserver.testing.boot_images import make_boot_image_params | 24 | from provisioningserver.testing.boot_images import make_boot_image_params |
342 | @@ -34,11 +37,12 @@ | |||
343 | 34 | self.set_api_credentials() | 37 | self.set_api_credentials() |
344 | 35 | image = make_boot_image_params() | 38 | image = make_boot_image_params() |
345 | 36 | self.patch(tftppath, 'list_boot_images', Mock(return_value=[image])) | 39 | self.patch(tftppath, 'list_boot_images', Mock(return_value=[image])) |
346 | 40 | get_cluster_uuid = self.patch(boot_images, "get_cluster_uuid") | ||
347 | 41 | get_cluster_uuid.return_value = sentinel.uuid | ||
348 | 37 | self.patch(MAASClient, 'post') | 42 | self.patch(MAASClient, 'post') |
349 | 38 | |||
350 | 39 | boot_images.report_to_server() | 43 | boot_images.report_to_server() |
351 | 40 | |||
352 | 41 | args, kwargs = MAASClient.post.call_args | 44 | args, kwargs = MAASClient.post.call_args |
353 | 45 | self.assertIs(sentinel.uuid, kwargs["nodegroup"]) | ||
354 | 42 | self.assertItemsEqual([image], json.loads(kwargs['images'])) | 46 | self.assertItemsEqual([image], json.loads(kwargs['images'])) |
355 | 43 | 47 | ||
356 | 44 | def test_does_nothing_without_maas_url(self): | 48 | def test_does_nothing_without_maas_url(self): |
Taint bad.