Refuse to discover nodes that are not powered off or have instance uuid (part of #3)

This commit is contained in:
Dmitry Tantsur 2014-10-24 15:10:00 +02:00
parent 6d9d98ac76
commit d3b49c62fa
2 changed files with 68 additions and 8 deletions

View File

@ -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'}]

View File

@ -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):