Merge ~ltrager/maas:lp1807991_2.5 into maas:2.5

Proposed by Lee Trager
Status: Merged
Approved by: Lee Trager
Approved revision: 03561be1f8a6f7285b0b876362b7ea4eb31b99a0
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ltrager/maas:lp1807991_2.5
Merge into: maas:2.5
Diff against target: 455 lines (+118/-26)
12 files modified
src/maasserver/api/machines.py (+19/-6)
src/maasserver/api/tests/test_enlistment.py (+22/-3)
src/maasserver/forms/__init__.py (+23/-0)
src/maasserver/forms/settings.py (+11/-0)
src/maasserver/forms/tests/test_machine.py (+2/-0)
src/maasserver/forms/tests/test_machinewithmacaddresses.py (+17/-1)
src/maasserver/models/config.py (+2/-0)
src/metadataserver/api.py (+6/-6)
src/metadataserver/tests/test_api.py (+0/-4)
src/metadataserver/user_data/templates/enlistment.template (+5/-1)
src/metadataserver/user_data/templates/snippets/maas_enlist.sh (+9/-4)
src/metadataserver/user_data/tests/test_generate_user_data.py (+2/-1)
Reviewer Review Type Date Requested Status
Lee Trager (community) Approve
Review via email: mp+361631@code.launchpad.net

Commit message

Backport 51b971 LP: #1807991 - Directly go into commissioning during enlistment.

The anonymous API now accepts the 'commission' flag. When set to true
newly created machines will be created in COMMISSIONING and a ScriptSet
with all builtin Scripts will be set as the current_commissioning_script_set.

Commissioning during enlistment can now be disabled using the
'enlist_commissioning' configuration option.

To post a comment you must log in.
Revision history for this message
Lee Trager (ltrager) wrote :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/src/maasserver/api/machines.py b/src/maasserver/api/machines.py
index 0ac51b1..0af350b 100644
--- a/src/maasserver/api/machines.py
+++ b/src/maasserver/api/machines.py
@@ -1611,6 +1611,12 @@ class AnonMachinesHandler(AnonNodesHandler):
1611 power_type. `Power types`_ section for a list of the available power1611 power_type. `Power types`_ section for a list of the available power
1612 parameters for each power type.1612 parameters for each power type.
16131613
1614 @param (boolean) "commission" [required=false,formatting=true] Request
1615 the newly created machine to be created with status set to
1616 COMMISSIONING. Machines will wait for COMMISSIONING results and not
1617 time out. After commissioning is complete machines will still have to
1618 be accepted by an administrator.
1619
1614 @success (http-status-code) "200" 2001620 @success (http-status-code) "200" 200
1615 @success (json) "success-json" A JSON object containing the machine1621 @success (json) "success-json" A JSON object containing the machine
1616 information.1622 information.
@@ -1621,6 +1627,8 @@ class AnonMachinesHandler(AnonNodesHandler):
1621 power_type = request.data.get('power_type')1627 power_type = request.data.get('power_type')
1622 power_parameters = request.data.get('power_parameters')1628 power_parameters = request.data.get('power_parameters')
1623 mac_addresses = request.data.getlist('mac_addresses')1629 mac_addresses = request.data.getlist('mac_addresses')
1630 commission = get_optional_param(
1631 request.data, 'commission', default=False, validator=StringBool)
1624 machine = None1632 machine = None
16251633
1626 # BMC enlistment - Check if there is a pre-existing machine within MAAS1634 # BMC enlistment - Check if there is a pre-existing machine within MAAS
@@ -1667,12 +1675,12 @@ class AnonMachinesHandler(AnonNodesHandler):
1667 if machine is None:1675 if machine is None:
1668 machine = create_machine(request, requires_arch=True)1676 machine = create_machine(request, requires_arch=True)
16691677
1670 if machine.status == NODE_STATUS.NEW:1678 if commission:
1671 # Make sure an enlisting NodeMetadata object exists if the machine1679 # Make sure an enlisting NodeMetadata object exists if the
1672 # is NEW. When commissioning finishes this is how MAAS knows to1680 # machine is NEW. When commissioning finishes this is how
1673 # set the status to NEW instead of READY.1681 # MAAS knows to set the status to NEW instead of READY.
1674 NodeMetadata.objects.update_or_create(1682 NodeMetadata.objects.update_or_create(
1675 node=machine, key='enlisting', defaults={'value': 'True'})1683 node=machine, key='enlisting', defaults={'value': 'True'})
16761684
1677 return machine1685 return machine
16781686
@@ -1743,6 +1751,11 @@ class MachinesHandler(NodesHandler, PowersMixin):
1743 power_type. `Power types`_ section for a list of the available power1751 power_type. `Power types`_ section for a list of the available power
1744 parameters for each power type.1752 parameters for each power type.
17451753
1754 @param (boolean) "commission" [required=false,formatting=true] Request
1755 the newly created machine to be created with status set to
1756 COMMISSIONING. Machines will wait for COMMISSIONING results and not
1757 time out.
1758
1746 @success (http-status-code) "200" 2001759 @success (http-status-code) "200" 200
1747 @success (json) "success-json" A JSON object containing the machine1760 @success (json) "success-json" A JSON object containing the machine
1748 information.1761 information.
diff --git a/src/maasserver/api/tests/test_enlistment.py b/src/maasserver/api/tests/test_enlistment.py
index 30a3413..8111f6b 100644
--- a/src/maasserver/api/tests/test_enlistment.py
+++ b/src/maasserver/api/tests/test_enlistment.py
@@ -452,8 +452,6 @@ class AnonymousEnlistmentAPITest(APITestCase.ForAnonymous):
452 self.assertEqual(architecture, machine.architecture)452 self.assertEqual(architecture, machine.architecture)
453 self.assertDictContainsSubset(453 self.assertDictContainsSubset(
454 machine.bmc.power_parameters, power_parameters)454 machine.bmc.power_parameters, power_parameters)
455 node_metadata = NodeMetadata.objects.get(node=machine, key='enlisting')
456 self.assertEqual(node_metadata.value, 'True')
457 self.assertThat(mock_create_machine, MockNotCalled())455 self.assertThat(mock_create_machine, MockNotCalled())
458 self.assertEqual(456 self.assertEqual(
459 machine.system_id, json_load_bytes(response.content)['system_id'])457 machine.system_id, json_load_bytes(response.content)['system_id'])
@@ -501,12 +499,33 @@ class AnonymousEnlistmentAPITest(APITestCase.ForAnonymous):
501 })499 })
502 self.assertEqual(http.client.OK, response.status_code)500 self.assertEqual(http.client.OK, response.status_code)
503 node_metadata = NodeMetadata.objects.get(key='enlisting')501 node_metadata = NodeMetadata.objects.get(key='enlisting')
504 self.assertEqual(node_metadata.value, 'True')502 self.assertIsNone(node_metadata)
505 [machine] = Machine.objects.filter(hostname=hostname)503 [machine] = Machine.objects.filter(hostname=hostname)
506 self.assertEqual(architecture, machine.architecture)504 self.assertEqual(architecture, machine.architecture)
507 self.assertEqual(505 self.assertEqual(
508 machine.system_id, json_load_bytes(response.content)['system_id'])506 machine.system_id, json_load_bytes(response.content)['system_id'])
509507
508 def test_POST_create_creates_machine_commission(self):
509 hostname = factory.make_name("hostname")
510 architecture = make_usable_architecture(self)
511 response = self.client.post(
512 reverse('machines_handler'),
513 {
514 'hostname': hostname,
515 'architecture': architecture,
516 'power_type': 'manual',
517 'mac_addresses': ['aa:bb:cc:dd:ee:ff', '22:bb:cc:dd:ee:ff'],
518 'commission': True,
519 })
520 self.assertEqual(http.client.OK, response.status_code)
521 node_metadata = NodeMetadata.objects.get(key='enlisting')
522 self.assertEqual('True', node_metadata.value)
523 [machine] = Machine.objects.filter(hostname=hostname)
524 self.assertEqual(architecture, machine.architecture)
525 self.assertEqual(
526 machine.system_id, json_load_bytes(response.content)['system_id'])
527 self.assertEqual(NODE_STATUS.COMMISSIONING, machine.status)
528
510 def test_POST_create_requires_architecture(self):529 def test_POST_create_requires_architecture(self):
511 hostname = factory.make_name("hostname")530 hostname = factory.make_name("hostname")
512 response = self.client.post(531 response = self.client.post(
diff --git a/src/maasserver/forms/__init__.py b/src/maasserver/forms/__init__.py
index 582b2af..6c3ab95 100644
--- a/src/maasserver/forms/__init__.py
+++ b/src/maasserver/forms/__init__.py
@@ -113,6 +113,7 @@ from maasserver.enum import (
113 FILESYSTEM_GROUP_RAID_TYPE_CHOICES,113 FILESYSTEM_GROUP_RAID_TYPE_CHOICES,
114 FILESYSTEM_TYPE,114 FILESYSTEM_TYPE,
115 INTERFACE_TYPE,115 INTERFACE_TYPE,
116 NODE_STATUS,
116 NODE_TYPE,117 NODE_TYPE,
117)118)
118from maasserver.exceptions import NodeActionError119from maasserver.exceptions import NodeActionError
@@ -893,6 +894,27 @@ class MachineForm(NodeForm):
893 self.is_bound = True894 self.is_bound = True
894 self.data['install_kvm'] = install_kvm895 self.data['install_kvm'] = install_kvm
895896
897 def save(self, *args, **kwargs):
898 # Prevent circular imports
899 from metadataserver.models import ScriptSet
900 # LP:1807991 - If requested when creating a new Machine, set the status
901 # to COMMISSIONING when the object is created.
902 commission = not self.instance.id and self.cleaned_data['commission']
903 if commission:
904 self.instance.status = NODE_STATUS.COMMISSIONING
905 machine = super(MachineForm, self).save(*args, **kwargs)
906 # For a ScriptSet to be created it must be associated with a Node
907 # object in the database.
908 if commission:
909 script_set = ScriptSet.objects.create_commissioning_script_set(
910 machine, ['none'])
911 machine.current_commissioning_script_set = script_set
912 machine.save(update_fields=['current_commissioning_script_set'])
913
914 return machine
915
916 commission = forms.BooleanField(required=False, widget=forms.HiddenInput())
917
896 class Meta:918 class Meta:
897 model = Machine919 model = Machine
898920
@@ -905,6 +927,7 @@ class MachineForm(NodeForm):
905 'hwe_kernel',927 'hwe_kernel',
906 'install_rackd',928 'install_rackd',
907 'install_kvm',929 'install_kvm',
930 'commission'
908 )931 )
909932
910933
diff --git a/src/maasserver/forms/settings.py b/src/maasserver/forms/settings.py
index d318759..e6bae82 100644
--- a/src/maasserver/forms/settings.py
+++ b/src/maasserver/forms/settings.py
@@ -766,6 +766,17 @@ CONFIG_ITEMS = {
766 "in minutes.")766 "in minutes.")
767 }767 }
768 },768 },
769 'enlist_commissioning': {
770 'default': True,
771 'form': forms.BooleanField,
772 'form_kwargs': {
773 'label': 'Whether to run commissioning during enlistment.',
774 'required': False,
775 'help_text': (
776 'Enables running all built-in commissioning scripts during '
777 'enlistment.'),
778 }
779 },
769}780}
770781
771782
diff --git a/src/maasserver/forms/tests/test_machine.py b/src/maasserver/forms/tests/test_machine.py
index c8ed726..b4564d6 100644
--- a/src/maasserver/forms/tests/test_machine.py
+++ b/src/maasserver/forms/tests/test_machine.py
@@ -51,6 +51,7 @@ class TestMachineForm(MAASServerTestCase):
51 'hwe_kernel',51 'hwe_kernel',
52 'install_rackd',52 'install_rackd',
53 'install_kvm',53 'install_kvm',
54 'commission',
54 ], list(form.fields))55 ], list(form.fields))
5556
56 def test_accepts_usable_architecture(self):57 def test_accepts_usable_architecture(self):
@@ -374,6 +375,7 @@ class TestAdminMachineForm(MAASServerTestCase):
374 'power_parameters',375 'power_parameters',
375 'power_type',376 'power_type',
376 'pool',377 'pool',
378 'commission',
377 ],379 ],
378 list(form.fields))380 list(form.fields))
379381
diff --git a/src/maasserver/forms/tests/test_machinewithmacaddresses.py b/src/maasserver/forms/tests/test_machinewithmacaddresses.py
index fefaaf9..8bc5f98 100644
--- a/src/maasserver/forms/tests/test_machinewithmacaddresses.py
+++ b/src/maasserver/forms/tests/test_machinewithmacaddresses.py
@@ -6,7 +6,10 @@
6__all__ = []6__all__ = []
77
8from django.http import QueryDict8from django.http import QueryDict
9from maasserver.enum import INTERFACE_TYPE9from maasserver.enum import (
10 INTERFACE_TYPE,
11 NODE_STATUS,
12)
10from maasserver.forms import MachineWithMACAddressesForm13from maasserver.forms import MachineWithMACAddressesForm
11from maasserver.testing.architecture import (14from maasserver.testing.architecture import (
12 make_usable_architecture,15 make_usable_architecture,
@@ -160,15 +163,18 @@ class MachineWithMACAddressesFormTest(MAASServerTestCase):
160 macs = ['aa:bb:cc:dd:ee:ff', '9a:bb:c3:33:e5:7f']163 macs = ['aa:bb:cc:dd:ee:ff', '9a:bb:c3:33:e5:7f']
161 form = MachineWithMACAddressesForm(164 form = MachineWithMACAddressesForm(
162 data=self.make_params(mac_addresses=macs))165 data=self.make_params(mac_addresses=macs))
166 self.assertTrue(form.is_valid())
163 node = form.save()167 node = form.save()
164168
165 self.assertIsNotNone(node.id) # The node is persisted.169 self.assertIsNotNone(node.id) # The node is persisted.
170 self.assertEquals(NODE_STATUS.NEW, node.status)
166 self.assertItemsEqual(171 self.assertItemsEqual(
167 macs,172 macs,
168 [nic.mac_address for nic in node.interface_set.all()])173 [nic.mac_address for nic in node.interface_set.all()])
169174
170 def test_form_without_hostname_generates_hostname(self):175 def test_form_without_hostname_generates_hostname(self):
171 form = MachineWithMACAddressesForm(data=self.make_params(hostname=''))176 form = MachineWithMACAddressesForm(data=self.make_params(hostname=''))
177 self.assertTrue(form.is_valid())
172 node = form.save()178 node = form.save()
173 self.assertTrue(len(node.hostname) > 0)179 self.assertTrue(len(node.hostname) > 0)
174180
@@ -176,6 +182,7 @@ class MachineWithMACAddressesFormTest(MAASServerTestCase):
176 ip_based_hostname = '192-168-12-10.maas'182 ip_based_hostname = '192-168-12-10.maas'
177 form = MachineWithMACAddressesForm(183 form = MachineWithMACAddressesForm(
178 data=self.make_params(hostname=ip_based_hostname))184 data=self.make_params(hostname=ip_based_hostname))
185 self.assertTrue(form.is_valid())
179 node = form.save()186 node = form.save()
180 self.assertNotEqual('192-168-12-10', node.hostname)187 self.assertNotEqual('192-168-12-10', node.hostname)
181188
@@ -183,5 +190,14 @@ class MachineWithMACAddressesFormTest(MAASServerTestCase):
183 ip_prefixed_hostname = '192-168-12-10-extra.maas'190 ip_prefixed_hostname = '192-168-12-10-extra.maas'
184 form = MachineWithMACAddressesForm(191 form = MachineWithMACAddressesForm(
185 data=self.make_params(hostname=ip_prefixed_hostname))192 data=self.make_params(hostname=ip_prefixed_hostname))
193 self.assertTrue(form.is_valid())
186 node = form.save()194 node = form.save()
187 self.assertEqual('192-168-12-10-extra', node.hostname)195 self.assertEqual('192-168-12-10-extra', node.hostname)
196
197 def test_form_with_commissioning(self):
198 form = MachineWithMACAddressesForm(data={
199 'commission': True, **self.make_params()})
200 self.assertTrue(form.is_valid())
201 machine = form.save()
202 self.assertEquals(NODE_STATUS.COMMISSIONING, machine.status)
203 self.assertIsNotNone(machine.current_commissioning_script_set)
diff --git a/src/maasserver/models/config.py b/src/maasserver/models/config.py
index a95246b..0c76e3c 100644
--- a/src/maasserver/models/config.py
+++ b/src/maasserver/models/config.py
@@ -130,6 +130,8 @@ def get_default_config():
130 'prometheus_enabled': False,130 'prometheus_enabled': False,
131 'prometheus_push_gateway': None,131 'prometheus_push_gateway': None,
132 'prometheus_push_interval': 60,132 'prometheus_push_interval': 60,
133 # Enlistment options
134 'enlist_commissioning': True,
133 }135 }
134136
135137
diff --git a/src/metadataserver/api.py b/src/metadataserver/api.py
index e76a651..3470a29 100644
--- a/src/metadataserver/api.py
+++ b/src/metadataserver/api.py
@@ -509,9 +509,9 @@ class VersionIndexHandler(MetadataViewHandler):
509 script_result.save(update_fields=['status'])509 script_result.save(update_fields=['status'])
510510
511 def _process_new(self, node, request, status):511 def _process_new(self, node, request, status):
512 # MAAS only cares if a NEW node is trying to commission itself. Ignore
513 # other signals.
514 if status != SIGNAL_STATUS.COMMISSIONING:512 if status != SIGNAL_STATUS.COMMISSIONING:
513 # MAAS only cares if a NEW node is trying to commission itself.
514 # Ignore other signals.
515 return None515 return None
516516
517 # Check if the node currently has a pending or running commissioning517 # Check if the node currently has a pending or running commissioning
@@ -525,9 +525,6 @@ class VersionIndexHandler(MetadataViewHandler):
525 node, ['none'])525 node, ['none'])
526 node.current_commissioning_script_set = script_set526 node.current_commissioning_script_set = script_set
527527
528 node.min_hwe_kernel = Config.objects.get_config(
529 'default_min_hwe_kernel')
530
531 return NODE_STATUS.COMMISSIONING528 return NODE_STATUS.COMMISSIONING
532529
533 def _process_testing(self, node, request, status):530 def _process_testing(self, node, request, status):
@@ -1155,7 +1152,10 @@ class EnlistUserDataHandler(OperationsHandler):
1155 return HttpResponse(1152 return HttpResponse(
1156 generate_user_data_for_status(1153 generate_user_data_for_status(
1157 None, NODE_STATUS.NEW, rack_controller=rack_controller,1154 None, NODE_STATUS.NEW, rack_controller=rack_controller,
1158 request=request),1155 request=request, extra_content={
1156 'enlist_commissioning': Config.objects.get_config(
1157 'enlist_commissioning'),
1158 }),
1159 content_type="text/plain")1159 content_type="text/plain")
11601160
11611161
diff --git a/src/metadataserver/tests/test_api.py b/src/metadataserver/tests/test_api.py
index 2e7b6cb..68d8b2f 100644
--- a/src/metadataserver/tests/test_api.py
+++ b/src/metadataserver/tests/test_api.py
@@ -47,7 +47,6 @@ from maasserver.exceptions import (
47 Unauthorized,47 Unauthorized,
48)48)
49from maasserver.models import (49from maasserver.models import (
50 Config,
51 NodeMetadata,50 NodeMetadata,
52 Event,51 Event,
53 SSHKey,52 SSHKey,
@@ -2546,8 +2545,6 @@ class TestNewAPI(MAASServerTestCase):
2546 factory.make_Script(script_type=SCRIPT_TYPE.COMMISSIONING)2545 factory.make_Script(script_type=SCRIPT_TYPE.COMMISSIONING)
2547 factory.make_Script(2546 factory.make_Script(
2548 script_type=SCRIPT_TYPE.TESTING, tags=['commissioning'])2547 script_type=SCRIPT_TYPE.TESTING, tags=['commissioning'])
2549 min_hwe_kernel = factory.make_name('hwe_kernel')
2550 Config.objects.set_config('default_min_hwe_kernel', min_hwe_kernel)
25512548
2552 client = make_node_client(node)2549 client = make_node_client(node)
2553 response = call_signal(client, status=SIGNAL_STATUS.COMMISSIONING)2550 response = call_signal(client, status=SIGNAL_STATUS.COMMISSIONING)
@@ -2560,7 +2557,6 @@ class TestNewAPI(MAASServerTestCase):
2560 [script.name for script in node.current_commissioning_script_set])2557 [script.name for script in node.current_commissioning_script_set])
2561 self.assertIsNone(node.current_testing_script_set)2558 self.assertIsNone(node.current_testing_script_set)
2562 self.assertEqual(NODE_STATUS.COMMISSIONING, node.status)2559 self.assertEqual(NODE_STATUS.COMMISSIONING, node.status)
2563 self.assertEqual(min_hwe_kernel, node.min_hwe_kernel)
25642560
2565 def test_signal_commissioning_only_creates_scriptsets_when_needed(self):2561 def test_signal_commissioning_only_creates_scriptsets_when_needed(self):
2566 # This happens when commissioning is started by the user with correct2562 # This happens when commissioning is started by the user with correct
diff --git a/src/metadataserver/user_data/templates/enlistment.template b/src/metadataserver/user_data/templates/enlistment.template
index f389108..726be19 100644
--- a/src/metadataserver/user_data/templates/enlistment.template
+++ b/src/metadataserver/user_data/templates/enlistment.template
@@ -48,7 +48,7 @@ main() {
48 # already exists and is not in a NEW state this will fail.48 # already exists and is not in a NEW state this will fail.
49 output=$(maas-enlist --quite --serverurl "{{server_url}}" \49 output=$(maas-enlist --quite --serverurl "{{server_url}}" \
50 ${power_params:+--power-params "${power_params}" \50 ${power_params:+--power-params "${power_params}" \
51 --power-type "${power_type}"})51 --power-type "${power_type}"}{{if enlist_commissioning}} --commission{{endif}})
52 ret=$?52 ret=$?
53 echo $output | jq .53 echo $output | jq .
54 if [ $ret -ne 0 ]; then54 if [ $ret -ne 0 ]; then
@@ -57,6 +57,7 @@ main() {
57 exit 157 exit 1
58 fi58 fi
5959
60 {{if enlist_commissioning}}
60 # Reload cloud-init preseed using the system_id to get OAUTH credentials.61 # Reload cloud-init preseed using the system_id to get OAUTH credentials.
61 system_id=$(echo $output | jq -r .system_id)62 system_id=$(echo $output | jq -r .system_id)
62 mv ${CRED_CFG} ${CRED_CFG}.orig63 mv ${CRED_CFG} ${CRED_CFG}.orig
@@ -65,6 +66,7 @@ main() {
65 signal COMMISSIONING "Enlistment complete, starting commissioning"66 signal COMMISSIONING "Enlistment complete, starting commissioning"
6667
67 maas-run-remote-scripts "--config=${CRED_CFG}" "${TEMP_D}"68 maas-run-remote-scripts "--config=${CRED_CFG}" "${TEMP_D}"
69 {{endif}}
68}70}
6971
70### begin writing files ###72### begin writing files ###
@@ -85,6 +87,7 @@ add_bin "maas-wedge-autodetect" <<"END_MAAS_WEDGE_AUTODETECT"
85{{maas_wedge_autodetect_sh}}87{{maas_wedge_autodetect_sh}}
86END_MAAS_WEDGE_AUTODETECT88END_MAAS_WEDGE_AUTODETECT
8789
90{{if enlist_commissioning}}
88add_bin "maas_api_helper.py" <<"END_MAAS_API_HELPER"91add_bin "maas_api_helper.py" <<"END_MAAS_API_HELPER"
89{{maas_api_helper_py}}92{{maas_api_helper_py}}
90END_MAAS_API_HELPER93END_MAAS_API_HELPER
@@ -96,6 +99,7 @@ END_MAAS_SIGNAL
96add_bin "maas-run-remote-scripts" <<"END_MAAS_RUN_REMOTE_SCRIPTS"99add_bin "maas-run-remote-scripts" <<"END_MAAS_RUN_REMOTE_SCRIPTS"
97{{maas_run_remote_scripts_py}}100{{maas_run_remote_scripts_py}}
98END_MAAS_RUN_REMOTE_SCRIPTS101END_MAAS_RUN_REMOTE_SCRIPTS
102{{endif}}
99103
100add_bin "maas-enlist" <<"END_MAAS_ENLIST"104add_bin "maas-enlist" <<"END_MAAS_ENLIST"
101{{maas_enlist_sh}}105{{maas_enlist_sh}}
diff --git a/src/metadataserver/user_data/templates/snippets/maas_enlist.sh b/src/metadataserver/user_data/templates/snippets/maas_enlist.sh
index 394b0bd..895c0d8 100644
--- a/src/metadataserver/user_data/templates/snippets/maas_enlist.sh
+++ b/src/metadataserver/user_data/templates/snippets/maas_enlist.sh
@@ -2,7 +2,7 @@
2#2#
3# maas-enlist: MAAS Enlistment Tool3# maas-enlist: MAAS Enlistment Tool
4#4#
5# Copyright (C) 2014-2016 Canonical Ltd.5# Copyright (C) 2014-2018 Canonical Ltd.
6#6#
7# Authors: Andres Rodriguez <andres.rodriguez@canonical.com>7# Authors: Andres Rodriguez <andres.rodriguez@canonical.com>
8#8#
@@ -107,6 +107,7 @@ enlist_node() {
107 hostname="${5}"107 hostname="${5}"
108 power_type="${6}"108 power_type="${6}"
109 power_params="${7}"109 power_params="${7}"
110 commission="${8}"
110111
111 local macparms=""112 local macparms=""
112 macparms=$(get_mac_address_curl_parms "$mac")113 macparms=$(get_mac_address_curl_parms "$mac")
@@ -119,6 +120,7 @@ enlist_node() {
119 --data-urlencode "subarchitecture=${subarch}" \120 --data-urlencode "subarchitecture=${subarch}" \
120 --data-urlencode "power_type=${power_type}" \121 --data-urlencode "power_type=${power_type}" \
121 --data-urlencode "power_parameters=${power_params}" \122 --data-urlencode "power_parameters=${power_params}" \
123 --data-urlencode "commission=${commission}" \
122 ${macparms} \124 ${macparms} \
123 "${serverurl}"125 "${serverurl}"
124126
@@ -171,6 +173,8 @@ Usage: ${0##*/} [ options ]
171 -e | --exists checks if the machine already exists in MAAS173 -e | --exists checks if the machine already exists in MAAS
172 -w | --in-action checks if the machine already exists in MAAS in a 'in-progress'174 -w | --in-action checks if the machine already exists in MAAS in a 'in-progress'
173 action like 'deploying' or 'commissioning'.175 action like 'deploying' or 'commissioning'.
176 -c | --commission tell MAAS when creating a new machine to set the status to
177 'commissioning'.
174 --subarch subarchitecture of the node to register178 --subarch subarchitecture of the node to register
175179
176 Example:180 Example:
@@ -181,8 +185,8 @@ EOF
181185
182bad_Usage() { Usage 1>&2; [ $# -eq 0 ] || Error "$@"; exit 1; }186bad_Usage() { Usage 1>&2; [ $# -eq 0 ] || Error "$@"; exit 1; }
183187
184short_opts="hs:n:i:a:t:p:ewq"188short_opts="hs:n:i:a:t:p:ewqc"
185long_opts="help,serverurl:,hostname:,interface:,arch:,subarch:,power-type:,power-params:,exists,in-action,quite"189long_opts="help,serverurl:,hostname:,interface:,arch:,subarch:,power-type:,power-params:,exists,in-action,quite,commission"
186getopt_out=$(getopt --name "${0##*/}" \190getopt_out=$(getopt --name "${0##*/}" \
187 --options "${short_opts}" --long "${long_opts}" -- "$@") &&191 --options "${short_opts}" --long "${long_opts}" -- "$@") &&
188 eval set -- "${getopt_out}" ||192 eval set -- "${getopt_out}" ||
@@ -202,6 +206,7 @@ while [ $# -ne 0 ]; do
202 -e|--exists) check_exists=true;;206 -e|--exists) check_exists=true;;
203 -w|--in-action) check_action_in_progress=true;;207 -w|--in-action) check_action_in_progress=true;;
204 -q|--quite) quite=true;;208 -q|--quite) quite=true;;
209 -c|--commission) commission=true;;
205 --) shift; break;;210 --) shift; break;;
206 esac211 esac
207 shift;212 shift;
@@ -268,5 +273,5 @@ elif [ "$check_action_in_progress" = true ]; then
268 check_node "$protocol://$servername/$api_url" "${mac_addrs}" "is_action_in_progress"273 check_node "$protocol://$servername/$api_url" "${mac_addrs}" "is_action_in_progress"
269 exit $?274 exit $?
270else275else
271 enlist_node "$protocol://$servername/$api_url" "${mac_addrs}" "$arch" "$subarch" "$hostname" "$power_type" "$power_parameters"276 enlist_node "$protocol://$servername/$api_url" "${mac_addrs}" "$arch" "$subarch" "$hostname" "$power_type" "$power_parameters" "$commission"
272fi277fi
diff --git a/src/metadataserver/user_data/tests/test_generate_user_data.py b/src/metadataserver/user_data/tests/test_generate_user_data.py
index 3632799..4b51a79 100644
--- a/src/metadataserver/user_data/tests/test_generate_user_data.py
+++ b/src/metadataserver/user_data/tests/test_generate_user_data.py
@@ -26,7 +26,8 @@ class TestGenerateUserData(MAASServerTestCase):
26 # both definitions and use of various commands in python.26 # both definitions and use of various commands in python.
27 rack = factory.make_RackController()27 rack = factory.make_RackController()
28 user_data = generate_user_data_for_status(28 user_data = generate_user_data_for_status(
29 None, NODE_STATUS.NEW, rack_controller=rack)29 None, NODE_STATUS.NEW, rack_controller=rack,
30 extra_content={'enlist_commissioning': True})
30 parsed_data = email.message_from_string(user_data.decode("utf-8"))31 parsed_data = email.message_from_string(user_data.decode("utf-8"))
31 self.assertTrue(parsed_data.is_multipart())32 self.assertTrue(parsed_data.is_multipart())
3233

Subscribers

People subscribed via source and target branches