コード例 #1
0
ファイル: __init__.py プロジェクト: kcns008/maas
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)
コード例 #2
0
ファイル: scriptset.py プロジェクト: shawnallen85/maas
    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
コード例 #3
0
    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
コード例 #4
0
ファイル: __init__.py プロジェクト: sempervictus/maas
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
        )
コード例 #5
0
ファイル: test_scriptset.py プロジェクト: uraniid/maas
    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)