diff options
author | Jenkins <jenkins@review.openstack.org> | 2015-03-26 17:03:12 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2015-03-26 17:03:12 +0000 |
commit | fb0cc8f86f1328ba2c22832c40d6a4664bca3742 (patch) | |
tree | 92e89925ceb63751ff46a48704c207e75878d5f8 | |
parent | 099b66f079547e8ec9f01959fe731d2011145409 (diff) | |
parent | 42b533856618e9940967ab87f0a9cb5973673f8b (diff) | |
download | ironic-fb0cc8f86f1328ba2c22832c40d6a4664bca3742.tar.gz |
Merge "Agent driver: no-op heartbeat for maintenanced node"
-rw-r--r-- | ironic/drivers/modules/agent_base_vendor.py | 7 | ||||
-rw-r--r-- | ironic/tests/drivers/test_agent_base_vendor.py | 23 |
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, |