cloudstack/ui/scripts/cloud.core.network.js
Manuel Amador (Rudd-O) 05c020e1f6 Source code committed
2010-08-11 09:13:29 -07:00

1760 lines
86 KiB
JavaScript

/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
// Version: @VERSION@
function showNetworkingTab(p_domainId, p_account) {
//*** Network (begin) ****************************************************************************
activateDialog($("#dialog_acquire_public_ip").dialog({
width: 325,
autoOpen: false,
modal: true,
zIndex: 2000
}));
//*** Acquire New IP (begin) ***
$.ajax({
data: createURL("command=listZones&available=true&response=json"+maxPageSize),
dataType: "json",
success: function(json) {
var zones = json.listzonesresponse.zone;
var zoneSelect = $("#dialog_acquire_public_ip #acquire_zone").empty();
if (zones != null && zones.length > 0) {
for (var i = 0; i < zones.length; i++) {
zoneSelect.append("<option value='" + zones[i].id + "'>" + sanitizeXSS(zones[i].name) + "</option>");
}
}
}
});
$(".add_publicipbutton").bind("click", function(event) {
var submenuContent = $("#submenu_content_network");
$("#dialog_acquire_public_ip").dialog('option', 'buttons', {
"Acquire": function() {
$("#submenu_content_network #overlay_white").show();
$("#submenu_content_network #loading_gridtable").find("#message").text("Acquiring New IP....");
$("#submenu_content_network #loading_gridtable").show();
var thisDialog = $(this);
var zoneid = thisDialog.find("#acquire_zone").val();
thisDialog.dialog("close");
$.ajax({
data: createURL("command=associateIpAddress&zoneid="+zoneid+"&response=json"),
dataType: "json",
success: function(json) {
var items = json.associateipaddressresponse.publicipaddress;
$("#dialog_info").html("<p>The IP address <b>"+items[0].ipaddress+"</b> has been assigned to your account</p>").dialog("open");
$("#submenu_content_network #overlay_white").hide();
$("#submenu_content_network #loading_gridtable").hide();
if(isAdmin() || isDomainAdmin()) {
ipListContainer.empty(); //clear search result if there is.
var template = ipTemplate.clone();
ipJsonToPanel(items[0], template);
ipListContainer.append(template.show());
showPfLbArea(items[0].ipaddress, items[0].domainid, items[0].account);
} else {
RefreshIpDropDown(items[0].ipaddress);
}
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
$("#submenu_content_network #overlay_white").hide();
$("#submenu_content_network #loading_gridtable").hide();
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
});
$("#dialog_acquire_public_ip").dialog("open");
return false;
});
var ipListContainer = $("#submenu_content_network #ip_list_container");
var ipTemplate = $("#ip_template");
function refreshIpListContainer(strCmd) {
$("#pf_lb_area").hide();
$("#pf_lb_area_blank").hide();
$("#show_last_search").hide();
ipListContainer.empty();
$.ajax({
data: createURL(strCmd),
dataType: "json",
success: function(json) {
var items = json.listpublicipaddressesresponse.publicipaddress;
if(items != null && items.length > 0) {
if (items.length > 1) {
for(var i=0; i < items.length; i++) {
var template = ipTemplate.clone();
ipJsonToPanel(items[i], template);
ipListContainer.append(template.show());
}
} else {
var template = ipTemplate.clone();
ipJsonToPanel(items[0], template);
ipListContainer.append(template.show());
template.find("#ip_manage").hide();
if(isIpManageable(items[0].domainid, items[0].account) == true) {
showPfLbArea(items[0].ipaddress, items[0].domainid, items[0].account);
listLoadBalancerRules();
refreshCreateLoadBalancerRow();
listPortForwardingRules();
refreshCreatePortForwardingRow();
$("#create_port_forwarding_row #add_link").data("ip", items[0].ipaddress);
$("#create_load_balancer_row #add_link").data("ip", items[0].ipaddress);
} else {
$("#pf_lb_area_blank p").text("This IP address is managed by the CloudStack for use with System VMs.");
$("#pf_lb_area_blank").show();
}
}
} else {
$("#pf_lb_area_blank p").text("Unable to find any IP Addresses. Please try again.");
$("#pf_lb_area_blank").show();
}
},
error : function(XMLHttpResponse) {
$("#pf_lb_area_blank p").text("Unable to find any IP Addresses. Please try again.");
$("#pf_lb_area_blank").show();
}
});
}
function refreshIpListContainerByInputBox() {
var ip = $("#submenu_content_network #admin_ip_search").val();
$("#submenu_content_network #admin_ip_search").autocomplete("close");
if(ip != null && ip.length >0) {
refreshIpListContainer("command=listPublicIpAddresses&response=json&forvirtualnetwork=true&ipaddress=" + ip);
}
}
$("#submenu_content_network #admin_ip_search").autocomplete({
source: function(request, response) {
$.ajax({
data: createURL("command=listPublicIpAddresses&response=json&forvirtualnetwork=true&ipaddress=" + request.term),
dataType: "json",
success: function(json) {
var items = json.listpublicipaddressesresponse.publicipaddress;
var ipArray = [];
if(items != null && items.length > 0) {
for(var i=0; i < items.length; i++)
ipArray.push(items[i].ipaddress);
}
response(ipArray);
}
});
},
minLength: 2
});
$("#submenu_content_network #admin_ip_search").bind("keypress", function(event) {
if(event.keyCode == keycode_Enter) {
$("#submenu_content_network #ip_searchbutton1").click();
return false;
}
});
$("#submenu_content_network #search_by_account").bind("keypress", function(event) {
if(event.keyCode == keycode_Enter) {
$("#submenu_content_network #ip_searchbutton2").click();
return false;
}
});
//watermark (begin)
$("#submenu_content_network #admin_ip_search").bind('focus', function(event){
if($(this).val() == "By Public IP Address") {
$(this).val("");
$(this).removeClass("ipwatermark_text");
}
});
$("#submenu_content_network #admin_ip_search").bind('blur', function(event){
if($(this).val() == "") {
$(this).val("By Public IP Address");
$(this).addClass("ipwatermark_text");
}
});
$("#submenu_content_network #search_by_account").bind('focus', function(event){
if($(this).val() == "By Account") {
$(this).val("");
$(this).removeClass("ipwatermark_text");
}
});
$("#submenu_content_network #search_by_account").bind('blur', function(event){
if($(this).val() == "") {
$(this).val("By Account");
$(this).addClass("ipwatermark_text");
}
});
//watermark (end)
$("#submenu_content_network #ip_searchbutton1").bind("click", refreshIpListContainerByInputBox);
function populateDomainDropdown() {
var domainSelect = $("#submenu_content_network #search_by_domain").empty();
$.ajax({
data: createURL("command=listDomains&available=true&response=json"+maxPageSize),
dataType: "json",
success: function(json) {
var domains = json.listdomainsresponse.domain;
if (domains != null && domains.length > 0) {
for (var i = 0; i < domains.length; i++) {
domainSelect.append("<option value='" + domains[i].id + "'>" + sanitizeXSS(domains[i].name) + "</option>");
}
}
}
});
}
$("#submenu_content_network #ip_searchbutton2").bind("click", function(event){
var array1 = [];
var account = $("#submenu_content_network #search_by_account").val();
if(account != null && account.length > 0)
array1.push("&account=" + account);
var domainId = $("#submenu_content_network #search_by_domain").val();
array1.push("&domainid=" + domainId);
refreshIpListContainer("command=listPublicIpAddresses&response=json&forvirtualnetwork=true" + array1.join(""));
return false;
});
function RefreshIpDropDown(ipAddress) {
var array1 = [];
// "p_domainId!=null" and "p_account!=null" means redirected from "IPs" link in Accounts tab to here(new Network tab)
if (p_domainId!=null && p_domainId.length > 0)
array1.push("&domainid="+p_domainId);
if (p_account!=null && p_account.length > 0)
array1.push("&account="+p_account);
$.ajax({
data: createURL("command=listPublicIpAddresses&response=json&forvirtualnetwork=true" + array1.join("")),
dataType: "json",
success: function(json) {
var items = json.listpublicipaddressesresponse.publicipaddress;
if(items != null && items.length > 0) {
var ipSelect = $("#submenu_content_network #ip_select").empty();
for(var i=0; i < items.length; i++) {
ipSelect.append("<option value='" + items[i].ipaddress + "'>" + items[i].ipaddress + "</option>");
}
if(ipAddress != null)
ipSelect.val(ipAddress);
ipSelect.change();
}
}
});
}
function ipJsonToPanel(json, panel) {
panel.find("#ip_release").show();
panel.attr("id", "ip"+json.ipaddress).data("ip", json.ipaddress).data("domainid", json.domainid).data("account", json.account);
panel.find("#ip_manage").data("ip", json.ipaddress).data("domainid", json.domainid).data("account", json.account);
panel.data("ip_domainid", json.domainid).data("ip_account", json.account);
panel.find("#ipaddress").text(json.ipaddress);
panel.find("#zonename").text(json.zonename);
panel.find("#allocated").text(json.allocated);
panel.find("#vlanname").text(json.vlanname);
panel.find("#source_nat").text((json.issourcenat=="true")?"Yes":"No");
panel.find("#network_type").text((json.forvirtualnetwork=="true")? "Public":"Direct");
panel.find("#domain").text(json.domain);
panel.find("#account").text(json.account);
var ipAddress = json.ipaddress;
if (json.issourcenat != "true" && json.forvirtualnetwork =="true") {
panel.find("#ip_release").data("ip", json.ipaddress).show();
} else {
panel.find("#ip_release").hide();
}
if(isIpManageable(json.domainid, json.account) == true && !isUser())
panel.find("#ip_manage").show();
}
var ipPanel = $("#submenu_content_network #network_container");
$("#submenu_content_network #ip_select").bind("change", function(event) {
var ipAddress = $(this).val();
if(ipAddress != null && ipAddress.length > 0) {
$.ajax({
data: createURL("command=listPublicIpAddresses&ipaddress="+ipAddress+"&response=json"),
dataType: "json",
success: function(json) {
var items = json.listpublicipaddressesresponse.publicipaddress;
if(items != null && items.length > 0) {
var item = items[0];
ipJsonToPanel(item, ipPanel);
showPfLbArea(ipAddress, item.domainid, item.account);
}
}
});
}
return false;
});
function isIpManageable(domainid, account) {
if((g_domainid == domainid && g_account == account) || (isAdmin() && account!="system"))
return true;
else
return false;
}
function showPfLbArea(ipAddress, domainid, account) {
//show portForwarding/loadBalancer if Ip is manageable
if(isIpManageable(domainid, account) == true) {
ipPanel.data("ip_domainid", domainid).data("ip_account", account).data("ip_address", ipAddress);
listLoadBalancerRules();
refreshCreateLoadBalancerRow();
listPortForwardingRules();
refreshCreatePortForwardingRow();
$("#create_port_forwarding_row #add_link").data("ip", ipAddress);
$("#create_load_balancer_row #add_link").data("ip", ipAddress);
$("#pf_lb_area").show();
$("#pf_lb_area_blank").hide();
}
//hide portForwarding/loadBalancer if IP is not manageable
else {
$("#pf_lb_area").hide();
$("#pf_lb_area_blank p").text("This IP address is managed by the CloudStack for use with System VMs.");
$("#pf_lb_area_blank").show();
}
}
function hidePfLbArea() {
$("#pf_lb_area").hide();
$("#pf_lb_area_blank").hide();
}
//*** Acquire New IP (end) ***
//*** Port Forwarding (begin) ***
var createPortForwardingRow = $("#submenu_content_network #port_forwarding_panel #create_port_forwarding_row");
var portForwardingGrid = $("#submenu_content_network #port_forwarding_panel #grid_content");
function listPortForwardingRules() {
var ipSelected = $("#submenu_content_network #ip_select").val();
if (!isUser()) {
ipSelected = ipPanel.data("ip_address");
}
if(ipSelected == null || ipSelected.length == 0)
return;
$.ajax({
data: createURL("command=listPortForwardingRules&ipaddress=" + ipSelected + "&response=json"),
dataType: "json",
success: function(json) {
var items = json.listportforwardingrulesresponse.portforwardingrule;
portForwardingGrid.empty();
if (items != null && items.length > 0) {
for (var i = 0; i < items.length; i++) {
var template = $("#port_forwarding_template").clone(true);
portForwardingJsonToTemplate(items[i], template);
portForwardingGrid.append(template.show());
}
}
}
});
}
function refreshCreatePortForwardingRow() {
createPortForwardingRow.find("#public_port").val("");
createPortForwardingRow.find("#private_port").val("");
createPortForwardingRow.find("#protocol").val("TCP");
$.ajax({
data: createURL("command=listVirtualMachines&response=json&domainid="+ipPanel.data("ip_domainid")+"&account="+ipPanel.data("ip_account")+maxPageSize),
dataType: "json",
success: function(json) {
var instances = json.listvirtualmachinesresponse.virtualmachine;
var vmSelect = createPortForwardingRow.find("#vm").empty();
if (instances != null && instances.length > 0) {
for (var i = 0; i < instances.length; i++) {
var html = $("<option value='" + instances[i].id + "'>" + getVmName(instances[i].name, instances[i].displayname) + "</option>");
vmSelect.append(html);
}
}
}
});
}
var portForwardingIndex = 0;
function portForwardingJsonToTemplate(json, template) {
(portForwardingIndex++ % 2 == 0)? template.find("#row_container").addClass("smallrow_even"): template.find("#row_container").addClass("smallrow_odd");
template.attr("id", "portForwarding_" + json.id).data("portForwardingId", json.id);
template.find("#row_container #public_port").text(json.publicport);
template.find("#row_container_edit #public_port").text(json.publicport);
template.find("#row_container #private_port").text(json.privateport);
template.find("#row_container_edit #private_port").val(json.privateport);
template.find("#row_container #protocol").text(json.protocol);
template.find("#row_container_edit #protocol").text(json.protocol);
template.find("#row_container #vm_name").text(json.vmname);
var virtualMachineId = json.virtualmachineid;
$.ajax({
data: createURL("command=listVirtualMachines&response=json&domainid="+ipPanel.data("ip_domainid")+"&account="+ipPanel.data("ip_account")+maxPageSize),
dataType: "json",
success: function(json) {
var instances = json.listvirtualmachinesresponse.virtualmachine;
var vmSelect = template.find("#row_container_edit #vm").empty();
if (instances != null && instances.length > 0) {
for (var i = 0; i < instances.length; i++) {
var html = $("<option value='" + instances[i].id + "'>" + getVmName(instances[i].name, instances[i].displayname) + "</option>");
vmSelect.append(html);
}
vmSelect.val(virtualMachineId);
}
}
});
var loadingImg = template.find(".adding_loading");
var rowContainer = template.find("#row_container");
var rowContainerEdit = template.find("#row_container_edit");
template.find("#delete_link").unbind("click").bind("click", function(event){
loadingImg.find(".adding_text").text("Deleting....");
loadingImg.show();
rowContainer.hide();
$.ajax({
data: createURL("command=deletePortForwardingRule&response=json&id="+json.id),
dataType: "json",
success: function(json) {
template.slideUp("slow", function(){
$(this).remove();
});
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
loadingImg.hide();
rowContainer.show();
}
});
return false;
});
template.find("#edit_link").unbind("click").bind("click", function(event){
rowContainer.hide();
rowContainerEdit.show();
});
template.find("#cancel_link").unbind("click").bind("click", function(event){
rowContainer.show();
rowContainerEdit.hide();
});
template.find("#save_link").unbind("click").bind("click", function(event){
// validate values
var isValid = true;
isValid &= validateNumber("Private Port", rowContainerEdit.find("#private_port"), rowContainerEdit.find("#private_port_errormsg"), 1, 65535);
if (!isValid) return;
var loadingImg = template.find(".adding_loading");
loadingImg.find(".adding_text").text("Saving....");
loadingImg.show();
rowContainerEdit.hide();
var ipAddress = $("#submenu_content_network #ip_select").val();
if (!isUser()) {
ipAddress = ipPanel.data("ip_address");
}
var publicPort = rowContainerEdit.find("#public_port").text();
var privatePort = rowContainerEdit.find("#private_port").val();
var protocol = rowContainerEdit.find("#protocol").text();
var virtualMachineId = rowContainerEdit.find("#vm").val();
var array1 = [];
array1.push("&publicip="+ipAddress);
array1.push("&privateport="+privatePort);
array1.push("&publicport="+publicPort);
array1.push("&protocol="+protocol);
array1.push("&virtualmachineid=" + virtualMachineId);
$.ajax({
data: createURL("command=updatePortForwardingRule&response=json"+array1.join("")),
dataType: "json",
success: function(json) {
var jobId = json.updateportforwardingruleresponse.jobid;
var timerKey = "updateportforwardingruleJob"+jobId;
$("body").everyTime(2000, timerKey, function() {
$.ajax({
data: createURL("command=queryAsyncJobResult&jobId="+jobId+"&response=json"),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
} else {
$("body").stopTime(timerKey);
if (result.jobstatus == 1) { // Succeeded
var items = result.portforwardingrule;
portForwardingJsonToTemplate(items[0],template);
loadingImg.hide();
rowContainer.show();
} else if (result.jobstatus == 2) { //Fail
loadingImg.hide();
rowContainer.show();
$("#dialog_alert").html("<p>" + sanitizeXSS(result.jobresult) + "</p>").dialog("open");
}
}
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
$("body").stopTime(timerKey);
loadingImg.hide();
rowContainer.show();
}
});
}, 0);
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
loadingImg.hide();
rowContainer.show();
}
});
});
}
createPortForwardingRow.find("#add_link").bind("click", function(event){
// validate values
var isValid = true;
isValid &= validateNumber("Public Port", createPortForwardingRow.find("#public_port"), createPortForwardingRow.find("#public_port_errormsg"), 1, 65535);
isValid &= validateNumber("Private Port", createPortForwardingRow.find("#private_port"), createPortForwardingRow.find("#private_port_errormsg"), 1, 65535);
if (!isValid) return;
var template = $("#port_forwarding_template").clone();
portForwardingGrid.append(template.show());
var loadingImg = template.find(".adding_loading");
var rowContainer = template.find("#row_container");
loadingImg.find(".adding_text").text("Adding....");
loadingImg.show();
rowContainer.hide();
var ipAddress = $(this).data("ip");
var publicPort = createPortForwardingRow.find("#public_port").val();
var privatePort = createPortForwardingRow.find("#private_port").val();
var protocol = createPortForwardingRow.find("#protocol").val();
var virtualMachineId = createPortForwardingRow.find("#vm").val();
var array1 = [];
array1.push("&ipaddress="+ipAddress);
array1.push("&privateport="+privatePort);
array1.push("&publicport="+publicPort);
array1.push("&protocol="+protocol);
array1.push("&virtualmachineid=" + virtualMachineId);
$.ajax({
data: createURL("command=createPortForwardingRule&response=json"+array1.join("")),
dataType: "json",
success: function(json) {
var items = json.createportforwardingruleresponse.portforwardingrule;
portForwardingJsonToTemplate(items[0],template);
loadingImg.hide();
rowContainer.show();
refreshCreatePortForwardingRow();
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
template.slideUp("slow", function() {
$(this).remove();
});
}
});
return false;
});
//*** Port Forwarding (end) ***
//*** Load Balancer (begin) ***
var createLoadBalancerRow = $("#submenu_content_network #load_balancer_panel #create_load_balancer_row");
var loadBalancerGrid = $("#submenu_content_network #load_balancer_panel #grid_content");
function listLoadBalancerRules() {
var ipSelected = $("#submenu_content_network #ip_select").val();
if (!isUser()) {
ipSelected = ipPanel.data("ip_address");
}
if(ipSelected == null || ipSelected.length == 0)
return;
$.ajax({
data: createURL("command=listLoadBalancerRules&publicip=" + ipSelected + "&response=json"),
dataType: "json",
success: function(json) {
var items = json.listloadbalancerrulesresponse.loadbalancerrule;
loadBalancerGrid.empty();
if (items != null && items.length > 0) {
for (var i = 0; i < items.length; i++) {
var template = $("#load_balancer_template").clone(true);
loadBalancerJsonToTemplate(items[i], template);
loadBalancerGrid.append(template.show());
}
}
}
});
}
function refreshCreateLoadBalancerRow() {
createLoadBalancerRow.find("#name").val("");
createLoadBalancerRow.find("#public_port").val("");
createLoadBalancerRow.find("#private_port").val("");
createLoadBalancerRow.find("#algorithm_select").val("roundrobin");
}
var loadBalancerIndex = 0;
function loadBalancerJsonToTemplate(json, template) {
(loadBalancerIndex++ % 2 == 0)? template.find("#row_container").addClass("smallrow_even"): template.find("#row_container").addClass("smallrow_odd");
var loadBalancerId = json.id;
template.attr("id", "loadBalancer_" + loadBalancerId).data("loadBalancerId", loadBalancerId);
template.find("#row_container #name").text(json.name);
template.find("#row_container_edit #name").val(json.name);
template.find("#row_container #public_port").text(json.publicport);
template.find("#row_container_edit #public_port").text(json.publicport);
template.find("#row_container #private_port").text(json.privateport);
template.find("#row_container_edit #private_port").val(json.privateport);
template.find("#row_container #algorithm").text(json.algorithm);
template.find("#row_container_edit #algorithm").val(json.algorithm);
template.find("#manage_link").unbind("click").bind("click", function(event){
var vmSubgrid = template.find("#vm_subgrid");
if(vmSubgrid.css("display") == "none") {
vmSubgrid.empty();
$.ajax({
cache: false,
data: createURL("command=listLoadBalancerRuleInstances&id="+loadBalancerId+"&response=json"),
dataType: "json",
success: function(json) {
var instances = json.listloadbalancerruleinstancesresponse.loadbalancerruleinstance;
if (instances != null && instances.length > 0) {
for (var i = 0; i < instances.length; i++) {
var lbVmTemplate = $("#load_balancer_vm_template").clone();
var obj = {"loadBalancerId": loadBalancerId, "vmId": instances[i].id, "vmName": getVmName(instances[i].name, instances[i].displayname), "vmPrivateIp": instances[i].privateip};
lbVmObjToTemplate(obj, lbVmTemplate);
template.find("#vm_subgrid").append(lbVmTemplate.show());
}
}
}
});
vmSubgrid.show();
}
else {
vmSubgrid.hide();
}
var addVmToLbRow = template.find("#add_vm_to_lb_row");
(addVmToLbRow.css("display") == "none")?addVmToLbRow.show():addVmToLbRow.hide();
return false;
});
var loadingContainer = template.find("#loading_container");
var rowContainer = template.find("#row_container");
var rowContainerEdit = template.find("#row_container_edit");
template.find("#delete_link").unbind("click").bind("click", function(event){
loadingContainer.find(".adding_text").text("Deleting....");
loadingContainer.show();
rowContainer.hide();
$.ajax({
data: createURL("command=deleteLoadBalancerRule&id="+loadBalancerId+"&response=json"),
dataType: "json",
success: function(json) {
var lbJSON = json.deleteloadbalancerruleresponse;
var timerKey = "deleteLoadBalancerRuleJob_"+lbJSON.jobid;
$("body").everyTime(
5000,
timerKey,
function() {
$.ajax({
data: createURL("command=queryAsyncJobResult&jobId="+lbJSON.jobid+"&response=json"),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
} else {
$("body").stopTime(timerKey);
if (result.jobstatus == 1) { // Succeeded
template.slideUp("slow", function() {
$(this).remove();
});
} else if (result.jobstatus == 2) { // Failed
loadingContainer.hide();
rowContainer.show();
}
}
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
$("body").stopTime(timerKey);
loadingContainer.hide();
rowContainer.show();
}
});
},
0
);
}
});
return false;
});
template.find("#edit_link").unbind("click").bind("click", function(event){
rowContainer.hide();
rowContainerEdit.show();
});
template.find("#cancel_link").unbind("click").bind("click", function(event){
rowContainer.show();
rowContainerEdit.hide();
});
template.find("#save_link").unbind("click").bind("click", function(event){
// validate values
var isValid = true;
isValid &= validateString("Name", rowContainerEdit.find("#name"), rowContainerEdit.find("#name_errormsg"));
isValid &= validateNumber("Private Port", rowContainerEdit.find("#private_port"), rowContainerEdit.find("#private_port_errormsg"), 1, 65535);
if (!isValid) return;
var loadingContainer = template.find(".adding_loading");
loadingContainer.find(".adding_text").text("Saving....");
loadingContainer.show();
rowContainerEdit.hide();
var name = rowContainerEdit.find("#name").val();
var privatePort = rowContainerEdit.find("#private_port").val();
var algorithm = rowContainerEdit.find("#algorithm_select").val();
var array1 = [];
array1.push("&id=" + loadBalancerId);
array1.push("&name=" + name);
array1.push("&privateport=" + privatePort);
array1.push("&algorithm=" + algorithm);
$.ajax({
data: createURL("command=updateLoadBalancerRule&response=json"+array1.join("")),
dataType: "json",
success: function(json) {
var jobId = json.updateloadbalancerruleresponse.jobid;
var timerKey = "updateloadbalancerruleJob"+jobId;
$("body").everyTime(2000, timerKey, function() {
$.ajax({
data: createURL("command=queryAsyncJobResult&jobId="+jobId+"&response=json"),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
} else {
$("body").stopTime(timerKey);
if (result.jobstatus == 1) { // Succeeded
var items = result.loadbalancer;
loadBalancerJsonToTemplate(items[0],template);
loadingContainer.hide();
rowContainer.show();
} else if (result.jobstatus == 2) { //Fail
loadingContainer.hide();
rowContainer.show();
$("#dialog_alert").html("<p>" + sanitizeXSS(result.jobresult) + "</p>").dialog("open");
}
}
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
$("body").stopTime(timerKey);
loadingContainer.hide();
rowContainer.show();
}
});
}, 0);
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
loadingContainer.hide();
rowContainer.show();
}
});
});
refreshLbVmSelect(template, json.id);
template.find("#add_vm_to_lb_row #add_link").unbind("click").bind("click", function(event){
var vmOption = template.find("#add_vm_to_lb_row #vm_select option:selected");
var vmId = vmOption.val();
var vmName = vmOption.data("vmName");
var vmPrivateIp = vmOption.data("vmPrivateIp");
if(vmId == null || vmId.length == 0)
return;
var loading = template.find("#adding_loading").show();
var rowContainer = template.find("#adding_row_container").hide();
$.ajax({
data: createURL("command=assignToLoadBalancerRule&id="+loadBalancerId+"&virtualmachineid="+vmId+"&response=json"),
dataType: "json",
success: function(json) {
var lbInstanceJSON = json.assigntoloadbalancerruleresponse;
var timerKey = "lbInstanceNew"+lbInstanceJSON.jobid;
$("body").everyTime(
5000,
timerKey,
function() {
$.ajax({
data: createURL("command=queryAsyncJobResult&jobId="+lbInstanceJSON.jobid+"&response=json"),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
} else {
$("body").stopTime(timerKey);
if (result.jobstatus == 1) { // Succeeded
var lbVmTemplate = $("#load_balancer_vm_template").clone();
var obj = {"loadBalancerId": loadBalancerId, "vmId": vmId, "vmName": vmName, "vmPrivateIp": vmPrivateIp};
lbVmObjToTemplate(obj, lbVmTemplate);
template.find("#vm_subgrid").append(lbVmTemplate.show());
refreshLbVmSelect(template, loadBalancerId);
loading.hide();
rowContainer.show();
} else if (result.jobstatus == 2) { // Failed
$("#dialog_error").html("<p style='color:red'><b>Operation error:</b></p><br/><p style='color:red'>"+ sanitizeXSS(result.jobresult)+"</p>").dialog("open");
loading.hide();
rowContainer.show();
}
}
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
$("body").stopTime(timerKey);
loading.hide();
rowContainer.show();
}
});
},
0
);
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
loading.hide();
rowContainer.show();
}
});
return false;
});
}
function lbVmObjToTemplate(obj, template) {
template.find("#vm_name").text(obj.vmName);
template.find("#vm_private_ip").text(obj.vmPrivateIp);
template.find("#delete_link").bind("click", function(event){
var loading = template.find("#deleting_loading").show();
var rowContainer = template.find("#deleting_row_container").hide();
$.ajax({
data: createURL("command=removeFromLoadBalancerRule&id="+obj.loadBalancerId+"&virtualmachineid="+obj.vmId+"&response=json"),
dataType: "json",
success: function(json) {
var lbJSON = json.removefromloadbalancerruleresponse;
var timerKey = "removeVmFromLb"+obj.vmId;
$("body").everyTime(
5000,
timerKey,
function() {
$.ajax({
data: createURL("command=queryAsyncJobResult&jobId="+lbJSON.jobid+"&response=json"),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
} else {
$("body").stopTime(timerKey);
if (result.jobstatus == 1) { // Succeeded
refreshLbVmSelect($("#loadBalancer_" + obj.loadBalancerId), obj.loadBalancerId);
template.fadeOut("slow", function(event) {
$(this).remove();
});
} else if (result.jobstatus == 2) { // Failed
$("#dialog_error").html("<p style='color:red'>We were unable to remove the Virtual Instance: "+vmName + " from your load balancer policy. Please try again.").dialog("open");
loading.hide();
rowContainer.show();
}
}
},
error: function(XMLHttpResponse) {
$("body").stopTime(timerKey);
handleError(XMLHttpResponse);
loading.hide();
rowContainer.show();
}
});
},
0
);
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
loading.hide();
rowContainer.show();
}
});
return false;
});
}
function refreshLbVmSelect(template, loadBalancerId) {
var vmSelect = template.find("#add_vm_to_lb_row #vm_select");
// Load the select box with the VMs that haven't been applied a LB rule to.
$.ajax({
cache: false,
data: createURL("command=listLoadBalancerRuleInstances&id="+loadBalancerId+"&applied=false&response=json"),
dataType: "json",
success: function(json) {
var instances = json.listloadbalancerruleinstancesresponse.loadbalancerruleinstance;
vmSelect.empty();
if (instances != null && instances.length > 0) {
for (var i = 0; i < instances.length; i++) {
var vmName = getVmName(instances[i].name, instances[i].displayname);
html = $("<option value='" + instances[i].id + "'>" + vmName + "</option>")
html.data("vmPrivateIp", instances[i].privateip).data("vmName", vmName);
vmSelect.append(html);
}
} else {
vmSelect.append("<option value=''>None Available</option>");
}
}
});
}
createLoadBalancerRow.find("#add_link").bind("click", function(event){
// validate values
var isValid = true;
isValid &= validateString("Name", createLoadBalancerRow.find("#name"), createLoadBalancerRow.find("#name_errormsg"));
isValid &= validateNumber("Public Port", createLoadBalancerRow.find("#public_port"), createLoadBalancerRow.find("#public_port_errormsg"), 1, 65535);
isValid &= validateNumber("Private Port", createLoadBalancerRow.find("#private_port"), createLoadBalancerRow.find("#private_port_errormsg"), 1, 65535);
if (!isValid) return;
var template = $("#load_balancer_template").clone();
loadBalancerGrid.append(template.show());
var loadingImg = template.find(".adding_loading");
var rowContainer = template.find("#row_container");
loadingImg.find(".adding_text").text("Adding....");
loadingImg.show();
rowContainer.hide();
var ipAddress = $(this).data("ip");
var name = createLoadBalancerRow.find("#name").val();
var publicPort = createLoadBalancerRow.find("#public_port").val();
var privatePort = createLoadBalancerRow.find("#private_port").val();
var algorithm = createLoadBalancerRow.find("#algorithm_select").val();
var array1 = [];
array1.push("&publicip="+ipAddress);
array1.push("&name="+name);
array1.push("&publicport="+publicPort);
array1.push("&privateport="+privatePort);
array1.push("&algorithm="+algorithm);
$.ajax({
data: createURL("command=createLoadBalancerRule&response=json"+array1.join("")),
dataType: "json",
success: function(json) {
var items = json.createloadbalancerruleresponse.loadbalancerrule;
loadBalancerJsonToTemplate(items[0],template);
loadingImg.hide();
rowContainer.show();
refreshCreateLoadBalancerRow();
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
template.slideUp("slow", function() {
$(this).remove();
});
}
});
return false;
});
//*** Load Balancer (begin) ***
$("#submenu_network").bind("click", function(event) {
currentSubMenu.removeClass().addClass("submenu_links_off");
currentSubMenu = $(this);
currentSubMenu.removeClass().addClass("submenu_links_on");
var submenuContent = $("#submenu_content_network").show();
$("#submenu_content_network_groups").hide();
if(isAdmin() || isDomainAdmin()) {
submenuContent.find(".select_directipbg_admin").show();
submenuContent.find(".select_directipbg_user").hide();
populateDomainDropdown();
} else {
submenuContent.find(".select_directipbg_admin").hide();
submenuContent.find(".select_directipbg_user").show();
RefreshIpDropDown();
}
return false;
});
var ipMid = $("#submenu_content_network #ip_descriptionbox_mid");
$("#submenu_content_network #show_last_search").bind("click", function(event){
$("#submenu_content_network").find("#show_last_search").hide();
hidePfLbArea();
var ips = ipListContainer.children();
for (var i = 0; i < ips.length; i++) {
var ip = $(ips[i]);
ip.show();
if(isIpManageable(ip.data("domainid"), ip.data("account")) == true)
ip.find("#ip_manage").show();
}
return false;
});
ipListContainer.bind("click", function(event) {
var target = $(event.target);
var id = target.attr("id");
var targetIp = target.data("ip");
var domainid = target.data("domainid");
var account = target.data("account");
switch (id) {
case "ip_manage" :
var ips = ipListContainer.children();
var ipSelected = null;
var first = false;
ipMid.css("height", ipMid.height());
for (var i = 0; i < ips.length; i++) {
var ip = $(ips[i]);
if (ip.data("ip") != targetIp) {
ip.fadeOut("fast");
} else {
if (i == 0) first = true;
var ipPosition = ip.position();
ipSelected = ip.css("position", "absolute").css("top", ipPosition.top);
}
}
var animationSpeed = 2000;
if (first) {
animationSpeed = 500;
}
ipSelected.animate({top: '24px'}, animationSpeed, function() {
$(this).css("position", "static").css("float", "left");
ipMid.css("height", "auto");
target.hide();
$("#submenu_content_network").find("#show_last_search").show();
showPfLbArea(targetIp, domainid, account);
});
break;
case "ip_release" :
$("#dialog_confirmation")
.html("<p>Please confirm you want to release the IP address: <b>"+targetIp+"</b> from your account.</p>")
.dialog('option', 'buttons', {
"Confirm": function() {
$(this).dialog("close");
$("#submenu_content_network #overlay_white").show();
$("#submenu_content_network #loading_gridtable").find("#message").text("Releasing IP....");
$("#submenu_content_network #loading_gridtable").show();
$.ajax({
data: createURL("command=disassociateIpAddress&ipAddress="+targetIp+"&response=json"),
dataType: "json",
success: function(json) {
$("#dialog_info").html("<p>Your IP address <b>" + targetIp + "</b> has been released</p>").dialog("open");
$("#submenu_content_network #overlay_white").hide();
$("#submenu_content_network #loading_gridtable").hide();
if (isUser()) {
RefreshIpDropDown();
} else {
// Execute the codepath for showing last search result.
var ips = ipListContainer.children();
if(ips != null && ips.length > 0) {
for (var i = 0; i < ips.length; i++) {
var ip = $(ips[i]);
if (ip.data("ip") == targetIp) {
ip.fadeOut("fast", function(){
$(this).remove();
if(ipPanel.data("ip_address") == targetIp)
ipPanel.removeData("ip_address");
if(ipListContainer.children().length == 0) {
$("#submenu_content_network #show_last_search").hide();
} else {
$("#submenu_content_network #show_last_search").show();
$("#submenu_content_network #show_last_search").click();
}
});
}
}
}
}
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
$("#submenu_content_network #overlay_white").hide();
$("#submenu_content_network #loading_gridtable").hide();
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
break;
default :
break;
}
return false;
});
//*** Network (end) ******************************************************************************
//*** Network Group (begin) **********************************************************************
function networkGroupJSONToTemplate(json, template) {
(index++ % 2 == 0)? template.addClass("smallrow_even"): template.addClass("smallrow_odd");
template.attr("id", "networkGroup_"+json.id).data("networkGroupId", json.id).data("domainId", json.domainid).data("account",json.account).data("networkGroupName", sanitizeXSS(json.name));
template.find("#delete_link, #ingress_rule_link").data("parent_template_id", "networkGroup_"+json.id);
template.find("#id").text(json.id);
template.find("#name").text(json.name);
template.find("#description").text(json.description);
template.find("#domain").text(json.domain);
template.find("#account").text(json.account);
// disable delete link from the default group
if(json.name == 'default' && json.description == 'Default Network Group') {
template.find("#delete_link").hide();
} else {
if(json.ingressrule == null || json.ingressrule.length == 0)
template.find("#delete_link").show();
else
template.find("#delete_link").hide();
}
}
function listNetworkGroups() {
var submenuContent = $("#submenu_content_network_groups");
var commandString;
var advanced = submenuContent.find("#search_button").data("advanced");
if (advanced != null && advanced) {
var name = submenuContent.find("#advanced_search #adv_search_name").val();
var virtualMachineId = submenuContent.find("#advanced_search #adv_search_vm").val();
var domainId = submenuContent.find("#advanced_search #adv_search_domain").val();
var account = submenuContent.find("#advanced_search #adv_search_account").val();
var moreCriteria = [];
if (name!=null && trim(name).length > 0)
moreCriteria.push("&networkgroupname="+encodeURIComponent(trim(name)));
if (virtualMachineId!=null && virtualMachineId.length > 0)
moreCriteria.push("&virtualmachineid="+encodeURIComponent(virtualMachineId));
if (domainId!=null && domainId.length > 0)
moreCriteria.push("&domainid="+domainId);
if (account!=null && account.length > 0)
moreCriteria.push("&account="+account);
commandString = "command=listNetworkGroups&page=" + currentPage + moreCriteria.join("") + "&response=json";
} else {
var moreCriteria = [];
if(domainId!=null)
moreCriteria.push("&domainid="+domainId);
var searchInput = submenuContent.find("#search_input").val();
if (searchInput != null && searchInput.length > 0)
commandString = "command=listNetworkGroups&page=" + currentPage + moreCriteria.join("") + "&keyword=" + searchInput + "&response=json"
else
commandString = "command=listNetworkGroups&page=" + currentPage + moreCriteria.join("") + "&response=json";
}
//listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate);
listItems(submenuContent, commandString, "listnetworkgroupsresponse", "networkgroup", $("#network_group_template"), networkGroupJSONToTemplate);
}
submenuContentEventBinder($("#submenu_content_network_groups"), listNetworkGroups);
$("#submenu_network_groups").bind("click", function(event) {
currentSubMenu.removeClass().addClass("submenu_links_off");
currentSubMenu = $(this);
currentSubMenu.removeClass().addClass("submenu_links_on");
var submenuContent = $("#submenu_content_network_groups").show();
$("#submenu_content_network").hide();
if (isAdmin())
submenuContent.find("#adv_search_domain_li, #adv_search_account_li").show();
currentPage = 1;
listNetworkGroups();
return false;
});
$("#submenu_content_network_groups").find("#grid_content").bind("click", function(event) {
var link = $(event.target);
var parentTemplateId = link.data("parent_template_id");
var template = $(("#"+parentTemplateId));
var networkGroupId = template.data("networkGroupId");
var domainId = template.data("domainId");
var account = template.data("account");
var networkGroupId = template.data("networkGroupId");
var networkGroupName = template.data("networkGroupName");
var submenuContent = $("#submenu_content_network_groups");
switch(event.target.id) {
case "delete_link":
if(template.find("#ingress_rule_panel").css("display")=="block") //if network group's ingress rule grid is poped down, close it.
template.find("#ingress_rule_grid").click();
var loadingImg = template.find(".adding_loading");
var rowContainer = template.find("#row_container");
loadingImg.find(".adding_text").text("Deleting....");
loadingImg.show();
rowContainer.hide();
var array1 = [];
array1.push("&domainid="+domainId);
array1.push("&account="+account);
array1.push("&name="+networkGroupName);
$.ajax({
data: createURL("command=deleteNetworkGroup&response=json" + array1.join("")),
dataType: "json",
success: function(json) {
template.slideUp("slow", function() { $(this).remove() });
changeGridRowsTotal(submenuContent.find("#grid_rows_total"), -1);
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
loadingImg.hide();
rowContainer.show();
}
});
break;
case "ingress_rule_link":
var expanded = link.data("expanded");
if (expanded == null || expanded == false) {
$.ajax({
data: createURL("command=listNetworkGroups"+"&domainid="+domainId+"&account="+account+"&networkgroupname="+networkGroupName+"&response=json"),
dataType: "json",
success: function(json) {
var items = json.listnetworkgroupsresponse.networkgroup[0].ingressrule;
var grid = template.find("#ingress_rule_grid");
if(grid.find("#network_group_ingress_rule_add_row").length==0) {
var row = $("#network_group_ingress_rule_add_row").clone().show();
row.find("#network_group_ingress_rule_add_link").data("parent_template_id", parentTemplateId);
grid.append(row);
}
if (items != null && items.length > 0) {
grid.empty();
//need to append "add ingress rule" row again after emptying grid.
var row = $("#network_group_ingress_rule_add_row").clone().show();
row.find("#network_group_ingress_rule_add_link").data("parent_template_id", parentTemplateId);
grid.append(row);
for (var i = 0; i < items.length; i++) {
var newTemplate = $("#network_group_ingress_rule_template").clone(true);
ingressRuleJSONToTemplate(items[i], newTemplate).data("parentNetworkGroupId", networkGroupId).data("parentNetworkGroupDomainId", domainId).data("parentNetworkGroupAccount", account).data("parentNetworkGroupName",networkGroupName);
grid.append(newTemplate.show());
}
}
link.removeClass().addClass("vm_botactionslinks_up");
template.find("#ingress_rule_panel").slideDown("slow");
link.data("expanded", true);
}
});
} else {
link.removeClass().addClass("vm_botactionslinks_down");
template.find("#ingress_rule_panel").slideUp("slow");
link.data("expanded", false);
}
break;
case "network_group_ingress_rule_add_link":
dialogAddIngressRule.find("#start_port").val("");
cleanErrMsg(dialogAddIngressRule.find("#start_port"), dialogAddIngressRule.find("#start_port_errormsg"));
dialogAddIngressRule.find("#end_port").val("");
cleanErrMsg(dialogAddIngressRule.find("#end_port"), dialogAddIngressRule.find("#end_port_errormsg"));
dialogAddIngressRule.find("#protocol").val("TCP");
dialogAddIngressRule.find("#cidr_container").empty();
dialogAddIngressRule.find("#add_more_cidr").click();
dialogAddIngressRule.find("#account_networkgroup_container").empty();
dialogAddIngressRule.find("#add_more_account_networkgroup").click();
$("#dialog_add_ingress_rule")
.dialog('option', 'buttons', {
"Add": function() {
var thisDialog = $(this);
var moreCriteria = [];
moreCriteria.push("&domainid="+domainId);
moreCriteria.push("&account="+account);
moreCriteria.push("&networkgroupname="+networkGroupName);
var protocol = thisDialog.find("#protocol").val();
if (protocol!=null && protocol.length > 0)
moreCriteria.push("&protocol="+encodeURIComponent(protocol));
// validate values (begin)
var isValid = true;
if(protocol == "ICMP") {
isValid &= validateNumber("Type", thisDialog.find("#icmp_type"), thisDialog.find("#icmp_type_errormsg"), -1, 40, false); //required
isValid &= validateNumber("Code", thisDialog.find("#icmp_code"), thisDialog.find("#icmp_code_errormsg"), -1 , 15, false); //required
}
else { //TCP, UDP
isValid &= validateNumber("Start Port", thisDialog.find("#start_port"), thisDialog.find("#start_port_errormsg"), 1, 65535, false); //required
isValid &= validateNumber("End Port", thisDialog.find("#end_port"), thisDialog.find("#end_port_errormsg"), 1, 65535, false); //required
}
if(thisDialog.find("input[name='ingress_rule_type']:checked").val() == "cidr") {
isValid &= validateCIDR("CIDR", thisDialog.find(".cidr_template").eq(0).find("#cidr"), thisDialog.find(".cidr_template").eq(0).find("#cidr_errormsg"), false); //required
for(var i=1; i<thisDialog.find(".cidr_template").length; i++)
isValid &= validateCIDR("CIDR", thisDialog.find(".cidr_template").eq(i).find("#cidr"), thisDialog.find(".cidr_template").eq(0).find("#cidr_errormsg"), true); //optional
}
else if(thisDialog.find("input[name='ingress_rule_type']:checked").val() == "account_networkgroup") {
isValid &= validateString("Account", thisDialog.find(".account_networkgroup_template").eq(0).find("#account"), thisDialog.find(".account_networkgroup_template").eq(0).find("#account_networkgroup_template_errormsg"), false); //required
isValid &= validateString("Network Group", thisDialog.find(".account_networkgroup_template").eq(0).find("#networkgroup"), thisDialog.find(".account_networkgroup_template").eq(0).find("#account_networkgroup_template_errormsg"), false); //required
for(var i=1; i<thisDialog.find(".account_networkgroup_template").length; i++) {
isValid &= validateString("Account", thisDialog.find(".account_networkgroup_template").eq(i).find("#account"), thisDialog.find(".account_networkgroup_template").eq(0).find("#account_networkgroup_template_errormsg"), true); //optional
isValid &= validateString("Network Group", thisDialog.find(".account_networkgroup_template").eq(i).find("#networkgroup"), thisDialog.find(".account_networkgroup_template").eq(0).find("#account_networkgroup_template_errormsg"), true); //optional
}
}
if (!isValid) return;
// validate values (end)
if(protocol == "ICMP") {
var icmpType = thisDialog.find("#icmp_type").val();
if (icmpType!=null && icmpType.length > 0)
moreCriteria.push("&icmptype="+encodeURIComponent(icmpType));
var icmpCode = thisDialog.find("#icmp_code").val();
if (icmpCode!=null && icmpCode.length > 0)
moreCriteria.push("&icmpcode="+encodeURIComponent(icmpCode));
}
else { //TCP, UDP
var startPort = thisDialog.find("#start_port").val();
if (startPort!=null && startPort.length > 0)
moreCriteria.push("&startport="+encodeURIComponent(startPort));
var endPort = thisDialog.find("#end_port").val();
if (endPort!=null && endPort.length > 0)
moreCriteria.push("&endport="+encodeURIComponent(endPort));
}
if(dialogAddIngressRule.find("input[name='ingress_rule_type']:checked").val() == "cidr") {
var array1 = [];
var cidrElementArray = dialogAddIngressRule.find(".cidr_template").find("#cidr");
for(var i=0; i<cidrElementArray.length; i++) {
if(cidrElementArray[i].value.length > 0)
array1.push(cidrElementArray[i].value);
}
if(array1.length > 0)
moreCriteria.push("&cidrlist="+encodeURIComponent(array1.join(",")));
}
else if(dialogAddIngressRule.find("input[name='ingress_rule_type']:checked").val() == "account_networkgroup") {
var accountElementArray = dialogAddIngressRule.find(".account_networkgroup_template").find("#account");
var networkgroupElementArray = dialogAddIngressRule.find(".account_networkgroup_template").find("#networkgroup");
for(var i=0; i<accountElementArray.length; i++) {
if(networkgroupElementArray[i].value.length > 0 && accountElementArray[i].value.length > 0)
moreCriteria.push("&usernetworkgrouplist["+i+"].account="+accountElementArray[i].value+"&usernetworkgrouplist["+i+"].group="+networkgroupElementArray[i].value);
}
}
thisDialog.dialog("close");
var ingressRuleTemplate = $("#network_group_ingress_rule_template").clone(true);
var loadingImg = ingressRuleTemplate.find(".adding_loading");
var rowContainer = ingressRuleTemplate.find("#row_container");
loadingImg.find(".adding_text").text("Adding....");
loadingImg.show();
rowContainer.hide();
template.find("#ingress_rule_grid").append(ingressRuleTemplate.fadeIn("slow"));
template.find("#ingress_rule_grid").find("#no_ingress_rule").hide();
$.ajax({
data: createURL("command=authorizeNetworkGroupIngress"+moreCriteria.join("")+"&response=json"),
dataType: "json",
success: function(json) {
var jobId = json.authorizenetworkgroupingress.jobid;
var timerKey = "ingressRuleJob_"+jobId;
ingressRuleTemplate.attr("id","ingressRule_"+jobId); //temporary id until API call returns real id
$("body").everyTime(
5000,
timerKey,
function() {
$.ajax({
data: createURL("command=queryAsyncJobResult&jobId="+jobId+"&response=json"),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
} else {
$("body").stopTime(timerKey);
if (result.jobstatus == 1) { // Succeeded
var items = result.networkgroup[0].ingressrule;
ingressRuleJSONToTemplate(items[0], ingressRuleTemplate).data("parentNetworkGroupId", networkGroupId).data("parentNetworkGroupDomainId", domainId).data("parentNetworkGroupAccount", account).data("parentNetworkGroupName",networkGroupName);
if(items.length > 1) {
for(var i=1; i<items.length; i++) {
var ingressRuleTemplate2 = $("#network_group_ingress_rule_template").clone(true);
ingressRuleJSONToTemplate(items[i], ingressRuleTemplate2).data("parentNetworkGroupId", networkGroupId).data("parentNetworkGroupDomainId", domainId).data("parentNetworkGroupAccount", account).data("parentNetworkGroupName",networkGroupName);
template.find("#ingress_rule_grid").append(ingressRuleTemplate2.fadeIn("slow"));
}
}
loadingImg.hide();
rowContainer.show();
//hide delete link of network group. (network group is not allowed to delete if it is not empty. i.e. having ingress rule(s)
template.find("#delete_link").hide();
} else if (result.jobstatus == 2) { // Failed
$("#dialog_alert").text("Unable to add ingress rule due to the error: " + result.jobresult).dialog("open");
ingressRuleTemplate.slideUp("slow", function() {
$(this).remove();
});
}
}
},
error: function(XMLHttpResponse) {
$("body").stopTime(timerKey);
handleError(XMLHttpResponse);
ingressRuleTemplate.slideUp("slow", function() {
$(this).remove();
});
}
});
},
0
);
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
ingressRuleTemplate.slideUp("slow", function() {
$(this).remove();
});
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
break;
}
return false;
});
activateDialog($("#dialog_add_network_groups").dialog({
autoOpen: false,
modal: true,
zIndex: 2000
}));
activateDialog($("#dialog_add_ingress_rule").dialog({
width: 400,
autoOpen: false,
modal: true,
zIndex: 2000
}));
function ingressRuleJSONToTemplate(json, template) {
(index++ % 2 == 0)? template.addClass("smallrow_even"): template.addClass("smallrow_odd");
template.attr("id", "ingressRule_"+json.id).data("ingressRuleId", json.ruleid).data("protocol", json.protocol);
template.data("startPort", json.startport);
template.data("endPort", json.endport);
template.data("icmpType", json.icmptype);
template.data("icmpCode", json.icmpcode);
template.find("#id").text(json.ruleid);
template.find("#protocol").text(json.protocol);
var endpoint;
if(json.protocol == "icmp")
endpoint = "ICMP Type=" + ((json.icmptype!=null)?json.icmptype:"") + ", code=" + ((json.icmpcode!=null)?json.icmpcode:"");
else //tcp, udp
endpoint = "Port Range " + ((json.startport!=null)?json.startport:"") + "-" + ((json.endport!=null)?json.endport:"");
template.find("#endpoint").text(endpoint);
template.data("startPort", json.startport);
template.data("endPort", json.endport);
template.data("icmpType", json.icmptype);
template.data("icmpCode", json.icmpcode);
var cidrOrGroup;
if(json.cidr != null && json.cidr.length > 0)
cidrOrGroup = json.cidr;
else if (json.account != null && json.account.length > 0 && json.networkgroupname != null && json.networkgroupname.length > 0)
cidrOrGroup = json.account + "/" + json.networkgroupname;
template.find("#cidr").text(cidrOrGroup);
template.data("cidr", json.cidr);
template.data("account", json.account);
template.data("networkGroupName", json.networkgroupname);
return template;
}
$("#network_group_ingress_rule_template").bind("click", function(event) {
var template = $(this);
var parentNetworkGroupId = template.data("parentNetworkGroupId");
var parentNeteworkGroupTemplate = $("#networkGroup_" + parentNetworkGroupId);
var moreCriteria = [];
var parentNetworkGroupDomainId = template.data("parentNetworkGroupDomainId");
moreCriteria.push("&domainid="+encodeURIComponent(parentNetworkGroupDomainId));
var parentNetworkGroupAccount = template.data("parentNetworkGroupAccount");
moreCriteria.push("&account="+encodeURIComponent(parentNetworkGroupAccount));
var parentNetworkGroupName = template.data("parentNetworkGroupName");
moreCriteria.push("&networkgroupname="+encodeURIComponent(parentNetworkGroupName));
var protocol = template.data("protocol");
moreCriteria.push("&protocol="+encodeURIComponent(protocol));
if(protocol == "icmp") {
var icmpType = template.data("icmpType");
if(icmpType != null && icmpType.length > 0)
moreCriteria.push("&icmptype="+encodeURIComponent(icmpType));
var icmpCode = template.data("icmpCode");
if(icmpCode != null && icmpCode.length > 0)
moreCriteria.push("&icmpcode="+encodeURIComponent(icmpCode));
}
else { //TCP, UDP
var startPort = template.data("startPort");
if(startPort != null && startPort.length > 0)
moreCriteria.push("&startport="+encodeURIComponent(startPort));
var endPort = template.data("endPort");
if(endPort != null && endPort.length > 0)
moreCriteria.push("&endport="+encodeURIComponent(endPort));
}
var cidr = template.data("cidr")
if(cidr != null && cidr.length > 0)
moreCriteria.push("&cidrlist="+encodeURIComponent(cidr));
var account = template.data("account");
var networkGroupName = template.data("networkGroupName");
if((account != null && account.length > 0) && (networkGroupName != null && networkGroupName.length > 0))
moreCriteria.push("&usernetworkgrouplist[0].account="+account + "&usernetworkgrouplist[0].group="+networkGroupName);
var link = $(event.target);
switch(event.target.id) {
case "ingress_rule_delete_link":
var loadingImg = template.find(".adding_loading");
var rowContainer = template.find("#row_container");
loadingImg.find(".adding_text").text("Deleting....");
loadingImg.show();
rowContainer.hide();
$.ajax({
data: createURL("command=revokeNetworkGroupIngress"+moreCriteria.join("")+"&response=json"),
dataType: "json",
success: function(json) {
var jobId = json.revokenetworkgroupingress.jobid;
var timerKey = "revokeNetworkGroupIngressJob"+jobId;
$("body").everyTime(2000, timerKey, function() {
$.ajax({
data: createURL("command=queryAsyncJobResult&jobId="+jobId+"&response=json"),
dataType: "json",
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
} else {
$("body").stopTime(timerKey);
if (result.jobstatus == 1) { //success
template.slideUp("slow", function() {
$(this).remove();
//After deleting ingress rule successfully, check if this network group has any ingress rule(s) left. Show delete link of network group if no ingress rule(s) are left.
$.ajax({
data: createURL("command=listNetworkGroups&response=json&domainid="+parentNetworkGroupDomainId+"&account="+parentNetworkGroupAccount+"&networkgroupname="+parentNetworkGroupName),
dataType: "json",
success: function(json){
networkGroupJSONToTemplate(json.listnetworkgroupsresponse.networkgroup[0], parentNeteworkGroupTemplate);
}
});
});
} else if (result.jobstatus == 2) {
$("#dialog_alert").html("<p>" + sanitizeXSS(result.jobresult) + "</p>").dialog("open");
loadingImg.hide();
rowContainer.show();
}
}
},
error: function(XMLHttpResponse) {
$("body").stopTime(timerKey);
handleError(XMLHttpResponse);
loadingImg.hide();
rowContainer.show();
}
});
}, 0);
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
loadingImg.hide();
rowContainer.show();
}
});
break;
}
return false;
});
//*** event handler of dialog_add_ingress_rule (begin) ***
var dialogAddIngressRule = $("#dialog_add_ingress_rule");
dialogAddIngressRule.find("#add_more_cidr").bind("click", function(event){
dialogAddIngressRule.find("#cidr_container").append($("#cidr_template").clone().show());
return false;
});
dialogAddIngressRule.find("#add_more_cidr").click();
dialogAddIngressRule.find("#add_more_account_networkgroup").bind("click", function(event){
dialogAddIngressRule.find("#account_networkgroup_container").append($("#account_networkgroup_template").clone().show());
return false;
});
dialogAddIngressRule.find("#add_more_account_networkgroup").click();
dialogAddIngressRule.find("input[name='ingress_rule_type']").change(function(){
if(dialogAddIngressRule.find("input[name='ingress_rule_type']:checked").val() == "cidr") {
//enable CIDR
dialogAddIngressRule.find(".cidr_template, #add_more_cidr").removeAttr("disabled");
//disable Account/Network Group, clear up error fields
dialogAddIngressRule.find(".account_networkgroup_template, #add_more_account_networkgroup").attr("disabled", "disabled");
cleanErrMsg(dialogAddIngressRule.find(".account_networkgroup_template").find("#account"), dialogAddIngressRule.find(".account_networkgroup_template").find("#account_networkgroup_template_errormsg"));
cleanErrMsg(dialogAddIngressRule.find(".account_networkgroup_template").find("#networkgroup"), dialogAddIngressRule.find(".account_networkgroup_template").find("#account_networkgroup_template_errormsg"));
}
else if(dialogAddIngressRule.find("input[name='ingress_rule_type']:checked").val() == "account_networkgroup") {
//enable Account/Network Group
dialogAddIngressRule.find(".account_networkgroup_template, #add_more_account_networkgroup").removeAttr("disabled");
//disable CIDR, clear up error fields
dialogAddIngressRule.find(".cidr_template, #add_more_cidr").attr("disabled", "disabled");
cleanErrMsg(dialogAddIngressRule.find(".cidr_template").find("#cidr"), dialogAddIngressRule.find(".cidr_template").find("#cidr_errormsg"));
}
});
dialogAddIngressRule.find("input[name='ingress_rule_type']").change();
dialogAddIngressRule.find("#protocol").bind("change", function(event){
var thisDropDown = $(this);
if(thisDropDown.val() == "ICMP") {
dialogAddIngressRule.find("#icmp_type_container, #icmp_code_container").show();
dialogAddIngressRule.find("#icmp_type, #icmp_code").val("-1");
dialogAddIngressRule.find("#start_port_container, #end_port_container").hide();
dialogAddIngressRule.find("#start_port, #end_port").val("");
cleanErrMsg(dialogAddIngressRule.find("#start_port"), dialogAddIngressRule.find("#start_port_errormsg"));
cleanErrMsg(dialogAddIngressRule.find("#end_port"), dialogAddIngressRule.find("#end_port_errormsg"));
}
else { //TCP, UDP
dialogAddIngressRule.find("#start_port_container, #end_port_container").show();
dialogAddIngressRule.find("#icmp_type_container, #icmp_code_container").hide();
dialogAddIngressRule.find("#icmp_type, #icmp_code").val("");
cleanErrMsg(dialogAddIngressRule.find("#icmp_type"),dialogAddIngressRule.find("#icmp_type_errormsg"));
cleanErrMsg(dialogAddIngressRule.find("#icmp_code"),dialogAddIngressRule.find("#icmp_code_errormsg"));
}
return false;
});
dialogAddIngressRule.find("#protocol").change();
//*** event handler of dialog_add_ingress_rule (end) ***
$("#network_groups_action_new").bind("click", function(event){
$("#dialog_add_network_groups")
.dialog('option', 'buttons', {
"Create": function() {
var thisDialog = $(this);
// validate values
var isValid = true;
isValid &= validateString("Name", thisDialog.find("#name"), thisDialog.find("#name_errormsg"), false); //required
isValid &= validateString("Description", thisDialog.find("#description"), thisDialog.find("#description_errormsg"), true); //optional
if (!isValid) return;
var submenuContent = $("#submenu_content_network_groups");
var template = $("#network_group_template").clone(true);
var loadingImg = template.find(".adding_loading");
var rowContainer = template.find("#row_container");
loadingImg.find(".adding_text").text("Adding....");
loadingImg.show();
rowContainer.hide();
submenuContent.find("#grid_content").prepend(template.fadeIn("slow"));
var name = trim(thisDialog.find("#name").val());
var desc = trim(thisDialog.find("#description").val());
thisDialog.dialog("close");
$.ajax({
data: createURL("command=createNetworkGroup&name="+encodeURIComponent(name)+"&description="+encodeURIComponent(desc)+"&response=json"),
dataType: "json",
success: function(json) {
var items = json.createnetworkgroupresponse.networkgroup;
networkGroupJSONToTemplate(items[0], template);
changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1);
loadingImg.hide();
rowContainer.show();
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
template.slideUp("slow", function(){ $(this).remove(); } );
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
return false;
});
//*** Network Group (end) ************************************************************************
//initialize page
if(getDirectAttachNetworkGroupsEnabled() != "true")
$(".submenu_links, #submenu_content_network_groups").hide();
var currentSubMenu = $("#submenu_network");
currentSubMenu.click();
}