summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-03-26 17:03:12 +0000
committerGerrit Code Review <review@openstack.org>2015-03-26 17:03:12 +0000
commitfb0cc8f86f1328ba2c22832c40d6a4664bca3742 (patch)
tree92e89925ceb63751ff46a48704c207e75878d5f8
parent099b66f079547e8ec9f01959fe731d2011145409 (diff)
parent42b533856618e9940967ab87f0a9cb5973673f8b (diff)
downloadironic-fb0cc8f86f1328ba2c22832c40d6a4664bca3742.tar.gz
Merge "Agent driver: no-op heartbeat for maintenanced node"
-rw-r--r--ironic/drivers/modules/agent_base_vendor.py7
-rw-r--r--ironic/tests/drivers/test_agent_base_vendor.py23
2 files changed, 29 insertions, 1 deletions
diff --git a/ironic/drivers/modules/agent_base_vendor.py b/ironic/drivers/modules/agent_base_vendor.py
index 3c85acb2d..76d8f6c5c 100644
--- a/ironic/drivers/modules/agent_base_vendor.py
+++ b/ironic/drivers/modules/agent_base_vendor.py
@@ -223,7 +223,12 @@ class BaseAgentVendor(base.VendorInterface):
# TODO(jimrollenhagen) improve error messages here
msg = _('Failed checking if deploy is done.')
try:
- if node.provision_state == states.DEPLOYWAIT:
+ if node.maintenance:
+ # this shouldn't happen often, but skip the rest if it does.
+ LOG.debug('Heartbeat from node %(node)s in maintenance mode; '
+ 'not taking any action.', {'node': node.uuid})
+ return
+ elif node.provision_state == states.DEPLOYWAIT:
msg = _('Node failed to get image for deploy.')
self.continue_deploy(task, **kwargs)
elif (node.provision_state == states.DEPLOYING and
diff --git a/ironic/tests/drivers/test_agent_base_vendor.py b/ironic/tests/drivers/test_agent_base_vendor.py
index dcf7cea79..351c8be57 100644
--- a/ironic/tests/drivers/test_agent_base_vendor.py
+++ b/ironic/tests/drivers/test_agent_base_vendor.py
@@ -284,6 +284,29 @@ class TestBaseAgentVendor(db_base.DbTestCase):
'1be26c0b-03f2-4d2e-ae87-c02d7f33c123: Failed checking if deploy '
'is done. exception: LlamaException')
+ @mock.patch.object(agent_base_vendor.BaseAgentVendor, 'continue_deploy')
+ @mock.patch.object(agent_base_vendor.BaseAgentVendor, 'reboot_to_instance')
+ @mock.patch.object(agent_base_vendor.BaseAgentVendor,
+ '_notify_conductor_resume_clean')
+ def test_heartbeat_noops_maintenance_mode(self, ncrc_mock, rti_mock,
+ cd_mock):
+ """Ensures that heartbeat() no-ops for a maintenance node."""
+ kwargs = {
+ 'agent_url': 'http://127.0.0.1:9999/bar'
+ }
+ self.node.maintenance = True
+ for state in (states.AVAILABLE, states.DEPLOYWAIT, states.DEPLOYING,
+ states.CLEANING):
+ self.node.provision_state = state
+ self.node.save()
+ with task_manager.acquire(
+ self.context, self.node['uuid'], shared=True) as task:
+ self.passthru.heartbeat(task, **kwargs)
+
+ self.assertEqual(0, ncrc_mock.call_count)
+ self.assertEqual(0, rti_mock.call_count)
+ self.assertEqual(0, cd_mock.call_count)
+
def test_vendor_passthru_vendor_routes(self):
expected = ['heartbeat']
with task_manager.acquire(self.context, self.node.uuid,