1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-23 22:50:09 +03:00

Initial commit of ONE code

git-svn-id: http://svn.opennebula.org/trunk@2 3034c82b-c49b-4eb3-8279-a7acafdc01c0
This commit is contained in:
Javier Fontán Muiños 2008-06-17 16:27:32 +00:00
parent ee0b0729ba
commit 6eb9fed97d
159 changed files with 36595 additions and 0 deletions

96
SConstruct Normal file
View File

@ -0,0 +1,96 @@
import os
import sys
sys.path.append("./share/scons")
from lex_bison import *
# This is the absolute path where the project is located
cwd=os.getcwd()
# Environment that will be applied to each scons child
main_env=Environment()
main_env['ENV']['PATH']=os.environ['PATH']
# Add builders for flex and bison
add_lex(main_env)
add_bison(main_env)
# Include dirs
main_env.Append(CPPPATH=[
cwd+'/include',
])
# Library dirs
main_env.Append(LIBPATH=[
cwd+'/src/common',
cwd+'/src/host',
cwd+'/src/mad',
cwd+'/src/nebula',
cwd+'/src/pool',
cwd+'/src/template',
cwd+'/src/vm',
cwd+'/src/vmm',
cwd+'/src/lcm',
cwd+'/src/tm',
cwd+'/src/dm',
cwd+'/src/im',
cwd+'/src/rm',
])
# Compile flags
main_env.Append(CPPFLAGS=[
"-g",
"-Wall"
])
# Linking flags
main_env.Append(LDFLAGS=["-g"])
#######################
# EXTRA CONFIGURATION #
#######################
# SQLITE
sqlite_dir=ARGUMENTS.get('sqlite', 'none')
if sqlite_dir!='none':
main_env.Append(LIBPATH=[sqlite_dir+"/lib"])
main_env.Append(CPPPATH=[sqlite_dir+"/include"])
# xmlrpc
xmlrpc_dir=ARGUMENTS.get('xmlrpc', 'none')
if xmlrpc_dir!='none':
main_env.Append(LIBPATH=[xmlrpc_dir+"/lib"])
main_env.Append(CPPPATH=[xmlrpc_dir+"/include"])
# build lex/bison
build_parsers=ARGUMENTS.get('parsers', 'no')
if build_parsers=='yes':
main_env.Append(parsers='yes')
else:
main_env.Append(parsers='no')
# SCONS scripts to build
build_scripts=[
'src/common/SConstruct',
'src/template/SConstruct',
'src/host/SConstruct',
'src/mad/SConstruct',
'src/nebula/SConstruct',
'src/pool/SConstruct',
'src/vm/SConstruct',
'src/vmm/SConstruct',
'src/lcm/SConstruct',
'src/rm/SConstruct',
'src/tm/SConstruct',
'src/im/SConstruct',
'src/dm/SConstruct',
'src/scheduler/SConstruct',
]
for script in build_scripts:
env=main_env.Clone()
SConscript(script, exports='env')

155
include/ActionManager.h Normal file
View File

@ -0,0 +1,155 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 ACTION_MANAGER_H_
#define ACTION_MANAGER_H_
#include <queue>
#include <pthread.h>
#include <ctime>
#include <string>
using namespace std;
/**
* ActionListener class. Interface to be implemented by any class
* that need to handle actions. There are two predefined actions
* (each action is identified with its name, a string):
* - ACTION_TIMER, periodic action
* - ACTION_FINALIZE, to finalize the action loop
*/
class ActionListener
{
public:
/**
* Predefined string to refer to the periodic action
*/
static const string ACTION_TIMER;
/**
* Predefined string to refer to the finalize action
*/
static const string ACTION_FINALIZE;
ActionListener(){};
virtual ~ActionListener(){};
/**
* the do_action() function is executed upon action arrival.
* This function should check the action type, and perform the
* corresponding action.
* @param name the action name
* @param args action arguments
*/
virtual void do_action(const string &name, void *args) = 0;
};
/**
* ActionManager. Provides action support for a class implementing
* the ActionListener interface.
*/
class ActionManager
{
public:
ActionManager();
virtual ~ActionManager();
/** Function to trigger an action to this manager.
* @param action the action name
* @param args arguments for the action
*/
void trigger(
const string &action,
void * args);
/** The calling thread will be suspended until an action is triggeed.
* @param timeout for the periodic action. Use 0 to disable the timer.
* @param timer_args arguments for the timer action
*/
void loop(
time_t timeout,
void * timer_args);
/** Register the calling object in this action manager.
* @param listener a pointer to the action listner
*/
void addListener(
ActionListener * listener)
{
this->listener = listener;
};
private:
/**
* Implementation class, pending actions are stored in a queue.
* Each element stores the action name and its arguments
*/
struct ActionRequest
{
string name;
void * args;
ActionRequest(
const string &aname = "",
void * aargs = 0):
name(aname),
args(aargs){};
};
/**
* Queue of pending actions, processed in a FIFO manner
*/
queue<ActionRequest> actions;
/**
* Action synchronization is implemented using the pthread library,
* with condition variable and its associated mutex
*/
pthread_mutex_t mutex;
pthread_cond_t cond;
/**
* The listener notified by this manager
*/
ActionListener * listener;
/**
* Function to lock the Manager mutex
*/
void lock()
{
pthread_mutex_lock(&mutex);
};
/**
* Function to unlock the Manager mutex
*/
void unlock()
{
pthread_mutex_unlock(&mutex);
};
};
#endif /*ACTION_MANAGER_H_*/

218
include/Attribute.h Normal file
View File

@ -0,0 +1,218 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 ATTRIBUTE_H_
#define ATTRIBUTE_H_
#include <string>
#include <map>
#include <sstream>
using namespace std;
/**
* Attribute base class for name-value pairs. This class provides a generic
* interface to implement
*/
class Attribute
{
public:
Attribute(string& aname):attribute_name(aname)
{
transform (
attribute_name.begin(),
attribute_name.end(),
attribute_name.begin(),
(int(*)(int))toupper);
};
Attribute(const char * aname)
{
ostringstream name;
name << uppercase << aname;
attribute_name = name.str();
};
virtual ~Attribute(){};
enum AttributeType
{
SIMPLE = 0,
VECTOR = 1
};
/**
* Gets the name of the attribute.
* @return the attribute name
*/
const string& name() const
{
return attribute_name;
};
/**
* Marshall the attribute in a single string. The string MUST be freed
* by the calling function.
* @return a string (allocated in the heap) holding the attribute value.
*/
virtual string * marshall() = 0;
/**
* Builds a new attribute from a string.
*/
virtual void unmarshall(string& sattr) = 0;
/**
* Returns the attribute type
*/
virtual AttributeType type() = 0;
private:
/**
* The attribute name.
*/
string attribute_name;
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
* The SingleAttribute class represents a simple attribute in the form
* NAME = VALUE.
*/
class SingleAttribute : public Attribute
{
public:
SingleAttribute(string& name):Attribute(name){};
SingleAttribute(string& name, string& value):
Attribute(name),attribute_value(value){};
SingleAttribute(const char * name, string& value):
Attribute(name),attribute_value(value){};
~SingleAttribute(){};
/**
* Returns the attribute value, a string.
*/
const string& value() const
{
return attribute_value;
};
/**
* Marshall the attribute in a single string. The string MUST be freed
* by the calling function.
* @return a string (allocated in the heap) holding the attribute value.
*/
string * marshall()
{
string * rs = new string;
*rs = attribute_value;
return rs;
};
/**
* Builds a new attribute from a string.
*/
void unmarshall(string& sattr)
{
attribute_value = sattr;
};
/**
* Returns the attribute type
*/
AttributeType type()
{
return SIMPLE;
};
private:
string attribute_value;
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
* The VectorAttribute class represents an array attribute in the form
* NAME = [ VAL_NAME_1=VAL_VALUE_1,...,VAL_NAME_N=VAL_VALUE_N].
*/
class VectorAttribute : public Attribute
{
public:
VectorAttribute(string& name):Attribute(name){};
VectorAttribute(string& name, map<string,string>& value):
Attribute(name),attribute_value(value){};
~VectorAttribute(){};
/**
* Returns the attribute value, a string.
*/
const map<string,string>& value() const
{
return attribute_value;
};
/**
*
*/
string vector_value(const char *name) const;
/**
* Marshall the attribute in a single string. The string MUST be freed
* by the calling function. The string is in the form:
* "VAL_NAME_1=VAL_VALUE_1,...,VAL_NAME_N=VAL_VALUE_N".
* @return a string (allocated in the heap) holding the attribute value.
*/
string * marshall();
/**
* Builds a new attribute from a string of the form:
* "VAL_NAME_1=VAL_VALUE_1,...,VAL_NAME_N=VAL_VALUE_N".
*/
void unmarshall(string& sattr);
/**
* Returns the attribute type
*/
AttributeType type()
{
return VECTOR;
};
private:
map<string,string> attribute_value;
};
#endif /*ATTRIBUTE_H_*/

260
include/DispatchManager.h Normal file
View File

@ -0,0 +1,260 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 DISPATCH_MANAGER_H_
#define DISPATCH_MANAGER_H_
#include "ActionManager.h"
#include "HostPool.h"
#include "VirtualMachinePool.h"
using namespace std;
extern "C" void * dm_action_loop(void *arg);
class DispatchManager : public ActionListener
{
public:
DispatchManager(
VirtualMachinePool * _vmpool,
HostPool * _hpool):
hpool(_hpool),
vmpool(_vmpool)
{
am.addListener(this);
};
~DispatchManager()
{}
;
enum Actions
{
SUSPEND_SUCCESS, /**< Send by LCM when a VM is suspended*/
SUSPEND_FAILURE, /**< Send by LCM when a VM could not be suspended*/
STOP_SUCCESS, /**< Send by LCM when a VM is stopped*/
STOP_FAILURE, /**< Send by LCM when a VM could not be stopped*/
MIGRATE_FAILURE, /**< Send by LCM when a VM could not be migrated*/
DONE, /**< Send by LCM when a VM is shut down*/
FAILED, /**< Send by LCM when one of the execution steps fails*/
FINALIZE
};
/**
* Triggers specific actions to the Dispatch Manager. This function
* wraps the ActionManager trigger function.
* @param action the DM action
* @param vid VM unique id. This is the argument of the passed to the
* invoked action.
*/
void trigger(
Actions action,
int _vid);
/**
* This functions creates a new thread for the Dispatch Manager. This
* thread will wait in an action loop till it receives ACTION_FINALIZE.
* @return 0 on success.
*/
int start();
/**
* Gets the thread identification.
* @return pthread_t for the manager thread (that in the action loop).
*/
pthread_t get_thread_id() const
{
return dm_thread;
};
//--------------------------------------------------------------------------
// DM Actions, the RM and the Scheduler will invoke this methods
//--------------------------------------------------------------------------
/**
* Allocates a new virtual machine
* @return 0 on success
*/
int allocate (
int uid,
const string& stemplate,
int * oid);
/**
* Deploys a VM. A new history record MUST be added before calling this
* function. Also the VM MUST have its mutex locked. If the function fails
* the calling funtion is responsible for recovering from the error.
* @param vm pointer to a VirtualMachine with its mutex locked.
* @return 0 on success
*/
int deploy (
VirtualMachine * vm);
/**
* Migrates a VM. The following actions must be performed before calling
* this function:
* - Lock the VM mutex.
* - Update the History statistics of the current host.
* - Add a new History record with the new host.
* If the function fails the calling funtion is responsible for recovering
* from the error.
* @param vm pointer to a VirtualMachine with its mutex locked.
* @return 0 on success
*/
int migrate(
VirtualMachine * vm);
/**
* Migrates a VM. The following actions must be performed before calling
* this function:
* - Lock the VM mutex.
* - Update the History statistics of the current host.
* - Add a new History record with the new host.
* If the function fails the calling funtion is responsible for recovering
* from the error.
* @param vm pointer to a VirtualMachine with its mutex locked.
* @return 0 on success
*/
int live_migrate(
VirtualMachine * vm);
/**
* Shuts down a VM.
* @param vid VirtualMachine identification
* @return 0 on success, -1 if the VM does not exits or -2 if the VM is
* in a wrong a state
*/
int shutdown (
int vid);
/**
* Holds a VM.
* @param vid VirtualMachine identification
* @return 0 on success, -1 if the VM does not exits or -2 if the VM is
* in a wrong a state
*/
int hold(
int vid);
/**
* Releases a VM.
* @param vid VirtualMachine identification
* @return 0 on success, -1 if the VM does not exits or -2 if the VM is
* in a wrong a state
*/
int release(
int vid);
/**
* Stops a VM.
* @param vid VirtualMachine identification
* @return 0 on success, -1 if the VM does not exits or -2 if the VM is
* in a wrong a state
*/
int stop(
int vid);
/**
* Suspends a VM.
* @param vid VirtualMachine identification
* @return 0 on success, -1 if the VM does not exits or -2 if the VM is
* in a wrong a state
*/
int suspend(
int vid);
/**
* Resumes a VM.
* @param vid VirtualMachine identification
* @return 0 on success, -1 if the VM does not exits or -2 if the VM is
* in a wrong a state
*/
int resume(
int vid);
/**
* Ends a VM life cycle inside ONE.
* @param vid VirtualMachine identification
* @return 0 on success, -1 if the VM does not exits or -2 if the VM is
* in a wrong a state
*/
int finalize(
int vid);
private:
/**
* Thread id for the Dispatch Manager
*/
pthread_t dm_thread;
/**
* Pointer to the Host Pool, to access hosts
*/
HostPool * hpool;
/**
* Pointer to the Host Pool, to access hosts
*/
VirtualMachinePool * vmpool;
/**
* Action engine for the Manager
*/
ActionManager am;
/**
* Function to execute the Manager action loop method within a new pthread
* (requires C linkage)
*/
friend void * dm_action_loop(void *arg);
/**
* The action function executed when an action is triggered.
* @param action the name of the action
* @param arg arguments for the action function
*/
void do_action(
const string & action,
void * arg);
//--------------------------------------------------------------------------
// DM Actions associated with a VM state transition
//--------------------------------------------------------------------------
void suspend_success_action(int vid);
void suspend_failure_action(int vid);
void stop_success_action(int vid);
void stop_failure_action(int vid);
void migrate_failure_action(int vid);
void done_action(int vid);
void failed_action(int vid);
void host_add_vm(VirtualMachine *vm);
void host_del_vm(VirtualMachine *vm);
};
#endif /*DISPATCH_MANAGER_H*/

234
include/History.h Normal file
View File

@ -0,0 +1,234 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 HISTORY_H_
#define HISTORY_H_
#include <sqlite3.h>
#include "ObjectSQL.h"
using namespace std;
extern "C" int history_select_cb (
void * _history,
int num,
char ** values,
char ** names);
/**
* The History class, it represents an execution record of a Virtual Machine.
*/
class History:public ObjectSQL
{
public:
History(int oid);
History(
int oid,
int seq,
int hid,
string& hostname,
string& vm_dir,
string& vmm,
string& tm);
~History(){};
enum MigrationReason
{
NONE,
ERROR,
STOP_RESUME,
PERFORMANCE,
USER,
RESCHEDULING,
KILL
};
private:
friend class VirtualMachine;
// ----------------------------------------
// DataBase implementation variables
// ----------------------------------------
enum ColNames
{
OID = 0,
SEQ = 1,
HOSTNAME = 2,
VM_DIR = 3,
HID = 4,
VMMMAD = 5,
TMMAD = 6,
STIME = 7,
ETIME = 8,
PROLOG_STIME = 9,
PROLOG_ETIME = 10,
RUNNING_STIME = 11,
RUNNING_ETIME = 12,
EPILOG_STIME = 13,
EPILOG_ETIME = 14,
REASON = 15,
LIMIT = 16
};
static const char * table;
static const char * db_names;
static const char * db_bootstrap;
void non_persistent_data();
static string column_name(const ColNames column)
{
switch (column)
{
case HID:
return "hid";
case ETIME:
return "etime";
case RUNNING_ETIME:
return "retime";
default:
return "";
}
}
// ----------------------------------------
// History fields
// ----------------------------------------
int oid;
int seq;
string hostname;
string vm_rdir;
int hid;
string vmm_mad_name;
string tm_mad_name;
time_t stime;
time_t etime;
time_t prolog_stime;
time_t prolog_etime;
time_t running_stime;
time_t running_etime;
time_t epilog_stime;
time_t epilog_etime;
MigrationReason reason;
//Non-persistent history fields
string vm_lhome;
string vm_rhome;
string deployment_lfile;
string deployment_rfile;
string checkpoint_file;
friend int history_select_cb (
void * _history,
int num,
char ** values,
char ** names);
/**
* Writes the history record in the DB
* @param db pointer to the database.
* @return 0 on success.
*/
int insert(SqliteDB * db);
/**
* Reads the history record from the DB
* @param db pointer to the database.
* @return 0 on success.
*/
int select(SqliteDB * db);
/**
* Removes the all history records from the DB
* @param db pointer to the database.
* @return 0 on success.
*/
int drop(SqliteDB * db);
/**
* Updates the history record
* @param db pointer to the database.
* @return 0 on success.
*/
int update(SqliteDB * db)
{
return insert(db);
}
/**
* Gets the value of a column in the pool for a given object
* @param db pointer to Database
* @param column to be selected
* @param where contidtion to select the column
* @param value of the column
* @return 0 on success
*/
int select_column(
SqliteDB * db,
const string& column,
const string& where,
string * value)
{
return ObjectSQL::select_column(db,table,column,where,value);
}
/**
* Sets the value of a column in the pool for a given object
* @param db pointer to Database
* @param column to be selected
* @param where contidtion to select the column
* @param value of the column
* @return 0 on success
*/
int update_column(
SqliteDB * db,
const string& column,
const string& where,
const string& value)
{
return ObjectSQL::update_column(db,table,column,where,value);
}
/**
* Function to unmarshall a history object
* @param num the number of columns read from the DB
* @para names the column names
* @para vaues the column values
* @return 0 on success
*/
int unmarshall(int num, char **names, char ** values);
};
#endif /*HISTORY_H_*/

474
include/Host.h Normal file
View File

@ -0,0 +1,474 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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_H_
#define HOST_H_
#include "PoolSQL.h"
#include "HostShare.h"
#include "HostTemplate.h"
using namespace std;
extern "C" int host_select_cb (void * _host, int num,char ** values, char ** names);
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
* The Host class. It represents a Host...
*/
class Host : public PoolObjectSQL
{
public:
// ------------------------------------------------------------------------
// Host States
// ------------------------------------------------------------------------
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. */
};
/**
* Function to write a Host on an output stream
*/
friend ostream& operator<<(ostream& os, Host& h);
/**
* Get the Host unique identifier HID, that matches the OID of the object
* @return HID Host identifier
*/
int get_hid() const
{
return oid;
};
/**
* Check if the host is managed
* @return true if the host is managed
*/
bool isManaged() const
{
return managed;
}
/**
* Check if the host is enabled
* @return true if the host is enabled
*/
bool isEnabled() const
{
return state != DISABLED;
}
/**
* Updates the Host's last_monitored time stamp.
* @param success if the monitored action was successfully performed
*/
void touch(bool success)
{
last_monitored = time(0);
if ( state != DISABLED) //Don't change the state is host is disabled
{
if (success == true)
{
state = MONITORED;
}
else
{
state = ERROR;
}
}
};
/**
* Disables the current host, it will not be monitored nor used by the
* scheduler
*/
void disable()
{
state = DISABLED;
};
/**
* Enables the current host, it will be monitored and could be used by
* the scheduler
*/
void enable()
{
state = INIT;
};
/**
* Returns host host_name
* @return host_name Host's hostname
*/
const string& get_hostname() const
{
return hostname;
};
/** Update host counters and update the whole host on the DB
* @param parse_str string with values to be parsed
* @return 0 on success
**/
int update_info(string &parse_str);
/**
*
*/
HostState get_state() const
{
return state;
};
/**
*
*/
const string& get_vmm_mad() const
{
return vmm_mad_name;
};
/**
*
*/
const string& get_tm_mad() const
{
return tm_mad_name;
};
/**
*
*/
const string& get_im_mad() const
{
return im_mad_name;
};
/**
*
*/
void set_state(HostState state)
{
this->state = state;
};
/**
*
*/
time_t get_last_monitored() const
{
return last_monitored;
};
// ------------------------------------------------------------------------
// Template
// ------------------------------------------------------------------------
/**
* Gets the values of a template attribute
* @param name of the attribute
* @param values of the attribute
* @return the number of values
*/
int get_template_attribute(
string& name,
vector<const Attribute*>& values) const
{
return host_template.get(name,values);
};
/**
* Gets the values of a template attribute
* @param name of the attribute
* @param values of the attribute
* @return the number of values
*/
int get_template_attribute(
const char *name,
vector<const Attribute*>& values) const
{
string str=name;
return host_template.get(str,values);
};
/**
* Gets a string based host attribute
* @param name of the attribute
* @param value of the attribute (a string), will be "" if not defined
*/
void get_template_attribute(
const char * name,
string& value) const
{
string str=name;
host_template.get(str,value);
}
/**
* Gets a string based host attribute
* @param name of the attribute
* @param value of the attribute (an int), will be 0 if not defined
*/
void get_template_attribute(
const char * name,
int& value) const
{
string str=name;
host_template.get(str,value);
}
// ---------------------------------------------------------
// Lex & bison parser for requirements and rank expressions
// ---------------------------------------------------------
/**
* Evaluates a requirement expression on the given host.
* @param requirements string
* @param result true if the host matches the requirements
* @param errmsg string describing the error, must be freed by the
* calling function
* @return 0 on success
*/
int match(const string& requirements, bool& result, char **errmsg);
/**
* Evaluates a rank expression on the given host.
* @param rank string
* @param result of the rank evaluation
* @param errmsg string describing the error, must be freed by the
* calling function
* @return 0 on success
*/
int rank(const string& rank, int& result, char **errmsg);
// ------------------------------------------------------------------------
// Share functions
// ------------------------------------------------------------------------
/**
* Adds a new VM to the given share by icrementing 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_vm(int cpu, int mem, int disk)
{
host_share.add(cpu,mem,disk);
};
/**
* Deletes a new VM from the given share by decrementing the cpu,mem and
* disk counters
* @param cpu useded by the VM (percentage)
* @param mem used by the VM (in Kb)
* @param disk used by the VM
* @return 0 on success
*/
void del_vm(int cpu, int mem, int disk)
{
host_share.del(cpu,mem,disk);
};
/**
* 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_vm(int cpu, int mem, int disk)
{
return host_share.test(cpu,mem,disk);
}
private:
// -------------------------------------------------------------------------
// Friends
// -------------------------------------------------------------------------
friend class HostPool;
friend int host_select_cb (
void * _host,
int num,
char ** values,
char ** names);
// -------------------------------------------------------------------------
// Host Description
// -------------------------------------------------------------------------
string hostname;
/**
* The state of the Host
*/
HostState state;
/**
* Name of the IM driver used to monitor this host
*/
string im_mad_name;
/**
* Name of the VM driver used to execute VMs in this host
*/
string vmm_mad_name;
/**
* Name of the TM driver used to transfer file to and from this host
*/
string tm_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
*/
time_t last_monitored;
/**
* This tells if this host pertains to a local managed cluster
*/
bool managed;
// -------------------------------------------------------------------------
// Host Attributes
// -------------------------------------------------------------------------
/**
* The Host template, holds the Host attributes.
*/
HostTemplate host_template;
/**
* This map holds pointers to all the Host's HostShares
*/
HostShare host_share;
// -------------------------------------------------------------------------
// Lex & bison
// -------------------------------------------------------------------------
/**
* Mutex to perform just one flex-bison parsing at a time
*/
static pthread_mutex_t lex_mutex;
// *************************************************************************
// DataBase implementation (Private)
// *************************************************************************
/**
* Function to unmarshall a Host object
* @param num the number of columns read from the DB
* @para names the column names
* @para vaues the column values
* @return 0 on success
*/
int unmarshall(int num, char **names, char ** values);
/**
* Bootstraps the database table(s) associated to the Host
*/
static void bootstrap(SqliteDB * db)
{
db->exec(Host::db_bootstrap);
db->exec(HostTemplate::db_bootstrap);
db->exec(HostShare::db_bootstrap);
};
protected:
// *************************************************************************
// Constructor
// *************************************************************************
Host(int id=-1,
string _hostname="",
string _im_mad_name="",
string _vmm_mad_name="",
string _tm_mad_name="",
bool _managed=true);
virtual ~Host();
// *************************************************************************
// DataBase implementation
// *************************************************************************
enum ColNames
{
HID = 0,
HOST_NAME = 1,
STATE = 2,
IM_MAD = 3,
VM_MAD = 4,
TM_MAD = 5,
LAST_MON_TIME = 6,
MANAGED = 7,
LIMIT = 8
};
static const char * db_names;
static const char * db_bootstrap;
static const char * table;
/**
* Reads the Host (identified with its OID=HID) from the database.
* @param db pointer to the db
* @return 0 on success
*/
virtual int select(SqliteDB *db);
/**
* Writes the Host and its associated HostShares in the database.
* @param db pointer to the db
* @return 0 on success
*/
virtual int insert(SqliteDB *db);
/**
* Writes/updates the Hosts data fields in the database.
* @param db pointer to the db
* @return 0 on success
*/
virtual int update(SqliteDB *db);
/**
* Drops host from the database
* @param db pointer to the db
* @return 0 on success
*/
virtual int drop(SqliteDB *db);
};
#endif /*HOST_H_*/

118
include/HostPool.h Normal file
View File

@ -0,0 +1,118 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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_H_
#define HOST_POOL_H_
#include "PoolSQL.h"
#include "Host.h"
#include <time.h>
#include <sstream>
#include <iostream>
#include <vector>
using namespace std;
/**
* The Host Pool class. ...
*/
class HostPool : public PoolSQL
{
public:
HostPool(SqliteDB * db):PoolSQL(db,Host::table){};
~HostPool(){};
/**
* Function to allocate a new Host object
* @param oid the id assigned to the Host
* @return 0 on success
*/
int allocate (
int * oid,
string hostname,
string im_mad_name,
string vmm_mad_name,
string tm_mad_name,
bool managed = true);
/**
* Function to get a Host from the pool, if the object is not in memory
* it is loaded from the DB
* @param oid Host unique id
* @param lock locks the Host mutex
* @return a pointer to the Host, 0 if the Host could not be loaded
*/
Host * get(
int oid,
bool lock)
{
return static_cast<Host *>(PoolSQL::get(oid,lock));
};
/** Update a particular Host
* @param host pointer to Host
* @return 0 on success
*/
int update(Host * host)
{
return host->update(db);
};
/** Drops a host from the cache & DB, the host mutex MUST BE locked
* @param host pointer to Host
*/
int drop(Host * host)
{
remove(static_cast<PoolObjectSQL *>(host));
return host->drop(db);
};
/**
* Bootstraps the database table(s) associated to the Host pool
*/
void bootstrap()
{
Host::bootstrap(db);
};
/**
* Get the 10 least monitored hosts
* param discovered hosts map to store the retrieved hosts hids and hostnames are
* return int 0 if success
*/
int discover(map<int, string> * discovered_hosts);
private:
/**
* Factory method to produce Host objects
* @return a pointer to the new Host
*/
PoolObjectSQL * create()
{
return new Host;
};
};
#endif /*HOST_POOL_H_*/

235
include/HostShare.h Normal file
View File

@ -0,0 +1,235 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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_SHARE_H_
#define HOST_SHARE_H_
#include "SqliteDB.h"
#include "ObjectSQL.h"
#include <time.h>
using namespace std;
extern "C" int host_share_select_cb (void * _host_share, int num,char ** values, char ** names);
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
* The HostShare class. It represents a logical partition of a host...
*/
class HostShare : public ObjectSQL
{
public:
HostShare(
int _hsid=-1,
int _max_disk=0,
int _max_mem=0,
int _max_cpu=0);
~HostShare(){};
/**
* Gets the HostShare identifier
* @return HSID HostShare identifier
*/
int get_hsid() const
{
return hsid;
};
/**
* Add a new VM to this share
* @param cpu requested by the VM
* @param mem requested by the VM
* @param disk requested by the VM
*/
void add(int cpu, int mem, int disk)
{
cpu_usage += cpu;
mem_usage += mem;
disk_usage += disk;
running_vms++;
}
/**
* Delete a VM from this share
* @param cpu requested by the VM
* @param mem requested by the VM
* @param disk requested by the VM
*/
void del(int cpu, int mem, int disk)
{
cpu_usage -= cpu;
mem_usage -= mem;
disk_usage -= disk;
running_vms--;
}
/**
* Check if this share can host a VM.
* @param cpu requested by the VM
* @param mem requested by the VM
* @param disk requested by the VM
*
* @return true if the share can host the VM or it is the only one
* configured
*/
bool test(int cpu, int mem, int disk) const
{
return (((max_cpu - cpu_usage ) >= cpu) &&
((max_mem - mem_usage ) >= mem) &&
((max_disk - disk_usage) >= disk));
}
/**
* Function to write a HostShare to an output stream
*/
friend ostream& operator<<(ostream& os, HostShare& hs);
private:
/**
* HostShare identifier
*/
int hsid;
/**
* HostShare's Endpoint
*/
string endpoint;
/**
* HostShare disk usage (in Kb)
*/
int disk_usage;
/**
* HostShare memory usage (in Kb)
*/
int mem_usage;
/**
* HostShare cpu usage (in percentage)
*/
int cpu_usage;
/**
* HostShare disk share (in GB), 0 means that the share will use all the
* avialable disk in the host
*/
int max_disk;
/**
* HostShare memory share (in MB), 0 means that the share will use all the
* avialable disk in the host
*/
int max_mem;
/**
* HostShare cpu usage (in percentage), 0 means that the share will use all
* the avialable disk in the host
*/
int max_cpu;
/**
* Number of running Virtual Machines in this HostShare
*/
int running_vms;
// ----------------------------------------
// Friends
// ----------------------------------------
friend class Host;
friend int host_share_select_cb (
void * _hostshare,
int num,
char ** values,
char ** names);
// ----------------------------------------
// DataBase implementation variables
// ----------------------------------------
enum ColNames
{
HSID = 0,
ENDPOINT = 1,
DISK_USAGE = 2,
MEM_USAGE = 3,
CPU_USAGE = 4,
MAX_DISK = 5,
MAX_MEMORY = 6,
MAX_CPU = 7,
RUNNING_VMS = 8,
LIMIT = 9
};
static const char * table;
static const char * db_names;
static const char * db_bootstrap;
// ----------------------------------------
// Database methods
// ----------------------------------------
/**
* Reads the HostShare (identified with its HSID) from the database.
* @param db pointer to the db
* @return 0 on success
*/
int select(SqliteDB * db);
/**
* Writes the HostShare in the database.
* @param db pointer to the db
* @return 0 on success
*/
int insert(SqliteDB * db);
/**
* Writes/updates the HostShare data fields in the database.
* @param db pointer to the db
* @return 0 on success
*/
int update(SqliteDB * db);
/**
* Drops hostshare from the database
* @param db pointer to the db
* @return 0 on success
*/
int drop(SqliteDB * db);
/**
* Function to unmarshall a HostShare object
* @param num the number of columns read from the DB
* @para names the column names
* @para vaues the column values
* @return 0 on success
*/
int unmarshall(int num, char **names, char ** values);
};
#endif /*HOST_SHARE_H_*/

46
include/HostTemplate.h Normal file
View File

@ -0,0 +1,46 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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_TEMPLATE_H_
#define HOST_TEMPLATE_H_
#include "TemplateSQL.h"
using namespace std;
/**
* Host Template class, it represents the attributes of a Host
*/
class HostTemplate : public TemplateSQL
{
public:
HostTemplate(int tid = -1):TemplateSQL(table,tid,true){};
~HostTemplate(){};
private:
friend class Host;
static const char * table;
static const char * db_bootstrap;
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
#endif /*HOST_TEMPLATE_H_*/

View File

@ -0,0 +1,142 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 INFORMATION_MANAGER_H_
#define INFORMATION_MANAGER_H_
#include "MadManager.h"
#include "ActionManager.h"
#include "InformationManagerDriver.h"
#include "HostPool.h"
using namespace std;
extern "C" void * im_action_loop(void *arg);
class InformationManager : public MadManager, public ActionListener
{
public:
InformationManager(
HostPool * _hpool,
time_t _timer_period,
time_t _monitor_period,
vector<const Attribute*>& _mads)
:MadManager(_mads),
hpool(_hpool),
timer_period(_timer_period),
monitor_period(_monitor_period)
{
am.addListener(this);
};
~InformationManager(){};
/**
* This functions starts the associated listener thread, and creates a
* new thread for the Information Manager. This thread will wait in
* an action loop till it receives ACTION_FINALIZE.
* @return 0 on success.
*/
int start();
/**
* Gets the thread identification.
* @return pthread_t for the manager thread (that in the action loop).
*/
pthread_t get_thread_id() const
{
return im_thread;
};
/**
*
*/
void load_mads(int uid=0);
/**
*
*/
void finalize()
{
am.trigger(ACTION_FINALIZE,0);
};
private:
/**
* Thread id for the Information Manager
*/
pthread_t im_thread;
/**
* Pointer to the Host Pool, to access hosts
*/
HostPool * hpool;
/**
* Timer period for the Virtual Machine Manager.
*/
time_t timer_period;
/**
* Host monitoring interval
*/
time_t monitor_period;
/**
* Action engine for the Manager
*/
ActionManager am;
/**
* Function to execute the Manager action loop method within a new pthread
* (requires C linkage)
*/
friend void * im_action_loop(void *arg);
/**
* Returns a pointer to a Information Manager MAD. The driver is
* searched by its name and owned by gwadmin with uid=0.
* @param name of the driver
* @return the VM driver owned by uid 0, with attribute "NAME" equal to
* name or 0 in not found
*/
const InformationManagerDriver * get(
const string& name)
{
string _name("NAME");
return static_cast<const InformationManagerDriver *>
(MadManager::get(0,_name,name));
};
/**
* The action function executed when an action is triggered.
* @param action the name of the action
* @param arg arguments for the action function
*/
void do_action(
const string & action,
void * arg);
/**
* This function is executed periodically to monitor Nebula hosts.
*/
void timer_action();
};
#endif /*VIRTUAL_MACHINE_MANAGER_H*/

View File

@ -0,0 +1,89 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 INFORMATION_MANAGER_DRIVER_H_
#define INFORMATION_MANAGER_DRIVER_H_
#include <map>
#include <string>
#include <sstream>
#include "Mad.h"
#include "HostPool.h"
using namespace std;
/**
* InformationManagerDriver provides a base class to implement IM
* Drivers. This class implements the protocol and recover functions
* from the Mad interface. This class may be used to further specialize
* the IM driver.
*/
class InformationManagerDriver : public Mad
{
public:
InformationManagerDriver(
int userid,
const map<string,string>& attrs,
bool sudo,
HostPool * pool):
Mad(userid,attrs,sudo),hpool(pool)
{}
;
virtual ~InformationManagerDriver()
{}
;
/**
* Implements the IM driver protocol.
* @param message the string read from the driver
*/
void protocol(
string& message);
/**
* TODO: What do we need here? just poll the Hosts to recover..
*/
void recover();
/**
* Sends a monitor request to the MAD: "MONITOR ID HOSTNAME -"
* @param oid the virtual machine id.
* @param host the hostname
* @param conf the filename of the deployment file
*/
void monitor (
int oid,
const string& host) const;
private:
/**
* Pointer to the Virtual Machine Pool, to access VMs
*/
HostPool * hpool;
friend class InformationManager;
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
#endif /*INFORMATION_MANAGER_DRIVER_H_*/

169
include/LifeCycleManager.h Normal file
View File

@ -0,0 +1,169 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 LIFE_CYCLE_MANAGER_H_
#define LIFE_CYCLE_MANAGER_H_
#include "ActionManager.h"
#include "VirtualMachinePool.h"
using namespace std;
extern "C" void * lcm_action_loop(void *arg);
/**
* The Virtual Machine Life-cycle Manager module. This class is responsible for
* managing the life-cycle of a Virtual Machine.
*/
class LifeCycleManager : public ActionListener
{
public:
LifeCycleManager(VirtualMachinePool * pool)
{
vmpool = pool;
am.addListener(this);
};
~LifeCycleManager(){};
enum Actions
{
SAVE_SUCCESS, /**< Send by the VMM when a save action succeeds */
SAVE_FAILURE, /**< Send by the VMM when a save action fails */
DEPLOY_SUCCESS, /**< Send by the VMM when a deploy/restore/migrate action succeeds */
DEPLOY_FAILURE, /**< Send by the VMM when a deploy/restore/migrate action fails */
SHUTDOWN_SUCCESS, /**< Send by the VMM when a shutdown action succeeds*/
SHUTDOWN_FAILURE, /**< Send by the VMM when a shutdown action fails */
CANCEL_SUCCESS, /**< Send by the VMM when a cancel action succeeds */
CANCEL_FAILURE, /**< Send by the VMM when a cancel action fails */
PROLOG_SUCCESS, /**< Send by the TM when the prolog phase succeeds */
PROLOG_FAILURE, /**< Send by the TM when the prolog phase fails */
EPILOG_SUCCESS, /**< Send by the TM when the epilog phase succeeds */
EPILOG_FAILURE, /**< Send by the TM when the epilog phase fails */
DEPLOY, /**< Send by the DM to deploy a VM on a host */
SUSPEND, /**< Send by the DM to suspend an running VM */
RESTORE, /**< Send by the DM to restore a suspended VM */
STOP, /**< Send by the DM to stop an running VM */
CANCEL, /**< Send by the DM to cancel an running VM */
MIGRATE, /**< Send by the DM to migrate a VM to other host */
LIVE_MIGRATE, /**< Send by the DM to live-migrate a VM */
SHUTDOWN, /**< Send by the DM to shutdown an running VM */
FINALIZE
};
/**
* Triggers specific actions to the Life-cycle Manager. This function
* wraps the ActionManager trigger function.
* @param action the LCM action
* @param vid VM unique id. This is the argument of the passed to the
* invoked action.
*/
void trigger(
Actions action,
int vid);
/**
* This functions starts a new thread for the Life-cycle Manager. This
* thread will wait in an action loop till it receives ACTION_FINALIZE.
* @return 0 on success.
*/
int start();
/**
* Gets the thread identification.
* @return pthread_t for the manager thread (that in the action loop).
*/
pthread_t get_thread_id() const
{
return lcm_thread;
};
private:
/**
* Thread id for the Virtual Machine Manager
*/
pthread_t lcm_thread;
/**
* Pointer to the Virtual Machine Pool, to access VMs
*/
VirtualMachinePool * vmpool;
/**
* Action engine for the Manager
*/
ActionManager am;
/**
* Function to execute the Manager action loop method within a new pthread
* (requires C linkage)
*/
friend void * lcm_action_loop(void *arg);
/**
* The action function executed when an action is triggered.
* @param action the name of the action
* @param arg arguments for the action function
*/
void do_action(
const string & action,
void * arg);
void save_success_action(int vid);
void save_failure_action(int vid);
void deploy_success_action(int vid);
void deploy_failure_action(int vid);
void shutdown_success_failure_action(int vid);
void cancel_success_failure_action(int vid);
void prolog_success_action(int vid);
void prolog_failure_action(int vid);
void epilog_success_action(int vid);
void epilog_failure_action(int vid);
void deploy_action(int vid);
void suspend_action(int vid);
void restore_action(int vid);
void stop_action(int vid);
void cancel_action(int vid);
void checkpoint_action(int vid);
void migrate_action(int vid);
void live_migrate_action(int vid);
void shutdown_action(int vid);
void timer_action();
};
#endif /*LIFE_CYCLE_MANAGER_H_*/

67
include/Log.h Normal file
View File

@ -0,0 +1,67 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 _LOG_H_
#define _LOG_H_
#include <string>
#include <fstream>
using namespace std;
class Log
{
public:
enum MessageType {
ERROR = 0,
WARNING = 1,
INFO = 2,
DEBUG = 3
};
typedef void (*LogFunction)(
const char *,
const MessageType,
const ostringstream&,
const char *);
Log(const string& file_name,
const MessageType level = WARNING,
ios_base::openmode mode = ios_base::app);
~Log();
void log(
const char * module,
const MessageType type,
const ostringstream& message);
void log(
const char * module,
const MessageType type,
const char * message);
private:
static const char error_names[];
MessageType log_level;
ofstream file;
};
#endif /* _LOG_H_ */

146
include/Mad.h Normal file
View File

@ -0,0 +1,146 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 MAD_H_
#define MAD_H_
#include <pthread.h>
#include <sys/types.h>
#include <map>
#include <string>
#include <sstream>
#include <unistd.h>
using namespace std;
/**
* Base class to build specific middleware access drivers (MAD).
* This class provides generic MAD functionality.
*/
class Mad
{
protected:
/**
* The constructor initialize the class members but DOES NOT start the
* driver. A subsequent call to the start() method is needed.
* @param userid user running this MAD
* @param attrs configuration attributes for the driver
* @param sudo the driver is started through sudo if true
*/
Mad(
int userid,
const map<string,string> &attrs,
bool sudo):
uid(userid),
attributes(attrs),
sudo_execution(sudo),
pid(-1)
{};
/**
* The destructor of the class finalizes the driver process, and all its
* associated resources (i.e. pipes)
*/
virtual ~Mad();
/**
* Send a command to the driver
* @param os an output string stream with the message, it must be
* terminated with the end of line character.
*/
void write(
ostringstream& os) const
{
string str;
const char * cstr;
str = os.str();
cstr = str.c_str();
::write(nebula_mad_pipe, cstr, str.size());
};
private:
friend class MadManager;
/**
* Communication pipe file descriptor. Represents the MAD to nebula
* communication stream (nebula<-mad)
*/
int mad_nebula_pipe;
/**
* Communication pipe file descriptor. Represents the nebula to MAD
* communication stream (nebula->mad)
*/
int nebula_mad_pipe;
/**
* User running this MAD as defined in the upool DB
*/
int uid;
/**
* Mad configuration attributes (e.g. executable, attributes...). Attribute
* names MUST be lowecase.
*/
map<string,string> attributes;
/**
* True if the mad is to be executed through sudo, with the identity of the
* Mad owner (uid).
*/
bool sudo_execution;
/**
* Process ID of the running MAD.
*/
pid_t pid;
/**
* Starts the MAD. This function creates a new process, sets up the
* communication pipes and sends the initialization command to the driver.
* @return 0 on success
*/
int start();
/**
* Reloads the driver: sends the finalize command, "waits" for the
* driver process and closes the communication pipes. Then the driver is
* started again by calling the start() function
* @return 0 on success
*/
int reload();
/**
* Implements the driver specific protocol, this function should trigger
* actions on the associated manager.
* @param message the string read from the driver
*/
virtual void protocol(
string& message) = 0;
/**
* This function is called whenever the driver crashes. This function
* should perform the actions needed to recover the VMs.
*/
virtual void recover() = 0;
};
#endif /*MAD_H_*/

166
include/MadManager.h Normal file
View File

@ -0,0 +1,166 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 MAD_MANAGER_H_
#define MAD_MANAGER_H_
#include <pthread.h>
#include <sys/types.h>
#include <string>
#include <vector>
#include <sstream>
#include <vector>
#include "Mad.h"
#include "Attribute.h"
using namespace std;
extern "C" void * mad_manager_listener(void * _mm);
/**
* Provides general functionality for driver management. The MadManager serves
* Nebula managers as base clase.
*/
class MadManager
{
public:
/**
* Function to initialize the MAD management system. This function
* MUST be called once before using the MadManager class. This function
* blocks the SIG_PIPE (broken pipe) signal that may occur when a driver
* crashes
*/
static void mad_manager_system_init();
/**
* Loads Virtual Machine Manager Mads defined in configuration file
* @param uid of the user executing the driver. When uid is 0 the nebula
* identity will be used. Otherwise the Mad will be loaded through the
* sudo application.
*/
virtual void load_mads(int uid) = 0;
protected:
MadManager(vector<const Attribute *>& _mads);
virtual ~MadManager();
/**
* Vector containing Mad configuration for this Manager, as described in
* the nebula location
*/
vector<const Attribute *> mad_conf;
/**
* This function initialize the communication pipes to register new MADs
* in the manager, and starts a listener to wait for driver messages.
*/
virtual int start();
/**
* This function closes the communication pipes, stops the listener thread,
* and finalize the associated drivers.
*/
virtual void stop();
/**
* Get a mad
*/
virtual const Mad * get(int uid, const string& name, const string& value);
/**
* Register a new mad in the manager. The Mad is previously started, and
* then the listener thread is notified through the pipe_w stream. In case
* of failure the calling function MUST free the Mad.
* @param mad pointer to the mad to be added to the manager.
* @return 0 on success.
*/
int add(Mad *mad);
private:
/**
* Function to lock the Manager
*/
void lock()
{
pthread_mutex_lock(&mutex);
};
/**
* Function to unlock the Manager
*/
void unlock()
{
pthread_mutex_unlock(&mutex);
};
/**
* Function to execute the listener method within a new pthread (requires
* C linkage)
*/
friend void * mad_manager_listener(void * _mm);
/**
* Synchronization mutex (listener & manager threads)
*/
pthread_mutex_t mutex;
/**
* Thread id for the listener process
*/
pthread_t listener_thread;
/**
* Communication pipe (read end) to link the Manager and the listener
* thread
*/
int pipe_r;
/**
* Communication pipe (write end) to link the Manager and the listener
* thread
*/
int pipe_w;
/**
* This vector contains the file descriptors of the driver pipes (to read
* Mads responses)
*/
vector<int> fds;
/**
* The sets of Mads managed by the MadManager
*/
vector<Mad *> mads;
/**
* Read buffer for the listener. This variable is in the class so it
* can be free upon listener thread cancellation.
*/
ostringstream buffer;
/**
* Listener thread implementation.
*/
void listener();
};
#endif /*MAD_MANAGER_H_*/

248
include/Nebula.h Normal file
View File

@ -0,0 +1,248 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 NEBULA_H_
#define NEBULA_H_
#include <sqlite3.h>
#include "Log.h"
#include "NebulaTemplate.h"
#include "VirtualMachinePool.h"
#include "HostPool.h"
#include "VirtualMachineManager.h"
#include "LifeCycleManager.h"
#include "InformationManager.h"
#include "TransferManager.h"
#include "DispatchManager.h"
#include "RequestManager.h"
class Nebula
{
public:
static Nebula& instance()
{
static Nebula nebulad;
return nebulad;
};
// ---------------------------------------------------------------
// Loggging
// ---------------------------------------------------------------
static void log(
const char * module,
const Log::MessageType type,
const ostringstream& message,
const char * filename = 0)
{
static Log nebula_log(filename,Log::DEBUG,ios_base::trunc);
static pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&log_mutex);
nebula_log.log(module,type,message);
pthread_mutex_unlock(&log_mutex);
};
static void log(
const char * module,
const Log::MessageType type,
const char * message,
const char * filename = 0)
{
ostringstream os(message);
Nebula::log(module,type,os,filename);
};
// --------------------------------------------------------------
// Pool Accessors
// --------------------------------------------------------------
VirtualMachinePool * get_vmpool()
{
return vmpool;
};
HostPool * get_hpool()
{
return hpool;
};
// --------------------------------------------------------------
// Manager Accessors
// --------------------------------------------------------------
VirtualMachineManager * get_vmm()
{
return vmm;
};
LifeCycleManager * get_lcm()
{
return lcm;
};
InformationManager * get_im()
{
return im;
};
TransferManager * get_tm()
{
return tm;
};
DispatchManager * get_dm()
{
return dm;
};
// --------------------------------------------------------------
// Environment & Configuration
// --------------------------------------------------------------
string& get_nebula_location()
{
return nebula_location;
};
static string version()
{
return "ONE0.1";
};
void start();
void get_configuration_attribute(
const char * name,
string& value) const
{
string _name(name);
nebula_configuration->Template::get(_name,value);
};
private:
// -----------------------------------------------------------------------
//Constructors and = are private to only access the class through instance
// -----------------------------------------------------------------------
Nebula():nebula_configuration(0),db(0),vmpool(0),hpool(0),lcm(0),
vmm(0),im(0),tm(0),dm(0),rm(0){};
~Nebula()
{
if ( vmpool != 0)
{
delete vmpool;
}
if ( hpool != 0)
{
delete hpool;
}
if ( vmm != 0)
{
delete vmm;
}
if ( lcm != 0)
{
delete lcm;
}
if ( im != 0)
{
delete im;
}
if ( tm != 0)
{
delete tm;
}
if ( dm != 0)
{
delete dm;
}
if ( rm != 0)
{
delete rm;
}
if ( nebula_configuration != 0)
{
delete nebula_configuration;
}
if ( db != 0 )
{
delete db;
}
};
Nebula(Nebula const&){};
Nebula& operator=(Nebula const&){return *this;};
// ---------------------------------------------------------------
// Environment variables
// ---------------------------------------------------------------
string nebula_location;
// ---------------------------------------------------------------
// Configuration
// ---------------------------------------------------------------
NebulaTemplate * nebula_configuration;
// ---------------------------------------------------------------
// Nebula Pools
// ---------------------------------------------------------------
SqliteDB * db;
VirtualMachinePool * vmpool;
HostPool * hpool;
// ---------------------------------------------------------------
// Nebula Managers
// ---------------------------------------------------------------
LifeCycleManager * lcm;
VirtualMachineManager * vmm;
InformationManager * im;
TransferManager * tm;
DispatchManager * dm;
RequestManager * rm;
// ---------------------------------------------------------------
// Implementation functions
// ---------------------------------------------------------------
friend void nebula_signal_handler (int sig);
};
#endif /*NEBULA_H_*/

54
include/NebulaTemplate.h Normal file
View File

@ -0,0 +1,54 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 NEBULA_TEMPLATE_H_
#define NEBULA_TEMPLATE_H_
#include "Template.h"
#include <map>
class NebulaTemplate : public Template
{
public:
NebulaTemplate(string& nebula_location);
~NebulaTemplate(){};
static const char * conf_name;
int get(
const char * name,
vector<const Attribute*>& values) const
{
string _name(name);
return Template::get(_name,values);
};
private:
friend class Nebula;
string conf_file;
map<string, Attribute*> conf_default;
int load_configuration();
};
#endif /*NEBULA_TEMPLATE_H_*/

104
include/ObjectSQL.h Normal file
View File

@ -0,0 +1,104 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 OBJECT_SQL_H_
#define OBJECT_SQL_H_
#include "SqliteDB.h"
using namespace std;
/**
* ObjectSQL class. Provides a SQL backend interface, it should be implemented
* by persistent objects.
*/
class ObjectSQL
{
public:
ObjectSQL(){};
virtual ~ObjectSQL(){};
protected:
/**
* Gets the value of a column in the pool for a given object
* @param db pointer to Database
* @param table supporting the object
* @param column to be selected
* @param where contidtion to select the column
* @param value of the column
* @return 0 on success
*/
int select_column(
SqliteDB * db,
const string& table,
const string& column,
const string& where,
string * value);
/**
* Sets the value of a column in the pool for a given object
* @param db pointer to Database
* @param table supporting the object
* @param column to be selected
* @param where contidtion to select the column
* @param value of the column
* @return 0 on success
*/
int update_column(
SqliteDB * db,
const string& table,
const string& column,
const string& where,
const string& value);
/**
* Reads the ObjectSQL (identified with its OID) from the database.
* @param db pointer to the db
* @return 0 on success
*/
virtual int select(
SqliteDB * db) = 0;
/**
* Writes the ObjectSQL in the database.
* @param db pointer to the db
* @return 0 on success
*/
virtual int insert(
SqliteDB * db) = 0;
/**
* Updates the ObjectSQL in the database.
* @param db pointer to the db
* @return 0 on success
*/
virtual int update(
SqliteDB * db) = 0;
/**
* Removes the ObjectSQL from the database.
* @param db pointer to the db
* @return 0 on success
*/
virtual int drop(
SqliteDB * db) = 0;
};
#endif /*OBJECT_SQL_H_*/

93
include/PoolObjectSQL.h Normal file
View File

@ -0,0 +1,93 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 POOL_OBJECT_SQL_H_
#define POOL_OBJECT_SQL_H_
#include "SqliteDB.h"
#include "ObjectSQL.h"
#include <pthread.h>
using namespace std;
/**
* PoolObject class. Provides a SQL backend interface for Pool components. Each
* object is identified with and unique OID
*
* Note: The PoolObject provides a synchronization mechanism (mutex). This
* implementation assumes that the mutex IS LOCKED when the class destructor
* is called.
*/
class PoolObjectSQL : public ObjectSQL
{
public:
PoolObjectSQL(int id=-1):oid(id)
{
pthread_mutex_init(&mutex,0);
};
virtual ~PoolObjectSQL()
{
pthread_mutex_unlock(&mutex);
pthread_mutex_destroy(&mutex);
};
int get_oid() const
{
return oid;
};
/**
* Function to lock the object
*/
void lock()
{
pthread_mutex_lock(&mutex);
};
/**
* Function to unlock the object
*/
void unlock()
{
pthread_mutex_unlock(&mutex);
};
protected:
/**
* The object unique ID
*/
int oid;
private:
/**
* The PoolSQL, friend to easily manipulate its Objects
*/
friend class PoolSQL;
/**
* The mutex for the PoolObject. This implementation assumes that the mutex
* IS LOCKED when the class destructor is called.
*/
pthread_mutex_t mutex;
};
#endif /*POOL_OBJECT_SQL_H_*/

185
include/PoolSQL.h Normal file
View File

@ -0,0 +1,185 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 POOL_SQL_H_
#define POOL_SQL_H_
#include <map>
#include <string>
#include <queue>
#include "SqliteDB.h"
#include "PoolObjectSQL.h"
#include "Log.h"
using namespace std;
/**
* PoolSQL class. Provides a base class to implement persistent generic pools.
* The PoolSQL provides a synchronization mechanism (mutex) to operate in
* multithreaded applications. Any modification or access function to the pool
* SHOULD block the mutex.
*/
class PoolSQL
{
public:
/**
* Initializes the oid counter. This function sets lastOID to
* the last used Object identifier by querying the corresponding database
* table. This function SHOULD be called before any pool related function.
* @param _db a pointer to the database
* @param table the name of the table supporting the pool (to set the oid
* counter). If null the OID counter is not updated.
*/
PoolSQL(SqliteDB * _db, const char * table=0);
virtual ~PoolSQL();
/**
* Allocates a new object, writting it in the pool database. No memory is
* allocated for the object.
* @param objsql an initialized ObjectSQL
* @return the oid assigned to the object or -1 in case of failure
*/
virtual int allocate(
PoolObjectSQL *objsql);
/**
* Gets an object from the pool (if needed the object is loaded from the
* database).
* @param oid the object unique identifier
* @param lock locks the object if true
*
* @return a pointer to the object, 0 in case of failure
*/
virtual PoolObjectSQL * get(
int oid,
bool lock);
/**
* Finds a set objects that satisfies a given condition
* @param oids a vector with the oids of the objects.
* @param the name of the DB table.
* @param where condition in SQL format.
*
* @return 0 on success
*/
virtual int search(
vector<int>& oids,
const char * table,
const string& where);
/**
* Updates the object's data in the data base. The object mutex SHOULD be
* locked.
* @param objsql a pointer to the object
*
* @return 0 on success.
*/
virtual int update(
PoolObjectSQL * objsql)
{
return objsql->update(db);
};
/**
* Removes an object from the pool cache. The object mutex MUST be locked.
* The resources of the object are freed, but its record is kept in the DB.
* @param objsql a pointer to the object
*/
void remove(
PoolObjectSQL * objsql);
/**
* Removes all the elements from the pool
*/
void clean();
/**
* Bootstraps the database table(s) associated to the pool
*/
virtual void bootstrap() = 0;
protected:
/**
* Pointer to the database.
*/
SqliteDB * db;
/**
* Function to lock the pool
*/
void lock()
{
pthread_mutex_lock(&mutex);
};
/**
* Function to unlock the pool
*/
void unlock()
{
pthread_mutex_unlock(&mutex);
};
private:
pthread_mutex_t mutex;
/**
* Max size for the pool, to control the memory footprint of the pool. This
* number MUST be greater than the max. number of objects that are
* accessed simultaneously.
*/
static const unsigned int MAX_POOL_SIZE;
/**
* Last object ID assigned to an object. It must be initialized by the
* target pool.
*/
int lastOID;
/**
* The pool is implemented with a Map, of SQL object pointers, using the
* OID as key.
*/
map<int,PoolObjectSQL *> pool;
/**
* Factory method, must return an ObjectSQL pointer to an allocated pool
* specific object.
*/
virtual PoolObjectSQL * create() = 0;
/**
* OID queue to implement a FIFO-like replacement policy for the pool
* cache.
*/
queue<int> oid_queue;
/**
* FIFO-like replacement policy function. Before removing an object (pop)
* from the cache it's lock is checked. The object is removed only if
* the associated mutex IS NOT blocked. Otherwise the oid is sent to the
* back of the queue.
*/
void replace();
};
#endif /*POOL_SQL_H_*/

363
include/RequestManager.h Normal file
View File

@ -0,0 +1,363 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 REQUEST_MANAGER_H_
#define REQUEST_MANAGER_H_
#include "ActionManager.h"
#include "VirtualMachinePool.h"
#include "HostPool.h"
#include <xmlrpc-c/base.hpp>
#include <xmlrpc-c/registry.hpp>
#include <xmlrpc-c/server_abyss.hpp>
using namespace std;
extern "C" void * rm_action_loop(void *arg);
extern "C" void * rm_xml_server_loop(void *arg);
class RequestManager : public ActionListener
{
public:
RequestManager(
VirtualMachinePool * _vmpool,
HostPool * _hpool,
int _port,
string _xml_log_file)
:vmpool(_vmpool),hpool(_hpool),port(_port),socket_fd(-1),
xml_log_file(_xml_log_file)
{
am.addListener(this);
};
~RequestManager()
{}
;
/**
* This functions starts the associated listener thread (XML server), and
* creates a new thread for the Request Manager. This thread will wait in
* an action loop till it receives ACTION_FINALIZE.
* @return 0 on success.
*/
int start();
/**
* Gets the thread identification.
* @return pthread_t for the manager thread (that in the action loop).
*/
pthread_t get_thread_id() const
{
return rm_thread;
};
/**
*
*/
void finalize()
{
am.trigger(ACTION_FINALIZE,0);
};
private:
//--------------------------------------------------------------------------
// Friends, thread functions require C-linkage
//--------------------------------------------------------------------------
friend void * rm_xml_server_loop(void *arg);
friend void * rm_action_loop(void *arg);
/**
* Thread id for the RequestManager
*/
pthread_t rm_thread;
/**
* Thread id for the XML Server
*/
pthread_t rm_xml_server_thread;
/**
* Pointer to the Host Pool, to access hosts
*/
VirtualMachinePool * vmpool;
/**
* Pointer to the Host Pool, to access hosts
*/
HostPool * hpool;
/**
* Port number where the connection will be open
*/
int port;
/*
* FD for the XML server socket
*/
int socket_fd;
/**
* Filename for the log of the xmlrpc server that listens
*/
string xml_log_file;
/**
* Action engine for the Manager
*/
ActionManager am;
/**
* To register XML-RPC methods
*/
xmlrpc_c::registry RequestManagerRegistry;
/**
* The XML-RPC server
*/
xmlrpc_c::serverAbyss * AbyssServer;
/**
* The action function executed when an action is triggered.
* @param action the name of the action
* @param arg arguments for the action function
*/
void do_action(const string & action, void * arg);
void register_xml_methods();
int setup_socket();
// ----------------------------------------------------------------------
// XML-RPC Methods
// ----------------------------------------------------------------------
class VirtualMachineAllocate: public xmlrpc_c::method
{
public:
VirtualMachineAllocate()
{
_signature="A:ss";
_help="Allocates a virtual machine in the pool";
};
~VirtualMachineAllocate(){};
void execute(
xmlrpc_c::paramList const& paramList,
xmlrpc_c::value * const retval);
};
/* ---------------------------------------------------------------------- */
class VirtualMachineDeploy: public xmlrpc_c::method
{
public:
VirtualMachineDeploy(
VirtualMachinePool * _vmpool,
HostPool * _hpool):
vmpool(_vmpool),
hpool(_hpool)
{
_signature="A:sii";
_help="Deploys a virtual machine";
};
~VirtualMachineDeploy(){};
void execute(
xmlrpc_c::paramList const& paramList,
xmlrpc_c::value * const retval);
private:
VirtualMachinePool * vmpool;
HostPool * hpool;
};
/* ---------------------------------------------------------------------- */
class VirtualMachineAction: public xmlrpc_c::method
{
public:
VirtualMachineAction()
{
_signature="A:ssi";
_help="Performs an action on a virtual machine";
};
~VirtualMachineAction(){};
void execute(
xmlrpc_c::paramList const& paramList,
xmlrpc_c::value * const retval);
private:
VirtualMachinePool * vmpool;
HostPool * hpool;
};
/* ---------------------------------------------------------------------- */
class VirtualMachineMigrate: public xmlrpc_c::method
{
public:
VirtualMachineMigrate(
VirtualMachinePool * _vmpool,
HostPool * _hpool):
vmpool(_vmpool),
hpool(_hpool)
{
_signature="A:siib";
_help="Migrates a virtual machine";
};
~VirtualMachineMigrate(){};
void execute(
xmlrpc_c::paramList const& paramList,
xmlrpc_c::value * const retval);
private:
VirtualMachinePool * vmpool;
HostPool * hpool;
};
/* ---------------------------------------------------------------------- */
class VirtualMachineInfo: public xmlrpc_c::method
{
public:
VirtualMachineInfo(
VirtualMachinePool * _vmpool):
vmpool(_vmpool)
{
_signature="A:si";
_help="Returns virtual machine information";
};
~VirtualMachineInfo(){};
void execute(
xmlrpc_c::paramList const& paramList,
xmlrpc_c::value * const retval);
private:
VirtualMachinePool * vmpool;
};
/* ---------------------------------------------------------------------- */
class HostAllocate: public xmlrpc_c::method
{
public:
HostAllocate(HostPool * _hpool):hpool(_hpool)
{
_signature="A:sssssb";
_help="Allocates a host in the pool";
};
~HostAllocate(){};
void execute(
xmlrpc_c::paramList const& paramList,
xmlrpc_c::value * const retvalP);
private:
HostPool * hpool;
};
/* ---------------------------------------------------------------------- */
class HostInfo: public xmlrpc_c::method
{
public:
HostInfo(HostPool * _hpool):hpool(_hpool)
{
_signature="A:si";
_help="Returns host information";
};
~HostInfo(){};
void execute(
xmlrpc_c::paramList const& paramList,
xmlrpc_c::value * const retvalP);
private:
HostPool * hpool;
};
/* ---------------------------------------------------------------------- */
class HostDelete: public xmlrpc_c::method
{
public:
HostDelete(HostPool * _hpool):hpool(_hpool)
{
_signature="A:si";
_help="Deletes a host from the pool";
};
~HostDelete(){};
void execute(
xmlrpc_c::paramList const& paramList,
xmlrpc_c::value * const retvalP);
private:
HostPool * hpool;
};
/* ---------------------------------------------------------------------- */
class HostEnable: public xmlrpc_c::method
{
public:
HostEnable(HostPool * _hpool):hpool(_hpool)
{
_signature="A:sib";
_help="Enables or disables a host";
};
~HostEnable(){};
void execute(
xmlrpc_c::paramList const& paramList,
xmlrpc_c::value * const retvalP);
private:
HostPool * hpool;
};
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
#endif

199
include/Scheduler.h Normal file
View File

@ -0,0 +1,199 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 SCHEDULER_H_
#define SCHEDULER_H_
#include "Log.h"
#include "SchedulerHost.h"
#include "SchedulerVirtualMachine.h"
#include "SchedulerPolicy.h"
#include "ActionManager.h"
#include <sqlite3.h>
#include <sstream>
#include <xmlrpc-c/girerr.hpp>
#include <xmlrpc-c/base.hpp>
#include <xmlrpc-c/client_simple.hpp>
using namespace std;
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
extern "C" void * scheduler_action_loop(void *arg);
/**
* The Scheduler class. It represents the scheduler ...
*/
class Scheduler: public ActionListener
{
public:
// ---------------------------------------------------------------
// Loggging
// ---------------------------------------------------------------
static void log(
const char * module,
const Log::MessageType type,
const ostringstream& message,
const char * filename = 0)
{
static Log scheduler_log(filename,Log::DEBUG);
static pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&log_mutex);
scheduler_log.log(module,type,message);
pthread_mutex_unlock(&log_mutex);
};
static void log(
const char * module,
const Log::MessageType type,
const char * message,
const char * filename = 0)
{
ostringstream os(message);
Scheduler::log(module,type,os,filename);
};
void start();
virtual void register_policies() = 0;
protected:
Scheduler(string& url, time_t _timer)
:hpool(0),vmpool(0),db(0),one_url(url),timer(_timer),threshold(0.9)
{
am.addListener(this);
};
virtual ~Scheduler()
{
if ( hpool != 0)
{
delete hpool;
}
if ( vmpool != 0)
{
delete vmpool;
}
if (db != 0)
{
delete db;
}
};
// ---------------------------------------------------------------
// Pools
// ---------------------------------------------------------------
SchedulerHostPool * hpool;
SchedulerVirtualMachinePool * vmpool;
// ---------------------------------------------------------------
// Scheduler Policies
// ---------------------------------------------------------------
void add_host_policy(SchedulerHostPolicy *policy)
{
host_policies.push_back(policy);
}
// ---------------------------------------------------------------
// Scheduler main methods
// ---------------------------------------------------------------
/**
* Gets the hosts that match the requirements of the pending VMs, also
* the capacity of the host is checked. If there is enough room to host the
* VM a share vector is added to the VM.
*/
virtual void match();
virtual void dispatch();
virtual int schedule();
virtual int set_up_pools();
private:
Scheduler(Scheduler const&){};
Scheduler& operator=(Scheduler const&){return *this;};
friend void * scheduler_action_loop(void *arg);
// ---------------------------------------------------------------
// Database
// ---------------------------------------------------------------
SqliteDB * db;
// ---------------------------------------------------------------
// Scheduling Policies
// ---------------------------------------------------------------
vector<SchedulerHostPolicy *> host_policies;
// ---------------------------------------------------------------
// Configuration attributes
// ---------------------------------------------------------------
/**
* the URL of the XML-RPC server
*/
string one_url;
time_t timer;
/**
* Threshold value to round up freecpu
*/
float threshold;
// ---------------------------------------------------------------
// Timer to periodically schedule and dispatch VMs
// ---------------------------------------------------------------
pthread_t sched_thread;
ActionManager am;
void do_action(const string &name, void *args);
// ---------------------------------------------------------------
// XML_RPC related variables
// ---------------------------------------------------------------
/**
* NOTE (from lib doc): "you may not have more than one object of this
* class in a program. The code is not re-entrant -- it uses global
* variables."
*/
xmlrpc_c::clientSimple xmlrpc_client;
};
#endif /*SCHEDULER_H_*/

141
include/SchedulerHost.h Normal file
View File

@ -0,0 +1,141 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 SCHEDULER_HOST_H_
#define SCHEDULER_HOST_H_
#include "Host.h"
using namespace std;
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
* The SchedulerHost class. It represents the scheduler version of the host,
* only read operations to the pool are allowed for the SchedulerHost class
*/
class SchedulerHost : public Host
{
public:
SchedulerHost(){};
~SchedulerHost(){};
/**
* 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);
private:
// ----------------------------------------
// Friends
// ----------------------------------------
friend class SchedulerHostPool;
// ----------------------------------------
// SQL functions do not modify the DB!
// ----------------------------------------
int insert(SqliteDB *db);
int update(SqliteDB *db);
int drop(SqliteDB *db);
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
* The SchedulerHost class. It represents the scheduler version of the host,
* read only operation to the pool are allowed for the SchedulerHost class
*/
class SchedulerHostPool : public PoolSQL
{
public:
//--------------------------------------------------------------------------
// Constructor
//--------------------------------------------------------------------------
SchedulerHostPool(SqliteDB *db):PoolSQL(db){};
~SchedulerHostPool(){};
/**
* Implements the Pool interface, just prints an error message. This
* class DOES NOT modify the database.
*/
int allocate(
PoolObjectSQL *objsql);
/**
* Gets an ScheulerHost from the pool (if needed the object is loaded from
* the database).
* @param oid the object unique identifier
* @param lock locks the object if true
*
* @return a pointer to the object, 0 in case of failure
*/
SchedulerHost * get(
int oid,
bool lock)
{
return static_cast<SchedulerHost *>(PoolSQL::get(oid,lock));
};
/**
* Set ups the host pool by performing the following actions:
* - All the objects stored in the pool are flushed
* - The ids of the hosts in the database are loaded
* @return 0 on success
*/
int set_up();
private:
friend class Scheduler;
/**
* Hosts ids
*/
vector<int> hids;
/**
* Factory method for the PoolSQL class
* @return a pointer to a new SchedulerHost object
*/
PoolObjectSQL * create()
{
return new SchedulerHost;
};
/**
* Bootstrap method from the PoolSQL interface. It just prints
* an error message as this class MUST not modify the DB.
*/
void bootstrap();
};
#endif /*SCHEDULER_HOST_H_*/

112
include/SchedulerPolicy.h Normal file
View File

@ -0,0 +1,112 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 SCHEDULER_POLICY_H_
#define SCHEDULER_POLICY_H_
#include "SchedulerHost.h"
#include "SchedulerVirtualMachine.h"
#include <cmath>
using namespace std;
class SchedulerHostPolicy
{
public:
SchedulerHostPolicy(
SchedulerVirtualMachinePool * _vmpool,
SchedulerHostPool * _hpool,
float w=1.0):
vmpool(_vmpool),hpool(_hpool),sw(w){};
virtual ~SchedulerHostPolicy(){};
const vector<float>& get(
SchedulerVirtualMachine * vm)
{
priority.clear();
policy(vm);
if(priority.empty()!=true)
{
sw.max = *max_element(
priority.begin(),
priority.end(),
SchedulerHostPolicy::abs_cmp);
transform(
priority.begin(),
priority.end(),
priority.begin(),
sw);
}
return priority;
};
protected:
vector<float> priority;
virtual void policy(SchedulerVirtualMachine * vm) = 0;
SchedulerVirtualMachinePool * vmpool;
SchedulerHostPool * hpool;
private:
static bool abs_cmp(float fl1, float fl2)
{
return fabs(fl1)<fabs(fl2);
};
//--------------------------------------------------------------------------
class ScaleWeight
{
public:
ScaleWeight(float _weight):weight(_weight){};
~ScaleWeight(){};
float operator() (float pr)
{
if ( max == 0 )
{
return 0;
}
else
{
return weight * pr / max;
}
};
private:
friend class SchedulerHostPolicy;
float weight;
float max;
};
//--------------------------------------------------------------------------
ScaleWeight sw;
};
/* -------------------------------------------------------------------------- */
#endif /*SCHEDULER_POLICY_H_*/

View File

@ -0,0 +1,186 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 SCHEDULER_VIRTUAL_MACHINE_H_
#define SCHEDULER_VIRTUAL_MACHINE_H_
#include "VirtualMachine.h"
#include "SchedulerHost.h"
using namespace std;
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
* The SchedulerHost class. It represents the scheduler version of the host,
* only read operations to the pool are allowed for the SchedulerHost class
*/
class SchedulerVirtualMachine : public VirtualMachine
{
public:
SchedulerVirtualMachine(){};
~SchedulerVirtualMachine()
{
vector<SchedulerVirtualMachine::Host *>::iterator jt;
for (jt=hosts.begin();jt!=hosts.end();jt++)
{
delete *jt;
}
};
/**
* Adds a new share to the map of suitable shares to start this VM
* @param hid of the selected host
* @param hsid of the selected host share
*/
void add_host(int hid)
{
SchedulerVirtualMachine::Host * ss;
ss = new SchedulerVirtualMachine::Host(hid);
hosts.push_back(ss);
};
/**
* Gets the matching hosts ids
* @param mh vector with the hids of the matching hosts
*/
void get_matching_hosts(vector<int>& mh)
{
vector<SchedulerVirtualMachine::Host *>::iterator i;
for(i=hosts.begin();i!=hosts.end();i++)
{
mh.push_back((*i)->hid);
}
};
/**
* Sets the priorities for each matching host
*/
void set_priorities(vector<float>& total);
/**
*
*/
int get_host(int& hid, SchedulerHostPool * hpool);
/**
* Function to write a Virtual Machine in an output stream
*/
friend ostream& operator<<(ostream& os, SchedulerVirtualMachine& vm);
private:
// -------------------------------------------------------------------------
// Friends
// -------------------------------------------------------------------------
friend class SchedulerVirtualMachinePool;
//--------------------------------------------------------------------------
struct Host
{
int hid;
float priority;
Host(int _hid):
hid(_hid),
priority(0){};
~Host(){};
bool operator<(const Host& b) { //Sort by priority
return priority < b.priority;
}
};
//--------------------------------------------------------------------------
/**
* Matching hosts
*/
vector<SchedulerVirtualMachine::Host *> hosts;
// -------------------------------------------------------------------------
// SQL functions do not modify the DB!
// -------------------------------------------------------------------------
int insert(SqliteDB *db);
int update(SqliteDB *db);
int drop(SqliteDB *db);
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
* The SchedulerHost class. It represents the scheduler version of the host,
* read only operation to the pool are allowed for the SchedulerHost class
*/
class SchedulerVirtualMachinePool : public PoolSQL
{
public:
SchedulerVirtualMachinePool(SqliteDB * db):PoolSQL(db){};
~SchedulerVirtualMachinePool(){};
int allocate(
PoolObjectSQL *objsql);
SchedulerVirtualMachine * get(
int oid,
bool lock)
{
return static_cast<SchedulerVirtualMachine *>(PoolSQL::get(oid,lock));
};
/**
* Set ups the VM pool by performing the following actions:
* - All the objects stored in the pool are flushed
* - The ids of the pendings VMs in the database are loaded
* @return 0 on success
*/
int set_up();
private:
friend class Scheduler;
/**
* The ids of the pending VMs
*/
vector<int> pending_vms;
PoolObjectSQL * create()
{
return new SchedulerVirtualMachine;
};
void bootstrap();
};
#endif /*SCHEDULER_VIRTUAL_MACHINE_H_*/

185
include/SqliteDB.h Normal file
View File

@ -0,0 +1,185 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 SQLITE_DB_H_
#define SQLITE_DB_H_
#include <string>
#include <sstream>
#include <stdexcept>
#include <sqlite3.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include "Log.h"
using namespace std;
/**
* SqliteDB class. Provides a wrapper to the sqlite3 database interface. It also
* provides "global" synchronization mechanism to use it in a multithread
* environment.
*/
class SqliteDB
{
public:
SqliteDB(
string& db_name,
Log::LogFunction _log = 0
):log(_log)
{
int rc;
pthread_mutex_init(&mutex,0);
rc = sqlite3_open(db_name.c_str(), &db);
if ( rc != SQLITE_OK )
{
throw runtime_error("Could not open database.");
}
};
~SqliteDB()
{
pthread_mutex_destroy(&mutex);
sqlite3_close(db);
};
/**
* Wraps the sqlite3_exec function call, and locks the DB mutex.
* @param sql_cmd the SQL command
* @param callbak function to execute on each data returned, watch the
* mutex you block in the callback.
* @param arg to pass to the callback function
* @return 0 on success
*/
int exec(
ostringstream& sql_cmd,
int (*callback)(void*,int,char**,char**)=0,
void * arg=0)
{
int rc;
const char * c_str;
string str;
int counter = 0;
char * err_msg;
char ** ptr = (log==0) ? 0 : &err_msg;
str = sql_cmd.str();
c_str = str.c_str();
lock();
do
{
counter++;
rc = sqlite3_exec(db, c_str, callback, arg, ptr);
if (rc == SQLITE_BUSY || rc == SQLITE_IOERR_BLOCKED)
{
struct timeval timeout;
fd_set zero;
FD_ZERO(&zero);
timeout.tv_sec = 0;
timeout.tv_usec = 100000;
select(0, &zero, &zero, &zero, &timeout);
}
}while( (rc == SQLITE_BUSY || rc == SQLITE_IOERR_BLOCKED) &&
(counter < 10));
unlock();
if (rc != SQLITE_OK)
{
if ((log != 0) && (err_msg != 0))
{
ostringstream oss;
oss << "SQL command was: " << c_str << ", error: " << err_msg;
log("ONE",Log::ERROR,oss,0);
sqlite3_free(err_msg);
}
return -1;
}
return 0;
};
/**
*
*/
int exec(
const char * sql_c_str,
int (*callback)(void*,int,char**,char**)=0,
void * arg=0)
{
string sql_str = sql_c_str;
ostringstream sql_cmd;
sql_cmd.str(sql_str);
return exec(sql_cmd,callback,arg);
};
private:
/**
* Fine-grain mutex for DB access
*/
pthread_mutex_t mutex;
/**
* Pointer to the database.
*/
sqlite3 * db;
/**
* Log facility
*/
Log::LogFunction log;
/**
* Function to lock the DB
*/
void lock()
{
pthread_mutex_lock(&mutex);
};
/**
* Function to unlock the DB
*/
void unlock()
{
pthread_mutex_unlock(&mutex);
};
};
#endif /*SQLITE_DB_H_*/

139
include/Template.h Normal file
View File

@ -0,0 +1,139 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 TEMPLATE_H_
#define TEMPLATE_H_
#include <iostream>
#include <map>
#include <vector>
#include "Attribute.h"
using namespace std;
/**
* Base class for file templates. A template is a file (or a tring for the
* matter of fact) containing a set of attribute definitions of the form:
* NAME = VALUE
* where NAME is a string representing the name of the attribute, and VALUE can
* be a single string or a vector value (array of string pairs). The file can
* contain several attributes with the same name.
*/
class Template
{
public:
Template(bool _replace_mode=false):replace_mode(_replace_mode){};
/**
* The class destructor frees all the attributes conforming the template
*/
virtual ~Template();
/**
* Parse a string representing the template, each attribute is inserted
* in the template class.
* @param parse_str string with template attributes
* @param error_msg error string, must be freed by the calling funtion.
* This string is null if no error occurred.
* @return 0 on success.
*/
int parse(const string &parse_str, char **error_msg);
/**
* Parse a template file.
* @param filename of the template file
* @param error_msg error string, must be freed by the calling funtion.
* This string is null if no error occurred.
* @return 0 on success.
*/
int parse(const char * filename, char **error_msg);
/**
* Marshall a template. This function generates a single string with the
* template attributes ("VAR=VAL<delim>...").
* @param str_tempalte string that hold the template
* @param delim to separate attributes
*/
void marshall(string &str, const char delim='\n');
/**
* Sets a new attribute, the attribute MUST BE ALLOCATED IN THE HEAP, and
* will be freed when the template destructor is called.
* @param attr pointer to the attribute
*/
virtual void set(Attribute * attr)
{
if ( replace_mode == true )
{
attributes.erase(attr->name());
}
attributes.insert(make_pair(attr->name(),attr));
};
/**
* Gets all the attributes with the given name.
* @param name the attribute name.
* @returns the number of elements in the vector
*/
virtual int get(
string& name,
vector<const Attribute*>& values) const;
/**
* Gets the value of a Single attributes (string) with the given name.
* @param name the attribute name.
* @param value the attribute value, a string, "" if the attribute is not
* defined or not Single
*/
virtual void get(
string& name,
string& value) const;
/**
* Gets the value of a Single attributes (int) with the given name.
* @param name the attribute name.
* @param value the attribute value, an int, 0 if the attribute is not
* defined or not Single
*/
virtual void get(
string& name,
int& value) const;
friend ostream& operator<<(ostream& os, Template& t);
protected:
/**
* The template attributes
*/
multimap<string,Attribute *> attributes;
private:
bool replace_mode;
/**
* Mutex to perform just one flex-bison parsing at a time
*/
static pthread_mutex_t mutex;
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
#endif /*TEMPLATE_H_*/

92
include/TemplateSQL.h Normal file
View File

@ -0,0 +1,92 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 TEMPLATE_SQL_H_
#define TEMPLATE_SQL_H_
#include <iostream>
#include <map>
#include <vector>
#include "Template.h"
#include "SqliteDB.h"
#include "ObjectSQL.h"
using namespace std;
/**
* SQL Template class, it provides DB support for template objects
*/
class TemplateSQL : public Template, public ObjectSQL
{
public:
TemplateSQL(
const char * _table,
int template_id = -1,
bool replace = false):
Template(replace),table(_table),id(template_id)
{};
virtual ~TemplateSQL(){};
protected:
//Database implementation variables
const char * table;
static const char * db_names;
//Template attributes
/**
* Template unique identification.
*/
int id;
/**
* Writes the template in the DB
* @param db pointer to the database.
* @return 0 on success.
*/
int insert(SqliteDB * db);
/**
* Updates the template in the DB
* @param db pointer to the database.
* @return 0 on success.
*/
int update(SqliteDB *db);
/**
* Reads the template (identified by its id) from the DB
* @param db pointer to the database.
* @return 0 on success.
*/
int select(SqliteDB *db);
/**
* Removes the template from the DB
* @param db pointer to the database.
*/
int drop(SqliteDB *db);
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
#endif /*TEMPLATE_SQL_H_*/

137
include/TransferManager.h Normal file
View File

@ -0,0 +1,137 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 TRANSFER_MANAGER_H_
#define TRANSFER_MANAGER_H_
#include "MadManager.h"
#include "ActionManager.h"
#include "VirtualMachinePool.h"
#include "LifeCycleManager.h"
using namespace std;
extern "C" void * tm_action_loop(void *arg);
class TransferManager : public MadManager, public ActionListener
{
public:
TransferManager(
VirtualMachinePool * pool,
vector<const Attribute*>& _mads):
MadManager(_mads),
hpool(pool)
{
am.addListener(this);
};
~TransferManager(){};
enum Actions
{
PROLOG,
EPILOG,
CHECKPOINT,
FINALIZE
};
/**
* Triggers specific actions to the Information Manager. This function
* wraps the ActionManager trigger function.
* @param action the IM action
* @param vid VM unique id. This is the argument of the passed to the
* invoked action.
*/
void trigger(
Actions action,
int vid);
/**
* This functions starts the associated listener thread, and creates a
* new thread for the Information Manager. This thread will wait in
* an action loop till it receives ACTION_FINALIZE.
* @return 0 on success.
*/
int start();
/**
* Loads Virtual Machine Manager Mads defined in configuration file
* @param uid of the user executing the driver. When uid is 0 the nebula
* identity will be used. Otherwise the Mad will be loaded through the
* sudo application.
*/
void load_mads(int uid){};
/**
* Gets the thread identification.
* @return pthread_t for the manager thread (that in the action loop).
*/
pthread_t get_thread_id() const
{
return tm_thread;
};
private:
/**
* Thread id for the Transfer Manager
*/
pthread_t tm_thread;
/**
* Pointer to the VM Pool, to access virtual machines
*/
VirtualMachinePool * hpool;
/**
* Action engine for the Manager
*/
ActionManager am;
/**
* Function to execute the Manager action loop method within a new pthread
* (requires C linkage)
*/
friend void * tm_action_loop(void *arg);
/**
* The action function executed when an action is triggered.
* @param action the name of the action
* @param arg arguments for the action function
*/
void do_action(
const string & action,
void * arg);
/**
* This function starts the prolog sequence
*/
void prolog_action(int vid);
/**
* This function starts the epilog sequence
*/
void epilog_action(int vid);
/**
* This function starts the epilog sequence
*/
void checkpoint_action(int vid);
};
#endif /*TRANSFER_MANAGER_H*/

775
include/VirtualMachine.h Normal file
View File

@ -0,0 +1,775 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 VIRTUAL_MACHINE_H_
#define VIRTUAL_MACHINE_H_
#include "VirtualMachineTemplate.h"
#include "PoolSQL.h"
#include "History.h"
#include "Log.h"
#include <time.h>
#include <sstream>
using namespace std;
extern "C" int vm_select_cb (void * _vm, int num,char ** values, char ** names);
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
* The Virtual Machine class. It represents a VM...
*/
class VirtualMachine : public PoolObjectSQL
{
public:
// ------------------------------------------------------------------------
// VM States
// ------------------------------------------------------------------------
/**
* Global Virtual Machine state
*/
enum VmState
{
INIT = 0,
PENDING = 1,
HOLD = 2,
ACTIVE = 3,
STOPPED = 4,
SUSPENDED = 5,
DONE = 6,
FAILED = 7
};
/**
* Virtual Machine state associated to the Life-cycle Manager
*/
enum LcmState
{
LCM_INIT = 0,
PROLOG = 1,
BOOT = 2,
RUNNING = 3,
MIGRATE = 4,
SAVE_STOP = 5,
SAVE_SUSPEND = 6,
SAVE_MIGRATE = 7,
PROLOG_MIGRATE = 8,
EPILOG_STOP = 9,
EPILOG = 10,
SHUTDOWN = 11,
CANCEL = 12
};
// ------------------------------------------------------------------------
// Log & Print
// ------------------------------------------------------------------------
/**
* writes a log message in vm.log. The class lock should be locked and
* the VM MUST BE obtained through the VirtualMachinePool get() method.
*/
void log(
const char * module,
const Log::MessageType type,
const ostringstream& message) const
{
if (_log != 0)
{
_log->log(module,type,message);
}
};
/**
* writes a log message in vm.log. The class lock should be locked and
* the VM MUST BE obtained through the VirtualMachinePool get() method.
*/
void log(
const char * module,
const Log::MessageType type,
const char * message) const
{
if (_log != 0)
{
_log->log(module,type,message);
}
};
/**
* Function to write a Virtual Machine in an output stream
*/
friend ostream& operator<<(ostream& os, VirtualMachine& vm);
// ------------------------------------------------------------------------
// Dynamic Info
// ------------------------------------------------------------------------
/**
* Updates VM dynamic information (id).
* @param _deploy_id the VMM driver specific id
*/
void update_info(
const string& _deploy_id)
{
deploy_id = _deploy_id;
};
/**
* Updates VM dynamic information (usage counters).
* @param _memory used by the VM (total)
* @param _cpu used by the VM (rate)
* @param _net_tx transmitted bytes (total)
* @param _net_tx received bytes (total)
*/
void update_info(
const int _memory,
const int _cpu,
const int _net_tx,
const int _net_rx)
{
if (_memory != -1)
{
memory = _memory;
}
if (_cpu != -1)
{
cpu = _cpu;
}
if (_net_tx != -1)
{
net_tx = _net_tx;
}
if (_net_rx != -1)
{
net_rx = _net_rx;
}
};
/**
* Returns the deployment ID
* @return the VMM driver specific ID
*/
const string& get_deploy_id() const
{
return deploy_id;
};
/**
* Sets the VM exit time
* @param _et VM exit time (when it arraived DONE/FAILED states)
*/
void set_exit_time(time_t et)
{
etime = et;
};
// ------------------------------------------------------------------------
// History
// ------------------------------------------------------------------------
/**
* Adds a new history record an writes it in the database
*/
void add_history(
int hid,
string& hostname,
string& vm_dir,
string& vmm_mad,
string& tm_mad);
/**
* Checks if the VM has a defined history record. This function
* MUST be called before using any history related function.
* @return true if the VM has a record
*/
bool hasHistory() const
{
return (history!=0);
};
/**
* Returns the VMM driver name for the current host. The hasHistory()
* function MUST be called before this one.
* @return the VMM mad name
*/
const string & get_vmm_mad() const
{
return history->vmm_mad_name;
};
/**
* Returns the TM driver name for the current host. The hasHistory()
* function MUST be called before this one.
* @return the TM mad name
*/
const string & get_tm_mad() const
{
return history->tm_mad_name;
};
/**
* Returns the deployment filename (local path). The hasHistory()
* function MUST be called before this one.
* @return the deployment filename
*/
const string & get_deployment_lfile() const
{
return history->deployment_lfile;
};
/**
* Returns the deployment filename for the current host (remote). The
* hasHistory() function MUST be called before this one.
* @return the deployment filename
*/
const string & get_deployment_rfile() const
{
return history->deployment_rfile;
};
/**
* Returns the checkpoint filename for the current host (remote). The
* hasHistory() function MUST be called before this one.
* @return the checkpoint filename
*/
const string & get_checkpoint_file() const
{
return history->checkpoint_file;
};
/**
* Returns the hostname for the current host. The hasHistory()
* function MUST be called before this one.
* @return the hostname
*/
const string & get_hostname() const
{
return history->hostname;
};
/**
* Get host id where the VM is or is going to execute. The hasHistory()
* function MUST be called before this one.
*/
int get_hid()
{
return history->hid;
}
/**
* Sets start time of a VM.
* @param _stime time when the VM started
*/
void set_stime(time_t _stime)
{
history->stime=_stime;
};
/**
* Sets end time of a VM.
* @param _etime time when the VM finished
*/
void set_etime(time_t _etime)
{
history->etime=_etime;
};
/**
* Sets start time of VM prolog.
* @param _stime time when the prolog started
*/
void set_prolog_stime(time_t _stime)
{
history->prolog_stime=_stime;
};
/**
* Sets end time of VM prolog.
* @param _etime time when the prolog finished
*/
void set_prolog_etime(time_t _etime)
{
history->prolog_etime=_etime;
};
/**
* Sets start time of VM running state.
* @param _stime time when the running state started
*/
void set_running_stime(time_t _stime)
{
history->running_stime=_stime;
};
/**
* Sets end time of VM running state.
* @param _etime time when the running state finished
*/
void set_running_etime(time_t _etime)
{
history->running_etime=_etime;
};
/**
* Sets start time of VM epilog.
* @param _stime time when the epilog started
*/
void set_epilog_stime(time_t _stime)
{
history->running_stime=_stime;
};
/**
* Sets end time of VM epilog.
* @param _etime time when the epilog finished
*/
void set_epilog_etime(time_t _etime)
{
history->running_etime=_etime;
};
/**
* Sets the reason that originated the VM migration
* @param _reason migration reason to leave this host
*/
void set_reason(History::MigrationReason _reason)
{
history->reason=_reason;
};
// ------------------------------------------------------------------------
// Template
// ------------------------------------------------------------------------
/**
* Gets the values of a template attribute
* @param name of the attribute
* @param values of the attribute
* @return the number of values
*/
int get_template_attribute(
string& name,
vector<const Attribute*>& values) const
{
return vm_template.get(name,values);
};
/**
* Gets the values of a template attribute
* @param name of the attribute
* @param values of the attribute
* @return the number of values
*/
int get_template_attribute(
const char *name,
vector<const Attribute*>& values) const
{
string str=name;
return vm_template.get(str,values);
};
/**
* Gets a string based VM attribute (single)
* @param name of the attribute
* @param value of the attribute (a string), will be "" if not defined or
* not a single attribute
*/
void get_template_attribute(
const char * name,
string& value) const
{
string str=name;
vm_template.get(str,value);
}
/**
* Gets an int based VM attribute (single)
* @param name of the attribute
* @param value of the attribute (an int), will be 0 if not defined or
* not a single attribute
*/
void get_template_attribute(
const char * name,
int& value) const
{
string str=name;
vm_template.get(str,value);
}
// ------------------------------------------------------------------------
// States
// ------------------------------------------------------------------------
/**
* Returns the VM state (Dispatch Manager)
* @return the VM state
*/
VmState get_state() const
{
return state;
};
/**
* Returns the VM state (life-cycle Manager)
* @return the VM state
*/
LcmState get_lcm_state() const
{
return lcm_state;
};
/**
* Sets VM state
* @param s state
*/
void set_state(VmState s)
{
state = s;
};
/**
* Sets VM LCM state
* @param s state
*/
void set_state(LcmState s)
{
lcm_state = s;
};
/**
* Gets the user id of the owner of this VM
* @return the VM uid
*/
int get_uid() const
{
return uid;
};
// ------------------------------------------------------------------------
// Timers
// ------------------------------------------------------------------------
/**
* Gets time from last information polling.
* @return time of last poll (epoch) or 0 if never polled
*/
time_t get_last_poll() const
{
return last_poll;
};
/**
* Sets time of last information polling.
* @param poll time in epoch, normally time(0)
*/
void set_last_poll(time_t poll)
{
last_poll = poll;
};
/**
* Get the VM physical requirements for the host.
* @param cpu
* @param memory
* @param disk
*/
void get_requirements (int& cpu, int& memory, int& disk);
private:
// -------------------------------------------------------------------------
// Friends
// -------------------------------------------------------------------------
friend class VirtualMachinePool;
friend int vm_select_cb (
void * _vm,
int num,
char ** values,
char ** names);
// *************************************************************************
// Virtual Machine Attributes
// *************************************************************************
// -------------------------------------------------------------------------
// Identification variables
// -------------------------------------------------------------------------
/**
* Array id
*/
int aid;
/**
* Task id
*/
int tid;
/**
* User (owner) id
*/
int uid;
// -------------------------------------------------------------------------
// VM Scheduling & Managing Information
// -------------------------------------------------------------------------
/**
* Static scheduling priority
*/
int priority;
/**
* The VM reschedule flag
*/
bool reschedule;
/**
* Last time (in epoch) that the VM was rescheduled
*/
time_t last_reschedule;
/**
* Last time (in epoch) that the VM was polled to get its status
*/
time_t last_poll;
// -------------------------------------------------------------------------
// Virtual Machine Description
// -------------------------------------------------------------------------
/**
* The Virtual Machine template, holds the VM attributes.
*/
VirtualMachineTemplate vm_template;
// Dynamic state of the Virtual Machine
/**
* The state of the virtual machine.
*/
VmState state;
/**
* The state of the virtual machine (in the Life-cycle Manager).
*/
LcmState lcm_state;
/**
* Start time, the VM enter the nebula system (in epoch)
*/
time_t stime;
/**
* Exit time, the VM leave the nebula system (in epoch)
*/
time_t etime;
/**
* Deployment specific identification string, as returned by the VM driver
*/
string deploy_id;
/**
* Memory in Megabytes used by the VM
*/
int memory;
/**
* CPU usage (percent)
*/
int cpu;
/**
* Network usage, transmitted Kilobytes
*/
int net_tx;
/**
* Network usage, received Kilobytes
*/
int net_rx;
/**
* History record, for the current execution
*/
History * history;
// -------------------------------------------------------------------------
// Logging
// -------------------------------------------------------------------------
/**
* Log class for the virtual machine, it writes log messages in
* $ONE_LOCATION/var/$VID/vm.log
*/
Log * _log;
// *************************************************************************
// DataBase implementation (Private)
// *************************************************************************
/**
* Bootstraps the database table(s) associated to the VirtualMachine
*/
static void bootstrap(SqliteDB * db)
{
db->exec(VirtualMachine::db_bootstrap);
db->exec(VirtualMachineTemplate::db_bootstrap);
db->exec(History::db_bootstrap);
};
/**
* Function to unmarshall a VM object, an associated classes.
* @param num the number of columns read from the DB
* @para names the column names
* @para vaues the column values
* @return 0 on success
*/
int unmarshall(int num, char **names, char ** values);
/**
* Updates the VM history record
* @param db pointer to the db
* @return 0 on success
*/
int update_history(SqliteDB * db)
{
if ( history != 0 )
{
return history->insert(db);
}
else
return -1;
};
/**
* Sets the value of a column of the previous VM history record
* @param db pointer to the db
* @return 0 on success
*/
int update_previous_history_column(
SqliteDB * db,
const History::ColNames column,
const time_t val);
/**
* Gets the value of a column of the previous VM history record
* @param db pointer to the db
* @return 0 on success
*/
int select_previous_history_column(
SqliteDB * db,
const History::ColNames column,
string * value);
/**
* Gets the hid of the previous history host
*/
int get_previous_hid(SqliteDB * db, int * hid);
protected:
//**************************************************************************
// Constructor
//**************************************************************************
VirtualMachine(int id=-1);
virtual ~VirtualMachine();
// *************************************************************************
// DataBase implementation
// *************************************************************************
enum ColNames
{
OID = 0,
AID = 1,
TID = 2,
UID = 3,
PRIORITY = 4,
RESCHEDULE = 5,
LAST_RESCHEDULE = 6,
LAST_POLL = 7,
TEMPLATE_ID = 8,
STATE = 9,
LCM_STATE = 10,
STIME = 11,
ETIME = 12,
DEPLOY_ID = 13,
MEMORY = 14,
CPU = 15,
NET_TX = 16,
NET_RX = 17,
LIMIT = 18
};
static const char * table;
static const char * db_names;
static const char * db_bootstrap;
/**
* Reads the Virtual Machine (identified with its OID) from the database.
* @param db pointer to the db
* @return 0 on success
*/
int select(SqliteDB * db);
/**
* Writes the Virtual Machine and its associated template in the database.
* @param db pointer to the db
* @return 0 on success
*/
virtual int insert(SqliteDB * db);
/**
* Writes/updates the Virtual Machine data fields in the database.
* @param db pointer to the db
* @return 0 on success
*/
virtual int update(SqliteDB * db);
/**
* Deletes a VM from the database and all its associated information:
* - History records
* - VM template
* @param db pointer to the db
* @return 0 on success
*/
virtual int drop(SqliteDB * db)
{
int rc;
rc = vm_template.drop(db);
if ( history != 0 )
{
rc += history->drop(db);
}
return rc;
}
};
#endif /*VIRTUAL_MACHINE_H_*/

View File

@ -0,0 +1,223 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 VIRTUAL_MACHINE_MANAGER_H_
#define VIRTUAL_MACHINE_MANAGER_H_
#include "MadManager.h"
#include "ActionManager.h"
#include "VirtualMachineManagerDriver.h"
#include "VirtualMachinePool.h"
#include "HostPool.h"
#include "NebulaTemplate.h"
using namespace std;
extern "C" void * vmm_action_loop(void *arg);
class VirtualMachineManager : public MadManager, public ActionListener
{
public:
VirtualMachineManager(
VirtualMachinePool * _vmpool,
HostPool * _hpool,
time_t _timer_period,
time_t _poll_period,
vector<const Attribute*>& _mads);
~VirtualMachineManager(){};
enum Actions
{
DEPLOY,
SAVE,
SHUTDOWN,
CANCEL,
MIGRATE,
RESTORE,
TIMER,
FINALIZE
};
/**
* Triggers specific actions to the Virtual Machine Manager. This function
* wraps the ActionManager trigger function.
* @param action the VMM action
* @param vid VM unique id. This is the argument of the passed to the
* invoked action.
*/
void trigger(
Actions action,
int vid);
/**
* This functions starts the associated listener thread, and creates a
* new thread for the Virtual Machine Manager. This thread will wait in
* an action loop till it receives ACTION_FINALIZE.
* @return 0 on success.
*/
int start();
/**
* Gets the thread identification.
* @return pthread_t for the manager thread (that in the action loop).
*/
pthread_t get_thread_id() const
{
return vmm_thread;
};
/**
* Loads Virtual Machine Manager Mads defined in configuration file
* @param uid of the user executing the driver. When uid is 0 the nebula
* identity will be used. Otherwise the Mad will be loaded through the
* sudo application.
*/
void load_mads(int uid);
private:
/**
* Thread id for the Virtual Machine Manager
*/
pthread_t vmm_thread;
/**
* Pointer to the Virtual Machine Pool, to access VMs
*/
VirtualMachinePool * vmpool;
/**
* Pointer to the Host Pool, to access hosts
*/
HostPool * hpool;
/**
* Timer period for the Virtual Machine Manager.
*/
time_t timer_period;
/**
* Virtual Machine polling interval
*/
time_t poll_period;
/**
* Action engine for the Manager
*/
ActionManager am;
/**
* Function to execute the Manager action loop method within a new pthread
* (requires C linkage)
*/
friend void * vmm_action_loop(void *arg);
/**
* Returns a pointer to a Virtual Machine Manager driver.
* @param uid of the owner of the driver
* @param name of an attribute of the driver (e.g. its type)
* @param value of the attribute
* @return the VM driver owned by uid with attribute name equal to value
* or 0 in not found
*/
const VirtualMachineManagerDriver * get(
int uid,
const string& name,
const string& value)
{
return static_cast<const VirtualMachineManagerDriver *>
(MadManager::get(uid,name,value));
};
/**
* Returns a pointer to a Virtual Machine Manager driver. The driver is
* searched by its name.
* @param uid of the owner of the driver
* @param name the name of the driver
* @return the VM driver owned by uid with attribute name equal to value
* or 0 in not found
*/
const VirtualMachineManagerDriver * get(
int uid,
const string& name)
{
string _name("NAME");
return static_cast<const VirtualMachineManagerDriver *>
(MadManager::get(uid,_name,name));
};
/**
* The action function executed when an action is triggered.
* @param action the name of the action
* @param arg arguments for the action function
*/
void do_action(
const string & action,
void * arg);
/**
* Function executed when a DEPLOY action is received. It deploys a VM on
* a Host.
* @param vid the id of the VM to be deployed.
*/
void deploy_action(
int vid);
/**
* Function to stop a running VM and generate a checkpoint file. This
* function is executed when a SAVE action is triggered.
* @param vid the id of the VM.
*/
void save_action(
int vid);
/**
* Shutdowns a VM when a SHUTDOWN action is received.
* @param vid the id of the VM.
*/
void shutdown_action(
int vid);
/**
* Cancels a VM when a CANCEL action is received.
* @param vid the id of the VM.
*/
void cancel_action(
int vid);
/**
* Function to migrate (live) a VM (MIGRATE action).
* @param vid the id of the VM.
*/
void migrate_action(
int vid);
/**
* Restores a VM from a checkpoint file.
* @param vid the id of the VM.
*/
void restore_action(
int vid);
/**
* This function is executed periodically to poll the running VMs
*/
void timer_action();
};
#endif /*VIRTUAL_MACHINE_MANAGER_H*/

View File

@ -0,0 +1,214 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 VIRTUAL_MACHINE_MANAGER_DRIVER_H_
#define VIRTUAL_MACHINE_MANAGER_DRIVER_H_
#include <map>
#include <string>
#include <sstream>
#include "Mad.h"
#include "VirtualMachinePool.h"
using namespace std;
/**
* VirtualMachineManagerDriver provides a base class to implement VM Manager
* Drivers. This class implements the protocol and recover functions
* from the Mad interface. Classes derived from the VirtualMachineManagerDriver
* must implement the deployment function to generate specific VM
* deployment information for the unerlying MAD.
*/
class VirtualMachineManagerDriver : public Mad
{
public:
VirtualMachineManagerDriver(
int userid,
const map<string,string>& attrs,
bool sudo,
VirtualMachinePool * pool):
Mad(userid,attrs,sudo),vmpool(pool)
{}
;
virtual ~VirtualMachineManagerDriver()
{}
;
/**
* Implements the VM Manager driver protocol.
* @param message the string read from the driver
*/
void protocol(
string& message);
/**
* TODO: What do we need here? just poll the active VMs to recover
* connections? Or an specific recover action from the MAD?
*/
void recover();
/**
* Generates a driver-specific deployment file:
* @param vm pointer to a virtual machine
* @param file_name to generate the deployment description
* @return 0 on success
*/
virtual int deployment_description(
const VirtualMachine * vm,
const string& file_name) const = 0;
private:
/**
* Pointer to the Virtual Machine Pool, to access VMs
*/
VirtualMachinePool * vmpool;
friend class VirtualMachineManager;
/**
* Sends a deploy request to the MAD: "DEPLOY ID HOST CONF -"
* @param oid the virtual machine id.
* @param host the hostname
* @param conf the filename of the deployment file
*/
void deploy (
const int oid,
const string& host,
const string& conf) const;
/**
* Sends a shutdown request to the MAD: "SHUTDOWN ID HOST NAME -"
* @param oid the virtual machine id.
* @param host the hostname
* @param name of the Virtual Machine (deployment id), as returned by the
* driver
*/
void shutdown (
const int oid,
const string& host,
const string& name) const;
/**
* Sends a cancel request to the MAD: "CANCEL ID HOST NAME -"
* @param oid the virtual machine id.
* @param host the hostname
* @param name of the Virtual Machine (deployment id), as returned by the
* driver
*/
void cancel (
const int oid,
const string& host,
const string& name) const;
/**
* Sends a checkpoint request to the MAD: "CHECKPOINT ID HOST NAME FILE"
* @param oid the virtual machine id.
* @param host the hostname
* @param name of the Virtual Machine (deployment id), as returned by the
* driver
* @param file the filename to generate the checkpoint file
*/
void checkpoint (
const int oid,
const string& host,
const string& name,
const string& file) const;
/**
* Sends a save request to the MAD: "SAVE ID HOST NAME FILE"
* @param oid the virtual machine id.
* @param host the hostname
* @param name of the Virtual Machine (deployment id), as returned by the
* driver
* @param file the filename to generate the checkpoint file
*/
void save (
const int oid,
const string& host,
const string& name,
const string& file) const;
/**
* Sends a save request to the MAD: "RESTORE ID HOST FILE -"
* @param oid the virtual machine id.
* @param host the hostname
* @param file the filename of the checkpoint file to restore the VM
* from
*/
void restore (
const int oid,
const string& host,
const string& file) const;
/**
* Sends a migrate request to the MAD: "MIGRATE ID HOST NAME DEST"
* @param oid the virtual machine id.
* @param shost the original host (source)
* @param name of the Virtual Machine (deployment id), as returned by the
* driver
* @param dhost the destination host
*/
void migrate (
const int oid,
const string& shost,
const string& name,
const string& dhost) const;
/**
* Sends a poll request to the MAD: "POLL ID HOST NAME -"
* @param oid the virtual machine id.
* @param host the hostname
* @param name of the Virtual Machine (deployment id), as returned by the
* driver
*/
void poll (
const int oid,
const string& host,
const string& name) const;
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
class KvmDriver : public VirtualMachineManagerDriver
{
public:
KvmDriver(
int userid,
const map<string,string> &attrs,
bool sudo,
VirtualMachinePool * pool):
VirtualMachineManagerDriver(userid, attrs,sudo,pool)
{};
~KvmDriver(){};
private:
int deployment_description(
const VirtualMachine * vm,
const string& file_name) const
{
return 0;
};
};
#endif /*VIRTUAL_MACHINE_MANAGER_DRIVER_H_*/

View File

@ -0,0 +1,133 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 VIRTUAL_MACHINE_POOL_H_
#define VIRTUAL_MACHINE_POOL_H_
#include "PoolSQL.h"
#include "VirtualMachine.h"
#include <time.h>
using namespace std;
/**
* The Virtual Machine Pool class. ...
*/
class VirtualMachinePool : public PoolSQL
{
public:
VirtualMachinePool(SqliteDB * db):PoolSQL(db,VirtualMachine::table){};
~VirtualMachinePool(){};
/**
* Function to allocate a new VM object
* @param uid user id (the owner of the VM)
* @param stemplate a string describing the VM
* @param oid the id assigned to the VM (output)
* @param on_hold flag to submit on hold
* @return 0 on success, -1 error inserting in DB or -2 error parsing
* the template
*/
int allocate (
int uid,
const string& stemplate,
int * oid,
bool on_hold = false);
/**
* Function to get a VM from the pool, if the object is not in memory
* it is loade from the DB
* @param oid VM unique id
* @param lock locks the VM mutex
* @return a pointer to the VM, 0 if the VM could not be loaded
*/
VirtualMachine * get(
int oid,
bool lock)
{
return static_cast<VirtualMachine *>(PoolSQL::get(oid,lock));
};
/**
* Function to get the IDs of running VMs
* @param oids a vector that contains the IDs
* @return 0 on success
*/
int get_running(
vector<int>& oids);
/**
* Function to get the IDs of pending VMs
* @param oids a vector that contains the IDs
* @return 0 on success
*/
int get_pending(
vector<int>& oids);
//--------------------------------------------------------------------------
// Virtual Machine DB access functions
//--------------------------------------------------------------------------
/**
* Updates the history record of a VM, the lock of the vm SHOULD be locked
* @param vm pointer to the virtual machine object
* @return 0 on success
*/
int update_history(
VirtualMachine * vm)
{
return vm->update_history(db);
}
/**
* Get the ID of the previous host
* @param vm pointer to the virtual machine object
* @param hid the ID of the host
* @return 0 on success
*/
int get_previous_hid(
VirtualMachine * vm,
int * hid)
{
return vm->get_previous_hid(db,hid);
};
/**
* Bootstraps the database table(s) associated to the VirtualMachine pool
*/
void bootstrap()
{
VirtualMachine::bootstrap(db);
};
private:
/**
* Factory method to produce VM objects
* @return a pointer to the new VM
*/
PoolObjectSQL * create()
{
return new VirtualMachine;
};
};
#endif /*VIRTUAL_MACHINE_POOL_H_*/

View File

@ -0,0 +1,47 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 VIRTUAL_MACHINE_TEMPLATE_H_
#define VIRTUAL_MACHINE_TEMPLATE_H_
#include "TemplateSQL.h"
using namespace std;
/**
* Virtual Machine Template class, it represents a VM configuration file.
*/
class VirtualMachineTemplate : public TemplateSQL
{
public:
VirtualMachineTemplate(int tid = -1):
TemplateSQL(table,tid){};
~VirtualMachineTemplate(){};
private:
friend class VirtualMachine;
static const char * table;
static const char * db_bootstrap;
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
#endif /*VIRTUAL_MACHINE_TEMPLATE_H_*/

114
include/XenDriver.h Normal file
View File

@ -0,0 +1,114 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 XEN_DRIVER_H_
#define XEN_DRIVER_H_
#include <map>
#include <string>
#include <sstream>
#include "Nebula.h"
#include "VirtualMachineManagerDriver.h"
using namespace std;
/**
* Xen Driver class implements a VM Manager Driver to interface with the Xen
* hypervisor.
*/
class XenDriver : public VirtualMachineManagerDriver
{
public:
XenDriver(
int userid,
const map<string,string> &attrs,
bool sudo,
VirtualMachinePool * pool):
VirtualMachineManagerDriver(userid, attrs,sudo,pool)
{
map<string,string>::const_iterator it;
char * error_msg = 0;
const char * cfile;
string file;
int rc;
ostringstream oss;
it = attrs.find("DEFAULT");
if ( it != attrs.end() )
{
if (it->second[0] != '/') //Look in ONE_LOCATION
{
Nebula& nd = Nebula::instance();
file = nd.get_nebula_location() + "/" + it->second;
cfile = file.c_str();
}
else //Absolute Path
{
cfile = it->second.c_str();
}
rc = xen_conf.parse(cfile, &error_msg);
if (( rc != 0 ) && ( error_msg != 0))
{
oss << "Error loading xen driver configuration file: "
<< error_msg;
Nebula::log("VMM", Log::ERROR, oss);
free(error_msg);
}
}
};
~XenDriver(){};
private:
/**
* Configuration file for the driver
*/
Template xen_conf;
/**
* Generates a configuration attr from driver configuration file
* @param name of config attribute for the domain
* @param value of the attribute
*/
void get_default(
const char * name,
string& value) const
{
string sn = name;
xen_conf.get(sn,value);
}
/**
* Generates a xen-specific deployment file seexmdomain.cfg(5):
* @param vm pointer to a virtual machine
* @param file_name to generate the deployment description
* @return 0 on success
*/
int deployment_description(
const VirtualMachine * vm,
const string& file_name) const;
};
#endif /*XEN_DRIVER_H_*/

63
install.sh Executable file
View File

@ -0,0 +1,63 @@
#!/bin/sh
SRC_DIR=$PWD
DST_DIR=$1
echo $SRC_DIR
echo $DST_DIR
inst_ln() {
ln -s $SRC_DIR/$1 $DST_DIR/$2
}
inst_cp() {
cp $SRC_DIR/$1 $DST_DIR/$2
}
if [ -z "$SRC_DIR" -o -z "$DST_DIR" ]; then
echo Must supply a destination directory
exit -1
fi
DIRS="/bin /etc /etc/mad /etc/default /libexec /lib/ruby /var /share/examples /lib/im_probes"
for d in $DIRS; do
mkdir -p $DST_DIR$d
done
inst_ln src/nebula/oned bin
inst_ln src/scheduler/mm_sched bin
inst_ln src/client/ruby/onevm bin
inst_ln src/client/ruby/onehost bin
inst_cp share/etc/oned.conf etc
inst_ln share/etc/mad/defaultrc etc/mad
inst_ln share/etc/mad/im_sshrc etc/mad
inst_ln share/etc/mad/vmm_xenrc etc/mad
inst_ln share/etc/default/vmm_xen.conf etc/default
inst_ln share/scripts/madcommon.sh libexec
inst_ln src/vmm_mad/xen/one_vmm_xen.rb bin
inst_ln src/vmm_mad/xen/one_vmm_xen bin
inst_ln src/im_mad/xen/one_im_ssh.rb bin
inst_ln src/im_mad/xen/one_im_ssh bin
inst_cp src/im_mad/xen/one_im_ssh.conf etc
inst_ln src/vmm_mad/xen/one_mad.rb lib/ruby
inst_ln src/im_mad/xen/one_ssh.rb lib/ruby
inst_ln src/client/ruby/one.rb lib/ruby
inst_ln src/client/ruby/client_utilities.rb lib/ruby
inst_ln src/client/ruby/command_parse.rb lib/ruby
inst_ln src/im_mad/xen/architecture.sh lib/im_probes
inst_ln src/im_mad/xen/cpu.sh lib/im_probes
inst_ln src/im_mad/xen/name.sh lib/im_probes
inst_ln src/im_mad/xen/xen.rb lib/im_probes
inst_cp share/scripts/one bin
inst_cp share/examples/vm.template share/examples

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -0,0 +1,429 @@
<?xml version="1.0" encoding="UTF-8"?>
<XMI xmlns:UML="http://schema.omg.org/spec/UML/1.3" verified="false" timestamp="2008-01-24T17:04:49" xmi.version="1.2" >
<XMI.header>
<XMI.documentation>
<XMI.exporter>umbrello uml modeller http://uml.sf.net</XMI.exporter>
<XMI.exporterVersion>1.5.8</XMI.exporterVersion>
<XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding>
</XMI.documentation>
<XMI.metamodel xmi.name="UML" href="UML.xml" xmi.version="1.3" />
</XMI.header>
<XMI.content>
<UML:Model isSpecification="false" isLeaf="false" isRoot="false" xmi.id="m1" isAbstract="false" name="UML Model" >
<UML:Namespace.ownedElement>
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="folder" isRoot="false" isAbstract="false" name="folder" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="datatype" isRoot="false" isAbstract="false" name="datatype" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="interface" isRoot="false" isAbstract="false" name="interface" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="ActionListener" isRoot="false" isAbstract="false" name="ActionListener" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="enum" isRoot="false" isAbstract="false" name="enum" />
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Logical View" isRoot="false" isAbstract="false" name="Logical View" >
<UML:Namespace.ownedElement>
<UML:Package stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="Datatypes" isRoot="false" isAbstract="false" name="Datatypes" >
<UML:Namespace.ownedElement>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="bqKIZpHLv42H" isRoot="false" isAbstract="false" name="int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="oRTstiC5X0HW" isRoot="false" isAbstract="false" name="char" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="BKzfuxuVlEmK" isRoot="false" isAbstract="false" name="bool" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="41ex5eEr4fjx" isRoot="false" isAbstract="false" name="float" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Nu2tsIN4aMhU" isRoot="false" isAbstract="false" name="double" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Hby3oiLsjxpm" isRoot="false" isAbstract="false" name="short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="c2eghLb5Fcw6" isRoot="false" isAbstract="false" name="long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="sJASdpuvRqwF" isRoot="false" isAbstract="false" name="unsigned int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="WF5DDs0nucRc" isRoot="false" isAbstract="false" name="unsigned short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="x2fBcbHSsPuV" isRoot="false" isAbstract="false" name="unsigned long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="EnOdbIq8WtLj" isRoot="false" isAbstract="false" name="string" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="FRk6rIA1W1VM" isRoot="false" isAbstract="false" name="sqlite3 *" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="XMIKc2o5J6Nu" isRoot="false" isAbstract="false" name="ActionListener *" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="WUJUz2wkP4qL" isRoot="false" isAbstract="false" name="map&lt;int,ObjectSQL*>" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="XNuw315mXeUm" isRoot="false" isAbstract="false" name="ObjectSQL *" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="vy53e946a47C" isRoot="false" isAbstract="false" name="undef" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="KOw9slpUVSCK" />
</UML:GeneralizableElement.generalization>
</UML:DataType>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="mxryNx8LdqSJ" isRoot="false" isAbstract="false" name="map&lt;int,attribute>" elementReference="qTRhqpQ0PE3f" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="GEL6a9ZVYNMe" isRoot="false" isAbstract="false" name="map&lt;string,attribute>" />
</UML:Namespace.ownedElement>
</UML:Package>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ruL8hEHJf71m" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="yt6cBNUrjmYX" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="d3tJqhM02fUW" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="hjipPCuUAVPQ" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="Y6jK2nmMJdZT" aggregation="composite" type="vy53e946a47C" name="" multiplicity="1" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="kqqfD8AWfUhF" aggregation="none" type="vy53e946a47C" name="" multiplicity="0..*" />
</UML:Association.connection>
</UML:Association>
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="DCXqsURB7Car" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="VvRc5zSWiu2N" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Gq5yk7K4083P" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="eHdeNg3WcYlX" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Are2UTPMWnQH" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="BH4YBlYQlPkv" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="qvPqLxAjSVdV" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="CwDiWUhJndUK" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="JyDAUROPZKuE" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="GrOZjIIJcVwX" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ZPsL0MdKjRuq" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="whTwtpzZjWr4" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="wqmkJO2r35Lz" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Generalization isSpecification="false" child="vy53e946a47C" visibility="public" namespace="Logical View" xmi.id="KOw9slpUVSCK" parent="vy53e946a47C" discriminator="" name="" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Zew276Kva1UC" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="Orf1c6UUuOnp" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="qLBqeQIn2wFp" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="8OffyHH7J51e" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="URW6V0YHrpxc" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="4CeIAIy67iS4" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="rLzAQznN0fxo" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="1LmgSAS4HrMR" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="Z9hZsMkOOqR8" aggregation="none" type="vy53e946a47C" name="" multiplicity="2" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="N2IAYOSx9uEH" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="3EpSM3LcDD0s" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="8vpNJkCHGdbQ" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="adQpG9tPizWw" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="1ACRWhTEcsaP" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="YzTkuZMuQTei" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="iNuf7uC50BLw" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="FTcjgY1ruC0v" isRoot="false" isAbstract="false" name="ObjectSQL" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="1oS3xv31KiB4" type="bqKIZpHLv42H" name="oid" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="ixTgs2fhSgcN" type="ypAsly1Z2KtR" name="mutex" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="nbM2o3ajdhrk" isRoot="false" isAbstract="false" isQuery="false" name="lock" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="cYMrUig7UHTW" isRoot="false" isAbstract="false" isQuery="false" name="unlock" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="IDwc2QJgWnvx" isRoot="false" isAbstract="true" isQuery="false" name="select" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="XAJL1i0cYd38" value="" type="FRk6rIA1W1VM" name="db" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="M1RmI6G51EM0" isRoot="false" isAbstract="true" isQuery="false" name="insert" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="t0UviVXF8YLM" value="" type="FRk6rIA1W1VM" name="db" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="QzClxwWHdfMc" isRoot="false" isAbstract="false" name="PoolSQL" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="ufg9C6NNEIhF" type="bqKIZpHLv42H" name="lastOID" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="FZr0VlUmM86y" type="WUJUz2wkP4qL" name="pool" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="ItJ2xkSJdUgP" type="FRk6rIA1W1VM" name="db" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="private" xmi.id="nTmQ2dvvUMVn" isRoot="false" isAbstract="true" isQuery="false" name="initLastOID" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="private" xmi.id="vcv2H4PsHW1N" isRoot="false" isAbstract="true" isQuery="false" name="create" >
<UML:BehavioralFeature.parameter>
<UML:Parameter kind="return" xmi.id="xOMjFuuBaxiB" type="XNuw315mXeUm" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="tZBwi4Zb7qdU" isRoot="false" isAbstract="false" isQuery="false" name="allocate" >
<UML:BehavioralFeature.parameter>
<UML:Parameter kind="return" xmi.id="caYspxUlaybN" type="bqKIZpHLv42H" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="gGjXn5Sh8Rku" value="" type="XNuw315mXeUm" name="obj" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="4HEQcydWqn6n" isRoot="false" isAbstract="false" isQuery="false" name="get" >
<UML:BehavioralFeature.parameter>
<UML:Parameter kind="return" xmi.id="XWMuNb4DpWFh" type="XNuw315mXeUm" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="JCfn5YzTBFJW" value="" type="bqKIZpHLv42H" name="oid" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="rGU4tF7PEYbS" value="" type="BKzfuxuVlEmK" name="lock" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="3a0CTjhkgTis" client="QzClxwWHdfMc" name="" supplier="FTcjgY1ruC0v" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="fvsi8gCLNwfR" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="ZBJB2v6gLVcX" aggregation="aggregate" type="QzClxwWHdfMc" name="" />
<UML:AssociationEnd isSpecification="false" visibility="private" changeability="changeable" isNavigable="true" xmi.id="8XGGZCrdFXKT" aggregation="none" type="FTcjgY1ruC0v" name="pool" multiplicity="0..*" />
</UML:Association.connection>
</UML:Association>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="KCAGyFqIpgL0" isRoot="false" isAbstract="false" name="HostPool" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="udobO5QNil4Q" />
</UML:GeneralizableElement.generalization>
</UML:Class>
<UML:Generalization isSpecification="false" child="KCAGyFqIpgL0" visibility="public" namespace="Logical View" xmi.id="udobO5QNil4Q" parent="QzClxwWHdfMc" discriminator="" name="" />
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="7a8pQxuHOv3I" isRoot="false" isAbstract="false" name="Host" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="JLylJCkYo23X" />
</UML:GeneralizableElement.generalization>
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="I1swDie713Rd" type="HyJpS3PRU1Kj" name="host_share" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="c5qYO6nEljFF" type="bqKIZpHLv42H" name="hid" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="1MY8bxtpD5th" type="XnOFdBKmjtR7" name="state" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="8OIBpnNF0XZq" type="bqKIZpHLv42H" name="priority" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="VbsVKF15i6Mi" type="EnOdbIq8WtLj" name="architecture" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="ew8zcUmtkgcP" type="EnOdbIq8WtLj" name="os_name" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="3PdGaDlK2Uzr" type="bqKIZpHLv42H" name="total_memory" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="H7cCa0QFpDNG" type="bqKIZpHLv42H" name="total_cpu" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="w8devVikl5py" type="bqKIZpHLv42H" name="total_disk" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="DXMEN8pii4Cj" type="EnOdbIq8WtLj" name="host_name" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="PZA3dkog5B6m" type="EnOdbIq8WtLj" name="hsids" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="lX5LM8I9rtTK" type="EnOdbIq8WtLj" name="im_mad_name" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="6mT8lxAGFePd" type="EnOdbIq8WtLj" name="vmm_mad_name" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="nDXK70d0bxjQ" type="EnOdbIq8WtLj" name="tm_mad_name" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="7VpVPFUEJehC" type="bqKIZpHLv42H" name="last_monitored" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="nBB6uMUPKrXW" type="BKzfuxuVlEmK" name="managed" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="3BzSn2NOZCa5" type="bqKIZpHLv42H" name="used_cpu" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="j8n0ANGE2Flw" type="bqKIZpHLv42H" name="used_mem" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="L6SuSVdW2yf9" type="bqKIZpHLv42H" name="total_tx" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="UQv6vjPbRSak" type="bqKIZpHLv42H" name="total_rx" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="3hebSdUOoDAF" isRoot="false" isAbstract="false" isQuery="false" name="select" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="a1xZbOKW0R5l" value="" type="FRk6rIA1W1VM" name="db" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="4ICQgXHT7GOe" isRoot="false" isAbstract="false" isQuery="false" name="insert" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="fy1W6wbM6z0d" value="" type="FRk6rIA1W1VM" name="db" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Generalization isSpecification="false" child="7a8pQxuHOv3I" visibility="public" namespace="Logical View" xmi.id="JLylJCkYo23X" parent="FTcjgY1ruC0v" discriminator="" name="" />
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="HyJpS3PRU1Kj" isRoot="false" isAbstract="false" name="HostShare" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="Ohg27xO6qIdN" type="EnOdbIq8WtLj" name="endpoint" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="BkamrGWMLBTQ" type="bqKIZpHLv42H" name="disk_usage" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="GvkksWUTDab7" type="bqKIZpHLv42H" name="mem_usage" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="cthYsJ7wlMRC" type="bqKIZpHLv42H" name="cpu_usage" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="IdzKZvzzWd9Q" type="bqKIZpHLv42H" name="running_vms" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="FNiVnWcqKBZV" type="bqKIZpHLv42H" name="max_cpu" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="32EW7SZjmCLV" type="bqKIZpHLv42H" name="max_disk" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="Mbi2hAylDV96" type="bqKIZpHLv42H" name="max_mem" />
</UML:Classifier.feature>
</UML:Class>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Kq40rRjmpqxB" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="gOcLS1EuyN17" aggregation="composite" type="HyJpS3PRU1Kj" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="SQxJtbAK679L" aggregation="none" type="7a8pQxuHOv3I" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="F77Ohxt9mWLc" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="NrPthDxNz2o9" aggregation="composite" type="HyJpS3PRU1Kj" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="ro3FF4GWsGTe" aggregation="none" type="7a8pQxuHOv3I" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="SlsDHDpgpvdB" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="xfx7DdZofIoE" aggregation="composite" type="7a8pQxuHOv3I" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="AJ4UUFRFEDAt" aggregation="none" type="HyJpS3PRU1Kj" name="template" multiplicity="1" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="XhoKcPVkULbi" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="rcaHLoglzNyt" aggregation="composite" type="7a8pQxuHOv3I" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="kTqu5N5FjK3w" aggregation="none" type="vy53e946a47C" name="history" multiplicity="1" />
</UML:Association.connection>
</UML:Association>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="m0Kw7a2RrIht" isRoot="false" isAbstract="false" name="time_t" />
<UML:Enumeration stereotype="enum" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="XnOFdBKmjtR7" isRoot="false" isAbstract="false" name="HOST_STATE" >
<UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="XnOFdBKmjtR7" xmi.id="ZrmvfBSRZf4i" isRoot="false" isAbstract="false" name="HOST_STATE_INIT" />
<UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="XnOFdBKmjtR7" xmi.id="Y7c7TYooZL09" isRoot="false" isAbstract="false" name="HOST_STATE_MONITORING" />
<UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="XnOFdBKmjtR7" xmi.id="ElBpOUB6gSC0" isRoot="false" isAbstract="false" name="HOST_STATE_MONITORED" />
</UML:Enumeration>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="qTRhqpQ0PE3f" isRoot="false" isAbstract="false" name="map" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="NbGlbdxcIjX9" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="false" xmi.id="nuWa8QAqGKwa" aggregation="none" type="KCAGyFqIpgL0" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="9KjGADpQa3uX" aggregation="none" type="7a8pQxuHOv3I" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="ypAsly1Z2KtR" isRoot="false" isAbstract="false" name="pthread_mutex_t" />
</UML:Namespace.ownedElement>
<XMI.extension xmi.extender="umbrello" >
<diagrams>
<diagram snapgrid="1" showattsig="1" fillcolor="#e0e4c5" linewidth="0" zoom="100" showgrid="1" showopsig="1" usefillcolor="1" snapx="7" canvaswidth="993" snapy="7" showatts="1" xmi.id="DpoC0D4VUaxG" documentation="" type="1" showops="1" showpackage="0" name="HostPool" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" canvasheight="664" >
<widgets>
<classwidget usesdiagramfillcolor="0" width="161" showattsigs="601" x="427" fillcolor="#e0e4c5" y="28" showopsigs="601" linewidth="none" height="105" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="FTcjgY1ruC0v" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="234" showattsigs="601" x="21" fillcolor="#e0e4c5" y="21" showopsigs="601" linewidth="none" height="120" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="QzClxwWHdfMc" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="1" width="58" showattsigs="601" x="112" fillcolor="none" y="238" showopsigs="601" linewidth="none" height="21" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="KCAGyFqIpgL0" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<classwidget usesdiagramfillcolor="0" width="126" showattsigs="601" x="364" fillcolor="#e0e4c5" y="203" showopsigs="601" linewidth="none" height="253" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="7a8pQxuHOv3I" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="97" showattsigs="601" x="672" fillcolor="#e0e4c5" y="168" showopsigs="601" linewidth="none" height="104" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="HyJpS3PRU1Kj" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<enumwidget usesdiagramfillcolor="0" width="121" x="301" fillcolor="#e0e4c5" y="504" linewidth="none" height="55" usefillcolor="1" isinstance="0" xmi.id="XnOFdBKmjtR7" showpackage="0" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
</widgets>
<messages/>
<associations>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="FTcjgY1ruC0v" widgetaid="QzClxwWHdfMc" xmi.id="fvsi8gCLNwfR" type="501" linecolor="none" >
<linepath>
<startpoint startx="255" starty="84" />
<endpoint endx="427" endy="84" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="29" x="399" fillcolor="none" y="63" linewidth="none" posttext="" role="702" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="uyQdns50vpfI" text="0..*" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="36" x="392" fillcolor="none" y="84" linewidth="none" posttext="" role="710" height="19" usefillcolor="1" pretext="-" isinstance="0" xmi.id="YMYpRtoUa25V" text="pool" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="QzClxwWHdfMc" widgetaid="KCAGyFqIpgL0" xmi.id="udobO5QNil4Q" type="500" linecolor="none" >
<linepath>
<startpoint startx="140" starty="238" />
<endpoint endx="140" endy="141" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="FTcjgY1ruC0v" widgetaid="7a8pQxuHOv3I" xmi.id="JLylJCkYo23X" type="500" linecolor="none" >
<linepath>
<startpoint startx="427" starty="203" />
<endpoint endx="511" endy="133" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="7a8pQxuHOv3I" widgetaid="KCAGyFqIpgL0" xmi.id="NbGlbdxcIjX9" type="512" linecolor="none" >
<linepath>
<startpoint startx="170" starty="252" />
<endpoint endx="364" endy="329" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="HyJpS3PRU1Kj" widgetaid="7a8pQxuHOv3I" xmi.id="I1swDie713Rd" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="490" starty="329" />
<endpoint endx="672" endy="224" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="56" x="616" fillcolor="none" y="224" linewidth="none" posttext="" role="710" height="15" usefillcolor="1" pretext="-" isinstance="0" xmi.id="9YakJSgfC0iP" text="host_share" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="XnOFdBKmjtR7" widgetaid="7a8pQxuHOv3I" xmi.id="1MY8bxtpD5th" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="427" starty="456" />
<endpoint endx="364" endy="504" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="32" x="364" fillcolor="none" y="490" linewidth="none" posttext="" role="710" height="15" usefillcolor="1" pretext="-" isinstance="0" xmi.id="6Mg8rN6UOOPH" text="state" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
</associations>
</diagram>
</diagrams>
</XMI.extension>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Use Case View" isRoot="false" isAbstract="false" name="Use Case View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Component View" isRoot="false" isAbstract="false" name="Component View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Deployment View" isRoot="false" isAbstract="false" name="Deployment View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Entity Relationship Model" isRoot="false" isAbstract="false" name="Entity Relationship Model" >
<UML:Namespace.ownedElement/>
</UML:Model>
</UML:Namespace.ownedElement>
</UML:Model>
</XMI.content>
<XMI.extensions xmi.extender="umbrello" >
<docsettings viewid="DpoC0D4VUaxG" documentation="" uniqueid="UQv6vjPbRSak" />
<listview>
<listitem open="1" type="800" label="Views" >
<listitem open="1" type="801" id="Logical View" >
<listitem open="0" type="807" id="DpoC0D4VUaxG" label="HostPool" />
<listitem open="1" type="813" id="7a8pQxuHOv3I" >
<listitem open="0" type="814" id="I1swDie713Rd" />
<listitem open="0" type="814" id="c5qYO6nEljFF" />
<listitem open="0" type="814" id="1MY8bxtpD5th" />
<listitem open="1" type="814" id="8OIBpnNF0XZq" />
<listitem open="1" type="814" id="VbsVKF15i6Mi" />
<listitem open="1" type="814" id="ew8zcUmtkgcP" />
<listitem open="1" type="814" id="3PdGaDlK2Uzr" />
<listitem open="1" type="814" id="H7cCa0QFpDNG" />
<listitem open="1" type="814" id="w8devVikl5py" />
<listitem open="1" type="814" id="DXMEN8pii4Cj" />
<listitem open="1" type="814" id="PZA3dkog5B6m" />
<listitem open="1" type="814" id="lX5LM8I9rtTK" />
<listitem open="1" type="814" id="6mT8lxAGFePd" />
<listitem open="1" type="814" id="nDXK70d0bxjQ" />
<listitem open="1" type="814" id="7VpVPFUEJehC" />
<listitem open="1" type="814" id="nBB6uMUPKrXW" />
<listitem open="1" type="814" id="3BzSn2NOZCa5" />
<listitem open="1" type="814" id="j8n0ANGE2Flw" />
<listitem open="1" type="814" id="L6SuSVdW2yf9" />
<listitem open="1" type="814" id="UQv6vjPbRSak" />
<listitem open="0" type="815" id="3hebSdUOoDAF" />
<listitem open="0" type="815" id="4ICQgXHT7GOe" />
</listitem>
<listitem open="1" type="813" id="KCAGyFqIpgL0" />
<listitem open="1" type="813" id="HyJpS3PRU1Kj" >
<listitem open="1" type="814" id="Ohg27xO6qIdN" />
<listitem open="1" type="814" id="BkamrGWMLBTQ" />
<listitem open="1" type="814" id="GvkksWUTDab7" />
<listitem open="1" type="814" id="cthYsJ7wlMRC" />
<listitem open="1" type="814" id="IdzKZvzzWd9Q" />
<listitem open="1" type="814" id="FNiVnWcqKBZV" />
<listitem open="1" type="814" id="32EW7SZjmCLV" />
<listitem open="1" type="814" id="Mbi2hAylDV96" />
</listitem>
<listitem open="0" type="813" id="FTcjgY1ruC0v" >
<listitem open="0" type="814" id="1oS3xv31KiB4" />
<listitem open="0" type="814" id="ixTgs2fhSgcN" />
<listitem open="0" type="815" id="nbM2o3ajdhrk" />
<listitem open="0" type="815" id="cYMrUig7UHTW" />
<listitem open="0" type="815" id="IDwc2QJgWnvx" />
<listitem open="0" type="815" id="M1RmI6G51EM0" />
</listitem>
<listitem open="0" type="813" id="QzClxwWHdfMc" >
<listitem open="0" type="814" id="ufg9C6NNEIhF" />
<listitem open="0" type="814" id="FZr0VlUmM86y" />
<listitem open="0" type="814" id="ItJ2xkSJdUgP" />
<listitem open="0" type="815" id="nTmQ2dvvUMVn" />
<listitem open="0" type="815" id="vcv2H4PsHW1N" />
<listitem open="0" type="815" id="tZBwi4Zb7qdU" />
<listitem open="0" type="815" id="4HEQcydWqn6n" />
</listitem>
<listitem open="1" type="813" id="qTRhqpQ0PE3f" />
<listitem open="1" type="813" id="ypAsly1Z2KtR" />
<listitem open="1" type="813" id="m0Kw7a2RrIht" />
<listitem open="1" type="830" id="Datatypes" >
<listitem open="0" type="829" id="XMIKc2o5J6Nu" />
<listitem open="1" type="829" id="XNuw315mXeUm" />
<listitem open="1" type="829" id="BKzfuxuVlEmK" />
<listitem open="1" type="829" id="oRTstiC5X0HW" />
<listitem open="1" type="829" id="Nu2tsIN4aMhU" />
<listitem open="1" type="829" id="41ex5eEr4fjx" />
<listitem open="1" type="829" id="bqKIZpHLv42H" />
<listitem open="1" type="829" id="c2eghLb5Fcw6" />
<listitem open="0" type="829" id="WUJUz2wkP4qL" />
<listitem open="1" type="829" id="mxryNx8LdqSJ" />
<listitem open="1" type="829" id="GEL6a9ZVYNMe" />
<listitem open="1" type="829" id="Hby3oiLsjxpm" />
<listitem open="0" type="829" id="FRk6rIA1W1VM" />
<listitem open="1" type="829" id="EnOdbIq8WtLj" />
<listitem open="0" type="829" id="vy53e946a47C" />
<listitem open="1" type="829" id="sJASdpuvRqwF" />
<listitem open="1" type="829" id="x2fBcbHSsPuV" />
<listitem open="1" type="829" id="WF5DDs0nucRc" />
</listitem>
<listitem open="1" type="831" id="XnOFdBKmjtR7" >
<listitem open="0" type="839" id="ZrmvfBSRZf4i" />
<listitem open="1" type="839" id="Y7c7TYooZL09" />
<listitem open="1" type="839" id="ElBpOUB6gSC0" />
</listitem>
</listitem>
<listitem open="1" type="802" id="Use Case View" />
<listitem open="1" type="821" id="Component View" />
<listitem open="1" type="827" id="Deployment View" />
<listitem open="1" type="836" id="Entity Relationship Model" />
</listitem>
</listview>
<codegeneration>
<codegenerator language="C++" />
</codegeneration>
</XMI.extensions>
</XMI>

401
share/doc/design/VMPool.xmi Normal file
View File

@ -0,0 +1,401 @@
<?xml version="1.0" encoding="UTF-8"?>
<XMI xmlns:UML="http://schema.omg.org/spec/UML/1.3" verified="false" timestamp="2008-01-08T18:45:28" xmi.version="1.2" >
<XMI.header>
<XMI.documentation>
<XMI.exporter>umbrello uml modeller http://uml.sf.net</XMI.exporter>
<XMI.exporterVersion>1.5.8</XMI.exporterVersion>
<XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding>
</XMI.documentation>
<XMI.metamodel xmi.name="UML" href="UML.xml" xmi.version="1.3" />
</XMI.header>
<XMI.content>
<UML:Model isSpecification="false" isLeaf="false" isRoot="false" xmi.id="m1" isAbstract="false" name="UML Model" >
<UML:Namespace.ownedElement>
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="folder" isRoot="false" isAbstract="false" name="folder" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="datatype" isRoot="false" isAbstract="false" name="datatype" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="interface" isRoot="false" isAbstract="false" name="interface" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="ActionListener" isRoot="false" isAbstract="false" name="ActionListener" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="enum" isRoot="false" isAbstract="false" name="enum" />
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Logical View" isRoot="false" isAbstract="false" name="Logical View" >
<UML:Namespace.ownedElement>
<UML:Package stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="Datatypes" isRoot="false" isAbstract="false" name="Datatypes" >
<UML:Namespace.ownedElement>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="bqKIZpHLv42H" isRoot="false" isAbstract="false" name="int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="oRTstiC5X0HW" isRoot="false" isAbstract="false" name="char" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="BKzfuxuVlEmK" isRoot="false" isAbstract="false" name="bool" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="41ex5eEr4fjx" isRoot="false" isAbstract="false" name="float" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Nu2tsIN4aMhU" isRoot="false" isAbstract="false" name="double" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Hby3oiLsjxpm" isRoot="false" isAbstract="false" name="short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="c2eghLb5Fcw6" isRoot="false" isAbstract="false" name="long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="sJASdpuvRqwF" isRoot="false" isAbstract="false" name="unsigned int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="WF5DDs0nucRc" isRoot="false" isAbstract="false" name="unsigned short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="x2fBcbHSsPuV" isRoot="false" isAbstract="false" name="unsigned long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="EnOdbIq8WtLj" isRoot="false" isAbstract="false" name="string" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="FRk6rIA1W1VM" isRoot="false" isAbstract="false" name="sqlite3 *" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="XMIKc2o5J6Nu" isRoot="false" isAbstract="false" name="ActionListener *" elementReference="Vtec6OvZep7Y" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="WUJUz2wkP4qL" isRoot="false" isAbstract="false" name="map&lt;int,ObjectSQL*>" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="XNuw315mXeUm" isRoot="false" isAbstract="false" name="ObjectSQL *" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="vy53e946a47C" isRoot="false" isAbstract="false" name="undef" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="KOw9slpUVSCK" />
</UML:GeneralizableElement.generalization>
</UML:DataType>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="mxryNx8LdqSJ" isRoot="false" isAbstract="false" name="map&lt;int,attribute>" elementReference="qTRhqpQ0PE3f" />
</UML:Namespace.ownedElement>
</UML:Package>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ruL8hEHJf71m" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="Ey5lLInyFHny" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="IW4Y59NNj5Y0" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="hjipPCuUAVPQ" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="t70rqsOLcB4D" aggregation="composite" type="vy53e946a47C" name="" multiplicity="1" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="pomXSGmN0UGE" aggregation="none" type="vy53e946a47C" name="" multiplicity="0..*" />
</UML:Association.connection>
</UML:Association>
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="DCXqsURB7Car" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="VvRc5zSWiu2N" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Gq5yk7K4083P" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="eHdeNg3WcYlX" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Are2UTPMWnQH" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="wwSEMtYIQ3jL" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="pTCzinvJrzop" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="CwDiWUhJndUK" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="xciNhaVKc8O3" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="yjL4CImnzST6" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ZPsL0MdKjRuq" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="9ppHyHe9yp6q" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="dsLsyo1muqsZ" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Generalization isSpecification="false" child="vy53e946a47C" visibility="public" namespace="Logical View" xmi.id="KOw9slpUVSCK" parent="vy53e946a47C" discriminator="" name="" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Zew276Kva1UC" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="w2BKFRSqPCfQ" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="8NXXWAQ2BIwv" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="8OffyHH7J51e" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="CY6TqvjeSHn9" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="ipd3MrpSTGbB" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="rLzAQznN0fxo" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="vW0absjbmJZV" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="NmS5afCq8lRz" aggregation="none" type="vy53e946a47C" name="" multiplicity="2" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="N2IAYOSx9uEH" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="fF0degv5IQ7W" aggregation="composite" type="Vtec6OvZep7Y" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="RiLxnrrfdpDV" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="adQpG9tPizWw" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="DxU2SBXeiSIL" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="rXiKwgeYgnHy" aggregation="none" type="Vtec6OvZep7Y" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="iNuf7uC50BLw" client="vy53e946a47C" name="" supplier="Vtec6OvZep7Y" />
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="FTcjgY1ruC0v" isRoot="false" isAbstract="false" name="ObjectSQL" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="1oS3xv31KiB4" type="bqKIZpHLv42H" name="oid" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="ixTgs2fhSgcN" type="ypAsly1Z2KtR" name="mutex" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="nbM2o3ajdhrk" isRoot="false" isAbstract="false" isQuery="false" name="lock" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="cYMrUig7UHTW" isRoot="false" isAbstract="false" isQuery="false" name="unlock" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="IDwc2QJgWnvx" isRoot="false" isAbstract="true" isQuery="false" name="select" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="XAJL1i0cYd38" value="" type="FRk6rIA1W1VM" name="db" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="M1RmI6G51EM0" isRoot="false" isAbstract="true" isQuery="false" name="insert" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="t0UviVXF8YLM" value="" type="FRk6rIA1W1VM" name="db" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="QzClxwWHdfMc" isRoot="false" isAbstract="false" name="PoolSQL" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="ufg9C6NNEIhF" type="bqKIZpHLv42H" name="lastOID" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="FZr0VlUmM86y" type="WUJUz2wkP4qL" name="pool" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="ItJ2xkSJdUgP" type="FRk6rIA1W1VM" name="db" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="private" xmi.id="nTmQ2dvvUMVn" isRoot="false" isAbstract="true" isQuery="false" name="initLastOID" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="private" xmi.id="vcv2H4PsHW1N" isRoot="false" isAbstract="true" isQuery="false" name="create" >
<UML:BehavioralFeature.parameter>
<UML:Parameter kind="return" xmi.id="xOMjFuuBaxiB" type="XNuw315mXeUm" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="tZBwi4Zb7qdU" isRoot="false" isAbstract="false" isQuery="false" name="allocate" >
<UML:BehavioralFeature.parameter>
<UML:Parameter kind="return" xmi.id="caYspxUlaybN" type="bqKIZpHLv42H" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="gGjXn5Sh8Rku" value="" type="XNuw315mXeUm" name="obj" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="4HEQcydWqn6n" isRoot="false" isAbstract="false" isQuery="false" name="get" >
<UML:BehavioralFeature.parameter>
<UML:Parameter kind="return" xmi.id="XWMuNb4DpWFh" type="XNuw315mXeUm" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="JCfn5YzTBFJW" value="" type="bqKIZpHLv42H" name="oid" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="rGU4tF7PEYbS" value="" type="BKzfuxuVlEmK" name="lock" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="3a0CTjhkgTis" client="QzClxwWHdfMc" name="" supplier="FTcjgY1ruC0v" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="fvsi8gCLNwfR" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="MZQH9S6RVac4" aggregation="aggregate" type="QzClxwWHdfMc" name="" />
<UML:AssociationEnd isSpecification="false" visibility="private" changeability="changeable" isNavigable="true" xmi.id="oFyIp4OZKzFo" aggregation="none" type="FTcjgY1ruC0v" name="pool" multiplicity="0..*" />
</UML:Association.connection>
</UML:Association>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="KCAGyFqIpgL0" isRoot="false" isAbstract="false" name="VMPool" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="udobO5QNil4Q" />
</UML:GeneralizableElement.generalization>
</UML:Class>
<UML:Generalization isSpecification="false" child="KCAGyFqIpgL0" visibility="public" namespace="Logical View" xmi.id="udobO5QNil4Q" parent="QzClxwWHdfMc" discriminator="" name="" />
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="7a8pQxuHOv3I" isRoot="false" isAbstract="false" name="VM" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="JLylJCkYo23X" />
</UML:GeneralizableElement.generalization>
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="public" xmi.id="I1swDie713Rd" type="HyJpS3PRU1Kj" name="template" />
<UML:Attribute isSpecification="false" visibility="public" xmi.id="qJQVdL68irlQ" type="z7Dg2MlvQ7CM" name="history" />
<UML:Attribute isSpecification="false" visibility="public" xmi.id="c5qYO6nEljFF" type="bqKIZpHLv42H" name="uid" />
<UML:Attribute isSpecification="false" visibility="public" xmi.id="C2CvmPBZYxhn" type="EnOdbIq8WtLj" name="directory" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="1MY8bxtpD5th" type="XnOFdBKmjtR7" name="state" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="3hebSdUOoDAF" isRoot="false" isAbstract="false" isQuery="false" name="select" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="a1xZbOKW0R5l" value="" type="FRk6rIA1W1VM" name="db" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="4ICQgXHT7GOe" isRoot="false" isAbstract="false" isQuery="false" name="insert" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="fy1W6wbM6z0d" value="" type="FRk6rIA1W1VM" name="db" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Generalization isSpecification="false" child="7a8pQxuHOv3I" visibility="public" namespace="Logical View" xmi.id="JLylJCkYo23X" parent="FTcjgY1ruC0v" discriminator="" name="" />
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="z7Dg2MlvQ7CM" isRoot="false" isAbstract="false" name="History" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="QcFMJ056hrSv" type="m0Kw7a2RrIht" name="stime" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="x7VATmBXqsOJ" type="m0Kw7a2RrIht" name="etime" />
</UML:Classifier.feature>
</UML:Class>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="HyJpS3PRU1Kj" isRoot="false" isAbstract="false" name="Template" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="Q6C0ik7hGMJ2" type="mxryNx8LdqSJ" name="attributes" />
</UML:Classifier.feature>
</UML:Class>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Kq40rRjmpqxB" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="6FSgChUMdImU" aggregation="composite" type="HyJpS3PRU1Kj" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="ndt0GI7PQQkO" aggregation="none" type="7a8pQxuHOv3I" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="F77Ohxt9mWLc" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="Cp1L23UGtWQW" aggregation="composite" type="HyJpS3PRU1Kj" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="GAdHYqgiWLGy" aggregation="none" type="7a8pQxuHOv3I" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="SlsDHDpgpvdB" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="FVOSlmKjyrEr" aggregation="composite" type="7a8pQxuHOv3I" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="h87eqS5e2ZUi" aggregation="none" type="HyJpS3PRU1Kj" name="template" multiplicity="1" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="XhoKcPVkULbi" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="TKlURUryaXiL" aggregation="composite" type="7a8pQxuHOv3I" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="iY5AbiDqiqfV" aggregation="none" type="z7Dg2MlvQ7CM" name="history" multiplicity="1" />
</UML:Association.connection>
</UML:Association>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="m0Kw7a2RrIht" isRoot="false" isAbstract="false" name="time_t" />
<UML:Enumeration stereotype="enum" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="XnOFdBKmjtR7" isRoot="false" isAbstract="false" name="VM_STATE" >
<UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="XnOFdBKmjtR7" xmi.id="ZrmvfBSRZf4i" isRoot="false" isAbstract="false" name="LM_STATE_INIT" />
<UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="XnOFdBKmjtR7" xmi.id="Pk8VgQdGINBv" isRoot="false" isAbstract="false" name="LM_STATE_PENDING" />
<UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="XnOFdBKmjtR7" xmi.id="j0GohzR4iZYO" isRoot="false" isAbstract="false" name="LM_STATE_ACTIVE" />
</UML:Enumeration>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="qTRhqpQ0PE3f" isRoot="false" isAbstract="false" name="map" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="NbGlbdxcIjX9" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="false" xmi.id="5tEmoStyUmnN" aggregation="none" type="KCAGyFqIpgL0" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="LNUHBovFFXaw" aggregation="none" type="7a8pQxuHOv3I" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="ypAsly1Z2KtR" isRoot="false" isAbstract="false" name="pthread_mutex_t" />
</UML:Namespace.ownedElement>
<XMI.extension xmi.extender="umbrello" >
<diagrams>
<diagram snapgrid="1" showattsig="1" fillcolor="#e0e4c5" linewidth="0" zoom="100" showgrid="1" showopsig="1" usefillcolor="1" snapx="7" canvaswidth="993" snapy="7" showatts="1" xmi.id="DpoC0D4VUaxG" documentation="" type="1" showops="1" showpackage="0" name="VMpool" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" canvasheight="664" >
<widgets>
<classwidget usesdiagramfillcolor="0" width="161" showattsigs="601" x="427" fillcolor="#e0e4c5" y="28" showopsigs="601" linewidth="none" height="105" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="FTcjgY1ruC0v" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="234" showattsigs="601" x="21" fillcolor="#e0e4c5" y="21" showopsigs="601" linewidth="none" height="120" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="QzClxwWHdfMc" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="1" width="59" showattsigs="601" x="112" fillcolor="none" y="238" showopsigs="601" linewidth="none" height="29" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="KCAGyFqIpgL0" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<classwidget usesdiagramfillcolor="0" width="139" showattsigs="601" x="441" fillcolor="#e0e4c5" y="189" showopsigs="601" linewidth="none" height="120" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="7a8pQxuHOv3I" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="98" showattsigs="601" x="672" fillcolor="#e0e4c5" y="308" showopsigs="601" linewidth="none" height="52" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="z7Dg2MlvQ7CM" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="195" showattsigs="601" x="602" fillcolor="#e0e4c5" y="140" showopsigs="601" linewidth="none" height="37" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="HyJpS3PRU1Kj" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<enumwidget usesdiagramfillcolor="0" width="123" x="448" fillcolor="#e0e4c5" y="364" linewidth="none" height="75" usefillcolor="1" isinstance="0" xmi.id="XnOFdBKmjtR7" showpackage="0" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
</widgets>
<messages/>
<associations>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="FTcjgY1ruC0v" widgetaid="QzClxwWHdfMc" xmi.id="fvsi8gCLNwfR" type="501" linecolor="none" >
<linepath>
<startpoint startx="255" starty="84" />
<endpoint endx="427" endy="84" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="29" x="399" fillcolor="none" y="63" linewidth="none" posttext="" role="702" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="DNaVZpTHlJ2S" text="0..*" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="36" x="392" fillcolor="none" y="84" linewidth="none" posttext="" role="710" height="19" usefillcolor="1" pretext="-" isinstance="0" xmi.id="YGEiGDNWDMDo" text="pool" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="QzClxwWHdfMc" widgetaid="KCAGyFqIpgL0" xmi.id="udobO5QNil4Q" type="500" linecolor="none" >
<linepath>
<startpoint startx="140" starty="238" />
<endpoint endx="140" endy="141" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="FTcjgY1ruC0v" widgetaid="7a8pQxuHOv3I" xmi.id="JLylJCkYo23X" type="500" linecolor="none" >
<linepath>
<startpoint startx="511" starty="189" />
<endpoint endx="511" endy="133" />
</linepath>
</assocwidget>
<assocwidget totalcounta="3" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="HyJpS3PRU1Kj" widgetaid="7a8pQxuHOv3I" xmi.id="I1swDie713Rd" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="580" starty="231" />
<endpoint endx="700" endy="177" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="67" x="630" fillcolor="none" y="196" linewidth="none" posttext="" role="710" height="19" usefillcolor="1" pretext="+" isinstance="0" xmi.id="CAbVsOU3KZoC" text="template" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="3" indexa="2" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="z7Dg2MlvQ7CM" widgetaid="7a8pQxuHOv3I" xmi.id="qJQVdL68irlQ" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="580" starty="273" />
<endpoint endx="672" endy="336" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="56" x="623" fillcolor="none" y="315" linewidth="none" posttext="" role="710" height="19" usefillcolor="1" pretext="+" isinstance="0" xmi.id="7A7CSsqNaEFk" text="history" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="XnOFdBKmjtR7" widgetaid="7a8pQxuHOv3I" xmi.id="1MY8bxtpD5th" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="511" starty="309" />
<endpoint endx="511" endy="364" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="41" x="476" fillcolor="none" y="343" linewidth="none" posttext="" role="710" height="19" usefillcolor="1" pretext="-" isinstance="0" xmi.id="tObHmtqUK95f" text="state" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="7a8pQxuHOv3I" widgetaid="KCAGyFqIpgL0" xmi.id="NbGlbdxcIjX9" type="512" linecolor="none" >
<linepath>
<startpoint startx="171" starty="252" />
<endpoint endx="441" endy="252" />
</linepath>
</assocwidget>
</associations>
</diagram>
</diagrams>
</XMI.extension>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Use Case View" isRoot="false" isAbstract="false" name="Use Case View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Component View" isRoot="false" isAbstract="false" name="Component View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Deployment View" isRoot="false" isAbstract="false" name="Deployment View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Entity Relationship Model" isRoot="false" isAbstract="false" name="Entity Relationship Model" >
<UML:Namespace.ownedElement/>
</UML:Model>
</UML:Namespace.ownedElement>
</UML:Model>
</XMI.content>
<XMI.extensions xmi.extender="umbrello" >
<docsettings viewid="DpoC0D4VUaxG" documentation="" uniqueid="JJLpsPtBWM5U" />
<listview>
<listitem open="1" type="800" label="Views" >
<listitem open="1" type="801" id="Logical View" >
<listitem open="0" type="807" id="DpoC0D4VUaxG" label="VMpool" />
<listitem open="0" type="813" id="z7Dg2MlvQ7CM" >
<listitem open="0" type="814" id="QcFMJ056hrSv" />
<listitem open="0" type="814" id="x7VATmBXqsOJ" />
</listitem>
<listitem open="0" type="813" id="FTcjgY1ruC0v" >
<listitem open="0" type="814" id="1oS3xv31KiB4" />
<listitem open="0" type="814" id="ixTgs2fhSgcN" />
<listitem open="0" type="815" id="nbM2o3ajdhrk" />
<listitem open="0" type="815" id="cYMrUig7UHTW" />
<listitem open="0" type="815" id="IDwc2QJgWnvx" />
<listitem open="0" type="815" id="M1RmI6G51EM0" />
</listitem>
<listitem open="0" type="813" id="QzClxwWHdfMc" >
<listitem open="0" type="814" id="ufg9C6NNEIhF" />
<listitem open="0" type="814" id="FZr0VlUmM86y" />
<listitem open="0" type="814" id="ItJ2xkSJdUgP" />
<listitem open="0" type="815" id="nTmQ2dvvUMVn" />
<listitem open="0" type="815" id="vcv2H4PsHW1N" />
<listitem open="0" type="815" id="tZBwi4Zb7qdU" />
<listitem open="0" type="815" id="4HEQcydWqn6n" />
</listitem>
<listitem open="0" type="813" id="HyJpS3PRU1Kj" >
<listitem open="0" type="814" id="Q6C0ik7hGMJ2" />
</listitem>
<listitem open="0" type="813" id="7a8pQxuHOv3I" >
<listitem open="0" type="814" id="I1swDie713Rd" />
<listitem open="0" type="814" id="qJQVdL68irlQ" />
<listitem open="0" type="814" id="c5qYO6nEljFF" />
<listitem open="0" type="814" id="C2CvmPBZYxhn" />
<listitem open="0" type="814" id="1MY8bxtpD5th" />
<listitem open="0" type="815" id="3hebSdUOoDAF" />
<listitem open="0" type="815" id="4ICQgXHT7GOe" />
</listitem>
<listitem open="1" type="813" id="KCAGyFqIpgL0" />
<listitem open="1" type="813" id="qTRhqpQ0PE3f" />
<listitem open="1" type="813" id="ypAsly1Z2KtR" />
<listitem open="1" type="813" id="m0Kw7a2RrIht" />
<listitem open="0" type="830" id="Datatypes" >
<listitem open="1" type="829" id="XMIKc2o5J6Nu" />
<listitem open="1" type="829" id="XNuw315mXeUm" />
<listitem open="1" type="829" id="BKzfuxuVlEmK" />
<listitem open="1" type="829" id="oRTstiC5X0HW" />
<listitem open="1" type="829" id="Nu2tsIN4aMhU" />
<listitem open="1" type="829" id="41ex5eEr4fjx" />
<listitem open="1" type="829" id="bqKIZpHLv42H" />
<listitem open="1" type="829" id="c2eghLb5Fcw6" />
<listitem open="0" type="829" id="WUJUz2wkP4qL" />
<listitem open="1" type="829" id="mxryNx8LdqSJ" />
<listitem open="1" type="829" id="Hby3oiLsjxpm" />
<listitem open="0" type="829" id="FRk6rIA1W1VM" />
<listitem open="1" type="829" id="EnOdbIq8WtLj" />
<listitem open="0" type="829" id="vy53e946a47C" />
<listitem open="1" type="829" id="sJASdpuvRqwF" />
<listitem open="1" type="829" id="x2fBcbHSsPuV" />
<listitem open="1" type="829" id="WF5DDs0nucRc" />
</listitem>
<listitem open="0" type="831" id="XnOFdBKmjtR7" >
<listitem open="0" type="839" id="ZrmvfBSRZf4i" />
<listitem open="0" type="839" id="Pk8VgQdGINBv" />
<listitem open="0" type="839" id="j0GohzR4iZYO" />
</listitem>
</listitem>
<listitem open="1" type="802" id="Use Case View" />
<listitem open="1" type="821" id="Component View" />
<listitem open="1" type="827" id="Deployment View" />
<listitem open="1" type="836" id="Entity Relationship Model" />
</listitem>
</listview>
<codegeneration>
<codegenerator language="C++" />
</codegeneration>
</XMI.extensions>
</XMI>

View File

@ -0,0 +1,297 @@
<?xml version="1.0" encoding="UTF-8"?>
<XMI xmlns:UML="http://schema.omg.org/spec/UML/1.3" verified="false" timestamp="2008-01-08T18:43:54" xmi.version="1.2" >
<XMI.header>
<XMI.documentation>
<XMI.exporter>umbrello uml modeller http://uml.sf.net</XMI.exporter>
<XMI.exporterVersion>1.5.8</XMI.exporterVersion>
<XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding>
</XMI.documentation>
<XMI.metamodel xmi.name="UML" href="UML.xml" xmi.version="1.3" />
</XMI.header>
<XMI.content>
<UML:Model isSpecification="false" isLeaf="false" isRoot="false" xmi.id="m1" isAbstract="false" name="UML Model" >
<UML:Namespace.ownedElement>
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="folder" isRoot="false" isAbstract="false" name="folder" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="datatype" isRoot="false" isAbstract="false" name="datatype" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="interface" isRoot="false" isAbstract="false" name="interface" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="ActionListener" isRoot="false" isAbstract="false" name="ActionListener" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="enum" isRoot="false" isAbstract="false" name="enum" />
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Logical View" isRoot="false" isAbstract="false" name="Logical View" >
<UML:Namespace.ownedElement>
<UML:Package stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="Datatypes" isRoot="false" isAbstract="false" name="Datatypes" >
<UML:Namespace.ownedElement>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="bqKIZpHLv42H" isRoot="false" isAbstract="false" name="int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="oRTstiC5X0HW" isRoot="false" isAbstract="false" name="char" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="BKzfuxuVlEmK" isRoot="false" isAbstract="false" name="bool" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="41ex5eEr4fjx" isRoot="false" isAbstract="false" name="float" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Nu2tsIN4aMhU" isRoot="false" isAbstract="false" name="double" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Hby3oiLsjxpm" isRoot="false" isAbstract="false" name="short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="c2eghLb5Fcw6" isRoot="false" isAbstract="false" name="long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="sJASdpuvRqwF" isRoot="false" isAbstract="false" name="unsigned int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="WF5DDs0nucRc" isRoot="false" isAbstract="false" name="unsigned short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="x2fBcbHSsPuV" isRoot="false" isAbstract="false" name="unsigned long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="EnOdbIq8WtLj" isRoot="false" isAbstract="false" name="string" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="FRk6rIA1W1VM" isRoot="false" isAbstract="false" name="sqlite3 *" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="XMIKc2o5J6Nu" isRoot="false" isAbstract="false" name="ActionListener *" elementReference="Vtec6OvZep7Y" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="WUJUz2wkP4qL" isRoot="false" isAbstract="false" name="map&lt;int,ObjectSQL*>" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="XNuw315mXeUm" isRoot="false" isAbstract="false" name="ObjectSQL *" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="vy53e946a47C" isRoot="false" isAbstract="false" name="undef" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="KOw9slpUVSCK" />
</UML:GeneralizableElement.generalization>
</UML:DataType>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="mxryNx8LdqSJ" isRoot="false" isAbstract="false" name="map&lt;int,attribute>" elementReference="qTRhqpQ0PE3f" />
</UML:Namespace.ownedElement>
</UML:Package>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ruL8hEHJf71m" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="y5MnbTW68X9I" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="UHm8l0N0c5PE" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="hjipPCuUAVPQ" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="P1zbtMv6sByA" aggregation="composite" type="vy53e946a47C" name="" multiplicity="1" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="tZb6Wx5n9lft" aggregation="none" type="vy53e946a47C" name="" multiplicity="0..*" />
</UML:Association.connection>
</UML:Association>
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="DCXqsURB7Car" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="VvRc5zSWiu2N" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Gq5yk7K4083P" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="eHdeNg3WcYlX" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Are2UTPMWnQH" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="ixBGeyZcPVaF" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="XhM0loRAmqhm" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="CwDiWUhJndUK" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="myu9MSPXu29Z" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="JuCTiSs22ALx" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ZPsL0MdKjRuq" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="lsDCzcoNj2O1" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="oDM6oHoLpHfv" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Generalization isSpecification="false" child="vy53e946a47C" visibility="public" namespace="Logical View" xmi.id="KOw9slpUVSCK" parent="vy53e946a47C" discriminator="" name="" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Zew276Kva1UC" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="S7prGTfHM9JH" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="EDM014vN8URG" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="8OffyHH7J51e" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="cCz3x6TxH4uf" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="QvBeUm2Wqtpn" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="rLzAQznN0fxo" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="dA46Yap9O5kt" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="ItqmtO3HnbJ9" aggregation="none" type="vy53e946a47C" name="" multiplicity="2" />
</UML:Association.connection>
</UML:Association>
<UML:Interface stereotype="interface" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="Vtec6OvZep7Y" isRoot="false" isAbstract="true" name="ActionListener" >
<UML:Classifier.feature>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="r5wKwYx2uqZZ" isRoot="false" isAbstract="true" isQuery="false" name="do_action" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="08TU5pmjXwFJ" value="" type="EnOdbIq8WtLj" name="actionName" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="imunZeU6akNO" value="" type="vy53e946a47C" name="actionArgs" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Interface>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="lSGAN6DHQApL" isRoot="false" isAbstract="false" name="ActionManager" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="PnRpA2YxeF9Y" type="vy53e946a47C" name="actionList" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="THHIdjRDCzRQ" type="XMIKc2o5J6Nu" name="listener" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="qFxhNZSAMMR4" isRoot="false" isAbstract="false" isQuery="false" name="loop" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="rZIavc3WN6NS" value="" type="vy53e946a47C" name="timeout" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="srF5iDwHTUD3" value="" type="vy53e946a47C" name="timerArgs" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="MKeaF4nJSUdl" isRoot="false" isAbstract="false" isQuery="false" name="trigger" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="EEPPaloeiEww" value="" type="EnOdbIq8WtLj" name="action" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="WG7hKdMiEPZy" value="" type="vy53e946a47C" name="args" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="STOhI1BX7rpi" isRoot="false" isAbstract="false" isQuery="false" name="addListener" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="CB0SMWSFO6hr" value="" type="XMIKc2o5J6Nu" name="listener" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="N2IAYOSx9uEH" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="80tOmUAfejnK" aggregation="composite" type="Vtec6OvZep7Y" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="kxz5OIFexF2L" aggregation="none" type="lSGAN6DHQApL" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="adQpG9tPizWw" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="04m5CQy8sSYQ" aggregation="composite" type="lSGAN6DHQApL" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="NSjaIRk1YKtq" aggregation="none" type="Vtec6OvZep7Y" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Class stereotype="ActionListener" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="v1Qyt5PysrV2" isRoot="false" isAbstract="false" name="ExampleManager" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="public" xmi.id="y1DwtRnk4cXj" type="lSGAN6DHQApL" name="am" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="Wbx0pbNT3TB4" isRoot="false" isAbstract="false" isQuery="false" name="do_action" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="1UA1ujuNmUZI" value="" type="EnOdbIq8WtLj" name="actionName" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="AA353JgE6fjG" value="" type="vy53e946a47C" name="actionArgs" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="iNuf7uC50BLw" client="v1Qyt5PysrV2" name="" supplier="Vtec6OvZep7Y" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="3a0CTjhkgTis" client="QzClxwWHdfMc" name="" supplier="FTcjgY1ruC0v" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="fvsi8gCLNwfR" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="pHcGdTyJMRHY" aggregation="aggregate" type="QzClxwWHdfMc" name="" />
<UML:AssociationEnd isSpecification="false" visibility="private" changeability="changeable" isNavigable="true" xmi.id="g2xHX9hQszfu" aggregation="none" type="FTcjgY1ruC0v" name="pool" multiplicity="0..*" />
</UML:Association.connection>
</UML:Association>
<UML:Generalization isSpecification="false" child="KCAGyFqIpgL0" visibility="public" namespace="Logical View" xmi.id="udobO5QNil4Q" parent="QzClxwWHdfMc" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="7a8pQxuHOv3I" visibility="public" namespace="Logical View" xmi.id="JLylJCkYo23X" parent="FTcjgY1ruC0v" discriminator="" name="" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Kq40rRjmpqxB" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="mM7lhHvx7C3u" aggregation="composite" type="HyJpS3PRU1Kj" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="B8RZZteamulQ" aggregation="none" type="7a8pQxuHOv3I" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="F77Ohxt9mWLc" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="t476C0aBezQs" aggregation="composite" type="HyJpS3PRU1Kj" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="kEk3hOIYsSk8" aggregation="none" type="7a8pQxuHOv3I" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="SlsDHDpgpvdB" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="CD41QniTDdde" aggregation="composite" type="7a8pQxuHOv3I" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="ONgum429D1KD" aggregation="none" type="HyJpS3PRU1Kj" name="template" multiplicity="1" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="XhoKcPVkULbi" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="qtMAmwmqDsZq" aggregation="composite" type="7a8pQxuHOv3I" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="cG8bpFvKzdps" aggregation="none" type="z7Dg2MlvQ7CM" name="history" multiplicity="1" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="NbGlbdxcIjX9" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="false" xmi.id="hBfuAUkeKZRm" aggregation="none" type="KCAGyFqIpgL0" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="7KWx32Cx0t32" aggregation="none" type="7a8pQxuHOv3I" name="" />
</UML:Association.connection>
</UML:Association>
</UML:Namespace.ownedElement>
<XMI.extension xmi.extender="umbrello" >
<diagrams>
<diagram snapgrid="0" showattsig="1" fillcolor="#eee9e9" linewidth="0" zoom="100" showgrid="1" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="993" snapy="10" showatts="1" xmi.id="tJJXQ7qLTGJd" documentation="" type="1" showops="1" showpackage="0" name="Action" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#8b8989" canvasheight="664" >
<widgets>
<interfacewidget usesdiagramfillcolor="0" width="307" x="387" fillcolor="#eee9e9" y="34" drawascircle="0" showopsigs="601" linewidth="none" height="52" usefillcolor="1" showpubliconly="0" isinstance="0" xmi.id="Vtec6OvZep7Y" showoperations="1" showpackage="0" showscope="1" showstereotype="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#8b8989" />
<classwidget usesdiagramfillcolor="0" width="251" showattsigs="601" x="20" fillcolor="#eee9e9" y="15" showopsigs="601" linewidth="none" height="90" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="lSGAN6DHQApL" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#8b8989" />
<classwidget usesdiagramfillcolor="0" width="307" showattsigs="601" x="191" fillcolor="#99cccc" y="171" showopsigs="601" linewidth="none" height="57" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="v1Qyt5PysrV2" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#8b8989" />
</widgets>
<messages/>
<associations>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="Vtec6OvZep7Y" widgetaid="lSGAN6DHQApL" xmi.id="THHIdjRDCzRQ" type="501" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="271" starty="60" />
<endpoint endx="387" endy="60" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="30" x="353" fillcolor="none" y="44" linewidth="none" posttext="" role="702" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="xQs1zkoMsAff" text="0..1" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="55" x="330" fillcolor="none" y="61" linewidth="none" posttext="" role="710" height="19" usefillcolor="1" pretext="-" isinstance="0" xmi.id="3d38Z5NBVczd" text="listener" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="3" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="lSGAN6DHQApL" widgetaid="v1Qyt5PysrV2" xmi.id="y1DwtRnk4cXj" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="293" starty="171" />
<endpoint endx="145" endy="105" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="35" x="147" fillcolor="none" y="107" linewidth="none" posttext="" role="710" height="19" usefillcolor="1" pretext="+" isinstance="0" xmi.id="nD19KxipJfeS" text="am" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="3" indexa="2" totalcountb="2" indexb="1" linewidth="none" widgetbid="Vtec6OvZep7Y" widgetaid="v1Qyt5PysrV2" xmi.id="iNuf7uC50BLw" type="511" linecolor="none" >
<linepath>
<startpoint startx="395" starty="171" />
<endpoint endx="540" endy="86" />
</linepath>
</assocwidget>
</associations>
</diagram>
</diagrams>
</XMI.extension>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Use Case View" isRoot="false" isAbstract="false" name="Use Case View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Component View" isRoot="false" isAbstract="false" name="Component View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Deployment View" isRoot="false" isAbstract="false" name="Deployment View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Entity Relationship Model" isRoot="false" isAbstract="false" name="Entity Relationship Model" >
<UML:Namespace.ownedElement/>
</UML:Model>
</UML:Namespace.ownedElement>
</UML:Model>
</XMI.content>
<XMI.extensions xmi.extender="umbrello" >
<docsettings viewid="tJJXQ7qLTGJd" documentation="" uniqueid="JJLpsPtBWM5U" />
<listview>
<listitem open="1" type="800" label="Views" >
<listitem open="1" type="801" id="Logical View" >
<listitem open="0" type="807" id="tJJXQ7qLTGJd" label="Action" />
<listitem open="0" type="813" id="lSGAN6DHQApL" >
<listitem open="0" type="814" id="PnRpA2YxeF9Y" />
<listitem open="0" type="814" id="THHIdjRDCzRQ" />
<listitem open="0" type="815" id="qFxhNZSAMMR4" />
<listitem open="0" type="815" id="MKeaF4nJSUdl" />
<listitem open="0" type="815" id="STOhI1BX7rpi" />
</listitem>
<listitem open="0" type="813" id="v1Qyt5PysrV2" >
<listitem open="0" type="814" id="y1DwtRnk4cXj" />
<listitem open="0" type="815" id="Wbx0pbNT3TB4" />
</listitem>
<listitem open="0" type="817" id="Vtec6OvZep7Y" >
<listitem open="0" type="815" id="r5wKwYx2uqZZ" />
</listitem>
<listitem open="0" type="830" id="Datatypes" >
<listitem open="1" type="829" id="XMIKc2o5J6Nu" />
<listitem open="1" type="829" id="XNuw315mXeUm" />
<listitem open="1" type="829" id="BKzfuxuVlEmK" />
<listitem open="1" type="829" id="oRTstiC5X0HW" />
<listitem open="1" type="829" id="Nu2tsIN4aMhU" />
<listitem open="1" type="829" id="41ex5eEr4fjx" />
<listitem open="1" type="829" id="bqKIZpHLv42H" />
<listitem open="1" type="829" id="c2eghLb5Fcw6" />
<listitem open="0" type="829" id="WUJUz2wkP4qL" />
<listitem open="1" type="829" id="mxryNx8LdqSJ" />
<listitem open="1" type="829" id="Hby3oiLsjxpm" />
<listitem open="0" type="829" id="FRk6rIA1W1VM" />
<listitem open="1" type="829" id="EnOdbIq8WtLj" />
<listitem open="0" type="829" id="vy53e946a47C" />
<listitem open="1" type="829" id="sJASdpuvRqwF" />
<listitem open="1" type="829" id="x2fBcbHSsPuV" />
<listitem open="1" type="829" id="WF5DDs0nucRc" />
</listitem>
</listitem>
<listitem open="1" type="802" id="Use Case View" />
<listitem open="1" type="821" id="Component View" />
<listitem open="1" type="827" id="Deployment View" />
<listitem open="1" type="836" id="Entity Relationship Model" />
</listitem>
</listview>
<codegeneration>
<codegenerator language="C++" />
</codegeneration>
</XMI.extensions>
</XMI>

View File

@ -0,0 +1,335 @@
<?xml version="1.0" encoding="UTF-8"?>
<XMI xmlns:UML="http://schema.omg.org/spec/UML/1.3" verified="false" timestamp="2008-02-18T19:18:04" xmi.version="1.2" >
<XMI.header>
<XMI.documentation>
<XMI.exporter>umbrello uml modeller http://uml.sf.net</XMI.exporter>
<XMI.exporterVersion>1.5.8</XMI.exporterVersion>
<XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding>
</XMI.documentation>
<XMI.metamodel xmi.name="UML" href="UML.xml" xmi.version="1.3" />
</XMI.header>
<XMI.content>
<UML:Model isSpecification="false" isLeaf="false" isRoot="false" xmi.id="m1" isAbstract="false" name="UML Model" >
<UML:Namespace.ownedElement>
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="folder" isRoot="false" isAbstract="false" name="folder" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="datatype" isRoot="false" isAbstract="false" name="datatype" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="interface" isRoot="false" isAbstract="false" name="interface" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="ActionListener" isRoot="false" isAbstract="false" name="ActionListener" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="enum" isRoot="false" isAbstract="false" name="enum" />
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Logical View" isRoot="false" isAbstract="false" name="Logical View" >
<UML:Namespace.ownedElement>
<UML:Package stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="Datatypes" isRoot="false" isAbstract="false" name="Datatypes" >
<UML:Namespace.ownedElement>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="bqKIZpHLv42H" isRoot="false" isAbstract="false" name="int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="oRTstiC5X0HW" isRoot="false" isAbstract="false" name="char" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="BKzfuxuVlEmK" isRoot="false" isAbstract="false" name="bool" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="41ex5eEr4fjx" isRoot="false" isAbstract="false" name="float" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Nu2tsIN4aMhU" isRoot="false" isAbstract="false" name="double" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Hby3oiLsjxpm" isRoot="false" isAbstract="false" name="short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="c2eghLb5Fcw6" isRoot="false" isAbstract="false" name="long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="sJASdpuvRqwF" isRoot="false" isAbstract="false" name="unsigned int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="WF5DDs0nucRc" isRoot="false" isAbstract="false" name="unsigned short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="x2fBcbHSsPuV" isRoot="false" isAbstract="false" name="unsigned long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="EnOdbIq8WtLj" isRoot="false" isAbstract="false" name="string" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="FRk6rIA1W1VM" isRoot="false" isAbstract="false" name="sqlite3 *" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="XMIKc2o5J6Nu" isRoot="false" isAbstract="false" name="ActionListener *" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="WUJUz2wkP4qL" isRoot="false" isAbstract="false" name="map&lt;int,ObjectSQL*>" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="XNuw315mXeUm" isRoot="false" isAbstract="false" name="ObjectSQL *" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="vy53e946a47C" isRoot="false" isAbstract="false" name="undef" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="KOw9slpUVSCK" />
<UML:Generalization xmi.idref="udobO5QNil4Q" />
<UML:Generalization xmi.idref="JLylJCkYo23X" />
</UML:GeneralizableElement.generalization>
</UML:DataType>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="mxryNx8LdqSJ" isRoot="false" isAbstract="false" name="map&lt;int,attribute>" elementReference="vy53e946a47C" />
</UML:Namespace.ownedElement>
</UML:Package>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ruL8hEHJf71m" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="4WdAwUoLZuKn" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="ZQctTq2d6zrP" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="hjipPCuUAVPQ" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="HLBhV75ZdihX" aggregation="composite" type="vy53e946a47C" name="" multiplicity="1" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="ATsjNCVwa7n1" aggregation="none" type="vy53e946a47C" name="" multiplicity="0..*" />
</UML:Association.connection>
</UML:Association>
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="DCXqsURB7Car" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="VvRc5zSWiu2N" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Gq5yk7K4083P" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="eHdeNg3WcYlX" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Are2UTPMWnQH" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="xne1nWR2pajK" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="horIUWpcziJM" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="CwDiWUhJndUK" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="soHTu4Sps5rd" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="ZIfOqMgV8Xna" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ZPsL0MdKjRuq" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="1aC0IVM9KdaC" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="g21W5s9e8m0w" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Generalization isSpecification="false" child="vy53e946a47C" visibility="public" namespace="Logical View" xmi.id="KOw9slpUVSCK" parent="vy53e946a47C" discriminator="" name="" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Zew276Kva1UC" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="8gRGBEoCn0C5" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="TXClAmxopzIu" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="8OffyHH7J51e" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="pRXwBXsJEKXP" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="WLaJJmNnJZYS" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="rLzAQznN0fxo" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="MWE9TX1IwYC8" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="65PINvftEFBY" aggregation="none" type="vy53e946a47C" name="" multiplicity="2" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="N2IAYOSx9uEH" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="0YJH5rhRLwYm" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="Ra3N6FVCItSf" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="adQpG9tPizWw" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="o8X2LiaLGrdL" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="hIl2EJndrq1y" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="iNuf7uC50BLw" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="3a0CTjhkgTis" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="fvsi8gCLNwfR" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="3U8MNb19hYC2" aggregation="aggregate" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="private" changeability="changeable" isNavigable="true" xmi.id="GkOUczoJFXJS" aggregation="none" type="vy53e946a47C" name="pool" multiplicity="0..*" />
</UML:Association.connection>
</UML:Association>
<UML:Generalization isSpecification="false" child="vy53e946a47C" visibility="public" namespace="Logical View" xmi.id="udobO5QNil4Q" parent="vy53e946a47C" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="vy53e946a47C" visibility="public" namespace="Logical View" xmi.id="JLylJCkYo23X" parent="vy53e946a47C" discriminator="" name="" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Kq40rRjmpqxB" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="o65gu4eyZkKu" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="LJ40sE36yPZY" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="F77Ohxt9mWLc" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="MNrbs93gD7M8" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="By6kjOd2hf3X" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="SlsDHDpgpvdB" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="t4cpRBMnWDMO" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="KQ4YXPggNkP4" aggregation="none" type="vy53e946a47C" name="template" multiplicity="1" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="XhoKcPVkULbi" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="627nh8JYAtLb" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="4hOYtkuD8yjd" aggregation="none" type="vy53e946a47C" name="history" multiplicity="1" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="NbGlbdxcIjX9" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="false" xmi.id="LNKj5jlBjqxO" aggregation="none" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="yGw89FjBx5hq" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
</UML:Namespace.ownedElement>
<XMI.extension xmi.extender="umbrello" >
<diagrams>
<diagram snapgrid="0" showattsig="1" fillcolor="#eeeee6" linewidth="0" zoom="100" showgrid="0" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="1016" snapy="10" showatts="1" xmi.id="YQA16jIjLSnq" documentation="" type="5" showops="1" showpackage="0" name="Dispatch Manager" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#990000" canvasheight="899" >
<widgets>
<statewidget statetype="1" statename="HOLD" usesdiagramfillcolor="1" width="45" x="102" fillcolor="none" y="111" linewidth="none" height="25" usefillcolor="1" isinstance="0" xmi.id="cQRsSTx1r52y" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<statewidget statetype="1" statename="PENDING" usesdiagramfillcolor="1" width="66" x="91" fillcolor="none" y="218" linewidth="none" height="25" usefillcolor="1" isinstance="0" xmi.id="oIf7iSwtl6H7" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<statewidget statetype="1" statename="ACTIVE" usesdiagramfillcolor="0" width="187" x="328" fillcolor="#eeeee6" y="203" linewidth="none" height="55" usefillcolor="1" isinstance="0" xmi.id="gZOXePTQh8WQ" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#990000" >
<Activities>
<Activity name="LCM->deploy" />
<Activity name="(SUSPENDED) LCM->restore" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="STOPPED" usesdiagramfillcolor="0" width="117" x="194" fillcolor="#eeeee6" y="362" linewidth="none" height="55" usefillcolor="1" isinstance="0" xmi.id="YSHHYWPoyrPA" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#990000" >
<Activities>
<Activity name="LCM_STATE=INIT" />
<Activity name="History[etime]" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="FAILED" usesdiagramfillcolor="0" width="117" x="520" fillcolor="#eeeee6" y="362" linewidth="none" height="55" usefillcolor="1" isinstance="0" xmi.id="QAuLNYi367Yk" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#990000" >
<Activities>
<Activity name="LCM_STATE=INIT" />
<Activity name="History[etime]" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="SUSPENDED" usesdiagramfillcolor="0" width="125" x="648" fillcolor="#eeeee6" y="203" linewidth="none" height="55" usefillcolor="1" isinstance="0" xmi.id="W2BB8hZh7rwd" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#990000" >
<Activities>
<Activity name="LCM_STATE = INIT" />
<Activity name="History[suspend]" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="DONE" usesdiagramfillcolor="0" width="117" x="363" fillcolor="#eeeee6" y="443" linewidth="none" height="55" usefillcolor="1" isinstance="0" xmi.id="tyPk2vfgYjue" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#990000" >
<Activities>
<Activity name="LCM_STATE=INIT" />
<Activity name="History[etime]" />
</Activities>
</statewidget>
<notewidget usesdiagramfillcolor="1" width="193" x="324" fillcolor="none" y="41" linewidth="none" height="76" usefillcolor="1" isinstance="0" xmi.id="CgtF4jpX9svA" text="Migrate (RUNNING)
- History[running_etime]
- History[etime]
- Add new entry to history" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="71" x="26" fillcolor="none" y="162" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="VsvOeMEcJlEJ" text="user->hold" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="90" x="135" fillcolor="none" y="162" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="S2pNB21LECn4" text="user->release" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="89" x="96" fillcolor="none" y="320" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="1WWVZKmeohiM" text="user->restore" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="96" x="534" fillcolor="none" y="200" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="SGSHvKGQqlxB" text="user->suspend" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="89" x="546" fillcolor="none" y="251" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="XcxCKK4MS0LO" text="user->restore" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="162" x="158" fillcolor="none" y="238" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="aFo8MU8l4QQ3" text="sched->deploy, add history" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="80" x="453" fillcolor="none" y="321" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="coYC6ibz4prN" text="LCM->failure" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="72" x="323" fillcolor="none" y="314" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="46uQewWJpG3o" text="user->stop" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="99" x="373" fillcolor="none" y="129" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="I5yH7l6UxYW4" text="sched->migrate" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="145" x="427" fillcolor="none" y="416" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="ojSiPm8PumOq" text="user->shutdown, cancel" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="91" x="376" fillcolor="none" y="150" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="EnUWSUICwybh" text="user->migrate" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="84" x="195" fillcolor="none" y="214" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="6ybrMPqBiUGl" text="user->deploy" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="130" x="557" fillcolor="none" y="291" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="VL63XdMttWBX" text="LCM->migrate_failure" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="135" x="557" fillcolor="none" y="310" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="fk3sNroCZoh6" text="LCM->suspend_failure" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="111" x="557" fillcolor="none" y="329" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="amcJOrZrCgsi" text="LCM->stop_failure" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="8" x="711" fillcolor="none" y="413" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="HEbBlmgOUkEs" text="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</widgets>
<messages/>
<associations>
<assocwidget totalcounta="3" indexa="1" visibilityB="200" totalcountb="3" indexb="1" linewidth="none" widgetbid="cQRsSTx1r52y" widgetaid="oIf7iSwtl6H7" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="113" starty="218" />
<endpoint endx="117" endy="136" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="gZOXePTQh8WQ" widgetaid="oIf7iSwtl6H7" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="157" starty="230" />
<endpoint endx="328" endy="230" />
</linepath>
</assocwidget>
<assocwidget totalcounta="4" indexa="1" visibilityB="200" totalcountb="3" indexb="2" linewidth="none" widgetbid="YSHHYWPoyrPA" widgetaid="gZOXePTQh8WQ" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="374" starty="258" />
<endpoint endx="272" endy="362" />
</linepath>
</assocwidget>
<assocwidget totalcounta="3" indexa="1" visibilityB="200" totalcountb="3" indexb="1" linewidth="none" widgetbid="W2BB8hZh7rwd" widgetaid="gZOXePTQh8WQ" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="515" starty="221" />
<endpoint endx="648" endy="221" />
</linepath>
</assocwidget>
<assocwidget totalcounta="4" indexa="2" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="tyPk2vfgYjue" widgetaid="gZOXePTQh8WQ" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="421" starty="258" />
<endpoint endx="421" endy="443" />
</linepath>
</assocwidget>
<assocwidget totalcounta="3" indexa="2" visibilityB="200" totalcountb="3" indexb="2" linewidth="none" widgetbid="oIf7iSwtl6H7" widgetaid="cQRsSTx1r52y" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="132" starty="136" />
<endpoint endx="135" endy="218" />
</linepath>
</assocwidget>
<assocwidget totalcounta="3" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="oIf7iSwtl6H7" widgetaid="YSHHYWPoyrPA" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="233" starty="362" />
<endpoint endx="124" endy="243" />
</linepath>
</assocwidget>
<assocwidget totalcounta="3" indexa="2" visibilityB="200" totalcountb="3" indexb="2" linewidth="none" widgetbid="gZOXePTQh8WQ" widgetaid="W2BB8hZh7rwd" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="648" starty="239" />
<endpoint endx="515" endy="239" />
</linepath>
</assocwidget>
<assocwidget totalcounta="4" indexa="3" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="QAuLNYi367Yk" widgetaid="gZOXePTQh8WQ" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="468" starty="258" />
<endpoint endx="578" endy="362" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="0" indexb="0" linewidth="none" widgetbid="gZOXePTQh8WQ" widgetaid="gZOXePTQh8WQ" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="374" starty="203" />
<endpoint endx="468" endy="203" />
<point x="374" y="153" />
<point x="468" y="153" />
</linepath>
</assocwidget>
</associations>
</diagram>
</diagrams>
</XMI.extension>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Use Case View" isRoot="false" isAbstract="false" name="Use Case View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Component View" isRoot="false" isAbstract="false" name="Component View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Deployment View" isRoot="false" isAbstract="false" name="Deployment View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Entity Relationship Model" isRoot="false" isAbstract="false" name="Entity Relationship Model" >
<UML:Namespace.ownedElement/>
</UML:Model>
</UML:Namespace.ownedElement>
</UML:Model>
</XMI.content>
<XMI.extensions xmi.extender="umbrello" >
<docsettings viewid="YQA16jIjLSnq" documentation="" uniqueid="HEbBlmgOUkEs" />
<listview>
<listitem open="1" type="800" label="Views" >
<listitem open="1" type="801" id="Logical View" >
<listitem open="0" type="808" id="YQA16jIjLSnq" label="Dispatch Manager" />
<listitem open="0" type="830" id="Datatypes" >
<listitem open="0" type="829" id="XMIKc2o5J6Nu" />
<listitem open="1" type="829" id="XNuw315mXeUm" />
<listitem open="1" type="829" id="BKzfuxuVlEmK" />
<listitem open="1" type="829" id="oRTstiC5X0HW" />
<listitem open="1" type="829" id="Nu2tsIN4aMhU" />
<listitem open="1" type="829" id="41ex5eEr4fjx" />
<listitem open="1" type="829" id="bqKIZpHLv42H" />
<listitem open="1" type="829" id="c2eghLb5Fcw6" />
<listitem open="0" type="829" id="WUJUz2wkP4qL" />
<listitem open="0" type="829" id="mxryNx8LdqSJ" />
<listitem open="1" type="829" id="Hby3oiLsjxpm" />
<listitem open="0" type="829" id="FRk6rIA1W1VM" />
<listitem open="1" type="829" id="EnOdbIq8WtLj" />
<listitem open="0" type="829" id="vy53e946a47C" />
<listitem open="1" type="829" id="sJASdpuvRqwF" />
<listitem open="1" type="829" id="x2fBcbHSsPuV" />
<listitem open="1" type="829" id="WF5DDs0nucRc" />
</listitem>
</listitem>
<listitem open="1" type="802" id="Use Case View" />
<listitem open="1" type="821" id="Component View" />
<listitem open="1" type="827" id="Deployment View" />
<listitem open="1" type="836" id="Entity Relationship Model" />
</listitem>
</listview>
<codegeneration>
<codegenerator language="C++" />
</codegeneration>
</XMI.extensions>
</XMI>

View File

@ -0,0 +1,437 @@
<?xml version="1.0" encoding="UTF-8"?>
<XMI xmlns:UML="http://schema.omg.org/spec/UML/1.3" verified="false" timestamp="2008-02-18T17:55:32" xmi.version="1.2" >
<XMI.header>
<XMI.documentation>
<XMI.exporter>umbrello uml modeller http://uml.sf.net</XMI.exporter>
<XMI.exporterVersion>1.5.8</XMI.exporterVersion>
<XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding>
</XMI.documentation>
<XMI.metamodel xmi.name="UML" href="UML.xml" xmi.version="1.3" />
</XMI.header>
<XMI.content>
<UML:Model isSpecification="false" isLeaf="false" isRoot="false" xmi.id="m1" isAbstract="false" name="UML Model" >
<UML:Namespace.ownedElement>
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="folder" isRoot="false" isAbstract="false" name="folder" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="datatype" isRoot="false" isAbstract="false" name="datatype" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="interface" isRoot="false" isAbstract="false" name="interface" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="ActionListener" isRoot="false" isAbstract="false" name="ActionListener" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="enum" isRoot="false" isAbstract="false" name="enum" />
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Logical View" isRoot="false" isAbstract="false" name="Logical View" >
<UML:Namespace.ownedElement>
<UML:Package stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="Datatypes" isRoot="false" isAbstract="false" name="Datatypes" >
<UML:Namespace.ownedElement>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="bqKIZpHLv42H" isRoot="false" isAbstract="false" name="int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="oRTstiC5X0HW" isRoot="false" isAbstract="false" name="char" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="BKzfuxuVlEmK" isRoot="false" isAbstract="false" name="bool" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="41ex5eEr4fjx" isRoot="false" isAbstract="false" name="float" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Nu2tsIN4aMhU" isRoot="false" isAbstract="false" name="double" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Hby3oiLsjxpm" isRoot="false" isAbstract="false" name="short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="c2eghLb5Fcw6" isRoot="false" isAbstract="false" name="long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="sJASdpuvRqwF" isRoot="false" isAbstract="false" name="unsigned int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="WF5DDs0nucRc" isRoot="false" isAbstract="false" name="unsigned short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="x2fBcbHSsPuV" isRoot="false" isAbstract="false" name="unsigned long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="EnOdbIq8WtLj" isRoot="false" isAbstract="false" name="string" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="FRk6rIA1W1VM" isRoot="false" isAbstract="false" name="sqlite3 *" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="XMIKc2o5J6Nu" isRoot="false" isAbstract="false" name="ActionListener *" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="WUJUz2wkP4qL" isRoot="false" isAbstract="false" name="map&lt;int,ObjectSQL*>" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="XNuw315mXeUm" isRoot="false" isAbstract="false" name="ObjectSQL *" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="vy53e946a47C" isRoot="false" isAbstract="false" name="undef" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="KOw9slpUVSCK" />
<UML:Generalization xmi.idref="udobO5QNil4Q" />
<UML:Generalization xmi.idref="JLylJCkYo23X" />
</UML:GeneralizableElement.generalization>
</UML:DataType>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="mxryNx8LdqSJ" isRoot="false" isAbstract="false" name="map&lt;int,attribute>" elementReference="vy53e946a47C" />
</UML:Namespace.ownedElement>
</UML:Package>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ruL8hEHJf71m" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="BZCkcCmjaBNG" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="sNLV7XAg4Xmk" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="hjipPCuUAVPQ" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="SqrCBTmM0x5c" aggregation="composite" type="vy53e946a47C" name="" multiplicity="1" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="7rJh1hvr4HNA" aggregation="none" type="vy53e946a47C" name="" multiplicity="0..*" />
</UML:Association.connection>
</UML:Association>
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="DCXqsURB7Car" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="VvRc5zSWiu2N" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Gq5yk7K4083P" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="eHdeNg3WcYlX" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Are2UTPMWnQH" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="oVot2YbUMSeY" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="tOstJxVQnn6m" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="CwDiWUhJndUK" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="U1dWGye5TSwT" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="0XvNyZtrwllF" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ZPsL0MdKjRuq" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="hEeU1iGThryy" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="qc1H5xl3SgOQ" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Generalization isSpecification="false" child="vy53e946a47C" visibility="public" namespace="Logical View" xmi.id="KOw9slpUVSCK" parent="vy53e946a47C" discriminator="" name="" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Zew276Kva1UC" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="EFIA11NiFzAF" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="fOiNDeL3HMLK" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="8OffyHH7J51e" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="H6Ljkk8yxQ6y" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="PSeePmr58YQM" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="rLzAQznN0fxo" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="ClPR5ilMm73X" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="p9TkXYjw0LZN" aggregation="none" type="vy53e946a47C" name="" multiplicity="2" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="N2IAYOSx9uEH" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="6QQEyqaBbyce" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="gMyRR0yE9Pyh" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="adQpG9tPizWw" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="xfdv1CH7dhJb" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="Yuk7sLmWhkx6" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="iNuf7uC50BLw" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="3a0CTjhkgTis" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="fvsi8gCLNwfR" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="ktKuJGZEwC8v" aggregation="aggregate" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="private" changeability="changeable" isNavigable="true" xmi.id="PP006JZeBKm3" aggregation="none" type="vy53e946a47C" name="pool" multiplicity="0..*" />
</UML:Association.connection>
</UML:Association>
<UML:Generalization isSpecification="false" child="vy53e946a47C" visibility="public" namespace="Logical View" xmi.id="udobO5QNil4Q" parent="vy53e946a47C" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="vy53e946a47C" visibility="public" namespace="Logical View" xmi.id="JLylJCkYo23X" parent="vy53e946a47C" discriminator="" name="" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Kq40rRjmpqxB" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="dWYIGVOzPgrg" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="uQsoc0jzNhxU" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="F77Ohxt9mWLc" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="1X6CpsESOmkd" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="F6aekRIer9TR" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="SlsDHDpgpvdB" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="9APXsMzrt51i" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="wF8IzqvFuVre" aggregation="none" type="vy53e946a47C" name="template" multiplicity="1" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="XhoKcPVkULbi" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="u8HlHiBQqavg" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="wsXoyXUukdCk" aggregation="none" type="vy53e946a47C" name="history" multiplicity="1" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="NbGlbdxcIjX9" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="false" xmi.id="R6xMZoyUwFDD" aggregation="none" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="vOcmwVSrOydK" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
</UML:Namespace.ownedElement>
<XMI.extension xmi.extender="umbrello" >
<diagrams>
<diagram snapgrid="1" showattsig="1" fillcolor="#d6d9e6" linewidth="1" zoom="100" showgrid="1" showopsig="1" usefillcolor="1" snapx="7" canvaswidth="1366" snapy="7" showatts="1" xmi.id="TmQ0063LG4Sn" documentation="" type="5" showops="1" showpackage="0" name="Life-cycle Manager" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" canvasheight="883" >
<widgets>
<statewidget statetype="1" statename="SHUTDOWN" usesdiagramfillcolor="0" width="167" x="1057" fillcolor="#d6d9e6" y="322" linewidth="none" height="40" usefillcolor="1" isinstance="0" xmi.id="XOHvRm0fOT7w" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="Trigger shutdown->VMM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="RUNNING" usesdiagramfillcolor="0" width="225" x="630" fillcolor="#d6d9e6" y="322" linewidth="none" height="40" usefillcolor="1" isinstance="0" xmi.id="gNq8uGMqbbs2" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="(MIGRATE) History[running_stime]" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="MIGRATE" usesdiagramfillcolor="0" width="103" x="518" fillcolor="#d6d9e6" y="413" linewidth="none" height="40" usefillcolor="1" isinstance="0" xmi.id="wfPL6WFmr5uk" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="migrate->VMM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="SAVE_MIGRATE" usesdiagramfillcolor="0" width="104" x="518" fillcolor="#d6d9e6" y="161" linewidth="none" height="40" usefillcolor="1" isinstance="0" xmi.id="JFYvqOvyWR4f" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="save->VMM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="SAVE_SUSPEND" usesdiagramfillcolor="0" width="107" x="686" fillcolor="#d6d9e6" y="105" linewidth="none" height="40" usefillcolor="1" isinstance="0" xmi.id="OzOi91S4erPk" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="save->VMM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="SAVE_STOP" usesdiagramfillcolor="0" width="84" x="854" fillcolor="#d6d9e6" y="161" linewidth="none" height="40" usefillcolor="1" isinstance="0" xmi.id="LcVAfNuzcQsQ" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="save->VMM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="EPILOG_STOP" usesdiagramfillcolor="0" width="156" x="1064" fillcolor="#d6d9e6" y="147" linewidth="none" height="70" usefillcolor="1" isinstance="0" xmi.id="onNIDRybPMHW" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="History[running_etime]" />
<Activity name="History[epilog_stime]" />
<Activity name="epilog->TM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="EPILOG" usesdiagramfillcolor="0" width="156" x="1064" fillcolor="#d6d9e6" y="448" linewidth="none" height="70" usefillcolor="1" isinstance="0" xmi.id="LjaxYzirZB2F" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="History[running_etime]" />
<Activity name="History[epilog_stime]" />
<Activity name="epilog->TM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="PROLOG" usesdiagramfillcolor="0" width="147" x="42" fillcolor="#d6d9e6" y="154" linewidth="none" height="55" usefillcolor="1" isinstance="0" xmi.id="YuC9L4Z7pwQ2" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="History[prolog_stime]" />
<Activity name="prolog->TM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="BOOT" usesdiagramfillcolor="0" width="155" x="133" fillcolor="#d6d9e6" y="308" linewidth="none" height="70" usefillcolor="1" isinstance="0" xmi.id="MOdjivF4cqzB" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="History[prolog_etime]" />
<Activity name="History[running_stime]" />
<Activity name="deploy/restore->VMM" />
</Activities>
</statewidget>
<floatingtext usesdiagramfillcolor="1" width="107" x="525" fillcolor="none" y="357" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="eDKe21au3YBR" text="DM->live_migrate" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="127" x="1015" fillcolor="none" y="406" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="rOwAlJsuHX3U" text="VMM->shutdown(S/F)" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="63" x="861" fillcolor="none" y="259" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="i1EQaYj2f6mN" text="DM->stop" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="82" x="539" fillcolor="none" y="259" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="vMWCDhmWu9tX" text="DM->migrate" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="87" x="749" fillcolor="none" y="224" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="CB5qoelKzyv0" text="DM->suspend" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="89" x="966" fillcolor="none" y="154" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="gs6yD5aSKGLH" text="VMM->save(S)" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="89" x="427" fillcolor="none" y="154" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="4PZJUDAa9Ndk" text="VMM->save(S)" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="89" x="168" fillcolor="none" y="245" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="6vs5prhSClqk" text="TM->prolog(S)" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<statewidget statetype="2" statename="State" usesdiagramfillcolor="1" width="21" x="728" fillcolor="none" y="28" linewidth="none" height="20" usefillcolor="1" isinstance="0" xmi.id="ARGKD44GM0RC" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<floatingtext usesdiagramfillcolor="1" width="77" x="665" fillcolor="none" y="7" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="9ty8CiwK9AfM" text="SUSPENDED" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<statewidget statetype="2" statename="State" usesdiagramfillcolor="1" width="22" x="1127" fillcolor="none" y="42" linewidth="none" height="22" usefillcolor="1" isinstance="0" xmi.id="83PhM2P4GDSS" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<floatingtext usesdiagramfillcolor="1" width="61" x="1113" fillcolor="none" y="21" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="eVtX6Ie2CPGz" text="STOPPED" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<statewidget statetype="2" statename="State" usesdiagramfillcolor="1" width="22" x="1127" fillcolor="none" y="588" linewidth="none" height="21" usefillcolor="1" isinstance="0" xmi.id="XG1lRRE5w5c1" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<floatingtext usesdiagramfillcolor="1" width="40" x="1120" fillcolor="none" y="609" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="fd6G8wCdCDOb" text="DONE" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<statewidget statetype="0" statename="State" usesdiagramfillcolor="1" width="10" x="112" fillcolor="none" y="105" linewidth="none" height="10" usefillcolor="1" isinstance="0" xmi.id="v08PQqjM2BZp" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<floatingtext usesdiagramfillcolor="1" width="58" x="91" fillcolor="none" y="84" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="JJLpsPtBWM5U" text="PENDING" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="160" x="322" fillcolor="none" y="315" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="YTyyvUNg51nW" text="VMM->deploy(S)[deploy_id]" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="75" x="119" fillcolor="none" y="119" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="1Q2v6lqhQRX1" text="DM->deploy" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="214" x="1148" fillcolor="none" y="539" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="4RdrLWpypqv0" text="TM->epilog(S), History[epilog_etime]" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="214" x="924" fillcolor="none" y="112" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="4RdrLWpypqv0" text="TM->epilog(S), History[epilog_etime]" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="99" x="672" fillcolor="none" y="385" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="6MtSICEwugLV" text="VMM->deploy(S)" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<statewidget statetype="1" statename="PROLOG_MIGRATE" usesdiagramfillcolor="0" width="147" x="238" fillcolor="#d6d9e6" y="154" linewidth="none" height="55" usefillcolor="1" isinstance="0" xmi.id="ErxuVz5x9V25" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="History[prolog_stime]" />
<Activity name="prolog->TM" />
</Activities>
</statewidget>
<floatingtext usesdiagramfillcolor="1" width="166" x="868" fillcolor="none" y="322" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="erh6yR11bFtJ" text="DM->shutdown, DM->cancel" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<statewidget statetype="0" statename="State" usesdiagramfillcolor="1" width="10" x="203" fillcolor="none" y="427" linewidth="none" height="10" usefillcolor="1" isinstance="0" xmi.id="v08PQqjM2BZp" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<floatingtext usesdiagramfillcolor="1" width="77" x="175" fillcolor="none" y="441" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="9ty8CiwK9AfM" text="SUSPENDED" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="80" x="217" fillcolor="none" y="399" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="qDWjSKieE3I6" text="DM->restore" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<statewidget statetype="1" statename="CANCEL" usesdiagramfillcolor="0" width="156" x="819" fillcolor="#d6d9e6" y="413" linewidth="none" height="40" usefillcolor="1" isinstance="0" xmi.id="xLII8ujWwYIl" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="History[running_etime]" />
</Activities>
</statewidget>
<floatingtext usesdiagramfillcolor="1" width="74" x="854" fillcolor="none" y="378" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="yE8cnCiAxs9r" text="DM->cancel" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="108" x="903" fillcolor="none" y="532" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="KhFxNSjvf2qW" text="VMM->cancel(S/F)" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="225" x="749" fillcolor="none" y="63" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="uW2hUUbihnd4" text="VMM->save(S), History[running_etime]" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</widgets>
<messages/>
<associations>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="LjaxYzirZB2F" widgetaid="XOHvRm0fOT7w" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="1141" starty="362" />
<endpoint endx="1141" endy="448" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="onNIDRybPMHW" widgetaid="LcVAfNuzcQsQ" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="938" starty="182" />
<endpoint endx="1064" endy="182" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="ARGKD44GM0RC" widgetaid="OzOi91S4erPk" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="742" starty="105" />
<endpoint endx="742" endy="48" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="83PhM2P4GDSS" widgetaid="onNIDRybPMHW" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="1141" starty="147" />
<endpoint endx="1141" endy="64" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="XG1lRRE5w5c1" widgetaid="LjaxYzirZB2F" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="1141" starty="518" />
<endpoint endx="1141" endy="588" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="YuC9L4Z7pwQ2" widgetaid="v08PQqjM2BZp" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="119" starty="115" />
<endpoint endx="119" endy="154" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="3" indexb="1" linewidth="none" widgetbid="MOdjivF4cqzB" widgetaid="YuC9L4Z7pwQ2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="119" starty="209" />
<endpoint endx="182" endy="308" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="gNq8uGMqbbs2" widgetaid="MOdjivF4cqzB" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="288" starty="343" />
<endpoint endx="630" endy="343" />
</linepath>
</assocwidget>
<assocwidget totalcounta="4" indexa="1" visibilityB="200" totalcountb="3" indexb="1" linewidth="none" widgetbid="wfPL6WFmr5uk" widgetaid="gNq8uGMqbbs2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="686" starty="362" />
<endpoint endx="553" endy="413" />
</linepath>
</assocwidget>
<assocwidget totalcounta="3" indexa="2" visibilityB="200" totalcountb="4" indexb="2" linewidth="none" widgetbid="gNq8uGMqbbs2" widgetaid="wfPL6WFmr5uk" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="588" starty="413" />
<endpoint endx="742" endy="362" />
</linepath>
</assocwidget>
<assocwidget totalcounta="4" indexa="2" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="OzOi91S4erPk" widgetaid="gNq8uGMqbbs2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="742" starty="322" />
<endpoint endx="742" endy="145" />
</linepath>
</assocwidget>
<assocwidget totalcounta="4" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="JFYvqOvyWR4f" widgetaid="gNq8uGMqbbs2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="686" starty="322" />
<endpoint endx="574" endy="201" />
</linepath>
</assocwidget>
<assocwidget totalcounta="4" indexa="3" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="LcVAfNuzcQsQ" widgetaid="gNq8uGMqbbs2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="798" starty="322" />
<endpoint endx="896" endy="201" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="XOHvRm0fOT7w" widgetaid="gNq8uGMqbbs2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="855" starty="343" />
<endpoint endx="1057" endy="343" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="3" indexb="3" linewidth="none" widgetbid="MOdjivF4cqzB" widgetaid="ErxuVz5x9V25" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="315" starty="209" />
<endpoint endx="287" endy="308" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="ErxuVz5x9V25" widgetaid="JFYvqOvyWR4f" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="518" starty="182" />
<endpoint endx="385" endy="182" />
</linepath>
</assocwidget>
<assocwidget totalcounta="4" indexa="3" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="xLII8ujWwYIl" widgetaid="gNq8uGMqbbs2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="798" starty="362" />
<endpoint endx="896" endy="413" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="XG1lRRE5w5c1" widgetaid="xLII8ujWwYIl" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="896" starty="453" />
<endpoint endx="1127" endy="602" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="MOdjivF4cqzB" widgetaid="v08PQqjM2BZp" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="210" starty="427" />
<endpoint endx="210" endy="378" />
</linepath>
</assocwidget>
</associations>
</diagram>
</diagrams>
</XMI.extension>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Use Case View" isRoot="false" isAbstract="false" name="Use Case View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Component View" isRoot="false" isAbstract="false" name="Component View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Deployment View" isRoot="false" isAbstract="false" name="Deployment View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Entity Relationship Model" isRoot="false" isAbstract="false" name="Entity Relationship Model" >
<UML:Namespace.ownedElement/>
</UML:Model>
</UML:Namespace.ownedElement>
</UML:Model>
</XMI.content>
<XMI.extensions xmi.extender="umbrello" >
<docsettings viewid="TmQ0063LG4Sn" documentation="" uniqueid="uW2hUUbihnd4" />
<listview>
<listitem open="1" type="800" label="Views" >
<listitem open="1" type="801" id="Logical View" >
<listitem open="0" type="808" id="TmQ0063LG4Sn" label="Life-cycle Manager" />
<listitem open="0" type="830" id="Datatypes" >
<listitem open="0" type="829" id="XMIKc2o5J6Nu" />
<listitem open="1" type="829" id="XNuw315mXeUm" />
<listitem open="1" type="829" id="BKzfuxuVlEmK" />
<listitem open="1" type="829" id="oRTstiC5X0HW" />
<listitem open="1" type="829" id="Nu2tsIN4aMhU" />
<listitem open="1" type="829" id="41ex5eEr4fjx" />
<listitem open="1" type="829" id="bqKIZpHLv42H" />
<listitem open="1" type="829" id="c2eghLb5Fcw6" />
<listitem open="0" type="829" id="WUJUz2wkP4qL" />
<listitem open="0" type="829" id="mxryNx8LdqSJ" />
<listitem open="1" type="829" id="Hby3oiLsjxpm" />
<listitem open="0" type="829" id="FRk6rIA1W1VM" />
<listitem open="1" type="829" id="EnOdbIq8WtLj" />
<listitem open="0" type="829" id="vy53e946a47C" />
<listitem open="1" type="829" id="sJASdpuvRqwF" />
<listitem open="1" type="829" id="x2fBcbHSsPuV" />
<listitem open="1" type="829" id="WF5DDs0nucRc" />
</listitem>
</listitem>
<listitem open="1" type="802" id="Use Case View" />
<listitem open="1" type="821" id="Component View" />
<listitem open="1" type="827" id="Deployment View" />
<listitem open="1" type="836" id="Entity Relationship Model" />
</listitem>
</listview>
<codegeneration>
<codegenerator language="C++" />
</codegeneration>
</XMI.extensions>
</XMI>

749
share/doc/design/pool.xmi Normal file
View File

@ -0,0 +1,749 @@
<?xml version="1.0" encoding="UTF-8"?>
<XMI xmlns:UML="http://schema.omg.org/spec/UML/1.3" verified="false" timestamp="2008-01-05T01:58:45" xmi.version="1.2" >
<XMI.header>
<XMI.documentation>
<XMI.exporter>umbrello uml modeller http://uml.sf.net</XMI.exporter>
<XMI.exporterVersion>1.5.8</XMI.exporterVersion>
<XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding>
</XMI.documentation>
<XMI.metamodel xmi.name="UML" href="UML.xml" xmi.version="1.3" />
</XMI.header>
<XMI.content>
<UML:Model isSpecification="false" isLeaf="false" isRoot="false" xmi.id="m1" isAbstract="false" name="UML Model" >
<UML:Namespace.ownedElement>
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="folder" isRoot="false" isAbstract="false" name="folder" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="datatype" isRoot="false" isAbstract="false" name="datatype" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="interface" isRoot="false" isAbstract="false" name="interface" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="ActionListener" isRoot="false" isAbstract="false" name="ActionListener" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="enum" isRoot="false" isAbstract="false" name="enum" />
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Logical View" isRoot="false" isAbstract="false" name="Logical View" >
<UML:Namespace.ownedElement>
<UML:Package stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="Datatypes" isRoot="false" isAbstract="false" name="Datatypes" >
<UML:Namespace.ownedElement>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="bqKIZpHLv42H" isRoot="false" isAbstract="false" name="int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="oRTstiC5X0HW" isRoot="false" isAbstract="false" name="char" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="BKzfuxuVlEmK" isRoot="false" isAbstract="false" name="bool" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="41ex5eEr4fjx" isRoot="false" isAbstract="false" name="float" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Nu2tsIN4aMhU" isRoot="false" isAbstract="false" name="double" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Hby3oiLsjxpm" isRoot="false" isAbstract="false" name="short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="c2eghLb5Fcw6" isRoot="false" isAbstract="false" name="long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="sJASdpuvRqwF" isRoot="false" isAbstract="false" name="unsigned int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="WF5DDs0nucRc" isRoot="false" isAbstract="false" name="unsigned short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="x2fBcbHSsPuV" isRoot="false" isAbstract="false" name="unsigned long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="EnOdbIq8WtLj" isRoot="false" isAbstract="false" name="string" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="FRk6rIA1W1VM" isRoot="false" isAbstract="false" name="sqlite3 *" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="XMIKc2o5J6Nu" isRoot="false" isAbstract="false" name="ActionListener *" elementReference="Vtec6OvZep7Y" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="WUJUz2wkP4qL" isRoot="false" isAbstract="false" name="map&lt;int,ObjectSQL*>" elementReference="vy53e946a47C" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="XNuw315mXeUm" isRoot="false" isAbstract="false" name="ObjectSQL *" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="vy53e946a47C" isRoot="false" isAbstract="false" name="undef" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="KOw9slpUVSCK" />
</UML:GeneralizableElement.generalization>
</UML:DataType>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="mxryNx8LdqSJ" isRoot="false" isAbstract="false" name="map&lt;int,attribute>" elementReference="qTRhqpQ0PE3f" />
</UML:Namespace.ownedElement>
</UML:Package>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ruL8hEHJf71m" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="p1P52D3l7FA2" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="Moy7NJAZQVLD" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="hjipPCuUAVPQ" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="GQiBboXQpwTp" aggregation="composite" type="vy53e946a47C" name="" multiplicity="1" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="8WbDkjD4WB9t" aggregation="none" type="vy53e946a47C" name="" multiplicity="0..*" />
</UML:Association.connection>
</UML:Association>
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="DCXqsURB7Car" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="VvRc5zSWiu2N" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Gq5yk7K4083P" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="eHdeNg3WcYlX" client="vy53e946a47C" name="" supplier="vy53e946a47C" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Are2UTPMWnQH" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="SJQspl439kCk" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="Yj8LeZ9m4kzo" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="CwDiWUhJndUK" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="RAqxL0ooJEe6" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="zg87RKpz4yJg" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ZPsL0MdKjRuq" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="VSSZAPNZZCXs" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="CLgTYJYVzgcO" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Generalization isSpecification="false" child="vy53e946a47C" visibility="public" namespace="Logical View" xmi.id="KOw9slpUVSCK" parent="vy53e946a47C" discriminator="" name="" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Zew276Kva1UC" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="0SO2Ofgt58RF" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="Vom20HvAbZe9" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="8OffyHH7J51e" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="sCeqqFEohap3" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="DVuIcLV78IA6" aggregation="none" type="vy53e946a47C" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="rLzAQznN0fxo" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="Z5HAetJV5wLv" aggregation="composite" type="vy53e946a47C" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="BXhq6WrJ2lce" aggregation="none" type="vy53e946a47C" name="" multiplicity="2" />
</UML:Association.connection>
</UML:Association>
<UML:Interface stereotype="interface" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="Vtec6OvZep7Y" isRoot="false" isAbstract="true" name="ActionListener" >
<UML:Classifier.feature>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="r5wKwYx2uqZZ" isRoot="false" isAbstract="true" isQuery="false" name="do_action" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="08TU5pmjXwFJ" value="" type="EnOdbIq8WtLj" name="actionName" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="imunZeU6akNO" value="" type="vy53e946a47C" name="actionArgs" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Interface>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="lSGAN6DHQApL" isRoot="false" isAbstract="false" name="ActionManager" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="PnRpA2YxeF9Y" type="vy53e946a47C" name="actionList" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="THHIdjRDCzRQ" type="XMIKc2o5J6Nu" name="listener" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="qFxhNZSAMMR4" isRoot="false" isAbstract="false" isQuery="false" name="loop" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="rZIavc3WN6NS" value="" type="vy53e946a47C" name="timeout" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="srF5iDwHTUD3" value="" type="vy53e946a47C" name="timerArgs" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="MKeaF4nJSUdl" isRoot="false" isAbstract="false" isQuery="false" name="trigger" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="EEPPaloeiEww" value="" type="EnOdbIq8WtLj" name="action" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="WG7hKdMiEPZy" value="" type="vy53e946a47C" name="args" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="STOhI1BX7rpi" isRoot="false" isAbstract="false" isQuery="false" name="addListener" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="CB0SMWSFO6hr" value="" type="XMIKc2o5J6Nu" name="listener" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="N2IAYOSx9uEH" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="bBKdwuH111CP" aggregation="composite" type="Vtec6OvZep7Y" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="uUMr2TQUsUyD" aggregation="none" type="lSGAN6DHQApL" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="adQpG9tPizWw" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="rMhlR1k0C2e9" aggregation="composite" type="lSGAN6DHQApL" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="wt8vsLIlneap" aggregation="none" type="Vtec6OvZep7Y" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Class stereotype="ActionListener" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="v1Qyt5PysrV2" isRoot="false" isAbstract="false" name="ExampleManager" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="public" xmi.id="y1DwtRnk4cXj" type="lSGAN6DHQApL" name="am" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="Wbx0pbNT3TB4" isRoot="false" isAbstract="false" isQuery="false" name="do_action" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="1UA1ujuNmUZI" value="" type="EnOdbIq8WtLj" name="actionName" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="AA353JgE6fjG" value="" type="vy53e946a47C" name="actionArgs" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Abstraction isSpecification="false" visibility="public" namespace="Logical View" xmi.id="iNuf7uC50BLw" client="v1Qyt5PysrV2" name="" supplier="Vtec6OvZep7Y" />
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="FTcjgY1ruC0v" isRoot="false" isAbstract="false" name="ObjectSQL" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="1oS3xv31KiB4" type="bqKIZpHLv42H" name="oid" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="ixTgs2fhSgcN" type="ypAsly1Z2KtR" name="mutex" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="nbM2o3ajdhrk" isRoot="false" isAbstract="false" isQuery="false" name="lock" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="cYMrUig7UHTW" isRoot="false" isAbstract="false" isQuery="false" name="unlock" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="IDwc2QJgWnvx" isRoot="false" isAbstract="true" isQuery="false" name="select" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="XAJL1i0cYd38" value="" type="FRk6rIA1W1VM" name="db" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="M1RmI6G51EM0" isRoot="false" isAbstract="true" isQuery="false" name="insert" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="t0UviVXF8YLM" value="" type="FRk6rIA1W1VM" name="db" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="QzClxwWHdfMc" isRoot="false" isAbstract="false" name="PoolSQL" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="ufg9C6NNEIhF" type="bqKIZpHLv42H" name="lastOID" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="FZr0VlUmM86y" type="WUJUz2wkP4qL" name="pool" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="ItJ2xkSJdUgP" type="FRk6rIA1W1VM" name="db" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="private" xmi.id="nTmQ2dvvUMVn" isRoot="false" isAbstract="true" isQuery="false" name="initLastOID" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="private" xmi.id="vcv2H4PsHW1N" isRoot="false" isAbstract="true" isQuery="false" name="create" >
<UML:BehavioralFeature.parameter>
<UML:Parameter kind="return" xmi.id="xOMjFuuBaxiB" type="XNuw315mXeUm" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="tZBwi4Zb7qdU" isRoot="false" isAbstract="false" isQuery="false" name="allocate" >
<UML:BehavioralFeature.parameter>
<UML:Parameter kind="return" xmi.id="caYspxUlaybN" type="bqKIZpHLv42H" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="gGjXn5Sh8Rku" value="" type="XNuw315mXeUm" name="obj" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="4HEQcydWqn6n" isRoot="false" isAbstract="false" isQuery="false" name="get" >
<UML:BehavioralFeature.parameter>
<UML:Parameter kind="return" xmi.id="XWMuNb4DpWFh" type="XNuw315mXeUm" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="JCfn5YzTBFJW" value="" type="bqKIZpHLv42H" name="oid" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="rGU4tF7PEYbS" value="" type="BKzfuxuVlEmK" name="lock" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="3a0CTjhkgTis" client="QzClxwWHdfMc" name="" supplier="FTcjgY1ruC0v" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="fvsi8gCLNwfR" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="khNKXOHOAGRv" aggregation="aggregate" type="QzClxwWHdfMc" name="" />
<UML:AssociationEnd isSpecification="false" visibility="private" changeability="changeable" isNavigable="true" xmi.id="qcdHvDaV6dud" aggregation="none" type="FTcjgY1ruC0v" name="pool" multiplicity="0..*" />
</UML:Association.connection>
</UML:Association>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="KCAGyFqIpgL0" isRoot="false" isAbstract="false" name="VMPool" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="udobO5QNil4Q" />
</UML:GeneralizableElement.generalization>
</UML:Class>
<UML:Generalization isSpecification="false" child="KCAGyFqIpgL0" visibility="public" namespace="Logical View" xmi.id="udobO5QNil4Q" parent="QzClxwWHdfMc" discriminator="" name="" />
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="7a8pQxuHOv3I" isRoot="false" isAbstract="false" name="VM" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="JLylJCkYo23X" />
</UML:GeneralizableElement.generalization>
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="public" xmi.id="I1swDie713Rd" type="HyJpS3PRU1Kj" name="template" />
<UML:Attribute isSpecification="false" visibility="public" xmi.id="qJQVdL68irlQ" type="z7Dg2MlvQ7CM" name="history" />
<UML:Attribute isSpecification="false" visibility="public" xmi.id="c5qYO6nEljFF" type="bqKIZpHLv42H" name="uid" />
<UML:Attribute isSpecification="false" visibility="public" xmi.id="C2CvmPBZYxhn" type="EnOdbIq8WtLj" name="directory" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="1MY8bxtpD5th" type="XnOFdBKmjtR7" name="state" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="3hebSdUOoDAF" isRoot="false" isAbstract="false" isQuery="false" name="select" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="a1xZbOKW0R5l" value="" type="FRk6rIA1W1VM" name="db" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="4ICQgXHT7GOe" isRoot="false" isAbstract="false" isQuery="false" name="insert" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="fy1W6wbM6z0d" value="" type="FRk6rIA1W1VM" name="db" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Generalization isSpecification="false" child="7a8pQxuHOv3I" visibility="public" namespace="Logical View" xmi.id="JLylJCkYo23X" parent="FTcjgY1ruC0v" discriminator="" name="" />
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="z7Dg2MlvQ7CM" isRoot="false" isAbstract="false" name="History" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="QcFMJ056hrSv" type="m0Kw7a2RrIht" name="stime" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="x7VATmBXqsOJ" type="m0Kw7a2RrIht" name="etime" />
</UML:Classifier.feature>
</UML:Class>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="HyJpS3PRU1Kj" isRoot="false" isAbstract="false" name="Template" >
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="Q6C0ik7hGMJ2" type="mxryNx8LdqSJ" name="attributes" />
</UML:Classifier.feature>
</UML:Class>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="Kq40rRjmpqxB" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="fg33zGJS152Q" aggregation="composite" type="HyJpS3PRU1Kj" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="kE4SbYlkuKKX" aggregation="none" type="7a8pQxuHOv3I" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="F77Ohxt9mWLc" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="VqlWikfMRgPO" aggregation="composite" type="HyJpS3PRU1Kj" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="wgqwltMU5Owg" aggregation="none" type="7a8pQxuHOv3I" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="SlsDHDpgpvdB" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="wfPqzjLTY7zG" aggregation="composite" type="7a8pQxuHOv3I" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="pdcGJzfGgTAP" aggregation="none" type="HyJpS3PRU1Kj" name="template" multiplicity="1" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="XhoKcPVkULbi" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="KUtPso4mTTaR" aggregation="composite" type="7a8pQxuHOv3I" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="Awui1txqWZ5q" aggregation="none" type="z7Dg2MlvQ7CM" name="history" multiplicity="1" />
</UML:Association.connection>
</UML:Association>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="m0Kw7a2RrIht" isRoot="false" isAbstract="false" name="time_t" />
<UML:Enumeration stereotype="enum" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="XnOFdBKmjtR7" isRoot="false" isAbstract="false" name="VM_STATE" >
<UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="XnOFdBKmjtR7" xmi.id="ZrmvfBSRZf4i" isRoot="false" isAbstract="false" name="LM_STATE_INIT" />
<UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="XnOFdBKmjtR7" xmi.id="Pk8VgQdGINBv" isRoot="false" isAbstract="false" name="LM_STATE_PENDING" />
<UML:EnumerationLiteral isSpecification="false" isLeaf="false" visibility="public" namespace="XnOFdBKmjtR7" xmi.id="j0GohzR4iZYO" isRoot="false" isAbstract="false" name="LM_STATE_ACTIVE" />
</UML:Enumeration>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="qTRhqpQ0PE3f" isRoot="false" isAbstract="false" name="map" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="NbGlbdxcIjX9" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="false" xmi.id="Q026SwcirsQG" aggregation="none" type="KCAGyFqIpgL0" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="jYnVZ2HTHrr1" aggregation="none" type="7a8pQxuHOv3I" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="ypAsly1Z2KtR" isRoot="false" isAbstract="false" name="pthread_mutex_t" />
</UML:Namespace.ownedElement>
<XMI.extension xmi.extender="umbrello" >
<diagrams>
<diagram snapgrid="1" showattsig="1" fillcolor="#e0e4c5" linewidth="0" zoom="100" showgrid="1" showopsig="1" usefillcolor="1" snapx="7" canvaswidth="806" snapy="7" showatts="1" xmi.id="DpoC0D4VUaxG" documentation="" type="1" showops="1" showpackage="0" name="VMpool" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" canvasheight="560" >
<widgets>
<classwidget usesdiagramfillcolor="0" width="161" showattsigs="601" x="427" fillcolor="#e0e4c5" y="28" showopsigs="601" linewidth="none" height="105" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="FTcjgY1ruC0v" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,1,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="234" showattsigs="601" x="21" fillcolor="#e0e4c5" y="21" showopsigs="601" linewidth="none" height="120" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="QzClxwWHdfMc" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="1" width="59" showattsigs="601" x="112" fillcolor="none" y="238" showopsigs="601" linewidth="none" height="29" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="KCAGyFqIpgL0" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<classwidget usesdiagramfillcolor="0" width="139" showattsigs="601" x="441" fillcolor="#e0e4c5" y="189" showopsigs="601" linewidth="none" height="120" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="7a8pQxuHOv3I" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="98" showattsigs="601" x="672" fillcolor="#e0e4c5" y="308" showopsigs="601" linewidth="none" height="52" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="z7Dg2MlvQ7CM" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="195" showattsigs="601" x="602" fillcolor="#e0e4c5" y="140" showopsigs="601" linewidth="none" height="37" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="HyJpS3PRU1Kj" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<enumwidget usesdiagramfillcolor="0" width="123" x="448" fillcolor="#e0e4c5" y="364" linewidth="none" height="75" usefillcolor="1" isinstance="0" xmi.id="XnOFdBKmjtR7" showpackage="0" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#312e2a" />
</widgets>
<messages/>
<associations>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="FTcjgY1ruC0v" widgetaid="QzClxwWHdfMc" xmi.id="fvsi8gCLNwfR" type="501" linecolor="none" >
<linepath>
<startpoint startx="255" starty="84" />
<endpoint endx="427" endy="84" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="29" x="399" fillcolor="none" y="63" linewidth="none" posttext="" role="702" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="HkoWZfV3hlw0" text="0..*" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="36" x="392" fillcolor="none" y="84" linewidth="none" posttext="" role="710" height="19" usefillcolor="1" pretext="-" isinstance="0" xmi.id="OQpDGFRzmETL" text="pool" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="QzClxwWHdfMc" widgetaid="KCAGyFqIpgL0" xmi.id="udobO5QNil4Q" type="500" linecolor="none" >
<linepath>
<startpoint startx="140" starty="238" />
<endpoint endx="140" endy="141" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="FTcjgY1ruC0v" widgetaid="7a8pQxuHOv3I" xmi.id="JLylJCkYo23X" type="500" linecolor="none" >
<linepath>
<startpoint startx="511" starty="189" />
<endpoint endx="511" endy="133" />
</linepath>
</assocwidget>
<assocwidget totalcounta="3" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="HyJpS3PRU1Kj" widgetaid="7a8pQxuHOv3I" xmi.id="I1swDie713Rd" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="580" starty="231" />
<endpoint endx="700" endy="177" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="67" x="630" fillcolor="none" y="196" linewidth="none" posttext="" role="710" height="19" usefillcolor="1" pretext="+" isinstance="0" xmi.id="TLj9nUGBu6N9" text="template" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="3" indexa="2" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="z7Dg2MlvQ7CM" widgetaid="7a8pQxuHOv3I" xmi.id="qJQVdL68irlQ" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="580" starty="273" />
<endpoint endx="672" endy="336" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="56" x="623" fillcolor="none" y="315" linewidth="none" posttext="" role="710" height="19" usefillcolor="1" pretext="+" isinstance="0" xmi.id="Lo873bQIJEos" text="history" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="XnOFdBKmjtR7" widgetaid="7a8pQxuHOv3I" xmi.id="1MY8bxtpD5th" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="511" starty="309" />
<endpoint endx="511" endy="364" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="41" x="476" fillcolor="none" y="343" linewidth="none" posttext="" role="710" height="19" usefillcolor="1" pretext="-" isinstance="0" xmi.id="sJtZ4pXVBEcy" text="state" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="7a8pQxuHOv3I" widgetaid="KCAGyFqIpgL0" xmi.id="NbGlbdxcIjX9" type="512" linecolor="none" >
<linepath>
<startpoint startx="171" starty="252" />
<endpoint endx="441" endy="252" />
</linepath>
</assocwidget>
</associations>
</diagram>
<diagram snapgrid="0" showattsig="1" fillcolor="#eee9e9" linewidth="0" zoom="100" showgrid="1" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="806" snapy="10" showatts="1" xmi.id="tJJXQ7qLTGJd" documentation="" type="1" showops="1" showpackage="0" name="Action" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#8b8989" canvasheight="560" >
<widgets>
<interfacewidget usesdiagramfillcolor="0" width="307" x="387" fillcolor="#eee9e9" y="34" drawascircle="0" showopsigs="601" linewidth="none" height="52" usefillcolor="1" showpubliconly="0" isinstance="0" xmi.id="Vtec6OvZep7Y" showoperations="1" showpackage="0" showscope="1" showstereotype="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#8b8989" />
<classwidget usesdiagramfillcolor="0" width="251" showattsigs="601" x="20" fillcolor="#eee9e9" y="15" showopsigs="601" linewidth="none" height="90" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="lSGAN6DHQApL" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#8b8989" />
<classwidget usesdiagramfillcolor="0" width="307" showattsigs="601" x="191" fillcolor="#99cccc" y="171" showopsigs="601" linewidth="none" height="57" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="v1Qyt5PysrV2" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#8b8989" />
</widgets>
<messages/>
<associations>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="Vtec6OvZep7Y" widgetaid="lSGAN6DHQApL" xmi.id="THHIdjRDCzRQ" type="501" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="271" starty="60" />
<endpoint endx="387" endy="60" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="30" x="353" fillcolor="none" y="44" linewidth="none" posttext="" role="702" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="Soam3OctfWQj" text="0..1" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="55" x="330" fillcolor="none" y="61" linewidth="none" posttext="" role="710" height="19" usefillcolor="1" pretext="-" isinstance="0" xmi.id="jt8bzTkIHtOI" text="listener" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="3" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="lSGAN6DHQApL" widgetaid="v1Qyt5PysrV2" xmi.id="y1DwtRnk4cXj" type="510" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="293" starty="171" />
<endpoint endx="145" endy="105" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="35" x="147" fillcolor="none" y="107" linewidth="none" posttext="" role="710" height="19" usefillcolor="1" pretext="+" isinstance="0" xmi.id="JyCUCpRvgXXf" text="am" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="3" indexa="2" totalcountb="2" indexb="1" linewidth="none" widgetbid="Vtec6OvZep7Y" widgetaid="v1Qyt5PysrV2" xmi.id="iNuf7uC50BLw" type="511" linecolor="none" >
<linepath>
<startpoint startx="395" starty="171" />
<endpoint endx="540" endy="86" />
</linepath>
</assocwidget>
</associations>
</diagram>
<diagram snapgrid="0" showattsig="1" fillcolor="#eeeee6" linewidth="0" zoom="100" showgrid="0" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="806" snapy="10" showatts="1" xmi.id="YQA16jIjLSnq" documentation="" type="5" showops="1" showpackage="0" name="Dispatch Manager" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#990000" canvasheight="560" >
<widgets>
<statewidget statetype="1" statename="HOLD" usesdiagramfillcolor="1" width="45" x="193" fillcolor="none" y="82" linewidth="none" height="25" usefillcolor="1" isinstance="0" xmi.id="cQRsSTx1r52y" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<statewidget statetype="1" statename="PENDING" usesdiagramfillcolor="1" width="66" x="182" fillcolor="none" y="198" linewidth="none" height="25" usefillcolor="1" isinstance="0" xmi.id="oIf7iSwtl6H7" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<statewidget statetype="1" statename="ACTIVE" usesdiagramfillcolor="1" width="55" x="328" fillcolor="none" y="198" linewidth="none" height="25" usefillcolor="1" isinstance="0" xmi.id="gZOXePTQh8WQ" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<statewidget statetype="1" statename="STOPPED" usesdiagramfillcolor="1" width="69" x="321" fillcolor="none" y="276" linewidth="none" height="25" usefillcolor="1" isinstance="0" xmi.id="YSHHYWPoyrPA" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<statewidget statetype="1" statename="FAILED" usesdiagramfillcolor="1" width="54" x="194" fillcolor="none" y="283" linewidth="none" height="25" usefillcolor="1" isinstance="0" xmi.id="QAuLNYi367Yk" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<statewidget statetype="1" statename="SUSPENDED" usesdiagramfillcolor="1" width="86" x="463" fillcolor="none" y="198" linewidth="none" height="25" usefillcolor="1" isinstance="0" xmi.id="W2BB8hZh7rwd" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<statewidget statetype="1" statename="DONE" usesdiagramfillcolor="1" width="46" x="332" fillcolor="none" y="94" linewidth="none" height="25" usefillcolor="1" isinstance="0" xmi.id="tyPk2vfgYjue" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
</widgets>
<messages/>
<associations>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="3" indexb="1" linewidth="none" widgetbid="cQRsSTx1r52y" widgetaid="oIf7iSwtl6H7" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="215" starty="198" />
<endpoint endx="208" endy="107" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="gZOXePTQh8WQ" widgetaid="oIf7iSwtl6H7" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="248" starty="210" />
<endpoint endx="328" endy="210" />
</linepath>
</assocwidget>
<assocwidget totalcounta="3" indexa="2" visibilityB="200" totalcountb="3" indexb="1" linewidth="none" widgetbid="gZOXePTQh8WQ" widgetaid="cQRsSTx1r52y" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="223" starty="107" />
<endpoint endx="346" endy="198" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="YSHHYWPoyrPA" widgetaid="gZOXePTQh8WQ" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="355" starty="223" />
<endpoint endx="355" endy="276" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="W2BB8hZh7rwd" widgetaid="gZOXePTQh8WQ" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="383" starty="210" />
<endpoint endx="463" endy="210" />
</linepath>
</assocwidget>
<assocwidget totalcounta="3" indexa="2" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="tyPk2vfgYjue" widgetaid="gZOXePTQh8WQ" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="364" starty="198" />
<endpoint endx="355" endy="119" />
</linepath>
</assocwidget>
</associations>
</diagram>
<diagram snapgrid="1" showattsig="1" fillcolor="#d6d9e6" linewidth="1" zoom="100" showgrid="1" showopsig="1" usefillcolor="1" snapx="7" canvaswidth="1001" snapy="7" showatts="1" xmi.id="TmQ0063LG4Sn" documentation="" type="5" showops="1" showpackage="0" name="Life-cycle Manager" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" canvasheight="569" >
<widgets>
<statewidget statetype="1" statename="SHUTDOWN" usesdiagramfillcolor="0" width="167" x="819" fillcolor="#d6d9e6" y="294" linewidth="none" height="40" usefillcolor="1" isinstance="0" xmi.id="XOHvRm0fOT7w" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="Trigger shutdown->VMM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="RUNNING" usesdiagramfillcolor="0" width="260" x="434" fillcolor="#d6d9e6" y="287" linewidth="none" height="55" usefillcolor="1" isinstance="0" xmi.id="gNq8uGMqbbs2" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="(CHECKPOINT) Trigger checkpoint->TM" />
<Activity name="(MIGRATE) History[running_stime]" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="CHECKPOINT" usesdiagramfillcolor="0" width="174" x="567" fillcolor="#d6d9e6" y="427" linewidth="none" height="40" usefillcolor="1" isinstance="0" xmi.id="88W8ByvjKCel" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="Trigger checkpoint->VMM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="MIGRATE" usesdiagramfillcolor="0" width="162" x="364" fillcolor="#d6d9e6" y="420" linewidth="none" height="55" usefillcolor="1" isinstance="0" xmi.id="wfPL6WFmr5uk" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="Trigger migrate->VMM" />
<Activity name="History*[running_etime]" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="SAVE_MIGRATE" usesdiagramfillcolor="0" width="134" x="399" fillcolor="#d6d9e6" y="189" linewidth="none" height="40" usefillcolor="1" isinstance="0" xmi.id="JFYvqOvyWR4f" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="Trigger save->VMM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="SAVE_SUSPEND" usesdiagramfillcolor="0" width="134" x="497" fillcolor="#d6d9e6" y="112" linewidth="none" height="40" usefillcolor="1" isinstance="0" xmi.id="OzOi91S4erPk" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="Trigger save->VMM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="SAVE_STOP" usesdiagramfillcolor="0" width="134" x="595" fillcolor="#d6d9e6" y="189" linewidth="none" height="40" usefillcolor="1" isinstance="0" xmi.id="LcVAfNuzcQsQ" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="Trigger save->VMM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="EPILOG_STOP" usesdiagramfillcolor="0" width="156" x="826" fillcolor="#d6d9e6" y="175" linewidth="none" height="70" usefillcolor="1" isinstance="0" xmi.id="onNIDRybPMHW" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="History[running_etime]" />
<Activity name="History[epilog_stime]" />
<Activity name="Trigger epilog->TM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="EPILOG" usesdiagramfillcolor="0" width="156" x="826" fillcolor="#d6d9e6" y="413" linewidth="none" height="70" usefillcolor="1" isinstance="0" xmi.id="LjaxYzirZB2F" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="History[running_etime]" />
<Activity name="History[epilog_stime]" />
<Activity name="Trigger epilog->TM" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="PROLOG" usesdiagramfillcolor="0" width="270" x="7" fillcolor="#d6d9e6" y="175" linewidth="none" height="70" usefillcolor="1" isinstance="0" xmi.id="YuC9L4Z7pwQ2" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="History[prolog_stime]" />
<Activity name="Trigger prolog->TM" />
<Activity name="(SAVE_MIGRATE) History*[running_etime]" />
</Activities>
</statewidget>
<statewidget statetype="1" statename="BOOT" usesdiagramfillcolor="0" width="155" x="63" fillcolor="#d6d9e6" y="280" linewidth="none" height="70" usefillcolor="1" isinstance="0" xmi.id="MOdjivF4cqzB" documentation="" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#4d515b" >
<Activities>
<Activity name="History[prolog_etime]" />
<Activity name="History[running_stime]" />
<Activity name="Trigger deploy->VMM" />
</Activities>
</statewidget>
<floatingtext usesdiagramfillcolor="1" width="182" x="231" fillcolor="none" y="322" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="CJBKMeDpiVSV" text="VMM->deploy(S)[Set deploy_id]" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="107" x="364" fillcolor="none" y="364" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="eDKe21au3YBR" text="DM->live_migrate" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="74" x="644" fillcolor="none" y="364" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="6BKNNkBzfBDl" text="LCM->timer" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="94" x="700" fillcolor="none" y="287" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="HXC57ChIxGHm" text="DM->Shutdown" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="127" x="777" fillcolor="none" y="371" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="rOwAlJsuHX3U" text="VMM->shutdown(S/F)" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="63" x="672" fillcolor="none" y="252" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="i1EQaYj2f6mN" text="DM->stop" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="82" x="420" fillcolor="none" y="252" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="vMWCDhmWu9tX" text="DM->migrate" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="87" x="553" fillcolor="none" y="252" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="CB5qoelKzyv0" text="DM->suspend" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="89" x="735" fillcolor="none" y="182" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="gs6yD5aSKGLH" text="VMM->save(S)" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="89" x="301" fillcolor="none" y="189" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="4PZJUDAa9Ndk" text="VMM->save(S)" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="89" x="147" fillcolor="none" y="252" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="6vs5prhSClqk" text="TM->prolog(S)" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<statewidget statetype="2" statename="State" usesdiagramfillcolor="1" width="19" x="560" fillcolor="none" y="49" linewidth="none" height="19" usefillcolor="1" isinstance="0" xmi.id="ARGKD44GM0RC" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<floatingtext usesdiagramfillcolor="1" width="77" x="588" fillcolor="none" y="35" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="9ty8CiwK9AfM" text="SUSPENDED" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="89" x="581" fillcolor="none" y="84" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="4PZJUDAa9Ndk" text="VMM->save(S)" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<statewidget statetype="2" statename="State" usesdiagramfillcolor="1" width="22" x="889" fillcolor="none" y="112" linewidth="none" height="22" usefillcolor="1" isinstance="0" xmi.id="83PhM2P4GDSS" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<floatingtext usesdiagramfillcolor="1" width="61" x="896" fillcolor="none" y="98" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="eVtX6Ie2CPGz" text="STOPPED" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="87" x="910" fillcolor="none" y="147" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="eacH2b7BcVsy" text="TM->epilog(S)" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<statewidget statetype="2" statename="State" usesdiagramfillcolor="1" width="22" x="889" fillcolor="none" y="518" linewidth="none" height="21" usefillcolor="1" isinstance="0" xmi.id="XG1lRRE5w5c1" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<floatingtext usesdiagramfillcolor="1" width="87" x="805" fillcolor="none" y="490" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="LE3VdKUIs4Xv" text="TM->epilog(S)" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="40" x="882" fillcolor="none" y="546" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="fd6G8wCdCDOb" text="DONE" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<statewidget statetype="0" statename="State" usesdiagramfillcolor="1" width="10" x="133" fillcolor="none" y="105" linewidth="none" height="10" usefillcolor="1" isinstance="0" xmi.id="v08PQqjM2BZp" documentation="" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" >
<Activities/>
</statewidget>
<floatingtext usesdiagramfillcolor="1" width="58" x="154" fillcolor="none" y="91" linewidth="none" posttext="" role="700" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="JJLpsPtBWM5U" text="PENDING" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</widgets>
<messages/>
<associations>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="MOdjivF4cqzB" widgetaid="YuC9L4Z7pwQ2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="140" starty="245" />
<endpoint endx="140" endy="280" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="gNq8uGMqbbs2" widgetaid="MOdjivF4cqzB" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="218" starty="315" />
<endpoint endx="434" endy="315" />
</linepath>
</assocwidget>
<assocwidget totalcounta="3" indexa="2" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="88W8ByvjKCel" widgetaid="gNq8uGMqbbs2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="609" starty="342" />
<endpoint endx="658" endy="427" />
</linepath>
</assocwidget>
<assocwidget totalcounta="3" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="wfPL6WFmr5uk" widgetaid="gNq8uGMqbbs2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="518" starty="342" />
<endpoint endx="448" endy="420" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="XOHvRm0fOT7w" widgetaid="gNq8uGMqbbs2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="694" starty="315" />
<endpoint endx="819" endy="315" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="LjaxYzirZB2F" widgetaid="XOHvRm0fOT7w" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="903" starty="334" />
<endpoint endx="903" endy="413" />
</linepath>
</assocwidget>
<assocwidget totalcounta="4" indexa="2" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="OzOi91S4erPk" widgetaid="gNq8uGMqbbs2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="567" starty="287" />
<endpoint endx="567" endy="152" />
</linepath>
</assocwidget>
<assocwidget totalcounta="4" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="JFYvqOvyWR4f" widgetaid="gNq8uGMqbbs2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="497" starty="287" />
<endpoint endx="469" endy="229" />
</linepath>
</assocwidget>
<assocwidget totalcounta="4" indexa="3" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="LcVAfNuzcQsQ" widgetaid="gNq8uGMqbbs2" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="630" starty="287" />
<endpoint endx="665" endy="229" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="YuC9L4Z7pwQ2" widgetaid="JFYvqOvyWR4f" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="399" starty="210" />
<endpoint endx="277" endy="210" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="onNIDRybPMHW" widgetaid="LcVAfNuzcQsQ" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="729" starty="210" />
<endpoint endx="826" endy="210" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="ARGKD44GM0RC" widgetaid="OzOi91S4erPk" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="567" starty="112" />
<endpoint endx="567" endy="68" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="83PhM2P4GDSS" widgetaid="onNIDRybPMHW" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="903" starty="175" />
<endpoint endx="903" endy="134" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="XG1lRRE5w5c1" widgetaid="LjaxYzirZB2F" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="903" starty="483" />
<endpoint endx="903" endy="518" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="YuC9L4Z7pwQ2" widgetaid="v08PQqjM2BZp" roleBdoc="" documentation="" roleAdoc="" type="514" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="140" starty="115" />
<endpoint endx="140" endy="175" />
</linepath>
</assocwidget>
</associations>
</diagram>
</diagrams>
</XMI.extension>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Use Case View" isRoot="false" isAbstract="false" name="Use Case View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Component View" isRoot="false" isAbstract="false" name="Component View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Deployment View" isRoot="false" isAbstract="false" name="Deployment View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Entity Relationship Model" isRoot="false" isAbstract="false" name="Entity Relationship Model" >
<UML:Namespace.ownedElement/>
</UML:Model>
</UML:Namespace.ownedElement>
</UML:Model>
</XMI.content>
<XMI.extensions xmi.extender="umbrello" >
<docsettings viewid="TmQ0063LG4Sn" documentation="" uniqueid="JJLpsPtBWM5U" />
<listview>
<listitem open="1" type="800" label="Views" >
<listitem open="1" type="801" id="Logical View" >
<listitem open="0" type="807" id="tJJXQ7qLTGJd" label="Action" />
<listitem open="0" type="807" id="DpoC0D4VUaxG" label="VMpool" />
<listitem open="0" type="808" id="YQA16jIjLSnq" label="Dispatch Manager" />
<listitem open="0" type="808" id="TmQ0063LG4Sn" label="Life-cycle Manager" />
<listitem open="0" type="813" id="lSGAN6DHQApL" >
<listitem open="0" type="814" id="PnRpA2YxeF9Y" />
<listitem open="0" type="814" id="THHIdjRDCzRQ" />
<listitem open="0" type="815" id="qFxhNZSAMMR4" />
<listitem open="0" type="815" id="MKeaF4nJSUdl" />
<listitem open="0" type="815" id="STOhI1BX7rpi" />
</listitem>
<listitem open="0" type="813" id="v1Qyt5PysrV2" >
<listitem open="0" type="814" id="y1DwtRnk4cXj" />
<listitem open="0" type="815" id="Wbx0pbNT3TB4" />
</listitem>
<listitem open="0" type="813" id="z7Dg2MlvQ7CM" >
<listitem open="0" type="814" id="QcFMJ056hrSv" />
<listitem open="0" type="814" id="x7VATmBXqsOJ" />
</listitem>
<listitem open="0" type="813" id="FTcjgY1ruC0v" >
<listitem open="0" type="814" id="1oS3xv31KiB4" />
<listitem open="0" type="814" id="ixTgs2fhSgcN" />
<listitem open="0" type="815" id="nbM2o3ajdhrk" />
<listitem open="0" type="815" id="cYMrUig7UHTW" />
<listitem open="0" type="815" id="IDwc2QJgWnvx" />
<listitem open="0" type="815" id="M1RmI6G51EM0" />
</listitem>
<listitem open="0" type="813" id="QzClxwWHdfMc" >
<listitem open="0" type="814" id="ufg9C6NNEIhF" />
<listitem open="0" type="814" id="FZr0VlUmM86y" />
<listitem open="0" type="814" id="ItJ2xkSJdUgP" />
<listitem open="0" type="815" id="nTmQ2dvvUMVn" />
<listitem open="0" type="815" id="vcv2H4PsHW1N" />
<listitem open="0" type="815" id="tZBwi4Zb7qdU" />
<listitem open="0" type="815" id="4HEQcydWqn6n" />
</listitem>
<listitem open="0" type="813" id="HyJpS3PRU1Kj" >
<listitem open="0" type="814" id="Q6C0ik7hGMJ2" />
</listitem>
<listitem open="0" type="813" id="7a8pQxuHOv3I" >
<listitem open="0" type="814" id="I1swDie713Rd" />
<listitem open="0" type="814" id="qJQVdL68irlQ" />
<listitem open="0" type="814" id="c5qYO6nEljFF" />
<listitem open="0" type="814" id="C2CvmPBZYxhn" />
<listitem open="0" type="814" id="1MY8bxtpD5th" />
<listitem open="0" type="815" id="3hebSdUOoDAF" />
<listitem open="0" type="815" id="4ICQgXHT7GOe" />
</listitem>
<listitem open="1" type="813" id="KCAGyFqIpgL0" />
<listitem open="1" type="813" id="qTRhqpQ0PE3f" />
<listitem open="1" type="813" id="ypAsly1Z2KtR" />
<listitem open="1" type="813" id="m0Kw7a2RrIht" />
<listitem open="0" type="817" id="Vtec6OvZep7Y" >
<listitem open="0" type="815" id="r5wKwYx2uqZZ" />
</listitem>
<listitem open="0" type="830" id="Datatypes" >
<listitem open="1" type="829" id="XMIKc2o5J6Nu" />
<listitem open="1" type="829" id="XNuw315mXeUm" />
<listitem open="1" type="829" id="BKzfuxuVlEmK" />
<listitem open="1" type="829" id="oRTstiC5X0HW" />
<listitem open="1" type="829" id="Nu2tsIN4aMhU" />
<listitem open="1" type="829" id="41ex5eEr4fjx" />
<listitem open="1" type="829" id="bqKIZpHLv42H" />
<listitem open="1" type="829" id="c2eghLb5Fcw6" />
<listitem open="0" type="829" id="WUJUz2wkP4qL" />
<listitem open="1" type="829" id="mxryNx8LdqSJ" />
<listitem open="1" type="829" id="Hby3oiLsjxpm" />
<listitem open="0" type="829" id="FRk6rIA1W1VM" />
<listitem open="1" type="829" id="EnOdbIq8WtLj" />
<listitem open="0" type="829" id="vy53e946a47C" />
<listitem open="1" type="829" id="sJASdpuvRqwF" />
<listitem open="1" type="829" id="x2fBcbHSsPuV" />
<listitem open="1" type="829" id="WF5DDs0nucRc" />
</listitem>
<listitem open="0" type="831" id="XnOFdBKmjtR7" >
<listitem open="0" type="839" id="ZrmvfBSRZf4i" />
<listitem open="0" type="839" id="Pk8VgQdGINBv" />
<listitem open="0" type="839" id="j0GohzR4iZYO" />
</listitem>
</listitem>
<listitem open="1" type="802" id="Use Case View" />
<listitem open="1" type="821" id="Component View" />
<listitem open="1" type="827" id="Deployment View" />
<listitem open="1" type="836" id="Entity Relationship Model" />
</listitem>
</listview>
<codegeneration>
<codegenerator language="C++" />
</codegeneration>
</XMI.extensions>
</XMI>

View File

@ -0,0 +1,740 @@
<?xml version="1.0" encoding="UTF-8"?>
<XMI xmlns:UML="http://schema.omg.org/spec/UML/1.3" verified="false" timestamp="2008-01-27T00:25:38" xmi.version="1.2" >
<XMI.header>
<XMI.documentation>
<XMI.exporter>umbrello uml modeller http://uml.sf.net</XMI.exporter>
<XMI.exporterVersion>1.5.8</XMI.exporterVersion>
<XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding>
</XMI.documentation>
<XMI.metamodel xmi.name="UML" href="UML.xml" xmi.version="1.3" />
</XMI.header>
<XMI.content>
<UML:Model isSpecification="false" isLeaf="false" isRoot="false" xmi.id="m1" isAbstract="false" name="UML Model" >
<UML:Namespace.ownedElement>
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="folder" isRoot="false" isAbstract="false" name="folder" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="datatype" isRoot="false" isAbstract="false" name="datatype" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="interface" isRoot="false" isAbstract="false" name="interface" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="ActionListener" isRoot="false" isAbstract="false" name="ActionListener" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="enum" isRoot="false" isAbstract="false" name="enum" />
<UML:Stereotype isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="typedef" isRoot="false" isAbstract="false" name="typedef" />
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Logical View" isRoot="false" isAbstract="false" name="Logical View" >
<UML:Namespace.ownedElement>
<UML:Package stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="Datatypes" isRoot="false" isAbstract="false" name="Datatypes" >
<UML:Namespace.ownedElement>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="OzkL9ELTDV2a" isRoot="false" isAbstract="false" name="int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="GKGmCBizDn1b" isRoot="false" isAbstract="false" name="char" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="KwxEP7Cn7u8G" isRoot="false" isAbstract="false" name="bool" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="7RhIxhsDz8zB" isRoot="false" isAbstract="false" name="float" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Ig9VRA4m4zyT" isRoot="false" isAbstract="false" name="double" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="7AGE3NSAo7Sl" isRoot="false" isAbstract="false" name="short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="mLwlRuxha4Az" isRoot="false" isAbstract="false" name="long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="CDjGAhkHqyTt" isRoot="false" isAbstract="false" name="unsigned int" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Lt3A0VtmoqWE" isRoot="false" isAbstract="false" name="unsigned short" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="kTvIX4FhHzxR" isRoot="false" isAbstract="false" name="unsigned long" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="gfhWe8Nx2Q50" isRoot="false" isAbstract="false" name="string" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="8uOJiEoJIWlZ" isRoot="false" isAbstract="false" name="xmlrpc_c::value* const" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="PYy0daZfZgLk" isRoot="false" isAbstract="false" name="xmlrpc_c::paramList const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="m37A5WkcCLCs" isRoot="false" isAbstract="false" name="xmlrpc_c::method* const" elementReference="ABhr9zLggIYR" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="RqSbCcTtZRId" isRoot="false" isAbstract="false" name="xmlrpc_c::method*" elementReference="ABhr9zLggIYR" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="N39BeTbjRUoX" isRoot="false" isAbstract="false" name="std::string const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="t44p7k8gEWBe" isRoot="false" isAbstract="false" name="xmlrpc_c::defaultMethod* const" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="IWTX3d9958g6" isRoot="false" isAbstract="false" name="xmlrpc_c::defaultMethod*" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="R42BV1zRDazt" isRoot="false" isAbstract="false" name="std::string* const" elementReference="gfhWe8Nx2Q50" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="HUmSL95BsE5N" isRoot="false" isAbstract="false" name="xmlrpc_registry*" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="FCjdx8dQApja" isRoot="false" isAbstract="false" name="std::list&lt; xmlrpc_c :: methodPtr >" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="FznJh4xRuoHi" isRoot="false" isAbstract="false" name="xmlrpc_c::registry* const" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="KjHCVYuP989S" isRoot="false" isAbstract="false" name="xmlrpc_c::registry*" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="IObxMYpj7Dml" isRoot="false" isAbstract="false" name="xmlrpc_c::value const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="6FilU9Nsf7nu" isRoot="false" isAbstract="false" name="xmlrpc_c::value&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="d2JI76BIQgcy" isRoot="false" isAbstract="false" name="xmlrpc_value* const" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="qUW8N97wj9eu" isRoot="false" isAbstract="false" name="xmlrpc_value*" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="moqwOtwyeNyb" isRoot="false" isAbstract="false" name="struct timeval const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="dIcQVo6Mtx6m" isRoot="false" isAbstract="false" name="struct timespec const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="OO1obhIymcoD" isRoot="false" isAbstract="false" name="std::vector&lt; unsigned char > const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="omJJ8BODLS05" isRoot="false" isAbstract="false" name="std::vector&lt; unsigned char >" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="vs9aeZKVqvbr" isRoot="false" isAbstract="false" name="std::map&lt; std :: string, xmlrpc_c :: value > const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="hMqEiSn6H7Jh" isRoot="false" isAbstract="false" name="std::vector&lt; xmlrpc_c :: value > const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="dHJzFzh130gV" isRoot="false" isAbstract="false" name="std::vector&lt; xmlrpc_c :: value >" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="2ifvlTtK9OtT" isRoot="false" isAbstract="false" name="std::map&lt; std :: string, xmlrpc_c :: value >" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="HwY7TNWM8fWv" isRoot="false" isAbstract="false" name="xmlrpc_c::registryPtr const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="WPOhoYL5TrAu" isRoot="false" isAbstract="false" name="constrOpt&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="wLpNDzHPeTkz" isRoot="false" isAbstract="false" name="const xmlrpc_c::registry* const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="jXC197XkGQxv" isRoot="false" isAbstract="false" name="xmlrpc_socket const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="6E5W7867gNNe" isRoot="false" isAbstract="false" name="uint const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="lKqf5qfggNDJ" isRoot="false" isAbstract="false" name="bool const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="FZaWvz4Y3a8w" isRoot="false" isAbstract="false" name="const xmlrpc_c::registry*" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="ujRn7KhgOaI5" isRoot="false" isAbstract="false" name="(server_abyss_0)" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="6x5vSHnAP3tD" isRoot="false" isAbstract="false" name="constrOpt const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="6yyeXysFdTiE" isRoot="false" isAbstract="false" name="xmlrpc_c::registry const&amp;" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="Bhqn7O4dxRLU" isRoot="false" isAbstract="false" name="undef" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="QLMQ1eynixe1" />
<UML:Generalization xmi.idref="bvQ8LjlG6A84" />
<UML:Generalization xmi.idref="ZAlNOYo6wyDn" />
<UML:Generalization xmi.idref="8wqGUHRdplrW" />
<UML:Generalization xmi.idref="7Hd4c3bD7xGV" />
<UML:Generalization xmi.idref="3ThApQ4omxHV" />
<UML:Generalization xmi.idref="Sz0mQMnICqg9" />
<UML:Generalization xmi.idref="WghYZaovYLUU" />
<UML:Generalization xmi.idref="8eqGa72ba7ck" />
<UML:Generalization xmi.idref="6aQgK51ACHZV" />
<UML:Generalization xmi.idref="vOAo6ARoVM28" />
<UML:Generalization xmi.idref="IP1lCdf4OjbV" />
<UML:Generalization xmi.idref="G3Cp44urGjlp" />
<UML:Generalization xmi.idref="nkOItXo8Vvkk" />
</UML:GeneralizableElement.generalization>
</UML:DataType>
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="h4aNsLSHP5Er" isRoot="false" isAbstract="false" name="new_datatype" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Datatypes" xmi.id="uPJgv1a40kxT" isRoot="false" isAbstract="false" name="vector&lt;HostInformation>" elementReference="D2oeLcpAZ2wU" />
</UML:Namespace.ownedElement>
</UML:Package>
<UML:Generalization isSpecification="false" child="ABhr9zLggIYR" visibility="public" namespace="Logical View" xmi.id="t6aAezr80Pi6" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Package isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="qneGDX083w3i" isRoot="false" isAbstract="false" name="std" >
<UML:Namespace.ownedElement>
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="qneGDX083w3i" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
</UML:Namespace.ownedElement>
</UML:Package>
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="QLMQ1eynixe1" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="bvQ8LjlG6A84" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="ZAlNOYo6wyDn" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="8wqGUHRdplrW" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="7Hd4c3bD7xGV" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="nUQ9f913QOMM" isRoot="false" isAbstract="false" name="URIHandler" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="Yjj4VCmK2mbw" isRoot="false" isAbstract="false" name="xmlrpc_method" elementReference="Bhqn7O4dxRLU" />
<UML:DataType stereotype="datatype" isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="EMRvUrR9qL3O" isRoot="false" isAbstract="false" name="xmlrpc_default_method" elementReference="Bhqn7O4dxRLU" />
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="3ThApQ4omxHV" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="Sz0mQMnICqg9" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="WghYZaovYLUU" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="8eqGa72ba7ck" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="6aQgK51ACHZV" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="vOAo6ARoVM28" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="IP1lCdf4OjbV" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="G3Cp44urGjlp" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="FVuUhQHzq2w3" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="ksdWD1YgIj9a" client="Bhqn7O4dxRLU" name="" supplier="Bhqn7O4dxRLU" />
<UML:Generalization isSpecification="false" child="Bhqn7O4dxRLU" visibility="public" namespace="Logical View" xmi.id="nkOItXo8Vvkk" parent="Bhqn7O4dxRLU" discriminator="" name="" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="F81xbGpOPBeL" client="Bhqn7O4dxRLU" name="" supplier="Bhqn7O4dxRLU" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="8sqDhjwQOLVu" client="Bhqn7O4dxRLU" name="" supplier="Bhqn7O4dxRLU" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="yH3LrBfMhbo3" client="Bhqn7O4dxRLU" name="" supplier="Bhqn7O4dxRLU" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="b4WZ44T4oFKr" client="Bhqn7O4dxRLU" name="" supplier="qneGDX083w3i" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="x1xWfiV8xw9G" client="Bhqn7O4dxRLU" name="" supplier="Bhqn7O4dxRLU" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="UGHgq2g71sxH" client="Bhqn7O4dxRLU" name="" supplier="Bhqn7O4dxRLU" />
<UML:Package isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="A0oHpJFBuM08" isRoot="false" isAbstract="false" name="xmlrpc_c" >
<UML:Namespace.ownedElement>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="ABhr9zLggIYR" isRoot="false" isAbstract="false" name="xmlrpc_c::method" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="t6aAezr80Pi6" />
</UML:GeneralizableElement.generalization>
<UML:Classifier.feature>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="9puD8vuOpmf4" isRoot="false" isAbstract="true" isQuery="false" name="execute" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="KxRAErgXRSvk" value="" type="PYy0daZfZgLk" name="paramList" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="xYyvh2uopnzx" value="" type="8uOJiEoJIWlZ" name="resultP" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="wYvrZ0vQlZgw" isRoot="false" isAbstract="false" isQuery="false" name="help" >
<UML:BehavioralFeature.parameter>
<UML:Parameter kind="return" xmi.id="4e57Y8nS6HEp" type="gfhWe8Nx2Q50" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="A0oHpJFBuM08" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="8FFvVM1uVJ9s" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="YvsMxoP5oKP2" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="x9xXLSw2iVEu" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="nsZsxfTX4ptl" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="gg8w0n6IPaAK" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="jEcYTwNgYen1" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="QhvsTFNgDZl0" client="Bhqn7O4dxRLU" name="" supplier="A0oHpJFBuM08" />
</UML:Namespace.ownedElement>
</UML:Package>
<UML:Class isSpecification="false" isLeaf="false" visibility="protected" namespace="Logical View" xmi.id="NKn4CmR9J9wA" isRoot="false" isAbstract="false" name="RequestManagerMethod" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="6Q1lx2l3BccB" />
</UML:GeneralizableElement.generalization>
<UML:Classifier.feature>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="UxNBZAWWHlyW" isRoot="false" isAbstract="false" isQuery="false" name="execute" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="qwBU8VzyDMTc" value="" type="PYy0daZfZgLk" name="paramList" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="sHidtuaLrvWO" value="" type="8uOJiEoJIWlZ" name="retvalP" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="J5stk8UazE5N" isRoot="false" isAbstract="true" isQuery="false" name="rm_operation" />
<UML:Operation isSpecification="false" isLeaf="false" visibility="private" xmi.id="3qvFtHzZhaK8" isRoot="false" isAbstract="false" isQuery="false" name="authorize" />
</UML:Classifier.feature>
</UML:Class>
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="M0TcIYHH3gCp" client="ABhr9zLggIYR" name="" supplier="NKn4CmR9J9wA" />
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="SzXQhVokEGyj" isRoot="false" isAbstract="false" name="nebula::ActionListener" >
<UML:Classifier.feature>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="WGYjuvRmUCLt" isRoot="false" isAbstract="false" isQuery="false" name="do_action" >
<UML:BehavioralFeature.parameter>
<UML:Parameter isSpecification="false" visibility="private" xmi.id="HCmUsJ9uy3Hg" value="" type="gfhWe8Nx2Q50" name="actionName" />
<UML:Parameter isSpecification="false" visibility="private" xmi.id="XRu1eFstPeNH" value="" type="Bhqn7O4dxRLU" name="actionArgs" />
</UML:BehavioralFeature.parameter>
</UML:Operation>
</UML:Classifier.feature>
</UML:Class>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="cIdSJPHjOn95" isRoot="false" isAbstract="false" name="KillMethod" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="wL2zuMgsJ3aW" />
</UML:GeneralizableElement.generalization>
<UML:Classifier.feature>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="eIxbkWipq2Q4" isRoot="false" isAbstract="false" isQuery="false" name="rm_operation" />
</UML:Classifier.feature>
</UML:Class>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="IxoXBkEH2iNc" isRoot="false" isAbstract="false" name="SubmitMethod" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="YbRhB1qp4ZKh" />
<UML:Generalization xmi.idref="STpHQNlBd14y" />
<UML:Generalization xmi.idref="tXImS2dZ0dSm" />
</UML:GeneralizableElement.generalization>
<UML:Classifier.feature>
<UML:Operation isSpecification="false" isLeaf="false" visibility="public" xmi.id="vdgviGsHoHwS" isRoot="false" isAbstract="false" isQuery="false" name="rm_operation" />
</UML:Classifier.feature>
</UML:Class>
<UML:Dependency isSpecification="false" visibility="public" namespace="Logical View" xmi.id="BISaYBxLI0bG" client="NKn4CmR9J9wA" name="" supplier="SzXQhVokEGyj" />
<UML:Generalization isSpecification="false" child="NKn4CmR9J9wA" visibility="public" namespace="Logical View" xmi.id="6Q1lx2l3BccB" parent="ABhr9zLggIYR" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="IxoXBkEH2iNc" visibility="public" namespace="Logical View" xmi.id="YbRhB1qp4ZKh" parent="NKn4CmR9J9wA" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="cIdSJPHjOn95" visibility="public" namespace="Logical View" xmi.id="wL2zuMgsJ3aW" parent="NKn4CmR9J9wA" discriminator="" name="" />
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="9OVTeRewhW26" isRoot="false" isAbstract="false" name="RequestManagerSession" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="GPEJepvManc6" />
</UML:GeneralizableElement.generalization>
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="IOxkc5pFT5Tl" type="OzkL9ELTDV2a" name="session_id" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="y1MXmwdXeqM6" type="rwcHWayOoQOM" name="am" />
</UML:Classifier.feature>
</UML:Class>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="Kfk2iZm22Bqb" isRoot="false" isAbstract="false" name="SessionRequest" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="7hy9TcS6ScdS" />
</UML:GeneralizableElement.generalization>
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="YxSt1fUJvfKc" type="KwxEP7Cn7u8G" name="request_done" />
<UML:Attribute isSpecification="false" visibility="private" xmi.id="A5fOIFI1018W" type="OzkL9ELTDV2a" name="session_id" />
</UML:Classifier.feature>
</UML:Class>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="PyatuGF3ckUE" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="eYqpbx7OzyPi" aggregation="composite" type="9OVTeRewhW26" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="tHz2Pi1WxLpq" aggregation="none" type="Kfk2iZm22Bqb" name="" multiplicity="1..*" />
</UML:Association.connection>
</UML:Association>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="hmNeyEt6jRoK" isRoot="false" isAbstract="false" name="VirtualMachineRequest" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="CpUcS75yCPuY" />
</UML:GeneralizableElement.generalization>
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="KOzAbSF4CKVu" type="OzkL9ELTDV2a" name="vid" />
</UML:Classifier.feature>
</UML:Class>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="7gzMSDYTLqBr" isRoot="false" isAbstract="false" name="HostRequest" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="FKzQjuw8bs3E" />
</UML:GeneralizableElement.generalization>
<UML:Classifier.feature>
<UML:Attribute isSpecification="false" visibility="private" xmi.id="FlxrTroXitB1" type="uPJgv1a40kxT" name="host_info" />
</UML:Classifier.feature>
</UML:Class>
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="D2oeLcpAZ2wU" isRoot="false" isAbstract="false" name="vector" />
<UML:Generalization isSpecification="false" child="Kfk2iZm22Bqb" visibility="public" namespace="Logical View" xmi.id="7hy9TcS6ScdS" parent="hmNeyEt6jRoK" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="hmNeyEt6jRoK" visibility="public" namespace="Logical View" xmi.id="CpUcS75yCPuY" parent="Kfk2iZm22Bqb" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="7gzMSDYTLqBr" visibility="public" namespace="Logical View" xmi.id="FKzQjuw8bs3E" parent="Kfk2iZm22Bqb" discriminator="" name="" />
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="a4apjOVENwJp" isRoot="false" isAbstract="false" name="ActionListener" >
<UML:GeneralizableElement.generalization>
<UML:Generalization xmi.idref="Us4nmxsK3Fbd" />
</UML:GeneralizableElement.generalization>
</UML:Class>
<UML:Generalization isSpecification="false" child="a4apjOVENwJp" visibility="public" namespace="Logical View" xmi.id="Us4nmxsK3Fbd" parent="9OVTeRewhW26" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="9OVTeRewhW26" visibility="public" namespace="Logical View" xmi.id="GPEJepvManc6" parent="a4apjOVENwJp" discriminator="" name="" />
<UML:Class isSpecification="false" isLeaf="false" visibility="public" namespace="Logical View" xmi.id="rwcHWayOoQOM" isRoot="false" isAbstract="false" name="ActionManager" />
<UML:Generalization isSpecification="false" child="IxoXBkEH2iNc" visibility="public" namespace="Logical View" xmi.id="STpHQNlBd14y" parent="NKn4CmR9J9wA" discriminator="" name="" />
<UML:Generalization isSpecification="false" child="IxoXBkEH2iNc" visibility="public" namespace="Logical View" xmi.id="tXImS2dZ0dSm" parent="NKn4CmR9J9wA" discriminator="" name="" />
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="IIq2HkJkcZ1F" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="hZNQHQNp0x5z" aggregation="aggregate" type="hmNeyEt6jRoK" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="dL7rb2ArKyrb" aggregation="none" type="IxoXBkEH2iNc" name="" />
</UML:Association.connection>
</UML:Association>
<UML:Association isSpecification="false" visibility="public" namespace="Logical View" xmi.id="jALLhKaMtvk8" name="" >
<UML:Association.connection>
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="J7yK41HgLPXu" aggregation="aggregate" type="IxoXBkEH2iNc" name="" />
<UML:AssociationEnd isSpecification="false" visibility="public" changeability="changeable" isNavigable="true" xmi.id="RfkjebILkdgP" aggregation="none" type="hmNeyEt6jRoK" name="" />
</UML:Association.connection>
</UML:Association>
</UML:Namespace.ownedElement>
<XMI.extension xmi.extender="umbrello" >
<diagrams>
<diagram snapgrid="0" showattsig="1" fillcolor="#beb6a7" linewidth="0" zoom="100" showgrid="0" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="739" snapy="10" showatts="1" xmi.id="n353OZxNtUCy" documentation="" type="1" showops="1" showpackage="0" name="RequestManagerMethod" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="#312e2a" canvasheight="626" >
<widgets>
<classwidget usesdiagramfillcolor="0" width="558" showattsigs="601" x="117" fillcolor="#beb6a7" y="29" showopsigs="601" linewidth="none" height="63" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="ABhr9zLggIYR" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,9,-1,5,50,1,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="554" showattsigs="601" x="119" fillcolor="#beb6a7" y="133" showopsigs="601" linewidth="none" height="81" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="NKn4CmR9J9wA" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,9,-1,5,50,1,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="125" showattsigs="601" x="550" fillcolor="#e0e4c5" y="286" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="cIdSJPHjOn95" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="125" showattsigs="601" x="141" fillcolor="#e0e4c5" y="287" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="IxoXBkEH2iNc" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,9,-1,5,75,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="125" showattsigs="601" x="334" fillcolor="#e0e4c5" y="393" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="IxoXBkEH2iNc" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Sans Serif,9,-1,5,75,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="184" showattsigs="601" x="532" fillcolor="#e0e4c5" y="393" showopsigs="601" linewidth="none" height="45" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="hmNeyEt6jRoK" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,9,-1,5,75,0,0,0,0,0" linecolor="#312e2a" />
</widgets>
<messages/>
<associations>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="ABhr9zLggIYR" widgetaid="NKn4CmR9J9wA" xmi.id="6Q1lx2l3BccB" type="500" linecolor="none" >
<linepath>
<startpoint startx="396" starty="133" />
<endpoint endx="396" endy="92" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="4" indexb="1" linewidth="none" widgetbid="NKn4CmR9J9wA" widgetaid="IxoXBkEH2iNc" xmi.id="YbRhB1qp4ZKh" type="500" linecolor="none" >
<linepath>
<startpoint startx="203" starty="287" />
<endpoint endx="257" endy="214" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="4" indexb="3" linewidth="none" widgetbid="NKn4CmR9J9wA" widgetaid="cIdSJPHjOn95" xmi.id="wL2zuMgsJ3aW" type="500" linecolor="none" >
<linepath>
<startpoint startx="612" starty="286" />
<endpoint endx="534" endy="214" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="4" indexb="2" linewidth="none" widgetbid="NKn4CmR9J9wA" widgetaid="IxoXBkEH2iNc" xmi.id="tXImS2dZ0dSm" type="500" linecolor="none" >
<linepath>
<startpoint startx="396" starty="393" />
<endpoint endx="396" endy="214" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="hmNeyEt6jRoK" widgetaid="IxoXBkEH2iNc" xmi.id="jALLhKaMtvk8" type="501" linecolor="none" >
<linepath>
<startpoint startx="459" starty="415" />
<endpoint endx="532" endy="415" />
</linepath>
</assocwidget>
</associations>
</diagram>
<diagram snapgrid="0" showattsig="1" fillcolor="#c8cedf" linewidth="0" zoom="100" showgrid="0" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="983" snapy="10" showatts="1" xmi.id="ME5dRbRVdp05" documentation="" type="6" showops="1" showpackage="0" name="AuthorizationAuthentication" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="#436086" canvasheight="544" >
<widgets>
<activitywidget usesdiagramfillcolor="1" width="20" activityname="" x="145" fillcolor="none" y="245" linewidth="none" height="20" usefillcolor="1" isinstance="0" xmi.id="0cRlPqXz2a17" documentation="" activitytype="0" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<activitywidget usesdiagramfillcolor="0" width="139" activityname="client:opens session" x="86" fillcolor="#c8cedf" y="322" linewidth="none" height="28" usefillcolor="1" isinstance="0" xmi.id="RLtGJyuKbL5y" documentation="" activitytype="1" usesdiagramusefillcolor="0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="#5377a7" />
<activitywidget usesdiagramfillcolor="0" width="261" activityname="server:creates a session and returns ID" x="25" fillcolor="#c8cedf" y="392" linewidth="none" height="28" usefillcolor="1" isinstance="0" xmi.id="9axBByGhSmjc" documentation="" activitytype="1" usesdiagramusefillcolor="0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="#5377a7" />
<activitywidget usesdiagramfillcolor="1" width="20" activityname="" x="145" fillcolor="none" y="472" linewidth="none" height="20" usefillcolor="1" isinstance="0" xmi.id="Cgllzoj8NeJW" documentation="" activitytype="2" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="92" x="109" fillcolor="none" y="216" linewidth="none" posttext="" role="700" height="22" usefillcolor="1" pretext="" isinstance="0" xmi.id="dXD3Jwde1ej8" text="open session" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="160" x="404" fillcolor="none" y="11" linewidth="none" posttext="" role="700" height="22" usefillcolor="1" pretext="" isinstance="0" xmi.id="kTHmIPmrGvpk" text="send a job to the server" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<activitywidget usesdiagramfillcolor="0" width="155" activityname="client:invoke a method" x="407" fillcolor="#c8cedf" y="105" linewidth="none" height="28" usefillcolor="1" isinstance="0" xmi.id="xmtY6KPqnea3" documentation="" activitytype="1" usesdiagramusefillcolor="0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="#5377a7" />
<activitywidget usesdiagramfillcolor="1" width="20" activityname="" x="474" fillcolor="none" y="37" linewidth="none" height="20" usefillcolor="1" isinstance="0" xmi.id="4KuKGh4aytps" documentation="" activitytype="0" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<notewidget usesdiagramfillcolor="1" width="214" x="155" fillcolor="none" y="39" linewidth="none" height="109" usefillcolor="1" isinstance="0" xmi.id="rLNYgRabDUAJ" text="the client invokes the server sending the sessionId provided, the method name and its corresponding params." usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<activitywidget usesdiagramfillcolor="1" width="165" activityname="server:verify the session" x="402" fillcolor="none" y="173" linewidth="none" height="28" usefillcolor="1" isinstance="0" xmi.id="oX7ZBgdF0VYE" documentation="" activitytype="1" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<activitywidget usesdiagramfillcolor="1" width="208" activityname="server:authorize the invocation" x="380" fillcolor="none" y="311" linewidth="none" height="28" usefillcolor="1" isinstance="0" xmi.id="Dam9Tc0KvLqc" documentation="" activitytype="1" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<activitywidget usesdiagramfillcolor="1" width="20" activityname="" x="474" fillcolor="none" y="376" linewidth="none" height="20" usefillcolor="1" isinstance="0" xmi.id="mRBytLFfqLE0" documentation="" activitytype="3" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<activitywidget usesdiagramfillcolor="1" width="256" activityname="server:calls the corresponding method" x="356" fillcolor="none" y="438" linewidth="none" height="28" usefillcolor="1" isinstance="0" xmi.id="RA11WRL9W3d5" documentation="" activitytype="1" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<activitywidget usesdiagramfillcolor="0" width="167" activityname="server:returns SUCCESS" x="402" fillcolor="#c8cedf" y="512" linewidth="none" height="28" usefillcolor="1" isinstance="0" xmi.id="irOZGzIWz9I4" documentation="" activitytype="1" usesdiagramusefillcolor="0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="#436086" />
<floatingtext usesdiagramfillcolor="1" width="76" x="397" fillcolor="none" y="404" linewidth="none" posttext="" role="700" height="22" usefillcolor="1" pretext="" isinstance="0" xmi.id="Wi0v19Q4kVkc" text="authorized" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="101" x="518" fillcolor="none" y="353" linewidth="none" posttext="" role="700" height="22" usefillcolor="1" pretext="" isinstance="0" xmi.id="rKqpaKokdqrs" text="not authorized" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<activitywidget usesdiagramfillcolor="1" width="20" activityname="" x="653" fillcolor="none" y="516" linewidth="none" height="20" usefillcolor="1" isinstance="0" xmi.id="Bu8WPpytVwpW" documentation="" activitytype="2" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<activitywidget usesdiagramfillcolor="0" width="241" activityname="server:returns &quot;authorization failure&quot;" x="738" fillcolor="#c8cedf" y="372" linewidth="none" height="28" usefillcolor="1" isinstance="0" xmi.id="3FYniJNXbEKB" documentation="" activitytype="1" usesdiagramusefillcolor="0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="#436086" />
<activitywidget usesdiagramfillcolor="1" width="20" activityname="" x="474" fillcolor="none" y="240" linewidth="none" height="20" usefillcolor="1" isinstance="0" xmi.id="RbZNOt3sYElN" documentation="" activitytype="3" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<activitywidget usesdiagramfillcolor="0" width="190" activityname="server:returns &quot;bad session&quot;" x="568" fillcolor="#c8cedf" y="236" linewidth="none" height="28" usefillcolor="1" isinstance="0" xmi.id="E2lFPf8DsKLq" documentation="" activitytype="1" usesdiagramusefillcolor="0" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="#436086" />
<floatingtext usesdiagramfillcolor="1" width="37" x="436" fillcolor="none" y="270" linewidth="none" posttext="" role="700" height="22" usefillcolor="1" pretext="" isinstance="0" xmi.id="0ApTYjzQaln2" text="valid" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
<floatingtext usesdiagramfillcolor="1" width="48" x="506" fillcolor="none" y="216" linewidth="none" posttext="" role="700" height="22" usefillcolor="1" pretext="" isinstance="0" xmi.id="SmWZUNTO8E6Y" text="invalid" usesdiagramusefillcolor="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" linecolor="none" />
</widgets>
<messages/>
<associations>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="RLtGJyuKbL5y" widgetaid="0cRlPqXz2a17" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="155" starty="265" />
<endpoint endx="155" endy="322" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="9axBByGhSmjc" widgetaid="RLtGJyuKbL5y" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="155" starty="350" />
<endpoint endx="155" endy="392" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="Cgllzoj8NeJW" widgetaid="9axBByGhSmjc" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="155" starty="420" />
<endpoint endx="155" endy="472" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="xmtY6KPqnea3" widgetaid="4KuKGh4aytps" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="484" starty="57" />
<endpoint endx="484" endy="105" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="mRBytLFfqLE0" widgetaid="Dam9Tc0KvLqc" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="484" starty="339" />
<endpoint endx="484" endy="376" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="oX7ZBgdF0VYE" widgetaid="xmtY6KPqnea3" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="484" starty="133" />
<endpoint endx="484" endy="173" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="RA11WRL9W3d5" widgetaid="mRBytLFfqLE0" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="484" starty="396" />
<endpoint endx="484" endy="438" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="irOZGzIWz9I4" widgetaid="RA11WRL9W3d5" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="484" starty="466" />
<endpoint endx="485" endy="512" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="Bu8WPpytVwpW" widgetaid="3FYniJNXbEKB" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="858" starty="400" />
<endpoint endx="673" endy="526" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="Bu8WPpytVwpW" widgetaid="irOZGzIWz9I4" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="569" starty="526" />
<endpoint endx="653" endy="526" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="RbZNOt3sYElN" widgetaid="oX7ZBgdF0VYE" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="484" starty="201" />
<endpoint endx="484" endy="240" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="Dam9Tc0KvLqc" widgetaid="RbZNOt3sYElN" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="484" starty="260" />
<endpoint endx="484" endy="311" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="E2lFPf8DsKLq" widgetaid="RbZNOt3sYElN" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="494" starty="250" />
<endpoint endx="568" endy="250" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="Bu8WPpytVwpW" widgetaid="E2lFPf8DsKLq" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="663" starty="264" />
<endpoint endx="663" endy="516" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" visibilityB="200" totalcountb="2" indexb="1" linewidth="none" widgetbid="3FYniJNXbEKB" widgetaid="mRBytLFfqLE0" roleBdoc="" documentation="" roleAdoc="" type="515" changeabilityA="900" changeabilityB="900" linecolor="none" visibilityA="200" >
<linepath>
<startpoint startx="494" starty="386" />
<endpoint endx="738" endy="386" />
</linepath>
</assocwidget>
</associations>
</diagram>
<diagram snapgrid="0" showattsig="1" fillcolor="#beb6a7" linewidth="0" zoom="100" showgrid="0" showopsig="1" usefillcolor="1" snapx="10" canvaswidth="805" snapy="10" showatts="1" xmi.id="4rjKTRobG8zV" documentation="" type="1" showops="1" showpackage="0" name="RequestManagerSession" localid="" showstereotype="0" showscope="1" snapcsgrid="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" canvasheight="626" >
<widgets>
<classwidget usesdiagramfillcolor="0" width="170" showattsigs="601" x="61" fillcolor="#beb6a7" y="101" showopsigs="601" linewidth="none" height="52" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="9OVTeRewhW26" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="133" showattsigs="601" x="352" fillcolor="#beb6a7" y="101" showopsigs="601" linewidth="none" height="52" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="Kfk2iZm22Bqb" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="160" showattsigs="601" x="237" fillcolor="#e0e4c5" y="225" showopsigs="601" linewidth="none" height="37" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="hmNeyEt6jRoK" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#312e2a" />
<classwidget usesdiagramfillcolor="0" width="227" showattsigs="601" x="414" fillcolor="#e0e4c5" y="226" showopsigs="601" linewidth="none" height="37" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="7gzMSDYTLqBr" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="0" font="Bitstream Vera Sans,8,-1,5,75,0,0,0,0,0" linecolor="#312e2a" />
<notewidget usesdiagramfillcolor="0" width="226" x="575" fillcolor="#c4c5c7" y="82" linewidth="none" height="118" usefillcolor="1" isinstance="0" xmi.id="WpnMdkhFMiS5" text="Specialization of SessionRequest contains specific input/output attributes for the method.
The SessionRequest will be used to communicate the RequestManager with other nebula components" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
<classwidget usesdiagramfillcolor="1" width="104" showattsigs="601" x="93" fillcolor="none" y="30" showopsigs="601" linewidth="none" height="29" usefillcolor="1" showpubliconly="0" showattributes="1" isinstance="0" xmi.id="a4apjOVENwJp" showoperations="1" showpackage="0" showscope="1" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</widgets>
<messages/>
<associations>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="Kfk2iZm22Bqb" widgetaid="9OVTeRewhW26" xmi.id="PyatuGF3ckUE" type="510" linecolor="none" >
<linepath>
<startpoint startx="231" starty="127" />
<endpoint endx="352" endy="127" />
</linepath>
<floatingtext usesdiagramfillcolor="1" width="29" x="321" fillcolor="none" y="106" linewidth="none" posttext="" role="702" height="19" usefillcolor="1" pretext="" isinstance="0" xmi.id="IApm141uchRF" text="1..*" usesdiagramusefillcolor="1" font="Bitstream Vera Sans,8,-1,5,50,0,0,0,0,0" linecolor="none" />
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="3" indexb="1" linewidth="none" widgetbid="Kfk2iZm22Bqb" widgetaid="hmNeyEt6jRoK" xmi.id="CpUcS75yCPuY" type="500" linecolor="none" >
<linepath>
<startpoint startx="317" starty="225" />
<endpoint endx="396" endy="153" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="3" indexb="2" linewidth="none" widgetbid="Kfk2iZm22Bqb" widgetaid="7gzMSDYTLqBr" xmi.id="FKzQjuw8bs3E" type="500" linecolor="none" >
<linepath>
<startpoint startx="527" starty="226" />
<endpoint endx="440" endy="153" />
</linepath>
</assocwidget>
<assocwidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" linewidth="none" widgetbid="a4apjOVENwJp" widgetaid="9OVTeRewhW26" xmi.id="GPEJepvManc6" type="500" linecolor="none" >
<linepath>
<startpoint startx="146" starty="101" />
<endpoint endx="145" endy="59" />
</linepath>
</assocwidget>
</associations>
</diagram>
</diagrams>
</XMI.extension>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Use Case View" isRoot="false" isAbstract="false" name="Use Case View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Component View" isRoot="false" isAbstract="false" name="Component View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Deployment View" isRoot="false" isAbstract="false" name="Deployment View" >
<UML:Namespace.ownedElement/>
</UML:Model>
<UML:Model stereotype="folder" isSpecification="false" isLeaf="false" visibility="public" namespace="m1" xmi.id="Entity Relationship Model" isRoot="false" isAbstract="false" name="Entity Relationship Model" >
<UML:Namespace.ownedElement/>
</UML:Model>
</UML:Namespace.ownedElement>
</UML:Model>
</XMI.content>
<XMI.extensions xmi.extender="umbrello" >
<docsettings viewid="4rjKTRobG8zV" documentation="" uniqueid="RfkjebILkdgP" />
<listview>
<listitem open="1" type="800" label="Views" >
<listitem open="1" type="801" id="Logical View" >
<listitem open="0" type="807" id="n353OZxNtUCy" label="RequestManagerMethod" />
<listitem open="0" type="807" id="4rjKTRobG8zV" label="RequestManagerSession" />
<listitem open="0" type="809" id="ME5dRbRVdp05" label="AuthorizationAuthentication" />
<listitem open="1" type="813" id="a4apjOVENwJp" />
<listitem open="1" type="813" id="rwcHWayOoQOM" />
<listitem open="1" type="813" id="7gzMSDYTLqBr" >
<listitem open="0" type="814" id="FlxrTroXitB1" />
</listitem>
<listitem open="1" type="813" id="cIdSJPHjOn95" >
<listitem open="0" type="815" id="eIxbkWipq2Q4" />
</listitem>
<listitem open="1" type="813" id="IxoXBkEH2iNc" >
<listitem open="0" type="815" id="vdgviGsHoHwS" />
</listitem>
<listitem open="1" type="813" id="NKn4CmR9J9wA" >
<listitem open="0" type="815" id="UxNBZAWWHlyW" />
<listitem open="0" type="815" id="J5stk8UazE5N" />
<listitem open="0" type="815" id="3qvFtHzZhaK8" />
</listitem>
<listitem open="1" type="813" id="9OVTeRewhW26" >
<listitem open="0" type="814" id="IOxkc5pFT5Tl" />
<listitem open="0" type="814" id="y1MXmwdXeqM6" />
</listitem>
<listitem open="1" type="813" id="Kfk2iZm22Bqb" >
<listitem open="0" type="814" id="YxSt1fUJvfKc" />
<listitem open="0" type="814" id="A5fOIFI1018W" />
</listitem>
<listitem open="1" type="813" id="hmNeyEt6jRoK" >
<listitem open="0" type="814" id="KOzAbSF4CKVu" />
</listitem>
<listitem open="0" type="813" id="SzXQhVokEGyj" >
<listitem open="0" type="815" id="WGYjuvRmUCLt" />
</listitem>
<listitem open="1" type="813" id="D2oeLcpAZ2wU" />
<listitem open="1" type="818" id="qneGDX083w3i" />
<listitem open="0" type="818" id="A0oHpJFBuM08" >
<listitem open="0" type="813" id="ABhr9zLggIYR" >
<listitem open="0" type="815" id="9puD8vuOpmf4" />
<listitem open="0" type="815" id="wYvrZ0vQlZgw" />
</listitem>
</listitem>
<listitem open="0" type="829" id="nUQ9f913QOMM" />
<listitem open="0" type="829" id="EMRvUrR9qL3O" />
<listitem open="0" type="829" id="Yjj4VCmK2mbw" />
<listitem open="1" type="830" id="Datatypes" >
<listitem open="0" type="829" id="ujRn7KhgOaI5" />
<listitem open="1" type="829" id="KwxEP7Cn7u8G" />
<listitem open="0" type="829" id="lKqf5qfggNDJ" />
<listitem open="1" type="829" id="GKGmCBizDn1b" />
<listitem open="0" type="829" id="FZaWvz4Y3a8w" />
<listitem open="0" type="829" id="wLpNDzHPeTkz" />
<listitem open="0" type="829" id="6x5vSHnAP3tD" />
<listitem open="0" type="829" id="WPOhoYL5TrAu" />
<listitem open="1" type="829" id="Ig9VRA4m4zyT" />
<listitem open="1" type="829" id="7RhIxhsDz8zB" />
<listitem open="1" type="829" id="OzkL9ELTDV2a" />
<listitem open="1" type="829" id="mLwlRuxha4Az" />
<listitem open="1" type="829" id="h4aNsLSHP5Er" />
<listitem open="1" type="829" id="7AGE3NSAo7Sl" />
<listitem open="0" type="829" id="FCjdx8dQApja" />
<listitem open="0" type="829" id="2ifvlTtK9OtT" />
<listitem open="0" type="829" id="vs9aeZKVqvbr" />
<listitem open="0" type="829" id="N39BeTbjRUoX" />
<listitem open="0" type="829" id="R42BV1zRDazt" />
<listitem open="0" type="829" id="omJJ8BODLS05" />
<listitem open="0" type="829" id="OO1obhIymcoD" />
<listitem open="0" type="829" id="dHJzFzh130gV" />
<listitem open="0" type="829" id="hMqEiSn6H7Jh" />
<listitem open="1" type="829" id="gfhWe8Nx2Q50" />
<listitem open="0" type="829" id="dIcQVo6Mtx6m" />
<listitem open="0" type="829" id="moqwOtwyeNyb" />
<listitem open="0" type="829" id="6E5W7867gNNe" />
<listitem open="0" type="829" id="Bhqn7O4dxRLU" />
<listitem open="1" type="829" id="CDjGAhkHqyTt" />
<listitem open="1" type="829" id="kTvIX4FhHzxR" />
<listitem open="1" type="829" id="Lt3A0VtmoqWE" />
<listitem open="1" type="829" id="uPJgv1a40kxT" />
<listitem open="0" type="829" id="IWTX3d9958g6" />
<listitem open="0" type="829" id="t44p7k8gEWBe" />
<listitem open="0" type="829" id="RqSbCcTtZRId" />
<listitem open="0" type="829" id="m37A5WkcCLCs" />
<listitem open="0" type="829" id="PYy0daZfZgLk" />
<listitem open="0" type="829" id="6yyeXysFdTiE" />
<listitem open="0" type="829" id="KjHCVYuP989S" />
<listitem open="0" type="829" id="FznJh4xRuoHi" />
<listitem open="0" type="829" id="HwY7TNWM8fWv" />
<listitem open="0" type="829" id="IObxMYpj7Dml" />
<listitem open="0" type="829" id="6FilU9Nsf7nu" />
<listitem open="0" type="829" id="8uOJiEoJIWlZ" />
<listitem open="0" type="829" id="HUmSL95BsE5N" />
<listitem open="0" type="829" id="jXC197XkGQxv" />
<listitem open="0" type="829" id="qUW8N97wj9eu" />
<listitem open="0" type="829" id="d2JI76BIQgcy" />
</listitem>
</listitem>
<listitem open="1" type="802" id="Use Case View" />
<listitem open="1" type="821" id="Component View" />
<listitem open="1" type="827" id="Deployment View" />
<listitem open="1" type="836" id="Entity Relationship Model" />
</listitem>
</listview>
<codegeneration>
<codegenerator language="C++" />
</codegeneration>
</XMI.extensions>
</XMI>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
#
# Default configuration attributes for the Xen driver
# (all domains will use these values as defaults)
#
MEMORY = 128
KERNEL = /vmlinuz
RAMDISK = /initrd.img

36
share/etc/mad/defaultrc Normal file
View File

@ -0,0 +1,36 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2008, Distributed Systems Architecture Group, Universidad #
# Complutense de Madrid (dsa-research.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. #
#--------------------------------------------------------------------------- #
#-------------------------------------------------------------------------------
# Global environment configuration file for ONE MADS
# --------------------------------------------------------
#
# This file is sourced before a driver is started. Also the variables
# declared here are "exported".
#
# Values in this file will be overridden or completed by the MAD
# specific rc file.
#
# This file MUST preserve SH syntax
#-------------------------------------------------------------------------------
# MADs will generate cores and logs if defined
ONE_MAD_DEBUG=
# Nice Priority to run the drivers
PRIORITY=19

16
share/etc/mad/im_sshrc Normal file
View File

@ -0,0 +1,16 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2008, Distributed Systems Architecture Group, Universidad #
# Complutense de Madrid (dsa-research.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. #
#--------------------------------------------------------------------------- #

16
share/etc/mad/vmm_xenrc Normal file
View File

@ -0,0 +1,16 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2008, Distributed Systems Architecture Group, Universidad #
# Complutense de Madrid (dsa-research.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. #
#--------------------------------------------------------------------------- #

41
share/etc/oned.conf Normal file
View File

@ -0,0 +1,41 @@
#
# VM_RDIR: The VM "remote" directory stores VM related data on the target host.
# Each VM has its own directory ($VM_HOME) within the $VM_DIR, $VMDIR/$VID
# Set this variable to the mount point of $ONE_LOCATION/var/
# if needed as it defaults to this value
#VM_RDIR=/vCluster/var
# Time in seconds between host monitorization
HOST_MONITORING_INTERVAL=10
# Information manager configuration. You can add more information managers with different
# configuration but make sure it has different names.
#
# name: name for this information manager
# executable: path of the information manager executable, can be an absolute path or
# a relative path from $ONE_LOCATION
# arguments: path where the information manager configuration resides, can also
# be a relative path
# owner: user that will be used for monitoring (we recommend this to be <oneadmin>)
#
IM_MAD=[name="one_im",executable="bin/one_im_ssh",arguments="etc/one_im_ssh.conf",owner="oneadmin"]
# Time in seconds between virtual machine monitorization
VM_POLLING_INTERVAL=10
# Virtual Machine Manager configuration. This component does not have a configuration
# file. You can change the path of xentop in remote machines changing
# XENTOP_PATH in the beginning of this script.
#
# name: name of the virtual manager configuration
# executable: path of the virtual machine manager executable, can be an absolute path or
# a relative path from $ONE_LOCATION
# owner: user that will be used for vm managing (we recommend this to be <oneadmin>)
# config: defult values and configuration parameters for the driver
VM_MAD=[name="one_vmm",executable="bin/one_vmm_xen",owner="oneadmin",default="etc/default/vmm_xen.conf"]
# Port where oned will listen for xmlrpc calls.
PORT=2633

View File

@ -0,0 +1,6 @@
DISK=[image="/local/xen/domains/xen-etch/disk.img",dev="sda1",mode=w]
DISK=[image="/local/xen/domains/xen-etch/swap.img",dev="sda2",mode=w]
KERNEL=/boot/vmlinuz-2.6.18-4-xen-amd64
RAMDISK=/boot/initrd.img-2.6.18-4-xen-amd64
MEMORY=64
CPU=1

64
share/scons/lex_bison.py Normal file
View File

@ -0,0 +1,64 @@
import os
import SCons
############
# BUILDERS #
############
def build_lex(target, source, env):
cwd=os.getcwd()
src=SCons.Util.to_String(source[0])
src_dir=os.path.dirname(src)
src_name=os.path.basename(src)
os.chdir(src_dir)
os.system("flex "+src_name)
os.chdir(cwd)
return None
def emitter_lex(target, source, env):
src=SCons.Util.to_String(source[0])
src_dir=os.path.dirname(src)
(src_name, src_ext)=os.path.splitext(os.path.basename(src))
target.append(src_name+".h")
return target, source
def add_lex(environment):
lex_bld=SCons.Builder.Builder(action=build_lex,
suffix='.c',
src_suffix='.l',
emitter=emitter_lex)
environment.Append(BUILDERS={'Lex':lex_bld})
def build_bison(target, source, env):
cwd=os.getcwd()
src=SCons.Util.to_String(source[0])
src_dir=os.path.dirname(src)
src_name=os.path.basename(src)
(base, ext)=os.path.splitext(src_name)
os.chdir(src_dir)
os.system("bison "+src_name)
os.rename(base+".hh", base+".h")
os.chdir(cwd)
return None
def emitter_bison(target, source, env):
src=SCons.Util.to_String(source[0])
src_dir=os.path.dirname(src)
(src_name, src_ext)=os.path.splitext(os.path.basename(src))
target.append(src_name+".h")
return target, source
def add_bison(environment):
bison_bld=SCons.Builder.Builder(action=build_bison,
suffix='.cc',
src_suffix='.y',
emitter=emitter_bison)
environment.Append(BUILDERS={'Bison':bison_bld})

View File

@ -0,0 +1,81 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2008, Distributed Systems Architecture Group, Universidad #
# Complutense de Madrid (dsa-research.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. #
#--------------------------------------------------------------------------- #
function mad_debug
{
if [ -n "${ONE_MAD_DEBUG}" ]; then
ulimit -c 15000
fi
}
function export_rc_vars
{
if [ -f $1 ] ; then
ONE_VARS=`cat $1 | egrep -e '^[a-zA-Z\-\_0-9]*=' | sed 's/=.*$//'`
. $1
for v in $ONE_VARS; do
export $v
done
fi
}
function log_with_date
{
PID=$$
LOG_FILE=$1
shift
mkfifo /tmp/one_fifo.$PID.err /tmp/one_fifo.$PID.out
# This line creates an empty log file
echo -n "" > $LOG_FILE
# Write out fifo to STDOUT
cat /tmp/one_fifo.$PID.out &
while read line < /tmp/one_fifo.$PID.err
do
echo `date +"%D %T"`: $line >> $LOG_FILE
done &
$* 2>/tmp/one_fifo.$PID.err 1>/tmp/one_fifo.$PID.out
rm /tmp/one_fifo.$PID.out /tmp/one_fifo.$PID.err
}
function execute_mad
{
MAD_FILE=`basename $0`
if [ -n "${ONE_MAD_DEBUG}" ]; then
log_with_date var/$MAD_FILE.log nice -n $PRIORITY bin/$MAD_FILE.rb $*
else
exec nice -n $PRIORITY bin/$MAD_FILE.rb $* 2> /dev/null
fi
}
# Set global environment
export_rc_vars $ONE_LOCATION/etc/defaultrc
# Sanitize PRIORITY variable
if [ -z "$PRIORITY" ]; then
export PRIORITY=19
fi

110
share/scripts/one Executable file
View File

@ -0,0 +1,110 @@
#! /bin/sh
if [ -z "$ONE_LOCATION" ]; then
echo "ONE_LOCATION is not defined"
exit 1
fi
ONE_PID=$ONE_LOCATION/var/oned.pid
ONE_SCHEDPID=$ONE_LOCATION/var/sched.pid
ONE_CONF=$ONE_LOCATION/etc/oned.conf
ONED=$ONE_LOCATION/bin/oned
ONE_SCHEDULER=$ONE_LOCATION/bin/mm_sched
setup()
{
PORT=`cat $ONE_CONF | grep ^PORT= | cut -d= -f2`
if [ $? -ne 0 ]; then
echo "Can not find PORT in $ONE_CONF."
exit 1
fi
}
start()
{
if [ ! -x "$ONED" ]; then
echo "Can not find $ONED."
exit 1
fi
if [ ! -x "$ONE_SCHEDULER" ]; then
echo "Can not find $ONE_SCHEDULER."
exit 1
fi
# Start the one daemon
$ONED -f 2>&1 &
LASTRC=$?
LASTPID=$!
if [ $LASTRC -ne 0 ]; then
echo "Error executing $ONED"
exit 1
else
echo $LASTPID > $ONE_PID
fi
# Start the scheduler
$ONE_SCHEDULER -p $PORT &
LASTRC=$?
LASTPID=$!
if [ $LASTRC -ne 0 ]; then
echo "Error executing $ONE_SCHEDULER"
exit 1
else
echo $LASTPID > $ONE_SCHEDPID
fi
echo "oned and scheduler started"
}
#
# Function that stops the daemon/service
#
stop()
{
if [ ! -f $ONE_PID ]; then
echo "Couldn't find oned process pid."
exit 1
fi
if [ ! -f $ONE_SCHEDPID ]; then
echo "Couldn't find scheduler process pid."
exit 1
fi
# Kill the one daemon
kill `cat $ONE_PID`
# Kill the scheduler
kill `cat $ONE_SCHEDPID`
# Remove pid files
rm -f $ONE_PID > /dev/null 2>&1
rm -f $ONE_SCHEDPID > /dev/null 2>&1
echo "oned and scheduler stopped"
}
case "$1" in
start)
setup
start
;;
stop)
stop
;;
*)
echo "Usage: nebula {start|stop}" >&2
exit 3
;;
esac

BIN
share/test/one.db Normal file

Binary file not shown.

View File

@ -0,0 +1,67 @@
#include "ActionManager.h"
#include <iostream>
#include <cerrno>
class AMTest : public ActionListener
{
public:
AMTest():am()
{
am.addListener(this);
};
~AMTest(){};
ActionManager am;
private:
void do_action(const string &action, void * arg);
};
void AMTest::do_action(const string &action, void * arg)
{
int * i = static_cast<int *>(arg);
cout<<"Event received: "<<action<<" Argument : "<<*i<<"\n";
}
extern "C" void * startThread(void *arg)
{
AMTest * MT;
int i = 8;
string event("ACTION_TEST");
MT = static_cast<AMTest *> (arg);
MT->am.trigger(event,&i);
sleep(4);
i = 10;
MT->am.trigger(event,&i);
i = 23;
MT->am.trigger(ActionListener::ACTION_FINALIZE,&i);
return 0;
}
/*
int main()
{
pthread_t id;
int i = 3;
AMTest * MT = new AMTest();
pthread_create(&id, 0, startThread, MT);
MT->am.loop(1,&i);
delete MT;
pthread_join(id,0);
return 0;
}
*/

View File

@ -0,0 +1,252 @@
#include "VirtualMachine.h"
#include "VirtualMachineManagerDriver.h"
#include "Nebula.h"
#include "InformationManagerDriver.h"
#include "InformationManager.h"
#include "Mad.h"
#include "Host.h"
#include "HostPool.h"
#include <string>
#include <iostream>
#include <stdlib.h>
#include <stdexcept>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pthread.h>
#include <climits>
#include <sstream>
extern "C" void *test(void *nothing)
{
ostringstream os;
sleep(2);
os.str("");
int rc;
Nebula & pn = Nebula::instance();
HostPool * thepool = pn.get_hpool();
Host * host;
int hid;
thepool->bootstrap();
thepool->allocate(&hid,"foo.dacya","mad1","mad2","mad3",true);
os.str("");
os << "Host " << hid << " allocated";
Nebula::log("TST", Log::ERROR, os);
thepool->allocate(&hid,"foo2.dacya","mad1","mad2","mad3",true);
os.str("");
os << "Host " << hid << " allocated";
Nebula::log("TST", Log::ERROR, os);
thepool->allocate(&hid,"foo3.dacya","mad1","mad2","mad3",true);
os.str("");
os << "Host " << hid << " allocated";
Nebula::log("TST", Log::ERROR, os);
host = static_cast<Host *>(thepool->get(3422,false));
if (host != 0)
{
os.str("");
os << "Test failed. Shouldn't be here.";
Nebula::log("TST", Log::ERROR, os);
}
host = static_cast<Host *>(thepool->get(0,true));
if (host != 0)
{
os.str("");
os << "Going fine. Host " << *host << " retrieved.";
Nebula::log("TST", Log::ERROR, os);
host->unlock();
}
else
{
os.str("");
os << "Test failed!. Not able to retrieve host 0";
Nebula::log("TST", Log::ERROR, os);
}
Host * host2 = static_cast<Host *>(thepool->get(1,false));
if (host2 != 0)
{
os.str("");
os << "Going fine. Host " << *host2 << " retrieved.";
Nebula::log("TST", Log::ERROR, os);
}
Host * host3 = static_cast<Host *>(thepool->get(2,false));
if (host3 != 0)
{
os.str("");
os << "Going fine. Host " << *host3 << " retrieved.";
Nebula::log("TST", Log::ERROR, os);
}
Host * host4 = static_cast<Host *>(thepool->get(32,false));
if (host4 != 0)
{
os.str("");
os << "Going fine. Host " << *host4 << " retrieved.";
Nebula::log("TST", Log::ERROR, os);
}
host3->lock();
string host_info_str("cpuArchitecture=x86_32\nnumberCores=1\ncpuSpeed=2211\ntotalMemory=2046\nfreeMemory=125\nusedMemory=1921\ncpupercentage=50\nnetTX=78516\nnetRX=138612\nnetRX=138612\n");
rc = host3->update_info(host_info_str);
host3->touch();
os.str("");
os << "updated host info with RC = " << rc;
Nebula::log("TST", Log::ERROR, os);
rc = thepool->update_host(host3);
os.str("");
os << "updated host into DB with RC = " << rc;
Nebula::log("TST", Log::ERROR, os);
bool result;
char * error;
rc = host3->match("numberCores=1 & cpuArchitecture=\"OTRA ARCH\"",result,&error);
os.str("");
if ( rc == 0)
{
os << "REQ result = " << result;
}
else
{
os << "REQ error = " << error;
free(error);
}
Nebula::log("TST", Log::ERROR, os);
int resulti;
rc = host3->rank("cpuSpeed + numberCores",resulti,&error);
os.str("");
if ( rc == 0)
{
os << "RANK result = " << resulti;
}
else
{
os << "RANK error = " << error;
free(error);
}
Nebula::log("TST", Log::ERROR, os);
host3->unlock();
host3->lock();
string host_info_str2("cpuArchitecture=\"OTRA ARCH\"\n");
rc = host3->update_info(host_info_str2);
host3->touch();
rc = thepool->update_host(host3);
host3->unlock();
host2->lock();
string host_info_str3("cpuArchitecture=x86_32\nnumberCores=8\ncpuSpeed=2211\ntotalMemory=2046\nfreeMemory=125\nusedMemory=1921\ncpupercentage=50\nnetTX=78516\nnetRX=138612\nnetRX=138612\n");
rc = host2->update_info(host_info_str3);
host2->touch();
rc = thepool->update_host(host2);
host2->unlock();
map <int, string> test_discover;
rc = thepool->discover(&test_discover);
if(rc!=0)
{
os.str("");
os << "Error discovering hosts.";
Nebula::log("TST", Log::ERROR, os);
}
os.str("");
os << "Discover size:" << test_discover.size();
Nebula::log("TST", Log::ERROR, os);
map <int, string>::iterator it;
for(it=test_discover.begin();it!=test_discover.end();it++)
{
os.str("");
os << "IM_MAD:" << it->second << " has to monitor " << it->first;
Nebula::log("TST", Log::ERROR, os);
}
return 0;
}
int main()
{
pthread_t test_thread;
pthread_create(&test_thread,0,test,(void *)0);
try
{
Nebula& nd = Nebula::instance();
nd.start();
}
catch (exception &e)
{
cout << e.what() << endl;
return -1;
}
return 0;
}

View File

@ -0,0 +1,99 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 "VirtualMachine.h"
#include "VirtualMachineManagerDriver.h"
#include "Nebula.h"
#include "InformationManagerDriver.h"
#include "InformationManager.h"
#include "Mad.h"
#include <string>
#include <iostream>
#include <stdlib.h>
#include <stdexcept>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pthread.h>
using namespace std;
extern "C" void *test(void *nothing)
{
sleep(2);
Nebula& pn = Nebula::instance();
InformationManager * im = pn.get_im();
HostPool * hostp = pn.get_hpool();
int * oid;
int rc;
sleep(2);
/* rc = hostp->allocate(oid,"aquila03","im_test","xen_ssh","dummy",true);
if ( rc != 0 )
{
Nebula::log("TST",Log::ERROR,"Error allocating host!");
return 0;
}
*/
im->load_mads();
sleep(600);
return 0;
}
int main()
{
pthread_attr_t pattr;
pthread_t test_thread;
pthread_attr_init (&pattr);
pthread_attr_setdetachstate (&pattr, PTHREAD_CREATE_JOINABLE);
pthread_create(&test_thread,&pattr,test,(void *)0);
try
{
Nebula& nd = Nebula::instance();
nd.start();
}
catch (exception &e)
{
cout << e.what() << endl;
return -1;
}
return 0;
}

View File

@ -0,0 +1,188 @@
#include <iostream>
#include <sstream>
#include <string>
#include <unistd.h>
#include "MadManager.h"
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
bool finalized = false;
class MadEcho : public Mad
{
public:
MadEcho(map<string,string> &attrs):Mad(0,attrs,false)
{}
;
~MadEcho()
{}
;
void protocol(string& message);
void recover()
{
cout<<"Recover Function @ MadEcho\n";
};
void test(const char *a1, const char *a2, const char *a3)
{
ostringstream buf;
buf << "TEST " << a1 << " " << a2 << " " << a3 << "\n";
write(buf);
}
void first(const char *a1)
{
ostringstream buf;
buf << "FIRST " << a1 << "\n";
write(buf);
}
};
void MadEcho::protocol(string& message)
{
stringbuf sbuf(message);
iostream sstr(&sbuf);
string field[5];
sstr >> field[0] >> ws;
if ( field[0] == "INIT" )
{
getline(sstr,field[1]);
cout << "Init Result: " << field[1] << "\n";
}
else if ( field[0] == "FINALIZE" )
{
getline(sstr,field[1]);
cout << "Finalize Result: " << field[1] << "\n";
}
else if ( field[0] == "TEST" )
{
sstr >> field[1] >> field[2] >> field[3] >> ws;
getline(sstr,field[4]);
cout << "Test Result: " << field[1] << "\nArg1: " << field[2]
<< "\nArg2: " << field[3] << "\nInfo: " << field[4] << "\n";
}
else if ( field[0] == "FIRST" )
{
finalized = true;
sstr >> field[1] >> ws;
getline(sstr,field[2]);
cout << "First Result: " << field[1] << "\nArg1: " << field[2] << "\n";
pthread_cond_signal(&cond);
}
}
class MMadManager : public MadManager
{
public:
MMadManager(vector<const Attribute *>& _mads):MadManager(_mads){};
~MMadManager(){};
void load_mads(int uid){};
int mstart(){
return start();
}
void mstop(){
stop();
}
int madd(Mad *mad){
return add(mad);
}
};
int main()
{
vector<const Attribute *> _mads;
MMadManager *mm;
MadEcho * mad_echo;
map<string,string> attrs;
int rc;
MadManager::mad_manager_system_init();
mm = new MMadManager(_mads);
rc = mm->mstart();
if ( rc != 0 )
{
goto error_start;
}
attrs.insert(make_pair("NAME","echo_mad"));
attrs.insert(make_pair("EXECUTABLE","./mad_echo.sh"));
attrs.insert(make_pair("OWNER","foo"));
mad_echo = new MadEcho(attrs);
/*
rc = mad_echo->start();
if ( rc != 0 )
{
goto error_start_mad;
}
*/
rc = mm->madd(mad_echo);
if ( rc != 0 )
{
goto error_register;
}
mad_echo->test("argument1","argument2","argument3");
mad_echo->first("filed1");
pthread_mutex_lock(&mutex);
while ( finalized == false )
{
pthread_cond_wait(&cond, &mutex);
}
printf("Mad_Test - OK\n");
mm->mstop();
delete mm;
return 0;
error_register:
cout << "Mad_Test - error register mad\n";
mm->mstop();
delete mm;
delete mad_echo;
return -1;
error_start:
cout << "Mad_Test - error start manager\n";
mm->mstop();
delete mm;
return -1;
}

44
share/test/src/mad/mad_echo.sh Executable file
View File

@ -0,0 +1,44 @@
#!/bin/bash
# --------------------------------------------------------------------------
# Copyright 2002-2006 GridWay Team, Distributed Systems Architecture
# Group, Universidad Complutense de Madrid
#
# 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.
# --------------------------------------------------------------------------
echo "MAD started" > mad.log
while read COMMAND ARG1 ARG2 ARG3
do
echo "$COMMAND $ARG1 $ARG2 $ARG3" >> mad.log
case $COMMAND in
"INIT" | "init")
echo "INIT SUCCESS"
;;
"FINALIZE" | "finalize")
echo "FINALIZE SUCCESS"
exit 0
;;
"TEST" | "test")
echo "TEST SUCCESS $ARG1 $ARG2 $ARG3"
;;
"FIRST" | "first")
echo "FIRST SUCCESS $ARG1"
;;
*)
echo "$COMMAND - FAILURE Unknown command"
;;
esac
done

View File

@ -0,0 +1,15 @@
#include "Log.h"
#include <sstream>
int main()
{
Log log("file.log");
ostringstream message;
message << "pepe";
log.log("module", Log::ERROR, message);
return 0;
}

View File

@ -0,0 +1,173 @@
#include "PoolSQL.h"
#include <climits>
#include <iostream>
#include <sstream>
#include <string>
class A : public ObjectSQL
{
public:
A(int n,string &t):number(n),text(t){oid=n;};
A(int n,const char *t):number(n),text(t){oid=n;};
A(int n):number(n){oid=n;};
A(){};
~A(){};
int number;
string text;
int insert(sqlite3 *db);
int select(sqlite3 *db);
int update(sqlite3 *db){return 0;};
};
int A::insert(sqlite3 *db)
{
const char * sql_cmd;
ostringstream buffer;
string sql;
int rc;
buffer << "INSERT INTO test (numero,texto) VALUES (" << oid << ",\"" <<
text << "\")";
sql = buffer.str();
sql_cmd = sql.c_str();
rc = sqlite3_exec(db,
sql_cmd,
NULL,
NULL,
NULL);
if ( rc != SQLITE_OK )
{
cout << "ERROR : "<<sql_cmd<<"\n";
}
return 0;
};
extern "C" int select_cb (
void * _this,
int num,
char ** values,
char ** names)
{
A *aclass;
aclass = (A *) _this;
cout << "#" << values[1] << "#\n";
aclass->text = values[1];
cout << "-" << aclass->text << "-\n";
return 0;
}
int A::select(sqlite3 *db){
const char * sql_cmd;
ostringstream buffer;
string sql;
buffer << "SELECT * FROM test WHERE numero=" << oid;
sql = buffer.str();
sql_cmd = sql.c_str();
sqlite3_exec(db,
sql_cmd,
select_cb,
this,
NULL);
return 0;
};
class Apool : public PoolSQL
{
public:
Apool(sqlite3 *db):PoolSQL(db,"test"){};
~Apool(){};
private:
ObjectSQL* create(){ return (new A);};
};
/*
int main()
{
sqlite3 * db;
sqlite3_open("pool.db", &db);
sqlite3_exec(db,
"CREATE TABLE test (numero INTEGER,"
"texto TEXT)",
NULL,
NULL,
NULL);
A *a;
Apool apool(db);
a = new A(-1,"prueba");
apool.allocate(a);
a = new A(4,"otro");
apool.allocate(a);
a = new A(8,"otro mas");
apool.allocate(a);
A * aobj = static_cast<A *>(apool.get(1,false));
cout << aobj->text << "\n";
delete aobj;
aobj = static_cast<A *>(apool.get(0,false));
cout << aobj->text << "\n";
delete aobj;
sqlite3_close(db);
}
*/
/*
int main()
{
sqlite3 * db;
string s("HOLA");
A test(8,s);
A otro(8);
sqlite3_open("pool.db", &db);
sqlite3_exec(db,
"CREATE TABLE test (numero INTEGER,"
"texto TEXT)",
NULL,
NULL,
NULL);
test.insert(db);
otro.select(db);
cout << "texto : " << otro.text;
sqlite3_close(db);
}*/

View File

@ -0,0 +1,122 @@
#include "VirtualMachineTemplate.h"
#include <iostream>
#include <sqlite3.h>
#include <sstream>
int main()
{
VirtualMachineTemplate tmp;
Template t;
char *error;
string st("MEMORY=345\nCPU=4\nDISK=[FILE=\"img\",TYPE=cd]\nDISK=[FILE=\"../f\"]\n");
ostringstream os;
if ((tmp.parse("vm.template",&error) != 0 ) &&
(error != 0))
{
cout << "Error parsing file: "<< error << endl;
free(error);
}
string mrs;
tmp.marshall(mrs,':');
cout << "-" << mrs << "-";
if ((t.parse(st,&error) != 0 ) &&
(error != 0))
{
cout << "Error parsing string: "<< error << endl;
free(error);
}
cout << "TEMPLATE" << endl << t << endl;
cout << "------" << endl << endl;
cout << "TEMPLATE" << endl << tmp << endl;
string mm("MEMORY");
vector<const Attribute*> values;
tmp.get(mm,values);
const SingleAttribute *pmemo;
pmemo = static_cast<const SingleAttribute *>(values[0]);
cout << "MEM = " << pmemo->value() << "\n";
cout << "TEMPLATE--" << endl << t << endl;
// ---- Init template DB ----
/*
sqlite3 * db;
sqlite3_open("template.db", &db);
sqlite3_exec(db,
"CREATE TABLE vm_template (id INTEGER,"
"name TEXT, value TEXT)",
0,
0,
0);
cout << tmp.insert(db) << endl;
VirtualMachineTemplate rtmp(2);
rtmp.select(db);
cout << endl << "FROM DB" << endl << rtmp;
sqlite3_close(db);
*/
return 0;
}
/*
int main()
{
TemplateAttribute<string> sa1("ejemplo","valor");
TemplateAttribute<string> sa2("sample","value");
// Attribute * pa;
// Attribute * pa2;
cout << sa1.name() << ":" << sa1.value() << "\n";
cout << sa2.name() << ":" << sa2.value() << "\n";
cout << sa2.name() << ":" << sa2.value() << "\n";
//map<string, Attribute *> mymap;
//TemplateAttribute<string> * pta;
//pa = new TemplateAttribute<string>("ejemplo","valor");
//cout << str_attr.name();
//cout << pa->name();
//pta = static_cast<TemplateAttribute<string> *> (pa);
//cout << pa->name();
//mymap.insert(make_pair("cadena",pa));
//delete pa;
return 0;
}
*/

View File

@ -0,0 +1,8 @@
MEMORY = 512
Cpu = 1
DISK = [ ImaGE="/local/VM/disk.img",device="sda",TYPE="hd" ]
DISK = [ image="../debian.iso",DEvice="sdb",TYPE="cdrom" ]
nic = [ MAC="00:01:02", TYPE="bridged", IP="147.3"]

View File

@ -0,0 +1,74 @@
#include "VirtualMachinePool.h"
#include <climits>
#include <iostream>
#include <sstream>
#include <string>
int main()
{
sqlite3 * db;
sqlite3_open("pool.db", &db);
VirtualMachinePool thepool(db);
VirtualMachine * vm;
int eid;
string st("MEMORY=345\nCPU=4\nDISK=[FILE=\"img\",TYPE=cd]\nDISK=[FILE=\"../f\"]\n");
thepool.bootstrap();
thepool.allocate(0,st,&eid);
cout << eid << endl;
thepool.allocate(0,st,&eid);
cout << eid << endl;
thepool.allocate(0,st,&eid);
cout << eid << endl;
vm = static_cast<VirtualMachine *>(thepool.get(444,false));
if (vm != 0)
{
cout << *vm;
}
vm = static_cast<VirtualMachine *>(thepool.get(1,true));
string vmm = "xen";
string tm = "gridftp";
//vm->add_history(2,2,vmm,tm);
//thepool.update_history(vm);
if (vm != 0)
{
cout << *vm << endl;
vm->unlock();
}
else
{
cout << "VM es cero!" << endl;
}
VirtualMachine * vm2 = static_cast<VirtualMachine *>(thepool.get(2,false));
if (vm2 != 0)
{
cout << *vm2;
}
VirtualMachine * vm3 = static_cast<VirtualMachine *>(thepool.get(3,true));
if (vm3 != 0)
{
cout << *vm3;
vm3->unlock();
}
sqlite3_close(db);
}

View File

@ -0,0 +1,56 @@
#include <stdio.h>
#include "Nebula.h"
#include <sqlite3.h>
#include <exception>
#include "VirtualMachine.h"
#include "VirtualMachineManagerDriver.h"
extern "C" void *test(void *nothing)
{
VirtualMachineManager *vm_manager;
InformationManager *im_manager;
Nebula& ne = Nebula::instance();
string s_template;
ostringstream os;
sleep(20);
Nebula::log("TST", Log::INFO, "Alive!");
vm_manager = ne.get_vmm();
vm_manager->load_mads(0);
im_manager = ne.get_im();
im_manager->load_mads(0);
return 0;
}
int main()
{
pthread_attr_t pattr;
pthread_t test_thread;
pthread_attr_init (&pattr);
pthread_attr_setdetachstate (&pattr, PTHREAD_CREATE_JOINABLE);
pthread_create(&test_thread,&pattr,test,(void *)0);
try
{
Nebula& nd = Nebula::instance();
nd.start();
}
catch (exception &e)
{
cout << e.what() << endl;
return -1;
}
return 0;
}

View File

@ -0,0 +1,220 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2008, Distributed Systems Architecture Group, Universidad #
# Complutense de Madrid (dsa-research.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. #
#--------------------------------------------------------------------------- #
#####################
# CONSOLE UTILITIES #
#####################
# Sets bold font
def scr_bold
print "\33[1m"
end
# Sets underline
def scr_underline
print "\33[4m"
end
# Restore normal font
def scr_restore
print "\33[0m"
end
# Clears screen
def scr_cls
print "\33[2J\33[H"
end
# Moves the cursor
def scr_move(x,y)
print "\33[#{x};#{y}H"
end
##################################
# Class show configurable tables #
##################################
ShowTableExample={
:id => {
:name => "ID",
:size => 4,
:proc => lambda {|d,e| d["oid"] }
},
:name => {
:name => "NAME",
:size => 8,
:proc => lambda {|d,e| d["deploy_id"] }
},
:stat => {
:name => "STAT",
:size => 4,
:proc => lambda {|d,e| e[:vm].get_state(d) }
},
:default => [:id, :name, :stat]
}
# Class to print tables
class ShowTable
attr_accessor :ext, :columns
# table => definition of the table to print
# ext => external variables (Hash), @ext
def initialize(table, ext=nil)
@table=table
@ext=Hash.new
@ext=ext if ext.kind_of?(Hash)
@columns=@table[:default]
end
# Returns a formated string for header
def header_str
@columns.collect {|c|
if @table[c]
#{}"%#{@table[c][:size]}s" % [@table[c][:name]]
format_data(c, @table[c][:name])
else
nil
end
}.compact.join(' ')
end
# Returns an array with header titles
def header_array
@columns.collect {|c|
if @table[c]
@table[c][:name].to_s
else
""
end
}.compact
end
def data_str(data, options=nil)
# TODO: Use data_array so it can be ordered and/or filtered
res_data=data_array(data, options)
res_data.collect {|d|
(0..(@columns.length-1)).collect {|c|
dat=d[c]
col=@columns[c]
format_data(col, dat) if @table[col]
}.join(' ')
}.join("\n")
#data.collect {|d|
# @columns.collect {|c|
# format_data(c, @table[c][:proc].call(d, @ext)) if @table[c]
# }.join(' ')
#}.join("\n")
end
def data_array(data, options=nil)
res_data=data.collect {|d|
@columns.collect {|c|
@table[c][:proc].call(d, @ext).to_s if @table[c]
}
}
if options
filter_data!(res_data, options[:filter]) if options[:filter]
sort_data!(res_data, options[:order]) if options[:order]
end
res_data
end
def format_data(field, data)
minus=( @table[field][:left] ? "-" : "" )
size=@table[field][:size]
"%#{minus}#{size}.#{size}s" % [ data.to_s ]
end
def get_order_column(column)
desc=column.match(/^-/)
col_name=column.gsub(/^-/, '')
index=@columns.index(col_name.to_sym)
[index, desc]
end
def sort_data!(data, order)
data.sort! {|a,b|
# rows are equal by default
res=0
order.each {|o|
# compare
pos, dec=get_order_column(o)
break if !pos
r = (b[pos]<=>a[pos])
# if diferent set res (return value) and exit loop
if r!=0
# change sign if the order is decreasing
r=-r if dec
res=r
break
end
}
res
}
end
def filter_data!(data, filters)
filters.each {|key, value|
pos=@columns.index(key.downcase.to_sym)
if pos
data.reject! {|d|
if !d[pos]
true
else
!d[pos].downcase.match(value.downcase)
end
}
end
}
end
def print_help
text=[]
@table.each {|option, data|
next if option==:default
text << "%9s (%2d) => %s" % [option, data[:size], data[:desc]]
}
text.join("\n")
end
end
################
# Miscelaneous #
################
def check_parameters(name, number)
if ARGV.length < number
print "Command #{name} requires "
if number>1
puts "#{number} parameters to run."
else
puts "one parameter to run"
end
exit -1
end
end

View File

@ -0,0 +1,115 @@
require 'optparse'
require 'pp'
class CommandParse
COMMANDS_HELP=<<-EOT
Commands:
EOT
USAGE_BANNER=<<-EOT
Usage:
onevm [<options>] <command> [<parameters>]
Options:
EOT
ONE_VERSION=<<-EOT
OpenNEbula preview release (2008/03/26)
Copyright 2002-2008, Distributed Systems Architecture Group, Universidad
Complutense de Madrid (dsa-research.org)
EOT
def initialize
@options=Hash.new
@cmdparse=OptionParser.new do |opts|
opts.banner=text_banner
opts.on("-l x,y,z", "--list x,y,z", Array,
"Selects columns to display with list", "command") do |o|
@options[:list]=o.collect {|c| c.to_sym }
end
opts.on("--list-columns", "Information about the columns available",
"to display, order or filter") do |o|
puts list_options
exit
end
opts.on("-o x,y,z", "--order x,y,z", Array,
"Order by these columns, column starting",
"with - means decreasing order") do |o|
@options[:order]=o
end
opts.on("-f x,y,z", "--filter x,y,z", Array,
"Filter data. An array is specified", "with column=value pairs.") do |o|
@options[:filter]=Hash.new
o.each {|i|
k,v=i.split('=')
@options[:filter][k]=v
}
end
opts.on("-d seconds", "--delay seconds", Integer,
"Sets the delay in seconds for top", "command") do |o|
@options[:delay]=o
end
opts.on_tail("-h", "--help", "Shows this help message") do |o|
print_help
exit
end
opts.on_tail("-v", "--version",
"Shows version and copyright information") do |o|
puts text_version
exit
end
end
end
def parse(args)
begin
@cmdparse.parse!(args)
rescue => e
puts e.message
exit -1
end
end
def options
@options
end
def print_help
puts @cmdparse
puts
puts text_commands
end
def text_commands
COMMANDS_HELP
end
def text_command_name
"onevm"
end
def text_banner
USAGE_BANNER.gsub("onevm", text_command_name)
end
def text_version
ONE_VERSION
end
def list_options
"<list options>\n\n"
end
end

511
src/client/ruby/one.rb Normal file
View File

@ -0,0 +1,511 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2008, Distributed Systems Architecture Group, Universidad #
# Complutense de Madrid (dsa-research.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. #
#--------------------------------------------------------------------------- #
begin
require 'rubygems'
rescue Exception
end
require 'sqlite3'
require 'xmlrpc/client'
require 'pp'
module ONE
########################
# DATABASE DEFINITIONS #
########################
ONE_LOCATION=ENV["ONE_LOCATION"]
TABLES={
"vmpool" => %w{oid aid tid uid priority reschedule last_reschedule
last_poll template state lcm_state stime etime deploy_id memory
cpu net_tx net_rx},
"history" => %w{oid seq hostname vm_dir hid vmmad tmmad stime
etime pstime petime rstime retime estime eetime reason},
"vm_template" => %w{id name type value},
"hostpool" => %w{hid host_name state im_mad vm_mad tm_mad
last_mon_time managed},
"host_attributes" => %w{id name type value},
"hostshares" => %w{hsid endpoint disk_usage mem_usage
cpu_usage max_disk max_mem max_cpu running_vms}
}
#######################
# ENUMS AND CONSTANTS #
#######################
VM_STATE=%w{INIT PENDING HOLD ACTIVE STOPPED SUSPENDED DONE FAILED}
LCM_STATE=%w{LCM_INIT PROLOG BOOT RUNNING MIGRATE SAVE_STOP SAVE_SUSPEND
SAVE_MIGRATE PROLOG_MIGRATE EPILOG_STOP EPILOG SHUTDOWN CANCEL}
HOST_STATE=%w{INIT MONITORING MONITORED ERROR DISABLED}
MIGRATE_REASON=%w{NONE ERROR STOP_RESUME PERFORMANCE USER RESCHEDULING
KILL}
##################
# HELPER CLASSES #
##################
# Server class. This is the one that makes xml-rpc calls.
class Server
#def initialize(host="localhost", port=60666, path="/RPC2")
# @server=XMLRPC::Client.new(host, path, port)
#end
def initialize(endpoint=nil)
if endpoint
one_endpoint=endpoint
elsif ENV["ONE_XMLRPC"]
one_endpoint=ENV["ONE_XMLRPC"]
else
one_endpoint="http://localhost:2633/RPC2"
end
@server=XMLRPC::Client.new2(one_endpoint)
end
def call(action, *args)
begin
response=@server.call("one."+action, "sessionID", *args)
response<<nil if response.length<2
response
rescue Exception => e
[false, e.message]
end
end
end
# This class has the functions to access to the database
class Database
attr_reader :db
def initialize(file=ONE_LOCATION+"/var/one.db")
@db=SQLite3::Database.new(file)
@db.busy_timeout(5000)
@db.busy_handler do |data, retries|
if retries < 3
puts "Timeout connecting to the database, retrying. "+
"Tries left #{2-retries}"
sleep 1
1
else
0
end
end
end
def select_table_with_names(table, options=nil)
options=Hash.new if !options
where_clause=( options[:where] ? "where #{options[:where]}" : "" )
order_clause=( options[:order] ? "order by #{options[:order]}" : "" )
sql="select * from #{table} #{where_clause} #{order_clause}"
#pp sql
begin
result=@db.execute(sql)
rescue Exception => e
result=[false, e.message]
return result
end
res=result.collect {|row|
r=Hash.new
TABLES[table].each_with_index {|value, index|
r[value]=row[index]
}
r
}
return [true,res]
end
def close
@db.close
end
end
# Prototype class to call server actions
class CommandContainer
def initialize(server)
@server=server
end
# Magic goes here. This function converts each argument
# using description provided by a hash returned by "commands"
# method. If the position contains a nil or false the
# argument is not converted (right now used for booleans).
def call_method(name, *_args)
args=[]
_args.flatten!
_args.each_with_index {|v,i|
if self.commands[name][i]
args << v.send(self.commands[name][i])
else
args << v
end
}
@server.call(prefix+name.gsub(/_$/, ""), *args)
end
def method_missing(method, *args)
if self.commands.has_key?(method.to_s)
call_method(method.to_s, args)
else
raise NoMethodError
end
end
# This method should return a hash with action names
# and an array with methods to convert the arguments.
def commands
{}
end
def prefix
""
end
end
###########################
# ONE ABSTRACTION CLASSES #
###########################
class VM < CommandContainer
SHORT_VM_STATES={
"INIT" => "init",
"PENDING" => "pend",
"HOLD" => "hold",
"ACTIVE" => "actv",
"STOPPED" => "stop",
"SUSPENDED" => "susp",
"DONE" => "done",
"FAILED" => "fail"
}
SHORT_LCM_STATES={
"PROLOG" => "prol",
"BOOT" => "boot",
"RUNNING" => "runn",
"MIGRATE" => "migr",
"SAVE_STOP" => "save",
"SAVE_SUSPEND" => "save",
"SAVE_MIGRATE" => "save",
"PROLOG_MIGRATE"=> "migr",
"EPILOG_STOP" => "epil",
"EPILOG" => "epil",
"SHUTDOWN" => "shut",
"CANCEL" => "shut"
}
SHORT_MIGRATE_REASON={
"NONE" => "none",
"ERROR" => "erro",
"STOP_RESUME" => "stop",
"PERFORMANCE" => "perf",
"USER" => "user",
"RESCHEDULING" => "rsch",
"KILL" => "kill"
}
def commands
{
"allocate_" => [:to_s],
"deploy" => [:to_i, :to_i],
"action" => [:to_s, :to_i],
"migrate_" => [:to_i, :to_i, nil],
"get_info" => [:to_i]
}
end
def prefix
"vm"
end
def allocate(*args)
begin
f=open(args[0], "r")
template=f.read
f.close
rescue
return [false, "Can not read template"]
end
self.allocate_(template)
end
def migrate(*args)
self.migrate_(args[0], args[1], false)
end
def livemigrate(*args)
self.migrate_(args[0], args[1], true)
end
def shutdown(*args)
self.action("shutdown", args[0])
end
def hold(*args)
self.action("hold", args[0])
end
def release(*args)
self.action("release", args[0])
end
def stop(*args)
self.action("stop", args[0])
end
def suspend(*args)
self.action("suspend", args[0])
end
def resume(*args)
self.action("resume", args[0])
end
def delete(*args)
self.action("finalize", args[0])
end
def get(options=nil)
begin
@db=Database.new
res=@db.select_table_with_names("vmpool", options)
@db.close
result=res
rescue
result=[false, "Error accessing database"]
end
result
end
def get_vms(options=nil)
res=self.get(options)
if res[0]
res[1].each {|row|
hostname=self.get_history_host(row["oid"])
row["hostname"]=hostname
}
end
res
end
###########
# HELPERS #
###########
def get_history_host(id, db=nil)
if db
my_db=db
else
my_db=Database.new
end
res=my_db.select_table_with_names("history", :where => "oid=#{id}")
my_db.close if !db
if res and res[0]
return hostname=res[1][-1]["hostname"]
else
return nil
end
end
def get_history(id, db=nil)
if db
my_db=db
else
my_db=Database.new
end
res=my_db.select_table_with_names("history", :where => "oid=#{id}")
my_db.close if !db
return res
end
def get_template(id, db=nil)
if db
my_db=db
else
my_db=Database.new
end
res=my_db.select_table_with_names("vm_template", :where => "id=#{id}")
my_db.close if !db
if res && res[0]
template=Hash.new
res[1].each {|v|
name=v["name"]
type=v["type"]
value=v["value"]
if type=="0"
template[name]=value
else
template[name]=Hash.new
value.split(',').each {|v2|
name2, value2=v2.split("=")
template[name][name2]=value2
}
end
}
template
else
nil
end
end
def get_state(data)
vm_state=ONE::VM_STATE[data["state"].to_i]
state_str=SHORT_VM_STATES[vm_state]
if state_str=="actv"
lcm_state=ONE::LCM_STATE[data["lcm_state"].to_i]
state_str=SHORT_LCM_STATES[lcm_state]
end
state_str
end
def get_reason(data)
reason=ONE::MIGRATE_REASON[data["reason"].to_i]
reason_str=SHORT_MIGRATE_REASON[reason]
reason_str
end
def str_running_time(data)
stime=Time.at(data["stime"].to_i)
if data["etime"]=="0"
etime=Time.now
else
etime=Time.at(data["etime"].to_i)
end
dtime=Time.at(etime-stime).getgm
"%02d %02d:%02d:%02d" % [dtime.yday-1, dtime.hour, dtime.min, dtime.sec]
end
end
class Host < CommandContainer
SHORT_HOST_STATES={
"INIT" => "on",
"MONITORING" => "on",
"MONITORED" => "on",
"ERROR" => "err",
"DISABLED" => "off",
}
def commands
{
"allocate_" => [:to_s, :to_s, :to_s, :to_s, nil],
"info" => [:to_i],
"delete" => [:to_i],
"enable_" => [:to_i, nil]
}
end
def allocate(*args)
case args[4]
when /^true$/i, 1
managed=true
when /^false$/i, 0
managed=false
else
puts "Error, use true/false or 0/1 for managed parameter"
exit -1
end
self.allocate_( args[0..3]<<managed )
end
def enable(*args)
self.enable_(args[0], true)
end
def disable(*args)
self.enable_(args[0], false)
end
def get_generic(table, options=nil)
begin
@db=Database.new
res=@db.select_table_with_names(table, options)
@db.close
result=res
rescue
result=[false, "Error accessing database"]
end
result
end
def get(options=nil)
get_generic("hostpool", options)
end
def get_host_attributes(hid)
get_generic("host_attributes", :where => "id=#{hid}")
end
def get_host_share(hid)
get_generic("hostshares", :where => "hsid=#{hid}")
end
def prefix
"host"
end
###########
# HELPERS #
###########
def get_state(data)
host_state=ONE::HOST_STATE[data["state"].to_i]
state_str=SHORT_HOST_STATES[host_state]
state_str
end
end
end

289
src/client/ruby/onehost Executable file
View File

@ -0,0 +1,289 @@
#!/usr/bin/env ruby
# -------------------------------------------------------------------------- #
# Copyright 2002-2008, Distributed Systems Architecture Group, Universidad #
# Complutense de Madrid (dsa-research.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. #
#--------------------------------------------------------------------------- #
ONE_LOCATION=ENV["ONE_LOCATION"]
if !ONE_LOCATION
puts "ONE_LOCATION not set"
exit -1
end
$: << ONE_LOCATION+"/lib/ruby"
require 'one'
require 'client_utilities'
require 'command_parse'
ShowTableHost={
:hid => {
:name => "HID",
:desc => "ONE identifier for host",
:size => 4,
:proc => lambda {|d,e| d["hid"] }
},
:name => {
:name => "NAME",
:desc => "Hostname",
:size => 25,
:left => true,
:proc => lambda {|d,e| d["host_name"] }
},
:rvm => {
:name => "RVM",
:desc => "Number of virtual machines running",
:size => 3,
:proc => lambda {|d,e| d["hs_running_vms"] }
},
:tcpu => {
:name => "TCPU",
:desc => "Total cpu percentage",
:size => 6,
:proc => lambda {|d,e| d["TOTALCPU"] }
},
:fcpu => {
:name => "FCPU",
:desc => "Free cpu percentage",
:size => 6,
:proc => lambda {|d,e| d["TOTALCPU"].to_i-d["USEDCPU"].to_i }
},
:acpu => {
:name => "ACPU",
:desc => "Available cpu percentage (not reserved by VMs)",
:size => 6,
:proc => lambda {|d,e|
max_cpu=d["hs_max_cpu"].to_i
max_cpu=100 if max_cpu==0
max_cpu-d["hs_cpu_usage"].to_i
}
},
:tmem => {
:name => "TMEM",
:desc => "Total memory",
:size => 7,
:proc => lambda {|d,e| d["TOTALMEMORY"] }
},
:fmem => {
:name => "FMEM",
:desc => "Free memory",
:size => 7,
:proc => lambda {|d,e| d["FREEMEMORY"] }
},
:stat => {
:name => "STAT",
:desc => "Host status",
:size => 4,
:proc => lambda {|d,e| e[:host].get_state(d) }
},
:default => [:hid, :name, :rvm, :tcpu, :fcpu, :acpu, :tmem, :fmem, :stat]
}
class HostShow
def initialize(host)
@host=host
@table=ShowTable.new(ShowTableHost, :host => @host)
end
def close
end
def header_host_small
scr_bold
scr_underline
puts @table.header_str
scr_restore
end
def list_short(options=nil)
res=@host.get
if options
@table.columns=options[:columns] if options[:columns]
end
if res[0]
result=res
header_host_small
res[1].each {|row|
res2=@host.get_host_attributes(row["hid"])
if res2[0]
attributes=res2[1]
attributes.each {|a|
if %w{USEDCPU TOTALMEMORY FREEMEMORY TOTALCPU}.include? a["name"]
row[a["name"]]=a["value"]
end
}
end
res2=@host.get_host_share(row["hid"])
if res2[0]
attributes=res2[1]
attributes.each {|a|
row["hs_running_vms"]=a["running_vms"]
row["hs_max_mem"]=a["max_mem"]
row["hs_max_cpu"]=a["max_cpu"]
row["hs_mem_usage"]=a["mem_usage"]
row["hs_cpu_usage"]=a["cpu_usage"]
row["hs_running_vms"]=a["running_vms"]
}
end
}
puts @table.data_str(result[1], options)
result
else
result=res
end
end
def top(options=nil)
delay=1
delay=options[:delay] if options && options[:delay]
result=nil
begin
while true
scr_cls
scr_move(0,0)
result=list_short(options)
sleep delay
end
rescue Exception
end
result
end
end
class OnehostParse < CommandParse
COMMANDS_HELP=<<-EOT
Commands:
* add (Adds a new machine to the pool)
onehost add <hostname> <im_mad> <vmm_mad>
* show (Gets info from a host)
onehost show <host_id>
* delete (Removes a machine from the pool)
onehost delete <host_id>
* list (Lists machines in the pool)
onehost list
* enable (Enables host)
onehost enable <host_id>
* disable (Disables host)
onehost disable <host_id>
* top (Lists hosts continuously)
onehost top
EOT
def text_commands
COMMANDS_HELP
end
def text_command_name
"onehost"
end
def list_options
table=ShowTable.new(ShowTableHost)
table.print_help
end
end
server=ONE::Server.new
host=ONE::Host.new(server)
onehost_opts=OnehostParse.new
onehost_opts.parse(ARGV)
result=[false, "Unknown error"]
command=ARGV.shift
case command
when "add"
check_parameters("add", 3)
result=host.allocate(*[ARGV[0], ARGV[1], ARGV[2], "tm_mad", "true"])
when "show"
check_parameters("show", 1)
result=host.info(*ARGV)
if result[0]
puts result[1]
else
puts "Error: "+result[1]
exit -1
end
when "delete"
check_parameters("delete", 1)
result=host.delete(*ARGV)
if result[0]
puts "Host deleted"
exit 0
end
when "list"
hostlist=HostShow.new(host)
ops=onehost_opts.options
ops[:columns]=ops[:list] if ops[:list]
result=hostlist.list_short(ops)
hostlist.close
when "top"
hostlist=HostShow.new(host)
ops=onehost_opts.options
ops[:columns]=ops[:list] if ops[:list]
result=hostlist.top(ops)
hostlist.close
when "enable"
check_parameters("enable", 1)
result=host.enable(*ARGV)
if result[0]
puts "Host enabled"
exit 0
end
when "disable"
check_parameters("disable", 1)
result=host.disable(*ARGV)
if result[0]
puts "Host disabled"
exit 0
end
else
onehost_opts.print_help
exit -1
end
if !result[0]
puts "Error: " + result[1].to_s
exit -1
end

509
src/client/ruby/onevm Executable file
View File

@ -0,0 +1,509 @@
#!/usr/bin/env ruby
# -------------------------------------------------------------------------- #
# Copyright 2002-2008, Distributed Systems Architecture Group, Universidad #
# Complutense de Madrid (dsa-research.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. #
#--------------------------------------------------------------------------- #
ONE_LOCATION=ENV["ONE_LOCATION"]
if !ONE_LOCATION
puts "ONE_LOCATION not set"
exit -1
end
$: << ONE_LOCATION+"/lib/ruby"
require 'one'
require 'client_utilities'
require 'command_parse'
ShowTableVM={
:id => {
:name => "ID",
:desc => "ONE identifier for the VM",
:size => 4,
:proc => lambda {|d,e| d["oid"] }
},
:name => {
:name => "NAME",
:desc => "Name of the domain",
:size => 8,
:proc => lambda {|d,e|
tid=d["template"]
template=e[:vm].get_template(tid)
template["NAME"]
}
},
:stat => {
:name => "STAT",
:desc => "Actual status of the VM",
:size => 4,
:proc => lambda {|d,e| e[:vm].get_state(d) }
},
:cpu => {
:name => "CPU",
:desc => "CPU percentage used by the VM",
:size => 3,
:proc => lambda {|d,e| d["cpu"] }
},
:mem => {
:name => "MEM",
:desc => "Memory used by the VM",
:size => 7,
:proc => lambda {|d,e| d["memory"] }
},
:hostname => {
:name => "HOSTNAME",
:desc => "Machine where the VM is running",
:size => 15,
:proc => lambda {|d,e| e[:vm].get_history_host(d["oid"]) }
},
:time => {
:name => "TIME",
:desc => "Time since the VM was submitted",
:size => 11,
:proc => lambda {|d,e| e[:vm].str_running_time(d) }
},
:default => [:id, :name, :stat, :cpu, :mem, :hostname, :time]
}
ShowTableHistory={
:id => {
:name => "ID",
:desc => "ONE identifier for the VM",
:size => 4,
:proc => lambda {|d,e| d["oid"] }
},
:seq => {
:name => "SEQ",
:desc => "Sequence number",
:size => 3,
:proc => lambda {|d,e| d["seq"] }
},
:hostname => {
:name => "HOSTNAME",
:desc => "Name of the host where the VM was submited",
:size => 15,
:proc => lambda {|d,e| d["hostname"] }
},
:stime => {
:name => "STIME",
:desc => "Start time",
:size => 14,
:proc => lambda {|d,e|
t=Time.at(d["stime"].to_i)
t.strftime("%m/%d %H:%M:%S")
}
},
:etime => {
:name => "ETIME",
:desc => "End time",
:size => 14,
:proc => lambda {|d,e|
if d["etime"].to_i==0
"--"
else
t=Time.at(d["etime"].to_i)
t.strftime("%m/%d %H:%M:%S")
end
}
},
:time => {
:name => "TIME",
:desc => "Total time",
:size => 11,
:proc => lambda {|d,e| e[:vm].str_running_time(d) }
},
:reason => {
:name => "REASON",
:desc => "Reason for state change",
:size => "6",
:proc => lambda {|d,e| e[:vm].get_reason(d) }
},
:default => [:id, :seq, :hostname, :stime, :etime, :time, :reason]
}
class VmShow
def initialize(vm)
@vm=vm
@table=ShowTable.new(ShowTableVM, :vm => @vm)
@table_history=ShowTable.new(ShowTableHistory, :vm => @vm)
end
def close
end
def header_vm_small
scr_bold
scr_underline
puts @table.header_str
scr_restore
end
def header_history_small
scr_bold
scr_underline
puts @table_history.header_str
scr_restore
end
def print_vm_long(data)
str="%-10s: %-20s"
puts str % ["ID", data["oid"]]
puts str % ["NAME", data["deploy_id"]]
puts str % ["STATE", ONE::VM_STATE[data["state"].to_i]]
puts str % ["LCM_STATE", ONE::LCM_STATE[data["lcm_state"].to_i]]
puts str % ["MEMORY", data["memory"]]
puts str % ["CPU", data["cpu"]]
puts
puts "Template"
str=" %-20s: %-20s"
data.each {|key,value|
puts str % [key, value] if !%w{oid deploy_id state lcm_state memory cpu template}.include? key
}
end
def list_short(options=nil)
res=@vm.get_vms(:where => "state <> 6")
if options
@table.columns=options[:columns] if options[:columns]
end
if res[0]
result=[true, ""]
header_vm_small
if options
puts @table.data_str(res[1], options)
else
puts @table.data_str(res[1])
end
result
else
result=res
end
end
def list_long(id)
res=@vm.get(:where => "oid="+id)
if res && res[0] && res[1] && res[1].length>0
result=[true, ""]
res[1].each {|row|
print_vm_long(row)
}
result
else
if res[0]
[false, "VM not found"]
else
result=res
end
end
end
def top(options=nil)
delay=1
delay=options[:delay] if options && options[:delay]
result=nil
begin
while true
scr_cls
scr_move(0,0)
result=list_short(options)
sleep delay
end
rescue Exception
end
result
end
def list_vm_history(id, options=nil)
res=@vm.get_history(id)
if options
@table_history.columns=options[:columns] if options[:columns]
end
if res[0]
result=[true, ""]
header_history_small
if options
puts @table_history.data_str(res, options)
else
puts @table_history.data_str(res)
end
result
else
result=res
end
end
def list_vm_history_array(ids, options=nil)
res=[false, "No VMs found"]
ids.each {|id|
puts "History for VM #{id}"
puts
res=list_vm_history(id, options)
puts
}
res
end
def list_vm_history_all(options=nil)
res=@vm.get
res[1].each {|vm|
list_vm_history_array(vm["oid"], options)
}
res
end
end
##########################
## COMMAND LINE PARSING ##
##########################
class OnevmParse < CommandParse
COMMANDS_HELP=<<-EOT
Commands:
* submit (Submits a new virtual machine, adding it to the ONE VM pool)
onevm submit <template>
template is a file name where the VM description is located
* deploy (Start a previously submitted VM in an specific host)
onevm deploy <vm_id> <host_id>
* shutdown (Shutdown an already deployed VM)
onevm shutdown <vm_id>
* livemigrate (Migrates a running VM to another host without downtime)
onevm livemigrate <vm_id> <host_id>
* migrate (Saves a running VM and starts it again in the specified host)
onevm migrate <vm_id> <host_id>
* suspend (Saves a running VM)
onevm suspend <vm_id>
* resume (Resumes the execution of a saved VM)
onevm resume <vm_id>
* delete (Deletes a VM from the pool and DB)
onevm delete <vm_id>
* list (Shows VMs in the pool)
onevm list
* show (Gets information about a specific VM)
onevm show <vm_id>
* top (Lists VMs continuously)
onevm top
* history (Gets history from VMs)
onevm history [<vm_id> <vm_id> ...]
if no vm_id is provided it will list history for all known VMs
EOT
def text_commands
COMMANDS_HELP
end
def text_command_name
"onevm"
end
def list_options
table=ShowTable.new(ShowTableVM)
table.print_help
end
end
server=ONE::Server.new
vm=ONE::VM.new(server)
onevm_opts=OnevmParse.new
onevm_opts.parse(ARGV)
result=[false, "Unknown error"]
command=ARGV.shift
case command
when "submit"
check_parameters("submit", 1)
result=vm.allocate(*ARGV)
if result[0]
puts "ID: " + result[1].to_s
exit 0
end
when "deploy"
check_parameters("deploy", 2)
result=vm.deploy(*ARGV)
if result[0]
puts "Deploying VM"
exit 0
end
when "shutdown"
check_parameters("shutdown", 1)
result=vm.shutdown(*ARGV)
if result[0]
puts "Shutting down VM"
exit 0
end
when "livemigrate"
check_parameters("livemigrate", 2)
result=vm.livemigrate(*ARGV)
if result[0]
puts "Migrating VM"
exit 0
end
when "migrate"
check_parameters("migrate", 2)
result=vm.migrate(*ARGV)
if result[0]
puts "Migrating VM"
exit 0
end
when "suspend"
check_parameters("suspend", 1)
result=vm.suspend(*ARGV)
if result[0]
puts "Suspending VM"
exit 0
end
when "resume"
check_parameters("resume", 1)
result=vm.resume(*ARGV)
if result[0]
puts "Resuming VM"
exit 0
end
when "list"
vmlist=VmShow.new(vm)
ops=onevm_opts.options
ops[:columns]=ops[:list] if ops[:list]
result=vmlist.list_short(ops)
vmlist.close
when "top"
vmlist=VmShow.new(vm)
ops=onevm_opts.options
ops[:columns]=ops[:list] if ops[:list]
result=vmlist.top(ops)
vmlist.close
when "show_db"
check_parameters("show", 1)
vmlist=VmShow.new(vm)
if ARGV[0]
result=vmlist.list_long(ARGV[0])
vmlist.close
else
result=[false, "You must provide a VM id."]
end
when "history"
vmlist=VmShow.new(vm)
ops=onevm_opts.options
ops[:columns]=ops[:list] if ops[:list]
if ARGV[0]
result=vmlist.list_vm_history_array(ARGV)
else
result=vmlist.list_vm_history_all(ops)
end
vmlist.close
when "delete"
check_parameters("delete", 1)
result=vm.delete(*ARGV)
if result[0]
puts "VM correctly deleted"
exit 0
end
when "show"
check_parameters("get_info", 1)
res = vm.get_info(ARGV[0])
if res[0]
res[1].gsub!(/^\n/, '')
(normal, template)=res[1].split("Template")
str="%-15s: %-20s"
normal.each{|line|
(key, value)=line.split(":").collect{|v| v.strip }
case key
when "STATE"
value = ONE::VM_STATE[value.to_i]
when "LCM STATE"
value = ONE::LCM_STATE[value.to_i]
when "START TIME","STOP TIME"
value=Time.at(value.to_i).strftime("%m/%d %H:%M:%S")
end
puts str % [key, value]
}
puts
puts "....: Template :...."
str=" %-16s: %-20s"
template.each{|line|
next if line=="\n"
(key, value)=line.split("^").collect{|v| v.strip }
puts str % [key, value]
}
exit 0
end
else
onevm_opts.print_help
exit -1
end
if !result[0]
puts "Error: " + result[1].to_s
exit -1
end

45
src/client/ruby/test.rb Normal file
View File

@ -0,0 +1,45 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2008, Distributed Systems Architecture Group, Universidad #
# Complutense de Madrid (dsa-research.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. #
#--------------------------------------------------------------------------- #
require 'one'
require 'pp'
template='
DISK=[image="/local/xen/domains/xen-etch/disk.img",dev="sda1",mode=w]
DISK=[image="/local/xen/domains/xen-etch/swap.img",dev="sda2",mode=w]
KERNEL=/boot/vmlinuz-2.6.18-4-xen-amd64
RAMDISK=/boot/initrd.img-2.6.18-4-xen-amd64
MEMORY=64
CPU=1
'
server=ONE::Server.new("aquila")
vm=ONE::VM.new(server)
host=ONE::Host.new(server)
#pp vm.allocate(template)
#db=ONE::Database.new
#pp db.select_table_with_names("vmpool")
pp h=host.info(0)
puts h[1]

127
src/common/ActionManager.cc Normal file
View File

@ -0,0 +1,127 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 "ActionManager.h"
#include <ctime>
#include <cerrno>
/* ************************************************************************** */
/* NeActionManager constants */
/* ************************************************************************** */
const string ActionListener::ACTION_TIMER = string("ACTION_TIMER");
const string ActionListener::ACTION_FINALIZE = string("ACTION_FINALIZE");
/* ************************************************************************** */
/* NeActionManager constructor & destructor */
/* ************************************************************************** */
ActionManager::ActionManager():
actions(),
listener(0)
{
pthread_mutex_init(&mutex,0);
pthread_cond_init(&cond,0);
}
/* -------------------------------------------------------------------------- */
ActionManager::~ActionManager()
{
unlock();
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
}
/* ************************************************************************** */
/* NeActionManager public interface */
/* ************************************************************************** */
void ActionManager::trigger(
const string &action,
void * arg)
{
ActionRequest request(action,arg);
lock();
actions.push(request);
pthread_cond_signal(&cond);
unlock();
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void ActionManager::loop(
time_t timer,
void * timer_args)
{
struct timespec timeout;
int finalize = 0;
int rc;
ActionRequest action;
ActionRequest trequest(ActionListener::ACTION_TIMER,timer_args);
timeout.tv_sec = time(NULL) + timer;
timeout.tv_nsec = 0;
//Action Loop, end when a finalize action is triggered to this manager
while (finalize == 0)
{
lock();
while ( actions.empty() == true )
{
if ( timer != 0 )
{
rc = pthread_cond_timedwait(&cond,&mutex, &timeout);
if ( rc == ETIMEDOUT )
actions.push(trequest);
}
else
pthread_cond_wait(&cond,&mutex);
}
action = actions.front();
actions.pop();
unlock();
listener->do_action(action.name,action.args);
if ( action.name == ActionListener::ACTION_TIMER )
{
timeout.tv_sec = time(NULL) + timer;
timeout.tv_nsec = 0;
}
else if ( action.name == ActionListener::ACTION_FINALIZE )
{
finalize = 1;
}
}
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */

91
src/common/Attribute.cc Normal file
View File

@ -0,0 +1,91 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 <string>
#include <sstream>
#include "Attribute.h"
string * VectorAttribute::marshall()
{
ostringstream os;
map<string,string>::iterator it;
string * rs;
if ( attribute_value.size() == 0 )
{
return 0;
}
it = attribute_value.begin();
os << it->first << "=" << it->second;
for (++it; it != attribute_value.end(); it++)
{
os << "," << it->first << "=" << it->second;
}
rs = new string;
*rs = os.str();
return rs;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void VectorAttribute::unmarshall(string& sattr)
{
size_t pos;
string tmp;
while ( (pos = sattr.find(',')) != string::npos )
{
sattr.replace(pos,1," ");
}
istringstream is(sattr);
while ( is >> tmp )
{
pos = tmp.find("=");
attribute_value.insert(make_pair(tmp.substr(0,pos),
tmp.substr(pos+1)));
}
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
string VectorAttribute::vector_value(const char *name) const
{
map<string,string>::const_iterator it;
it = attribute_value.find(name);
if ( it == attribute_value.end() )
{
return "";
}
else
{
return it->second;
}
};

14
src/common/SConstruct Normal file
View File

@ -0,0 +1,14 @@
# SConstruct for src/common
Import('env')
lib_name='nebula_common'
# Sources to generate the library
source_files=[
'ActionManager.cc',
'Attribute.cc'
]
# Build library
env.StaticLibrary(lib_name, source_files)

168
src/dm/DispatchManager.cc Normal file
View File

@ -0,0 +1,168 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 "DispatchManager.h"
#include "Nebula.h"
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
extern "C" void * dm_action_loop(void *arg)
{
DispatchManager * dm;
if ( arg == 0 )
{
return 0;
}
dm = static_cast<DispatchManager *>(arg);
Nebula::log("DiM",Log::INFO,"Dispatch Manager started.");
dm->am.loop(0,0);
Nebula::log("DiM",Log::INFO,"Dispatch Manager stopped.");
return 0;
}
/* -------------------------------------------------------------------------- */
int DispatchManager::start()
{
int rc;
pthread_attr_t pattr;
pthread_attr_init (&pattr);
pthread_attr_setdetachstate (&pattr, PTHREAD_CREATE_JOINABLE);
Nebula::log("DiM",Log::INFO,"Starting Dispatch Manager...");
rc = pthread_create(&dm_thread,&pattr,dm_action_loop,(void *) this);
return rc;
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void DispatchManager::trigger(Actions action, int _vid)
{
int * vid;
string aname;
vid = new int(_vid);
switch (action)
{
case SUSPEND_SUCCESS:
aname = "SUSPEND_SUCCESS";
break;
case SUSPEND_FAILURE:
aname = "SUSPEND_FAILURE";
break;
case STOP_SUCCESS:
aname = "STOP_SUCCESS";
break;
case STOP_FAILURE:
aname = "STOP_FAILURE";
break;
case MIGRATE_FAILURE:
aname = "MIGRATE_FAILURE";
break;
case DONE:
aname = "DONE";
break;
case FAILED:
aname = "FAILED";
break;
case FINALIZE:
aname = ACTION_FINALIZE;
break;
default:
delete vid;
return;
}
am.trigger(aname,vid);
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void DispatchManager::do_action(const string &action, void * arg)
{
int vid;
ostringstream oss;
if (arg == 0)
{
return;
}
vid = *(static_cast<int *>(arg));
delete static_cast<int *>(arg);
if (action == "SUSPEND_SUCCESS")
{
suspend_success_action(vid);
}
else if (action == "SUSPEND_FAILURE")
{
suspend_failure_action(vid);
}
else if (action == "STOP_SUCCESS")
{
stop_success_action(vid);
}
else if (action == "STOP_FAILURE")
{
stop_failure_action(vid);
}
else if (action == "MIGRATE_FAILURE")
{
migrate_failure_action(vid);
}
else if (action == "DONE")
{
done_action(vid);
}
else if (action == "FAILED")
{
failed_action(vid);
}
else if (action == ACTION_FINALIZE)
{
Nebula::log("DiM",Log::INFO,"Stopping Dispatch Manager...");
}
else
{
ostringstream oss;
oss << "Unknown action name: " << action;
Nebula::log("DiM", Log::ERROR, oss);
}
}

View File

@ -0,0 +1,566 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 "DispatchManager.h"
#include "Nebula.h"
void DispatchManager::host_add_vm(VirtualMachine *vm)
{
int cpu, memory, disk;
int hid;
Host * host;
if ( vm->hasHistory() == true )
{
hid=vm->get_hid();
host=hpool->get(hid, true);
if ( host != 0 )
{
vm->get_requirements(cpu, memory, disk);
host->add_vm(cpu, memory, disk);
hpool->update(host);
host->unlock();
}
}
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void DispatchManager::host_del_vm(VirtualMachine *vm)
{
int cpu, memory, disk;
int hid;
Host * host;
if ( vm->hasHistory() == true )
{
hid=vm->get_hid();
host=hpool->get(hid, true);
if (host != 0)
{
vm->get_requirements(cpu, memory, disk);
host->del_vm(cpu, memory, disk);
hpool->update(host);
host->unlock();
}
}
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int DispatchManager::allocate (
int uid,
const string& stemplate,
int * oid)
{
Nebula::log("DiM",Log::DEBUG,"Allocating a new VM");
return vmpool->allocate(uid,stemplate,oid);
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int DispatchManager::deploy (
VirtualMachine * vm)
{
ostringstream oss;
int vid;
if ( vm == 0 )
{
return -1;
}
vid = vm->get_oid();
oss << "Deploying VM " << vid;
Nebula::log("DiM",Log::DEBUG,oss);
if ( vm->get_state() == VirtualMachine::PENDING )
{
Nebula& nd = Nebula::instance();
LifeCycleManager * lcm = nd.get_lcm();
vm->set_state(VirtualMachine::ACTIVE);
vmpool->update(vm);
host_add_vm(vm);
vm->log("DiM", Log::INFO, "New VM state is ACTIVE.");
lcm->trigger(LifeCycleManager::DEPLOY,vid);
}
else
{
goto error;
}
vm->unlock();
return 0;
error:
oss.str("");
oss << "Could not deploy VM " << vid << ", wrong state.";
Nebula::log("DiM",Log::ERROR,oss);
vm->unlock();
return -1;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int DispatchManager::migrate(
VirtualMachine * vm)
{
ostringstream oss;
int vid;
if ( vm == 0 )
{
return -1;
}
vid = vm->get_oid();
oss << "Migrating VM " << vid;
Nebula::log("DiM",Log::DEBUG,oss);
if (vm->get_state() == VirtualMachine::ACTIVE &&
vm->get_lcm_state() == VirtualMachine::RUNNING )
{
Nebula& nd = Nebula::instance();
LifeCycleManager * lcm = nd.get_lcm();
lcm->trigger(LifeCycleManager::MIGRATE,vid);
}
else
{
goto error;
}
vm->unlock();
return 0;
error:
oss.str("");
oss << "Could not migrate VM " << vid << ", wrong state.";
Nebula::log("DiM",Log::ERROR,oss);
vm->unlock();
return -1;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int DispatchManager::live_migrate(
VirtualMachine * vm)
{
ostringstream oss;
int vid;
if ( vm == 0 )
{
return -1;
}
vid = vm->get_oid();
oss << "Live-migrating VM " << vid;
Nebula::log("DiM",Log::DEBUG,oss);
if (vm->get_state() == VirtualMachine::ACTIVE &&
vm->get_lcm_state() == VirtualMachine::RUNNING )
{
Nebula& nd = Nebula::instance();
LifeCycleManager * lcm = nd.get_lcm();
lcm->trigger(LifeCycleManager::LIVE_MIGRATE,vid);
}
else
{
goto error;
}
vm->unlock();
return 0;
error:
oss.str("");
oss << "Could not live-migrate VM " << vid << ", wrong state.";
Nebula::log("DiM",Log::ERROR,oss);
vm->unlock();
return -1;
}
/* ************************************************************************** */
/* ************************************************************************** */
int DispatchManager::shutdown (
int vid)
{
ostringstream oss;
VirtualMachine * vm;
vm = vmpool->get(vid,true);
if ( vm == 0 )
{
return -1;
}
oss << "Shutting down VM " << vid;
Nebula::log("DiM",Log::DEBUG,oss);
if (vm->get_state() == VirtualMachine::ACTIVE &&
vm->get_lcm_state() == VirtualMachine::RUNNING )
{
Nebula& nd = Nebula::instance();
LifeCycleManager * lcm = nd.get_lcm();
host_del_vm(vm);
lcm->trigger(LifeCycleManager::SHUTDOWN,vid);
}
else
{
goto error;
}
vm->unlock();
return 0;
error:
oss.str("");
oss << "Could not shutdown VM " << vid << ", wrong state.";
Nebula::log("DiM",Log::ERROR,oss);
vm->unlock();
return -2;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int DispatchManager::hold(
int vid)
{
VirtualMachine * vm;
ostringstream oss;
vm = vmpool->get(vid,true);
if ( vm == 0 )
{
return -1;
}
oss << "Holding VM " << vid;
Nebula::log("DiM",Log::DEBUG,oss);
if (vm->get_state() == VirtualMachine::PENDING)
{
vm->set_state(VirtualMachine::HOLD);
vmpool->update(vm);
vm->log("DiM", Log::INFO, "New VM state is HOLD.");
}
else
{
goto error;
}
vm->unlock();
return 0;
error:
oss.str("");
oss << "Could not hold VM " << vid << ", wrong state.";
Nebula::log("DiM",Log::ERROR,oss);
vm->unlock();
return -2;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int DispatchManager::release(
int vid)
{
VirtualMachine * vm;
ostringstream oss;
vm = vmpool->get(vid,true);
if ( vm == 0 )
{
return -1;
}
oss << "Realising VM " << vid;
Nebula::log("DiM",Log::DEBUG,oss);
if (vm->get_state() == VirtualMachine::HOLD)
{
vm->set_state(VirtualMachine::PENDING);
vmpool->update(vm);
vm->log("DiM", Log::INFO, "New VM state is PENDING.");
}
else
{
goto error;
}
vm->unlock();
return 0;
error:
oss.str("");
oss << "Could not release VM " << vid << ", wrong state.";
Nebula::log("DiM",Log::ERROR,oss);
vm->unlock();
return -2;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int DispatchManager::stop(
int vid)
{
VirtualMachine * vm;
ostringstream oss;
vm = vmpool->get(vid,true);
if ( vm == 0 )
{
return -1;
}
oss << "Stopping VM " << vid;
Nebula::log("DiM",Log::DEBUG,oss);
if (vm->get_state() == VirtualMachine::ACTIVE &&
vm->get_lcm_state() == VirtualMachine::RUNNING )
{
Nebula& nd = Nebula::instance();
LifeCycleManager * lcm = nd.get_lcm();
host_del_vm(vm);
lcm->trigger(LifeCycleManager::STOP,vid);
}
else
{
goto error;
}
vm->unlock();
return 0;
error:
oss.str("");
oss << "Could not stop VM " << vid << ", wrong state.";
Nebula::log("DiM",Log::ERROR,oss);
vm->unlock();
return -2;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int DispatchManager::suspend(
int vid)
{
VirtualMachine * vm;
ostringstream oss;
vm = vmpool->get(vid,true);
if ( vm == 0 )
{
return -1;
}
oss << "Suspending VM " << vid;
Nebula::log("DiM",Log::DEBUG,oss);
if (vm->get_state() == VirtualMachine::ACTIVE &&
vm->get_lcm_state() == VirtualMachine::RUNNING )
{
Nebula& nd = Nebula::instance();
LifeCycleManager * lcm = nd.get_lcm();
host_del_vm(vm);
lcm->trigger(LifeCycleManager::SUSPEND,vid);
}
else
{
goto error;
}
vm->unlock();
return 0;
error:
oss.str("");
oss << "Could not suspend VM " << vid << ", wrong state.";
Nebula::log("DiM",Log::ERROR,oss);
vm->unlock();
return -2;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int DispatchManager::resume(
int vid)
{
VirtualMachine * vm;
ostringstream oss;
vm = vmpool->get(vid,true);
if ( vm == 0 )
{
return -1;
}
oss << "Resuming VM " << vid;
Nebula::log("DiM",Log::DEBUG,oss);
if (vm->get_state() == VirtualMachine::STOPPED )
{
vm->set_state(VirtualMachine::PENDING);
vmpool->update(vm);
vm->log("DiM", Log::INFO, "New VM state is PENDING.");
}
else if (vm->get_state() == VirtualMachine::SUSPENDED)
{
Nebula& nd = Nebula::instance();
LifeCycleManager * lcm = nd.get_lcm();
vm->set_state(VirtualMachine::ACTIVE);
vmpool->update(vm);
host_add_vm(vm);
vm->log("DiM", Log::INFO, "New VM state is ACTIVE.");
lcm->trigger(LifeCycleManager::RESTORE,vid);
}
else
{
goto error;
}
vm->unlock();
return 0;
error:
oss.str("");
oss << "Could not resume VM " << vid << ", wrong state.";
Nebula::log("DiM",Log::ERROR,oss);
vm->unlock();
return -2;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int DispatchManager::finalize(
int vid)
{
VirtualMachine * vm;
ostringstream oss;
vm = vmpool->get(vid,true);
if ( vm == 0 )
{
return -1;
}
if (vm->get_state() == VirtualMachine::FAILED )
{
oss << "Finalizing VM " << vid;
Nebula::log("DiM",Log::DEBUG,oss);
vm->set_state(VirtualMachine::DONE);
vmpool->update(vm);
vm->log("DiM", Log::INFO, "New VM state is DONE.");
vmpool->remove(vm);
return 0;
}
oss.str("");
oss << "Could not finalize VM " << vid << ", wrong state.";
Nebula::log("DiM",Log::ERROR,oss);
vm->unlock();
return -2;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */

View File

@ -0,0 +1,223 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 "DispatchManager.h"
#include "Nebula.h"
void DispatchManager::suspend_success_action(int vid)
{
VirtualMachine * vm;
vm = vmpool->get(vid,true);
if ( vm == 0 )
{
return;
}
if (vm->get_state() == VirtualMachine::ACTIVE )
{
vm->set_state(VirtualMachine::SUSPENDED);
vm->set_state(VirtualMachine::LCM_INIT);
vmpool->update(vm);
//TODO: Update suspended time
vm->log("DiM", Log::INFO, "New VM state is SUSPENDED");
}
else
{
goto error;
}
vm->unlock();
return;
error:
ostringstream oss;
oss << "suspend_success action received but VM " << vid
<< " not in ACTIVE state";
Nebula::log("DiM",Log::ERROR,oss);
vm->unlock();
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void DispatchManager::suspend_failure_action(int vid)
{
failed_action(vid);
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void DispatchManager::stop_success_action(int vid)
{
VirtualMachine * vm;
vm = vmpool->get(vid,true);
if ( vm == 0 )
{
return;
}
if (vm->get_state() == VirtualMachine::ACTIVE )
{
vm->set_state(VirtualMachine::STOPPED);
vm->set_state(VirtualMachine::LCM_INIT);
vm->set_etime(time(0));
vmpool->update(vm);
vmpool->update_history(vm);
vm->log("DiM", Log::INFO, "New VM state is STOPPED");
}
else
{
goto error;
}
vm->unlock();
return;
error:
ostringstream oss;
oss << "stop_success action received but VM " << vid
<< " not in ACTIVE state";
Nebula::log("DiM",Log::ERROR,oss);
vm->unlock();
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void DispatchManager::stop_failure_action(int vid)
{
failed_action(vid);
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void DispatchManager::migrate_failure_action(int vid)
{
failed_action(vid);
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void DispatchManager::done_action(int vid)
{
VirtualMachine * vm;
vm = vmpool->get(vid,true);
if ( vm == 0 )
{
return;
}
if (vm->get_state() == VirtualMachine::ACTIVE )
{
time_t the_time = time(0);
vm->set_state(VirtualMachine::DONE);
vm->set_state(VirtualMachine::LCM_INIT);
vm->set_etime(the_time);
vm->set_exit_time(the_time);
vmpool->update(vm);
vmpool->update_history(vm);
vm->log("DiM", Log::INFO, "New VM state is DONE");
vmpool->remove(vm);
}
else
{
goto error;
}
return;
error:
ostringstream oss;
oss << "done action received but VM " << vid << " not in ACTIVE state";
Nebula::log("DiM",Log::ERROR,oss);
vm->unlock();
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void DispatchManager::failed_action(int vid)
{
VirtualMachine * vm;
time_t the_time;
vm = vmpool->get(vid,true);
if ( vm == 0 )
{
return;
}
the_time = time(0);
vm->set_state(VirtualMachine::LCM_INIT);
vm->set_state(VirtualMachine::FAILED);
vm->set_etime(the_time);
vm->set_exit_time(the_time);
host_del_vm(vm);
vmpool->update(vm);
vmpool->update_history(vm);
vm->log("DiM", Log::INFO, "New VM state is FAILED");
vm->unlock();
return;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */

15
src/dm/SConstruct Normal file
View File

@ -0,0 +1,15 @@
# SConstruct for src/vm
Import('env')
lib_name='nebula_dm'
# Sources to generate the library
source_files=[
'DispatchManager.cc',
'DispatchManagerActions.cc',
'DispatchManagerStates.cc',
]
# Build library
env.StaticLibrary(lib_name, source_files)

413
src/host/Host.cc Normal file
View File

@ -0,0 +1,413 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 <limits.h>
#include <string.h>
#include <iostream>
#include <sstream>
#include "Host.h"
extern "C"
{
#include "host_parser.h"
}
/* ************************************************************************** */
/* Host :: Constructor/Destructor */
/* ************************************************************************** */
Host::Host(
int id,
string _hostname,
string _im_mad_name,
string _vmm_mad_name,
string _tm_mad_name,
bool _managed):
PoolObjectSQL(id),
hostname(_hostname),
state(INIT),
im_mad_name(_im_mad_name),
vmm_mad_name(_vmm_mad_name),
tm_mad_name(_tm_mad_name),
last_monitored(time(0)),
managed(_managed),
host_template(id),
host_share(id){};
Host::~Host(){};
/* ************************************************************************** */
/* Host :: Database Access Functions */
/* ************************************************************************** */
const char * Host::table = "hostpool";
const char * Host::db_names = "(hid,host_name,state,im_mad,vm_mad,"
"tm_mad,last_mon_time,managed)";
const char * Host::db_bootstrap = "CREATE TABLE hostpool ("
"hid INTEGER PRIMARY KEY,host_name TEXT,state INTEGER,"
"im_mad TEXT,vm_mad TEXT,tm_mad TEXT,last_mon_time INTEGER,"
"managed INTEGER)";
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int Host::unmarshall(int num, char **names, char ** values)
{
if ((values[HID] == 0) ||
(values[HOST_NAME] == 0) ||
(values[STATE] == 0) ||
(values[IM_MAD] == 0) ||
(values[VM_MAD] == 0) ||
(values[TM_MAD] == 0) ||
(values[LAST_MON_TIME] == 0) ||
(values[MANAGED] == 0) ||
(num != LIMIT ))
{
return -1;
}
oid = atoi(values[HID]);
hostname = values[HOST_NAME];
state = static_cast<HostState>(atoi(values[STATE]));
im_mad_name = values[IM_MAD];
vmm_mad_name = values[VM_MAD];
tm_mad_name = values[TM_MAD];
last_monitored = static_cast<time_t>(atoi(values[LAST_MON_TIME]));
managed = atoi(values[MANAGED]) == 1?true:false;
host_template.id = oid;
host_share.hsid = oid;
return 0;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
extern "C" int host_select_cb (
void * _host,
int num,
char ** values,
char ** names)
{
Host * host;
host = static_cast<Host *>(_host);
if (host == 0)
{
return -1;
}
return host->unmarshall(num,names,values);
};
/* -------------------------------------------------------------------------- */
int Host::select(SqliteDB *db)
{
ostringstream oss;
int rc;
int boid;
oss << "SELECT * FROM " << table << " WHERE hid = " << oid;
boid = oid;
oid = -1;
rc = db->exec(oss, host_select_cb, (void *) this);
if ((rc != 0) || (oid != boid ))
{
return -1;
}
// Get the template
rc = host_template.select(db);
if ( rc != 0 )
{
return -1;
}
// Select the host shares from the DB
rc = host_share.select(db);
if ( rc != 0 )
{
return rc;
}
return 0;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int Host::insert(SqliteDB *db)
{
int rc;
map<int,HostShare *>::iterator iter;
// Set up the template ID, to insert it
if ( host_template.id == -1 )
{
host_template.id = oid;
}
// Set up the share ID, to insert it
if ( host_share.hsid == -1 )
{
host_share.hsid = oid;
}
//Insert the Host and its template
rc = update(db);
if ( rc != 0 )
{
return rc;
}
return 0;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int Host::update(SqliteDB *db)
{
ostringstream oss;
int rc;
int managed_i = managed?1:0;
//Update template.
rc = host_template.update(db);
if ( rc != 0 )
{
return rc;
}
// Let's get the HostShares before the host
rc = host_share.update(db);
if ( rc != 0 )
{
return rc;
}
// Construct the SQL statement to Insert or Replace (effectively, update)
oss << "INSERT OR REPLACE INTO " << table << " "<< db_names <<" VALUES ("<<
oid << "," <<
"'" << hostname << "'," <<
state << "," <<
"'" << im_mad_name << "'," <<
"'" << vmm_mad_name << "'," <<
"'" << tm_mad_name << "'," <<
last_monitored << "," <<
managed_i << ")";
rc = db->exec(oss);
return rc;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int Host::drop(SqliteDB * db)
{
ostringstream oss;
map<int,HostShare *>::iterator iter;
// First, drop the template
host_template.drop(db);
// Second, drop the host_shares
host_share.drop(db);
// Third, drop the host itself
oss << "DELETE FROM " << table << " WHERE hid=" << oid;
return db->exec(oss);
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int Host::update_info(string &parse_str)
{
char * error_msg;
int rc;
// If we have a default
rc = host_template.parse(parse_str, &error_msg);
if ( rc != 0 )
{
/*
Nebula::log("ONE", Log::ERROR, error_msg);
*/
free(error_msg);
return -1;
}
get_template_attribute("TOTALCPU",host_share.max_cpu);
get_template_attribute("TOTALMEMORY",host_share.max_mem);
return 0;
}
/* ************************************************************************** */
/* Host :: Misc */
/* ************************************************************************** */
ostream& operator<<(ostream& os, Host& host)
{
os << "HID = " << host.oid << endl;
os << "HOSTNAME = " << host.hostname << endl;
os << "IM MAD = " << host.im_mad_name << endl;
os << "VMM MAD = " << host.vmm_mad_name << endl;
os << "TM MAD = " << host.tm_mad_name << endl;
os << "MANAGED = " << host.managed << endl;
os << "ATTRIBUTES" << endl << host.host_template<< endl;
os << "HOST SHARES" << endl << host.host_share <<endl;
return os;
};
/* ************************************************************************** */
/* Host :: Parse functions to compute rank and evaluate requirements */
/* ************************************************************************** */
pthread_mutex_t Host::lex_mutex = PTHREAD_MUTEX_INITIALIZER;
extern "C"
{
int host_requirements_parse(Host * host, bool& result, char ** errmsg);
int host_rank_parse(Host * host, int& result, char ** errmsg);
void host_lex_destroy();
YY_BUFFER_STATE host__scan_string(const char * str);
void host__delete_buffer(YY_BUFFER_STATE);
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int Host::match(const string& requirements, bool& result, char **errmsg)
{
YY_BUFFER_STATE str_buffer;
const char * str;
int rc;
pthread_mutex_lock(&lex_mutex);
*errmsg = 0;
str = requirements.c_str();
str_buffer = host__scan_string(str);
if (str_buffer == 0)
{
goto error_yy;
}
rc = host_requirements_parse(this,result,errmsg);
host__delete_buffer(str_buffer);
host_lex_destroy();
pthread_mutex_unlock(&lex_mutex);
return rc;
error_yy:
*errmsg=strdup("Error setting scan buffer");
pthread_mutex_unlock(&lex_mutex);
return -1;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int Host::rank(const string& rank, int& result, char **errmsg)
{
YY_BUFFER_STATE str_buffer;
const char * str;
int rc;
pthread_mutex_lock(&lex_mutex);
*errmsg = 0;
str = rank.c_str();
str_buffer = host__scan_string(str);
if (str_buffer == 0)
{
goto error_yy;
}
rc = host_rank_parse(this,result,errmsg);
host__delete_buffer(str_buffer);
host_lex_destroy();
pthread_mutex_unlock(&lex_mutex);
return rc;
error_yy:
*errmsg=strdup("Error setting scan buffer");
pthread_mutex_unlock(&lex_mutex);
return -1;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */

103
src/host/HostPool.cc Normal file
View File

@ -0,0 +1,103 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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. */
/* -------------------------------------------------------------------------- */
/* ************************************************************************** */
/* Host Pool */
/* ************************************************************************** */
#include "HostPool.h"
#include "Nebula.h"
int HostPool::allocate (
int * oid,
string hostname,
string im_mad_name,
string vmm_mad_name,
string tm_mad_name,
bool managed)
{
Host * host;
// Build a new Host object
host = new Host(-1,
hostname,
im_mad_name,
vmm_mad_name,
tm_mad_name,
managed);
// Insert the Object in the pool
*oid = PoolSQL::allocate(host);
return 0;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
extern "C"
{
static int discover_cb (
void * _discovered_hosts,
int num,
char ** values,
char ** names)
{
map<int, string> * discovered_hosts;
string im_mad(values[1]);
int hid;
discovered_hosts = static_cast<map<int, string> *>(_discovered_hosts);
if ( (discovered_hosts == 0) || (num<=0) || (values[0] == 0) )
{
return -1;
}
hid = atoi(values[0]);
im_mad = values[1];
discovered_hosts->insert(make_pair(hid,im_mad));
return 0;
};
}
/* -------------------------------------------------------------------------- */
int HostPool::discover(map<int, string> * discovered_hosts)
{
ostringstream sql;
int rc;
lock();
sql << "SELECT hid, im_mad FROM "
<< Host::table << " ORDER BY last_mon_time LIMIT 10";
rc = db->exec(sql,discover_cb,(void *) discovered_hosts);
unlock();
return rc;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */

213
src/host/HostShare.cc Normal file
View File

@ -0,0 +1,213 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 <limits.h>
#include <string.h>
#include <iostream>
#include <sstream>
#include "HostShare.h"
/* ************************************************************************** */
/* HostShare :: Constructor/Destructor */
/* ************************************************************************** */
HostShare::HostShare(
int _hsid,
int _max_disk,
int _max_mem,
int _max_cpu):
ObjectSQL(),
hsid(_hsid),
endpoint(""),
disk_usage(0),
mem_usage(0),
cpu_usage(0),
max_disk(_max_disk),
max_mem(_max_mem),
max_cpu(_max_cpu),
running_vms(0)
{
}
/* ************************************************************************** */
/* HostShare :: Database Access Functions */
/* ************************************************************************** */
const char * HostShare::table = "hostshares";
const char * HostShare::db_names = "(hsid,endpoint,disk_usage,"
"mem_usage,cpu_usage,max_disk,max_mem,max_cpu,running_vms)";
const char * HostShare::db_bootstrap = "CREATE TABLE hostshares ("
"hsid INTEGER PRIMARY KEY, endpoint TEXT,"
"disk_usage INTEGER,mem_usage INTEGER,cpu_usage INTEGER,"
"max_disk INTEGER,max_mem INTEGER,max_cpu INTEGER,running_vms INTEGER)";
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int HostShare::unmarshall(int num, char **names, char ** values)
{
if ((values[HSID] == 0) ||
(values[ENDPOINT] == 0) ||
(values[DISK_USAGE] == 0) ||
(values[MEM_USAGE] == 0) ||
(values[CPU_USAGE] == 0) ||
(values[MAX_DISK] == 0) ||
(values[MAX_MEMORY] == 0) ||
(values[MAX_CPU] == 0) ||
(values[RUNNING_VMS] == 0) ||
(num != LIMIT ))
{
return -1;
}
hsid = atoi(values[HSID]);
endpoint = values[ENDPOINT];
disk_usage = atoi(values[DISK_USAGE]);
mem_usage = atoi(values[MEM_USAGE]);
cpu_usage = atoi(values[CPU_USAGE]);
max_disk = atoi(values[MAX_DISK]);
max_mem = atoi(values[MAX_MEMORY]);
max_cpu = atoi(values[MAX_CPU]);
running_vms= atoi(values[RUNNING_VMS]);
return 0;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
extern "C" int host_share_select_cb (
void * _hs,
int num,
char ** values,
char ** names)
{
HostShare * hs;
hs = static_cast<HostShare *>(_hs);
if (hs == 0)
{
return -1;
}
return hs->unmarshall(num,names,values);
};
/* -------------------------------------------------------------------------- */
int HostShare::select(SqliteDB * db)
{
ostringstream oss;
int rc;
int bhsid;
oss << "SELECT * FROM " << table << " WHERE hsid = " << hsid;
bhsid = hsid;
hsid = -1;
rc = db->exec(oss,host_share_select_cb,(void *) this);
if (hsid != bhsid )
{
rc = -1;
}
return rc;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int HostShare::insert(SqliteDB * db)
{
int rc;
//Insert the HostShare
rc = update(db);
if ( rc != 0 )
{
return rc;
}
return 0;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int HostShare::update(SqliteDB * db)
{
ostringstream oss;
int rc;
oss << "INSERT OR REPLACE INTO " << table << " "<< db_names <<" VALUES ("<<
hsid << "," <<
"'" << endpoint << "'," <<
disk_usage << "," <<
mem_usage << "," <<
cpu_usage << "," <<
max_disk << "," <<
max_mem << "," <<
max_cpu << "," <<
running_vms << ")";
rc = db->exec(oss);
return rc;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int HostShare::drop(SqliteDB * db)
{
ostringstream oss;
// Drop the HostShare itself
oss << "DELETE FROM " << table << " WHERE hsid=" << hsid;
return db->exec(oss);
}
/* ************************************************************************** */
/* HostShare :: Misc */
/* ************************************************************************** */
ostream& operator<<(ostream& os, HostShare& hs)
{
os << "\tHSID = " << hs.hsid << endl;
os << "\tENDPOINT = " << hs.endpoint<< endl;
os << "\tMAX_CPU = " << hs.max_cpu << endl;
os << "\tMAX_MEMORY = " << hs.max_mem << endl;
os << "\tMAX_DISK = " << hs.max_disk<< endl;
os << "\tCPU_USAGE = " << hs.cpu_usage << endl;
os << "\tMEMORY_USAGE = " << hs.mem_usage << endl;
os << "\tDISK_USAGE = " << hs.disk_usage<< endl;
os << "\tRUNNING_VMS = " << hs.running_vms<< endl;
return os;
};

24
src/host/HostTemplate.cc Normal file
View File

@ -0,0 +1,24 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 "HostTemplate.h"
const char * HostTemplate::table = "host_attributes";
const char * HostTemplate::db_bootstrap = "CREATE TABLE host_attributes"
" (id INTEGER, name TEXT, type INTEGER, value TEXT, PRIMARY KEY(id,name))";

37
src/host/SConstruct Normal file
View File

@ -0,0 +1,37 @@
# SConstruct for src/vm
Import('env')
lib_name='nebula_host'
if env['parsers']=='yes':
# LEX
parser=env.Lex(
source='host_parser.l'
)
env.NoClean(parser)
# BISON
parser=env.Bison(
source='host_requirements.y'
)
env.NoClean(parser)
parser=env.Bison(
source='host_rank.y'
)
env.NoClean(parser)
# Sources to generate the library
source_files=[
'Host.cc',
'HostShare.cc',
'HostPool.cc',
'HostTemplate.cc',
'host_parser.c',
'host_requirements.cc',
'host_rank.cc',
]
# Build library
env.StaticLibrary(lib_name, source_files)

1799
src/host/host_parser.c Normal file

File diff suppressed because it is too large Load Diff

296
src/host/host_parser.h Normal file
View File

@ -0,0 +1,296 @@
#ifndef host_HEADER_H
#define host_HEADER_H 1
#define host_IN_HEADER 1
#line 6 "host_parser.h"
#line 8 "host_parser.h"
#define YY_INT_ALIGNED short int
/* A lexical scanner generated by flex */
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 34
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
/* First, we deal with platform-specific or compiler-specific issues. */
/* begin standard C headers. */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
/* end standard C headers. */
/* flex integer type definitions */
#ifndef FLEXINT_H
#define FLEXINT_H
/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
* if you want the limit (max/min) macros for int types.
*/
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
#endif
#include <inttypes.h>
typedef int8_t flex_int8_t;
typedef uint8_t flex_uint8_t;
typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
#endif /* ! C99 */
/* Limits of integral types. */
#ifndef INT8_MIN
#define INT8_MIN (-128)
#endif
#ifndef INT16_MIN
#define INT16_MIN (-32767-1)
#endif
#ifndef INT32_MIN
#define INT32_MIN (-2147483647-1)
#endif
#ifndef INT8_MAX
#define INT8_MAX (127)
#endif
#ifndef INT16_MAX
#define INT16_MAX (32767)
#endif
#ifndef INT32_MAX
#define INT32_MAX (2147483647)
#endif
#ifndef UINT8_MAX
#define UINT8_MAX (255U)
#endif
#ifndef UINT16_MAX
#define UINT16_MAX (65535U)
#endif
#ifndef UINT32_MAX
#define UINT32_MAX (4294967295U)
#endif
#endif /* ! FLEXINT_H */
#ifdef __cplusplus
/* The "const" storage-class-modifier is valid. */
#define YY_USE_CONST
#else /* ! __cplusplus */
/* C99 requires __STDC__ to be defined as 1. */
#if defined (__STDC__)
#define YY_USE_CONST
#endif /* defined (__STDC__) */
#endif /* ! __cplusplus */
#ifdef YY_USE_CONST
#define yyconst const
#else
#define yyconst
#endif
/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
#define YY_BUF_SIZE 16384
#endif
#ifndef YY_TYPEDEF_YY_BUFFER_STATE
#define YY_TYPEDEF_YY_BUFFER_STATE
typedef struct yy_buffer_state *YY_BUFFER_STATE;
#endif
extern int host_leng;
extern FILE *host_in, *host_out;
/* The following is because we cannot portably get our hands on size_t
* (without autoconf's help, which isn't available because we want
* flex-generated scanners to compile on their own).
* Given that the standard has decreed that size_t exists since 1989,
* I guess we can afford to depend on it. Manoj.
*/
#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef size_t yy_size_t;
#endif
#ifndef YY_STRUCT_YY_BUFFER_STATE
#define YY_STRUCT_YY_BUFFER_STATE
struct yy_buffer_state
{
FILE *yy_input_file;
char *yy_ch_buf; /* input buffer */
char *yy_buf_pos; /* current position in input buffer */
/* Size of input buffer in bytes, not including room for EOB
* characters.
*/
yy_size_t yy_buf_size;
/* Number of characters read into yy_ch_buf, not including EOB
* characters.
*/
int yy_n_chars;
/* Whether we "own" the buffer - i.e., we know we created it,
* and can realloc() it to grow it, and should free() it to
* delete it.
*/
int yy_is_our_buffer;
/* Whether this is an "interactive" input source; if so, and
* if we're using stdio for input, then we want to use getc()
* instead of fread(), to make sure we stop fetching input after
* each newline.
*/
int yy_is_interactive;
/* Whether we're considered to be at the beginning of a line.
* If so, '^' rules will be active on the next match, otherwise
* not.
*/
int yy_at_bol;
int yy_bs_lineno; /**< The line count. */
int yy_bs_column; /**< The column count. */
/* Whether to try to fill the input buffer when we reach the
* end of it.
*/
int yy_fill_buffer;
int yy_buffer_status;
};
#endif /* !YY_STRUCT_YY_BUFFER_STATE */
void host_restart (FILE *input_file );
void host__switch_to_buffer (YY_BUFFER_STATE new_buffer );
YY_BUFFER_STATE host__create_buffer (FILE *file,int size );
void host__delete_buffer (YY_BUFFER_STATE b );
void host__flush_buffer (YY_BUFFER_STATE b );
void host_push_buffer_state (YY_BUFFER_STATE new_buffer );
void host_pop_buffer_state (void );
YY_BUFFER_STATE host__scan_buffer (char *base,yy_size_t size );
YY_BUFFER_STATE host__scan_string (yyconst char *yy_str );
YY_BUFFER_STATE host__scan_bytes (yyconst char *bytes,int len );
void *host_alloc (yy_size_t );
void *host_realloc (void *,yy_size_t );
void host_free (void * );
/* Begin user sect3 */
extern int host_lineno;
extern char *host_text;
#define yytext_ptr host_text
#ifdef YY_HEADER_EXPORT_START_CONDITIONS
#define INITIAL 0
#endif
#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
* down here because we want the user's section 1 to have been scanned first.
* The user has a chance to override it with an option.
*/
#include <unistd.h>
#endif
#ifndef YY_EXTRA_TYPE
#define YY_EXTRA_TYPE void *
#endif
/* Macros after this point can all be overridden by user definitions in
* section 1.
*/
#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
extern "C" int host_wrap (void );
#else
extern int host_wrap (void );
#endif
#endif
#ifndef yytext_ptr
static void yy_flex_strncpy (char *,yyconst char *,int );
#endif
#ifdef YY_NEED_STRLEN
static int yy_flex_strlen (yyconst char * );
#endif
#ifndef YY_NO_INPUT
#endif
/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#define YY_READ_BUF_SIZE 8192
#endif
/* Number of entries by which start-condition stack grows. */
#ifndef YY_START_STACK_INCR
#define YY_START_STACK_INCR 25
#endif
/* Default declaration of generated scanner - a define so the user can
* easily add parameters.
*/
#ifndef YY_DECL
#define YY_DECL_IS_OURS 1
extern int host_lex (void);
#define YY_DECL int host_lex (void)
#endif /* !YY_DECL */
/* yy_get_previous_state - get the state just before the EOB char was reached */
#undef YY_NEW_FILE
#undef YY_FLUSH_BUFFER
#undef yy_set_bol
#undef yy_new_buffer
#undef yy_set_interactive
#undef YY_DO_BEFORE_ACTION
#ifdef YY_DECL_IS_OURS
#undef YY_DECL_IS_OURS
#undef YY_DECL
#endif
#line 64 "host_parser.l"
#line 295 "host_parser.h"
#undef host_IN_HEADER
#endif /* host_HEADER_H */

69
src/host/host_parser.l Normal file
View File

@ -0,0 +1,69 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include "host_requirements.h"
#include "host_rank.h"
#define YY_DECL int host_lex (YYSTYPE *lvalp, YYLTYPE *llocp)
#define YY_USER_ACTION llocp->first_line = yylineno; \
llocp->first_column = llocp->last_column; \
llocp->last_column += yyleng;
%}
%option nounput
%option prefix="host_"
%option outfile="host_parser.c"
%option header-file="host_parser.h"
%option yylineno
%%
/* --- Tokens --- */
[!&|=><()\*\+/\^-] { return *yytext;}
/* --- Strings, also quoted form --- */
[A-Za-z][0-9A-Za-z_]* { lvalp->val_str = strdup(yytext);
return STRING;}
\"\" { lvalp->val_str = NULL;
return STRING;}
\"[^\"]*\" { lvalp->val_str = strdup(yytext+1);
lvalp->val_str[yyleng-2] = '\0';
return STRING;}
/* --- Integers --- */
-?[0-9]+ { lvalp->val_int = atoi(yytext);
return INTEGER;}
/* --- blanks --- */
[[:blank:]]*
%%
int host_wrap()
{
return 1;
}

1713
src/host/host_rank.cc Normal file

File diff suppressed because it is too large Load Diff

83
src/host/host_rank.h Normal file
View File

@ -0,0 +1,83 @@
/* A Bison parser, made by GNU Bison 2.3. */
/* Skeleton interface for Bison's Yacc-like parsers in C
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
/* As a special exception, you may create a larger work that contains
part or all of the Bison parser skeleton and distribute that work
under terms of your choice, so long as that work isn't itself a
parser generator using the skeleton or a modified version thereof
as a parser skeleton. Alternatively, if you modify or redistribute
the parser skeleton itself, you may (at your option) remove this
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
/* Put the tokens into the symbol table, so that GDB and other debuggers
know about them. */
enum yytokentype {
INTEGER = 258,
STRING = 259
};
#endif
/* Tokens. */
#define INTEGER 258
#define STRING 259
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
#line 55 "host_rank.y"
{
char * val_str;
int val_int;
}
/* Line 1489 of yacc.c. */
#line 62 "host_rank.hh"
YYSTYPE;
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1
#endif
#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
typedef struct YYLTYPE
{
int first_line;
int first_column;
int last_line;
int last_column;
} YYLTYPE;
# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
# define YYLTYPE_IS_DECLARED 1
# define YYLTYPE_IS_TRIVIAL 1
#endif

117
src/host/host_rank.y Normal file
View File

@ -0,0 +1,117 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <ctype.h>
#include <string.h>
#include <fnmatch.h>
#include "host_rank.h"
#include "Host.h"
#define YYERROR_VERBOSE
#define host_rank_lex host_lex
extern "C"
{
void host_rank_error(
YYLTYPE * llocp,
Host * host,
int& result,
char ** error_msg,
const char * str);
int host_rank_lex (YYSTYPE *lvalp, YYLTYPE *llocp);
int host_rank_parse(Host * host, int& result, char ** errmsg);
}
%}
%parse-param {Host * host}
%parse-param {int& result}
%parse-param {char ** error_msg}
%union {
char * val_str;
int val_int;
};
%defines
%locations
%pure_parser
%name-prefix = "host_rank_"
%output = "host_rank.cc"
%left '+' '-'
%left '*' '/'
%token <val_int> INTEGER
%token <val_str> STRING
%type <val_int> stmt expr
%%
stmt: expr { result=$1;}
| { result=0;} /* TRUE BY DEFAULT, ON EMPTY STRINGS */
;
expr: STRING { int val;
host->get_template_attribute($1,val);
$$ = val;
free($1);}
| INTEGER { $$ = $1;}
| expr '+' expr { $$ = $1 + $3;}
| expr '-' expr { $$ = $1 - $3;}
| expr '*' expr { $$ = $1 * $3;}
| expr '/' expr { $$ = $1 / $3;}
| '-' expr { $$ = - $2;}
| '(' expr ')' { $$ = $2;}
;
%%
extern "C" void host_rank_error(
YYLTYPE * llocp,
Host * host,
int& result,
char ** error_msg,
const char * str)
{
int length;
length = strlen(str)+ 64;
*error_msg = (char *) malloc(sizeof(char)*length);
if (*error_msg != 0)
{
snprintf(*error_msg,
length,
"%s at line %i, columns %i:%i",
str,
llocp->first_line,
llocp->first_column,
llocp->last_column);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,83 @@
/* A Bison parser, made by GNU Bison 2.3. */
/* Skeleton interface for Bison's Yacc-like parsers in C
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
/* As a special exception, you may create a larger work that contains
part or all of the Bison parser skeleton and distribute that work
under terms of your choice, so long as that work isn't itself a
parser generator using the skeleton or a modified version thereof
as a parser skeleton. Alternatively, if you modify or redistribute
the parser skeleton itself, you may (at your option) remove this
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
/* Put the tokens into the symbol table, so that GDB and other debuggers
know about them. */
enum yytokentype {
INTEGER = 258,
STRING = 259
};
#endif
/* Tokens. */
#define INTEGER 258
#define STRING 259
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
#line 55 "host_requirements.y"
{
char * val_str;
int val_int;
}
/* Line 1489 of yacc.c. */
#line 62 "host_requirements.hh"
YYSTYPE;
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1
#endif
#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
typedef struct YYLTYPE
{
int first_line;
int first_column;
int last_line;
int last_column;
} YYLTYPE;
# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
# define YYLTYPE_IS_DECLARED 1
# define YYLTYPE_IS_TRIVIAL 1
#endif

View File

@ -0,0 +1,174 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <ctype.h>
#include <string.h>
#include <fnmatch.h>
#include "host_requirements.h"
#include "Host.h"
#define YYERROR_VERBOSE
#define host_requirements_lex host_lex
extern "C"
{
void host_requirements_error(
YYLTYPE * llocp,
Host * host,
bool& result,
char ** error_msg,
const char * str);
int host_requirements_lex (YYSTYPE *lvalp, YYLTYPE *llocp);
int host_requirements_parse(Host * host, bool& result, char ** errmsg);
}
%}
%parse-param {Host * host}
%parse-param {bool& result}
%parse-param {char ** error_msg}
%union {
char * val_str;
int val_int;
};
%defines
%locations
%pure_parser
%name-prefix = "host_requirements_"
%output = "host_requirements.cc"
%left '!' '&' '|'
%token <val_int> INTEGER
%token <val_str> STRING
%type <val_int> stmt expr
%%
stmt: expr { result=$1; }
| { result=true; } /* TRUE BY DEFAULT, ON EMPTY STRINGS */
;
expr: STRING '=' INTEGER {
int val;
host->get_template_attribute($1,val);
$$ = val == $3;
free($1);}
| STRING '!' '=' INTEGER {
int val;
host->get_template_attribute($1,val);
$$ = val != $4;
free($1);}
| STRING '>' INTEGER {
int val;
host->get_template_attribute($1,val);
$$ = val > $3;
free($1);}
| STRING '<' INTEGER {
int val;
host->get_template_attribute($1,val);
$$ = val < $3;
free($1);}
| STRING '=' STRING {
string val;
host->get_template_attribute($1,val);
if (val == "")
{
$$ = false;
}
else
{
$$ = fnmatch($3, val.c_str(), 0) == 0;
}
free($1);
free($3);}
| STRING '!''=' STRING {
string val;
host->get_template_attribute($1,val);
if (val == "")
{
$$ = false;
}
else
{
$$ = fnmatch($4, val.c_str(), 0) != 0;
}
free($1);
free($4);}
| expr '&' expr { $$ = $1 && $3; }
| expr '|' expr { $$ = $1 || $3; }
| '!' expr { $$ = ! $2; }
| '(' expr ')' { $$ = $2; }
;
%%
extern "C" void host_requirements_error(
YYLTYPE * llocp,
Host * host,
bool& result,
char ** error_msg,
const char * str)
{
int length;
length = strlen(str)+ 64;
*error_msg = (char *) malloc(sizeof(char)*length);
if (*error_msg != 0)
{
snprintf(*error_msg,
length,
"%s at line %i, columns %i:%i",
str,
llocp->first_line,
llocp->first_column,
llocp->last_column);
}
}

View File

@ -0,0 +1,215 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 "InformationManager.h"
#include "Nebula.h"
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
extern "C" void * im_action_loop(void *arg)
{
InformationManager * im;
if ( arg == 0 )
{
return 0;
}
Nebula::log("InM",Log::INFO,"Information Manager started.");
im = static_cast<InformationManager *>(arg);
im->am.loop(im->timer_period,0);
Nebula::log("InM",Log::INFO,"Information Manager stopped.");
return 0;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void InformationManager::load_mads(int uid)
{
InformationManagerDriver * im_mad;
unsigned int i;
ostringstream oss;
const VectorAttribute * vattr;
int rc;
Nebula::log("InM",Log::INFO,"Loading Information Manager drivers.");
for(i=0;i<mad_conf.size();i++)
{
vattr = static_cast<const VectorAttribute *>(mad_conf[i]);
oss.str("");
oss << "\tLoading driver: " << vattr->vector_value("NAME");
Nebula::log("InM",Log::INFO,oss);
im_mad = new InformationManagerDriver(0,vattr->value(),false,hpool);
rc = add(im_mad);
if ( rc == 0 )
{
oss.str("");
oss << "\tDriver " << vattr->vector_value("NAME") << " loaded";
Nebula::log("InM",Log::INFO,oss);
}
}
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int InformationManager::start()
{
int rc;
pthread_attr_t pattr;
rc = MadManager::start();
if ( rc != 0 )
{
return -1;
}
Nebula::log("InM",Log::INFO,"Starting Information Manager...");
pthread_attr_init (&pattr);
pthread_attr_setdetachstate (&pattr, PTHREAD_CREATE_JOINABLE);
rc = pthread_create(&im_thread,&pattr,im_action_loop,(void *) this);
return rc;
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void InformationManager::do_action(const string &action, void * arg)
{
if (action == ACTION_TIMER)
{
timer_action();
}
else if (action == ACTION_FINALIZE)
{
Nebula::log("InM",Log::INFO,"Stopping Information Manager...");
MadManager::stop();
}
else
{
ostringstream oss;
oss << "Unknown action name: " << action;
Nebula::log("InM", Log::ERROR, oss);
}
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void InformationManager::timer_action()
{
static int mark = 0;
int rc;
time_t thetime;
ostringstream oss;
map<int, string> discovered_hosts;
map<int, string>::iterator it;
const InformationManagerDriver * imd;
Host * host;
istringstream iss;
mark = mark + timer_period;
if ( mark >= 600 )
{
Nebula::log("InM",Log::INFO,"--Mark--");
mark = 0;
}
rc = hpool->discover(&discovered_hosts);
if ((rc != 0) || (discovered_hosts.empty() == true))
{
return;
}
thetime = time(0);
for(it=discovered_hosts.begin();it!=discovered_hosts.end();it++)
{
host = hpool->get(it->first,true);
if (host == 0)
{
continue;
}
Host::HostState state = host->get_state();
// TODO: Set apropriate threshold to timeout monitoring
if (( state == Host::MONITORING) &&
(thetime - host->get_last_monitored() >= 600))
{
host->set_state(Host::INIT);
hpool->update(host);
}
if ((state != Host::MONITORING) && (state != Host::DISABLED) &&
(thetime - host->get_last_monitored() >= monitor_period))
{
oss.str("");
oss << "Monitoring host " << host->get_hostname()
<< " (" << it->first << ")";
Nebula::log("InM",Log::INFO,oss);
imd = get(it->second);
if (imd == 0)
{
oss.str("");
oss << "Could not find information driver " << it->second;
Nebula::log("InM",Log::ERROR,oss);
host->set_state(Host::ERROR);
}
else
{
imd->monitor(it->first,host->get_hostname());
host->set_state(Host::MONITORING);
}
hpool->update(host);
}
host->unlock();
}
}

View File

@ -0,0 +1,179 @@
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2008, Distributed Systems Architecture Group, Universidad */
/* Complutense de Madrid (dsa-research.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 "InformationManagerDriver.h"
#include "Nebula.h"
#include <sstream>
/* ************************************************************************** */
/* Driver ASCII Protocol Implementation */
/* ************************************************************************** */
void InformationManagerDriver::monitor (
const int oid,
const string& host) const
{
ostringstream os;
os << "MONITOR " << oid << " " << host << endl;
write(os);
};
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void InformationManagerDriver::protocol(
string& message)
{
istringstream is(message);
//stores the action name
string action;
//stores the action result
string result;
//stores the action id of the asociated HOSR
int id;
ostringstream ess;
string hinfo;
Host * host;
// Parse the driver message
if ( is.good() )
{
is >> action >> ws;
}
else
{
goto error_parse;
}
if ( is.good() )
{
is >> result >> ws;
}
else
{
goto error_parse;
}
if ( is.good() )
{
is >> id >> ws;
}
else
{
goto error_parse;
}
// -----------------------
// Protocol implementation
// -----------------------
if ( action == "MONITOR" )
{
host = hpool->get(id,true);
if ( host == 0 )
{
goto error_host;
}
if (result == "SUCCESS")
{
size_t pos;
int rc;
ostringstream oss;
getline (is,hinfo);
for (pos=hinfo.find(',');pos!=string::npos;pos=hinfo.find(','))
{
hinfo.replace(pos,1,"\n");
}
hinfo += "\n";
oss << "Host " << id << " successfully monitored."; //, info: "<< hinfo;
Nebula::log("InM",Log::DEBUG,oss);
rc = host->update_info(hinfo);
if (rc != 0)
{
goto error_parse_info;
}
}
else
{
goto error_driver_info;
}
host->touch(true);
hpool->update(host);
host->unlock();
}
return;
error_driver_info:
ess << "Error monitoring host " << id << " : " << is.str();
Nebula::log("InM", Log::ERROR, ess);
goto error_common_info;
error_parse_info:
ess << "Error parsing host information: " << hinfo;
Nebula::log("InM",Log::ERROR,ess);
error_common_info:
host->touch(false);
hpool->update(host);
host->unlock();
return;
error_host:
ess << "Could not get host " << id;
Nebula::log("InM",Log::ERROR,ess);
return;
error_parse:
ess << "Error while parsing driver message: " << message;
Nebula::log("InM",Log::ERROR,ess);
return;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void InformationManagerDriver::recover()
{
Nebula::log("InM", Log::ERROR, "Information driver crashed, recovering...");
}

17
src/im/SConstruct Executable file
View File

@ -0,0 +1,17 @@
# SConstruct for src/im
Import('env')
lib_name='nebula_im'
# Sources to generate the library
source_files=[
'InformationManager.cc',
'InformationManagerDriver.cc'
]
test_names=[]
# Build library
env.StaticLibrary(lib_name, source_files)

3
src/im_mad/xen/architecture.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/sh
echo ARCH=`uname -m`

9
src/im_mad/xen/cpu.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/sh
if [ -f /proc/cpuinfo ]; then
echo -n "MODELNAME=\""
grep -m 1 "model name" /proc/cpuinfo | cut -d: -f2 | sed -e 's/^ *//' | sed -e 's/$/"/'
fi

5
src/im_mad/xen/name.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
echo HOSTNAME=`uname -n`

19
src/im_mad/xen/one_im_ssh Executable file
View File

@ -0,0 +1,19 @@
#!/bin/bash
if [ -z "${ONE_LOCATION}" ]; then
echo "Please, set ONE_LOCATION variable."
exit -1
fi
. $ONE_LOCATION/libexec/madcommon.sh
# Export the vmm_mad specific rc
export_rc_vars $ONE_LOCATION/etc/mad/im_sshrc
# Go to ONE_LOCATION
cd $ONE_LOCATION
# Execute the actual MAD
execute_mad $*

Some files were not shown because too many files have changed in this diff Show More