Refuse to discover nodes that are not powered off or have instance uuid (part of #3)
This commit is contained in:
parent
6d9d98ac76
commit
d3b49c62fa
|
@ -179,21 +179,41 @@ def discover(uuids):
|
|||
LOG.exception('Cannot get node %s', uuid)
|
||||
raise DiscoveryFailed("Cannot get node %s: %s" % (uuid, exc))
|
||||
|
||||
_validate(ironic, node)
|
||||
|
||||
if not node.maintenance:
|
||||
LOG.warning('Node %s will be put in maintenance mode', node.uuid)
|
||||
|
||||
validation = ironic.node.validate(node.uuid)
|
||||
if not validation.power['result']:
|
||||
LOG.error('Failed validation of power interface for node %s, '
|
||||
'reason: %s', node.uuid, validation.power['reason'])
|
||||
raise DiscoveryFailed('Failed validation of power interface for '
|
||||
'node %s' % node.uuid)
|
||||
nodes.append(node)
|
||||
|
||||
LOG.info('Proceeding with discovery on nodes %s', [n.uuid for n in nodes])
|
||||
eventlet.greenthread.spawn_n(_background_discover, ironic, nodes)
|
||||
|
||||
|
||||
def _validate(ironic, node):
|
||||
if node.instance_uuid:
|
||||
LOG.error('Refusing to discover node %s with assigned instance_uuid',
|
||||
node.uuid)
|
||||
raise DiscoveryFailed(
|
||||
'Refusing to discover node %s with assigned instance uuid' %
|
||||
node.uuid)
|
||||
|
||||
power_state = node.power_state
|
||||
if power_state is not None and power_state.lower() != 'power off':
|
||||
LOG.error('Refusing to discover node %s with power_state "%s"',
|
||||
node.uuid, power_state)
|
||||
raise DiscoveryFailed(
|
||||
'Refusing to discover node %s with power state "%s"' %
|
||||
(node.uuid, power_state))
|
||||
|
||||
validation = ironic.node.validate(node.uuid)
|
||||
if not validation.power['result']:
|
||||
LOG.error('Failed validation of power interface for node %s, '
|
||||
'reason: %s', node.uuid, validation.power['reason'])
|
||||
raise DiscoveryFailed('Failed validation of power interface for '
|
||||
'node %s' % node.uuid)
|
||||
|
||||
|
||||
def _background_discover(ironic, nodes):
|
||||
patch = [{'op': 'add', 'path': '/extra/on_discovery', 'value': 'true'},
|
||||
{'op': 'replace', 'path': '/maintenance', 'value': 'true'}]
|
||||
|
|
|
@ -124,10 +124,14 @@ class TestDiscover(unittest.TestCase):
|
|||
def setUp(self):
|
||||
self.node1 = Mock(driver='pxe_ssh',
|
||||
uuid='uuid1',
|
||||
maintenance=True)
|
||||
maintenance=True,
|
||||
instance_uuid=None,
|
||||
power_state='power off')
|
||||
self.node2 = Mock(driver='pxe_ipmitool',
|
||||
uuid='uuid2',
|
||||
maintenance=False)
|
||||
maintenance=False,
|
||||
instance_uuid=None,
|
||||
power_state=None)
|
||||
firewall.MACS_DISCOVERY = set()
|
||||
init_conf()
|
||||
|
||||
|
@ -211,6 +215,42 @@ class TestDiscover(unittest.TestCase):
|
|||
discoverd.discover, [])
|
||||
self.assertFalse(client_mock.called)
|
||||
|
||||
def test_with_instance_uuid(self, client_mock, filters_mock, spawn_mock):
|
||||
self.node2.instance_uuid = 'uuid'
|
||||
cli = client_mock.return_value
|
||||
cli.node.get.side_effect = [
|
||||
self.node1,
|
||||
self.node2,
|
||||
]
|
||||
self.assertRaisesRegexp(
|
||||
discoverd.DiscoveryFailed,
|
||||
'node uuid2 with assigned instance uuid',
|
||||
discoverd.discover, ['uuid1', 'uuid2'])
|
||||
|
||||
self.assertEqual(2, cli.node.get.call_count)
|
||||
self.assertEqual(0, cli.node.list_ports.call_count)
|
||||
self.assertEqual(0, filters_mock.call_count)
|
||||
self.assertEqual(0, cli.node.set_power_state.call_count)
|
||||
self.assertEqual(0, cli.node.update.call_count)
|
||||
|
||||
def test_wrong_power_state(self, client_mock, filters_mock, spawn_mock):
|
||||
self.node2.power_state = 'power on'
|
||||
cli = client_mock.return_value
|
||||
cli.node.get.side_effect = [
|
||||
self.node1,
|
||||
self.node2,
|
||||
]
|
||||
self.assertRaisesRegexp(
|
||||
discoverd.DiscoveryFailed,
|
||||
'node uuid2 with power state "power on"',
|
||||
discoverd.discover, ['uuid1', 'uuid2'])
|
||||
|
||||
self.assertEqual(2, cli.node.get.call_count)
|
||||
self.assertEqual(0, cli.node.list_ports.call_count)
|
||||
self.assertEqual(0, filters_mock.call_count)
|
||||
self.assertEqual(0, cli.node.set_power_state.call_count)
|
||||
self.assertEqual(0, cli.node.update.call_count)
|
||||
|
||||
|
||||
@patch.object(discoverd, 'discover', autospec=True)
|
||||
class TestApiDiscover(unittest.TestCase):
|
||||
|
|
Loading…
Reference in New Issue