From 0727c0e3024c7c62c9f8721491fa11a45497daf5 Mon Sep 17 00:00:00 2001 From: chenke Date: Tue, 9 Jul 2019 10:56:36 +0800 Subject: [PATCH] Add reource_name for save_energy in action input parameter field (Partial implement) Implements: blueprint add-resource-name-in-action-input-parameter-field Change-Id: Icd9ee099bb769679b0313025e841c898a0fa2c6f --- .../strategy/strategies/saving_energy.py | 43 +++++++------- .../strategy/strategies/test_saving_energy.py | 56 +++++++++---------- 2 files changed, 50 insertions(+), 49 deletions(-) diff --git a/watcher/decision_engine/strategy/strategies/saving_energy.py b/watcher/decision_engine/strategy/strategies/saving_energy.py index 1ebc5969c..4ca13282f 100644 --- a/watcher/decision_engine/strategy/strategies/saving_energy.py +++ b/watcher/decision_engine/strategy/strategies/saving_energy.py @@ -141,17 +141,18 @@ class SavingEnergy(base.SavingEnergyBaseStrategy): }, } - def add_action_poweronoff_node(self, node_uuid, state): + def add_action_poweronoff_node(self, node, state): """Add an action for node disability into the solution. - :param node: node uuid + :param node: node :param state: node power state, power on or power off :return: None """ - params = {'state': state} + params = {'state': state, + 'resource_name': node.hostname} self.solution.add_action( action_type='change_node_power_state', - resource_id=node_uuid, + resource_id=node.uuid, input_parameters=params) def get_hosts_pool(self): @@ -163,17 +164,17 @@ class SavingEnergy(base.SavingEnergyBaseStrategy): node_list = self.ironic_client.node.list() for node in node_list: - node_uuid = (node.to_dict())['uuid'] - node_info = self.ironic_client.node.get(node_uuid).to_dict() - hypervisor_id = node_info['extra'].get('compute_node_id', None) + node_info = self.ironic_client.node.get(node.uuid) + hypervisor_id = node_info.extra.get('compute_node_id', None) if hypervisor_id is None: LOG.warning(('Cannot find compute_node_id in extra ' - 'of ironic node %s'), node_uuid) + 'of ironic node %s'), node.uuid) continue hypervisor_node = self.nova_client.hypervisors.get(hypervisor_id) if hypervisor_node is None: LOG.warning(('Cannot find hypervisor %s'), hypervisor_id) continue + node.hostname = hypervisor_node.hypervisor_hostname hypervisor_node = hypervisor_node.to_dict() compute_service = hypervisor_node.get('service', None) host_uuid = compute_service.get('host') @@ -187,12 +188,12 @@ class SavingEnergy(base.SavingEnergyBaseStrategy): continue else: if (hypervisor_node['running_vms'] == 0): - if (node_info['power_state'] == 'power on'): - self.free_poweron_node_pool.append(node_uuid) - elif (node_info['power_state'] == 'power off'): - self.free_poweroff_node_pool.append(node_uuid) + if (node_info.power_state == 'power on'): + self.free_poweron_node_pool.append(node) + elif (node_info.power_state == 'power off'): + self.free_poweroff_node_pool.append(node) else: - self.with_vms_node_pool.append(node_uuid) + self.with_vms_node_pool.append(node) def save_energy(self): @@ -202,16 +203,16 @@ class SavingEnergy(base.SavingEnergyBaseStrategy): len_poweron = len(self.free_poweron_node_pool) len_poweroff = len(self.free_poweroff_node_pool) if len_poweron > need_poweron: - for node_uuid in random.sample(self.free_poweron_node_pool, - (len_poweron - need_poweron)): - self.add_action_poweronoff_node(node_uuid, 'off') - LOG.debug("power off %s", node_uuid) + for node in random.sample(self.free_poweron_node_pool, + (len_poweron - need_poweron)): + self.add_action_poweronoff_node(node, 'off') + LOG.debug("power off %s", node.uuid) elif len_poweron < need_poweron: diff = need_poweron - len_poweron - for node_uuid in random.sample(self.free_poweroff_node_pool, - min(len_poweroff, diff)): - self.add_action_poweronoff_node(node_uuid, 'on') - LOG.debug("power on %s", node_uuid) + for node in random.sample(self.free_poweroff_node_pool, + min(len_poweroff, diff)): + self.add_action_poweronoff_node(node, 'on') + LOG.debug("power on %s", node.uuid) def pre_execute(self): self._pre_execute() diff --git a/watcher/tests/decision_engine/strategy/strategies/test_saving_energy.py b/watcher/tests/decision_engine/strategy/strategies/test_saving_energy.py index 7756656d4..61e66f39f 100644 --- a/watcher/tests/decision_engine/strategy/strategies/test_saving_energy.py +++ b/watcher/tests/decision_engine/strategy/strategies/test_saving_energy.py @@ -29,12 +29,12 @@ class TestSavingEnergy(TestBaseStrategy): def setUp(self): super(TestSavingEnergy, self).setUp() - mock_node1 = mock.Mock() - mock_node2 = mock.Mock() - mock_node1.to_dict.return_value = { + mock_node1_dict = { 'uuid': '922d4762-0bc5-4b30-9cb9-48ab644dd861'} - mock_node2.to_dict.return_value = { + mock_node2_dict = { 'uuid': '922d4762-0bc5-4b30-9cb9-48ab644dd862'} + mock_node1 = mock.Mock(**mock_node1_dict) + mock_node2 = mock.Mock(**mock_node2_dict) self.fake_nodes = [mock_node1, mock_node2] p_ironic = mock.patch.object( @@ -63,14 +63,14 @@ class TestSavingEnergy(TestBaseStrategy): self.strategy._nova_client = self.m_nova def test_get_hosts_pool_with_vms_node_pool(self): - mock_node1 = mock.Mock() - mock_node2 = mock.Mock() - mock_node1.to_dict.return_value = { + mock_node1_dict = { 'extra': {'compute_node_id': 1}, 'power_state': 'power on'} - mock_node2.to_dict.return_value = { + mock_node2_dict = { 'extra': {'compute_node_id': 2}, 'power_state': 'power off'} + mock_node1 = mock.Mock(**mock_node1_dict) + mock_node2 = mock.Mock(**mock_node2_dict) self.m_ironic.node.get.side_effect = [mock_node1, mock_node2] mock_hyper1 = mock.Mock() @@ -88,14 +88,14 @@ class TestSavingEnergy(TestBaseStrategy): self.assertEqual(len(self.strategy.free_poweroff_node_pool), 0) def test_get_hosts_pool_free_poweron_node_pool(self): - mock_node1 = mock.Mock() - mock_node2 = mock.Mock() - mock_node1.to_dict.return_value = { + mock_node1_dict = { 'extra': {'compute_node_id': 1}, 'power_state': 'power on'} - mock_node2.to_dict.return_value = { + mock_node2_dict = { 'extra': {'compute_node_id': 2}, 'power_state': 'power on'} + mock_node1 = mock.Mock(**mock_node1_dict) + mock_node2 = mock.Mock(**mock_node2_dict) self.m_ironic.node.get.side_effect = [mock_node1, mock_node2] mock_hyper1 = mock.Mock() @@ -113,14 +113,14 @@ class TestSavingEnergy(TestBaseStrategy): self.assertEqual(len(self.strategy.free_poweroff_node_pool), 0) def test_get_hosts_pool_free_poweroff_node_pool(self): - mock_node1 = mock.Mock() - mock_node2 = mock.Mock() - mock_node1.to_dict.return_value = { + mock_node1_dict = { 'extra': {'compute_node_id': 1}, 'power_state': 'power off'} - mock_node2.to_dict.return_value = { + mock_node2_dict = { 'extra': {'compute_node_id': 2}, 'power_state': 'power off'} + mock_node1 = mock.Mock(**mock_node1_dict) + mock_node2 = mock.Mock(**mock_node2_dict) self.m_ironic.node.get.side_effect = [mock_node1, mock_node2] mock_hyper1 = mock.Mock() @@ -138,14 +138,14 @@ class TestSavingEnergy(TestBaseStrategy): self.assertEqual(len(self.strategy.free_poweroff_node_pool), 2) def test_get_hosts_pool_with_node_out_model(self): - mock_node1 = mock.Mock() - mock_node2 = mock.Mock() - mock_node1.to_dict.return_value = { + mock_node1_dict = { 'extra': {'compute_node_id': 1}, 'power_state': 'power off'} - mock_node2.to_dict.return_value = { + mock_node2_dict = { 'extra': {'compute_node_id': 2}, 'power_state': 'power off'} + mock_node1 = mock.Mock(**mock_node1_dict) + mock_node2 = mock.Mock(**mock_node2_dict) self.m_ironic.node.get.side_effect = [mock_node1, mock_node2] mock_hyper1 = mock.Mock() @@ -164,8 +164,8 @@ class TestSavingEnergy(TestBaseStrategy): def test_save_energy_poweron(self): self.strategy.free_poweroff_node_pool = [ - '922d4762-0bc5-4b30-9cb9-48ab644dd861', - '922d4762-0bc5-4b30-9cb9-48ab644dd862' + mock.Mock(uuid='922d4762-0bc5-4b30-9cb9-48ab644dd861'), + mock.Mock(uuid='922d4762-0bc5-4b30-9cb9-48ab644dd862') ] self.strategy.save_energy() self.assertEqual(len(self.strategy.solution.actions), 1) @@ -174,8 +174,8 @@ class TestSavingEnergy(TestBaseStrategy): def test_save_energy_poweroff(self): self.strategy.free_poweron_node_pool = [ - '922d4762-0bc5-4b30-9cb9-48ab644dd861', - '922d4762-0bc5-4b30-9cb9-48ab644dd862' + mock.Mock(uuid='922d4762-0bc5-4b30-9cb9-48ab644dd861'), + mock.Mock(uuid='922d4762-0bc5-4b30-9cb9-48ab644dd862') ] self.strategy.save_energy() self.assertEqual(len(self.strategy.solution.actions), 1) @@ -183,14 +183,14 @@ class TestSavingEnergy(TestBaseStrategy): self.assertEqual(action.get('input_parameters').get('state'), 'off') def test_execute(self): - mock_node1 = mock.Mock() - mock_node2 = mock.Mock() - mock_node1.to_dict.return_value = { + mock_node1_dict = { 'extra': {'compute_node_id': 1}, 'power_state': 'power on'} - mock_node2.to_dict.return_value = { + mock_node2_dict = { 'extra': {'compute_node_id': 2}, 'power_state': 'power on'} + mock_node1 = mock.Mock(**mock_node1_dict) + mock_node2 = mock.Mock(**mock_node2_dict) self.m_ironic.node.get.side_effect = [mock_node1, mock_node2] mock_hyper1 = mock.Mock()