Merge changes/fixes

reviewed-by: alena

Update network section

-Implement add (isolated) network action

-Update list view/detail view to reflect same data as system area

-Misc. CSS fixes for list views
This commit is contained in:
bfederle 2011-12-20 13:50:38 -08:00
parent 44c38a3efc
commit 3e4547e998
5 changed files with 481 additions and 122 deletions

View File

@ -1054,6 +1054,7 @@ div.list-view td.state span {
-webkit-text-shadow: 0px 1px 1px #FFFFFF;
-o-text-shadow: 0px 1px 1px #FFFFFF;
text-shadow: 0px 1px 1px #FFFFFF;
background: url(../images/sprites.png) 1px -536px;
}
div.list-view td.state.on span {
@ -1237,7 +1238,7 @@ div.list-view td.state.off span {
height: 78%;
width: 97%;
padding-top: 7px;
overflow: hidden;
overflow: auto;
height: 591px;
margin: -4px 0 0;
}
@ -6371,6 +6372,7 @@ div.panel.ui-dialog div.list-view div.fixed-header {
left: 8px;
top: 26px;
position: absolute;
font-weight: normal;
}
.system-dashboard .status_box li.capacity span.overview.total {
@ -7710,4 +7712,3 @@ div.panel.ui-dialog div.list-view div.fixed-header {
background-color: #FFFFFF;
cursor: move !important;
}

View File

@ -218,7 +218,9 @@
action: function(args) {
var complete = args.response.success;
var error = args.response.error;
var message = args.response.message;
var startFn = args.startFn;
var createZone = function(args) {
message('Creating zone');
@ -245,6 +247,7 @@
message('Creating cluster');
setTimeout(function() {
createHost();
//error('addCluster', 'Could not create cluster.', createPod);
}, 500);
};
@ -274,7 +277,11 @@
setTimeout(complete, 5000);
};
createZone();
if (startFn) {
startFn();
} else {
createZone();
}
}
};
}(jQuery, cloudStack, testData));

View File

@ -230,8 +230,10 @@
action: function(args) {
var complete = args.response.success;
var error = args.response.error;
var message = args.response.message;
var data = args.data;
var startFn = args.startFn;
var createZone = function(args) {
message('Creating zone');
@ -388,10 +390,7 @@
args.complete({ data: { zone: zoneObj } });
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("updateNetworkServiceProvider failed. Error: " + errorMsg);
}
error: args.error
});
});
}
@ -402,13 +401,12 @@
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("configureVirtualRouterElement failed. Error: " + errorMsg);
}
error: args.error
});
});
}
},
error: args.error
});
}
else if (result.jobstatus == 2) {
@ -416,24 +414,21 @@
}
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
alert("updatePhysicalNetwork failed. Error: " + errorMsg);
}
error: args.error
});
});
}
});
//NaaS (end)
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
args.response.error(errorMsg);
}
error: args.error
});
};
addZoneAction({ data: data.zone, complete: createPod });
addZoneAction({ data: data.zone, complete: createPod, error: function(json) {
debugger;
error('addZone', parseXMLHttpResponse(json), createZone);
} });
};
var createPod = function(args) {
@ -458,7 +453,7 @@
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
args.response.error(errorMsg);
error(errorMsg);
}
});
};
@ -571,17 +566,19 @@
success: function(json) {
//var item = json.createvlaniprangeresponse.vlan;
},
error: function(XMLHttpResponse) {
//var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
//args.response.error(errorMsg);
error: function(json) {
error('addNetwork', parseXMLHttpResponse(json), function() {
createNetwork(args);
});
}
});
}
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
args.response.error(errorMsg);
error: function(json) {
error('addNetwork', parseXMLHttpResponse(json), function() {
createNetwork(args);
});
}
});
};
@ -602,6 +599,11 @@
response: {
success: function(successArgs) {
createCluster({ data: $.extend(args.data, { guestNetwork: successArgs.data })});
},
error: function(json) {
error('addNetwork', parseXMLHttpResponse(json), function() {
createNetwork(args);
});
}
},
data: {
@ -615,7 +617,7 @@
networkOfferingId: networkOfferingID
}
});
}
}
});
};
@ -638,6 +640,11 @@
cluster: data.addclusterresponse.cluster[0]
})
});
},
error: function(json) {
error('addCluster', parseXMLHttpResponse(json), function() {
createCluster(args);
});
}
});
};
@ -664,6 +671,11 @@
host: data.addhostresponse.host[0]
})
});
},
error: function(json) {
error('addHost', parseXMLHttpResponse(json), function() {
createHost(args);
});
}
});
};
@ -734,7 +746,11 @@
}, 5000);
};
createZone();
if (startFn) {
startFn();
} else {
createZone();
}
}
};
}(jQuery, cloudStack, testData));

View File

@ -54,15 +54,30 @@
sectionSelect: {
preFilter: function(args) {
var isSecurityGroupEnabled = false;
var hasIsolatedNetworks = false;
$.ajax({
url: createURL('listNetworks'),
data: {
supportedServices: 'SecurityGroup'
},
dataType: 'json',
async: false,
success: function(data) {
$.ajax({
url: createURL('listNetworks'),
data: {
type: 'isolated',
supportedServices: 'SourceNat'
},
async: false,
success: function(data) {
if (data.listnetworksresponse.network &&
data.listnetworksresponse.network.length) {
hasIsolatedNetworks = true;
}
}
});
if (data.listnetworksresponse.network &&
data.listnetworksresponse.network.length) {
isSecurityGroupEnabled = true;
@ -70,7 +85,9 @@
}
});
if (isSecurityGroupEnabled) return ['securityGroups'];
if (isSecurityGroupEnabled && !hasIsolatedNetworks) return ['securityGroups'];
if (isSecurityGroupEnabled && hasIsolatedNetworks) return ['securityGroups', 'networks'];
return ['networks'];
},
label: 'Select view'
@ -79,16 +96,95 @@
networks: {
id: 'networks',
type: 'select',
title: 'Networks',
title: 'Guest Networks',
listView: {
actions: {
add: {
label: 'Add guest network',
createForm: {
title: 'Add new guest network',
desc: 'Please specify name and zone for this network; note that network will be isolated and source NAT-enabled.',
fields: {
name: { label: 'Name', validation: { required: true } },
displayText: { label: 'Display Text', validation: { required: true }},
zoneId: {
label: 'Zone',
validation: { required: true },
select: function(args) {
$.ajax({
url: createURL('listZones'),
data: {
type: 'Advanced'
},
success: function(json) {
var zones = $.grep(json.listzonesresponse.zone, function(zone) {
return zone.networktype == 'Advanced';
});
args.response.success({
data: $.map(zones, function(zone) {
return {
id: zone.id,
description: zone.name
};
})
});
}
});
}
},
networkOfferingId: {
label: 'Network Offering',
validation: { required: true },
select: function(args) {
$.ajax({
url: createURL('listNetworkOfferings'),
data: {
supportedServices: 'SourceNat',
type: 'isolated'
},
success: function(json) {
var networkOfferings = json.listnetworkofferingsresponse.networkoffering;
args.response.success({
data: $.map(networkOfferings, function(zone) {
return {
id: zone.id,
description: zone.name
};
})
});
}
});
}
}
}
},
action: function(args) {
$.ajax({
url: createURL('createNetwork'),
data: args.data,
success: function(json) {
args.response.success({
data: { state: 'Allocated' }
});
}
});
},
messages: {
notification: function() { return 'Added guest network'; }
}
}
},
id: 'networks',
fields: {
name: { label: 'Name' },
zonename: { label: 'Zone' },
type: { label: 'Type' },
traffictype: { label: 'Traffic Type' },
gateway: { label: 'Gateway' },
state: { label: 'State', indicator: { 'Implemented': 'on', 'Setup': 'on' } }
vlan: { label: 'VLAN' },
cidr: { label: 'CIDR' },
state: { label: 'State', indicator: {
'Implemented': 'on', 'Setup': 'on', 'Allocated': 'on'
} }
},
dataProvider: function(args) {
$.ajax({
@ -112,87 +208,275 @@
},
detailView: {
name: 'Network details',
viewAll: { path: 'network.ipAddresses', label: 'Associated IP Addresses' },
name: 'Guest network details',
viewAll: {
path: '_zone.guestIpRanges',
label: 'IP ranges',
preFilter: function(args) {
if(args.context.networks[0].type == "Isolated") {
var services = args.context.networks[0].service;
if(services != null) {
for(var i=0; i < services.length; i++) {
var service = services[i];
if(service.name == "SourceNat")
return false;
}
}
}
return true;
}
},
actions: {
edit: {
label: 'Edit network',
label: 'Edit',
messages: {
notification: function() { return 'Updated network'; }
confirm: function(args) {
return 'Are you sure you want to edit network?';
},
success: function(args) {
return 'Network is being edited.';
},
notification: function(args) {
return 'Editing network';
},
complete: function(args) {
return 'Network has been edited.';
}
},
action: function(args) {
var array1 = [];
array1.push("&name=" + todb(args.data.name));
array1.push("&displaytext=" + todb(args.data.displaytext));
//args.data.networkofferingid is null when networkofferingid field is hidden
if(args.data.networkofferingid != null && args.data.networkofferingid != args.context.networks[0].networkofferingid)
array1.push("&networkofferingid=" + todb(args.data.networkofferingid));
//args.data.networkdomain is null when networkdomain field is hidden
if(args.data.networkdomain != null && args.data.networkdomain != args.context.networks[0].networkdomain)
array1.push("&networkdomain=" + todb(args.data.networkdomain));
$.ajax({
url: createURL('updateNetwork'),
data: $.extend(args.data, {
id: args.context.networks[0].id
}),
url: createURL("updateNetwork&id=" + args.context.networks[0].id + array1.join("")),
dataType: "json",
success: function(json) {
args.response.success({
_custom: {
jobId: json.updatenetworkresponse.jobid
var jid = json.updatenetworkresponse.jobid;
args.response.success(
{_custom:
{jobId: jid,
getUpdatedItem: function(json) {
var item = json.queryasyncjobresultresponse.jobresult.network;
return {data: item};
}
}
}
});
},
error: function(json) {
args.response.error(parseXMLHttpResponse(json));
);
}
});
},
notification: { poll: pollAsyncJobResult }
notification: {
poll: pollAsyncJobResult
}
},
'restart': {
label: 'Restart network',
action: function(args) {
$.ajax({
url: createURL("restartNetwork&cleanup=true&id=" + args.context.networks[0].id),
dataType: "json",
async: true,
success: function(json) {
var jid = json.restartnetworkresponse.jobid;
args.response.success(
{_custom:
{jobId: jid,
getUpdatedItem: function(json) {
return json.queryasyncjobresultresponse.jobresult.network;
}
}
}
);
}
});
},
messages: {
confirm: function(args) {
return 'Please confirm that you want to restart network';
},
success: function(args) {
return 'Network is being restarted';
},
notification: function(args) {
return 'Restarting network';
},
complete: function(args) {
return 'Network has been restarted';
}
},
notification: {
poll: pollAsyncJobResult
}
},
'delete': {
label: 'Delete network',
messages: {
confirm: function(args) {
return 'Are you sure you want to delete network ?';
},
success: function(args) {
return 'Network is being deleted.';
},
notification: function(args) {
return 'Deleting network';
},
complete: function(args) {
return 'Network has been deleted.';
}
},
action: function(args) {
$.ajax({
url: createURL("deleteNetwork&id=" + args.context.networks[0].id),
dataType: "json",
async: true,
success: function(json) {
var jid = json.deletenetworkresponse.jobid;
args.response.success(
{_custom:
{jobId: jid,
getUpdatedItem: function(json) {
return {}; //nothing in this network needs to be updated, in fact, this whole template has being deleted
}
}
}
);
}
});
},
notification: {
poll: pollAsyncJobResult
}
}
},
tabs: {
details: {
title: 'Details',
preFilter: function(args) {
var hiddenFields = [];
var zone;
$.ajax({
url: createURL('listZones'),
data: {
id: args.context.networks[0].zoneid
},
async: false,
success: function(json) {
zone = json.listzonesresponse.zone[0];
}
});
if(zone.networktype == "Basic") {
hiddenFields.push("account");
hiddenFields.push("gateway");
//hiddenFields.push("netmask");
}
if(args.context.networks[0].type == "Isolated") {
hiddenFields.push("networkofferingdisplaytext");
hiddenFields.push("networkdomaintext");
hiddenFields.push("gateway");
//hiddenFields.push("netmask");
}
else { //selectedGuestNetworkObj.type == "Shared"
hiddenFields.push("networkofferingid");
hiddenFields.push("networkdomain");
}
return hiddenFields;
},
fields: [
{
name: { label: 'Name' }
},
{
type: { label: 'Type' },
displaytext: { label: 'Description' },
traffictype: { label: 'Traffic Type' },
gateway: { label: 'Gateway' },
networkofferingid: {
label: 'Network Offering',
isEditable: true,
select: function(args) {
$.ajax({
url: createURL('listNetworkOfferings'),
data: {
state: 'enabled',
traffictype: args.context.networks[0].traffictype,
guestiptype: args.context.networks[0].type
},
success: function(json) {
args.response.success({
data: $.map(
json.listnetworkofferingsresponse.networkoffering,
function(networkOffering) {
return {
id: networkOffering.id,
description: networkOffering.name
};
}
)
});
},
error: function(json) {
args.response.error(parseXMLHttpResponse(json));
}
});
}
name: {
label: 'Name',
isEditable: true
}
},
{
startip: { label: 'Start IP' },
endip: { label: 'End IP' }
id: { label: 'ID' },
displaytext: {
label: 'Description',
isEditable: true
},
type: {
label: 'Type'
},
state: {
label: 'State'
},
restartrequired: {
label: 'Restart required',
converter: function(booleanValue) {
if(booleanValue == true)
return "<font color='red'>Yes</font>";
else if(booleanValue == false)
return "No";
}
},
vlan: { label: 'VLAN ID' },
scope: { label: 'Scope' },
networkofferingdisplaytext: { label: 'Network offering' },
networkofferingid: {
label: 'Network offering',
isEditable: true,
select: function(args){
var items = [];
$.ajax({
url: createURL("listNetworkOfferings&networkid=" + args.context.networks[0].id),
dataType: "json",
async: false,
success: function(json) {
var networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
$(networkOfferingObjs).each(function() {
items.push({id: this.id, description: this.displaytext});
});
}
});
$.ajax({
url: createURL("listNetworkOfferings&id=" + args.context.networks[0].networkofferingid), //include currently selected network offeirng to dropdown
dataType: "json",
async: false,
success: function(json) {
var networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
$(networkOfferingObjs).each(function() {
items.push({id: this.id, description: this.displaytext});
});
}
});
args.response.success({data: items});
}
},
networkofferingidText: {
label: 'Network offering ID'
},
gateway: { label: 'Gateway' },
//netmask: { label: 'Netmask' },
cidr: { label: 'CIDR' },
networkdomaintext: {
label: 'Network domain'
},
networkdomain: {
label: 'Network domain',
isEditable: true
}
}
],
dataProvider: function(args) {
args.response.success({ data: args.context.networks[0] });
dataProvider: function(args) {
args.response.success({data: args.context.networks[0]});
}
}
},
}
}
}
@ -1245,7 +1529,7 @@
poll: pollAsyncJobResult
}
});
},
},
error: function(data) {
args.response.error(parseXMLHttpResponse(data));
}

View File

@ -5,6 +5,9 @@
var $container = args.$container;
var state = {}; // Hold wizard form state
var launchStart; // Holds last launch callback, in case of error
var $launchState;
/**
* Successful installation action
*/
@ -36,8 +39,10 @@
* @param stateStepID ID to group state elements in (i.e., zone, pod, cluster, ...)
* @param $elem (optional) Element containing <form>, to serialize for state
*/
var goTo = cloudStack._goto = function(stepID, stateID, $elem) {
var $nextStep = steps[stepID]();
var goTo = cloudStack._goto = function(stepID, stateID, $elem, options) {
if (!options) options = {};
var $nextStep = steps[stepID]({ nextStep: options.nextStep });
var $body = $installWizard.find('.body');
if (stateID && $elem) {
@ -83,7 +88,7 @@
$prev.click(function() {
goTo(prevStepID);
});
return function(args) {
showDiagram(diagram);
@ -95,7 +100,7 @@
);
};
},
/**
* A standard form-based wizard step template
* -- relies on createForm for form generation
@ -134,7 +139,7 @@
$form.find('.form-item').addClass('field');
$prev.appendTo($form.find('form'));
$save.appendTo($form.find('form'));
// Submit handler
$form.find('form').submit(function() {
form.completeAction($form);
@ -153,8 +158,19 @@
$container.append($form.prepend($title));
showTooltip($form, tooltipID);
return function(args) {
var overrideGotoEvent = function(event) {
goTo(args.nextStep);
return false;
};
if (args && args.nextStep) {
$save.unbind('click');
$save.click(overrideGotoEvent);
}
// Setup diagram, tooltips
showDiagram(diagram);
setTimeout(function() {
@ -350,7 +366,7 @@
nextStepID: 'addZone',
diagram: '.part.zone'
}),
/**
* Add zone form
*/
@ -622,31 +638,66 @@
launch: function(args) {
var $intro = $('<div></div>').addClass('intro');
var $title = $('<div></div>').addClass('title')
.html('Now building your cloud...');
var $subtitle = $('<div></div>').addClass('subtitle')
.html('');
.html('Now building your cloud...').appendTo($intro);
var $subtitle = $('<div></div>').addClass('subtitle').html('').appendTo($intro);
cloudStack.installWizard.action({
data: state,
response: {
message: function(msg) {
var $li = $('<li>').html(msg);
$subtitle.append($li);
$li.siblings().addClass('complete');
},
success: function() {
goTo('complete');
}
var doAction = function() {
if (launchStart) {
$('.subtitle').children().remove();
}
});
cloudStack.installWizard.action({
data: state,
startFn: launchStart,
response: {
message: function(msg) {
var $li = $('<li>').html(msg);
if (launchStart) {
$li.appendTo('.subtitle');
$li.parent().find('li')
.filter(function() {
return this != $li.get(0);
}).addClass('complete');
} else {
$subtitle.append($li);
$li.siblings().addClass('complete');
}
},
success: function() {
goTo('complete');
},
error: function(stepID, message, callback) {
if (launchStart) {
$subtitle = $('.subtitle');
$subtitle.children().remove();
$('li').children().remove();
}
launchStart = callback;
$subtitle.find('li:last').addClass('error');
$subtitle.append(
$('<p>').html(
'Something went wrong; you may go back and correct any errors.'
),
$('<div>').addClass('button').append(
$('<span>').html('Go back')
).click(function() {
goTo(stepID, null, null, {
nextStep: 'launch'
});
})
);
}
}
});
};
doAction();
showDiagram('.part.loading');
return $intro.append(
$title, $subtitle
);
return $intro;
},
complete: function(args) {