Merge ~ltrager/maas:lp1701694 into maas:master
- Git
- lp:~ltrager/maas
- lp1701694
- Merge into master
Proposed by
Lee Trager
Status: | Merged |
---|---|
Approved by: | Lee Trager |
Approved revision: | 25239e803f86997e504f0b8f76395cbb1c117a41 |
Merge reported by: | MAAS Lander |
Merged at revision: | not available |
Proposed branch: | ~ltrager/maas:lp1701694 |
Merge into: | maas:master |
Diff against target: |
645 lines (+142/-135) 24 files modified
src/maasserver/bootresources.py (+3/-3) src/maasserver/forms/__init__.py (+11/-13) src/maasserver/forms/tests/test_bootresource.py (+45/-2) src/maasserver/models/bootresource.py (+12/-3) src/maasserver/models/tests/test_bootresource.py (+21/-0) src/maasserver/tests/test_bootresources.py (+3/-3) src/maasserver/utils/osystems.py (+3/-4) src/maasserver/utils/tests/test_osystems.py (+16/-0) src/provisioningserver/drivers/osystem/__init__.py (+5/-4) src/provisioningserver/drivers/osystem/bootloader.py (+0/-4) src/provisioningserver/drivers/osystem/centos.py (+0/-4) src/provisioningserver/drivers/osystem/custom.py (+0/-5) src/provisioningserver/drivers/osystem/rhel.py (+0/-4) src/provisioningserver/drivers/osystem/tests/test_base.py (+10/-1) src/provisioningserver/drivers/osystem/tests/test_bootloader.py (+0/-5) src/provisioningserver/drivers/osystem/tests/test_centos.py (+0/-17) src/provisioningserver/drivers/osystem/tests/test_custom.py (+0/-9) src/provisioningserver/drivers/osystem/tests/test_rhel.py (+0/-17) src/provisioningserver/drivers/osystem/tests/test_ubuntu.py (+11/-6) src/provisioningserver/drivers/osystem/tests/test_ubuntucore.py (+0/-9) src/provisioningserver/drivers/osystem/ubuntu.py (+1/-9) src/provisioningserver/drivers/osystem/ubuntucore.py (+0/-5) src/provisioningserver/drivers/osystem/windows.py (+1/-5) src/provisioningserver/testing/os.py (+0/-3) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Blake Rouse (community) | Approve | ||
Review via email: mp+327482@code.launchpad.net |
Description of the change
To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote : | # |
LANDING
-b lp1701694 lp:~ltrager/maas into -b master lp:~maas-committers/maas
STATUS: FAILED BUILD
LOG: http://
~ltrager/maas:lp1701694
updated
- 25239e8... by Lee Trager
-
Merge branch 'lp1701694' of git+ssh:
//git.launchpad .net/~ltrager/ maas into lp1701694
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/src/maasserver/bootresources.py b/src/maasserver/bootresources.py | |||
2 | index fd7ede4..514d460 100644 | |||
3 | --- a/src/maasserver/bootresources.py | |||
4 | +++ b/src/maasserver/bootresources.py | |||
5 | @@ -224,11 +224,11 @@ class SimpleStreamsHandler: | |||
6 | 224 | def get_boot_resource_identifiers(self, resource): | 224 | def get_boot_resource_identifiers(self, resource): |
7 | 225 | """Return tuple (os, arch, subarch, series) for the given resource.""" | 225 | """Return tuple (os, arch, subarch, series) for the given resource.""" |
8 | 226 | arch, subarch = resource.split_arch() | 226 | arch, subarch = resource.split_arch() |
10 | 227 | if resource.rtype == BOOT_RESOURCE_TYPE.UPLOADED: | 227 | if '/' in resource.name: |
11 | 228 | os, series = resource.name.split('/') | ||
12 | 229 | else: | ||
13 | 228 | os = 'custom' | 230 | os = 'custom' |
14 | 229 | series = resource.name | 231 | series = resource.name |
15 | 230 | else: | ||
16 | 231 | os, series = resource.name.split('/') | ||
17 | 232 | return (os, arch, subarch, series) | 232 | return (os, arch, subarch, series) |
18 | 233 | 233 | ||
19 | 234 | def get_product_name(self, resource): | 234 | def get_product_name(self, resource): |
20 | diff --git a/src/maasserver/forms/__init__.py b/src/maasserver/forms/__init__.py | |||
21 | index b58b65a..a7314d0 100644 | |||
22 | --- a/src/maasserver/forms/__init__.py | |||
23 | +++ b/src/maasserver/forms/__init__.py | |||
24 | @@ -2283,11 +2283,19 @@ class BootResourceForm(MAASModelForm): | |||
25 | 2283 | If the passed resource already has a match in the database then that | 2283 | If the passed resource already has a match in the database then that |
26 | 2284 | resource is returned. If not then the passed resource is returned. | 2284 | resource is returned. If not then the passed resource is returned. |
27 | 2285 | """ | 2285 | """ |
28 | 2286 | if resource.rtype == BOOT_RESOURCE_TYPE.UPLOADED: | ||
29 | 2287 | # Uploaded BootResources were previously generated, now they're | ||
30 | 2288 | # uploaded. Search for both to convert. | ||
31 | 2289 | rtypes = [ | ||
32 | 2290 | BOOT_RESOURCE_TYPE.UPLOADED, BOOT_RESOURCE_TYPE.GENERATED] | ||
33 | 2291 | else: | ||
34 | 2292 | rtypes = [resource.type] | ||
35 | 2286 | existing_resource = get_one( | 2293 | existing_resource = get_one( |
36 | 2287 | BootResource.objects.filter( | 2294 | BootResource.objects.filter( |
38 | 2288 | rtype=resource.rtype, | 2295 | rtype__in=rtypes, |
39 | 2289 | name=resource.name, architecture=resource.architecture)) | 2296 | name=resource.name, architecture=resource.architecture)) |
40 | 2290 | if existing_resource is not None: | 2297 | if existing_resource is not None: |
41 | 2298 | existing_resource.rtype = resource.rtype | ||
42 | 2291 | return existing_resource | 2299 | return existing_resource |
43 | 2292 | return resource | 2300 | return resource |
44 | 2293 | 2301 | ||
45 | @@ -2335,24 +2343,14 @@ class BootResourceForm(MAASModelForm): | |||
46 | 2335 | This implementation of `save` does not support the `commit` argument. | 2343 | This implementation of `save` does not support the `commit` argument. |
47 | 2336 | """ | 2344 | """ |
48 | 2337 | resource = super(BootResourceForm, self).save(commit=False) | 2345 | resource = super(BootResourceForm, self).save(commit=False) |
60 | 2338 | 2346 | resource.rtype = BOOT_RESOURCE_TYPE.UPLOADED | |
50 | 2339 | # XXX blake_r 2014-09-22 bug=1361370: Temporarily support the ability | ||
51 | 2340 | # to upload a generated image. This should only exist while CentOS and | ||
52 | 2341 | # Windows images need to be uploaded, rather than synced or generated. | ||
53 | 2342 | if '/' not in resource.name: | ||
54 | 2343 | label = 'uploaded' | ||
55 | 2344 | resource.rtype = BOOT_RESOURCE_TYPE.UPLOADED | ||
56 | 2345 | else: | ||
57 | 2346 | label = 'generated' | ||
58 | 2347 | resource.rtype = BOOT_RESOURCE_TYPE.GENERATED | ||
59 | 2348 | |||
61 | 2349 | resource = self.get_existing_resource(resource) | 2347 | resource = self.get_existing_resource(resource) |
62 | 2350 | resource.extra = {'subarches': resource.architecture.split('/')[1]} | 2348 | resource.extra = {'subarches': resource.architecture.split('/')[1]} |
63 | 2351 | if 'title' in self.cleaned_data: | 2349 | if 'title' in self.cleaned_data: |
64 | 2352 | resource.extra['title'] = self.cleaned_data['title'] | 2350 | resource.extra['title'] = self.cleaned_data['title'] |
65 | 2353 | 2351 | ||
66 | 2354 | resource.save() | 2352 | resource.save() |
68 | 2355 | resource_set = self.create_resource_set(resource, label) | 2353 | resource_set = self.create_resource_set(resource, 'uploaded') |
69 | 2356 | self.create_resource_file( | 2354 | self.create_resource_file( |
70 | 2357 | resource_set, self.cleaned_data) | 2355 | resource_set, self.cleaned_data) |
71 | 2358 | return resource | 2356 | return resource |
72 | diff --git a/src/maasserver/forms/tests/test_bootresource.py b/src/maasserver/forms/tests/test_bootresource.py | |||
73 | index d9f3c5d..c03792b 100644 | |||
74 | --- a/src/maasserver/forms/tests/test_bootresource.py | |||
75 | +++ b/src/maasserver/forms/tests/test_bootresource.py | |||
76 | @@ -9,6 +9,7 @@ import random | |||
77 | 9 | 9 | ||
78 | 10 | from django.core.files.uploadedfile import SimpleUploadedFile | 10 | from django.core.files.uploadedfile import SimpleUploadedFile |
79 | 11 | from maasserver import forms as forms_module | 11 | from maasserver import forms as forms_module |
80 | 12 | from maasserver.clusterrpc import osystems | ||
81 | 12 | from maasserver.enum import ( | 13 | from maasserver.enum import ( |
82 | 13 | BOOT_RESOURCE_FILE_TYPE, | 14 | BOOT_RESOURCE_FILE_TYPE, |
83 | 14 | BOOT_RESOURCE_TYPE, | 15 | BOOT_RESOURCE_TYPE, |
84 | @@ -189,8 +190,11 @@ class TestBootResourceForm(MAASServerTestCase): | |||
85 | 189 | written_content = stream.read() | 190 | written_content = stream.read() |
86 | 190 | self.assertEqual(content, written_content) | 191 | self.assertEqual(content, written_content) |
87 | 191 | 192 | ||
89 | 192 | def test_creates_boot_resoures_with_generated_rtype(self): | 193 | def test_creates_boot_resoures_with_uploaded_rtype(self): |
90 | 193 | os = factory.make_name('os') | 194 | os = factory.make_name('os') |
91 | 195 | self.patch( | ||
92 | 196 | osystems, 'gen_all_known_operating_systems').return_value = [ | ||
93 | 197 | {'name': os}] | ||
94 | 194 | series = factory.make_name('series') | 198 | series = factory.make_name('series') |
95 | 195 | name = '%s/%s' % (os, series) | 199 | name = '%s/%s' % (os, series) |
96 | 196 | architecture = make_usable_architecture(self) | 200 | architecture = make_usable_architecture(self) |
97 | @@ -208,7 +212,7 @@ class TestBootResourceForm(MAASServerTestCase): | |||
98 | 208 | self.assertTrue(form.is_valid(), form._errors) | 212 | self.assertTrue(form.is_valid(), form._errors) |
99 | 209 | form.save() | 213 | form.save() |
100 | 210 | resource = BootResource.objects.get( | 214 | resource = BootResource.objects.get( |
102 | 211 | rtype=BOOT_RESOURCE_TYPE.GENERATED, | 215 | rtype=BOOT_RESOURCE_TYPE.UPLOADED, |
103 | 212 | name=name, architecture=architecture) | 216 | name=name, architecture=architecture) |
104 | 213 | resource_set = resource.sets.first() | 217 | resource_set = resource.sets.first() |
105 | 214 | rfile = resource_set.files.first() | 218 | rfile = resource_set.files.first() |
106 | @@ -221,6 +225,9 @@ class TestBootResourceForm(MAASServerTestCase): | |||
107 | 221 | 225 | ||
108 | 222 | def test_adds_boot_resource_set_to_existing_generated_boot_resource(self): | 226 | def test_adds_boot_resource_set_to_existing_generated_boot_resource(self): |
109 | 223 | os = factory.make_name('os') | 227 | os = factory.make_name('os') |
110 | 228 | self.patch( | ||
111 | 229 | osystems, 'gen_all_known_operating_systems').return_value = [ | ||
112 | 230 | {'name': os}] | ||
113 | 224 | series = factory.make_name('series') | 231 | series = factory.make_name('series') |
114 | 225 | name = '%s/%s' % (os, series) | 232 | name = '%s/%s' % (os, series) |
115 | 226 | architecture = make_usable_architecture(self) | 233 | architecture = make_usable_architecture(self) |
116 | @@ -249,6 +256,42 @@ class TestBootResourceForm(MAASServerTestCase): | |||
117 | 249 | with rfile.largefile.content.open('rb') as stream: | 256 | with rfile.largefile.content.open('rb') as stream: |
118 | 250 | written_content = stream.read() | 257 | written_content = stream.read() |
119 | 251 | self.assertEqual(content, written_content) | 258 | self.assertEqual(content, written_content) |
120 | 259 | self.assertEqual(resource.rtype, BOOT_RESOURCE_TYPE.UPLOADED) | ||
121 | 260 | |||
122 | 261 | def test_adds_boot_resource_set_to_existing_uploaded_boot_resource(self): | ||
123 | 262 | os = factory.make_name('os') | ||
124 | 263 | self.patch( | ||
125 | 264 | osystems, 'gen_all_known_operating_systems').return_value = [ | ||
126 | 265 | {'name': os}] | ||
127 | 266 | series = factory.make_name('series') | ||
128 | 267 | name = '%s/%s' % (os, series) | ||
129 | 268 | architecture = make_usable_architecture(self) | ||
130 | 269 | resource = factory.make_usable_boot_resource( | ||
131 | 270 | rtype=BOOT_RESOURCE_TYPE.UPLOADED, | ||
132 | 271 | name=name, architecture=architecture) | ||
133 | 272 | upload_type, filetype = self.pick_filetype() | ||
134 | 273 | size = random.randint(1024, 2048) | ||
135 | 274 | content = factory.make_string(size).encode('utf-8') | ||
136 | 275 | upload_name = factory.make_name('filename') | ||
137 | 276 | uploaded_file = SimpleUploadedFile(content=content, name=upload_name) | ||
138 | 277 | data = { | ||
139 | 278 | 'name': name, | ||
140 | 279 | 'architecture': architecture, | ||
141 | 280 | 'filetype': upload_type, | ||
142 | 281 | } | ||
143 | 282 | form = BootResourceForm(data=data, files={'content': uploaded_file}) | ||
144 | 283 | self.assertTrue(form.is_valid(), form._errors) | ||
145 | 284 | form.save() | ||
146 | 285 | resource = reload_object(resource) | ||
147 | 286 | resource_set = resource.sets.order_by('id').last() | ||
148 | 287 | rfile = resource_set.files.first() | ||
149 | 288 | self.assertTrue(filetype, rfile.filetype) | ||
150 | 289 | self.assertTrue(filetype, rfile.filename) | ||
151 | 290 | self.assertTrue(size, rfile.largefile.total_size) | ||
152 | 291 | with rfile.largefile.content.open('rb') as stream: | ||
153 | 292 | written_content = stream.read() | ||
154 | 293 | self.assertEqual(content, written_content) | ||
155 | 294 | self.assertEqual(resource.rtype, BOOT_RESOURCE_TYPE.UPLOADED) | ||
156 | 252 | 295 | ||
157 | 253 | def test_requires_fields(self): | 296 | def test_requires_fields(self): |
158 | 254 | form = BootResourceForm(data={}) | 297 | form = BootResourceForm(data={}) |
159 | diff --git a/src/maasserver/models/bootresource.py b/src/maasserver/models/bootresource.py | |||
160 | index 905e675..5af3eee 100644 | |||
161 | --- a/src/maasserver/models/bootresource.py | |||
162 | +++ b/src/maasserver/models/bootresource.py | |||
163 | @@ -187,6 +187,7 @@ class BootResourceManager(Manager): | |||
164 | 187 | rtypes = [ | 187 | rtypes = [ |
165 | 188 | BOOT_RESOURCE_TYPE.SYNCED, | 188 | BOOT_RESOURCE_TYPE.SYNCED, |
166 | 189 | BOOT_RESOURCE_TYPE.GENERATED, | 189 | BOOT_RESOURCE_TYPE.GENERATED, |
167 | 190 | BOOT_RESOURCE_TYPE.UPLOADED, | ||
168 | 190 | ] | 191 | ] |
169 | 191 | name = '%s/%s' % (image['osystem'], image['release']) | 192 | name = '%s/%s' % (image['osystem'], image['release']) |
170 | 192 | else: | 193 | else: |
171 | @@ -442,9 +443,17 @@ class BootResource(CleanSave, TimestampedModel): | |||
172 | 442 | """ | 443 | """ |
173 | 443 | if self.rtype == BOOT_RESOURCE_TYPE.UPLOADED: | 444 | if self.rtype == BOOT_RESOURCE_TYPE.UPLOADED: |
174 | 444 | if '/' in self.name: | 445 | if '/' in self.name: |
178 | 445 | raise ValidationError( | 446 | # Avoid circular dependency |
179 | 446 | "%s boot resource cannot contain a '/' in it's name." % ( | 447 | from maasserver.clusterrpc.osystems import ( |
180 | 447 | self.display_rtype)) | 448 | gen_all_known_operating_systems, |
181 | 449 | ) | ||
182 | 450 | osystem = self.name.split('/')[0] | ||
183 | 451 | if osystem not in { | ||
184 | 452 | i['name'] for i in gen_all_known_operating_systems()}: | ||
185 | 453 | raise ValidationError( | ||
186 | 454 | "%s boot resource cannot contain a '/' in it's name " | ||
187 | 455 | "unless it starts with a supported operating system." | ||
188 | 456 | % (self.display_rtype)) | ||
189 | 448 | elif self.rtype in RTYPE_REQUIRING_OS_SERIES_NAME: | 457 | elif self.rtype in RTYPE_REQUIRING_OS_SERIES_NAME: |
190 | 449 | if '/' not in self.name: | 458 | if '/' not in self.name: |
191 | 450 | raise ValidationError( | 459 | raise ValidationError( |
192 | diff --git a/src/maasserver/models/tests/test_bootresource.py b/src/maasserver/models/tests/test_bootresource.py | |||
193 | index 2efb4fc..59c3ac2 100644 | |||
194 | --- a/src/maasserver/models/tests/test_bootresource.py | |||
195 | +++ b/src/maasserver/models/tests/test_bootresource.py | |||
196 | @@ -10,6 +10,7 @@ from datetime import datetime | |||
197 | 10 | import random | 10 | import random |
198 | 11 | 11 | ||
199 | 12 | from django.core.exceptions import ValidationError | 12 | from django.core.exceptions import ValidationError |
200 | 13 | from maasserver.clusterrpc import osystems | ||
201 | 13 | from maasserver.clusterrpc.testing.boot_images import make_rpc_boot_image | 14 | from maasserver.clusterrpc.testing.boot_images import make_rpc_boot_image |
202 | 14 | from maasserver.enum import ( | 15 | from maasserver.enum import ( |
203 | 15 | BOOT_RESOURCE_FILE_TYPE, | 16 | BOOT_RESOURCE_FILE_TYPE, |
204 | @@ -771,6 +772,26 @@ class TestBootResource(MAASServerTestCase): | |||
205 | 771 | self.assertRaises( | 772 | self.assertRaises( |
206 | 772 | ValidationError, resource.save) | 773 | ValidationError, resource.save) |
207 | 773 | 774 | ||
208 | 775 | def test_validation_allows_any_uploaded_name_slash_with_supported_os(self): | ||
209 | 776 | osystem = factory.make_name('osystem') | ||
210 | 777 | self.patch( | ||
211 | 778 | osystems, 'gen_all_known_operating_systems').return_value = [ | ||
212 | 779 | {'name': osystem}] | ||
213 | 780 | name = '%s/%s' % (osystem, factory.make_name('release')) | ||
214 | 781 | arch = '%s/%s' % ( | ||
215 | 782 | factory.make_name('arch'), factory.make_name('subarch')) | ||
216 | 783 | resource = BootResource( | ||
217 | 784 | rtype=BOOT_RESOURCE_TYPE.UPLOADED, name=name, architecture=arch) | ||
218 | 785 | resource.save() | ||
219 | 786 | |||
220 | 787 | def test_validation_allows_any_uploaded_name_without_slash(self): | ||
221 | 788 | name = factory.make_name('name') | ||
222 | 789 | arch = '%s/%s' % ( | ||
223 | 790 | factory.make_name('arch'), factory.make_name('subarch')) | ||
224 | 791 | resource = BootResource( | ||
225 | 792 | rtype=BOOT_RESOURCE_TYPE.UPLOADED, name=name, architecture=arch) | ||
226 | 793 | resource.save() | ||
227 | 794 | |||
228 | 774 | def test_create_raises_error_on_not_unique(self): | 795 | def test_create_raises_error_on_not_unique(self): |
229 | 775 | name = '%s/%s' % ( | 796 | name = '%s/%s' % ( |
230 | 776 | factory.make_name('os'), factory.make_name('series')) | 797 | factory.make_name('os'), factory.make_name('series')) |
231 | diff --git a/src/maasserver/tests/test_bootresources.py b/src/maasserver/tests/test_bootresources.py | |||
232 | index b3fd049..5047e03 100644 | |||
233 | --- a/src/maasserver/tests/test_bootresources.py | |||
234 | +++ b/src/maasserver/tests/test_bootresources.py | |||
235 | @@ -200,11 +200,11 @@ class TestSimpleStreamsHandler(MAASServerTestCase): | |||
236 | 200 | 200 | ||
237 | 201 | def get_product_name_for_resource(self, resource): | 201 | def get_product_name_for_resource(self, resource): |
238 | 202 | arch, subarch = resource.architecture.split('/') | 202 | arch, subarch = resource.architecture.split('/') |
240 | 203 | if resource.rtype == BOOT_RESOURCE_TYPE.UPLOADED: | 203 | if '/' in resource.name: |
241 | 204 | os, series = resource.name.split('/') | ||
242 | 205 | else: | ||
243 | 204 | os = 'custom' | 206 | os = 'custom' |
244 | 205 | series = resource.name | 207 | series = resource.name |
245 | 206 | else: | ||
246 | 207 | os, series = resource.name.split('/') | ||
247 | 208 | return 'maas:boot:%s:%s:%s:%s' % (os, arch, subarch, series) | 208 | return 'maas:boot:%s:%s:%s:%s' % (os, arch, subarch, series) |
248 | 209 | 209 | ||
249 | 210 | def make_usable_product_boot_resource( | 210 | def make_usable_product_boot_resource( |
250 | diff --git a/src/maasserver/utils/osystems.py b/src/maasserver/utils/osystems.py | |||
251 | index 4a624f5..2746d46 100644 | |||
252 | --- a/src/maasserver/utils/osystems.py | |||
253 | +++ b/src/maasserver/utils/osystems.py | |||
254 | @@ -25,7 +25,6 @@ from distro_info import UbuntuDistroInfo | |||
255 | 25 | from django.core.exceptions import ValidationError | 25 | from django.core.exceptions import ValidationError |
256 | 26 | from django.db.models import Q | 26 | from django.db.models import Q |
257 | 27 | from maasserver.clusterrpc.osystems import gen_all_known_operating_systems | 27 | from maasserver.clusterrpc.osystems import gen_all_known_operating_systems |
258 | 28 | from maasserver.enum import BOOT_RESOURCE_TYPE | ||
259 | 29 | from maasserver.models import ( | 28 | from maasserver.models import ( |
260 | 30 | BootResource, | 29 | BootResource, |
261 | 31 | BootSourceCache, | 30 | BootSourceCache, |
262 | @@ -75,11 +74,11 @@ def list_all_usable_releases(osystems): | |||
263 | 75 | # When custom images are returned by list_all_usable_osystems | 74 | # When custom images are returned by list_all_usable_osystems |
264 | 76 | # the osystem name is 'custom' and the release name to whatever | 75 | # the osystem name is 'custom' and the release name to whatever |
265 | 77 | # the user specified. | 76 | # the user specified. |
267 | 78 | if resource.rtype == BOOT_RESOURCE_TYPE.UPLOADED: | 77 | if '/' in resource.name: |
268 | 78 | osystem, release = resource.name.split('/') | ||
269 | 79 | else: | ||
270 | 79 | osystem = 'custom' | 80 | osystem = 'custom' |
271 | 80 | release = resource.name | 81 | release = resource.name |
272 | 81 | else: | ||
273 | 82 | osystem, release = resource.name.split('/') | ||
274 | 83 | if osystem not in titles: | 82 | if osystem not in titles: |
275 | 84 | titles[osystem] = {} | 83 | titles[osystem] = {} |
276 | 85 | titles[osystem][release] = resource.extra['title'] | 84 | titles[osystem][release] = resource.extra['title'] |
277 | diff --git a/src/maasserver/utils/tests/test_osystems.py b/src/maasserver/utils/tests/test_osystems.py | |||
278 | index bf8c2d5..8ee6b92 100644 | |||
279 | --- a/src/maasserver/utils/tests/test_osystems.py | |||
280 | +++ b/src/maasserver/utils/tests/test_osystems.py | |||
281 | @@ -10,6 +10,7 @@ import random | |||
282 | 10 | 10 | ||
283 | 11 | from distro_info import UbuntuDistroInfo | 11 | from distro_info import UbuntuDistroInfo |
284 | 12 | from django.core.exceptions import ValidationError | 12 | from django.core.exceptions import ValidationError |
285 | 13 | from maasserver.clusterrpc import osystems | ||
286 | 13 | from maasserver.clusterrpc.testing.osystems import ( | 14 | from maasserver.clusterrpc.testing.osystems import ( |
287 | 14 | make_rpc_osystem, | 15 | make_rpc_osystem, |
288 | 15 | make_rpc_release, | 16 | make_rpc_release, |
289 | @@ -154,6 +155,21 @@ class TestReleases(MAASServerTestCase): | |||
290 | 154 | title, | 155 | title, |
291 | 155 | list_all_usable_releases([osystem])[osystem['name']][0]['title']) | 156 | list_all_usable_releases([osystem])[osystem['name']][0]['title']) |
292 | 156 | 157 | ||
293 | 158 | def test_list_all_usable_releases_finds_uploaded_with_osystem(self): | ||
294 | 159 | release = make_rpc_release() | ||
295 | 160 | osystem = make_rpc_osystem(releases=[release]) | ||
296 | 161 | title = factory.make_name('title') | ||
297 | 162 | self.patch( | ||
298 | 163 | osystems, 'gen_all_known_operating_systems').return_value = [ | ||
299 | 164 | {'name': osystem['name']}] | ||
300 | 165 | factory.make_BootResource( | ||
301 | 166 | rtype=BOOT_RESOURCE_TYPE.UPLOADED, | ||
302 | 167 | name='%s/%s' % (osystem['name'], release['name']), | ||
303 | 168 | extra={'title': title}) | ||
304 | 169 | self.assertEquals( | ||
305 | 170 | title, | ||
306 | 171 | list_all_usable_releases([osystem])[osystem['name']][0]['title']) | ||
307 | 172 | |||
308 | 157 | def test_list_all_releases_requiring_keys(self): | 173 | def test_list_all_releases_requiring_keys(self): |
309 | 158 | releases = [ | 174 | releases = [ |
310 | 159 | make_rpc_release(requires_license_key=True) for _ in range(3)] | 175 | make_rpc_release(requires_license_key=True) for _ in range(3)] |
311 | diff --git a/src/provisioningserver/drivers/osystem/__init__.py b/src/provisioningserver/drivers/osystem/__init__.py | |||
312 | index 2b049ff..ef754d8 100644 | |||
313 | --- a/src/provisioningserver/drivers/osystem/__init__.py | |||
314 | +++ b/src/provisioningserver/drivers/osystem/__init__.py | |||
315 | @@ -67,10 +67,6 @@ class OperatingSystem(metaclass=ABCMeta): | |||
316 | 67 | """Title of the operating system.""" | 67 | """Title of the operating system.""" |
317 | 68 | 68 | ||
318 | 69 | @abstractmethod | 69 | @abstractmethod |
319 | 70 | def is_release_supported(self, release): | ||
320 | 71 | """Return True when the release is supported, False otherwise.""" | ||
321 | 72 | |||
322 | 73 | @abstractmethod | ||
323 | 74 | def get_default_release(self): | 70 | def get_default_release(self): |
324 | 75 | """Return the default release to use when none is specified. | 71 | """Return the default release to use when none is specified. |
325 | 76 | 72 | ||
326 | @@ -96,6 +92,11 @@ class OperatingSystem(metaclass=ABCMeta): | |||
327 | 96 | :return: list of supported purposes | 92 | :return: list of supported purposes |
328 | 97 | """ | 93 | """ |
329 | 98 | 94 | ||
330 | 95 | def is_release_supported(self, release): | ||
331 | 96 | """Return True when the release is supported, False otherwise.""" | ||
332 | 97 | # If the osystem matches assume all releases are supported. | ||
333 | 98 | return True | ||
334 | 99 | |||
335 | 99 | def format_release_choices(self, releases): | 100 | def format_release_choices(self, releases): |
336 | 100 | """Format the release choices that are presented to the user. | 101 | """Format the release choices that are presented to the user. |
337 | 101 | 102 | ||
338 | diff --git a/src/provisioningserver/drivers/osystem/bootloader.py b/src/provisioningserver/drivers/osystem/bootloader.py | |||
339 | index 6ada008..2811a82 100644 | |||
340 | --- a/src/provisioningserver/drivers/osystem/bootloader.py | |||
341 | +++ b/src/provisioningserver/drivers/osystem/bootloader.py | |||
342 | @@ -18,10 +18,6 @@ class BootLoaderOS(OperatingSystem): | |||
343 | 18 | name = 'bootloader' | 18 | name = 'bootloader' |
344 | 19 | title = 'Bootloader' | 19 | title = 'Bootloader' |
345 | 20 | 20 | ||
346 | 21 | def is_release_supported(self, release): | ||
347 | 22 | # All releases are supported, they're pulled from the Ubuntu archive. | ||
348 | 23 | return True | ||
349 | 24 | |||
350 | 25 | def get_default_release(self): | 21 | def get_default_release(self): |
351 | 26 | # No Default bootloader as it depends on the arch. | 22 | # No Default bootloader as it depends on the arch. |
352 | 27 | return '' | 23 | return '' |
353 | diff --git a/src/provisioningserver/drivers/osystem/centos.py b/src/provisioningserver/drivers/osystem/centos.py | |||
354 | index 179fa0c..b9f2290 100644 | |||
355 | --- a/src/provisioningserver/drivers/osystem/centos.py | |||
356 | +++ b/src/provisioningserver/drivers/osystem/centos.py | |||
357 | @@ -35,10 +35,6 @@ class CentOS(OperatingSystem): | |||
358 | 35 | BOOT_IMAGE_PURPOSE.XINSTALL | 35 | BOOT_IMAGE_PURPOSE.XINSTALL |
359 | 36 | ] | 36 | ] |
360 | 37 | 37 | ||
361 | 38 | def is_release_supported(self, release): | ||
362 | 39 | matched = DISTRO_MATCHER.match(release) | ||
363 | 40 | return matched is not None | ||
364 | 41 | |||
365 | 42 | def get_default_release(self): | 38 | def get_default_release(self): |
366 | 43 | """Gets the default release to use when a release is not | 39 | """Gets the default release to use when a release is not |
367 | 44 | explicit.""" | 40 | explicit.""" |
368 | diff --git a/src/provisioningserver/drivers/osystem/custom.py b/src/provisioningserver/drivers/osystem/custom.py | |||
369 | index 6e817e1..845c132 100644 | |||
370 | --- a/src/provisioningserver/drivers/osystem/custom.py | |||
371 | +++ b/src/provisioningserver/drivers/osystem/custom.py | |||
372 | @@ -27,11 +27,6 @@ class CustomOS(OperatingSystem): | |||
373 | 27 | # Custom images can only be used with XINSTALL. | 27 | # Custom images can only be used with XINSTALL. |
374 | 28 | return [BOOT_IMAGE_PURPOSE.XINSTALL] | 28 | return [BOOT_IMAGE_PURPOSE.XINSTALL] |
375 | 29 | 29 | ||
376 | 30 | def is_release_supported(self, release): | ||
377 | 31 | """Return True when the release is supported, False otherwise.""" | ||
378 | 32 | # All release are supported, since the user uploaded it. | ||
379 | 33 | return True | ||
380 | 34 | |||
381 | 35 | def get_default_release(self): | 30 | def get_default_release(self): |
382 | 36 | """Gets the default release to use when a release is not | 31 | """Gets the default release to use when a release is not |
383 | 37 | explicit.""" | 32 | explicit.""" |
384 | diff --git a/src/provisioningserver/drivers/osystem/rhel.py b/src/provisioningserver/drivers/osystem/rhel.py | |||
385 | index 553c880..5e63364 100644 | |||
386 | --- a/src/provisioningserver/drivers/osystem/rhel.py | |||
387 | +++ b/src/provisioningserver/drivers/osystem/rhel.py | |||
388 | @@ -35,10 +35,6 @@ class RHELOS(OperatingSystem): | |||
389 | 35 | BOOT_IMAGE_PURPOSE.XINSTALL | 35 | BOOT_IMAGE_PURPOSE.XINSTALL |
390 | 36 | ] | 36 | ] |
391 | 37 | 37 | ||
392 | 38 | def is_release_supported(self, release): | ||
393 | 39 | matched = DISTRO_MATCHER.match(release) | ||
394 | 40 | return matched is not None | ||
395 | 41 | |||
396 | 42 | def get_default_release(self): | 38 | def get_default_release(self): |
397 | 43 | """Gets the default release to use when a release is not | 39 | """Gets the default release to use when a release is not |
398 | 44 | explicit.""" | 40 | explicit.""" |
399 | diff --git a/src/provisioningserver/drivers/osystem/tests/test_base.py b/src/provisioningserver/drivers/osystem/tests/test_base.py | |||
400 | index 9c41dc4..1fa9ca1 100644 | |||
401 | --- a/src/provisioningserver/drivers/osystem/tests/test_base.py | |||
402 | +++ b/src/provisioningserver/drivers/osystem/tests/test_base.py | |||
403 | @@ -1,4 +1,4 @@ | |||
405 | 1 | # Copyright 2014-2016 Canonical Ltd. This software is licensed under the | 1 | # Copyright 2014-2017 Canonical Ltd. This software is licensed under the |
406 | 2 | # GNU Affero General Public License version 3 (see the file LICENSE). | 2 | # GNU Affero General Public License version 3 (see the file LICENSE). |
407 | 3 | 3 | ||
408 | 4 | """Tests for `provisioningserver.drivers.osystem`.""" | 4 | """Tests for `provisioningserver.drivers.osystem`.""" |
409 | @@ -42,6 +42,15 @@ class TestOperatingSystem(MAASTestCase): | |||
410 | 42 | osystem_module, 'list_boot_images_for').return_value = images | 42 | osystem_module, 'list_boot_images_for').return_value = images |
411 | 43 | return images | 43 | return images |
412 | 44 | 44 | ||
413 | 45 | def test_is_release_supported(self): | ||
414 | 46 | osystem = self.make_usable_osystem() | ||
415 | 47 | releases = [factory.make_name('release') for _ in range(3)] | ||
416 | 48 | supported = [ | ||
417 | 49 | osystem.is_release_supported(release) | ||
418 | 50 | for release in releases | ||
419 | 51 | ] | ||
420 | 52 | self.assertEqual([True, True, True], supported) | ||
421 | 53 | |||
422 | 45 | def test_format_release_choices(self): | 54 | def test_format_release_choices(self): |
423 | 46 | osystem = self.make_usable_osystem() | 55 | osystem = self.make_usable_osystem() |
424 | 47 | releases = osystem.get_supported_releases() | 56 | releases = osystem.get_supported_releases() |
425 | diff --git a/src/provisioningserver/drivers/osystem/tests/test_bootloader.py b/src/provisioningserver/drivers/osystem/tests/test_bootloader.py | |||
426 | index da0766e..9d89480 100644 | |||
427 | --- a/src/provisioningserver/drivers/osystem/tests/test_bootloader.py | |||
428 | +++ b/src/provisioningserver/drivers/osystem/tests/test_bootloader.py | |||
429 | @@ -13,11 +13,6 @@ from provisioningserver.drivers.osystem.bootloader import BootLoaderOS | |||
430 | 13 | 13 | ||
431 | 14 | class TestCustomOS(MAASTestCase): | 14 | class TestCustomOS(MAASTestCase): |
432 | 15 | 15 | ||
433 | 16 | def test_is_release_supported(self): | ||
434 | 17 | osystem = BootLoaderOS() | ||
435 | 18 | self.assertTrue( | ||
436 | 19 | osystem.is_release_supported(factory.make_name('release'))) | ||
437 | 20 | |||
438 | 21 | def test_get_default_release(self): | 16 | def test_get_default_release(self): |
439 | 22 | osystem = BootLoaderOS() | 17 | osystem = BootLoaderOS() |
440 | 23 | self.assertEquals("", osystem.get_default_release()) | 18 | self.assertEquals("", osystem.get_default_release()) |
441 | diff --git a/src/provisioningserver/drivers/osystem/tests/test_centos.py b/src/provisioningserver/drivers/osystem/tests/test_centos.py | |||
442 | index 207ea48..92f8be7 100644 | |||
443 | --- a/src/provisioningserver/drivers/osystem/tests/test_centos.py | |||
444 | +++ b/src/provisioningserver/drivers/osystem/tests/test_centos.py | |||
445 | @@ -34,23 +34,6 @@ class TestCentOS(MAASTestCase): | |||
446 | 34 | BOOT_IMAGE_PURPOSE.XINSTALL, | 34 | BOOT_IMAGE_PURPOSE.XINSTALL, |
447 | 35 | ]) | 35 | ]) |
448 | 36 | 36 | ||
449 | 37 | def test_is_release_supported(self): | ||
450 | 38 | name_supported = { | ||
451 | 39 | "centos6": True, | ||
452 | 40 | "centos65": True, | ||
453 | 41 | "centos7": True, | ||
454 | 42 | "centos71": True, | ||
455 | 43 | "cent65": False, | ||
456 | 44 | "centos711": True, | ||
457 | 45 | "centos-title": True, | ||
458 | 46 | "centos71.custom": True, | ||
459 | 47 | factory.make_name("name"): False, | ||
460 | 48 | } | ||
461 | 49 | osystem = CentOS() | ||
462 | 50 | for name, supported in name_supported.items(): | ||
463 | 51 | self.expectThat( | ||
464 | 52 | osystem.is_release_supported(name), Equals(supported)) | ||
465 | 53 | |||
466 | 54 | def test_get_default_release(self): | 37 | def test_get_default_release(self): |
467 | 55 | osystem = CentOS() | 38 | osystem = CentOS() |
468 | 56 | expected = osystem.get_default_release() | 39 | expected = osystem.get_default_release() |
469 | diff --git a/src/provisioningserver/drivers/osystem/tests/test_custom.py b/src/provisioningserver/drivers/osystem/tests/test_custom.py | |||
470 | index 1b7ff8e..80a6cce 100644 | |||
471 | --- a/src/provisioningserver/drivers/osystem/tests/test_custom.py | |||
472 | +++ b/src/provisioningserver/drivers/osystem/tests/test_custom.py | |||
473 | @@ -51,15 +51,6 @@ class TestCustomOS(MAASTestCase): | |||
474 | 51 | BOOT_IMAGE_PURPOSE.XINSTALL, | 51 | BOOT_IMAGE_PURPOSE.XINSTALL, |
475 | 52 | ]) | 52 | ]) |
476 | 53 | 53 | ||
477 | 54 | def test_is_release_supported(self): | ||
478 | 55 | osystem = CustomOS() | ||
479 | 56 | releases = [factory.make_name('release') for _ in range(3)] | ||
480 | 57 | supported = [ | ||
481 | 58 | osystem.is_release_supported(release) | ||
482 | 59 | for release in releases | ||
483 | 60 | ] | ||
484 | 61 | self.assertEqual([True, True, True], supported) | ||
485 | 62 | |||
486 | 63 | def test_get_default_release(self): | 54 | def test_get_default_release(self): |
487 | 64 | osystem = CustomOS() | 55 | osystem = CustomOS() |
488 | 65 | self.assertEqual("", osystem.get_default_release()) | 56 | self.assertEqual("", osystem.get_default_release()) |
489 | diff --git a/src/provisioningserver/drivers/osystem/tests/test_rhel.py b/src/provisioningserver/drivers/osystem/tests/test_rhel.py | |||
490 | index 5c74417..4d85356 100644 | |||
491 | --- a/src/provisioningserver/drivers/osystem/tests/test_rhel.py | |||
492 | +++ b/src/provisioningserver/drivers/osystem/tests/test_rhel.py | |||
493 | @@ -34,23 +34,6 @@ class TestRHEL(MAASTestCase): | |||
494 | 34 | BOOT_IMAGE_PURPOSE.XINSTALL, | 34 | BOOT_IMAGE_PURPOSE.XINSTALL, |
495 | 35 | ]) | 35 | ]) |
496 | 36 | 36 | ||
497 | 37 | def test_is_release_supported(self): | ||
498 | 38 | name_supported = { | ||
499 | 39 | "rhel6": True, | ||
500 | 40 | "rhel65": True, | ||
501 | 41 | "rhel7": True, | ||
502 | 42 | "rhel71": True, | ||
503 | 43 | "cent65": False, | ||
504 | 44 | "rhel711": True, | ||
505 | 45 | "rhel-title": True, | ||
506 | 46 | "rhel71.custom": True, | ||
507 | 47 | factory.make_name("name"): False, | ||
508 | 48 | } | ||
509 | 49 | osystem = RHELOS() | ||
510 | 50 | for name, supported in name_supported.items(): | ||
511 | 51 | self.expectThat( | ||
512 | 52 | osystem.is_release_supported(name), Equals(supported)) | ||
513 | 53 | |||
514 | 54 | def test_get_default_release(self): | 37 | def test_get_default_release(self): |
515 | 55 | osystem = RHELOS() | 38 | osystem = RHELOS() |
516 | 56 | expected = osystem.get_default_release() | 39 | expected = osystem.get_default_release() |
517 | diff --git a/src/provisioningserver/drivers/osystem/tests/test_ubuntu.py b/src/provisioningserver/drivers/osystem/tests/test_ubuntu.py | |||
518 | index d64faa9..f68f493 100644 | |||
519 | --- a/src/provisioningserver/drivers/osystem/tests/test_ubuntu.py | |||
520 | +++ b/src/provisioningserver/drivers/osystem/tests/test_ubuntu.py | |||
521 | @@ -19,12 +19,7 @@ from provisioningserver.drivers.osystem.ubuntu import UbuntuOS | |||
522 | 19 | class TestUbuntuOS(MAASTestCase): | 19 | class TestUbuntuOS(MAASTestCase): |
523 | 20 | 20 | ||
524 | 21 | def get_lts_release(self): | 21 | def get_lts_release(self): |
531 | 22 | # XXX ltrager 2016-04-06 - python3-distro-info won't set the latest lts | 22 | return UbuntuDistroInfo().lts() |
526 | 23 | # to Xenial until its been released. So we can start testing MAAS 2.0 | ||
527 | 24 | # with Xenial by default override it here. Once Xenial is released this | ||
528 | 25 | # can be removed | ||
529 | 26 | # return UbuntuDistroInfo().lts() | ||
530 | 27 | return "xenial" | ||
532 | 28 | 23 | ||
533 | 29 | def get_release_title(self, release): | 24 | def get_release_title(self, release): |
534 | 30 | info = UbuntuDistroInfo() | 25 | info = UbuntuDistroInfo() |
535 | @@ -51,6 +46,16 @@ class TestUbuntuOS(MAASTestCase): | |||
536 | 51 | BOOT_IMAGE_PURPOSE.DISKLESS, | 46 | BOOT_IMAGE_PURPOSE.DISKLESS, |
537 | 52 | ]) | 47 | ]) |
538 | 53 | 48 | ||
539 | 49 | def test_is_release_supported(self): | ||
540 | 50 | osystem = UbuntuOS() | ||
541 | 51 | info = UbuntuDistroInfo() | ||
542 | 52 | self.assertTrue(osystem.is_release_supported(random.choice(info.all))) | ||
543 | 53 | |||
544 | 54 | def test_get_lts_release(self): | ||
545 | 55 | # Canary so we know when the lts changes | ||
546 | 56 | osystem = UbuntuOS() | ||
547 | 57 | self.assertEquals('xenial', osystem.get_lts_release()) | ||
548 | 58 | |||
549 | 54 | def test_get_default_release(self): | 59 | def test_get_default_release(self): |
550 | 55 | osystem = UbuntuOS() | 60 | osystem = UbuntuOS() |
551 | 56 | expected = osystem.get_default_release() | 61 | expected = osystem.get_default_release() |
552 | diff --git a/src/provisioningserver/drivers/osystem/tests/test_ubuntucore.py b/src/provisioningserver/drivers/osystem/tests/test_ubuntucore.py | |||
553 | index 591a7bf..c01ee28 100644 | |||
554 | --- a/src/provisioningserver/drivers/osystem/tests/test_ubuntucore.py | |||
555 | +++ b/src/provisioningserver/drivers/osystem/tests/test_ubuntucore.py | |||
556 | @@ -51,15 +51,6 @@ class TestUbuntuCoreOS(MAASTestCase): | |||
557 | 51 | BOOT_IMAGE_PURPOSE.XINSTALL, | 51 | BOOT_IMAGE_PURPOSE.XINSTALL, |
558 | 52 | ]) | 52 | ]) |
559 | 53 | 53 | ||
560 | 54 | def test_is_release_supported(self): | ||
561 | 55 | osystem = UbuntuCoreOS() | ||
562 | 56 | releases = [factory.make_name('release') for _ in range(3)] | ||
563 | 57 | supported = [ | ||
564 | 58 | osystem.is_release_supported(release) | ||
565 | 59 | for release in releases | ||
566 | 60 | ] | ||
567 | 61 | self.assertEqual([True, True, True], supported) | ||
568 | 62 | |||
569 | 63 | def test_get_default_release(self): | 54 | def test_get_default_release(self): |
570 | 64 | osystem = UbuntuCoreOS() | 55 | osystem = UbuntuCoreOS() |
571 | 65 | self.assertEqual("16", osystem.get_default_release()) | 56 | self.assertEqual("16", osystem.get_default_release()) |
572 | diff --git a/src/provisioningserver/drivers/osystem/ubuntu.py b/src/provisioningserver/drivers/osystem/ubuntu.py | |||
573 | index 7490465..dd8d243 100644 | |||
574 | --- a/src/provisioningserver/drivers/osystem/ubuntu.py | |||
575 | +++ b/src/provisioningserver/drivers/osystem/ubuntu.py | |||
576 | @@ -42,15 +42,7 @@ class UbuntuOS(OperatingSystem): | |||
577 | 42 | 42 | ||
578 | 43 | def get_lts_release(self): | 43 | def get_lts_release(self): |
579 | 44 | """Return the latest Ubuntu LTS release.""" | 44 | """Return the latest Ubuntu LTS release.""" |
589 | 45 | lts_release = self.ubuntu_distro_info.lts() | 45 | return self.ubuntu_distro_info.lts() |
581 | 46 | # XXX ltrager 2016-04-06 - python3-distro-info won't set the latest lts | ||
582 | 47 | # to Xenial until its been released. So we can start testing MAAS 2.0 | ||
583 | 48 | # with Xenial by default override it here. Once Xenial is released this | ||
584 | 49 | # can be removed | ||
585 | 50 | if lts_release == "trusty": | ||
586 | 51 | return "xenial" | ||
587 | 52 | else: | ||
588 | 53 | return lts_release | ||
590 | 54 | 46 | ||
591 | 55 | def get_default_release(self): | 47 | def get_default_release(self): |
592 | 56 | """Gets the default release to use when a release is not | 48 | """Gets the default release to use when a release is not |
593 | diff --git a/src/provisioningserver/drivers/osystem/ubuntucore.py b/src/provisioningserver/drivers/osystem/ubuntucore.py | |||
594 | index 0a1ea45..1830da6 100644 | |||
595 | --- a/src/provisioningserver/drivers/osystem/ubuntucore.py | |||
596 | +++ b/src/provisioningserver/drivers/osystem/ubuntucore.py | |||
597 | @@ -27,11 +27,6 @@ class UbuntuCoreOS(OperatingSystem): | |||
598 | 27 | # Custom images can only be used with XINSTALL. | 27 | # Custom images can only be used with XINSTALL. |
599 | 28 | return [BOOT_IMAGE_PURPOSE.XINSTALL] | 28 | return [BOOT_IMAGE_PURPOSE.XINSTALL] |
600 | 29 | 29 | ||
601 | 30 | def is_release_supported(self, release): | ||
602 | 31 | """Return True when the release is supported, False otherwise.""" | ||
603 | 32 | # All release are supported, since the user uploaded it. | ||
604 | 33 | return True | ||
605 | 34 | |||
606 | 35 | def get_default_release(self): | 30 | def get_default_release(self): |
607 | 36 | """Gets the default release to use when a release is not | 31 | """Gets the default release to use when a release is not |
608 | 37 | explicit.""" | 32 | explicit.""" |
609 | diff --git a/src/provisioningserver/drivers/osystem/windows.py b/src/provisioningserver/drivers/osystem/windows.py | |||
610 | index a3bc514..ad7391d 100644 | |||
611 | --- a/src/provisioningserver/drivers/osystem/windows.py | |||
612 | +++ b/src/provisioningserver/drivers/osystem/windows.py | |||
613 | @@ -55,10 +55,6 @@ class WindowsOS(OperatingSystem): | |||
614 | 55 | purposes.append(BOOT_IMAGE_PURPOSE.INSTALL) | 55 | purposes.append(BOOT_IMAGE_PURPOSE.INSTALL) |
615 | 56 | return purposes | 56 | return purposes |
616 | 57 | 57 | ||
617 | 58 | def is_release_supported(self, release): | ||
618 | 59 | """Return True when the release is supported, False otherwise.""" | ||
619 | 60 | return release in WINDOWS_CHOICES | ||
620 | 61 | |||
621 | 62 | def get_default_release(self): | 58 | def get_default_release(self): |
622 | 63 | """Gets the default release to use when a release is not | 59 | """Gets the default release to use when a release is not |
623 | 64 | explicit.""" | 60 | explicit.""" |
624 | @@ -66,7 +62,7 @@ class WindowsOS(OperatingSystem): | |||
625 | 66 | 62 | ||
626 | 67 | def get_release_title(self, release): | 63 | def get_release_title(self, release): |
627 | 68 | """Return the title for the given release.""" | 64 | """Return the title for the given release.""" |
629 | 69 | return WINDOWS_CHOICES.get(release) | 65 | return WINDOWS_CHOICES.get(release, release) |
630 | 70 | 66 | ||
631 | 71 | def requires_license_key(self, release): | 67 | def requires_license_key(self, release): |
632 | 72 | return release in REQUIRE_LICENSE_KEY | 68 | return release in REQUIRE_LICENSE_KEY |
633 | diff --git a/src/provisioningserver/testing/os.py b/src/provisioningserver/testing/os.py | |||
634 | index 5dd7538..9bc5626 100644 | |||
635 | --- a/src/provisioningserver/testing/os.py | |||
636 | +++ b/src/provisioningserver/testing/os.py | |||
637 | @@ -34,9 +34,6 @@ class FakeOS(OperatingSystem): | |||
638 | 34 | def get_boot_image_purposes(self, *args): | 34 | def get_boot_image_purposes(self, *args): |
639 | 35 | return self.purpose | 35 | return self.purpose |
640 | 36 | 36 | ||
641 | 37 | def is_release_supported(self, release): | ||
642 | 38 | return release in self.fake_list | ||
643 | 39 | |||
644 | 40 | def get_supported_releases(self): | 37 | def get_supported_releases(self): |
645 | 41 | return self.fake_list | 38 | return self.fake_list |
646 | 42 | 39 |
Looks good, thanks for the fix.