Merge "Add reource_name for save_energy in action input parameter field"
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user