diff --git a/src/sunstone/etc/sunstone-views/admin.yaml b/src/sunstone/etc/sunstone-views/admin.yaml index 50126b97f1..58131a87e6 100644 --- a/src/sunstone/etc/sunstone-views/admin.yaml +++ b/src/sunstone/etc/sunstone-views/admin.yaml @@ -251,7 +251,7 @@ tabs: VirtualRouterTemplate.refresh: true VirtualRouterTemplate.create_dialog: true VirtualRouterTemplate.update_dialog: true - VirtualRouterTemplate.instantiate_vms: true + VirtualRouterTemplate.instantiate_dialog: true VirtualRouterTemplate.rename: true VirtualRouterTemplate.chown: true VirtualRouterTemplate.chgrp: true diff --git a/src/sunstone/etc/sunstone-views/admin_vcenter.yaml b/src/sunstone/etc/sunstone-views/admin_vcenter.yaml index 578729b520..055b99ceb9 100644 --- a/src/sunstone/etc/sunstone-views/admin_vcenter.yaml +++ b/src/sunstone/etc/sunstone-views/admin_vcenter.yaml @@ -251,7 +251,7 @@ tabs: VirtualRouterTemplate.refresh: true VirtualRouterTemplate.create_dialog: true VirtualRouterTemplate.update_dialog: true - VirtualRouterTemplate.instantiate_vms: true + VirtualRouterTemplate.instantiate_dialog: true VirtualRouterTemplate.rename: true VirtualRouterTemplate.chown: true VirtualRouterTemplate.chgrp: true diff --git a/src/sunstone/etc/sunstone-views/groupadmin.yaml b/src/sunstone/etc/sunstone-views/groupadmin.yaml index 9a2998f46e..6e5de55392 100644 --- a/src/sunstone/etc/sunstone-views/groupadmin.yaml +++ b/src/sunstone/etc/sunstone-views/groupadmin.yaml @@ -251,7 +251,7 @@ tabs: VirtualRouterTemplate.refresh: true VirtualRouterTemplate.create_dialog: false VirtualRouterTemplate.update_dialog: false - VirtualRouterTemplate.instantiate_vms: false + VirtualRouterTemplate.instantiate_dialog: false VirtualRouterTemplate.rename: true VirtualRouterTemplate.chown: true VirtualRouterTemplate.chgrp: false diff --git a/src/sunstone/etc/sunstone-views/groupadmin_vcenter.yaml b/src/sunstone/etc/sunstone-views/groupadmin_vcenter.yaml index dab14b7133..54c14839ac 100644 --- a/src/sunstone/etc/sunstone-views/groupadmin_vcenter.yaml +++ b/src/sunstone/etc/sunstone-views/groupadmin_vcenter.yaml @@ -253,7 +253,7 @@ tabs: VirtualRouterTemplate.refresh: true VirtualRouterTemplate.create_dialog: false VirtualRouterTemplate.update_dialog: false - VirtualRouterTemplate.instantiate_vms: false + VirtualRouterTemplate.instantiate_dialog: false VirtualRouterTemplate.rename: true VirtualRouterTemplate.chown: true VirtualRouterTemplate.chgrp: false diff --git a/src/sunstone/etc/sunstone-views/user.yaml b/src/sunstone/etc/sunstone-views/user.yaml index 3656972904..32a8a24804 100644 --- a/src/sunstone/etc/sunstone-views/user.yaml +++ b/src/sunstone/etc/sunstone-views/user.yaml @@ -252,7 +252,7 @@ tabs: VirtualRouterTemplate.refresh: true VirtualRouterTemplate.create_dialog: true VirtualRouterTemplate.update_dialog: true - VirtualRouterTemplate.instantiate_vms: true + VirtualRouterTemplate.instantiate_dialog: true VirtualRouterTemplate.rename: true VirtualRouterTemplate.chown: false VirtualRouterTemplate.chgrp: false diff --git a/src/sunstone/public/app/tabs/oneflow-templates-tab/buttons.js b/src/sunstone/public/app/tabs/oneflow-templates-tab/buttons.js index dc973d2065..c1982544d6 100644 --- a/src/sunstone/public/app/tabs/oneflow-templates-tab/buttons.js +++ b/src/sunstone/public/app/tabs/oneflow-templates-tab/buttons.js @@ -27,16 +27,16 @@ define(function(require) { type: "create_dialog", layout: "create" }, - "ServiceTemplate.instantiate_dialog" : { - type: "action", - layout: "main", - text: Locale.tr("Instantiate") - }, "ServiceTemplate.update_dialog" : { type: "action", layout: "main", text: Locale.tr("Update") }, + "ServiceTemplate.instantiate_dialog" : { + type: "action", + layout: "main", + text: Locale.tr("Instantiate") + }, "ServiceTemplate.chown" : { type: "confirm_with_select", text: Locale.tr("Change owner"), diff --git a/src/sunstone/public/app/tabs/vrouter-templates-tab.js b/src/sunstone/public/app/tabs/vrouter-templates-tab.js index fe753fc398..07ccc0a2c8 100644 --- a/src/sunstone/public/app/tabs/vrouter-templates-tab.js +++ b/src/sunstone/public/app/tabs/vrouter-templates-tab.js @@ -36,7 +36,8 @@ define(function(require) { ]; var _formPanels = [ - require('./vrouter-templates-tab/form-panels/create') + require('./vrouter-templates-tab/form-panels/create'), + require('./vrouter-templates-tab/form-panels/instantiate') ]; var Tab = { diff --git a/src/sunstone/public/app/tabs/vrouter-templates-tab/actions.js b/src/sunstone/public/app/tabs/vrouter-templates-tab/actions.js index b72fe80861..83bd88f18d 100644 --- a/src/sunstone/public/app/tabs/vrouter-templates-tab/actions.js +++ b/src/sunstone/public/app/tabs/vrouter-templates-tab/actions.js @@ -24,7 +24,7 @@ define(function(require) { var CREATE_DIALOG_ID = require('tabs/vrouter-templates-tab/form-panels/create/formPanelId'); var CLONE_DIALOG_ID = require('tabs/templates-tab/dialogs/clone/dialogId'); - var INSTANTIATE_DIALOG_ID = undefined; + var INSTANTIATE_DIALOG_ID = require('./form-panels/instantiate/formPanelId'); var IMPORT_DIALOG_ID = undefined; var CONFIRM_DIALOG_ID = require('utils/dialogs/generic-confirm/dialogId'); @@ -39,10 +39,29 @@ define(function(require) { 'TAB_ID' : TAB_ID, 'CREATE_DIALOG_ID' : CREATE_DIALOG_ID, 'CLONE_DIALOG_ID' : CLONE_DIALOG_ID, - 'INSTANTIATE_DIALOG_ID' : INSTANTIATE_DIALOG_ID, + 'INSTANTIATE_DIALOG_ID' : undefined, 'IMPORT_DIALOG_ID' : IMPORT_DIALOG_ID, 'CONFIRM_DIALOG_ID' : CONFIRM_DIALOG_ID, }); + actions["VirtualRouterTemplate.instantiate_dialog"] = { + type: "custom", + call: function() { + var selected_nodes = Sunstone.getDataTable(TAB_ID).elements(); + if (selected_nodes.length != 1) { + Notifier.notifyMessage("Please select one (and just one) template to instantiate."); + return false; + } + + var templateId = "" + selected_nodes[0]; + + Sunstone.resetFormPanel(TAB_ID, INSTANTIATE_DIALOG_ID); + Sunstone.showFormPanel(TAB_ID, INSTANTIATE_DIALOG_ID, "instantiate", + function(formPanelInstance, context) { + formPanelInstance.setTemplateId(context, templateId); + }); + } + }; + return actions; }); diff --git a/src/sunstone/public/app/tabs/vrouter-templates-tab/buttons.js b/src/sunstone/public/app/tabs/vrouter-templates-tab/buttons.js index 3f57999d31..cce517236b 100644 --- a/src/sunstone/public/app/tabs/vrouter-templates-tab/buttons.js +++ b/src/sunstone/public/app/tabs/vrouter-templates-tab/buttons.js @@ -16,6 +16,7 @@ define(function(require) { var TemplateButtons = require('tabs/templates-tab/buttons'); + var Locale = require('utils/locale'); var Buttons = { "VirtualRouterTemplate.refresh" : TemplateButtons["Template.refresh"], @@ -23,6 +24,11 @@ define(function(require) { // "VirtualRouterTemplate.import_dialog" : TemplateButtons["Template.import_dialog"], "VirtualRouterTemplate.update_dialog" : TemplateButtons["Template.update_dialog"], // "VirtualRouterTemplate.instantiate_vms" : TemplateButtons["Template.instantiate_vms"], + "VirtualRouterTemplate.instantiate_dialog" : { + type: "action", + layout: "main", + text: Locale.tr("Instantiate") + }, "VirtualRouterTemplate.chown" : TemplateButtons["Template.chown"], "VirtualRouterTemplate.chgrp" : TemplateButtons["Template.chgrp"], "VirtualRouterTemplate.clone_dialog" : TemplateButtons["Template.clone_dialog"], diff --git a/src/sunstone/public/app/tabs/vrouter-templates-tab/form-panels/instantiate.js b/src/sunstone/public/app/tabs/vrouter-templates-tab/form-panels/instantiate.js new file mode 100644 index 0000000000..af529944ac --- /dev/null +++ b/src/sunstone/public/app/tabs/vrouter-templates-tab/form-panels/instantiate.js @@ -0,0 +1,199 @@ +/* -------------------------------------------------------------------------- */ +/* Copyright 2002-2016, OpenNebula Project, OpenNebula Systems */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); you may */ +/* not use this file except in compliance with the License. You may obtain */ +/* a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ +/* See the License for the specific language governing permissions and */ +/* limitations under the License. */ +/* -------------------------------------------------------------------------- */ + +define(function(require) { + /* + DEPENDENCIES + */ + + var BaseFormPanel = require('utils/form-panels/form-panel'); + var Sunstone = require('sunstone'); + var Locale = require('utils/locale'); + var Tips = require('utils/tips'); + var UserInputs = require('utils/user-inputs'); + var WizardFields = require('utils/wizard-fields'); + var NicsSection = require('utils/nics-section'); + var OpenNebulaVirtualRouter = require('opennebula/virtualrouter'); + var OpenNebulaTemplate = require('opennebula/template'); + var OpenNebulaAction = require('opennebula/action'); + var Notifier = require('utils/notifier'); + var Config = require('sunstone-config'); + + /* + TEMPLATES + */ + + var TemplateWizardHTML = require('hbs!./instantiate/wizard'); + + /* + CONSTANTS + */ + + var FORM_PANEL_ID = require('./instantiate/formPanelId'); + var TAB_ID = require('../tabId'); + + /* + CONSTRUCTOR + */ + + function FormPanel() { + this.formPanelId = FORM_PANEL_ID; + this.tabId = TAB_ID; + this.actions = { + 'instantiate': { + 'title': Locale.tr("Instantiate Virtual Router Template"), + 'buttonText': Locale.tr("Instantiate"), + 'resetButton': false + } + }; + + BaseFormPanel.call(this); + } + + FormPanel.FORM_PANEL_ID = FORM_PANEL_ID; + FormPanel.prototype = Object.create(BaseFormPanel.prototype); + FormPanel.prototype.constructor = FormPanel; + FormPanel.prototype.setTemplateId = _setTemplateId; + FormPanel.prototype.htmlWizard = _htmlWizard; + FormPanel.prototype.submitWizard = _submitWizard; + FormPanel.prototype.onShow = _onShow; + FormPanel.prototype.setup = _setup; + + return FormPanel; + + /* + FUNCTION DEFINITIONS + */ + + function _htmlWizard() { + return TemplateWizardHTML({ + 'formPanelId': this.formPanelId + }); + } + + function _setup(context) { + var that = this; + + NicsSection.insert({}, + $(".nicsContext", context), + { floatingIP: true, + forceIPv4:true, + management: true, + securityGroups: Config.isFeatureEnabled("secgroups")}); + + $(".vr_attributes #name", context).on("input", function(){ + $('#vm_name', context).val("vr-"+$(this).val()+"-%i"); + }); + + Tips.setup(context); + + return false; + } + + function _submitWizard(context) { + var that = this; + + var virtual_router_json = WizardFields.retrieve($(".vr_attributes", context)); + + var nics = NicsSection.retrieve($(".nicsContext", context)); + if (nics.length > 0) { + virtual_router_json.NIC = nics; + } + + virtual_router_json = { + "virtual_router" : virtual_router_json + }; + + var vm_name = $('#vm_name', context).val(); + var n_times = parseInt($('#vm_n_times', context).val()); + + if (isNaN(n_times)){ + n_times = 1; + } + + var hold = $('#hold', context).prop("checked"); + + OpenNebulaVirtualRouter.create({ + data : virtual_router_json, + timeout: true, + success: function (request, response) { + + var tmpl = WizardFields.retrieve($(".template_user_inputs", context)); + + var extra_info = { + 'n_vms': n_times, + 'template_id': that.templateId, + 'vm_name': vm_name, + 'hold': hold, + 'template': tmpl + }; + + Notifier.notifyCustom(Locale.tr("Virtual Router created"), " ID: " + response.VROUTER.ID, false); + + OpenNebulaVirtualRouter.instantiate({ + data:{ + id: response.VROUTER.ID, + extra_param: extra_info + }, + timeout: true, + success: function(request, response){ + OpenNebulaAction.clear_cache("VM"); + + Sunstone.resetFormPanel(TAB_ID, that.formPanelId); + Sunstone.hideFormPanel(TAB_ID); + }, + error: function(request, response) { + Sunstone.hideFormPanelLoading(TAB_ID); + + Notifier.notifyError(Locale.tr( + "Failed to create VMs. Virtual Router may need to be deleted manually.")); + Notifier.onError(request, response); + } + }); + }, + error: function(request, response) { + Sunstone.hideFormPanelLoading(TAB_ID); + Notifier.onError(request, response); + }, + }); + + return false; + } + + function _onShow(context) { + } + + function _setTemplateId(context, templateId){ + this.templateId = templateId; + + var inputs_div = $(".template_user_inputs", context); + inputs_div.empty(); + + OpenNebulaTemplate.show({ + data : { + id: templateId + }, + timeout: true, + success: function (request, template_json) { + UserInputs.vmTemplateInsert( + inputs_div, + template_json, + {text_header: ' '+Locale.tr("Custom Attributes")}); + }, + error: Notifier.onError + }); + } +}); diff --git a/src/sunstone/public/app/tabs/vrouter-templates-tab/form-panels/instantiate/formPanelId.js b/src/sunstone/public/app/tabs/vrouter-templates-tab/form-panels/instantiate/formPanelId.js new file mode 100644 index 0000000000..c1f788ec19 --- /dev/null +++ b/src/sunstone/public/app/tabs/vrouter-templates-tab/form-panels/instantiate/formPanelId.js @@ -0,0 +1,19 @@ +/* -------------------------------------------------------------------------- */ +/* Copyright 2002-2016, OpenNebula Project, OpenNebula Systems */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); you may */ +/* not use this file except in compliance with the License. You may obtain */ +/* a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ +/* See the License for the specific language governing permissions and */ +/* limitations under the License. */ +/* -------------------------------------------------------------------------- */ + +define(function(require){ + return 'instantiateVirtualRouterTemplateForm'; +}); diff --git a/src/sunstone/public/app/tabs/vrouters-tab/form-panels/create/templateSelection.hbs b/src/sunstone/public/app/tabs/vrouter-templates-tab/form-panels/instantiate/templateSelection.hbs similarity index 84% rename from src/sunstone/public/app/tabs/vrouters-tab/form-panels/create/templateSelection.hbs rename to src/sunstone/public/app/tabs/vrouter-templates-tab/form-panels/instantiate/templateSelection.hbs index 7d821cd51c..b1c2ccf6c2 100644 --- a/src/sunstone/public/app/tabs/vrouters-tab/form-panels/create/templateSelection.hbs +++ b/src/sunstone/public/app/tabs/vrouter-templates-tab/form-panels/instantiate/templateSelection.hbs @@ -14,31 +14,30 @@ {{! limitations under the License. }} {{! -------------------------------------------------------------------------- }} -