diff --git a/src/scheduler/include/HostPoolXML.h b/src/scheduler/include/HostPoolXML.h new file mode 100644 index 0000000000..dfff8f7b23 --- /dev/null +++ b/src/scheduler/include/HostPoolXML.h @@ -0,0 +1,61 @@ +/* -------------------------------------------------------------------------- */ +/* Copyright 2002-2010, OpenNebula Project Leads (OpenNebula.org) */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); you may */ +/* not use this file except in compliance with the License. You may obtain */ +/* a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ +/* See the License for the specific language governing permissions and */ +/* limitations under the License. */ +/* -------------------------------------------------------------------------- */ + + +#ifndef HOST_POOL_XML_H_ +#define HOST_POOL_XML_H_ + +#include "PoolXML.h" +#include "HostXML.h" + +using namespace std; + +class HostPoolXML : public PoolXML +{ +public: + + HostPoolXML(Client* client):PoolXML(client){}; + + int set_up(); + + /** + * Gets an object from the pool + * @param oid the object unique identifier + * + * @return a pointer to the object, 0 in case of failure + */ + HostXML * get(int oid) const + { + return static_cast(PoolXML::get(oid)); + }; + +protected: + + int get_suitable_nodes(vector& content) + { + return get_nodes("/HOST_POOL/HOST[STATE<3]", content); + }; + + virtual void add_object(xmlNodePtr node) + { + HostXML* host = new HostXML(node); + objects.insert( pair(host->get_hid(), host) ); + }; + + virtual int load_info(xmlrpc_c::value &result); +}; + +#endif /* HOST_POOL_XML_H_ */ diff --git a/src/scheduler/include/HostXML.h b/src/scheduler/include/HostXML.h new file mode 100644 index 0000000000..d1bba8f004 --- /dev/null +++ b/src/scheduler/include/HostXML.h @@ -0,0 +1,107 @@ +/* -------------------------------------------------------------------------- */ +/* Copyright 2002-2010, OpenNebula Project Leads (OpenNebula.org) */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); you may */ +/* not use this file except in compliance with the License. You may obtain */ +/* a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ +/* See the License for the specific language governing permissions and */ +/* limitations under the License. */ +/* -------------------------------------------------------------------------- */ + + +#ifndef HOST_XML_H_ +#define HOST_XML_H_ + +#include "ObjectXML.h" + +using namespace std; + +class HostXML : public ObjectXML +{ +public: + + HostXML(const xmlNodePtr node):ObjectXML(node) + { + init_attributes(); + }; + + int get_hid() const + { + return oid; + }; + + /** + * Gets the current host capacity + * @param cpu the host free cpu, scaled according to a given threshold + * @param memory the host free memory + * @param threshold to consider the host totally free + */ + void get_capacity(int& cpu, int& memory, int threshold) const; + + /** + * Tests whether a new VM can be hosted by the host or not + * @param cpu needed by the VM (percentage) + * @param mem needed by the VM (in Kb) + * @param disk needed by the VM + * @return true if the share can host the VM + */ + bool test_capacity(int cpu, int mem, int disk) const + { + return (((max_cpu - cpu_usage ) >= cpu) && + ((max_mem - mem_usage ) >= mem) && + ((max_disk - disk_usage) >= disk)); + }; + + /** + * Adds a new VM to the given share by incrementing the cpu,mem and disk + * counters + * @param cpu needed by the VM (percentage) + * @param mem needed by the VM (in Kb) + * @param disk needed by the VM + * @return 0 on success + */ + void add_capacity(int cpu, int mem, int disk) + { + cpu_usage += cpu; + mem_usage += mem; + disk_usage += disk; + + running_vms++; + }; + + +protected: + + // TODO Check if any of these are not needed, and delete them. + int oid; + + // Host share values + int disk_usage; /**< Disk allocated to VMs (in Mb). */ + int mem_usage; /**< Memory allocated to VMs (in Mb) */ + int cpu_usage; /**< CPU allocated to VMs (in percentage) */ + + int max_disk; /**< Total disk capacity (in Mb) */ + int max_mem; /**< Total memory capacity (in Mb) */ + int max_cpu; /**< Total cpu capacity (in percentage) */ + + int free_disk; /**< Free disk from the IM monitor */ + int free_mem; /**< Free memory from the IM monitor */ + int free_cpu; /**< Free cpu from the IM monitor */ + + int used_disk; /**< Used disk from the IM monitor */ + int used_mem; /**< Used memory from the IM monitor */ + int used_cpu; /**< Used cpu from the IM monitor */ + + int running_vms; /**< Number of running VMs in this Host */ + + + void init_attributes(); +}; + +#endif /* HOST_XML_H_ */ diff --git a/src/scheduler/src/pool/HostPoolXML.cc b/src/scheduler/src/pool/HostPoolXML.cc new file mode 100644 index 0000000000..0b3ec6015c --- /dev/null +++ b/src/scheduler/src/pool/HostPoolXML.cc @@ -0,0 +1,73 @@ +/* -------------------------------------------------------------------------- */ +/* Copyright 2002-2010, OpenNebula Project Leads (OpenNebula.org) */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); you may */ +/* not use this file except in compliance with the License. You may obtain */ +/* a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ +/* See the License for the specific language governing permissions and */ +/* limitations under the License. */ +/* -------------------------------------------------------------------------- */ + +#include "HostPoolXML.h" + + +int HostPoolXML::set_up() +{ + ostringstream oss; + int rc; + + rc = PoolXML::set_up(); + + if ( rc == 0 ) + { + oss.str(""); + oss << "Discovered Hosts (enabled):"; + + map::iterator it; + + for (it=objects.begin();it!=objects.end();it++) + { + oss << " " << it->second; + } + + NebulaLog::log("HOST",Log::DEBUG,oss); + } + + return rc; +} + +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ + +int HostPoolXML::load_info(xmlrpc_c::value &result) +{ + try + { + client->call( client->get_endpoint(), // serverUrl + "one.hostpool.info", // methodName + "s", // arguments format + &result, // resultP + client->get_oneauth().c_str() // argument + ); + return 0; + } + catch (exception const& e) + { + ostringstream oss; + oss << "Exception raised: " << e.what(); + + NebulaLog::log("HOST", Log::ERROR, oss); + + return -1; + } +} + +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ + diff --git a/src/scheduler/src/pool/HostXML.cc b/src/scheduler/src/pool/HostXML.cc new file mode 100644 index 0000000000..bde76da7a7 --- /dev/null +++ b/src/scheduler/src/pool/HostXML.cc @@ -0,0 +1,65 @@ +/* -------------------------------------------------------------------------- */ +/* Copyright 2002-2010, OpenNebula Project Leads (OpenNebula.org) */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); you may */ +/* not use this file except in compliance with the License. You may obtain */ +/* a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ +/* See the License for the specific language governing permissions and */ +/* limitations under the License. */ +/* -------------------------------------------------------------------------- */ + +#include +#include "HostXML.h" + + +void HostXML::get_capacity(int& cpu, int& memory, int threshold) const +{ + int total_cpu; + vector result; + + memory = free_mem; + cpu = free_cpu; + total_cpu = max_cpu; + + /* eg. 96.7 >= 0.9 * 100, We need to round */ + if ( cpu >= threshold * total_cpu ) + { + cpu = (int) ceil((float)cpu/100.0) * 100; + } +} + +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ + +void HostXML::init_attributes() +{ + oid = atoi(((*this)["/HOST/ID"] )[0].c_str() ); + + disk_usage = atoi(((*this)["/HOST/HOST_SHARE/DISK_USAGE"])[0].c_str()); + mem_usage = atoi(((*this)["/HOST/HOST_SHARE/MEM_USAGE"])[0].c_str()); + cpu_usage = atoi(((*this)["/HOST/HOST_SHARE/CPU_USAGE"])[0].c_str()); + + max_disk = atoi(((*this)["/HOST/HOST_SHARE/MAX_DISK"])[0].c_str()); + max_mem = atoi(((*this)["/HOST/HOST_SHARE/MAX_MEM"])[0].c_str()); + max_cpu = atoi(((*this)["/HOST/HOST_SHARE/MAX_CPU"])[0].c_str()); + + free_disk = atoi(((*this)["/HOST/HOST_SHARE/FREE_DISK"])[0].c_str()); + free_mem = atoi(((*this)["/HOST/HOST_SHARE/FREE_MEM"])[0].c_str()); + free_cpu = atoi(((*this)["/HOST/HOST_SHARE/FREE_CPU"])[0].c_str()); + + used_disk = atoi(((*this)["/HOST/HOST_SHARE/USED_DISK"])[0].c_str()); + used_mem = atoi(((*this)["/HOST/HOST_SHARE/USED_MEM"])[0].c_str()); + used_cpu = atoi(((*this)["/HOST/HOST_SHARE/USED_CPU"])[0].c_str()); + + running_vms = atoi(((*this)["/HOST/HOST_SHARE/RUNNING_VMS"])[0].c_str()); +} + +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ +