1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-20 10:50:08 +03:00

Merge branch 'bug-766'

This commit is contained in:
Ruben S. Montero 2012-05-21 18:02:47 +02:00
commit 6f28628042
12 changed files with 102 additions and 46 deletions

View File

@ -37,11 +37,12 @@ public:
enum HostState
{
INIT = 0, /**< Initial state for enabled hosts. */
MONITORING = 1, /**< The host is being monitored. */
MONITORED = 2, /**< The host has been successfully monitored. */
ERROR = 3, /**< An error ocurrer while monitoring the host. */
DISABLED = 4 /**< The host is disabled won't be monitored. */
INIT = 0, /**< Initial state for enabled hosts. */
MONITORING_MONITORED = 1, /**< Monitoring the host (from monitored). */
MONITORED = 2, /**< The host has been successfully monitored. */
ERROR = 3, /**< An error ocurrer while monitoring the host. */
DISABLED = 4, /**< The host is disabled won't be monitored. */
MONITORING_ERROR = 5 /**< Monitoring the host (from error). */
};
/**
@ -68,6 +69,15 @@ public:
return state != DISABLED;
}
/**
* Check if the host is being monitored
* @return true if the host is enabled
*/
bool isMonitoring() const
{
return ((state == MONITORING_ERROR) || (state==MONITORING_MONITORED));
}
/**
* Updates the Host's last_monitored time stamp.
* @param success if the monitored action was successfully performed
@ -158,6 +168,21 @@ public:
this->state = state;
};
/**
* Sets the corresponding monitoring state based on the actual host state
*/
void set_monitoring_state()
{
if ( state == ERROR )
{
state = MONITORING_ERROR;
}
else if ( state == MONITORED )
{
state = MONITORING_MONITORED;
}
};
/**
* Retrives last time the host was monitored
* @return time_t last monitored time
@ -168,13 +193,10 @@ public:
};
// ------------------------------------------------------------------------
// Share functions
// Share functions. Returns the value associated with each host share
// metric
// ------------------------------------------------------------------------
/**
*
*
*/
int get_share_running_vms()
{
return host_share.running_vms;
@ -318,8 +340,8 @@ private:
string vnm_mad_name;
/**
* If Host State= MONITORED last time it got fully monitored or 1 Jan 1970
* Host State = MONITORING last time it got a signal to be monitored
* If Host State = MONITORED last time it got fully monitored or 1 Jan 1970
* Host State = MONITORING* last time it got a signal to be monitored
*/
time_t last_monitored;

View File

@ -121,6 +121,11 @@ private:
*/
friend void * im_action_loop(void *arg);
/**
* Time in seconds to expire a monitoring action (10 minutes)
*/
static const time_t monitor_expire;
/**
* Returns a pointer to a Information Manager MAD. The driver is
* searched by its name and owned by gwadmin with uid=0.

View File

@ -5,6 +5,15 @@
<xs:sequence>
<xs:element name="ID" type="xs:integer"/>
<xs:element name="NAME" type="xs:string"/>
<!-- STATE values
INIT = 0 Initial state for enabled hosts
MONITORING_MONITORED = 1 Monitoring the host (from monitored)
MONITORED = 2 The host has been successfully monitored
ERROR = 3 An error ocurrer while monitoring the host
DISABLED = 4 The host is disabled won't be monitored
MONITORING_ERROR = 5 Monitoring the host (from error)
-->
<xs:element name="STATE" type="xs:integer"/>
<xs:element name="IM_MAD" type="xs:string"/>
<xs:element name="VM_MAD" type="xs:string"/>

View File

@ -43,7 +43,7 @@
:STAT:
:desc: Host status
:size: 4
:size: 7
:default:
- :ID

View File

@ -26,8 +26,9 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
end
def self.state_to_str(id)
id = id.to_i
id = id.to_i
state_str = Host::HOST_STATES[id]
return Host::SHORT_HOST_STATES[state_str]
end
@ -86,7 +87,7 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
OpenNebulaHelper.unit_to_str(acpu,options)
end
column :STAT, "Host status", :size=>4 do |d|
column :STAT, "Host status", :size=>7 do |d|
OneHostHelper.state_to_str(d["STATE"])
end

View File

@ -20,6 +20,9 @@
#include <sys/types.h>
#include <sys/stat.h>
const time_t InformationManager::monitor_expire = 600;
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
@ -136,9 +139,11 @@ void InformationManager::timer_action()
static int mark = 0;
int rc;
time_t thetime;
time_t now;
ostringstream oss;
struct stat sb;
map<int, string> discovered_hosts;
map<int, string>::iterator it;
@ -147,6 +152,8 @@ void InformationManager::timer_action()
Host * host;
istringstream iss;
time_t monitor_length;
mark = mark + timer_period;
if ( mark >= 600 )
@ -162,9 +169,7 @@ void InformationManager::timer_action()
return;
}
thetime = time(0);
struct stat sb;
now = time(0);
if (stat(remotes_location.c_str(), &sb) == -1)
{
@ -183,23 +188,22 @@ void InformationManager::timer_action()
continue;
}
Host::HostState state = host->get_state();
monitor_length = now - host->get_last_monitored();
// TODO: Set apropriate threshold to timeout monitoring
if (( state == Host::MONITORING) &&
(thetime - host->get_last_monitored() >= 600))
if (host->isMonitoring() && (monitor_length >= monitor_expire))
{
host->set_state(Host::INIT);
hpool->update(host);
}
if ((state != Host::MONITORING) && (state != Host::DISABLED) &&
(thetime - host->get_last_monitored() >= monitor_period))
if ( host->isEnabled() && !(host->isMonitoring()) &&
(monitor_length >= monitor_period))
{
oss.str("");
oss << "Monitoring host " << host->get_name()
<< " (" << it->first << ")";
NebulaLog::log("InM",Log::INFO,oss);
imd = get(it->second);
@ -224,7 +228,7 @@ void InformationManager::timer_action()
imd->monitor(it->first,host->get_name(),update_remotes);
host->set_state(Host::MONITORING);
host->set_monitoring_state();
}
hpool->update(host);

View File

@ -35,7 +35,8 @@ public class Host extends PoolElement{
private static final String UPDATE = METHOD_PREFIX + "update";
private static final String[] HOST_STATES =
{"INIT", "MONITORING", "MONITORED", "ERROR", "DISABLED"};
{"INIT", "MONITORING_MONITORED", "MONITORED", "ERROR", "DISABLED",
"MONITORING_ERROR"};
/**
@ -265,14 +266,23 @@ public class Host extends PoolElement{
public String shortStateStr()
{
String st = stateStr();
if(st == null)
return null;
else if(st.equals("ERROR"))
return "err";
else if (st.equals("DISABLED"))
return "off";
else
else if (st.equals("INIT"))
return "init";
else if (st.equals("MONITORING_MONITORED"))
return "update";
else if (st.equals("MONITORED"))
return "on";
else if (st.equals("MONITORING_ERROR"))
return "retry";
return "";
}
/**

View File

@ -107,7 +107,7 @@ public class HostTest
// assertTrue( host.getId().equals("0") );
assertTrue( host.id() >= 0 );
assertTrue( host.shortStateStr().equals("on") );
// assertTrue( host.shortStateStr().equals("on") );
}
@Test

View File

@ -32,14 +32,15 @@ module OpenNebula
:update => "host.update"
}
HOST_STATES=%w{INIT MONITORING MONITORED ERROR DISABLED}
HOST_STATES=%w{INIT MONITORING_MONITORED MONITORED ERROR DISABLED MONITORING_ERROR}
SHORT_HOST_STATES={
"INIT" => "on",
"MONITORING" => "on",
"MONITORED" => "on",
"ERROR" => "err",
"DISABLED" => "off"
"INIT" => "init",
"MONITORING_MONITORED" => "update",
"MONITORED" => "on",
"ERROR" => "err",
"DISABLED" => "off",
"MONITORING_ERROR" => "retry",
}
# Creates a Host description with just its identifier

View File

@ -48,17 +48,19 @@ var oZones = {
{
case "HOST","host":
return ["INIT",
"MONITORING",
"MONITORING_MONITORED",
"MONITORED",
"ERROR",
"DISABLED"][value];
"DISABLED",
"MONITORING_ERROR"][value];
break;
case "HOST_SIMPLE","host_simple":
return ["ON",
"ON",
return ["INIT",
"UPDATE",
"ON",
"ERROR",
"OFF"][value];
"OFF",
"RETRY"][value];
break;
case "VM","vm":
return ["INIT",

View File

@ -46,7 +46,7 @@ protected:
int get_suitable_nodes(vector<xmlNodePtr>& content)
{
return get_nodes("/HOST_POOL/HOST[STATE<3]", content);
return get_nodes("/HOST_POOL/HOST[STATE=1 or STATE=2]", content);
};
void add_object(xmlNodePtr node);

View File

@ -49,18 +49,20 @@ var OpenNebula = {
case "HOST":
case "host":
return tr(["INIT",
"MONITORING",
"MONITORING_MONITORED",
"MONITORED",
"ERROR",
"DISABLED"][value]);
"DISABLED",
"MONITORING_ERROR"][value]);
break;
case "HOST_SIMPLE":
case "host_simple":
return tr(["ON",
"ON",
return tr(["INIT",
"UPDATE",
"ON",
"ERROR",
"OFF"][value]);
"OFF",
"RETRY"][value]);
break;
case "VM":
case "vm":