From f9c3a93e4b5cae8944ea11b01e240a93f853ed5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn?= Date: Fri, 15 Jan 2016 16:42:51 +0100 Subject: [PATCH] Feature #4215: Context var ethx_vrouter_ip_recipients --- include/ObjectCollection.h | 10 ++- include/VirtualMachine.h | 5 +- include/VirtualRouter.h | 5 +- src/vm/VirtualMachine.cc | 61 ++++++++++++++++++ src/vrouter/VirtualRouter.cc | 118 +++++++++++++++++++++++++++++++++++ 5 files changed, 193 insertions(+), 6 deletions(-) diff --git a/include/ObjectCollection.h b/include/ObjectCollection.h index 115563a912..03f304d78e 100644 --- a/include/ObjectCollection.h +++ b/include/ObjectCollection.h @@ -80,11 +80,19 @@ public: /** * Returns a copy of the IDs set */ - set get_collection_copy() + set get_collection_copy() const { return set (collection_set); }; + /** + * Returns a reference to the IDs set + */ + const set& get_collection() const + { + return collection_set; + }; + /** * Returns true if the collection contains the given id * @param id ID to search diff --git a/include/VirtualMachine.h b/include/VirtualMachine.h index edde6df239..3b80652344 100644 --- a/include/VirtualMachine.h +++ b/include/VirtualMachine.h @@ -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: // ------------------------------------------------------------------------- diff --git a/include/VirtualRouter.h b/include/VirtualRouter.h index e4e938d1e4..197fc7287b 100644 --- a/include/VirtualRouter.h +++ b/include/VirtualRouter.h @@ -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 diff --git a/src/vm/VirtualMachine.cc b/src/vm/VirtualMachine.cc index 2349333771..619fa8fd07 100644 --- a/src/vm/VirtualMachine.cc +++ b/src/vm/VirtualMachine.cc @@ -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 array_context; + VectorAttribute * context; + int num; + + num = obj_template->get("CONTEXT", array_context); + + if ( num != 1 ) + { + return -1; + } + + context = dynamic_cast(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 nics; + const VectorAttribute * nic; + + num_nics = obj_template->get("NIC", nics); + + for(int i=0; i(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) { diff --git a/src/vrouter/VirtualRouter.cc b/src/vrouter/VirtualRouter.cc index 4707604222..c4b3b11969 100644 --- a/src/vrouter/VirtualRouter.cc +++ b/src/vrouter/VirtualRouter.cc @@ -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 nics; + VectorAttribute * nic; + const VectorAttribute * vm_nic; + set::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 ip_vector; + vector ip6_vector; + + nic = static_cast(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; +}