Merge "Add reource_name for save_energy in action input parameter field"

This commit is contained in:
Zuul
2019-07-20 02:59:24 +00:00
committed by Gerrit Code Review
2 changed files with 50 additions and 49 deletions

View File

@@ -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. """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 :param state: node power state, power on or power off
:return: None :return: None
""" """
params = {'state': state} params = {'state': state,
'resource_name': node.hostname}
self.solution.add_action( self.solution.add_action(
action_type='change_node_power_state', action_type='change_node_power_state',
resource_id=node_uuid, resource_id=node.uuid,
input_parameters=params) input_parameters=params)
def get_hosts_pool(self): def get_hosts_pool(self):
@@ -163,17 +164,17 @@ class SavingEnergy(base.SavingEnergyBaseStrategy):
node_list = self.ironic_client.node.list() node_list = self.ironic_client.node.list()
for node in node_list: for node in node_list:
node_uuid = (node.to_dict())['uuid'] node_info = self.ironic_client.node.get(node.uuid)
node_info = self.ironic_client.node.get(node_uuid).to_dict() hypervisor_id = node_info.extra.get('compute_node_id', None)
hypervisor_id = node_info['extra'].get('compute_node_id', None)
if hypervisor_id is None: if hypervisor_id is None:
LOG.warning(('Cannot find compute_node_id in extra ' LOG.warning(('Cannot find compute_node_id in extra '
'of ironic node %s'), node_uuid) 'of ironic node %s'), node.uuid)
continue continue
hypervisor_node = self.nova_client.hypervisors.get(hypervisor_id) hypervisor_node = self.nova_client.hypervisors.get(hypervisor_id)
if hypervisor_node is None: if hypervisor_node is None:
LOG.warning(('Cannot find hypervisor %s'), hypervisor_id) LOG.warning(('Cannot find hypervisor %s'), hypervisor_id)
continue continue
node.hostname = hypervisor_node.hypervisor_hostname
hypervisor_node = hypervisor_node.to_dict() hypervisor_node = hypervisor_node.to_dict()
compute_service = hypervisor_node.get('service', None) compute_service = hypervisor_node.get('service', None)
host_uuid = compute_service.get('host') host_uuid = compute_service.get('host')
@@ -187,12 +188,12 @@ class SavingEnergy(base.SavingEnergyBaseStrategy):
continue continue
else: else:
if (hypervisor_node['running_vms'] == 0): if (hypervisor_node['running_vms'] == 0):
if (node_info['power_state'] == 'power on'): if (node_info.power_state == 'power on'):
self.free_poweron_node_pool.append(node_uuid) self.free_poweron_node_pool.append(node)
elif (node_info['power_state'] == 'power off'): elif (node_info.power_state == 'power off'):
self.free_poweroff_node_pool.append(node_uuid) self.free_poweroff_node_pool.append(node)
else: else:
self.with_vms_node_pool.append(node_uuid) self.with_vms_node_pool.append(node)
def save_energy(self): def save_energy(self):
@@ -202,16 +203,16 @@ class SavingEnergy(base.SavingEnergyBaseStrategy):
len_poweron = len(self.free_poweron_node_pool) len_poweron = len(self.free_poweron_node_pool)
len_poweroff = len(self.free_poweroff_node_pool) len_poweroff = len(self.free_poweroff_node_pool)
if len_poweron > need_poweron: if len_poweron > need_poweron:
for node_uuid in random.sample(self.free_poweron_node_pool, for node in random.sample(self.free_poweron_node_pool,
(len_poweron - need_poweron)): (len_poweron - need_poweron)):
self.add_action_poweronoff_node(node_uuid, 'off') self.add_action_poweronoff_node(node, 'off')
LOG.debug("power off %s", node_uuid) LOG.debug("power off %s", node.uuid)
elif len_poweron < need_poweron: elif len_poweron < need_poweron:
diff = need_poweron - len_poweron diff = need_poweron - len_poweron
for node_uuid in random.sample(self.free_poweroff_node_pool, for node in random.sample(self.free_poweroff_node_pool,
min(len_poweroff, diff)): min(len_poweroff, diff)):
self.add_action_poweronoff_node(node_uuid, 'on') self.add_action_poweronoff_node(node, 'on')
LOG.debug("power on %s", node_uuid) LOG.debug("power on %s", node.uuid)
def pre_execute(self): def pre_execute(self):
self._pre_execute() self._pre_execute()

View File

@@ -29,12 +29,12 @@ class TestSavingEnergy(TestBaseStrategy):
def setUp(self): def setUp(self):
super(TestSavingEnergy, self).setUp() super(TestSavingEnergy, self).setUp()
mock_node1 = mock.Mock() mock_node1_dict = {
mock_node2 = mock.Mock()
mock_node1.to_dict.return_value = {
'uuid': '922d4762-0bc5-4b30-9cb9-48ab644dd861'} 'uuid': '922d4762-0bc5-4b30-9cb9-48ab644dd861'}
mock_node2.to_dict.return_value = { mock_node2_dict = {
'uuid': '922d4762-0bc5-4b30-9cb9-48ab644dd862'} '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] self.fake_nodes = [mock_node1, mock_node2]
p_ironic = mock.patch.object( p_ironic = mock.patch.object(
@@ -63,14 +63,14 @@ class TestSavingEnergy(TestBaseStrategy):
self.strategy._nova_client = self.m_nova self.strategy._nova_client = self.m_nova
def test_get_hosts_pool_with_vms_node_pool(self): def test_get_hosts_pool_with_vms_node_pool(self):
mock_node1 = mock.Mock() mock_node1_dict = {
mock_node2 = mock.Mock()
mock_node1.to_dict.return_value = {
'extra': {'compute_node_id': 1}, 'extra': {'compute_node_id': 1},
'power_state': 'power on'} 'power_state': 'power on'}
mock_node2.to_dict.return_value = { mock_node2_dict = {
'extra': {'compute_node_id': 2}, 'extra': {'compute_node_id': 2},
'power_state': 'power off'} '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] self.m_ironic.node.get.side_effect = [mock_node1, mock_node2]
mock_hyper1 = mock.Mock() mock_hyper1 = mock.Mock()
@@ -88,14 +88,14 @@ class TestSavingEnergy(TestBaseStrategy):
self.assertEqual(len(self.strategy.free_poweroff_node_pool), 0) self.assertEqual(len(self.strategy.free_poweroff_node_pool), 0)
def test_get_hosts_pool_free_poweron_node_pool(self): def test_get_hosts_pool_free_poweron_node_pool(self):
mock_node1 = mock.Mock() mock_node1_dict = {
mock_node2 = mock.Mock()
mock_node1.to_dict.return_value = {
'extra': {'compute_node_id': 1}, 'extra': {'compute_node_id': 1},
'power_state': 'power on'} 'power_state': 'power on'}
mock_node2.to_dict.return_value = { mock_node2_dict = {
'extra': {'compute_node_id': 2}, 'extra': {'compute_node_id': 2},
'power_state': 'power on'} '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] self.m_ironic.node.get.side_effect = [mock_node1, mock_node2]
mock_hyper1 = mock.Mock() mock_hyper1 = mock.Mock()
@@ -113,14 +113,14 @@ class TestSavingEnergy(TestBaseStrategy):
self.assertEqual(len(self.strategy.free_poweroff_node_pool), 0) self.assertEqual(len(self.strategy.free_poweroff_node_pool), 0)
def test_get_hosts_pool_free_poweroff_node_pool(self): def test_get_hosts_pool_free_poweroff_node_pool(self):
mock_node1 = mock.Mock() mock_node1_dict = {
mock_node2 = mock.Mock()
mock_node1.to_dict.return_value = {
'extra': {'compute_node_id': 1}, 'extra': {'compute_node_id': 1},
'power_state': 'power off'} 'power_state': 'power off'}
mock_node2.to_dict.return_value = { mock_node2_dict = {
'extra': {'compute_node_id': 2}, 'extra': {'compute_node_id': 2},
'power_state': 'power off'} '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] self.m_ironic.node.get.side_effect = [mock_node1, mock_node2]
mock_hyper1 = mock.Mock() mock_hyper1 = mock.Mock()
@@ -138,14 +138,14 @@ class TestSavingEnergy(TestBaseStrategy):
self.assertEqual(len(self.strategy.free_poweroff_node_pool), 2) self.assertEqual(len(self.strategy.free_poweroff_node_pool), 2)
def test_get_hosts_pool_with_node_out_model(self): def test_get_hosts_pool_with_node_out_model(self):
mock_node1 = mock.Mock() mock_node1_dict = {
mock_node2 = mock.Mock()
mock_node1.to_dict.return_value = {
'extra': {'compute_node_id': 1}, 'extra': {'compute_node_id': 1},
'power_state': 'power off'} 'power_state': 'power off'}
mock_node2.to_dict.return_value = { mock_node2_dict = {
'extra': {'compute_node_id': 2}, 'extra': {'compute_node_id': 2},
'power_state': 'power off'} '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] self.m_ironic.node.get.side_effect = [mock_node1, mock_node2]
mock_hyper1 = mock.Mock() mock_hyper1 = mock.Mock()
@@ -164,8 +164,8 @@ class TestSavingEnergy(TestBaseStrategy):
def test_save_energy_poweron(self): def test_save_energy_poweron(self):
self.strategy.free_poweroff_node_pool = [ self.strategy.free_poweroff_node_pool = [
'922d4762-0bc5-4b30-9cb9-48ab644dd861', mock.Mock(uuid='922d4762-0bc5-4b30-9cb9-48ab644dd861'),
'922d4762-0bc5-4b30-9cb9-48ab644dd862' mock.Mock(uuid='922d4762-0bc5-4b30-9cb9-48ab644dd862')
] ]
self.strategy.save_energy() self.strategy.save_energy()
self.assertEqual(len(self.strategy.solution.actions), 1) self.assertEqual(len(self.strategy.solution.actions), 1)
@@ -174,8 +174,8 @@ class TestSavingEnergy(TestBaseStrategy):
def test_save_energy_poweroff(self): def test_save_energy_poweroff(self):
self.strategy.free_poweron_node_pool = [ self.strategy.free_poweron_node_pool = [
'922d4762-0bc5-4b30-9cb9-48ab644dd861', mock.Mock(uuid='922d4762-0bc5-4b30-9cb9-48ab644dd861'),
'922d4762-0bc5-4b30-9cb9-48ab644dd862' mock.Mock(uuid='922d4762-0bc5-4b30-9cb9-48ab644dd862')
] ]
self.strategy.save_energy() self.strategy.save_energy()
self.assertEqual(len(self.strategy.solution.actions), 1) self.assertEqual(len(self.strategy.solution.actions), 1)
@@ -183,14 +183,14 @@ class TestSavingEnergy(TestBaseStrategy):
self.assertEqual(action.get('input_parameters').get('state'), 'off') self.assertEqual(action.get('input_parameters').get('state'), 'off')
def test_execute(self): def test_execute(self):
mock_node1 = mock.Mock() mock_node1_dict = {
mock_node2 = mock.Mock()
mock_node1.to_dict.return_value = {
'extra': {'compute_node_id': 1}, 'extra': {'compute_node_id': 1},
'power_state': 'power on'} 'power_state': 'power on'}
mock_node2.to_dict.return_value = { mock_node2_dict = {
'extra': {'compute_node_id': 2}, 'extra': {'compute_node_id': 2},
'power_state': 'power on'} '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] self.m_ironic.node.get.side_effect = [mock_node1, mock_node2]
mock_hyper1 = mock.Mock() mock_hyper1 = mock.Mock()