mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-16 22:50:10 +03:00
feature #212: Host and HostPool for the new Scheduler
This commit is contained in:
parent
c6be928202
commit
90597a8c07
61
src/scheduler/include/HostPoolXML.h
Normal file
61
src/scheduler/include/HostPoolXML.h
Normal file
@ -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<const HostXML *>(PoolXML::get(oid));
|
||||
};
|
||||
|
||||
protected:
|
||||
|
||||
int get_suitable_nodes(vector<xmlNodePtr>& content)
|
||||
{
|
||||
return get_nodes("/HOST_POOL/HOST[STATE<3]", content);
|
||||
};
|
||||
|
||||
virtual void add_object(xmlNodePtr node)
|
||||
{
|
||||
HostXML* host = new HostXML(node);
|
||||
objects.insert( pair<int,ObjectXML*>(host->get_hid(), host) );
|
||||
};
|
||||
|
||||
virtual int load_info(xmlrpc_c::value &result);
|
||||
};
|
||||
|
||||
#endif /* HOST_POOL_XML_H_ */
|
107
src/scheduler/include/HostXML.h
Normal file
107
src/scheduler/include/HostXML.h
Normal file
@ -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_ */
|
73
src/scheduler/src/pool/HostPoolXML.cc
Normal file
73
src/scheduler/src/pool/HostPoolXML.cc
Normal file
@ -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<int,ObjectXML*>::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;
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
65
src/scheduler/src/pool/HostXML.cc
Normal file
65
src/scheduler/src/pool/HostXML.cc
Normal file
@ -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 <math.h>
|
||||
#include "HostXML.h"
|
||||
|
||||
|
||||
void HostXML::get_capacity(int& cpu, int& memory, int threshold) const
|
||||
{
|
||||
int total_cpu;
|
||||
vector<string> 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());
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
Loading…
x
Reference in New Issue
Block a user