Example #1
0
    def test_introspect_bulk_transition_fails(self):
        client = self.app.client_manager.baremetal
        client.node = fakes.FakeBaremetalNodeClient(
            states={
                "ABC": "available",
                "DEF": "enroll",
            },
            transitions={
                ("ABC", "manage"): "manageable",
                ("DEF", "manage"): "enroll",  # state transition fails
                ("ABC", "provide"): "available"
            },
            transition_errors={
                ("DEF", "manage"): "power credential verification failed"
            })
        inspector_client = self.app.client_manager.baremetal_introspection
        for uuid in ('ABC', 'DEF'):
            inspector_client.states[uuid] = {'finished': True, 'error': None}
        log_fixture = self.useFixture(fixtures.FakeLogger())

        parsed_args = self.check_parser(self.cmd, [], [])
        self.cmd.take_action(parsed_args)

        self.assertIn("FAIL: State transition failed for Node DEF",
                      log_fixture.output)
        # Nodes that were successfully introspected are made available
        self.assertEqual([("ABC", "manage"), ("DEF", "manage"),
                          ("ABC", "provide")], client.node.updates)
Example #2
0
    def test_introspect_bulk_failed(self):
        client = self.app.client_manager.baremetal
        client.node = fakes.FakeBaremetalNodeClient(
            states={
                "ABCDEFGH": "available",
                "IJKLMNOP": "available"
            },
            transitions={
                ("ABCDEFGH", "manage"): "manageable",
                ("IJKLMNOP", "manage"): "manageable",
                ("ABCDEFGH", "provide"): "available",
            })
        inspector_client = self.app.client_manager.baremetal_introspection
        inspector_client.states['ABCDEFGH'] = {'finished': True, 'error': None}
        inspector_client.states['IJKLMNOP'] = {
            'finished': True,
            'error': 'fake error'
        }

        parsed_args = self.check_parser(self.cmd, [], [])
        self.assertRaisesRegexp(exceptions.IntrospectionError,
                                'IJKLMNOP: fake error', self.cmd.take_action,
                                parsed_args)

        self.assertEqual({
            'ABCDEFGH': 'available',
            'IJKLMNOP': 'manageable'
        }, client.node.states)
        self.assertEqual(['ABCDEFGH', 'IJKLMNOP'],
                         inspector_client.on_introspection)
Example #3
0
    def test_introspect_bulk_one(self):
        client = self.app.client_manager.baremetal
        client.node = fakes.FakeBaremetalNodeClient(
            states={"ABCDEFGH": "available"},
            transitions={
                ("ABCDEFGH", "manage"): "manageable",
                ("ABCDEFGH", "provide"): "available",
            })
        inspector_client = self.app.client_manager.baremetal_introspection
        inspector_client.states['ABCDEFGH'] = {'finished': True, 'error': None}

        parsed_args = self.check_parser(self.cmd, [], [])
        self.cmd.take_action(parsed_args)

        self.assertEqual(client.node.updates, [('ABCDEFGH', 'manage'),
                                               ('ABCDEFGH', 'provide')])
        self.assertEqual(['ABCDEFGH'], inspector_client.on_introspection)
Example #4
0
    def test_introspect_bulk(self):
        client = self.app.client_manager.baremetal
        client.node = fakes.FakeBaremetalNodeClient(
            states={"ABCDEFGH": "available"},
            transitions={
                ("ABCDEFGH", "manage"): "manageable",
                ("ABCDEFGH", "provide"): "available",
            }
        )

        self.websocket.wait_for_message.return_value = {
            "status": "SUCCESS",
            "message": "Success",
            "introspected_nodes": {},
        }

        parsed_args = self.check_parser(self.cmd, [], [])
        self.cmd.take_action(parsed_args)

        self._check_workflow_call()
Example #5
0
    def test_introspect_bulk(self):
        client = self.app.client_manager.baremetal
        client.node = fakes.FakeBaremetalNodeClient(states={
            "ABC": "available",
            "DEF": "enroll",
            "GHI": "manageable",
            "JKL": "clean_wait"
        },
                                                    transitions={
                                                        ("ABC", "manage"):
                                                        "manageable",
                                                        ("DEF", "manage"):
                                                        "manageable",
                                                        ("ABC", "provide"):
                                                        "available",
                                                        ("DEF", "provide"):
                                                        "available",
                                                        ("GHI", "provide"):
                                                        "available"
                                                    })
        inspector_client = self.app.client_manager.baremetal_introspection
        for uuid in ('ABC', 'DEF', 'GHI'):
            inspector_client.states[uuid] = {'finished': True, 'error': None}

        parsed_args = self.check_parser(self.cmd, [], [])
        self.cmd.take_action(parsed_args)

        # The nodes that are available are set to "manageable" state.
        # Then all manageable nodes are set to "available".
        self.assertEqual(client.node.updates, [('ABC', 'manage'),
                                               ('DEF', 'manage'),
                                               ('ABC', 'provide'),
                                               ('DEF', 'provide'),
                                               ('GHI', 'provide')])

        # Nodes which start in "enroll", "available" or "manageable" states are
        # introspected:
        self.assertEqual(['ABC', 'DEF', 'GHI'],
                         sorted(inspector_client.on_introspection))
Example #6
0
    def test_introspect_bulk_failed(self):
        client = self.app.client_manager.baremetal
        client.node = fakes.FakeBaremetalNodeClient(
            states={"ABCDEFGH": "available"},
            transitions={
                ("ABCDEFGH", "manage"): "manageable",
                ("ABCDEFGH", "provide"): "available",
            }
        )

        self.websocket.wait_for_message.return_value = {
            "status": "ERROR",
            "message": "Failed",
        }

        parsed_args = self.check_parser(self.cmd, [], [])

        self.assertRaises(
            exceptions.IntrospectionError,
            self.cmd.take_action, parsed_args)

        self._check_workflow_call(provide=False)
Example #7
0
    def test_introspect_bulk_timeout(self):
        client = self.app.client_manager.baremetal
        client.node = fakes.FakeBaremetalNodeClient(
            states={
                "ABC": "available",
                "DEF": "enroll",
            },
            transitions={
                ("ABC", "manage"): "available",  # transition times out
                ("DEF", "manage"): "manageable",
                ("DEF", "provide"): "available"
            })
        inspector_client = self.app.client_manager.baremetal_introspection
        inspector_client.states['ABC'] = {'finished': False, 'error': None}
        inspector_client.states['DEF'] = {'finished': True, 'error': None}
        log_fixture = self.useFixture(fixtures.FakeLogger())

        parsed_args = self.check_parser(self.cmd, [], [])
        self.cmd.take_action(parsed_args)

        self.assertIn("FAIL: Timeout waiting for Node ABC", log_fixture.output)
        # Nodes that were successfully introspected are made available
        self.assertEqual([("ABC", "manage"), ("DEF", "manage"),
                          ("DEF", "provide")], client.node.updates)
Example #8
0
    def setUp(self):
        super(TestImportBaremetal, self).setUp()

        # Get the command object to test
        self.cmd = baremetal.ImportBaremetal(self.app, None)

        self.csv_file = tempfile.NamedTemporaryFile(
            mode='w', delete=False, suffix='.csv')
        self.json_file = tempfile.NamedTemporaryFile(
            mode='w', delete=False, suffix='.json')
        self.instack_json = tempfile.NamedTemporaryFile(
            mode='w', delete=False, suffix='.json')
        self.yaml_file = tempfile.NamedTemporaryFile(
            mode='w', delete=False, suffix='.yaml')
        self.instack_yaml = tempfile.NamedTemporaryFile(
            mode='w', delete=False, suffix='.yaml')
        self.unsupported_txt = tempfile.NamedTemporaryFile(
            mode='w', delete=False, suffix='.txt')

        self.csv_file.write("""\
pxe_ssh,192.168.122.1,stack,"KEY1",00:0b:d0:69:7e:59
pxe_ssh,192.168.122.2,stack,"KEY2",00:0b:d0:69:7e:58""")

        self.nodes_list = [{
            "pm_user": "******",
            "pm_addr": "192.168.122.1",
            "pm_password": "******",
            "pm_type": "pxe_ssh",
            "mac": [
                "00:0b:d0:69:7e:59"
            ],
        }, {
            "pm_user": "******",
            "pm_addr": "192.168.122.2",
            "pm_password": "******",
            "pm_type": "pxe_ssh",
            "mac": [
                "00:0b:d0:69:7e:58"
            ]
        }]

        json.dump(self.nodes_list, self.json_file)
        json.dump({"nodes": self.nodes_list}, self.instack_json)
        self.yaml_file.write(yaml.safe_dump(self.nodes_list, indent=2))
        self.instack_yaml.write(
            yaml.safe_dump({"nodes": self.nodes_list}, indent=2))

        self.csv_file.close()
        self.json_file.close()
        self.instack_json.close()
        self.yaml_file.close()
        self.instack_yaml.close()
        self.baremetal = self.app.client_manager.baremetal
        self.baremetal.http_client.os_ironic_api_version = '1.11'
        self.baremetal.node = fakes.FakeBaremetalNodeClient(
            states={"ABCDEFGH": "enroll", "IJKLMNOP": "enroll"},
            transitions={
                ("ABCDEFGH", "manage"): "manageable",
                ("IJKLMNOP", "manage"): "manageable",
                ("ABCDEFGH", "provide"): "available",
                ("IJKLMNOP", "provide"): "available",

            }
        )
        self.mock_websocket_success = [{
            "status": "SUCCESS",
            "registered_nodes": [{
                "uuid": "MOCK_NODE_UUID"
            }],
        }, {
            "status": "SUCCESS"
        }]

        self.workflow = self.app.client_manager.workflow_engine
        tripleoclient = self.app.client_manager.tripleoclient
        websocket = tripleoclient.messaging_websocket()
        websocket.wait_for_message.side_effect = self.mock_websocket_success
        self.websocket = websocket

        uuid4_patcher = mock.patch('uuid.uuid4', return_value="UUID4")
        self.mock_uuid4 = uuid4_patcher.start()
        self.addCleanup(self.mock_uuid4.stop)