From 7eb10eee0120619f68543578b083bef787e5f7ba Mon Sep 17 00:00:00 2001
From: licanwei
Date: Thu, 29 Aug 2019 09:23:44 +0800
Subject: [PATCH] Add get node used and free resources
Many strategies need get node used or free resources, we define
two new method for the purpose in ModelRoot class.
Change-Id: I8cb41fd560dbac9a78d25bfdba51799533db83c2
---
watcher/decision_engine/model/model_root.py | 19 +++++++++++
.../tests/decision_engine/model/test_model.py | 32 +++++++++++++++++++
2 files changed, 51 insertions(+)
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):