From eafd5143c4bf72d4494f1d75cfd8ccb00f6dc732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn?= Date: Tue, 1 Dec 2015 16:36:50 +0100 Subject: [PATCH] Feature #4215: Store VM - VR id reference --- include/VirtualMachine.h | 7 ++++ include/VirtualRouter.h | 17 ++++++++ src/cli/etc/onevrouter.yaml | 5 +++ src/cli/one_helper/onevrouter_helper.rb | 7 +++- src/sunstone/etc/sunstone-views/admin.yaml | 7 ++-- .../etc/sunstone-views/admin_vcenter.yaml | 7 ++-- src/sunstone/etc/sunstone-views/user.yaml | 7 ++-- .../public/app/tabs/vrouters-tab/datatable.js | 4 +- .../app/tabs/vrouters-tab/panels/info.js | 19 +++++++++ .../tabs/vrouters-tab/panels/info/html.hbs | 12 +++++- src/vm/VirtualMachine.cc | 40 ++++++++++++++++++- src/vrouter/VirtualRouter.cc | 5 ++- 12 files changed, 123 insertions(+), 14 deletions(-) diff --git a/include/VirtualMachine.h b/include/VirtualMachine.h index 8d416e0c2b..66246f4fb0 100644 --- a/include/VirtualMachine.h +++ b/include/VirtualMachine.h @@ -1968,6 +1968,13 @@ private: */ int parse_defaults(string& error_str); + /** + * Parse virtual router related attributes + * @param error_str Returns the error reason, if any + * @return 0 on success + */ + int parse_vrouter(string& error_str); + /** * Known attributes for network contextualization rendered as: * ETH__ = $NETWORK[context[1], vnet_name] diff --git a/include/VirtualRouter.h b/include/VirtualRouter.h index 40a512a459..53146e29df 100644 --- a/include/VirtualRouter.h +++ b/include/VirtualRouter.h @@ -37,6 +37,16 @@ public: */ string& to_xml(string& xml) const; + int get_vmid() + { + return vmid; + } + + void set_vmid(int vmid) + { + this->vmid = vmid; + } + // ------------------------------------------------------------------------ // Template Contents // ------------------------------------------------------------------------ @@ -66,6 +76,13 @@ private: friend class VirtualRouterPool; + + // ************************************************************************* + // Attributes + // ************************************************************************* + + int vmid; + // ************************************************************************* // DataBase implementation (Private) // ************************************************************************* diff --git a/src/cli/etc/onevrouter.yaml b/src/cli/etc/onevrouter.yaml index 4ccb9028dc..92404405d5 100644 --- a/src/cli/etc/onevrouter.yaml +++ b/src/cli/etc/onevrouter.yaml @@ -3,6 +3,10 @@ :desc: ONE identifier for the Virtual Router :size: 4 +:VMID: + :desc: VM associated with the Virtual Router + :size: 4 + :NAME: :desc: Name of the Virtual Router :size: 27 @@ -20,6 +24,7 @@ :default: - :ID +- :VMID - :USER - :GROUP - :NAME diff --git a/src/cli/one_helper/onevrouter_helper.rb b/src/cli/one_helper/onevrouter_helper.rb index 05a03ebf12..a2fbaf3804 100644 --- a/src/cli/one_helper/onevrouter_helper.rb +++ b/src/cli/one_helper/onevrouter_helper.rb @@ -52,6 +52,10 @@ class OneVirtualRouterHelper < OpenNebulaHelper::OneHelper d["ID"] end + column :VMID, "VM associated with the Virtual Router", :size=>4 do |d| + d["VMID"] + end + column :NAME, "Name of the Virtual Router", :left, :size=>27 do |d| d["NAME"] end @@ -65,7 +69,7 @@ class OneVirtualRouterHelper < OpenNebulaHelper::OneHelper helper.group_name(d, options) end - default :ID, :USER, :GROUP, :NAME + default :ID, :VMID, :USER, :GROUP, :NAME end table @@ -94,6 +98,7 @@ class OneVirtualRouterHelper < OpenNebulaHelper::OneHelper str_h1 % "VIRTUAL ROUTER #{obj['ID']} INFORMATION") puts str % ["ID", obj.id.to_s] puts str % ["NAME", obj.name] + puts str % ["VIRTUAL MACHINE", obj['VMID']] puts str % ["USER", obj['UNAME']] puts str % ["GROUP", obj['GNAME']] puts diff --git a/src/sunstone/etc/sunstone-views/admin.yaml b/src/sunstone/etc/sunstone-views/admin.yaml index 44be4d43aa..a6d4bb6663 100644 --- a/src/sunstone/etc/sunstone-views/admin.yaml +++ b/src/sunstone/etc/sunstone-views/admin.yaml @@ -434,9 +434,10 @@ tabs: table_columns: - 0 # Checkbox - 1 # ID - - 2 # Owner - - 3 # Group - - 4 # Name + - 2 # VMID + - 3 # Owner + - 4 # Group + - 5 # Name actions: VirtualRouter.refresh: true VirtualRouter.create_dialog: true diff --git a/src/sunstone/etc/sunstone-views/admin_vcenter.yaml b/src/sunstone/etc/sunstone-views/admin_vcenter.yaml index fa0511f49b..c01cccf4c2 100644 --- a/src/sunstone/etc/sunstone-views/admin_vcenter.yaml +++ b/src/sunstone/etc/sunstone-views/admin_vcenter.yaml @@ -434,9 +434,10 @@ tabs: table_columns: - 0 # Checkbox - 1 # ID - - 2 # Owner - - 3 # Group - - 4 # Name + - 2 # VMID + - 3 # Owner + - 4 # Group + - 5 # Name actions: VirtualRouter.refresh: true VirtualRouter.create_dialog: true diff --git a/src/sunstone/etc/sunstone-views/user.yaml b/src/sunstone/etc/sunstone-views/user.yaml index 0f45d4ef8a..4d820d9016 100644 --- a/src/sunstone/etc/sunstone-views/user.yaml +++ b/src/sunstone/etc/sunstone-views/user.yaml @@ -435,9 +435,10 @@ tabs: table_columns: - 0 # Checkbox - 1 # ID - - 2 # Owner - - 3 # Group - - 4 # Name + - 2 # VMID + - 3 # Owner + - 4 # Group + - 5 # Name actions: VirtualRouter.refresh: true VirtualRouter.create_dialog: true diff --git a/src/sunstone/public/app/tabs/vrouters-tab/datatable.js b/src/sunstone/public/app/tabs/vrouters-tab/datatable.js index c9a6b79610..edced70510 100644 --- a/src/sunstone/public/app/tabs/vrouters-tab/datatable.js +++ b/src/sunstone/public/app/tabs/vrouters-tab/datatable.js @@ -56,6 +56,7 @@ define(function(require) { this.columns = [ Locale.tr("ID"), + Locale.tr("VMID"), Locale.tr("Owner"), Locale.tr("Group"), Locale.tr("Name") @@ -63,7 +64,7 @@ define(function(require) { this.selectOptions = { "id_index": 1, - "name_index": 4, + "name_index": 5, "select_resource": Locale.tr("Please select a virtual router from the list"), "you_selected": Locale.tr("You selected the following virtual router:"), "select_resource_multiple": Locale.tr("Please select one or more virtual routers from the list"), @@ -91,6 +92,7 @@ define(function(require) { element.ID + '" name="selected_items" value="' + element.ID + '"/>', element.ID, + element.VMID, element.UNAME, element.GNAME, element.NAME diff --git a/src/sunstone/public/app/tabs/vrouters-tab/panels/info.js b/src/sunstone/public/app/tabs/vrouters-tab/panels/info.js index 9bddedcf31..877baf34ae 100644 --- a/src/sunstone/public/app/tabs/vrouters-tab/panels/info.js +++ b/src/sunstone/public/app/tabs/vrouters-tab/panels/info.js @@ -24,6 +24,8 @@ define(function(require) { var PermissionsTable = require('utils/panel/permissions-table'); var RenameTr = require('utils/panel/rename-tr'); var OpenNebulaVirtualRouter = require('opennebula/virtualrouter'); + var Sunstone = require('sunstone'); + var Config = require('sunstone-config'); /* TEMPLATES @@ -65,6 +67,13 @@ define(function(require) { function _html() { var renameTrHTML = RenameTr.html(TAB_ID, RESOURCE, this.element.NAME); + + var vmid = this.element.VMID; + + if (vmid == "-1"){ + vmid = undefined; // Change made to use {{#if vmid}} in handlebars + } + var permissionsTableHTML = PermissionsTable.html(TAB_ID, RESOURCE, this.element); // TODO: simplify interface? @@ -78,12 +87,22 @@ define(function(require) { return TemplateInfo({ 'element': this.element, 'renameTrHTML': renameTrHTML, + 'vmid': vmid, 'permissionsTableHTML': permissionsTableHTML, 'templateTableHTML': templateTableHTML }); } function _setup(context) { + $("a.vmid", context).on("click", function(){ + // TODO: this should be checked internally in showElement, + // but it won't work because of bug #4198 + + if (Config.isTabEnabled("vms-tab")){ + Sunstone.showElement("vms-tab", "VM.show", $(this).text()); + } + }); + RenameTr.setup(TAB_ID, RESOURCE, this.element.ID, context); PermissionsTable.setup(TAB_ID, RESOURCE, this.element, context); diff --git a/src/sunstone/public/app/tabs/vrouters-tab/panels/info/html.hbs b/src/sunstone/public/app/tabs/vrouters-tab/panels/info/html.hbs index cdf7437679..c4846490f1 100644 --- a/src/sunstone/public/app/tabs/vrouters-tab/panels/info/html.hbs +++ b/src/sunstone/public/app/tabs/vrouters-tab/panels/info/html.hbs @@ -18,7 +18,7 @@
- + @@ -28,6 +28,16 @@ {{{renameTrHTML}}} + + + +
{{tr "Information"}}
{{element.ID}}
{{tr "VM ID"}} + {{#if vmid}} + {{vmid}} + {{else}} + -- + {{/if}} +
diff --git a/src/vm/VirtualMachine.cc b/src/vm/VirtualMachine.cc index 0fddafff9e..e04e66cd16 100644 --- a/src/vm/VirtualMachine.cc +++ b/src/vm/VirtualMachine.cc @@ -428,6 +428,17 @@ int VirtualMachine::insert(SqlDB * db, string& error_str) goto error_defaults; } + // ------------------------------------------------------------------------ + // Parse the virtual router attributes + // ------------------------------------------------------------------------ + + rc = parse_vrouter(error_str); + + if ( rc != 0 ) + { + goto error_vrouter; + } + // ------------------------------------------------------------------------ // Get network leases // ------------------------------------------------------------------------ @@ -584,6 +595,7 @@ error_one_vms: error_os: error_defaults: +error_vrouter: error_public: error_name: error_common: @@ -823,6 +835,32 @@ error_cleanup: return -1; } +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ + +int VirtualMachine::parse_vrouter(string& error_str) +{ + string st; + + user_obj_template->get("VROUTER", st); + + if (!st.empty()) + { + obj_template->replace("VROUTER", st); + } + + user_obj_template->get("VROUTER_ID", st); + + if (!st.empty()) + { + obj_template->replace("VROUTER_ID", st); + } + + user_obj_template->erase("VROUTER"); + user_obj_template->erase("VROUTER_ID"); + + return 0; +} /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ @@ -3214,7 +3252,7 @@ int VirtualMachine::get_vrouter_id() { int vrid; - if (!user_obj_template->get("VROUTER_ID", vrid)) + if (!obj_template->get("VROUTER_ID", vrid)) { vrid = -1; } diff --git a/src/vrouter/VirtualRouter.cc b/src/vrouter/VirtualRouter.cc index 6c91771bda..0dc8c7f94b 100644 --- a/src/vrouter/VirtualRouter.cc +++ b/src/vrouter/VirtualRouter.cc @@ -27,7 +27,8 @@ VirtualRouter::VirtualRouter( int id, const string& _gname, int _umask, Template * _template_contents): - PoolObjectSQL(id,VROUTER,"",_uid,_gid,_uname,_gname,table) + PoolObjectSQL(id,VROUTER,"",_uid,_gid,_uname,_gname,table), + vmid(-1) { if (_template_contents != 0) { @@ -197,6 +198,7 @@ string& VirtualRouter::to_xml(string& xml) const << "" << uname << "" << "" << gname << "" << "" << name << "" + << "" << vmid << "" << perms_to_xml(perm_str) << obj_template->to_xml(template_xml) << ""; @@ -224,6 +226,7 @@ int VirtualRouter::from_xml(const string& xml) rc += xpath(uname, "/VROUTER/UNAME", "not_found"); rc += xpath(gname, "/VROUTER/GNAME", "not_found"); rc += xpath(name, "/VROUTER/NAME", "not_found"); + rc += xpath(vmid, "/VROUTER/VMID", -1); // Permissions rc += perms_from_xml();