From df4fbe796be6f3a81df31359a44e4878ce600660 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 25 Feb 2011 17:03:03 -0800 Subject: [PATCH] =?UTF-8?q?bug=208655:=20VM=20Wizard=20-=20step=204=20-=20?= =?UTF-8?q?If=20Security=20Group=20Network=20is=20used=20AND=20there=20is?= =?UTF-8?q?=20at=20least=20one=20dedicated=20direct=20tagged=20default=20n?= =?UTF-8?q?etwork=20for=20the=20account,=20then=20prompt=20=E2=80=9CDo=20y?= =?UTF-8?q?ou=20wish=20to=20launch=20your=20VM=20on=20a=20private=20cloud/?= =?UTF-8?q?network=3F=E2=80=9D=20If=20Yes,=20present=20network=20container?= =?UTF-8?q?.=20If=20No,=20present=20security=20groups=20container.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/resources/messages.properties | 1 + ui/jsp/instance.jsp | 3 +- ui/scripts/cloud.core.instance.js | 387 ++++++++++-------- 3 files changed, 221 insertions(+), 170 deletions(-) diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties index e11a02ef601..37b7ef77a65 100644 --- a/client/WEB-INF/classes/resources/messages.properties +++ b/client/WEB-INF/classes/resources/messages.properties @@ -19,6 +19,7 @@ label.security.groups.enabled=Security Groups Enabled label.isolation.mode=Isolation Mode label.virtual=Virtual label.security.group=Security Group +message.launch.vm.on.private.network=Do you wish to launch your VM on a private cloud/network? message.advanced.virtual=Advanced Zone - Virtual Network message.advanced.security.group=Advanced Zone - Security Group diff --git a/ui/jsp/instance.jsp b/ui/jsp/instance.jsp index c084fd615bd..6f7c2e1b72d 100644 --- a/ui/jsp/instance.jsp +++ b/ui/jsp/instance.jsp @@ -41,7 +41,8 @@ dictionary = { 'message.action.instance.reset.password': '', 'message.action.take.snapshot': '', 'label.data.disk.offering': '', - 'label.root.disk.offering': '' + 'label.root.disk.offering': '', + 'message.launch.vm.on.private.network': '' }; diff --git a/ui/scripts/cloud.core.instance.js b/ui/scripts/cloud.core.instance.js index 4bdd468b74b..967dce0d5f2 100644 --- a/ui/scripts/cloud.core.instance.js +++ b/ui/scripts/cloud.core.instance.js @@ -767,6 +767,187 @@ function initVMWizard() { return false; }); + function vmWizardShowNetworkContainer($thisPopup) { + $thisPopup.find("#step4").find("#network_container").show(); + $thisPopup.find("#step4").find("#securitygroup_container").hide(); + $thisPopup.find("#step4").find("#for_no_network_support").hide(); + + $.ajax({ + data: createURL("command=listNetworks&domainid="+g_domainid+"&account="+g_account+"&zoneId="+$thisPopup.find("#wizard_zone").val()), + dataType: "json", + async: false, + success: function(json) { + var networks = json.listnetworksresponse.network; + var virtualNetwork = null; + if (networks != null && networks.length > 0) { + for (var i = 0; i < networks.length; i++) { + if (networks[i].type == 'Virtual') { + virtualNetwork = networks[i]; + } + } + } + var $virtualNetworkElement = $thisPopup.find("#network_virtual_container"); + + // Setup Virtual Networks + var requiredVirtual = false; + var defaultNetworkAdded = false; + var availableSecondary = false; + if (virtualNetwork == null) { + $.ajax({ + data: createURL("command=listNetworkOfferings&guestiptype=Virtual"), + dataType: "json", + async: false, + success: function(json) { + var networkOfferings = json.listnetworkofferingsresponse.networkoffering; + if (networkOfferings != null && networkOfferings.length > 0) { + for (var i = 0; i < networkOfferings.length; i++) { + if (networkOfferings[i].isdefault == true && networkOfferings[i].availability != "Unavailable") { + // Create a virtual network + var networkName = "Virtual Network"; + var networkDesc = "A dedicated virtualized network for your account. The broadcast domain is contained within a VLAN and all public network access is routed out by a virtual router."; + $.ajax({ + data: createURL("command=createNetwork&networkOfferingId="+networkOfferings[i].id+"&name="+todb(networkName)+"&displayText="+todb(networkDesc)+"&zoneId="+$thisPopup.find("#wizard_zone").val()), + dataType: "json", + async: false, + success: function(json) { + var network = json.createnetworkresponse.network; + $virtualNetworkElement.show(); + if (network.networkofferingavailability == 'Required') { + requiredVirtual = true; + $virtualNetworkElement.find("#network_virtual").attr('disabled', true); + } + defaultNetworkAdded = true; + $virtualNetworkElement.find("#network_virtual").data("id", network.id).data("jsonObj", network); + } + }); + } + } + } + } + }); + } else { + if (virtualNetwork.networkofferingavailability != 'Unavailable') { + $virtualNetworkElement.show(); + if (virtualNetwork.networkofferingavailability == 'Required') { + requiredVirtual = true; + $virtualNetworkElement.find("#network_virtual").attr('disabled', true); + } + defaultNetworkAdded = true; + $virtualNetworkElement.data("id", virtualNetwork.id); + $virtualNetworkElement.find("#network_virtual").data("id", virtualNetwork.id).data("jsonObj", virtualNetwork); + } else { + $virtualNetworkElement.hide(); + } + } + + // Setup Direct Networks + var $networkDirectTemplate = $("#wizard_network_direct_template"); + var $networkSecondaryDirectTemplate = $("#wizard_network_direct_secondary_template"); + var $networkDirectContainer = $("#network_direct_container").empty(); + var $networkDirectSecondaryContainer = $("#network_direct_secondary_container").empty(); + + if (networks != null && networks.length > 0) { + for (var i = 0; i < networks.length; i++) { + if (networks[i].type != 'Direct') { + continue; + } + var $directNetworkElement = null; + if (networks[i].isdefault) { + if (requiredVirtual) { + continue; + } + $directNetworkElement = $networkDirectTemplate.clone().attr("id", "direct"+networks[i].id); + if (defaultNetworkAdded || i > 0) { + // Only check the first default network + $directNetworkElement.find("#network_direct_checkbox").removeAttr("checked"); + } + defaultNetworkAdded = true; + } else { + $directNetworkElement = $networkSecondaryDirectTemplate.clone().attr("id", "direct"+networks[i].id); + } + $directNetworkElement.find("#network_direct_checkbox").data("jsonObj", networks[i]); + $directNetworkElement.find("#network_direct_name").text(networks[i].name); + $directNetworkElement.find("#network_direct_desc").text(networks[i].displaytext); + if (networks[i].isdefault) { + $networkDirectContainer.append($directNetworkElement.show()); + } else { + availableSecondary = true; + $networkDirectSecondaryContainer.append($directNetworkElement.show()); + } + } + } + + // Add any additional shared direct networks + $.ajax({ + data: createURL("command=listNetworks&isshared=true&zoneId="+$thisPopup.find("#wizard_zone").val()), + dataType: "json", + async: false, + success: function(json) { + var sharedNetworks = json.listnetworksresponse.network; + if (sharedNetworks != null && sharedNetworks.length > 0) { + for (var i = 0; i < sharedNetworks.length; i++) { + if (sharedNetworks[i].type != 'Direct') { + continue; + } + if (sharedNetworks[i].isdefault) { + if (requiredVirtual) { + continue; + } + $directNetworkElement = $networkDirectTemplate.clone().attr("id", "direct"+sharedNetworks[i].id); + if (defaultNetworkAdded || i > 0) { + // Only check the first default network + $directNetworkElement.find("#network_direct_checkbox").removeAttr("checked"); + } + defaultNetworkAdded = true; + } else { + $directNetworkElement = $networkSecondaryDirectTemplate.clone().attr("id", "direct"+sharedNetworks[i].id); + } + $directNetworkElement.find("#network_direct_checkbox").data("jsonObj", sharedNetworks[i]); + $directNetworkElement.find("#network_direct_name").text(sharedNetworks[i].name); + $directNetworkElement.find("#network_direct_desc").text(sharedNetworks[i].displaytext); + if (sharedNetworks[i].isdefault) { + $networkDirectContainer.append($directNetworkElement.show()); + } else { + availableSecondary = true; + $networkDirectSecondaryContainer.append($directNetworkElement.show()); + } + } + } + } + }); + if (availableSecondary) { + $("#secondary_network_title, #secondary_network_desc").show(); + } + } + }); + } + + + function vmWizardShowSecurityGroupContainer($thisPopup) { + $thisPopup.find("#step4").find("#network_container").hide(); + if($selectedVmWizardTemplate.data("hypervisor") != "VMware" && getDirectAttachSecurityGroupsEnabled() == "true") { + $thisPopup.find("#step4").find("#securitygroup_container").show(); + $thisPopup.find("#step4").find("#for_no_network_support").hide(); + $thisPopup.find("#step4").find("#security_group_section").show(); + $thisPopup.find("#step5").find("#wizard_review_network").text("Basic Network"); + } + else { + $thisPopup.find("#step4").find("#securitygroup_container").hide(); + + $thisPopup.find("#step4").find("#for_no_network_support").show(); + if($selectedVmWizardTemplate.data("hypervisor") == "VMware") { + $thisPopup.find("#step4").find("#for_no_network_support").find("#not_available_message_1").show(); + $thisPopup.find("#step4").find("#for_no_network_support").find("#not_available_message_2").hide(); + } + else if(getDirectAttachSecurityGroupsEnabled() != "true") { + $thisPopup.find("#step4").find("#for_no_network_support").find("#not_available_message_1").hide(); + $thisPopup.find("#step4").find("#for_no_network_support").find("#not_available_message_2").show(); + } + + $thisPopup.find("#step5").find("#wizard_review_network").text("Basic Network"); + } + } + $vmPopup.find("#next_step").bind("click", function(event) { event.preventDefault(); event.stopPropagation(); @@ -851,182 +1032,50 @@ function initVMWizard() { var zoneObj = $thisPopup.find("#wizard_zone option:selected").data("zoneObj"); - if (zoneObj.securitygroupsenabled == false) { //Select Network - $thisPopup.find("#step4").find("#network_container").show(); - $thisPopup.find("#step4").find("#securitygroup_container").hide(); - $thisPopup.find("#step4").find("#for_no_network_support").hide(); - - var networkName = "Virtual Network"; - var networkDesc = "A dedicated virtualized network for your account. The broadcast domain is contained within a VLAN and all public network access is routed out by a virtual router."; - $.ajax({ - data: createURL("command=listNetworks&domainid="+g_domainid+"&account="+g_account+"&zoneId="+$thisPopup.find("#wizard_zone").val()), + if (zoneObj.securitygroupsenabled == false) { //show network container + vmWizardShowNetworkContainer($thisPopup); + } + else if (zoneObj.securitygroupsenabled == true) { // if security group is enabled + var hasDedicatedDirectTaggedDefaultNetwork = false; + $.ajax({ + data: createURL("command=listNetworks&type=Direct&domainid="+g_domainid+"&account="+g_account+"&zoneId="+$thisPopup.find("#wizard_zone").val()), dataType: "json", async: false, success: function(json) { - var networks = json.listnetworksresponse.network; - var virtualNetwork = null; - if (networks != null && networks.length > 0) { - for (var i = 0; i < networks.length; i++) { - if (networks[i].type == 'Virtual') { - virtualNetwork = networks[i]; + var items = json.listnetworksresponse.network; + if (items != null && items.length > 0) { + for (var i = 0; i < items.length; i++) { + if(items[i].isshared == false && items[i].isdefault == true) { //dedicated, is default one. + var broadcasturi = items[i].broadcasturi; //e.g. "vlan://53" + if(broadcasturi != null && broadcasturi.length > 0) { + var vlanIdString = broadcasturi.substring(7); //e.g. "53" + if(isNaN(vlanIdString) == false) + hasDedicatedDirectTaggedDefaultNetwork = true; + } } } } - var $virtualNetworkElement = $("#vm_popup #network_virtual_container"); - - // Setup Virtual Networks - var requiredVirtual = false; - var defaultNetworkAdded = false; - var availableSecondary = false; - if (virtualNetwork == null) { - $.ajax({ - data: createURL("command=listNetworkOfferings&guestiptype=Virtual"), - dataType: "json", - async: false, - success: function(json) { - var networkOfferings = json.listnetworkofferingsresponse.networkoffering; - if (networkOfferings != null && networkOfferings.length > 0) { - for (var i = 0; i < networkOfferings.length; i++) { - if (networkOfferings[i].isdefault == true && networkOfferings[i].availability != "Unavailable") { - // Create a network from this. - $.ajax({ - data: createURL("command=createNetwork&networkOfferingId="+networkOfferings[i].id+"&name="+todb(networkName)+"&displayText="+todb(networkDesc)+"&zoneId="+$thisPopup.find("#wizard_zone").val()), - dataType: "json", - async: false, - success: function(json) { - var network = json.createnetworkresponse.network; - $virtualNetworkElement.show(); - if (network.networkofferingavailability == 'Required') { - requiredVirtual = true; - $virtualNetworkElement.find("#network_virtual").attr('disabled', true); - } - defaultNetworkAdded = true; - $virtualNetworkElement.find("#network_virtual").data("id", network.id).data("jsonObj", network); - } - }); - } - } - } - } - }); - } else { - if (virtualNetwork.networkofferingavailability != 'Unavailable') { - $virtualNetworkElement.show(); - if (virtualNetwork.networkofferingavailability == 'Required') { - requiredVirtual = true; - $virtualNetworkElement.find("#network_virtual").attr('disabled', true); - } - defaultNetworkAdded = true; - $virtualNetworkElement.data("id", virtualNetwork.id); - $virtualNetworkElement.find("#network_virtual").data("id", virtualNetwork.id).data("jsonObj", virtualNetwork); - } else { - $virtualNetworkElement.hide(); - } - } - - // Setup Direct Networks - var $networkDirectTemplate = $("#wizard_network_direct_template"); - var $networkSecondaryDirectTemplate = $("#wizard_network_direct_secondary_template"); - var $networkDirectContainer = $("#network_direct_container").empty(); - var $networkDirectSecondaryContainer = $("#network_direct_secondary_container").empty(); - - if (networks != null && networks.length > 0) { - for (var i = 0; i < networks.length; i++) { - if (networks[i].type != 'Direct') { - continue; - } - var $directNetworkElement = null; - if (networks[i].isdefault) { - if (requiredVirtual) { - continue; - } - $directNetworkElement = $networkDirectTemplate.clone().attr("id", "direct"+networks[i].id); - if (defaultNetworkAdded || i > 0) { - // Only check the first default network - $directNetworkElement.find("#network_direct_checkbox").removeAttr("checked"); - } - defaultNetworkAdded = true; - } else { - $directNetworkElement = $networkSecondaryDirectTemplate.clone().attr("id", "direct"+networks[i].id); - } - $directNetworkElement.find("#network_direct_checkbox").data("jsonObj", networks[i]); - $directNetworkElement.find("#network_direct_name").text(networks[i].name); - $directNetworkElement.find("#network_direct_desc").text(networks[i].displaytext); - if (networks[i].isdefault) { - $networkDirectContainer.append($directNetworkElement.show()); - } else { - availableSecondary = true; - $networkDirectSecondaryContainer.append($directNetworkElement.show()); - } - } - } - - // Add any additional shared direct networks - $.ajax({ - data: createURL("command=listNetworks&isshared=true&zoneId="+$thisPopup.find("#wizard_zone").val()), - dataType: "json", - async: false, - success: function(json) { - var sharedNetworks = json.listnetworksresponse.network; - if (sharedNetworks != null && sharedNetworks.length > 0) { - for (var i = 0; i < sharedNetworks.length; i++) { - if (sharedNetworks[i].type != 'Direct') { - continue; - } - if (sharedNetworks[i].isdefault) { - if (requiredVirtual) { - continue; - } - $directNetworkElement = $networkDirectTemplate.clone().attr("id", "direct"+sharedNetworks[i].id); - if (defaultNetworkAdded || i > 0) { - // Only check the first default network - $directNetworkElement.find("#network_direct_checkbox").removeAttr("checked"); - } - defaultNetworkAdded = true; - } else { - $directNetworkElement = $networkSecondaryDirectTemplate.clone().attr("id", "direct"+sharedNetworks[i].id); - } - $directNetworkElement.find("#network_direct_checkbox").data("jsonObj", sharedNetworks[i]); - $directNetworkElement.find("#network_direct_name").text(sharedNetworks[i].name); - $directNetworkElement.find("#network_direct_desc").text(sharedNetworks[i].displaytext); - if (sharedNetworks[i].isdefault) { - $networkDirectContainer.append($directNetworkElement.show()); - } else { - availableSecondary = true; - $networkDirectSecondaryContainer.append($directNetworkElement.show()); - } - } - } - } - }); - if (availableSecondary) { - $("#secondary_network_title, #secondary_network_desc").show(); - } } - }); - } - else if (zoneObj.securitygroupsenabled == true) { // Select Security Group - $thisPopup.find("#step4").find("#network_container").hide(); - if($selectedVmWizardTemplate.data("hypervisor") != "VMware" && getDirectAttachSecurityGroupsEnabled() == "true") { - $thisPopup.find("#step4").find("#securitygroup_container").show(); - $thisPopup.find("#step4").find("#for_no_network_support").hide(); - $thisPopup.find("#step4").find("#security_group_section").show(); - $thisPopup.find("#step5").find("#wizard_review_network").text("Basic Network"); - } - else { - $thisPopup.find("#step4").find("#securitygroup_container").hide(); - - $thisPopup.find("#step4").find("#for_no_network_support").show(); - if($selectedVmWizardTemplate.data("hypervisor") == "VMware") { - $thisPopup.find("#step4").find("#for_no_network_support").find("#not_available_message_1").show(); - $thisPopup.find("#step4").find("#for_no_network_support").find("#not_available_message_2").hide(); - } - else if(getDirectAttachSecurityGroupsEnabled() != "true") { - $thisPopup.find("#step4").find("#for_no_network_support").find("#not_available_message_1").hide(); - $thisPopup.find("#step4").find("#for_no_network_support").find("#not_available_message_2").show(); - } - - $thisPopup.find("#step5").find("#wizard_review_network").text("Basic Network"); + }); + + if(hasDedicatedDirectTaggedDefaultNetwork == true) { + $("#dialog_confirmation") + .text(dictionary["message.launch.vm.on.private.network"]) + .dialog("option", "buttons", { + "Yes": function() { + //present the current UI we have today + vmWizardShowNetworkContainer($thisPopup); + $(this).dialog("close"); + }, + "No": function() { + //present security groups for user to select + vmWizardShowSecurityGroupContainer($thisPopup); + $(this).dialog("close"); + } + }).dialog("open"); + } + else { + vmWizardShowSecurityGroupContainer($thisPopup); } } }