def refresh(system_id, consumer_key, token_key, token_secret, maas_url=None): """Run all builtin commissioning scripts and report results to region.""" maaslog.info("Refreshing rack controller hardware information.") if maas_url is None: maas_url = 'http://127.0.0.1:5240/MAAS' url = "%s/metadata/%s/" % (maas_url, MD_VERSION) creds = { 'consumer_key': consumer_key, 'token_key': token_key, 'token_secret': token_secret, 'consumer_secret': '', } scripts = { name: config for name, config in NODE_INFO_SCRIPTS.items() if config['run_on_controller'] } with tempfile.TemporaryDirectory(prefix='maas-commission-') as tmpdir: failed_scripts = runscripts(scripts, url, creds, tmpdir=tmpdir) if len(failed_scripts) == 0: signal_wrapper(url, creds, 'OK', 'Finished refreshing %s' % system_id) else: signal_wrapper(url, creds, 'FAILED', 'Failed refreshing %s' % system_id)
def create_commissioning_script_set(self, node, scripts=None, script_input=None): """Create a new commissioning ScriptSet with ScriptResults ScriptResults will be created for all builtin commissioning scripts. Optionally a list of user scripts and tags can be given to create ScriptResults for. If None all user scripts will be assumed. Scripts may also have paramaters passed to them. """ # Avoid circular dependencies. from metadataserver.models import ScriptResult if scripts is None: scripts = [] else: scripts = [str(i) for i in scripts] script_set = self.create( node=node, result_type=RESULT_TYPE.COMMISSIONING, power_state_before_transition=node.power_state, requested_scripts=scripts, ) # Add all builtin commissioning scripts. for script_name, data in NODE_INFO_SCRIPTS.items(): if node.is_controller and not data["run_on_controller"]: continue ScriptResult.objects.create( script_set=script_set, status=SCRIPT_STATUS.PENDING, script_name=script_name, ) if node.is_controller: # MAAS doesn't run custom commissioning scripts during controller # refresh. return script_set elif not scripts: # If the user hasn't selected any commissioning Scripts select # all by default excluding for_hardware scripts. qs = Script.objects.filter( script_type=SCRIPT_TYPE.COMMISSIONING, for_hardware=[]).exclude(tags__contains=["noauto"]) for script in qs: script_set.add_pending_script(script, script_input) elif "none" in scripts: # Don't add any scripts besides the ones that come with MAAS but # do perform cleanup below. pass else: self._add_user_selected_scripts(script_set, scripts, script_input) self._clean_old(node, RESULT_TYPE.COMMISSIONING, script_set) return script_set
def create_commissioning_script_set(self, node, scripts=[], input={}): """Create a new commissioning ScriptSet with ScriptResults ScriptResults will be created for all builtin commissioning scripts. Optionally a list of user scripts and tags can be given to create ScriptResults for. If None all user scripts will be assumed. Scripts may also have paramaters passed to them. """ # Avoid circular dependencies. from metadataserver.models import ScriptResult script_set = self.create( node=node, result_type=RESULT_TYPE.COMMISSIONING, power_state_before_transition=node.power_state) self._clean_old(node, RESULT_TYPE.COMMISSIONING, script_set) for script_name, data in NODE_INFO_SCRIPTS.items(): if node.is_controller and not data['run_on_controller']: continue ScriptResult.objects.create(script_set=script_set, status=SCRIPT_STATUS.PENDING, script_name=script_name) # MAAS doesn't run custom commissioning scripts during controller # refresh. if node.is_controller: return script_set if scripts == []: qs = Script.objects.filter(script_type=SCRIPT_TYPE.COMMISSIONING) else: ids = [ int(id) for id in scripts if isinstance(id, int) or id.isdigit() ] qs = Script.objects.filter( Q(name__in=scripts) | Q(tags__overlap=scripts) | Q(id__in=ids), script_type=SCRIPT_TYPE.COMMISSIONING) for script in qs: form = ParametersForm(data=input.get(script.name, {}), script=script, node=node) if not form.is_valid(): script_set.delete() raise ValidationError(form.errors) for param in form.cleaned_data['input']: ScriptResult.objects.create(script_set=script_set, status=SCRIPT_STATUS.PENDING, script=script, script_name=script.name, parameters=param) return script_set
def refresh( system_id, consumer_key, token_key, token_secret, maas_url=None, post_process_hook=None, ): """Run all builtin commissioning scripts and report results to region.""" maaslog.info("Refreshing rack controller hardware information.") if maas_url is None: maas_url = "http://127.0.0.1:5240/MAAS" url = "%s/metadata/%s/" % (maas_url, MD_VERSION) creds = { "consumer_key": consumer_key, "token_key": token_key, "token_secret": token_secret, "consumer_secret": "", } scripts = { name: config for name, config in NODE_INFO_SCRIPTS.items() if config["run_on_controller"] } with tempfile.TemporaryDirectory(prefix="maas-commission-") as tmpdir: failed_scripts = runscripts( scripts, url, creds, tmpdir=tmpdir, post_process_hook=post_process_hook, ) if len(failed_scripts) == 0: signal_wrapper(url, creds, "OK", "Finished refreshing %s" % system_id) else: signal_wrapper( url, creds, "FAILED", "Failed refreshing %s" % system_id )
def test_create_commissioning_script_set_for_controller(self): for _ in range(3): factory.make_Script(script_type=SCRIPT_TYPE.COMMISSIONING) node = factory.make_Node(node_type=random.choice([ NODE_TYPE.RACK_CONTROLLER, NODE_TYPE.REGION_CONTROLLER, NODE_TYPE.REGION_AND_RACK_CONTROLLER ]), ) script_set = ScriptSet.objects.create_commissioning_script_set(node) expected_scripts = [ script_name for script_name, data in NODE_INFO_SCRIPTS.items() if data['run_on_controller'] ] self.assertItemsEqual( expected_scripts, [script_result.name for script_result in script_set]) self.assertEquals(RESULT_TYPE.COMMISSIONING, script_set.result_type) self.assertEquals(node.power_state, script_set.power_state_before_transition)