1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-02-27 13:57:23 +03:00

feature #3382: Add support for overwritting network context attributes in NIC and CONTEXT definition

This commit is contained in:
Ruben S. Montero 2015-04-28 16:24:40 +02:00
parent 5c0cd43d42
commit 0139ef44d1
2 changed files with 85 additions and 63 deletions

View File

@ -1771,6 +1771,33 @@ private:
*/
int parse_defaults(string& error_str);
/**
* Known attributes for network contextualization rendered as:
* ETH_<nicid>_<context[0]> = $NETWORK[context[1], vnet_name]
*
* The context[1] values in the map are searched in the NIC and
* if not found in the AR and VNET. They can be also set in the
* CONTEXT section it self using full name (ETH_).
*
* IPv4 context variables:
* {"IP", "IP"},
* {"MAC", "MAC"},
* {"NETWORK", "NETWORK_ADDRESS"},
* {"GATEWAY", "GATEWAY"},
* {"DNS", "DNS"},
* {"SEARCH_DOMAIN", "SEARCH_DOMAIN"}
*
* IPv6 context:
* {"IP6", "IP6_GLOBAL"},
* {"GATEWAY6", "GATEWAY6"},
* {"CONTEXT_FORCE_IPV4", "CONTEXT_FORCE_IPV4"}
*/
static const char* NETWORK_CONTEXT[][2];
static const int NUM_NETWORK_CONTEXT;
static const char* NETWORK6_CONTEXT[][2];
static const int NUM_NETWORK6_CONTEXT;
/**
* Parse the "CONTEXT" attribute of the template by substituting
* $VARIABLE, $VARIABLE[ATTR] and $VARIABLE[ATTR, ATTR = VALUE]

View File

@ -133,6 +133,23 @@ const char * VirtualMachine::NO_NIC_DEFAULTS[] = {"NETWORK_ID", "NETWORK",
const int VirtualMachine::NUM_NO_NIC_DEFAULTS = 4;
const char * VirtualMachine::NETWORK_CONTEXT[][2] = {
{"IP", "IP"},
{"MAC", "MAC"},
{"MASK", "NETWORK_MASK"},
{"NETWORK", "NETWORK_ADDRESS"},
{"GATEWAY", "GATEWAY"},
{"DNS", "DNS"},
{"SEARCH_DOMAIN", "SEARCH_DOMAIN"}};
const int VirtualMachine::NUM_NETWORK_CONTEXT = 7;
const char* VirtualMachine::NETWORK6_CONTEXT[][2] = {
{"IP6", "IP6_GLOBAL"},
{"GATEWAY6", "GATEWAY6"},
{"CONTEXT_FORCE_IPV4", "CONTEXT_FORCE_IPV4"}};
const int VirtualMachine::NUM_NETWORK6_CONTEXT = 3;
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
@ -767,6 +784,42 @@ error_cleanup:
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
static void parse_context_network(const char* vars[][2], int num_vars,
VectorAttribute * context, VectorAttribute * nic)
{
string name = nic->vector_value("NETWORK");
string nic_id = nic->vector_value("NIC_ID");
for (int i=0; i < num_vars; i++)
{
ostringstream cvar;
string cval;
cvar << "ETH" << nic_id << "_" << vars[i][0];
cval = context->vector_value(cvar.str().c_str());
if (!cval.empty())
{
continue;
}
cval = nic->vector_value(vars[i][1]); //Check the NIC
if (cval.empty()) //Will check the AR and VNET
{
ostringstream cval_ss;
cval_ss << "$NETWORK["<< vars[i][1] <<", NETWORK=\""<< name <<"\"]";
cval = cval_ss.str();
}
context->replace(cvar.str(), cval);
}
}
/* -------------------------------------------------------------------------- */
int VirtualMachine::parse_context(string& error_str)
{
int rc, num;
@ -831,71 +884,13 @@ int VirtualMachine::parse_context(string& error_str)
continue;
}
string name = vatt->vector_value("NETWORK");
string ip = vatt->vector_value("IP");
string mac = vatt->vector_value("MAC");
string ip6 = vatt->vector_value("IP6_GLOBAL");
string nic_id = vatt->vector_value("NIC_ID");
parse_context_network(NETWORK_CONTEXT, NUM_NETWORK_CONTEXT,
context, vatt);
ostringstream var;
ostringstream val;
var << "ETH" << nic_id << "_IP";
context->replace(var.str(), ip);
var.str(""); val.str("");
var << "ETH" << nic_id << "_MAC";
context->replace(var.str(), mac);
var.str(""); val.str("");
var << "ETH" << nic_id << "_NETWORK";
val << "$NETWORK[NETWORK_ADDRESS, NETWORK=\"" << name << "\"]";
context->replace(var.str(), val.str());
var.str(""); val.str("");
var << "ETH" << nic_id << "_MASK";
val << "$NETWORK[NETWORK_MASK, NETWORK=\"" << name << "\"]";
context->replace(var.str(), val.str());
var.str(""); val.str("");
var << "ETH" << nic_id << "_GATEWAY";
val << "$NETWORK[GATEWAY, NETWORK=\"" << name << "\"]";
context->replace(var.str(), val.str());
var.str(""); val.str("");
var << "ETH" << nic_id << "_DNS";
val << "$NETWORK[DNS, NETWORK=\"" << name << "\"]";
context->replace(var.str(), val.str());
var.str(""); val.str("");
var << "ETH" << nic_id << "_SEARCH_DOMAIN";
val << "$NETWORK[SEARCH_DOMAIN, NETWORK=\"" << name << "\"]";
context->replace(var.str(), val.str());
if (!ip6.empty())
if (!vatt->vector_value("IP6_GLOBAL").empty())
{
var.str(""); val.str("");
var << "ETH" << nic_id << "_IP6";
context->replace(var.str(), ip6);
var.str(""); val.str("");
var << "ETH" << nic_id << "_GATEWAY6";
val << "$NETWORK[GATEWAY6, NETWORK=\"" << name << "\"]";
context->replace(var.str(), val.str());
var.str(""); val.str("");
var << "ETH" << nic_id << "_CONTEXT_FORCE_IPV4";
val << "$NETWORK[CONTEXT_FORCE_IPV4, NETWORK=\"" << name << "\"]";
context->replace(var.str(), val.str());
parse_context_network(NETWORK6_CONTEXT, NUM_NETWORK6_CONTEXT,
context, vatt);
}
}
}