Merge "Refactor for discoverd rename to inspector"
This commit is contained in:
commit
69adf64994
@ -6,7 +6,7 @@ pbr>=0.6,!=0.7,<1.0
|
||||
Babel>=1.3
|
||||
cliff>=1.7.0 # Apache-2.0
|
||||
ipaddress
|
||||
ironic-discoverd==1.1.0
|
||||
python-ironic-inspector-client>=1.0.1
|
||||
os-cloud-config
|
||||
python-heatclient>=0.3.0
|
||||
python-ironicclient>=0.4.1
|
||||
|
@ -159,39 +159,39 @@ class TestWaitForStackUtil(TestCase):
|
||||
self.assertEqual(complete, False)
|
||||
|
||||
|
||||
class TestWaitForDiscovery(TestCase):
|
||||
class TestWaitForIntrospection(TestCase):
|
||||
|
||||
def test_wait_for_discovery_success(self):
|
||||
def test_wait_for_introspection_success(self):
|
||||
|
||||
mock_discoverd = mock.Mock()
|
||||
mock_inspector = mock.Mock()
|
||||
self.node_uuids = [
|
||||
'NODE1',
|
||||
'NODE2',
|
||||
]
|
||||
|
||||
mock_discoverd.get_status.return_value = {
|
||||
mock_inspector.get_status.return_value = {
|
||||
'finished': True,
|
||||
'error': None
|
||||
}
|
||||
|
||||
result = utils.wait_for_node_discovery(mock_discoverd, "TOKEN",
|
||||
"URL", self.node_uuids,
|
||||
loops=4, sleep=0.01)
|
||||
result = utils.wait_for_node_introspection(mock_inspector, "TOKEN",
|
||||
"URL", self.node_uuids,
|
||||
loops=4, sleep=0.01)
|
||||
|
||||
self.assertEqual(list(result), [
|
||||
('NODE1', {'error': None, 'finished': True}),
|
||||
('NODE2', {'error': None, 'finished': True})
|
||||
])
|
||||
|
||||
def test_wait_for_discovery_partial_success(self):
|
||||
def test_wait_for_introspection_partial_success(self):
|
||||
|
||||
mock_discoverd = mock.Mock()
|
||||
mock_inspector = mock.Mock()
|
||||
self.node_uuids = [
|
||||
'NODE1',
|
||||
'NODE2',
|
||||
]
|
||||
|
||||
mock_discoverd.get_status.side_effect = [{
|
||||
mock_inspector.get_status.side_effect = [{
|
||||
'finished': True,
|
||||
'error': None
|
||||
}, {
|
||||
@ -199,31 +199,31 @@ class TestWaitForDiscovery(TestCase):
|
||||
'error': "Failed"
|
||||
}]
|
||||
|
||||
result = utils.wait_for_node_discovery(mock_discoverd, "TOKEN",
|
||||
"URL", self.node_uuids,
|
||||
loops=4, sleep=0.01)
|
||||
result = utils.wait_for_node_introspection(mock_inspector, "TOKEN",
|
||||
"URL", self.node_uuids,
|
||||
loops=4, sleep=0.01)
|
||||
|
||||
self.assertEqual(list(result), [
|
||||
('NODE1', {'error': None, 'finished': True}),
|
||||
('NODE2', {'error': "Failed", 'finished': True})
|
||||
])
|
||||
|
||||
def test_wait_for_discovery_timeout(self):
|
||||
def test_wait_for_introspection_timeout(self):
|
||||
|
||||
mock_discoverd = mock.Mock()
|
||||
mock_inspector = mock.Mock()
|
||||
self.node_uuids = [
|
||||
'NODE1',
|
||||
'NODE2',
|
||||
]
|
||||
|
||||
mock_discoverd.get_status.return_value = {
|
||||
mock_inspector.get_status.return_value = {
|
||||
'finished': False,
|
||||
'error': None
|
||||
}
|
||||
|
||||
result = utils.wait_for_node_discovery(mock_discoverd, "TOKEN",
|
||||
"URL", self.node_uuids,
|
||||
loops=4, sleep=0.01)
|
||||
result = utils.wait_for_node_introspection(mock_inspector, "TOKEN",
|
||||
"URL", self.node_uuids,
|
||||
loops=4, sleep=0.01)
|
||||
|
||||
self.assertEqual(list(result), [])
|
||||
|
||||
|
@ -19,8 +19,6 @@ import json
|
||||
import mock
|
||||
import os
|
||||
|
||||
from ironic_discoverd import client as discoverd_client
|
||||
|
||||
from tripleoclient import exceptions
|
||||
from tripleoclient.tests.v1.baremetal import fakes
|
||||
from tripleoclient.v1 import baremetal
|
||||
@ -452,9 +450,9 @@ class TestStartBaremetalIntrospectionBulk(fakes.TestBaremetal):
|
||||
# Get the command object to test
|
||||
self.cmd = baremetal.StartBaremetalIntrospectionBulk(self.app, None)
|
||||
|
||||
@mock.patch('ironic_discoverd.client.get_status', autospec=True)
|
||||
@mock.patch('ironic_discoverd.client.introspect', autospec=True)
|
||||
def test_introspect_bulk_one(self, introspect_mock, get_status_mock,):
|
||||
@mock.patch.object(baremetal.inspector_client, 'get_status', autospec=True)
|
||||
@mock.patch.object(baremetal.inspector_client, 'introspect', autospec=True)
|
||||
def test_introspect_bulk_one(self, inspection_mock, get_status_mock):
|
||||
|
||||
client = self.app.client_manager.tripleoclient.baremetal()
|
||||
client.node.list.return_value = [
|
||||
@ -464,19 +462,19 @@ class TestStartBaremetalIntrospectionBulk(fakes.TestBaremetal):
|
||||
parsed_args = self.check_parser(self.cmd, [], [])
|
||||
self.cmd.take_action(parsed_args)
|
||||
|
||||
introspect_mock.assert_called_once_with(
|
||||
inspection_mock.assert_called_once_with(
|
||||
'ABCDEFGH', base_url=None, auth_token='TOKEN')
|
||||
|
||||
@mock.patch('tripleoclient.utils.wait_for_node_discovery',
|
||||
@mock.patch('tripleoclient.utils.wait_for_node_introspection',
|
||||
autospec=True)
|
||||
@mock.patch('tripleoclient.utils.wait_for_provision_state',
|
||||
autospec=True)
|
||||
@mock.patch('ironic_discoverd.client.get_status', autospec=True)
|
||||
@mock.patch('ironic_discoverd.client.introspect', autospec=True)
|
||||
@mock.patch.object(baremetal.inspector_client, 'get_status', autospec=True)
|
||||
@mock.patch.object(baremetal.inspector_client, 'introspect', autospec=True)
|
||||
def test_introspect_bulk(self, introspect_mock, get_status_mock,
|
||||
wait_for_state_mock, wait_for_discover_mock):
|
||||
wait_for_state_mock, wait_for_inspect_mock):
|
||||
|
||||
wait_for_discover_mock.return_value = []
|
||||
wait_for_inspect_mock.return_value = []
|
||||
wait_for_state_mock.return_value = True
|
||||
|
||||
get_status_mock.return_value = {'finished': True, 'error': None}
|
||||
@ -507,8 +505,8 @@ class TestStartBaremetalIntrospectionBulk(fakes.TestBaremetal):
|
||||
mock.call('IJKLMNOP', base_url=None, auth_token='TOKEN'),
|
||||
])
|
||||
|
||||
wait_for_discover_mock.assert_called_once_with(
|
||||
discoverd_client, 'TOKEN', None,
|
||||
wait_for_inspect_mock.assert_called_once_with(
|
||||
baremetal.inspector_client, 'TOKEN', None,
|
||||
['IJKLMNOP'])
|
||||
|
||||
# And lastly it will be set to available:
|
||||
@ -525,30 +523,30 @@ class TestStatusBaremetalIntrospectionBulk(fakes.TestBaremetal):
|
||||
# Get the command object to test
|
||||
self.cmd = baremetal.StatusBaremetalIntrospectionBulk(self.app, None)
|
||||
|
||||
@mock.patch('ironic_discoverd.client.get_status', autospec=True)
|
||||
def test_status_bulk_one(self, discoverd_mock):
|
||||
@mock.patch.object(baremetal.inspector_client, 'get_status', autospec=True)
|
||||
def test_status_bulk_one(self, get_status_mock):
|
||||
|
||||
client = self.app.client_manager.tripleoclient.baremetal()
|
||||
client.node.list.return_value = [
|
||||
mock.Mock(uuid="ABCDEFGH")
|
||||
]
|
||||
|
||||
discoverd_mock.return_value = {
|
||||
get_status_mock.return_value = {
|
||||
'finished': False, 'error': None
|
||||
}
|
||||
|
||||
parsed_args = self.check_parser(self.cmd, [], [])
|
||||
result = self.cmd.take_action(parsed_args)
|
||||
|
||||
discoverd_mock.assert_called_once_with(
|
||||
get_status_mock.assert_called_once_with(
|
||||
'ABCDEFGH', base_url=None, auth_token='TOKEN')
|
||||
|
||||
self.assertEqual(result, (
|
||||
('Node UUID', 'Finished', 'Error'),
|
||||
[('ABCDEFGH', False, None)]))
|
||||
|
||||
@mock.patch('ironic_discoverd.client.get_status', autospec=True)
|
||||
def test_status_bulk(self, discoverd_mock):
|
||||
@mock.patch.object(baremetal.inspector_client, 'get_status', autospec=True)
|
||||
def test_status_bulk(self, get_status_mock):
|
||||
|
||||
client = self.app.client_manager.tripleoclient.baremetal()
|
||||
client.node.list.return_value = [
|
||||
@ -557,14 +555,14 @@ class TestStatusBaremetalIntrospectionBulk(fakes.TestBaremetal):
|
||||
mock.Mock(uuid="QRSTUVWX"),
|
||||
]
|
||||
|
||||
discoverd_mock.return_value = {
|
||||
get_status_mock.return_value = {
|
||||
'finished': False, 'error': None
|
||||
}
|
||||
|
||||
parsed_args = self.check_parser(self.cmd, [], [])
|
||||
result = self.cmd.take_action(parsed_args)
|
||||
|
||||
discoverd_mock.assert_has_calls([
|
||||
get_status_mock.assert_has_calls([
|
||||
mock.call('ABCDEFGH', base_url=None, auth_token='TOKEN'),
|
||||
mock.call('IJKLMNOP', base_url=None, auth_token='TOKEN'),
|
||||
mock.call('QRSTUVWX', base_url=None, auth_token='TOKEN'),
|
||||
@ -795,22 +793,22 @@ class TestConfigureReadyState(fakes.TestBaremetal):
|
||||
|
||||
bm_client.node.set_power_state.assert_called_once_with('foo', 'reboot')
|
||||
|
||||
@mock.patch('ironic_discoverd.client.introspect', autospec=True)
|
||||
@mock.patch('tripleoclient.utils.wait_for_node_discovery',
|
||||
@mock.patch.object(baremetal.inspector_client, 'introspect', autospec=True)
|
||||
@mock.patch('tripleoclient.utils.wait_for_node_introspection',
|
||||
autospec=True)
|
||||
def test__run_introspection(self, mock_wait_for_node_discovery,
|
||||
def test__run_introspection(self, mock_wait_for_node_introspection,
|
||||
mock_introspect):
|
||||
nodes = [mock.Mock(uuid='foo')]
|
||||
bm_client = self.app.client_manager.tripleoclient.baremetal()
|
||||
self.cmd.bm_client = bm_client
|
||||
self.cmd.discoverd_url = None
|
||||
self.cmd.inspector_url = None
|
||||
|
||||
self.cmd._run_introspection(nodes)
|
||||
|
||||
mock_introspect.assert_called_once_with('foo', base_url=None,
|
||||
auth_token='TOKEN')
|
||||
mock_wait_for_node_discovery.assert_called_once_with(mock.ANY, 'TOKEN',
|
||||
None, ['foo'])
|
||||
mock_wait_for_node_introspection.assert_called_once_with(
|
||||
mock.ANY, 'TOKEN', None, ['foo'])
|
||||
|
||||
|
||||
class TestConfigureBaremetalBoot(fakes.TestBaremetal):
|
||||
|
@ -161,7 +161,7 @@ def wait_for_stack_ready(orchestration_client, stack_name):
|
||||
|
||||
def wait_for_provision_state(baremetal_client, node_uuid, provision_state,
|
||||
loops=10, sleep=1):
|
||||
"""Wait for a given Provisioning state in Ironic Discoverd
|
||||
"""Wait for a given Provisioning state in Ironic
|
||||
|
||||
Updating the provisioning state is an async operation, we
|
||||
need to wait for it to be completed.
|
||||
@ -199,22 +199,16 @@ def wait_for_provision_state(baremetal_client, node_uuid, provision_state,
|
||||
return False
|
||||
|
||||
|
||||
def wait_for_node_discovery(discoverd_client, auth_token, discoverd_url,
|
||||
node_uuids, loops=220, sleep=10):
|
||||
"""Check the status of Node discovery in Ironic discoverd
|
||||
def wait_for_node_introspection(inspector_client, auth_token, inspector_url,
|
||||
node_uuids, loops=220, sleep=10):
|
||||
"""Check the status of Node introspection in Ironic inspector
|
||||
|
||||
Gets the status and waits for them to complete.
|
||||
|
||||
:param discoverd_client: Ironic Discoverd client
|
||||
:type discoverd_client: ironic_discoverd.client
|
||||
:param inspector_client: Ironic inspector client
|
||||
:type inspector_client: ironic_inspector_client
|
||||
|
||||
:param auth_token: Authorisation token used by discoverd client
|
||||
:type auth_token: string
|
||||
|
||||
:param discoverd_url: URL used by the discoverd client
|
||||
:type discoverd_url: string
|
||||
|
||||
:param node_uuids: List of Node UUID's to wait for discovery
|
||||
:param node_uuids: List of Node UUID's to wait for introspection
|
||||
:type node_uuids: [string, ]
|
||||
|
||||
:param loops: How many times to loop
|
||||
@ -224,21 +218,21 @@ def wait_for_node_discovery(discoverd_client, auth_token, discoverd_url,
|
||||
:type sleep: int
|
||||
"""
|
||||
|
||||
log = logging.getLogger(__name__ + ".wait_for_node_discovery")
|
||||
log = logging.getLogger(__name__ + ".wait_for_node_introspection")
|
||||
node_uuids = node_uuids[:]
|
||||
|
||||
for _ in range(0, loops):
|
||||
|
||||
for node_uuid in node_uuids:
|
||||
|
||||
status = discoverd_client.get_status(
|
||||
status = inspector_client.get_status(
|
||||
node_uuid,
|
||||
base_url=discoverd_url,
|
||||
base_url=inspector_url,
|
||||
auth_token=auth_token)
|
||||
|
||||
if status['finished']:
|
||||
log.debug("Discover finished for node {0} (Error: {1})".format(
|
||||
node_uuid, status['error']))
|
||||
log.debug("Introspection finished for node {0} "
|
||||
"(Error: {1})".format(node_uuid, status['error']))
|
||||
node_uuids.remove(node_uuid)
|
||||
yield node_uuid, status
|
||||
|
||||
@ -247,7 +241,7 @@ def wait_for_node_discovery(discoverd_client, auth_token, discoverd_url,
|
||||
time.sleep(sleep)
|
||||
|
||||
if len(node_uuids):
|
||||
log.error("Discovery didn't finish for nodes {0}".format(
|
||||
log.error("Introspection didn't finish for nodes {0}".format(
|
||||
','.join(node_uuids)))
|
||||
|
||||
|
||||
|
@ -24,7 +24,7 @@ import time
|
||||
|
||||
from cliff import command
|
||||
from cliff import lister
|
||||
from ironic_discoverd import client as discoverd_client
|
||||
from ironic_inspector_client import client as inspector_client
|
||||
from openstackclient.common import utils as osc_utils
|
||||
from os_cloud_config import nodes
|
||||
|
||||
@ -186,9 +186,9 @@ class IntrospectionParser(object):
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(IntrospectionParser, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'--discoverd-url',
|
||||
default=osc_utils.env('DISCOVERD_URL', default=None),
|
||||
help='discoverd URL, defaults to localhost (env: DISCOVERD_URL).')
|
||||
'--inspector-url',
|
||||
default=osc_utils.env('INSPECTOR_URL', default=None),
|
||||
help='inspector URL, defaults to localhost (env: INSPECTOR_URL).')
|
||||
return parser
|
||||
|
||||
|
||||
@ -208,7 +208,6 @@ class StartBaremetalIntrospectionBulk(IntrospectionParser, command.Command):
|
||||
client = self.app.client_manager.tripleoclient.baremetal()
|
||||
|
||||
auth_token = self.app.client_manager.auth_ref.auth_token
|
||||
|
||||
node_uuids = []
|
||||
|
||||
print("Setting available nodes to manageable...")
|
||||
@ -226,9 +225,9 @@ class StartBaremetalIntrospectionBulk(IntrospectionParser, command.Command):
|
||||
node_uuids.append(node.uuid)
|
||||
|
||||
print("Starting introspection of node: {0}".format(node.uuid))
|
||||
discoverd_client.introspect(
|
||||
inspector_client.introspect(
|
||||
node.uuid,
|
||||
base_url=parsed_args.discoverd_url,
|
||||
base_url=parsed_args.inspector_url,
|
||||
auth_token=auth_token)
|
||||
|
||||
# NOTE(dtantsur): PXE firmware on virtual machines misbehaves when
|
||||
@ -237,16 +236,16 @@ class StartBaremetalIntrospectionBulk(IntrospectionParser, command.Command):
|
||||
# around it by using sleep, anyway introspection takes much longer.
|
||||
time.sleep(5)
|
||||
|
||||
print("Waiting for discovery to finish...")
|
||||
print("Waiting for introspection to finish...")
|
||||
has_errors = False
|
||||
for uuid, status in utils.wait_for_node_discovery(
|
||||
discoverd_client, auth_token, parsed_args.discoverd_url,
|
||||
for uuid, status in utils.wait_for_node_introspection(
|
||||
inspector_client, auth_token, parsed_args.inspector_url,
|
||||
node_uuids):
|
||||
if status['error'] is None:
|
||||
print("Discovery for UUID {0} finished successfully."
|
||||
print("Introspection for UUID {0} finished successfully."
|
||||
.format(uuid))
|
||||
else:
|
||||
print("Discovery for UUID {0} finished with error: {1}"
|
||||
print("Introspection for UUID {0} finished with error: {1}"
|
||||
.format(uuid, status['error']))
|
||||
has_errors = True
|
||||
|
||||
@ -263,9 +262,9 @@ class StartBaremetalIntrospectionBulk(IntrospectionParser, command.Command):
|
||||
print("Node {0} has been set to available.".format(uuid))
|
||||
|
||||
if has_errors:
|
||||
print("Discovery completed with errors.")
|
||||
print("Introspection completed with errors.")
|
||||
else:
|
||||
print("Discovery completed.")
|
||||
print("Introspection completed.")
|
||||
|
||||
|
||||
class StatusBaremetalIntrospectionBulk(IntrospectionParser, lister.Lister):
|
||||
@ -277,16 +276,17 @@ class StatusBaremetalIntrospectionBulk(IntrospectionParser, lister.Lister):
|
||||
|
||||
self.log.debug("take_action(%s)" % parsed_args)
|
||||
client = self.app.client_manager.tripleoclient.baremetal()
|
||||
auth_token = self.app.client_manager.auth_ref.auth_token
|
||||
|
||||
statuses = []
|
||||
|
||||
for node in client.node.list():
|
||||
self.log.debug("Getting introspection status of Ironic node {0}"
|
||||
.format(node.uuid))
|
||||
auth_token = self.app.client_manager.auth_ref.auth_token
|
||||
statuses.append((node.uuid, discoverd_client.get_status(
|
||||
|
||||
statuses.append((node.uuid, inspector_client.get_status(
|
||||
node.uuid,
|
||||
base_url=parsed_args.discoverd_url,
|
||||
base_url=parsed_args.inspector_url,
|
||||
auth_token=auth_token)))
|
||||
|
||||
return (
|
||||
@ -395,21 +395,21 @@ class ConfigureReadyState(IntrospectionParser, command.Command):
|
||||
|
||||
for node in nodes:
|
||||
print("Starting introspection on node {0}".format(node.uuid))
|
||||
discoverd_client.introspect(
|
||||
inspector_client.introspect(
|
||||
node.uuid,
|
||||
base_url=self.discoverd_url,
|
||||
base_url=self.inspector_url,
|
||||
auth_token=auth_token)
|
||||
node_uuids.append(node.uuid)
|
||||
|
||||
print("Waiting for discovery to finish")
|
||||
for uuid, status in utils.wait_for_node_discovery(
|
||||
discoverd_client, auth_token, self.discoverd_url,
|
||||
print("Waiting for introspection to finish")
|
||||
for uuid, status in utils.wait_for_node_introspection(
|
||||
inspector_client, auth_token, self.inspector_url,
|
||||
node_uuids):
|
||||
if status['error'] is None:
|
||||
print("Discovery for node {0} finished successfully."
|
||||
print("Introspection for node {0} finished successfully."
|
||||
.format(uuid))
|
||||
else:
|
||||
print("Discovery for node {0} finished with error: {1}"
|
||||
print("Introspection for node {0} finished with error: {1}"
|
||||
.format(uuid, status['error']))
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
@ -424,7 +424,7 @@ class ConfigureReadyState(IntrospectionParser, command.Command):
|
||||
|
||||
self.bm_client = (
|
||||
self.app.client_manager.tripleoclient.baremetal())
|
||||
self.discoverd_url = parsed_args.discoverd_url
|
||||
self.inspector_url = parsed_args.inspector_url
|
||||
drac_nodes = [node for node in self.bm_client.node.list(detail=True)
|
||||
if 'drac' in node.driver]
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user