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

Feature #4215: Context var ethx_vrouter_ip_recipients

This commit is contained in:
Carlos Martín 2016-01-15 16:42:51 +01:00
parent 8435389717
commit f9c3a93e4b
5 changed files with 193 additions and 6 deletions

View File

@ -80,11 +80,19 @@ public:
/**
* Returns a copy of the IDs set
*/
set<int> get_collection_copy()
set<int> get_collection_copy() const
{
return set<int> (collection_set);
};
/**
* Returns a reference to the IDs set
*/
const set<int>& get_collection() const
{
return collection_set;
};
/**
* Returns true if the collection contains the given id
* @param id ID to search

View File

@ -1318,6 +1318,8 @@ public:
*/
const VectorAttribute* get_disk(int disk_id) const;
const VectorAttribute* get_nic(int nic_id) const;
// ------------------------------------------------------------------------
// Virtual Router related functions
// ------------------------------------------------------------------------
@ -1347,6 +1349,8 @@ public:
*/
int generate_context(string &files, int &disk_id, string& token_password);
int replace_context_attribute(const string& name, const string& value);
// -------------------------------------------------------------------------
// "Save as" Disk related functions (save_as hot)
// -------------------------------------------------------------------------
@ -1711,7 +1715,6 @@ public:
*/
void delete_snapshots();
private:
// -------------------------------------------------------------------------

View File

@ -38,10 +38,7 @@ public:
*/
string& to_xml(string& xml) const;
int add_vmid(int vmid)
{
return vms.add_collection_id(vmid);
}
int add_vmid(int vmid);
// ------------------------------------------------------------------------
// Template Contents

View File

@ -3402,6 +3402,34 @@ int VirtualMachine::generate_context(string &files, int &disk_id,
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int VirtualMachine::replace_context_attribute(const string& name, const string& value)
{
vector<Attribute *> array_context;
VectorAttribute * context;
int num;
num = obj_template->get("CONTEXT", array_context);
if ( num != 1 )
{
return -1;
}
context = dynamic_cast<VectorAttribute *>(array_context[0]);
if ( context == 0 )
{
return -1;
}
context->replace(name, value);
return 0;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
const VectorAttribute* VirtualMachine::get_disk(int disk_id) const
{
int num_disks;
@ -3435,6 +3463,39 @@ const VectorAttribute* VirtualMachine::get_disk(int disk_id) const
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
const VectorAttribute* VirtualMachine::get_nic(int nic_id) const
{
int num_nics;
int tnic_id;
vector<const Attribute *> nics;
const VectorAttribute * nic;
num_nics = obj_template->get("NIC", nics);
for(int i=0; i<num_nics; i++)
{
nic = dynamic_cast<const VectorAttribute * >(nics[i]);
if ( nic == 0 )
{
continue;
}
nic->vector_value("NIC_ID", tnic_id);
if ( tnic_id == nic_id )
{
return nic;
}
}
return 0;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int VirtualMachine::set_saveas_disk(int disk_id, int snap_id, int &iid,
long long &size, string& err_str)
{

View File

@ -456,3 +456,121 @@ Template * VirtualRouter::get_nics() const
return tmpl;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int VirtualRouter::add_vmid(int vmid)
{
VirtualMachine* vm;
VirtualMachinePool* vmpool = Nebula::instance().get_vmpool();
int num_nics;
int nic_id;
bool floating;
vector<Attribute * > nics;
VectorAttribute * nic;
const VectorAttribute * vm_nic;
set<int>::iterator it;
string ipstr;
ostringstream oss;
int rc = vms.add_collection_id(vmid);
if (rc == -1)
{
return rc;
}
num_nics = obj_template->get("NIC",nics);
for(nic_id = 0; nic_id < num_nics; nic_id++)
{
vector<string> ip_vector;
vector<string> ip6_vector;
nic = static_cast<VectorAttribute * >(nics[nic_id]);
if (nic == 0)
{
continue;
}
floating = false;
nic->vector_value("FLOATING_IP", floating);
if (floating)
{
for (it = vms.get_collection().begin(); it != vms.get_collection().end(); it++)
{
vm = vmpool->get(*it, true);
if (vm == 0)
{
continue;
}
vm_nic = vm->get_nic(nic_id);
if (vm_nic == 0)
{
vm->unlock();
continue;
}
if (vm_nic->vector_value("IP", ipstr) == 0)
{
ip_vector.push_back(ipstr);
}
// TODO: do the same for is IP6_LINK and IP6_ULA?
if (vm_nic->vector_value("IP6_GLOBAL", ipstr) == 0)
{
ip6_vector.push_back(ipstr);
}
vm->unlock();
}
string joined_ip = one_util::join(ip_vector.begin(), ip_vector.end(), ',');
string joined_ip6 = one_util::join(ip6_vector.begin(), ip6_vector.end(), ',');
oss.str("");
oss << "ETH" << nic_id << "_" << "VROUTER_IP_RECIPIENTS";
string ip_key = oss.str();
oss.str("");
oss << "ETH" << nic_id << "_" << "VROUTER_IP6_RECIPIENTS";
string ip6_key = oss.str();
for (it = vms.get_collection().begin(); it != vms.get_collection().end(); it++)
{
vm = vmpool->get(*it, true);
if (vm == 0)
{
continue;
}
if (!joined_ip.empty())
{
vm->replace_context_attribute(ip_key, joined_ip);
}
if (!joined_ip6.empty())
{
vm->replace_context_attribute(ip6_key, joined_ip6);
}
vmpool->update(vm);
vm->unlock();
}
}
}
return rc;
}