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)
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)
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)
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()
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))
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)
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)
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)