From 887a4191a561f7c6880c745c50a57eb0e4e301a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn?= Date: Wed, 16 Oct 2013 13:38:52 +0200 Subject: [PATCH] Feature #1678: Method to calculate VM storage usage in scheduler --- src/image/Image.cc | 3 + src/scheduler/include/VirtualMachineXML.h | 18 ++- .../src/pool/VirtualMachinePoolXML.cc | 25 ++++ src/scheduler/src/pool/VirtualMachineXML.cc | 114 +++++++++++++++++- 4 files changed, 152 insertions(+), 8 deletions(-) diff --git a/src/image/Image.cc b/src/image/Image.cc index a67f081c18..0966db8406 100644 --- a/src/image/Image.cc +++ b/src/image/Image.cc @@ -517,6 +517,9 @@ int Image::disk_attribute( VectorAttribute * disk, disk->replace("IMAGE_ID", iid.str()); disk->replace("SOURCE", source); + // TODO: move all size values (image, volatile disk, quotas) to long long + disk->replace("SIZE", (int)size_mb); + if (driver.empty() && !template_driver.empty())//DRIVER in Image,not in DISK { disk->replace("DRIVER",template_driver); diff --git a/src/scheduler/include/VirtualMachineXML.h b/src/scheduler/include/VirtualMachineXML.h index d6b535bae0..94d1051606 100644 --- a/src/scheduler/include/VirtualMachineXML.h +++ b/src/scheduler/include/VirtualMachineXML.h @@ -48,6 +48,11 @@ public: { delete vm_template; } + + if (user_template != 0) + { + delete user_template; + } } //-------------------------------------------------------------------------- @@ -106,6 +111,8 @@ public: void get_requirements (int& cpu, int& memory, int& disk); + map get_storage_usage(); + //-------------------------------------------------------------------------- // Matched Resources Interface //-------------------------------------------------------------------------- @@ -189,9 +196,9 @@ public: */ string& get_template(string& xml_str) { - if (vm_template != 0) + if (user_template != 0) { - vm_template->to_xml(xml_str); + user_template->to_xml(xml_str); } else { @@ -210,7 +217,7 @@ public: { attributes.clear(); - vm_template->remove("SCHED_ACTION", attributes); + user_template->remove("SCHED_ACTION", attributes); } /** @@ -220,7 +227,7 @@ public: */ void set_attribute(Attribute* att) { - return vm_template->set(att); + return user_template->set(att); } /** @@ -274,7 +281,8 @@ protected: string ds_requirements; string ds_rank; - VirtualMachineTemplate * vm_template; /**< The VM user template */ + VirtualMachineTemplate * vm_template; /**< The VM template */ + VirtualMachineTemplate * user_template; /**< The VM user template */ }; #endif /* VM_XML_H_ */ diff --git a/src/scheduler/src/pool/VirtualMachinePoolXML.cc b/src/scheduler/src/pool/VirtualMachinePoolXML.cc index 3717f67151..a76aa0cbcf 100644 --- a/src/scheduler/src/pool/VirtualMachinePoolXML.cc +++ b/src/scheduler/src/pool/VirtualMachinePoolXML.cc @@ -42,6 +42,31 @@ int VirtualMachinePoolXML::set_up() } NebulaLog::log("VM",Log::DEBUG,oss); + + // TODO: remove debug log + + oss.str(""); + + oss << "Storage usage:" << endl; + + for (it=objects.begin();it!=objects.end();it++) + { + VirtualMachineXML * vm = static_cast(it->second); + + map ds_usage = vm->get_storage_usage(); + map::iterator ds_it; + + oss << "VM " << vm->get_oid() << ": "; + + for (ds_it = ds_usage.begin(); ds_it != ds_usage.end(); ds_it++) + { + oss << "DS " << ds_it->first << " " << ds_it->second << "MB; "; + } + + oss << endl; + } + + NebulaLog::log("VM",Log::DEBUG,oss); } return rc; diff --git a/src/scheduler/src/pool/VirtualMachineXML.cc b/src/scheduler/src/pool/VirtualMachineXML.cc index 5eb8177845..c6af448c63 100644 --- a/src/scheduler/src/pool/VirtualMachineXML.cc +++ b/src/scheduler/src/pool/VirtualMachineXML.cc @@ -168,7 +168,7 @@ void VirtualMachineXML::init_attributes() resched = 0; } - if (get_nodes("/VM/USER_TEMPLATE", nodes) > 0) + if (get_nodes("/VM/TEMPLATE", nodes) > 0) { vm_template = new VirtualMachineTemplate; @@ -180,6 +180,21 @@ void VirtualMachineXML::init_attributes() { vm_template = 0; } + + nodes.clear(); + + if (get_nodes("/VM/USER_TEMPLATE", nodes) > 0) + { + user_template = new VirtualMachineTemplate; + + user_template->from_xml_node(nodes[0]); + + free_nodes(nodes); + } + else + { + user_template = 0; + } } /* -------------------------------------------------------------------------- */ @@ -245,9 +260,102 @@ void VirtualMachineXML::get_requirements (int& cpu, int& memory, int& disk) /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ +// TODO: use VirtualMachine::isVolatile(disk) +bool isVolatile(const VectorAttribute * disk) +{ + string type = disk->vector_value("TYPE"); + + one_util::toupper(type); + + return ( type == "SWAP" || type == "FS"); +} + +map VirtualMachineXML::get_storage_usage() +{ + map ds_usage; + + vector disks; + vector::iterator it; + + float size; + string st; + int ds_id; + + bool clone; + + // Usage for the system DS will be stored in the index 0, although + // it may not be DS 0 + ds_usage[0] = 0; + + vm_template->remove("DISK", disks); + + for (it=disks.begin(); it != disks.end(); it++) + { + const VectorAttribute * disk = dynamic_cast(*it); + + if (disk == 0) + { + continue; + } + + if (disk->vector_value("SIZE", size) != 0) + { + // TODO: report error? + continue; + } + + if (isVolatile(disk)) + { + ds_usage[0] += size; + } + else + { + if (disk->vector_value("DATASTORE_ID", ds_id) != 0) + { + // TODO: report error? + continue; + } + + if (ds_usage.count(ds_id) == 0) + { + ds_usage[ds_id] = 0; + } + + if (disk->vector_value("CLONE", clone) != 0) + { + continue; + } + + if (clone) + { + st = disk->vector_value("CLONE_TARGET"); + } + else + { + st = disk->vector_value("LN_TARGET"); + } + + // TODO: define constants or enum in Datastore.h ? + if (st == "SELF") + { + ds_usage[ds_id] += size; + } + else if (st == "SYSTEM") + { + ds_usage[0] += size; + } // else st == NONE + } + } + + return ds_usage; +} + +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ + void VirtualMachineXML::log(const string &st) { - if (vm_template == 0 || st.empty()) + if (user_template == 0 || st.empty()) { return; } @@ -255,7 +363,7 @@ void VirtualMachineXML::log(const string &st) oss << one_util::log_time() << " : " << st; - vm_template->replace("SCHED_MESSAGE", oss.str()); + user_template->replace("SCHED_MESSAGE", oss.str()); } /* -------------------------------------------------------------------------- */