def test_deactivate_unused_hypervisors(self): model = self.fake_cluster.generate_scenario_1() fake_metrics = faker_cluster_and_metrics.FakeCeilometerMetrics(model) strategy = strategies.VMWorkloadConsolidation() strategy.ceilometer = mock.MagicMock( statistic_aggregation=fake_metrics.mock_get_statistics) h1 = model.get_hypervisor_from_id('Node_0') h2 = model.get_hypervisor_from_id('Node_1') vm_uuid = 'VM_0' strategy.deactivate_unused_hypervisors(model) self.assertEqual(0, len(strategy.solution.actions)) # Migrate VM to free the hypervisor strategy.add_migration(vm_uuid, h1, h2, model) strategy.deactivate_unused_hypervisors(model) expected = { 'action_type': 'change_nova_service_state', 'input_parameters': { 'state': 'down', 'resource_id': 'Node_0' } } self.assertEqual(2, len(strategy.solution.actions)) self.assertEqual(expected, strategy.solution.actions[1])
def setUp(self): super(TestVMWorkloadConsolidation, self).setUp() # fake cluster self.fake_cluster = faker_cluster_and_metrics.FakerModelCollector() p_model = mock.patch.object(strategies.VMWorkloadConsolidation, "compute_model", new_callable=mock.PropertyMock) self.m_model = p_model.start() self.addCleanup(p_model.stop) p_datasource = mock.patch.object(strategies.VMWorkloadConsolidation, self.datasource, new_callable=mock.PropertyMock) self.m_datasource = p_datasource.start() self.addCleanup(p_datasource.stop) p_audit_scope = mock.patch.object(strategies.VMWorkloadConsolidation, "audit_scope", new_callable=mock.PropertyMock) self.m_audit_scope = p_audit_scope.start() self.addCleanup(p_audit_scope.stop) self.m_audit_scope.return_value = mock.Mock() # fake metrics self.fake_metrics = self.fake_datasource_cls(self.m_model.return_value) self.m_model.return_value = model_root.ModelRoot() self.m_datasource.return_value = mock.Mock( statistic_aggregation=self.fake_metrics.mock_get_statistics) self.strategy = strategies.VMWorkloadConsolidation(config=mock.Mock( datasource=self.datasource))
def test_strategy(self): model = self.fake_cluster.generate_scenario_2() fake_metrics = faker_cluster_and_metrics.FakeCeilometerMetrics(model) strategy = strategies.VMWorkloadConsolidation() strategy.ceilometer = mock.MagicMock( statistic_aggregation=fake_metrics.mock_get_statistics) h1 = model.get_hypervisor_from_id('Node_0') cc = {'cpu': 1.0, 'ram': 1.0, 'disk': 1.0} strategy.offload_phase(model, cc) strategy.consolidation_phase(model, cc) strategy.optimize_solution(model) h2 = strategy.solution.actions[0]['input_parameters']['dst_hypervisor'] expected = [{ 'action_type': 'migrate', 'input_parameters': { 'dst_hypervisor': h2, 'src_hypervisor': h1.uuid, 'migration_type': 'live', 'resource_id': 'VM_3' } }, { 'action_type': 'migrate', 'input_parameters': { 'dst_hypervisor': h2, 'src_hypervisor': h1.uuid, 'migration_type': 'live', 'resource_id': 'VM_1' } }] self.assertEqual(expected, strategy.solution.actions)
def setUp(self): super(TestVMWorkloadConsolidation, self).setUp() # fake cluster self.fake_c_cluster = faker_cluster_and_metrics.FakerModelCollector() p_datasource = mock.patch.object(strategies.VMWorkloadConsolidation, 'datasource_backend', new_callable=mock.PropertyMock) self.m_datasource = p_datasource.start() self.addCleanup(p_datasource.stop) # fake metrics self.fake_metrics = self.fake_datasource_cls( self.m_c_model.return_value) self.m_datasource.return_value = mock.Mock( get_instance_cpu_usage=(self.fake_metrics.get_instance_cpu_util), get_instance_memory_usage=( self.fake_metrics.get_instance_ram_util), get_instance_root_disk_allocated=( self.fake_metrics.get_instance_disk_root_size), ) self.strategy = strategies.VMWorkloadConsolidation(config=mock.Mock( datasources=self.datasource))
def test_get_relative_cluster_utilization(self): model = self.fake_cluster.generate_scenario_1() fake_metrics = faker_cluster_and_metrics.FakeCeilometerMetrics(model) strategy = strategies.VMWorkloadConsolidation() strategy.ceilometer = mock.MagicMock( statistic_aggregation=fake_metrics.mock_get_statistics) cru = strategy.get_relative_cluster_utilization(model) expected_cru = {'cpu': 0.05, 'disk': 0.05, 'ram': 0.0234375} self.assertEqual(expected_cru, cru)
def test_get_relative_hypervisor_utilization(self): model = self.fake_cluster.generate_scenario_1() fake_metrics = faker_cluster_and_metrics.FakeCeilometerMetrics(model) strategy = strategies.VMWorkloadConsolidation() strategy.ceilometer = mock.MagicMock( statistic_aggregation=fake_metrics.mock_get_statistics) hypervisor = model.get_hypervisor_from_id('Node_0') rhu = strategy.get_relative_hypervisor_utilization(hypervisor, model) expected_rhu = {'disk': 0.04, 'ram': 0.015625, 'cpu': 0.025} self.assertEqual(expected_rhu, rhu)
def test_get_hypervisor_capacity(self): cluster = self.fake_cluster.generate_scenario_1() fake_metrics = faker_cluster_and_metrics.FakeCeilometerMetrics(cluster) strategy = strategies.VMWorkloadConsolidation() strategy.ceilometer = mock.MagicMock( statistic_aggregation=fake_metrics.mock_get_statistics) node_0 = cluster.get_hypervisor_from_id("Node_0") node_util = dict(cpu=40, ram=64, disk=250) self.assertEqual(node_util, strategy.get_hypervisor_capacity(node_0, cluster))
def test_get_vm_utilization(self): cluster = self.fake_cluster.generate_scenario_1() fake_metrics = faker_cluster_and_metrics.FakeCeilometerMetrics(cluster) strategy = strategies.VMWorkloadConsolidation() strategy.ceilometer = mock.MagicMock( statistic_aggregation=fake_metrics.mock_get_statistics) vm_0 = cluster.get_vm_from_id("VM_0") vm_util = dict(cpu=1.0, ram=1, disk=10) self.assertEqual(vm_util, strategy.get_vm_utilization(vm_0.uuid, cluster))
def test_offload_phase(self): model = self.fake_cluster.generate_scenario_1() fake_metrics = faker_cluster_and_metrics.FakeCeilometerMetrics(model) strategy = strategies.VMWorkloadConsolidation() strategy.ceilometer = mock.MagicMock( statistic_aggregation=fake_metrics.mock_get_statistics) cc = {'cpu': 1.0, 'ram': 1.0, 'disk': 1.0} strategy.offload_phase(model, cc) expected = [] self.assertEqual(expected, strategy.solution.actions)
def test_vm_fits(self): model = self.fake_cluster.generate_scenario_1() fake_metrics = faker_cluster_and_metrics.FakeCeilometerMetrics(model) strategy = strategies.VMWorkloadConsolidation() strategy.ceilometer = mock.MagicMock( statistic_aggregation=fake_metrics.mock_get_statistics) h = model.get_hypervisor_from_id('Node_1') vm_uuid = 'VM_0' cc = {'cpu': 1.0, 'ram': 1.0, 'disk': 1.0} res = strategy.vm_fits(vm_uuid, h, model, cc) self.assertEqual(True, res) cc = {'cpu': 0.025, 'ram': 1.0, 'disk': 1.0} res = strategy.vm_fits(vm_uuid, h, model, cc) self.assertEqual(False, res)
def test_add_action_deactivate_hypervisor(self): model = self.fake_cluster.generate_scenario_1() fake_metrics = faker_cluster_and_metrics.FakeCeilometerMetrics(model) strategy = strategies.VMWorkloadConsolidation() strategy.ceilometer = mock.MagicMock( statistic_aggregation=fake_metrics.mock_get_statistics) h = model.get_hypervisor_from_id('Node_0') strategy.add_action_deactivate_hypervisor(h) expected = [{ 'action_type': 'change_nova_service_state', 'input_parameters': { 'state': 'down', 'resource_id': 'Node_0' } }] self.assertEqual(expected, strategy.solution.actions)
def test_is_overloaded(self): strategy = strategies.VMWorkloadConsolidation() model = self.fake_cluster.generate_scenario_1() fake_metrics = faker_cluster_and_metrics.FakeCeilometerMetrics(model) strategy.ceilometer = mock.MagicMock( statistic_aggregation=fake_metrics.mock_get_statistics) h1 = model.get_hypervisor_from_id('Node_0') cc = {'cpu': 1.0, 'ram': 1.0, 'disk': 1.0} res = strategy.is_overloaded(h1, model, cc) self.assertEqual(False, res) cc = {'cpu': 0.025, 'ram': 1.0, 'disk': 1.0} res = strategy.is_overloaded(h1, model, cc) self.assertEqual(False, res) cc = {'cpu': 0.024, 'ram': 1.0, 'disk': 1.0} res = strategy.is_overloaded(h1, model, cc) self.assertEqual(True, res)
def test_add_migration(self): model = self.fake_cluster.generate_scenario_1() fake_metrics = faker_cluster_and_metrics.FakeCeilometerMetrics(model) strategy = strategies.VMWorkloadConsolidation() strategy.ceilometer = mock.MagicMock( statistic_aggregation=fake_metrics.mock_get_statistics) h1 = model.get_hypervisor_from_id('Node_0') h2 = model.get_hypervisor_from_id('Node_1') vm_uuid = 'VM_0' strategy.add_migration(vm_uuid, h1, h2, model) self.assertEqual(1, len(strategy.solution.actions)) expected = { 'action_type': 'migrate', 'input_parameters': { 'dst_hypervisor': h2.uuid, 'src_hypervisor': h1.uuid, 'migration_type': 'live', 'resource_id': vm_uuid } } self.assertEqual(expected, strategy.solution.actions[0])