diff --git a/watcher/decision_engine/model/model_root.py b/watcher/decision_engine/model/model_root.py index 37b9e2296..e1ea55a6a 100644 --- a/watcher/decision_engine/model/model_root.py +++ b/watcher/decision_engine/model/model_root.py @@ -201,6 +201,25 @@ class ModelRoot(nx.DiGraph, base.Model): return node_instances + def get_node_used_resources(self, node): + vcpu_used = 0 + memory_used = 0 + disk_used = 0 + for instance in self.get_node_instances(node): + vcpu_used += instance.vcpus + memory_used += instance.memory + disk_used += instance.disk + + return dict(vcpu=vcpu_used, memory=memory_used, disk=disk_used) + + def get_node_free_resources(self, node): + resources_used = self.get_node_used_resources(node) + vcpu_free = node.vcpu_capacity-resources_used.get('vcpu') + memory_free = node.memory_mb_capacity-resources_used.get('memory') + disk_free = node.disk_gb_capacity-resources_used.get('disk') + + return dict(vcpu=vcpu_free, memory=memory_free, disk=disk_free) + def to_string(self): return self.to_xml() diff --git a/watcher/tests/decision_engine/model/test_model.py b/watcher/tests/decision_engine/model/test_model.py index 27016ee14..9cf133fb6 100644 --- a/watcher/tests/decision_engine/model/test_model.py +++ b/watcher/tests/decision_engine/model/test_model.py @@ -193,6 +193,38 @@ class TestModel(base.TestCase): self.assertRaises(exception.IllegalArgumentException, model.assert_instance, "valeur_qcq") + def test_get_node_instances(self): + fake_cluster = faker_cluster_state.FakerModelCollector() + model = fake_cluster.generate_scenario_1() + node = element.ComputeNode(uuid="Node_0") + instance0 = model.get_instance_by_uuid("INSTANCE_0") + instance1 = model.get_instance_by_uuid("INSTANCE_1") + instances = model.get_node_instances(node) + + self.assertEqual(2, len(instances)) + self.assertIn(instance0, instances) + self.assertIn(instance1, instances) + + def test_get_node_used_resources(self): + fake_cluster = faker_cluster_state.FakerModelCollector() + model = fake_cluster.generate_scenario_1() + node = element.ComputeNode(uuid="Node_0") + resources_used = model.get_node_used_resources(node) + + self.assertEqual(20, resources_used.get('vcpu')) + self.assertEqual(4, resources_used.get('memory')) + self.assertEqual(40, resources_used.get('disk')) + + def test_get_node_free_resources(self): + fake_cluster = faker_cluster_state.FakerModelCollector() + model = fake_cluster.generate_scenario_1() + node = model.get_node_by_uuid("Node_0") + resources_free = model.get_node_free_resources(node) + + self.assertEqual(20, resources_free.get('vcpu')) + self.assertEqual(128, resources_free.get('memory')) + self.assertEqual(210, resources_free.get('disk')) + class TestStorageModel(base.TestCase):