Merge lp:~ltrager/maas/global_min_hwe_kernel into lp:~maas-committers/maas/trunk
- global_min_hwe_kernel
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Lee Trager |
Approved revision: | no longer in the source branch. |
Merged at revision: | 4406 |
Proposed branch: | lp:~ltrager/maas/global_min_hwe_kernel |
Merge into: | lp:~maas-committers/maas/trunk |
Diff against target: |
367 lines (+140/-5) 12 files modified
src/maasserver/api/pxeconfig.py (+12/-1) src/maasserver/api/tests/test_pxeconfig.py (+20/-0) src/maasserver/forms.py (+7/-1) src/maasserver/forms_settings.py (+39/-0) src/maasserver/models/config.py (+1/-0) src/maasserver/models/node.py (+6/-0) src/maasserver/models/tests/test_node.py (+14/-0) src/maasserver/static/js/angular/controllers/add_hardware.js (+3/-1) src/maasserver/static/js/angular/factories/general.js (+10/-0) src/maasserver/static/js/angular/factories/tests/test_general.js (+15/-2) src/maasserver/tests/test_forms_commissioning.py (+8/-0) src/maasserver/websockets/handlers/general.py (+5/-0) |
To merge this branch: | bzr merge lp:~ltrager/maas/global_min_hwe_kernel |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Blake Rouse (community) | Approve | ||
Andres Rodriguez (community) | Needs Information | ||
Review via email: mp+275477@code.launchpad.net |
Commit message
Add global_
Description of the change
This branch adds the global_
This branch also instructions MAAS to follow any requirements set by min_hwe_kernel during commissioning and enlistment. Because min_hwe_kernel is now used during enlistment and commissioning global_
Lee Trager (ltrager) wrote : | # |
Thanks for the review, I've fixed the items you marked below.
Andres Rodriguez (andreserl) wrote : | # |
Hi Lee,
I have a couple things:
1. I think that solely using min_hwe_kernel can be very confusing to the user, which is why global_
2. see inline
Andres Rodriguez (andreserl) wrote : | # |
nevermind comment 2. I'd only like to discuss the global_
Blake Rouse (blake-rouse) wrote : | # |
I am good with default_
"global_" was not consistent.
On Fri, Oct 23, 2015 at 11:38 AM, Andres Rodriguez <email address hidden>
wrote:
> Review: Needs Information
>
> nevermind comment 2. I'd only like to discuss the global_
> or it should at least be default_
>
> Diff comments:
>
> > === modified file 'src/maasserver
> > --- src/maasserver/
> > +++ src/maasserver/
> > @@ -227,6 +227,10 @@
> > # we give precedence to any kernel defined in the
> subarchitecture field
> > if subarch == "generic" and node.hwe_kernel:
> > subarch = node.hwe_kernel
> > + elif(subarch == "generic"
> > + and node.get_
> > + and node.min_
> > + subarch = node.min_hwe_kernel
>
> nevermind this comment, I see in the code belowe this is being addressed
>
> > else:
> > nodegroup = find_nodegroup_
> > preseed_url =
> compose_
>
>
> --
>
> https:/
> You are reviewing the proposed merge of
> lp:~ltrager/maas/global_min_hwe_kernel into lp:maas.
>
Blake Rouse (blake-rouse) wrote : | # |
Looks good. Thanks for all the fixes.
MAAS Lander (maas-lander) wrote : | # |
The attempt to merge lp:~ltrager/maas/global_min_hwe_kernel into lp:maas failed. Below is the output from the failed tests.
Hit http://
Ign http://
Get:1 http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Get:2 http://
Get:3 http://
Get:4 http://
Get:5 http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Hit http://
Ign http://
Ign http://
Fetched 1,403 kB in 3s (372 kB/s)
Reading package lists...
sudo DEBIAN_
--
Preview Diff
1 | === modified file 'src/maasserver/api/pxeconfig.py' | |||
2 | --- src/maasserver/api/pxeconfig.py 2015-09-08 18:41:57 +0000 | |||
3 | +++ src/maasserver/api/pxeconfig.py 2015-10-23 17:54:22 +0000 | |||
4 | @@ -227,6 +227,10 @@ | |||
5 | 227 | # we give precedence to any kernel defined in the subarchitecture field | 227 | # we give precedence to any kernel defined in the subarchitecture field |
6 | 228 | if subarch == "generic" and node.hwe_kernel: | 228 | if subarch == "generic" and node.hwe_kernel: |
7 | 229 | subarch = node.hwe_kernel | 229 | subarch = node.hwe_kernel |
8 | 230 | elif(subarch == "generic" | ||
9 | 231 | and node.get_boot_purpose() == "commissioning" | ||
10 | 232 | and node.min_hwe_kernel): | ||
11 | 233 | subarch = node.min_hwe_kernel | ||
12 | 230 | else: | 234 | else: |
13 | 231 | nodegroup = find_nodegroup_for_pxeconfig_request(request) | 235 | nodegroup = find_nodegroup_for_pxeconfig_request(request) |
14 | 232 | preseed_url = compose_enlistment_preseed_url(nodegroup=nodegroup) | 236 | preseed_url = compose_enlistment_preseed_url(nodegroup=nodegroup) |
15 | @@ -254,7 +258,14 @@ | |||
16 | 254 | else: | 258 | else: |
17 | 255 | arch, _ = resource.split_arch() | 259 | arch, _ = resource.split_arch() |
18 | 256 | 260 | ||
20 | 257 | subarch = get_optional_param(request.GET, 'subarch', 'generic') | 261 | default_min_hwe_kernel = Config.objects.get_config( |
21 | 262 | 'default_min_hwe_kernel') | ||
22 | 263 | if default_min_hwe_kernel: | ||
23 | 264 | subarch = get_optional_param( | ||
24 | 265 | request.GET, 'subarch', default_min_hwe_kernel) | ||
25 | 266 | else: | ||
26 | 267 | subarch = get_optional_param( | ||
27 | 268 | request.GET, 'subarch', 'generic') | ||
28 | 258 | 269 | ||
29 | 259 | # If we are booting with "xinstall", then we should always return the | 270 | # If we are booting with "xinstall", then we should always return the |
30 | 260 | # commissioning operating system and distro_series. | 271 | # commissioning operating system and distro_series. |
31 | 261 | 272 | ||
32 | === modified file 'src/maasserver/api/tests/test_pxeconfig.py' | |||
33 | --- src/maasserver/api/tests/test_pxeconfig.py 2015-08-29 03:27:16 +0000 | |||
34 | +++ src/maasserver/api/tests/test_pxeconfig.py 2015-10-23 17:54:22 +0000 | |||
35 | @@ -361,6 +361,15 @@ | |||
36 | 361 | (ip, hostname), | 361 | (ip, hostname), |
37 | 362 | (json.loads(response.content)["log_host"], mock.call_args[0][0])) | 362 | (json.loads(response.content)["log_host"], mock.call_args[0][0])) |
38 | 363 | 363 | ||
39 | 364 | def test_pxeconfig_enlistment_checks_default_min_hwe_kernel(self): | ||
40 | 365 | params = self.get_default_params() | ||
41 | 366 | params['arch'] = 'armhf' | ||
42 | 367 | Config.objects.set_config('default_min_hwe_kernel', 'hwe-v') | ||
43 | 368 | response = self.client.get(reverse('pxeconfig'), params) | ||
44 | 369 | self.assertEqual( | ||
45 | 370 | "hwe-v", | ||
46 | 371 | json.loads(response.content)["subarch"]) | ||
47 | 372 | |||
48 | 364 | def test_pxeconfig_has_preseed_url_for_known_node(self): | 373 | def test_pxeconfig_has_preseed_url_for_known_node(self): |
49 | 365 | params = self.get_mac_params() | 374 | params = self.get_mac_params() |
50 | 366 | node = Interface.objects.get(mac_address=params['mac']).node | 375 | node = Interface.objects.get(mac_address=params['mac']).node |
51 | @@ -631,6 +640,17 @@ | |||
52 | 631 | self.assertEqual(osystem, params_out["osystem"]) | 640 | self.assertEqual(osystem, params_out["osystem"]) |
53 | 632 | self.assertEqual(release, params_out["release"]) | 641 | self.assertEqual(release, params_out["release"]) |
54 | 633 | 642 | ||
55 | 643 | def test_pxeconfig_commissioning_node_uses_min_hwe_kernel(self): | ||
56 | 644 | node = factory.make_Node(min_hwe_kernel="hwe-v") | ||
57 | 645 | nic = factory.make_Interface(INTERFACE_TYPE.PHYSICAL, node=node) | ||
58 | 646 | self.patch(Node, 'get_boot_purpose').return_value = "commissioning" | ||
59 | 647 | params = self.get_default_params() | ||
60 | 648 | params['mac'] = nic.mac_address | ||
61 | 649 | response = self.client.get(reverse('pxeconfig'), params) | ||
62 | 650 | self.assertEqual( | ||
63 | 651 | "hwe-v", | ||
64 | 652 | json.loads(response.content)["subarch"]) | ||
65 | 653 | |||
66 | 634 | def test_pxeconfig_returns_ubuntu_os_series_for_ubuntu_xinstall(self): | 654 | def test_pxeconfig_returns_ubuntu_os_series_for_ubuntu_xinstall(self): |
67 | 635 | nodegroup = factory.make_NodeGroup() | 655 | nodegroup = factory.make_NodeGroup() |
68 | 636 | ubuntu_image = make_rpc_boot_image( | 656 | ubuntu_image = make_rpc_boot_image( |
69 | 637 | 657 | ||
70 | === modified file 'src/maasserver/forms.py' | |||
71 | --- src/maasserver/forms.py 2015-10-21 23:36:45 +0000 | |||
72 | +++ src/maasserver/forms.py 2015-10-23 17:54:22 +0000 | |||
73 | @@ -566,7 +566,11 @@ | |||
74 | 566 | return boot_type | 566 | return boot_type |
75 | 567 | 567 | ||
76 | 568 | def clean_min_hwe_kernel(self): | 568 | def clean_min_hwe_kernel(self): |
78 | 569 | return validate_min_hwe_kernel(self.cleaned_data.get('min_hwe_kernel')) | 569 | min_hwe_kernel = self.cleaned_data.get('min_hwe_kernel') |
79 | 570 | if self.new_node and not min_hwe_kernel: | ||
80 | 571 | min_hwe_kernel = Config.objects.get_config( | ||
81 | 572 | 'default_min_hwe_kernel') | ||
82 | 573 | return validate_min_hwe_kernel(min_hwe_kernel) | ||
83 | 570 | 574 | ||
84 | 571 | def clean(self): | 575 | def clean(self): |
85 | 572 | cleaned_data = super(NodeForm, self).clean() | 576 | cleaned_data = super(NodeForm, self).clean() |
86 | @@ -1306,6 +1310,8 @@ | |||
87 | 1306 | Form.__init__(self, *args, **kwargs) | 1310 | Form.__init__(self, *args, **kwargs) |
88 | 1307 | self.fields['commissioning_distro_series'] = get_config_field( | 1311 | self.fields['commissioning_distro_series'] = get_config_field( |
89 | 1308 | 'commissioning_distro_series') | 1312 | 'commissioning_distro_series') |
90 | 1313 | self.fields['default_min_hwe_kernel'] = get_config_field( | ||
91 | 1314 | 'default_min_hwe_kernel') | ||
92 | 1309 | self._load_initials() | 1315 | self._load_initials() |
93 | 1310 | 1316 | ||
94 | 1311 | 1317 | ||
95 | 1312 | 1318 | ||
96 | === modified file 'src/maasserver/forms_settings.py' | |||
97 | --- src/maasserver/forms_settings.py 2015-08-18 18:02:11 +0000 | |||
98 | +++ src/maasserver/forms_settings.py 2015-10-23 17:54:22 +0000 | |||
99 | @@ -27,6 +27,7 @@ | |||
100 | 27 | from django.core.exceptions import ValidationError | 27 | from django.core.exceptions import ValidationError |
101 | 28 | from maasserver.bootresources import IMPORT_RESOURCES_SERVICE_PERIOD | 28 | from maasserver.bootresources import IMPORT_RESOURCES_SERVICE_PERIOD |
102 | 29 | from maasserver.fields import IPListFormField | 29 | from maasserver.fields import IPListFormField |
103 | 30 | from maasserver.models import BootResource | ||
104 | 30 | from maasserver.models.config import ( | 31 | from maasserver.models.config import ( |
105 | 31 | Config, | 32 | Config, |
106 | 32 | DEFAULT_OS, | 33 | DEFAULT_OS, |
107 | @@ -39,6 +40,7 @@ | |||
108 | 39 | list_all_usable_releases, | 40 | list_all_usable_releases, |
109 | 40 | list_commissioning_choices, | 41 | list_commissioning_choices, |
110 | 41 | list_osystem_choices, | 42 | list_osystem_choices, |
111 | 43 | release_a_newer_than_b, | ||
112 | 42 | ) | 44 | ) |
113 | 43 | 45 | ||
114 | 44 | 46 | ||
115 | @@ -114,6 +116,31 @@ | |||
116 | 114 | return field | 116 | return field |
117 | 115 | 117 | ||
118 | 116 | 118 | ||
119 | 119 | def make_default_min_hwe_kernel_field(*args, **kwargs): | ||
120 | 120 | """Build and return the default_min_hwe_kernel field.""" | ||
121 | 121 | kernel_choices = [('', '--- No minimum kernel ---')] | ||
122 | 122 | # Global choices are limited to the commissioning release as min_hwe_kernel | ||
123 | 123 | # is used during commissioning. | ||
124 | 124 | commissioning_series = Config.objects.get_config( | ||
125 | 125 | 'commissioning_distro_series') | ||
126 | 126 | if commissioning_series: | ||
127 | 127 | commissioning_os_release = "ubuntu/" + commissioning_series | ||
128 | 128 | kernel_choices += [ | ||
129 | 129 | (kernel, kernel) | ||
130 | 130 | for kernel in BootResource.objects.get_usable_hwe_kernels( | ||
131 | 131 | commissioning_os_release) | ||
132 | 132 | if release_a_newer_than_b(kernel, commissioning_series)] | ||
133 | 133 | field = forms.ChoiceField( | ||
134 | 134 | initial=Config.objects.get_config('default_min_hwe_kernel'), | ||
135 | 135 | choices=kernel_choices, | ||
136 | 136 | error_messages={ | ||
137 | 137 | 'invalid_choice': compose_invalid_choice_text( | ||
138 | 138 | 'default_min_hwe_kernel', kernel_choices) | ||
139 | 139 | }, | ||
140 | 140 | **kwargs) | ||
141 | 141 | return field | ||
142 | 142 | |||
143 | 143 | |||
144 | 117 | def make_commissioning_distro_series_field(*args, **kwargs): | 144 | def make_commissioning_distro_series_field(*args, **kwargs): |
145 | 118 | """Build and return the commissioning_distro_series field.""" | 145 | """Build and return the commissioning_distro_series field.""" |
146 | 119 | usable_oses = list_all_usable_osystems() | 146 | usable_oses = list_all_usable_osystems() |
147 | @@ -257,6 +284,18 @@ | |||
148 | 257 | # at run-time to avoid a race condition. | 284 | # at run-time to avoid a race condition. |
149 | 258 | } | 285 | } |
150 | 259 | }, | 286 | }, |
151 | 287 | 'default_min_hwe_kernel': { | ||
152 | 288 | 'default': None, | ||
153 | 289 | 'form': make_default_min_hwe_kernel_field, | ||
154 | 290 | 'form_kwargs': { | ||
155 | 291 | 'label': "Default Minimum Kernel Version", | ||
156 | 292 | 'required': False, | ||
157 | 293 | 'help_text': ( | ||
158 | 294 | "The default minimum kernel version used on all new and" | ||
159 | 295 | " commissioned nodes." | ||
160 | 296 | ) | ||
161 | 297 | } | ||
162 | 298 | }, | ||
163 | 260 | 'default_storage_layout': { | 299 | 'default_storage_layout': { |
164 | 261 | 'default': 'lvm', | 300 | 'default': 'lvm', |
165 | 262 | 'form': forms.ChoiceField, | 301 | 'form': forms.ChoiceField, |
166 | 263 | 302 | ||
167 | === modified file 'src/maasserver/models/config.py' | |||
168 | --- src/maasserver/models/config.py 2015-08-18 18:02:11 +0000 | |||
169 | +++ src/maasserver/models/config.py 2015-10-23 17:54:22 +0000 | |||
170 | @@ -51,6 +51,7 @@ | |||
171 | 51 | 'commissioning_osystem': DEFAULT_OS.name, | 51 | 'commissioning_osystem': DEFAULT_OS.name, |
172 | 52 | 'commissioning_distro_series': | 52 | 'commissioning_distro_series': |
173 | 53 | DEFAULT_OS.get_default_commissioning_release(), | 53 | DEFAULT_OS.get_default_commissioning_release(), |
174 | 54 | 'default_min_hwe_kernel': '', | ||
175 | 54 | 'default_storage_layout': 'lvm', | 55 | 'default_storage_layout': 'lvm', |
176 | 55 | # Network section configuration. | 56 | # Network section configuration. |
177 | 56 | 'maas_name': gethostname(), | 57 | 'maas_name': gethostname(), |
178 | 57 | 58 | ||
179 | === modified file 'src/maasserver/models/node.py' | |||
180 | --- src/maasserver/models/node.py 2015-10-21 00:43:01 +0000 | |||
181 | +++ src/maasserver/models/node.py 2015-10-23 17:54:22 +0000 | |||
182 | @@ -998,6 +998,12 @@ | |||
183 | 998 | old_status = self.status | 998 | old_status = self.status |
184 | 999 | self.status = NODE_STATUS.COMMISSIONING | 999 | self.status = NODE_STATUS.COMMISSIONING |
185 | 1000 | self.owner = user | 1000 | self.owner = user |
186 | 1001 | # Set min_hwe_kernel to min_hwe_kernel if it isn't set incase | ||
187 | 1002 | # commissioning failed and the user set the min globally and is | ||
188 | 1003 | # retrying. | ||
189 | 1004 | if not self.min_hwe_kernel: | ||
190 | 1005 | self.min_hwe_kernel = Config.objects.get_config( | ||
191 | 1006 | 'default_min_hwe_kernel') | ||
192 | 1001 | self.save() | 1007 | self.save() |
193 | 1002 | 1008 | ||
194 | 1003 | # Prepare a transition monitor for later. | 1009 | # Prepare a transition monitor for later. |
195 | 1004 | 1010 | ||
196 | === modified file 'src/maasserver/models/tests/test_node.py' | |||
197 | --- src/maasserver/models/tests/test_node.py 2015-10-21 00:43:01 +0000 | |||
198 | +++ src/maasserver/models/tests/test_node.py 2015-10-23 17:54:22 +0000 | |||
199 | @@ -1492,6 +1492,20 @@ | |||
200 | 1492 | post_commit_hooks.reset() # Ignore these for now. | 1492 | post_commit_hooks.reset() # Ignore these for now. |
201 | 1493 | self.assertThat(node_start, MockCalledOnceWith(admin, user_data)) | 1493 | self.assertThat(node_start, MockCalledOnceWith(admin, user_data)) |
202 | 1494 | 1494 | ||
203 | 1495 | def test_start_commissioning_sets_min_hwe_kernel(self): | ||
204 | 1496 | node = factory.make_Node(status=NODE_STATUS.NEW) | ||
205 | 1497 | node_start = self.patch(node, '_start') | ||
206 | 1498 | node_start.side_effect = lambda user, user_data: post_commit() | ||
207 | 1499 | user_data = factory.make_string().encode('ascii') | ||
208 | 1500 | generate_user_data = self.patch( | ||
209 | 1501 | commissioning, 'generate_user_data') | ||
210 | 1502 | generate_user_data.return_value = user_data | ||
211 | 1503 | admin = factory.make_admin() | ||
212 | 1504 | Config.objects.set_config('default_min_hwe_kernel', 'hwe-v') | ||
213 | 1505 | node.start_commissioning(admin) | ||
214 | 1506 | post_commit_hooks.reset() # Ignore these for now. | ||
215 | 1507 | self.assertEqual('hwe-v', node.min_hwe_kernel) | ||
216 | 1508 | |||
217 | 1495 | def test_start_commissioning_clears_node_commissioning_results(self): | 1509 | def test_start_commissioning_clears_node_commissioning_results(self): |
218 | 1496 | node = factory.make_Node(status=NODE_STATUS.NEW) | 1510 | node = factory.make_Node(status=NODE_STATUS.NEW) |
219 | 1497 | NodeResult.objects.store_data( | 1511 | NodeResult.objects.store_data( |
220 | 1498 | 1512 | ||
221 | === modified file 'src/maasserver/static/js/angular/controllers/add_hardware.js' | |||
222 | --- src/maasserver/static/js/angular/controllers/add_hardware.js 2015-08-11 15:07:10 +0000 | |||
223 | +++ src/maasserver/static/js/angular/controllers/add_hardware.js 2015-10-23 17:54:22 +0000 | |||
224 | @@ -24,6 +24,8 @@ | |||
225 | 24 | $scope.zones = ZonesManager.getItems(); | 24 | $scope.zones = ZonesManager.getItems(); |
226 | 25 | $scope.architectures = GeneralManager.getData("architectures"); | 25 | $scope.architectures = GeneralManager.getData("architectures"); |
227 | 26 | $scope.hwe_kernels = GeneralManager.getData("hwe_kernels"); | 26 | $scope.hwe_kernels = GeneralManager.getData("hwe_kernels"); |
228 | 27 | $scope.default_min_hwe_kernel = GeneralManager.getData( | ||
229 | 28 | "default_min_hwe_kernel"); | ||
230 | 27 | $scope.error = null; | 29 | $scope.error = null; |
231 | 28 | 30 | ||
232 | 29 | // Input values. | 31 | // Input values. |
233 | @@ -281,6 +283,7 @@ | |||
234 | 281 | macs: [newMAC()], | 283 | macs: [newMAC()], |
235 | 282 | zone: defaultZone(), | 284 | zone: defaultZone(), |
236 | 283 | architecture: defaultArchitecture(), | 285 | architecture: defaultArchitecture(), |
237 | 286 | min_hwe_kernel: $scope.default_min_hwe_kernel.text, | ||
238 | 284 | power: { | 287 | power: { |
239 | 285 | type: null, | 288 | type: null, |
240 | 286 | parameters: {} | 289 | parameters: {} |
241 | @@ -439,7 +442,6 @@ | |||
242 | 439 | $scope.machine.cluster === null || | 442 | $scope.machine.cluster === null || |
243 | 440 | $scope.machine.zone === null || | 443 | $scope.machine.zone === null || |
244 | 441 | $scope.machine.architecture === '' || | 444 | $scope.machine.architecture === '' || |
245 | 442 | $scope.machine.min_hwe_kernel === '' || | ||
246 | 443 | $scope.machine.power.type === null || | 445 | $scope.machine.power.type === null || |
247 | 444 | $scope.invalidName($scope.machine)); | 446 | $scope.invalidName($scope.machine)); |
248 | 445 | if(in_error) { | 447 | if(in_error) { |
249 | 446 | 448 | ||
250 | === modified file 'src/maasserver/static/js/angular/factories/general.js' | |||
251 | --- src/maasserver/static/js/angular/factories/general.js 2015-10-21 19:45:50 +0000 | |||
252 | +++ src/maasserver/static/js/angular/factories/general.js 2015-10-23 17:54:22 +0000 | |||
253 | @@ -49,6 +49,16 @@ | |||
254 | 49 | polling: false, | 49 | polling: false, |
255 | 50 | nextPromise: null | 50 | nextPromise: null |
256 | 51 | }, | 51 | }, |
257 | 52 | default_min_hwe_kernel: { | ||
258 | 53 | method: "general.default_min_hwe_kernel", | ||
259 | 54 | data: { text: '' }, | ||
260 | 55 | loaded: false, | ||
261 | 56 | polling: false, | ||
262 | 57 | nextPromise: null, | ||
263 | 58 | replaceData: function(oldData, newData) { | ||
264 | 59 | oldData.text = newData; | ||
265 | 60 | } | ||
266 | 61 | }, | ||
267 | 52 | osinfo: { | 62 | osinfo: { |
268 | 53 | method: "general.osinfo", | 63 | method: "general.osinfo", |
269 | 54 | data: {}, | 64 | data: {}, |
270 | 55 | 65 | ||
271 | === modified file 'src/maasserver/static/js/angular/factories/tests/test_general.js' | |||
272 | --- src/maasserver/static/js/angular/factories/tests/test_general.js 2015-10-21 19:45:50 +0000 | |||
273 | +++ src/maasserver/static/js/angular/factories/tests/test_general.js 2015-10-23 17:54:22 +0000 | |||
274 | @@ -51,7 +51,7 @@ | |||
275 | 51 | it("_data has expected keys", function() { | 51 | it("_data has expected keys", function() { |
276 | 52 | expect(Object.keys(GeneralManager._data)).toEqual( | 52 | expect(Object.keys(GeneralManager._data)).toEqual( |
277 | 53 | ["node_actions", "device_actions", "architectures", "hwe_kernels", | 53 | ["node_actions", "device_actions", "architectures", "hwe_kernels", |
279 | 54 | "osinfo", "bond_options", "version"]); | 54 | "default_min_hwe_kernel", "osinfo", "bond_options", "version"]); |
280 | 55 | }); | 55 | }); |
281 | 56 | 56 | ||
282 | 57 | it("_data.node_actions has correct data", function() { | 57 | it("_data.node_actions has correct data", function() { |
283 | @@ -90,6 +90,17 @@ | |||
284 | 90 | expect(hwe_kernels.nextPromise).toBeNull(); | 90 | expect(hwe_kernels.nextPromise).toBeNull(); |
285 | 91 | }); | 91 | }); |
286 | 92 | 92 | ||
287 | 93 | it("_data.default_min_hwe_kernels has correct data", function() { | ||
288 | 94 | var default_min_hwe_kernel = | ||
289 | 95 | GeneralManager._data.default_min_hwe_kernel; | ||
290 | 96 | expect(default_min_hwe_kernel.method).toBe( | ||
291 | 97 | "general.default_min_hwe_kernel"); | ||
292 | 98 | expect(default_min_hwe_kernel.data).toEqual({text: ''}); | ||
293 | 99 | expect(default_min_hwe_kernel.loaded).toBe(false); | ||
294 | 100 | expect(default_min_hwe_kernel.polling).toBe(false); | ||
295 | 101 | expect(default_min_hwe_kernel.nextPromise).toBeNull(); | ||
296 | 102 | }); | ||
297 | 103 | |||
298 | 93 | it("_data.osinfo has correct data", function() { | 104 | it("_data.osinfo has correct data", function() { |
299 | 94 | var osinfo = GeneralManager._data.osinfo; | 105 | var osinfo = GeneralManager._data.osinfo; |
300 | 95 | expect(osinfo.method).toBe("general.osinfo"); | 106 | expect(osinfo.method).toBe("general.osinfo"); |
301 | @@ -166,6 +177,7 @@ | |||
302 | 166 | GeneralManager._data.device_actions.loaded = true; | 177 | GeneralManager._data.device_actions.loaded = true; |
303 | 167 | GeneralManager._data.architectures.loaded = true; | 178 | GeneralManager._data.architectures.loaded = true; |
304 | 168 | GeneralManager._data.hwe_kernels.loaded = true; | 179 | GeneralManager._data.hwe_kernels.loaded = true; |
305 | 180 | GeneralManager._data.default_min_hwe_kernel.loaded = true; | ||
306 | 169 | GeneralManager._data.osinfo.loaded = true; | 181 | GeneralManager._data.osinfo.loaded = true; |
307 | 170 | GeneralManager._data.bond_options.loaded = true; | 182 | GeneralManager._data.bond_options.loaded = true; |
308 | 171 | GeneralManager._data.version.loaded = true; | 183 | GeneralManager._data.version.loaded = true; |
309 | @@ -416,7 +428,7 @@ | |||
310 | 416 | spyOn(GeneralManager, "_loadData").and.returnValue( | 428 | spyOn(GeneralManager, "_loadData").and.returnValue( |
311 | 417 | $q.defer().promise); | 429 | $q.defer().promise); |
312 | 418 | GeneralManager.loadItems(); | 430 | GeneralManager.loadItems(); |
314 | 419 | expect(GeneralManager._loadData.calls.count()).toBe(7); | 431 | expect(GeneralManager._loadData.calls.count()).toBe(8); |
315 | 420 | }); | 432 | }); |
316 | 421 | 433 | ||
317 | 422 | it("resolve defer once all resolve", function(done) { | 434 | it("resolve defer once all resolve", function(done) { |
318 | @@ -427,6 +439,7 @@ | |||
319 | 427 | $q.defer(), | 439 | $q.defer(), |
320 | 428 | $q.defer(), | 440 | $q.defer(), |
321 | 429 | $q.defer(), | 441 | $q.defer(), |
322 | 442 | $q.defer(), | ||
323 | 430 | $q.defer() | 443 | $q.defer() |
324 | 431 | ]; | 444 | ]; |
325 | 432 | var i = 0; | 445 | var i = 0; |
326 | 433 | 446 | ||
327 | === modified file 'src/maasserver/tests/test_forms_commissioning.py' | |||
328 | --- src/maasserver/tests/test_forms_commissioning.py 2015-05-07 18:14:38 +0000 | |||
329 | +++ src/maasserver/tests/test_forms_commissioning.py 2015-10-23 17:54:22 +0000 | |||
330 | @@ -36,6 +36,14 @@ | |||
331 | 36 | 'commissioning_distro_series', field.choices), | 36 | 'commissioning_distro_series', field.choices), |
332 | 37 | field.error_messages['invalid_choice']) | 37 | field.error_messages['invalid_choice']) |
333 | 38 | 38 | ||
334 | 39 | def test_commissioningform_error_msg_lists_min_hwe_kernel_choices(self): | ||
335 | 40 | form = CommissioningForm() | ||
336 | 41 | field = form.fields['default_min_hwe_kernel'] | ||
337 | 42 | self.assertEqual( | ||
338 | 43 | compose_invalid_choice_text( | ||
339 | 44 | 'default_min_hwe_kernel', field.choices), | ||
340 | 45 | field.error_messages['invalid_choice']) | ||
341 | 46 | |||
342 | 39 | 47 | ||
343 | 40 | class TestCommissioningScriptForm(MAASServerTestCase): | 48 | class TestCommissioningScriptForm(MAASServerTestCase): |
344 | 41 | 49 | ||
345 | 42 | 50 | ||
346 | === modified file 'src/maasserver/websockets/handlers/general.py' | |||
347 | --- src/maasserver/websockets/handlers/general.py 2015-10-21 19:45:50 +0000 | |||
348 | +++ src/maasserver/websockets/handlers/general.py 2015-10-23 17:54:22 +0000 | |||
349 | @@ -45,6 +45,7 @@ | |||
350 | 45 | allowed_methods = [ | 45 | allowed_methods = [ |
351 | 46 | 'architectures', | 46 | 'architectures', |
352 | 47 | 'hwe_kernels', | 47 | 'hwe_kernels', |
353 | 48 | 'default_min_hwe_kernel', | ||
354 | 48 | 'osinfo', | 49 | 'osinfo', |
355 | 49 | 'node_actions', | 50 | 'node_actions', |
356 | 50 | 'device_actions', | 51 | 'device_actions', |
357 | @@ -61,6 +62,10 @@ | |||
358 | 61 | """Return all supported hwe_kernels.""" | 62 | """Return all supported hwe_kernels.""" |
359 | 62 | return BootResource.objects.get_usable_hwe_kernels() | 63 | return BootResource.objects.get_usable_hwe_kernels() |
360 | 63 | 64 | ||
361 | 65 | def default_min_hwe_kernel(self, params): | ||
362 | 66 | """Return the default_min_hwe_kernel.""" | ||
363 | 67 | return Config.objects.get_config('default_min_hwe_kernel') | ||
364 | 68 | |||
365 | 64 | def osinfo(self, params): | 69 | def osinfo(self, params): |
366 | 65 | """Return all available operating systems and releases information.""" | 70 | """Return all available operating systems and releases information.""" |
367 | 66 | osystems = list_all_usable_osystems() | 71 | osystems = list_all_usable_osystems() |
The core looks good. But needs to fix some things. See inline.