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:
parent
8435389717
commit
f9c3a93e4b
@ -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
|
||||
|
@ -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:
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user