mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-23 22:50:09 +03:00
feature #4217: Generic class for supported actions, used in
VirtualRouter, VirtualMachine & MarketPlace. Simplify enum names for MarketPlaceApps
This commit is contained in:
parent
539342fd3a
commit
c53425c0ed
@ -18,8 +18,11 @@
|
||||
#define MARKETPLACE_H_
|
||||
|
||||
#include "PoolSQL.h"
|
||||
#include "ActionSet.h"
|
||||
#include "ObjectCollection.h"
|
||||
#include "MarketPlaceTemplate.h"
|
||||
#include "MarketPlaceApp.h"
|
||||
#include "ActionSet.h"
|
||||
|
||||
/**
|
||||
* The MarketPlace class. It represents an abstract container for OpenNebula
|
||||
@ -86,6 +89,16 @@ public:
|
||||
*/
|
||||
void update_monitor(const Template& data);
|
||||
|
||||
/**
|
||||
* Check if action is supported for the apps
|
||||
* @param action
|
||||
* @return true if it is supported
|
||||
*/
|
||||
bool is_action_supported(MarketPlaceApp::Action action) const
|
||||
{
|
||||
return supported_actions.is_set(action);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
friend class MarketPlacePool;
|
||||
@ -93,7 +106,6 @@ private:
|
||||
// *************************************************************************
|
||||
// MarketPlace Attributes
|
||||
// *************************************************************************
|
||||
|
||||
/**
|
||||
* Name of the marketplace driver used to import apps
|
||||
*/
|
||||
@ -114,6 +126,11 @@ private:
|
||||
*/
|
||||
long long used_mb;
|
||||
|
||||
/**
|
||||
* Supported actions on MarketPlaceApps
|
||||
*/
|
||||
ActionSet<MarketPlaceApp::Action> supported_actions;
|
||||
|
||||
// *************************************************************************
|
||||
// Constructor
|
||||
// *************************************************************************
|
||||
|
@ -28,10 +28,44 @@
|
||||
class MarketPlaceApp : public PoolObjectSQL
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* MarketPlaceApp actions
|
||||
*/
|
||||
enum Action
|
||||
{
|
||||
NONE = 0,
|
||||
CREATE = 1,
|
||||
DELETE = 2,
|
||||
MONITOR = 3
|
||||
};
|
||||
|
||||
static int action_from_str(string& st, Action& action)
|
||||
{
|
||||
if (st == "create")
|
||||
{
|
||||
action = CREATE;
|
||||
}
|
||||
else if (st == "delete")
|
||||
{
|
||||
action = DELETE;
|
||||
}
|
||||
else if (st == "monitor")
|
||||
{
|
||||
action = MONITOR;
|
||||
}
|
||||
else
|
||||
{
|
||||
action = NONE;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* MarketPlaceApp states
|
||||
*/
|
||||
enum MarketPlaceAppState
|
||||
enum State
|
||||
{
|
||||
INIT = 0, /** < Initialization state */
|
||||
READY = 1, /** < Ready to use */
|
||||
@ -45,7 +79,7 @@ public:
|
||||
* @param state The state
|
||||
* @return the string representation
|
||||
*/
|
||||
static string state_to_str(MarketPlaceAppState state)
|
||||
static string state_to_str(State state)
|
||||
{
|
||||
switch(state)
|
||||
{
|
||||
@ -61,7 +95,7 @@ public:
|
||||
/**
|
||||
* MarketPlaceApp container types
|
||||
*/
|
||||
enum MarketPlaceAppType
|
||||
enum Type
|
||||
{
|
||||
UNKNOWN = 0, /** < Unknown types */
|
||||
IMAGE = 1, /** < Image MarketPlace App*/
|
||||
@ -74,7 +108,7 @@ public:
|
||||
* @param ob the type
|
||||
* @return the string
|
||||
*/
|
||||
static string type_to_str(MarketPlaceAppType ob)
|
||||
static string type_to_str(Type ob)
|
||||
{
|
||||
switch (ob)
|
||||
{
|
||||
@ -91,7 +125,7 @@ public:
|
||||
* @param str_type string representing the type
|
||||
* @return the MarketPlaceType
|
||||
*/
|
||||
static MarketPlaceAppType str_to_type(string& str_type);
|
||||
static Type str_to_type(string& str_type);
|
||||
|
||||
/**
|
||||
* Function to print the MarketPlaceApp object into a string in XML format
|
||||
@ -161,7 +195,7 @@ public:
|
||||
* Returns the marketplace app type
|
||||
* @return marketplace app type
|
||||
*/
|
||||
MarketPlaceAppType get_type() const
|
||||
Type get_type() const
|
||||
{
|
||||
return type;
|
||||
};
|
||||
@ -196,7 +230,7 @@ public:
|
||||
}
|
||||
|
||||
|
||||
MarketPlaceAppState get_state() const
|
||||
State get_state() const
|
||||
{
|
||||
return state;
|
||||
}
|
||||
@ -204,7 +238,7 @@ public:
|
||||
//--------------------------------------------------------------------------
|
||||
// Set Marketplace app attributes
|
||||
//--------------------------------------------------------------------------
|
||||
void set_state(MarketPlaceAppState _state)
|
||||
void set_state(State _state)
|
||||
{
|
||||
state = _state;
|
||||
};
|
||||
@ -294,12 +328,12 @@ private:
|
||||
/**
|
||||
* Marketplace App state
|
||||
*/
|
||||
MarketPlaceAppState state;
|
||||
State state;
|
||||
|
||||
/**
|
||||
* The marketplace type
|
||||
*/
|
||||
MarketPlaceAppType type;
|
||||
Type type;
|
||||
|
||||
/**
|
||||
* Origin of this App
|
||||
|
@ -408,38 +408,35 @@ public:
|
||||
nebula_configuration->get(name, value);
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets a configuration attribute for oned, bool version
|
||||
*/
|
||||
void get_configuration_attribute(
|
||||
const char * name,
|
||||
bool& value) const
|
||||
{
|
||||
string _name(name);
|
||||
|
||||
nebula_configuration->Template::get(_name, value);
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets a DS configuration attribute
|
||||
*/
|
||||
int get_ds_conf_attribute(
|
||||
const std::string& ds_name,
|
||||
const VectorAttribute* &value) const;
|
||||
const VectorAttribute* &value) const
|
||||
{
|
||||
return get_conf_attribute("DS_MAD_CONF", ds_name, value);
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets a TM configuration attribute
|
||||
*/
|
||||
int get_tm_conf_attribute(
|
||||
const string& tm_name,
|
||||
const VectorAttribute* &value) const;
|
||||
const VectorAttribute* &value) const
|
||||
{
|
||||
return get_conf_attribute("TM_MAD_CONF", tm_name, value);
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets a Market configuration attribute
|
||||
*/
|
||||
int get_market_conf_attribute(
|
||||
const string& tm_name,
|
||||
const VectorAttribute* &value) const;
|
||||
const string& mk_name,
|
||||
const VectorAttribute* &value) const
|
||||
{
|
||||
return get_conf_attribute("MARKET_MAD_CONF", mk_name, value);
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets an XML document with all of the configuration attributes
|
||||
|
@ -1326,12 +1326,6 @@ public:
|
||||
*/
|
||||
bool is_vrouter();
|
||||
|
||||
/**
|
||||
* Checks if the given action is supported for Virtual Router VMs
|
||||
* @param action VM action to check
|
||||
* @return true if the action is supported for Virtual Router VMs
|
||||
*/
|
||||
static bool is_vrouter_action_supported(History::VMAction action);
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// Context related functions
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <sstream>
|
||||
|
||||
#include "Mad.h"
|
||||
#include "ActionSet.h"
|
||||
#include "VirtualMachinePool.h"
|
||||
#include "History.h"
|
||||
|
||||
@ -91,7 +92,7 @@ public:
|
||||
*/
|
||||
bool is_imported_action_supported(History::VMAction action) const
|
||||
{
|
||||
return (imported_vm_actions && (1 << static_cast<int>(action))) != 0;
|
||||
return imported_actions.is_set(action);
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -101,13 +102,10 @@ protected:
|
||||
* @param name of config attribute
|
||||
* @param value of the attribute
|
||||
*/
|
||||
void get_default(
|
||||
const char * name,
|
||||
string& value) const
|
||||
template<typename T>
|
||||
void get_default(const string& name, T& value) const
|
||||
{
|
||||
string sn = name;
|
||||
|
||||
driver_conf.get(sn,value);
|
||||
driver_conf.get(name, value);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -117,26 +115,25 @@ protected:
|
||||
* @param vname of the attribute
|
||||
* @param value of the attribute
|
||||
*/
|
||||
void get_default(
|
||||
const char * name,
|
||||
const char * vname,
|
||||
string& value) const;
|
||||
template<typename T>
|
||||
int get_default(const char* name, const char* vname, T& value) const
|
||||
{
|
||||
const VectorAttribute * vattr = driver_conf.get(name);
|
||||
|
||||
/**
|
||||
* Gets a configuration attr from driver configuration file (vector
|
||||
* version)
|
||||
* @param name of config vector attribute for the domain
|
||||
* @param vname of the attribute
|
||||
* @param value of the attribute
|
||||
*
|
||||
* @return true if the attribute was found
|
||||
*/
|
||||
bool get_default(
|
||||
const char * name,
|
||||
const char * vname,
|
||||
bool& value) const;
|
||||
if (vattr != 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return vattr->vector_value(vname, value);
|
||||
}
|
||||
|
||||
private:
|
||||
friend class VirtualMachineManager;
|
||||
|
||||
static const string imported_actions_default;
|
||||
static const string imported_actions_default_public;
|
||||
|
||||
/**
|
||||
* Configuration file for the driver
|
||||
*/
|
||||
@ -146,15 +143,13 @@ private:
|
||||
* List of available actions for imported VMs. Each bit is an action
|
||||
* as defined in History.h, 1=supported and 0=not supported
|
||||
*/
|
||||
long long imported_vm_actions;
|
||||
ActionSet<History::VMAction> imported_actions;
|
||||
|
||||
/**
|
||||
* Pointer to the Virtual Machine Pool, to access VMs
|
||||
*/
|
||||
VirtualMachinePool * vmpool;
|
||||
|
||||
friend class VirtualMachineManager;
|
||||
|
||||
/**
|
||||
* Sends a deploy request to the MAD: "DEPLOY ID XML_DRV_MSG"
|
||||
* @param oid the virtual machine id.
|
||||
@ -287,7 +282,6 @@ private:
|
||||
const string& drv_msg) const
|
||||
{
|
||||
write_drv("POLL", oid, drv_msg);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -22,6 +22,8 @@
|
||||
#include "ObjectCollection.h"
|
||||
#include "VirtualMachineTemplate.h"
|
||||
#include "AuthRequest.h"
|
||||
#include "History.h"
|
||||
#include "ActionSet.h"
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
@ -131,18 +133,27 @@ public:
|
||||
AuthRequest& ar,
|
||||
Template *tmpl);
|
||||
|
||||
/**
|
||||
* Checks if the given action is supported for Virtual Router VMs
|
||||
* @param action VM action to check
|
||||
* @return true if the action is supported for Virtual Router VMs
|
||||
*/
|
||||
static bool is_action_supported(History::VMAction action)
|
||||
{
|
||||
return SUPPORTED_ACTIONS.is_set(action);
|
||||
}
|
||||
|
||||
private:
|
||||
// -------------------------------------------------------------------------
|
||||
// Friends
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
friend class VirtualRouterPool;
|
||||
|
||||
static const ActionSet<History::VMAction> SUPPORTED_ACTIONS;
|
||||
|
||||
// *************************************************************************
|
||||
// Attributes
|
||||
// *************************************************************************
|
||||
|
||||
ObjectCollection vms;
|
||||
|
||||
// *************************************************************************
|
||||
|
@ -1078,19 +1078,26 @@ DS_MAD_CONF = [
|
||||
# name : name of the market driver
|
||||
# required_attrs : comma separated list of required attributes in the Market
|
||||
# template
|
||||
# app_actions: List of actions allowed for a MarketPlaceApp
|
||||
# - monitor The apps of the marketplace will be monitored
|
||||
# - import, the app into an OpenNebula datastore
|
||||
# - delete, the app from the marketplace
|
||||
#*******************************************************************************
|
||||
|
||||
MARKET_MAD_CONF = [
|
||||
NAME = "one",
|
||||
REQUIRED_ATTRS = ""
|
||||
REQUIRED_ATTRS = "",
|
||||
APP_ACTIONS = "import, monitor"
|
||||
]
|
||||
|
||||
MARKET_MAD_CONF = [
|
||||
NAME = "http",
|
||||
REQUIRED_ATTRS = "BASE_URL,PUBLIC_DIR"
|
||||
APP_ACTIONS = "import, delete, monitor",
|
||||
]
|
||||
|
||||
MARKET_MAD_CONF = [
|
||||
NAME = "s3",
|
||||
REQUIRED_ATTRS = "ACCESS_KEY_ID,SECRET_ACCESS_KEY,REGION,BUCKET"
|
||||
REQUIRED_ATTRS = "ACCESS_KEY_ID,SECRET_ACCESS_KEY,REGION,BUCKET",
|
||||
APP_ACTIONS = "import, delete, monitor"
|
||||
]
|
||||
|
@ -290,6 +290,31 @@ std::string& MarketPlace::to_xml(std::string& xml) const
|
||||
/* --------------------------------------------------------------------------- */
|
||||
/* --------------------------------------------------------------------------- */
|
||||
|
||||
static void set_supported_actions(ActionSet<MarketPlaceApp::Action>& as,
|
||||
const string& astr)
|
||||
{
|
||||
std::vector<std::string> actions;
|
||||
std::vector<std::string>::iterator vit;
|
||||
|
||||
std::string action;
|
||||
MarketPlaceApp::Action id;
|
||||
|
||||
actions = one_util::split(astr, ',');
|
||||
|
||||
for (vit = actions.begin() ; vit != actions.end() ; ++vit)
|
||||
{
|
||||
action = one_util::trim(*vit);
|
||||
|
||||
if ( MarketPlaceApp::action_from_str(action, id) != 0 )
|
||||
{
|
||||
NebulaLog::log("VMM", Log::ERROR, "Wrong action: " + action);
|
||||
continue;
|
||||
}
|
||||
|
||||
as.set(id);
|
||||
}
|
||||
}
|
||||
|
||||
int MarketPlace::from_xml(const std::string &xml_str)
|
||||
{
|
||||
int rc = 0;
|
||||
@ -346,6 +371,29 @@ int MarketPlace::from_xml(const std::string &xml_str)
|
||||
return -1;
|
||||
}
|
||||
|
||||
// ------ SUPPORTED ACTIONS, regenerated from oned.conf ------
|
||||
const VectorAttribute* vatt;
|
||||
string actions;
|
||||
|
||||
if (Nebula::instance().get_market_conf_attribute(market_mad, vatt) == 0)
|
||||
{
|
||||
actions = vatt->vector_value("APP_ACTIONS");
|
||||
}
|
||||
|
||||
if (actions.empty())
|
||||
{
|
||||
if (market_mad == "http" || market_mad == "s3")
|
||||
{
|
||||
actions = "create, monitor, delete";
|
||||
}
|
||||
else if ( market_mad == "one" )
|
||||
{
|
||||
actions = "create, monitor";
|
||||
}
|
||||
}
|
||||
|
||||
set_supported_actions(supported_actions, actions);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -305,8 +305,8 @@ int MarketPlaceApp::from_xml(const std::string &xml_str)
|
||||
rc += xpath(market_name, "/MARKETPLACEAPP/MARKETPLACE", "not_found");
|
||||
rc += xpath(market_id, "/MARKETPLACEAPP/MARKETPLACE_ID", -1);
|
||||
|
||||
state = static_cast<MarketPlaceAppState>(istate);
|
||||
type = static_cast<MarketPlaceAppType>(itype);
|
||||
state = static_cast<State>(istate);
|
||||
type = static_cast<Type>(itype);
|
||||
|
||||
// ----- Permissions -----
|
||||
rc += perms_from_xml();
|
||||
@ -360,7 +360,7 @@ int MarketPlaceApp::post_update_template(string& error)
|
||||
/* --------------------------------------------------------------------------- */
|
||||
/* --------------------------------------------------------------------------- */
|
||||
|
||||
MarketPlaceApp::MarketPlaceAppType MarketPlaceApp::str_to_type(string& str_type)
|
||||
MarketPlaceApp::Type MarketPlaceApp::str_to_type(string& str_type)
|
||||
{
|
||||
one_util::toupper(str_type);
|
||||
|
||||
|
@ -263,10 +263,20 @@ void MarketPlaceManager::monitor_market(int mp_id)
|
||||
return;
|
||||
}
|
||||
|
||||
mp->to_xml(mp_data);
|
||||
|
||||
mp_name = mp->get_name();
|
||||
|
||||
if ( !mp->is_action_supported(MarketPlaceApp::MONITOR) )
|
||||
{
|
||||
NebulaLog::log("MKP", Log::DEBUG, "Monitoring disabled for market: " +
|
||||
mp_name);
|
||||
|
||||
mp->unlock();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
mp->to_xml(mp_data);
|
||||
|
||||
mp->unlock();
|
||||
|
||||
drv_msg = MarketPlaceManager::format_message("", mp_data, "");
|
||||
|
@ -61,7 +61,7 @@ int MarketPlaceManager::import_app(
|
||||
|
||||
app->to_xml(app_data);
|
||||
|
||||
MarketPlaceApp::MarketPlaceAppType type = app->get_type();
|
||||
MarketPlaceApp::Type type = app->get_type();
|
||||
|
||||
int app_id = app->get_oid();
|
||||
int origin_id = app->get_origin_id();
|
||||
@ -131,7 +131,7 @@ void MarketPlaceManager::release_app_resources(int appid)
|
||||
return;
|
||||
}
|
||||
|
||||
MarketPlaceApp::MarketPlaceAppType type = app->get_type();
|
||||
MarketPlaceApp::Type type = app->get_type();
|
||||
|
||||
int iid = app->get_origin_id();
|
||||
|
||||
@ -180,8 +180,8 @@ int MarketPlaceManager::delete_app(int appid, const std::string& market_data,
|
||||
|
||||
app->to_xml(app_data);
|
||||
|
||||
MarketPlaceApp::MarketPlaceAppType type = app->get_type();
|
||||
MarketPlaceApp::MarketPlaceAppState state = app->get_state();
|
||||
MarketPlaceApp::Type type = app->get_type();
|
||||
MarketPlaceApp::State state = app->get_state();
|
||||
|
||||
int market_id = app->get_market_id();
|
||||
|
||||
|
@ -1107,23 +1107,3 @@ int Nebula::get_conf_attribute(
|
||||
return -1;
|
||||
};
|
||||
|
||||
int Nebula::get_ds_conf_attribute(
|
||||
const std::string& name,
|
||||
const VectorAttribute* &value) const
|
||||
{
|
||||
return get_conf_attribute("DS_MAD_CONF", name, value);
|
||||
};
|
||||
|
||||
int Nebula::get_tm_conf_attribute(
|
||||
const std::string& name,
|
||||
const VectorAttribute* &value) const
|
||||
{
|
||||
return get_conf_attribute("TM_MAD_CONF", name, value);
|
||||
};
|
||||
|
||||
int Nebula::get_market_conf_attribute(
|
||||
const std::string& name,
|
||||
const VectorAttribute* &value) const
|
||||
{
|
||||
return get_conf_attribute("MARKET_MAD_CONF", name, value);
|
||||
};
|
||||
|
@ -912,6 +912,14 @@ int MarketPlaceAppAllocate::pool_allocate(
|
||||
std::string mp_name = mp->get_name();
|
||||
std::string mp_data;
|
||||
|
||||
if ( !mp->is_action_supported(MarketPlaceApp::CREATE) )
|
||||
{
|
||||
att.resp_msg = "Create disabled for market: " + mp_name;
|
||||
mp->unlock();
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
mp->to_xml(mp_data);
|
||||
|
||||
mp->unlock();
|
||||
|
@ -388,6 +388,14 @@ int MarketPlaceAppDelete::drop(int oid, PoolObjectSQL * object, string& emsg)
|
||||
std::string mp_name = mp->get_name();
|
||||
std::string mp_data;
|
||||
|
||||
if ( !mp->is_action_supported(MarketPlaceApp::DELETE) )
|
||||
{
|
||||
emsg = "Delete disabled for market: " + mp_name;
|
||||
mp->unlock();
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
mp->to_xml(mp_data);
|
||||
|
||||
mp->unlock();
|
||||
|
@ -544,7 +544,7 @@ void VirtualMachineAction::request_execute(xmlrpc_c::paramList const& paramList,
|
||||
return;
|
||||
}
|
||||
|
||||
if (vm->is_vrouter() && !vm->is_vrouter_action_supported(action))
|
||||
if (vm->is_vrouter() && !VirtualRouter::is_action_supported(action))
|
||||
{
|
||||
bool failure = true;
|
||||
|
||||
@ -1029,7 +1029,7 @@ void VirtualMachineMigrate::request_execute(xmlrpc_c::paramList const& paramList
|
||||
return;
|
||||
}
|
||||
|
||||
if (vm->is_vrouter() && !vm->is_vrouter_action_supported(action))
|
||||
if (vm->is_vrouter() && !VirtualRouter::is_action_supported(action))
|
||||
{
|
||||
att.resp_msg = "Migration is not supported for virtual router VMs";
|
||||
failure_response(ACTION, att);
|
||||
@ -1580,7 +1580,7 @@ void VirtualMachineAttach::request_execute(xmlrpc_c::paramList const& paramList,
|
||||
|
||||
volatile_disk = vm->volatile_disk_extended_info(&tmpl);
|
||||
|
||||
if (vm->is_vrouter() && !vm->is_vrouter_action_supported(History::DISK_ATTACH_ACTION))
|
||||
if (vm->is_vrouter() && !VirtualRouter::is_action_supported(History::DISK_ATTACH_ACTION))
|
||||
{
|
||||
att.resp_msg = "Action is not supported for virtual router VMs";
|
||||
failure_response(ACTION, att);
|
||||
@ -1663,7 +1663,7 @@ void VirtualMachineDetach::request_execute(xmlrpc_c::paramList const& paramList,
|
||||
return;
|
||||
}
|
||||
|
||||
if (vm->is_vrouter() && !vm->is_vrouter_action_supported(History::NIC_DETACH_ACTION))
|
||||
if (vm->is_vrouter() && !VirtualRouter::is_action_supported(History::NIC_DETACH_ACTION))
|
||||
{
|
||||
att.resp_msg = "Action is not supported for virtual router VMs";
|
||||
failure_response(ACTION, att);
|
||||
@ -2115,7 +2115,7 @@ void VirtualMachineAttachNic::request_execute(
|
||||
return;
|
||||
}
|
||||
|
||||
if (vm->is_vrouter() && !vm->is_vrouter_action_supported(History::NIC_ATTACH_ACTION))
|
||||
if (vm->is_vrouter() && !VirtualRouter::is_action_supported(History::NIC_ATTACH_ACTION))
|
||||
{
|
||||
att.resp_msg = "Action is not supported for virtual router VMs";
|
||||
failure_response(Request::ACTION, att);
|
||||
@ -2252,7 +2252,7 @@ void VirtualMachineDetachNic::request_execute(
|
||||
return;
|
||||
}
|
||||
|
||||
if (vm->is_vrouter() && !vm->is_vrouter_action_supported(History::NIC_DETACH_ACTION))
|
||||
if (vm->is_vrouter() && !VirtualRouter::is_action_supported(History::NIC_DETACH_ACTION))
|
||||
{
|
||||
att.resp_msg = "Action is not supported for virtual router VMs";
|
||||
failure_response(Request::ACTION, att);
|
||||
|
@ -3204,24 +3204,6 @@ bool VirtualMachine::is_vrouter()
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
bool VirtualMachine::is_vrouter_action_supported(History::VMAction action)
|
||||
{
|
||||
return (action == History::MIGRATE_ACTION ||
|
||||
action == History::LIVE_MIGRATE_ACTION ||
|
||||
action == History::HOLD_ACTION ||
|
||||
action == History::RELEASE_ACTION ||
|
||||
action == History::RESUME_ACTION ||
|
||||
action == History::BOOT_ACTION ||
|
||||
action == History::REBOOT_ACTION ||
|
||||
action == History::REBOOT_HARD_ACTION ||
|
||||
action == History::RESCHED_ACTION ||
|
||||
action == History::UNRESCHED_ACTION ||
|
||||
action == History::DISK_SNAPSHOT_CREATE_ACTION ||
|
||||
action == History::DISK_SNAPSHOT_DELETE_ACTION);
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int VirtualMachine::generate_context(string &files, int &disk_id,
|
||||
const string& token_password)
|
||||
|
@ -206,8 +206,8 @@ int LibVirtDriver::deployment_description_kvm(
|
||||
string hyperv_options = "";
|
||||
|
||||
vector<const VectorAttribute *> raw;
|
||||
string default_raw;
|
||||
string data;
|
||||
string default_raw = "";
|
||||
string data = "";
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
@ -928,7 +928,7 @@ int LibVirtDriver::deployment_description_kvm(
|
||||
{
|
||||
get_default("SPICE_OPTIONS", spice_options);
|
||||
|
||||
if ( spice_options != "" )
|
||||
if (spice_options.empty())
|
||||
{
|
||||
file << "\t\t" << spice_options << endl;
|
||||
}
|
||||
|
@ -22,19 +22,30 @@
|
||||
#include "NebulaUtil.h"
|
||||
#include <sstream>
|
||||
|
||||
|
||||
const string VirtualMachineManagerDriver::imported_actions_default =
|
||||
"shutdown, shutdown-hard, hold, release, suspend, resume, delete, reboot, "
|
||||
"reboot-hard, resched, unresched, disk-attach, disk-detach, nic-attach, "
|
||||
"nic-detach, snap-create, snap-delete";
|
||||
|
||||
const string VirtualMachineManagerDriver::imported_actions_default_public =
|
||||
"shutdown, shutdown-hard, hold, release, suspend, resume, delete, reboot, "
|
||||
"reboot-hard, resched, unresched, disk-attach, disk-detach, nic-attach, "
|
||||
"nic-detach, snap-create, snap-delete, poweroff, poweroff-hard";
|
||||
|
||||
VirtualMachineManagerDriver::VirtualMachineManagerDriver(
|
||||
int userid,
|
||||
const map<string,string>& attrs,
|
||||
bool sudo,
|
||||
VirtualMachinePool * pool):
|
||||
Mad(userid,attrs,sudo), driver_conf(true), imported_vm_actions(0),
|
||||
vmpool(pool)
|
||||
Mad(userid,attrs,sudo), driver_conf(true), vmpool(pool)
|
||||
{
|
||||
map<string,string>::const_iterator it;
|
||||
char * error_msg = 0;
|
||||
const char * cfile;
|
||||
string file;
|
||||
int rc;
|
||||
string action_defaults;
|
||||
|
||||
it = attrs.find("DEFAULT");
|
||||
|
||||
@ -78,26 +89,7 @@ VirtualMachineManagerDriver::VirtualMachineManagerDriver(
|
||||
|
||||
if (it != attrs.end())
|
||||
{
|
||||
vector<string> actions;
|
||||
vector<string>::iterator vit;
|
||||
|
||||
string action;
|
||||
History::VMAction id;
|
||||
|
||||
actions = one_util::split(it->second, ',');
|
||||
|
||||
for (vit = actions.begin() ; vit != actions.end() ; ++vit)
|
||||
{
|
||||
action = one_util::trim(*vit);
|
||||
|
||||
if ( History::action_from_str(action, id) != 0 )
|
||||
{
|
||||
NebulaLog::log("VMM", Log::ERROR, "Wrong action: " + action);
|
||||
continue;
|
||||
}
|
||||
|
||||
imported_vm_actions += 1 << static_cast<int>(id);
|
||||
}
|
||||
action_defaults = it->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -107,85 +99,39 @@ VirtualMachineManagerDriver::VirtualMachineManagerDriver(
|
||||
|
||||
if (it != attrs.end())
|
||||
{
|
||||
if ( it->second == "kvm" )
|
||||
if ( it->second == "kvm" || it->second == "xen3" ||
|
||||
it->second == "xen" || it->second == "vmware" )
|
||||
{
|
||||
imported_vm_actions = 132623768;
|
||||
action_defaults = imported_actions_default;
|
||||
}
|
||||
else if ( it->second == "xen3" )
|
||||
else if ( it->second == "sl" || it->second == "ec2" ||
|
||||
it->second == "az" || it->second == "vcenter" )
|
||||
{
|
||||
imported_vm_actions = 132623768;
|
||||
}
|
||||
else if ( it->second == "xen" )
|
||||
{
|
||||
imported_vm_actions = 132623768;
|
||||
}
|
||||
else if ( it->second == "vmware" )
|
||||
{
|
||||
imported_vm_actions = 132623768;
|
||||
}
|
||||
else if ( it->second == "vcenter" )
|
||||
{
|
||||
imported_vm_actions = 134196632;
|
||||
}
|
||||
else if ( it->second == "ec2" )
|
||||
{
|
||||
imported_vm_actions = 134196632;
|
||||
}
|
||||
else if ( it->second == "az" )
|
||||
{
|
||||
imported_vm_actions = 134196632;
|
||||
}
|
||||
else if ( it->second == "sl" )
|
||||
{
|
||||
imported_vm_actions = 134196632;
|
||||
action_defaults = imported_actions_default_public;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
vector<string> actions;
|
||||
vector<string>::iterator vit;
|
||||
|
||||
void VirtualMachineManagerDriver::get_default(
|
||||
const char * name,
|
||||
const char * vname,
|
||||
string& value) const
|
||||
{
|
||||
const VectorAttribute * vattr = driver_conf.get(name);
|
||||
string action;
|
||||
History::VMAction id;
|
||||
|
||||
if ( vattr == 0 )
|
||||
actions = one_util::split(action_defaults, ',');
|
||||
|
||||
for (vit = actions.begin() ; vit != actions.end() ; ++vit)
|
||||
{
|
||||
value.clear();
|
||||
action = one_util::trim(*vit);
|
||||
|
||||
if ( History::action_from_str(action, id) != 0 )
|
||||
{
|
||||
NebulaLog::log("VMM", Log::ERROR, "Wrong action: " + action);
|
||||
continue;
|
||||
}
|
||||
|
||||
imported_actions.set(id);
|
||||
}
|
||||
else
|
||||
{
|
||||
value = vattr->vector_value(vname);
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
bool VirtualMachineManagerDriver::get_default(
|
||||
const char * name,
|
||||
const char * vname,
|
||||
bool& value) const
|
||||
{
|
||||
string st;
|
||||
|
||||
get_default(name, vname, st);
|
||||
|
||||
if ( st == "" )
|
||||
{
|
||||
value = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
one_util::toupper(st);
|
||||
|
||||
value = ( st == "YES" );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* ************************************************************************** */
|
||||
|
@ -35,10 +35,10 @@ int XenDriver::deployment_description(
|
||||
|
||||
int num;
|
||||
|
||||
string credits;
|
||||
string cpu;
|
||||
string memory;
|
||||
string vcpu;
|
||||
string credits = "";
|
||||
string cpu = "";
|
||||
string memory = "";
|
||||
string vcpu = "";
|
||||
|
||||
float base_credit = 1.0;
|
||||
float cpu_units = 1.0;
|
||||
@ -102,8 +102,8 @@ int XenDriver::deployment_description(
|
||||
int localtime_found = -1;
|
||||
|
||||
vector<const VectorAttribute *> raw;
|
||||
string data;
|
||||
string default_raw;
|
||||
string data = "";
|
||||
string default_raw = "";
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
@ -624,17 +624,17 @@ int XenDriver::deployment_description(
|
||||
}
|
||||
}
|
||||
|
||||
if ( pae_found != 0 && get_default("FEATURES", "PAE", pae) )
|
||||
if ( pae_found != 0 && get_default("FEATURES", "PAE", pae) == 0 )
|
||||
{
|
||||
pae_found = 0;
|
||||
}
|
||||
|
||||
if ( acpi_found != 0 && get_default("FEATURES", "ACPI", acpi) )
|
||||
if ( acpi_found != 0 && get_default("FEATURES", "ACPI", acpi) == 0 )
|
||||
{
|
||||
acpi_found = 0;
|
||||
}
|
||||
|
||||
if ( apic_found != 0 && get_default("FEATURES", "APIC", apic) )
|
||||
if ( apic_found != 0 && get_default("FEATURES", "APIC", apic) == 0 )
|
||||
{
|
||||
apic_found = 0;
|
||||
}
|
||||
@ -653,22 +653,22 @@ int XenDriver::deployment_description(
|
||||
get_default("FEATURES", "LOCALTIME", localtime);
|
||||
}
|
||||
|
||||
if ( pae_found == 0)
|
||||
if ( pae_found == 0 )
|
||||
{
|
||||
file << "pae = " << on_off_string(pae) << endl;
|
||||
}
|
||||
|
||||
if ( acpi_found == 0)
|
||||
if ( acpi_found == 0 )
|
||||
{
|
||||
file << "acpi = " << on_off_string(acpi) << endl;
|
||||
}
|
||||
|
||||
if ( apic_found == 0)
|
||||
if ( apic_found == 0 )
|
||||
{
|
||||
file << "apic = " << on_off_string(apic) << endl;
|
||||
}
|
||||
|
||||
if ( device_model_found == 0)
|
||||
if ( device_model_found == 0 )
|
||||
{
|
||||
file << "device_model = '" << device_model << "'" << endl;
|
||||
}
|
||||
|
@ -17,6 +17,24 @@
|
||||
#include "VirtualRouter.h"
|
||||
#include "VirtualNetworkPool.h"
|
||||
#include "Nebula.h"
|
||||
#include "VirtualMachine.h"
|
||||
|
||||
static const History::VMAction action[12] = {
|
||||
History::MIGRATE_ACTION,
|
||||
History::LIVE_MIGRATE_ACTION,
|
||||
History::HOLD_ACTION,
|
||||
History::RELEASE_ACTION,
|
||||
History::RESUME_ACTION,
|
||||
History::BOOT_ACTION,
|
||||
History::REBOOT_ACTION,
|
||||
History::REBOOT_HARD_ACTION,
|
||||
History::RESCHED_ACTION,
|
||||
History::UNRESCHED_ACTION,
|
||||
History::DISK_SNAPSHOT_CREATE_ACTION,
|
||||
History::DISK_SNAPSHOT_DELETE_ACTION
|
||||
};
|
||||
|
||||
const ActionSet<History::VMAction> VirtualRouter::SUPPORTED_ACTIONS(action, 12);
|
||||
|
||||
/* ************************************************************************ */
|
||||
/* VirtualRouter :: Constructor/Destructor */
|
||||
@ -728,3 +746,4 @@ void VirtualRouter::set_auth_request(int uid,
|
||||
vnpool->authorize_nic(PoolObjectSQL::VROUTER, *nics_it, uid, &ar);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user