Exemple #1
0
 def test_store_result_sets_status_to_passed_with_exit_code_zero(self):
     script_result = factory.make_ScriptResult(status=SCRIPT_STATUS.RUNNING)
     script_result.store_result(0)
     self.assertEqual(SCRIPT_STATUS.PASSED, script_result.status)
     self.assertEqual(0, script_result.exit_status)
Exemple #2
0
    def test_GET_filters(self):
        scripts = [factory.make_Script() for _ in range(10)]
        script_set = self.make_scriptset()
        script_results = {}
        for script in scripts:
            script_result = factory.make_ScriptResult(script_set=script_set,
                                                      script=script)
            script_results[script_result.name] = script_result
        results_list = list(script_results.values())
        filtered_results = [random.choice(results_list) for _ in range(3)]

        response = self.client.get(
            self.get_script_result_uri(script_set), {
                'filters':
                '%s,%s,%d' %
                (filtered_results[0].name,
                 random.choice([
                     tag
                     for tag in filtered_results[1].script.tags if 'tag' in tag
                 ]), filtered_results[2].id)
            })
        self.assertThat(response, HasStatusCode(http.client.OK))
        parsed_result = json_load_bytes(response.content)
        results = parsed_result.pop('results')

        self.assertDictEqual(
            {
                'id':
                script_set.id,
                'system_id':
                script_set.node.system_id,
                'type':
                script_set.result_type,
                'type_name':
                script_set.result_type_name,
                'last_ping':
                fmt_time(script_set.last_ping),
                'status':
                script_set.status,
                'status_name':
                script_set.status_name,
                'started':
                fmt_time(script_set.started),
                'ended':
                fmt_time(script_set.ended),
                'runtime':
                script_set.runtime,
                'resource_uri':
                '/MAAS/api/2.0/nodes/%s/results/%d/' %
                (script_set.node.system_id, script_set.id),
            }, parsed_result)
        for result in results:
            self.assertIn(
                result['name'],
                [script_result.name for script_result in filtered_results])
            script_result = script_results[result['name']]
            self.assertDictEqual(
                {
                    'id': script_result.id,
                    'name': script_result.name,
                    'created': fmt_time(script_result.created),
                    'updated': fmt_time(script_result.updated),
                    'status': script_result.status,
                    'status_name': script_result.status_name,
                    'exit_status': script_result.exit_status,
                    'started': fmt_time(script_result.started),
                    'ended': fmt_time(script_result.ended),
                    'runtime': script_result.runtime,
                    'starttime': script_result.starttime,
                    'endtime': script_result.endtime,
                    'estimated_runtime': script_result.estimated_runtime,
                    'parameters': script_result.parameters,
                    'script_id': script_result.script_id,
                    'script_revision_id': script_result.script_version_id,
                }, result)
Exemple #3
0
 def test_store_result_sets_status_to_timedout_with_timedout_true(self):
     script_result = factory.make_ScriptResult(status=SCRIPT_STATUS.RUNNING)
     script_result.store_result(random.randint(0, 255), timedout=True)
     self.assertEqual(SCRIPT_STATUS.TIMEDOUT, script_result.status)
Exemple #4
0
 def test_get_endtime(self):
     now = datetime.now()
     script_result = factory.make_ScriptResult(status=SCRIPT_STATUS.PASSED,
                                               started=now,
                                               ended=now)
     self.assertEqual(now.timestamp(), script_result.endtime)
Exemple #5
0
 def test_read_results_ignores_empty(self):
     script_result = factory.make_ScriptResult(result=b"")
     self.assertDictEqual({}, script_result.read_results())
Exemple #6
0
 def test_name_returns_model_script_name_when_no_script(self):
     script_result = factory.make_ScriptResult()
     script_result.script = None
     script_name = factory.make_name("script_name")
     script_result.script_name = script_name
     self.assertEqual(script_name, script_result.name)
Exemple #7
0
 def test_name_returns_unknown_when_no_script_or_model_script_name(self):
     script_result = factory.make_ScriptResult()
     script_result.script = None
     script_result.script_name = None
     self.assertEqual("Unknown", script_result.name)
Exemple #8
0
 def test_not_suppressed_by_default(self):
     script_result = factory.make_ScriptResult()
     self.assertFalse(script_result.suppressed)
Exemple #9
0
 def test_suppressed(self):
     script_result = factory.make_ScriptResult(suppressed=True)
     self.assertTrue(script_result.suppressed)
Exemple #10
0
 def test_get_runtime_blank_when_missing(self):
     script_set = factory.make_ScriptSet()
     factory.make_ScriptResult(script_set=script_set,
                               status=SCRIPT_STATUS.PENDING)
     self.assertEquals('', script_set.runtime)
Exemple #11
0
 def test_read_results_does_not_require_results(self):
     result = {'status': random.choice(
         ['passed', 'failed', 'degraded', 'timedout'])}
     script_result = factory.make_ScriptResult(
         result=yaml.safe_dump(result).encode())
     self.assertDictEqual(result, script_result.read_results())
Exemple #12
0
    def test_regenerate(self):
        node = factory.make_Node()
        script_set = factory.make_ScriptSet(node=node)

        passed_storage_script = factory.make_Script(
            parameters={'storage': {
                'type': 'storage'
            }})
        passed_storage_parameters = {
            'storage': {
                'type': 'storage',
                'value': {
                    'name': factory.make_name('name'),
                    'model': factory.make_name('model'),
                    'serial': factory.make_name('serial'),
                    'id_path': '/dev/%s' % factory.make_name('id_path'),
                },
            }
        }
        passed_storage_script_result = factory.make_ScriptResult(
            script_set=script_set,
            status=SCRIPT_STATUS.PASSED,
            script=passed_storage_script,
            parameters=passed_storage_parameters)

        pending_storage_script = factory.make_Script(
            parameters={'storage': {
                'type': 'storage'
            }})
        pending_storage_parameters = {
            'storage': {
                'type': 'storage',
                'value': {
                    'name': factory.make_name('name'),
                    'model': factory.make_name('model'),
                    'serial': factory.make_name('serial'),
                    'id_path': '/dev/%s' % factory.make_name('id_path'),
                },
            }
        }
        pending_storage_script_result = factory.make_ScriptResult(
            script_set=script_set,
            status=SCRIPT_STATUS.PENDING,
            script=pending_storage_script,
            parameters=pending_storage_parameters)

        pending_other_script = factory.make_ScriptResult(script_set=script_set)

        script_set.regenerate()

        passed_storage_script_result = reload_object(
            passed_storage_script_result)
        self.assertIsNotNone(passed_storage_script_result)
        self.assertDictEqual(passed_storage_parameters,
                             passed_storage_script_result.parameters)
        self.assertIsNone(reload_object(pending_storage_script_result))
        self.assertIsNotNone(reload_object(pending_other_script))

        new_storage_script_result = script_set.scriptresult_set.get(
            script=pending_storage_script)
        bd = node.physicalblockdevice_set.first()
        self.assertDictEqual(
            {
                'storage': {
                    'type': 'storage',
                    'value': {
                        'name': bd.name,
                        'model': bd.model,
                        'serial': bd.serial,
                        'id_path': bd.id_path,
                        'physical_blockdevice_id': bd.id,
                    }
                }
            }, new_storage_script_result.parameters)
Exemple #13
0
 def test_store_result_only_allows_when_result_is_blank(self):
     script_result = factory.make_ScriptResult(status=SCRIPT_STATUS.RUNNING,
                                               result=factory.make_bytes())
     self.assertRaises(AssertionError, script_result.store_result,
                       random.randint(0, 255))
Exemple #14
0
 def test_read_results_ignores_empty(self):
     script_result = factory.make_ScriptResult(result=b'')
     self.assertIsNone(script_result.read_results())
Exemple #15
0
 def test_store_result_sets_status_to_failed_with_exit_code_non_zero(self):
     script_result = factory.make_ScriptResult(status=SCRIPT_STATUS.RUNNING)
     exit_status = random.randint(1, 255)
     script_result.store_result(exit_status)
     self.assertEqual(SCRIPT_STATUS.FAILED, script_result.status)
     self.assertEqual(exit_status, script_result.exit_status)
Exemple #16
0
 def test_read_results_errors_when_not_dict(self):
     script_result = factory.make_ScriptResult(
         result=factory.make_name('invalid').encode())
     with self.assertRaisesRegex(ValidationError,
                                 'YAML must be a dictionary.'):
         script_result.read_results()
Exemple #17
0
 def test_name_returns_script_name(self):
     script_result = factory.make_ScriptResult()
     self.assertEqual(script_result.script.name, script_result.name)
    def test_mark_nodes_failed_after_script_overrun(self):
        node, script_set = self.make_node()
        current_time = now()
        script_set.last_ping = current_time
        script_set.save()
        passed_script_result = factory.make_ScriptResult(
            script_set=script_set, status=SCRIPT_STATUS.PASSED
        )
        failed_script_result = factory.make_ScriptResult(
            script_set=script_set, status=SCRIPT_STATUS.FAILED
        )
        pending_script_result = factory.make_ScriptResult(
            script_set=script_set, status=SCRIPT_STATUS.PENDING
        )
        script = factory.make_Script(timeout=timedelta(seconds=60))
        running_script_result = factory.make_ScriptResult(
            script_set=script_set,
            status=SCRIPT_STATUS.RUNNING,
            script=script,
            started=current_time - timedelta(minutes=10),
        )

        mark_nodes_failed_after_missing_script_timeout(current_time, 20)
        node = reload_object(node)

        self.assertEquals(self.failed_status, node.status)
        self.assertEquals(
            "%s has run past it's timeout(%s)"
            % (
                running_script_result.name,
                str(running_script_result.script.timeout),
            ),
            node.error_description,
        )
        self.assertIn(
            call(
                "%s: %s has run past it's timeout(%s)"
                % (
                    node.hostname,
                    running_script_result.name,
                    str(running_script_result.script.timeout),
                )
            ),
            self.maaslog.call_args_list,
        )
        if node.enable_ssh:
            self.assertThat(self.mock_stop, MockNotCalled())
        else:
            self.assertThat(self.mock_stop, MockCalledOnce())
            self.assertIn(
                call("%s: Stopped because SSH is disabled" % node.hostname),
                self.maaslog.call_args_list,
            )
        self.assertEquals(
            SCRIPT_STATUS.PASSED, reload_object(passed_script_result).status
        )
        self.assertEquals(
            SCRIPT_STATUS.FAILED, reload_object(failed_script_result).status
        )
        self.assertEquals(
            SCRIPT_STATUS.ABORTED, reload_object(pending_script_result).status
        )
        self.assertEquals(
            SCRIPT_STATUS.TIMEDOUT, reload_object(running_script_result).status
        )
Exemple #19
0
 def test_save_stores_start_time(self):
     script_result = factory.make_ScriptResult(status=SCRIPT_STATUS.PENDING)
     script_result.status = SCRIPT_STATUS.RUNNING
     script_result.save(update_fields=["status"])
     self.assertIsNotNone(reload_object(script_result).started)
Exemple #20
0
 def create_scriptresult(self, script_set, params=None):
     if params is None:
         params = {}
     return factory.make_ScriptResult(script_set=script_set, **params)
Exemple #21
0
 def test_get_runtime_blank_when_missing(self):
     script_result = factory.make_ScriptResult(status=SCRIPT_STATUS.PENDING)
     self.assertEqual("", script_result.runtime)
Exemple #22
0
    def test_PUT_include_output(self):
        self.become_admin()
        script_set = self.make_scriptset()
        script_results = {}
        for _ in range(3):
            script_result = factory.make_ScriptResult(script_set=script_set)
            script_results[script_result.name] = script_result

        response = self.client.put(self.get_script_result_uri(script_set),
                                   {"include_output": True})
        self.assertThat(response, HasStatusCode(http.client.OK))
        parsed_result = json_load_bytes(response.content)
        results = parsed_result.pop("results")

        self.assertDictEqual(
            {
                "id":
                script_set.id,
                "system_id":
                script_set.node.system_id,
                "type":
                script_set.result_type,
                "type_name":
                script_set.result_type_name,
                "last_ping":
                fmt_time(script_set.last_ping),
                "status":
                script_set.status,
                "status_name":
                script_set.status_name,
                "started":
                fmt_time(script_set.started),
                "ended":
                fmt_time(script_set.ended),
                "runtime":
                script_set.runtime,
                "resource_uri":
                "/MAAS/api/2.0/nodes/%s/results/%d/" %
                (script_set.node.system_id, script_set.id),
            },
            parsed_result,
        )
        for result in results:
            script_result = script_results[result["name"]]
            self.assertDictEqual(
                {
                    "id": script_result.id,
                    "name": script_result.name,
                    "created": fmt_time(script_result.created),
                    "updated": fmt_time(script_result.updated),
                    "status": script_result.status,
                    "status_name": script_result.status_name,
                    "exit_status": script_result.exit_status,
                    "started": fmt_time(script_result.started),
                    "ended": fmt_time(script_result.ended),
                    "runtime": script_result.runtime,
                    "starttime": script_result.starttime,
                    "endtime": script_result.endtime,
                    "estimated_runtime": script_result.estimated_runtime,
                    "parameters": script_result.parameters,
                    "script_id": script_result.script_id,
                    "script_revision_id": script_result.script_version_id,
                    "suppressed": script_result.suppressed,
                    "output": b64encode(script_result.output).decode(),
                    "stdout": b64encode(script_result.stdout).decode(),
                    "stderr": b64encode(script_result.stderr).decode(),
                    "result": b64encode(script_result.result).decode(),
                },
                result,
            )
Exemple #23
0
 def test_get_endtime_None(self):
     script_result = factory.make_ScriptResult(status=SCRIPT_STATUS.PENDING)
     self.assertEqual("", script_result.endtime)
Exemple #24
0
    def test_PUT_filters(self):
        self.become_admin()
        scripts = [factory.make_Script() for _ in range(10)]
        script_set = self.make_scriptset()
        script_results = {}
        for script in scripts:
            script_result = factory.make_ScriptResult(script_set=script_set,
                                                      script=script)
            script_results[script_result.name] = script_result
        results_list = list(script_results.values())
        filtered_results = [random.choice(results_list) for _ in range(3)]

        response = self.client.get(
            self.get_script_result_uri(script_set),
            {
                "filters":
                "%s,%s,%d" % (
                    filtered_results[0].name,
                    random.choice([
                        tag for tag in filtered_results[1].script.tags
                        if "tag" in tag
                    ]),
                    filtered_results[2].id,
                )
            },
        )
        self.assertThat(response, HasStatusCode(http.client.OK))
        parsed_result = json_load_bytes(response.content)
        results = parsed_result.pop("results")

        self.assertDictEqual(
            {
                "id":
                script_set.id,
                "system_id":
                script_set.node.system_id,
                "type":
                script_set.result_type,
                "type_name":
                script_set.result_type_name,
                "last_ping":
                fmt_time(script_set.last_ping),
                "status":
                script_set.status,
                "status_name":
                script_set.status_name,
                "started":
                fmt_time(script_set.started),
                "ended":
                fmt_time(script_set.ended),
                "runtime":
                script_set.runtime,
                "resource_uri":
                "/MAAS/api/2.0/nodes/%s/results/%d/" %
                (script_set.node.system_id, script_set.id),
            },
            parsed_result,
        )
        for result in results:
            self.assertIn(
                result["name"],
                [script_result.name for script_result in filtered_results],
            )
            script_result = script_results[result["name"]]
            self.assertDictEqual(
                {
                    "id": script_result.id,
                    "name": script_result.name,
                    "created": fmt_time(script_result.created),
                    "updated": fmt_time(script_result.updated),
                    "status": script_result.status,
                    "status_name": script_result.status_name,
                    "exit_status": script_result.exit_status,
                    "started": fmt_time(script_result.started),
                    "ended": fmt_time(script_result.ended),
                    "runtime": script_result.runtime,
                    "starttime": script_result.starttime,
                    "endtime": script_result.endtime,
                    "estimated_runtime": script_result.estimated_runtime,
                    "parameters": script_result.parameters,
                    "script_id": script_result.script_id,
                    "script_revision_id": script_result.script_version_id,
                    "suppressed": script_result.suppressed,
                },
                result,
            )
Exemple #25
0
    def test_read_results_errors_when_invalid_yaml(self):
        script_result = factory.make_ScriptResult(result=b"{")

        self.assertRaises(ValidationError, script_result.read_results)
Exemple #26
0
    def test_GET_include_output(self):
        script_set = self.make_scriptset()
        script_results = {}
        for _ in range(3):
            script_result = factory.make_ScriptResult(script_set=script_set)
            script_results[script_result.name] = script_result

        response = self.client.get(self.get_script_result_uri(script_set),
                                   {'include_output': True})
        self.assertThat(response, HasStatusCode(http.client.OK))
        parsed_result = json_load_bytes(response.content)
        results = parsed_result.pop('results')

        self.assertDictEqual(
            {
                'id':
                script_set.id,
                'system_id':
                script_set.node.system_id,
                'type':
                script_set.result_type,
                'type_name':
                script_set.result_type_name,
                'last_ping':
                fmt_time(script_set.last_ping),
                'status':
                script_set.status,
                'status_name':
                script_set.status_name,
                'started':
                fmt_time(script_set.started),
                'ended':
                fmt_time(script_set.ended),
                'runtime':
                script_set.runtime,
                'resource_uri':
                '/MAAS/api/2.0/nodes/%s/results/%d/' %
                (script_set.node.system_id, script_set.id),
            }, parsed_result)
        for result in results:
            script_result = script_results[result['name']]
            self.assertDictEqual(
                {
                    'id': script_result.id,
                    'name': script_result.name,
                    'created': fmt_time(script_result.created),
                    'updated': fmt_time(script_result.updated),
                    'status': script_result.status,
                    'status_name': script_result.status_name,
                    'exit_status': script_result.exit_status,
                    'started': fmt_time(script_result.started),
                    'ended': fmt_time(script_result.ended),
                    'runtime': script_result.runtime,
                    'starttime': script_result.starttime,
                    'endtime': script_result.endtime,
                    'estimated_runtime': script_result.estimated_runtime,
                    'parameters': script_result.parameters,
                    'script_id': script_result.script_id,
                    'script_revision_id': script_result.script_version_id,
                    'output': b64encode(script_result.output).decode(),
                    'stdout': b64encode(script_result.stdout).decode(),
                    'stderr': b64encode(script_result.stderr).decode(),
                    'result': b64encode(script_result.result).decode(),
                }, result)