mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
1392 lines
56 KiB
JavaScript
1392 lines
56 KiB
JavaScript
// Licensed to the Apache Software Foundation (ASF) under one
|
|
// or more contributor license agreements. See the NOTICE file
|
|
// distributed with this work for additional information
|
|
// regarding copyright ownership. The ASF licenses this file
|
|
// to you under the Apache License, Version 2.0 (the
|
|
// "License"); you may not use this file except in compliance
|
|
// with the License. You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing,
|
|
// software distributed under the License is distributed on an
|
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
// KIND, either express or implied. See the License for the
|
|
// specific language governing permissions and limitations
|
|
// under the License.
|
|
(function(cloudStack, $) {
|
|
|
|
cloudStack.sections.templates = {
|
|
title: 'label.menu.templates',
|
|
id: 'templates',
|
|
sectionSelect: {
|
|
label: 'label.select-view'
|
|
},
|
|
sections: {
|
|
templates: {
|
|
type: 'select',
|
|
title: 'label.menu.templates',
|
|
listView: {
|
|
id: 'templates',
|
|
label: 'label.menu.templates',
|
|
filters: {
|
|
all: {
|
|
preFilter: function(args) {
|
|
if (isAdmin()) //"listTemplates&templatefilter=all" only works for root-admin, but no domain-admin. Domain-admin is unable to see all templates until listTemplates API supports a new type of templatefilter for domain-admin to see all templates in his domain.
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
label: 'ui.listView.filters.all'
|
|
},
|
|
mine: { label: 'ui.listView.filters.mine' },
|
|
featured: { label: 'label.featured' },
|
|
community: { label: 'label.community' }
|
|
},
|
|
fields: {
|
|
name: { label: 'label.name' },
|
|
zonename: { label: 'label.zone' },
|
|
hypervisor: { label: 'label.hypervisor' }
|
|
},
|
|
reorder: cloudStack.api.actions.sort('updateTemplate', 'templates'),
|
|
actions: {
|
|
add: {
|
|
label: 'label.action.register.template',
|
|
messages: {
|
|
notification: function(args) {
|
|
return 'label.action.register.template';
|
|
}
|
|
},
|
|
createForm: {
|
|
title: 'label.action.register.template',
|
|
preFilter: cloudStack.preFilter.createTemplate,
|
|
fields: {
|
|
name: {
|
|
label: 'label.name',
|
|
validation: { required: true }
|
|
},
|
|
description: {
|
|
label: 'label.description',
|
|
validation: { required: true }
|
|
},
|
|
url: {
|
|
label: 'URL',
|
|
validation: { required: true }
|
|
},
|
|
zone: {
|
|
label: 'label.zone',
|
|
select: function(args) {
|
|
$.ajax({
|
|
url: createURL("listZones&available=true"),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var zoneObjs = json.listzonesresponse.zone;
|
|
var items = [];
|
|
if (isAdmin() && !(cloudStack.context.projects &&
|
|
cloudStack.context.projects[0]))
|
|
items.push({id: -1, description: "All Zones"});
|
|
$(zoneObjs).each(function() {
|
|
items.push({id: this.id, description: this.name});
|
|
});
|
|
args.response.success({data: items});
|
|
}
|
|
});
|
|
}
|
|
},
|
|
hypervisor: {
|
|
label: 'label.hypervisor',
|
|
dependsOn: 'zone',
|
|
select: function(args) {
|
|
if(args.zone == null)
|
|
return;
|
|
|
|
var apiCmd;
|
|
if(args.zone == -1)
|
|
apiCmd = "listHypervisors&zoneid=-1";
|
|
else
|
|
apiCmd = "listHypervisors&zoneid=" + args.zone;
|
|
|
|
$.ajax({
|
|
url: createURL(apiCmd),
|
|
dataType: "json",
|
|
async: false,
|
|
success: function(json) {
|
|
var hypervisorObjs = json.listhypervisorsresponse.hypervisor;
|
|
var items = [];
|
|
$(hypervisorObjs).each(function(){
|
|
items.push({id: this.name, description: this.name});
|
|
});
|
|
args.response.success({data: items});
|
|
}
|
|
});
|
|
|
|
args.$select.change(function() {
|
|
var $form = $(this).closest('form');
|
|
if($(this).val() == "VMware") {
|
|
$form.find('.form-item[rel=rootDiskControllerType]').css('display', 'inline-block');
|
|
$form.find('.form-item[rel=nicAdapterType]').css('display', 'inline-block');
|
|
$form.find('.form-item[rel=keyboardType]').css('display', 'inline-block');
|
|
}
|
|
else {
|
|
$form.find('.form-item[rel=rootDiskControllerType]').hide();
|
|
$form.find('.form-item[rel=nicAdapterType]').hide();
|
|
$form.find('.form-item[rel=keyboardType]').hide();
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
//fields for hypervisor == "VMware" (starts here)
|
|
rootDiskControllerType: {
|
|
label: 'label.root.disk.controller',
|
|
isHidden: true,
|
|
select: function(args) {
|
|
var items = []
|
|
items.push({id: "", description: ""});
|
|
items.push({id: "scsi", description: "scsi"});
|
|
items.push({id: "ide", description: "ide"});
|
|
args.response.success({data: items});
|
|
}
|
|
},
|
|
nicAdapterType: {
|
|
label: 'label.nic.adapter.type',
|
|
isHidden: true,
|
|
select: function(args) {
|
|
var items = []
|
|
items.push({id: "", description: ""});
|
|
items.push({id: "E1000", description: "E1000"});
|
|
items.push({id: "PCNet32", description: "PCNet32"});
|
|
items.push({id: "Vmxnet2", description: "Vmxnet2"});
|
|
items.push({id: "Vmxnet3", description: "Vmxnet3"});
|
|
args.response.success({data: items});
|
|
}
|
|
},
|
|
keyboardType: {
|
|
label: 'label.keyboard.type',
|
|
isHidden: true,
|
|
select: function(args) {
|
|
var items = []
|
|
items.push({id: "", description: ""});
|
|
items.push({id: "us", description: "US"});
|
|
items.push({id: "jp", description: "Japanese"});
|
|
args.response.success({data: items});
|
|
}
|
|
},
|
|
//fields for hypervisor == "VMware" (ends here)
|
|
|
|
format: {
|
|
label: 'label.format',
|
|
dependsOn: 'hypervisor',
|
|
select: function(args) {
|
|
var items = [];
|
|
if(args.hypervisor == "XenServer") {
|
|
//formatSelect.append("<option value='VHD'>VHD</option>");
|
|
items.push({id:'VHD', description: 'VHD'});
|
|
}
|
|
else if(args.hypervisor == "VMware") {
|
|
//formatSelect.append("<option value='OVA'>OVA</option>");
|
|
items.push({id:'OVA', description: 'OVA'});
|
|
}
|
|
else if(args.hypervisor == "KVM") {
|
|
//formatSelect.append("<option value='QCOW2'>QCOW2</option>");
|
|
items.push({id:'QCOW2', description: 'QCOW2'});
|
|
}
|
|
else if(args.hypervisor == "BareMetal") {
|
|
//formatSelect.append("<option value='BareMetal'>BareMetal</option>");
|
|
items.push({id:'BareMetal', description: 'BareMetal'});
|
|
}
|
|
else if(args.hypervisor == "Ovm") {
|
|
//formatSelect.append("<option value='RAW'>RAW</option>");
|
|
items.push({id:'RAW', description: 'RAW'});
|
|
}
|
|
args.response.success({data: items});
|
|
}
|
|
},
|
|
|
|
osCategory: {
|
|
label: 'OS Category',
|
|
select: function(args) {
|
|
$.ajax({
|
|
url: createURL("listOsCategories"),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var osCats = json.listoscategoriesresponse.oscategory;
|
|
var items = [];
|
|
if (isAdmin())
|
|
items.push({id: -1, description: "All OS"});
|
|
$(osCats).each(function() {
|
|
items.push({id: this.id, description: this.name});
|
|
});
|
|
args.response.success({data: items});
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
osTypeId: {
|
|
label: 'label.os.type',
|
|
dependsOn: 'osCategory',
|
|
select: function(args) {
|
|
if(args.osCategory == null)
|
|
return;
|
|
|
|
var apiCmd;
|
|
if(args.osCategory == -1)
|
|
apiCmd = "listOsTypes";
|
|
else
|
|
apiCmd = "listOsTypes&oscategoryid=" + args.osCategory;
|
|
|
|
$.ajax({
|
|
url: createURL(apiCmd),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var items = json.listostypesresponse.ostype;
|
|
args.response.success({data: items});
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
isExtractable: {
|
|
label: "extractable",
|
|
isBoolean: true
|
|
},
|
|
|
|
isPasswordEnabled: {
|
|
label: "label.password.enabled",
|
|
isBoolean: true
|
|
},
|
|
|
|
isPublic: {
|
|
label: "label.public",
|
|
isBoolean: true,
|
|
isHidden: true
|
|
},
|
|
|
|
isFeatured: {
|
|
label: "label.featured",
|
|
isBoolean: true,
|
|
isHidden: true
|
|
}
|
|
}
|
|
},
|
|
|
|
action: function(args) {
|
|
var array1 = [];
|
|
array1.push("&name=" + todb(args.data.name));
|
|
array1.push("&displayText=" + todb(args.data.description));
|
|
array1.push("&url=" + todb(args.data.url));
|
|
array1.push("&zoneid=" + args.data.zone);
|
|
array1.push("&format=" + args.data.format);
|
|
array1.push("&isextractable=" + (args.data.isExtractable=="on"));
|
|
array1.push("&passwordEnabled=" + (args.data.isPasswordEnabled=="on"));
|
|
array1.push("&osTypeId=" + args.data.osTypeId);
|
|
array1.push("&hypervisor=" + args.data.hypervisor);
|
|
|
|
if(args.$form.find('.form-item[rel=isPublic]').css("display") != "none")
|
|
array1.push("&ispublic=" + (args.data.isPublic == "on"));
|
|
if(args.$form.find('.form-item[rel=isFeatured]').css("display") != "none")
|
|
array1.push("&isfeatured=" + (args.data.isFeatured == "on"));
|
|
|
|
//VMware only (starts here)
|
|
if(args.$form.find('.form-item[rel=rootDiskControllerType]').css("display") != "none" && args.data.rootDiskControllerType != "")
|
|
array1.push("&details[0].rootDiskController=" + args.data.rootDiskControllerType);
|
|
if(args.$form.find('.form-item[rel=nicAdapterType]').css("display") != "none" && args.data.nicAdapterType != "")
|
|
array1.push("&details[0].nicAdapter=" + args.data.nicAdapterType);
|
|
if(args.$form.find('.form-item[rel=keyboardType]').css("display") != "none" && args.data.keyboardType != "")
|
|
array1.push("&details[0].keyboard=" + args.data.keyboardType);
|
|
//VMware only (ends here)
|
|
|
|
$.ajax({
|
|
url: createURL("registerTemplate" + array1.join("")),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var items = json.registertemplateresponse.template; //items might have more than one array element if it's create templates for all zones.
|
|
args.response.success({data:items[0]});
|
|
/*
|
|
if(items.length > 1) {
|
|
for(var i=1; i<items.length; i++) {
|
|
var $midmenuItem2 = $("#midmenu_item").clone();
|
|
templateToMidmenu(items[i], $midmenuItem2);
|
|
bindClickToMidMenu($midmenuItem2, templateToRightPanel, templateGetMidmenuId);
|
|
$("#midmenu_container").append($midmenuItem2.show());
|
|
}
|
|
}
|
|
*/
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
|
|
args.response.error(errorMsg);
|
|
}
|
|
});
|
|
},
|
|
|
|
notification: {
|
|
poll: function(args) {
|
|
args.complete();
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
dataProvider: function(args) {
|
|
var array1 = [];
|
|
var ignoreProject = false;
|
|
if(args.filterBy != null) {
|
|
if(args.filterBy.kind != null) {
|
|
switch(args.filterBy.kind) {
|
|
case "all":
|
|
ignoreProject = true;
|
|
array1.push("&templatefilter=all");
|
|
break;
|
|
case "mine":
|
|
array1.push("&templatefilter=self");
|
|
break;
|
|
case "featured":
|
|
ignoreProject = true;
|
|
array1.push("&templatefilter=featured");
|
|
break;
|
|
case "community":
|
|
ignoreProject = true;
|
|
array1.push("&templatefilter=community");
|
|
break;
|
|
}
|
|
}
|
|
if(args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
|
|
switch(args.filterBy.search.by) {
|
|
case "name":
|
|
if(args.filterBy.search.value.length > 0)
|
|
array1.push("&keyword=" + args.filterBy.search.value);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
$.ajax({
|
|
url: createURL("listTemplates&page=" + args.page + "&pagesize=" + pageSize + array1.join(""),
|
|
{ ignoreProject: ignoreProject }),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var items = json.listtemplatesresponse.template;
|
|
args.response.success({
|
|
actionFilter: templateActionfilter,
|
|
data: items
|
|
});
|
|
}
|
|
});
|
|
} ,
|
|
|
|
detailView: {
|
|
name: 'Template details',
|
|
actions: {
|
|
edit: {
|
|
label: 'label.edit',
|
|
action: function(args) {
|
|
var array1 = [];
|
|
array1.push("&name=" + todb(args.data.name));
|
|
array1.push("&displaytext=" + todb(args.data.displaytext));
|
|
array1.push("&ostypeid=" + args.data.ostypeid);
|
|
array1.push("&passwordenabled=" + (args.data.passwordenabled=="on"));
|
|
$.ajax({
|
|
url: createURL("updateTemplate&id=" + args.context.templates[0].id + "&zoneid=" + args.context.templates[0].zoneid + array1.join("")),
|
|
dataType: "json",
|
|
async: false,
|
|
success: function(json) {
|
|
//API returns an incomplete embedded object (some properties are missing in the embedded template object)
|
|
}
|
|
});
|
|
|
|
var array2 = [];
|
|
|
|
//array2.push("&ispublic=" + (args.data.ispublic=="on"));
|
|
if(args.data.ispublic == "on")
|
|
array2.push("&ispublic=true");
|
|
else if(args.data.ispublic == "off")
|
|
array2.push("&ispublic=false");
|
|
//if args.data.ispublic is undefined, do not pass ispublic to API call.
|
|
|
|
if(args.data.isfeatured == "on")
|
|
array2.push("&isfeatured=true");
|
|
else if(args.data.isfeatured == "off")
|
|
array2.push("&isfeatured=false");
|
|
//if args.data.isfeatured is undefined, do not pass isfeatured to API call.
|
|
|
|
if(args.data.isextractable == "on")
|
|
array2.push("&isextractable=true");
|
|
else if(args.data.isextractable == "off")
|
|
array2.push("&isextractable=false");
|
|
//if args.data.isextractable is undefined, do not pass isextractable to API call.
|
|
|
|
$.ajax({
|
|
url: createURL("updateTemplatePermissions&id=" + args.context.templates[0].id + "&zoneid=" + args.context.templates[0].zoneid + array2.join("")),
|
|
dataType: "json",
|
|
async: false,
|
|
success: function(json) {
|
|
//API doesn't return an embedded object
|
|
}
|
|
});
|
|
|
|
//So, we call listTemplates API to get a complete template object
|
|
$.ajax({
|
|
url: createURL("listTemplates&id=" + args.context.templates[0].id + "&zoneid=" + args.context.templates[0].zoneid + "&templatefilter=self"),
|
|
dataType: "json",
|
|
async: false,
|
|
success: function(json){
|
|
var item = json.listtemplatesresponse.template;
|
|
args.response.success({data: item});
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
copyTemplate: {
|
|
label: 'label.action.copy.template',
|
|
messages: {
|
|
confirm: function(args) {
|
|
return 'Are you sure you want to copy template?';
|
|
},
|
|
success: function(args) {
|
|
return 'Template is being copied.';
|
|
},
|
|
notification: function(args) {
|
|
return 'label.action.copy.template';
|
|
}
|
|
},
|
|
createForm: {
|
|
title: 'label.action.copy.template',
|
|
desc: '',
|
|
fields: {
|
|
destinationZoneId: {
|
|
label: 'label.destination.zone',
|
|
validation: { required: true },
|
|
select: function(args) {
|
|
$.ajax({
|
|
url: createURL("listZones&available=true"),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var zoneObjs = json.listzonesresponse.zone;
|
|
var items = [];
|
|
$(zoneObjs).each(function() {
|
|
if(this.id != args.context.templates[0].zoneid)
|
|
items.push({id: this.id, description: this.name});
|
|
});
|
|
args.response.success({data: items});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
},
|
|
action: function(args) {
|
|
$.ajax({
|
|
url: createURL("copyTemplate&id=" + args.context.templates[0].id + "&sourcezoneid=" + args.context.templates[0].zoneid + "&destzoneid=" + args.data.destinationZoneId),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var jid = json.copytemplateresponse.jobid;
|
|
args.response.success(
|
|
{_custom:
|
|
{jobId: jid,
|
|
getUpdatedItem: function(json) {
|
|
return {}; //nothing in this template needs to be updated
|
|
},
|
|
getActionFilter: function() {
|
|
return templateActionfilter;
|
|
}
|
|
}
|
|
}
|
|
);
|
|
}
|
|
});
|
|
},
|
|
notification: {
|
|
poll: pollAsyncJobResult
|
|
}
|
|
},
|
|
|
|
downloadTemplate: {
|
|
label: 'label.action.download.template',
|
|
messages: {
|
|
confirm: function(args) {
|
|
return 'message.action.download.template';
|
|
},
|
|
notification: function(args) {
|
|
return 'Downloading template';
|
|
},
|
|
complete: function(args) {
|
|
var url = decodeURIComponent(args.url);
|
|
var htmlMsg = _l('message.download.template');
|
|
var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url);
|
|
return htmlMsg2;
|
|
}
|
|
},
|
|
action: function(args) {
|
|
var apiCmd = "extractTemplate&mode=HTTP_DOWNLOAD&id=" + args.context.templates[0].id;
|
|
if(args.context.templates[0].zoneid != null)
|
|
apiCmd += "&zoneid=" + args.context.templates[0].zoneid;
|
|
|
|
$.ajax({
|
|
url: createURL(apiCmd),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var jid = json.extracttemplateresponse.jobid;
|
|
args.response.success(
|
|
{_custom:
|
|
{jobId: jid,
|
|
getUpdatedItem: function(json) {
|
|
return json.queryasyncjobresultresponse.jobresult.template;
|
|
},
|
|
getActionFilter: function() {
|
|
return templateActionfilter;
|
|
}
|
|
}
|
|
}
|
|
);
|
|
}
|
|
});
|
|
},
|
|
notification: {
|
|
poll: pollAsyncJobResult
|
|
}
|
|
},
|
|
|
|
remove: {
|
|
label: 'label.action.delete.template',
|
|
messages: {
|
|
confirm: function(args) {
|
|
return 'message.action.delete.template';
|
|
},
|
|
notification: function(args) {
|
|
return 'label.action.delete.template';
|
|
}
|
|
},
|
|
action: function(args) {
|
|
var array1 = [];
|
|
if (args.context.templates[0].zoneid != null)
|
|
array1.push("&zoneid=" + args.context.templates[0].zoneid);
|
|
|
|
$.ajax({
|
|
url: createURL("deleteTemplate&id=" + args.context.templates[0].id + array1.join("")),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var jid = json.deletetemplateresponse.jobid;
|
|
args.response.success(
|
|
{_custom:
|
|
{jobId: jid
|
|
}
|
|
}
|
|
);
|
|
}
|
|
});
|
|
},
|
|
notification: {
|
|
poll: pollAsyncJobResult
|
|
}
|
|
}
|
|
|
|
},
|
|
tabs: {
|
|
details: {
|
|
title: 'label.details',
|
|
|
|
preFilter: function(args) {
|
|
var hiddenFields;
|
|
if(isAdmin()) {
|
|
hiddenFields = [];
|
|
}
|
|
else {
|
|
hiddenFields = ["hypervisor"];
|
|
}
|
|
return hiddenFields;
|
|
},
|
|
|
|
fields: [
|
|
{
|
|
name: {
|
|
label: 'label.name',
|
|
isEditable: true,
|
|
validation: { required: true }
|
|
}
|
|
},
|
|
{
|
|
id: { label: 'ID' },
|
|
zonename: { label: 'label.zone.name' },
|
|
zoneid: { label: 'label.zone.id' },
|
|
displaytext: {
|
|
label: 'label.description',
|
|
isEditable: true,
|
|
validation: { required: true }
|
|
},
|
|
hypervisor: { label: 'label.hypervisor' },
|
|
templatetype: { label: 'label.type' },
|
|
isready: { label: 'state.ready', converter:cloudStack.converters.toBooleanText },
|
|
status: { label: 'label.status' },
|
|
size : {
|
|
label: 'label.size',
|
|
converter: function(args) {
|
|
if (args == null || args == 0)
|
|
return "";
|
|
else
|
|
return cloudStack.converters.convertBytes(args);
|
|
}
|
|
},
|
|
isextractable: {
|
|
label: 'extractable',
|
|
isBoolean: true,
|
|
isEditable: function() {
|
|
if(isAdmin())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
converter:cloudStack.converters.toBooleanText
|
|
},
|
|
passwordenabled: {
|
|
label: 'label.password.enabled',
|
|
isBoolean: true,
|
|
isEditable: true,
|
|
converter:cloudStack.converters.toBooleanText
|
|
},
|
|
ispublic: {
|
|
label: 'label.public',
|
|
isBoolean: true,
|
|
isEditable: function() {
|
|
if(isAdmin()) {
|
|
return true;
|
|
}
|
|
else {
|
|
if (g_userPublicTemplateEnabled == "true")
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
},
|
|
converter:cloudStack.converters.toBooleanText
|
|
},
|
|
isfeatured: {
|
|
label: 'label.featured',
|
|
isBoolean: true,
|
|
isEditable: function() {
|
|
if(isAdmin())
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
converter:cloudStack.converters.toBooleanText
|
|
},
|
|
crossZones: {
|
|
label: 'label.cross.zones',
|
|
converter:cloudStack.converters.toBooleanText
|
|
},
|
|
|
|
ostypeid: {
|
|
label: 'label.os.type',
|
|
isEditable: true,
|
|
select: function(args) {
|
|
$.ajax({
|
|
url: createURL("listOsTypes"),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var ostypes = json.listostypesresponse.ostype;
|
|
var items = [];
|
|
$(ostypes).each(function() {
|
|
items.push({id: this.id, description: this.description});
|
|
});
|
|
args.response.success({data: items});
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
domain: { label: 'label.domain' },
|
|
account: { label: 'label.account' },
|
|
created: { label: 'label.created', converter: cloudStack.converters.toLocalDate }
|
|
}
|
|
],
|
|
|
|
tags: cloudStack.api.tags({ resourceType: 'Template', contextId: 'templates' }),
|
|
|
|
|
|
dataProvider: function(args) {
|
|
var jsonObj = args.context.templates[0];
|
|
var apiCmd = "listTemplates&templatefilter=self&id=" + jsonObj.id;
|
|
if(jsonObj.zoneid != null)
|
|
apiCmd = apiCmd + "&zoneid=" + jsonObj.zoneid;
|
|
|
|
$.ajax({
|
|
url: createURL(apiCmd),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
args.response.success({
|
|
actionFilter: templateActionfilter,
|
|
data: json.listtemplatesresponse.template[0]
|
|
});
|
|
}
|
|
});
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
isos: {
|
|
type: 'select',
|
|
title: 'label.iso',
|
|
listView: {
|
|
label: 'label.iso',
|
|
filters: {
|
|
all: {
|
|
preFilter: function(args) {
|
|
if (isAdmin()) //"listIsos&filter=all" only works for root-admin, but no domain-admin. Domain-admin is unable to see all Isos until listIsos API supports a new type of isofilter for domain-admin to see all Isos in his domain.
|
|
return true;
|
|
else
|
|
return false;
|
|
},
|
|
label: 'ui.listView.filters.all'
|
|
},
|
|
mine: { label: 'ui.listView.filters.mine' },
|
|
featured: { label: 'label.featured' },
|
|
community: { label: 'label.community' }
|
|
},
|
|
fields: {
|
|
name: { label: 'label.name' },
|
|
zonename: { label: 'label.zone' }
|
|
},
|
|
|
|
reorder: cloudStack.api.actions.sort('updateIso', 'isos'),
|
|
|
|
actions: {
|
|
add: {
|
|
label: 'label.action.register.iso',
|
|
messages: {
|
|
notification: function(args) {
|
|
return 'label.action.register.iso';
|
|
}
|
|
},
|
|
createForm: {
|
|
title: 'label.action.register.iso',
|
|
preFilter: cloudStack.preFilter.createTemplate,
|
|
fields: {
|
|
name: {
|
|
label: 'label.name',
|
|
validation: { required: true }
|
|
},
|
|
description: {
|
|
label: 'label.description',
|
|
validation: { required: true }
|
|
},
|
|
url: {
|
|
label: 'URL',
|
|
validation: { required: true }
|
|
},
|
|
zone: {
|
|
label: 'label.zone',
|
|
select: function(args) {
|
|
$.ajax({
|
|
url: createURL("listZones&available=true"),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var zoneObjs = json.listzonesresponse.zone;
|
|
var items = [];
|
|
if (isAdmin() && !(cloudStack.context.projects &&
|
|
cloudStack.context.projects[0]))
|
|
items.push({id: -1, description: "All Zones"});
|
|
$(zoneObjs).each(function() {
|
|
items.push({id: this.id, description: this.name});
|
|
});
|
|
args.response.success({data: items});
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
isBootable: {
|
|
label: "label.bootable",
|
|
isBoolean: true,
|
|
isChecked: true
|
|
},
|
|
|
|
osCategory: {
|
|
label: 'OS Category',
|
|
dependsOn: 'isBootable',
|
|
select: function(args) {
|
|
$.ajax({
|
|
url: createURL("listOsCategories"),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var osCats = json.listoscategoriesresponse.oscategory;
|
|
var items = [];
|
|
if (isAdmin())
|
|
items.push({id: -1, description: "All OS"});
|
|
$(osCats).each(function() {
|
|
items.push({id: this.id, description: this.name});
|
|
});
|
|
args.response.success({data: items});
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
osTypeId: {
|
|
label: 'label.os.type',
|
|
dependsOn: ['isBootable','osCategory'],
|
|
isHidden: false,
|
|
validation: { required: true },
|
|
select: function(args) {
|
|
if(args.osCategory == null)
|
|
return;
|
|
|
|
var apiCmd;
|
|
if(args.osCategory == -1)
|
|
apiCmd = "listOsTypes";
|
|
else
|
|
apiCmd = "listOsTypes&oscategoryid=" + args.osCategory;
|
|
|
|
$.ajax({
|
|
url: createURL(apiCmd),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var osTypeObjs = json.listostypesresponse.ostype;
|
|
var items = [];
|
|
//items.push({id: "", description: "None"}); //shouldn't have None option when bootable is checked
|
|
$(osTypeObjs).each(function(){
|
|
items.push({id: this.id, description: this.description});
|
|
});
|
|
args.response.success({data: items});
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
isExtractable: {
|
|
label: "extractable",
|
|
isBoolean: true
|
|
},
|
|
|
|
isPublic: {
|
|
label: "label.public",
|
|
isBoolean: true,
|
|
isHidden: true
|
|
},
|
|
|
|
isFeatured: {
|
|
label: "label.featured",
|
|
isBoolean: true,
|
|
isHidden: true
|
|
}
|
|
}
|
|
},
|
|
|
|
|
|
action: function(args) {
|
|
var array1 = [];
|
|
array1.push("&name=" + todb(args.data.name));
|
|
array1.push("&displayText=" + todb(args.data.description));
|
|
array1.push("&url=" + todb(args.data.url));
|
|
array1.push("&zoneid=" + args.data.zone);
|
|
array1.push("&isextractable=" + (args.data.isExtractable=="on"));
|
|
array1.push("&bootable=" + (args.data.isBootable=="on"));
|
|
|
|
if(args.$form.find('.form-item[rel=osTypeId]').css("display") != "none")
|
|
array1.push("&osTypeId=" + args.data.osTypeId);
|
|
|
|
if(args.$form.find('.form-item[rel=isPublic]').css("display") != "none")
|
|
array1.push("&ispublic=" + (args.data.isPublic == "on"));
|
|
if(args.$form.find('.form-item[rel=isFeatured]').css("display") != "none")
|
|
array1.push("&isfeatured=" + (args.data.isFeatured == "on"));
|
|
|
|
$.ajax({
|
|
url: createURL("registerIso" + array1.join("")),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var items = json.registerisoresponse.iso; //items might have more than one array element if it's create ISOs for all zones.
|
|
args.response.success({data:items[0]});
|
|
|
|
/*
|
|
if(items.length > 1) {
|
|
for(var i=1; i<items.length; i++) {
|
|
var $midmenuItem2 = $("#midmenu_item").clone();
|
|
ISOToMidmenu(items[i], $midmenuItem2);
|
|
bindClickToMidMenu($midmenuItem2, templateToRightPanel, ISOGetMidmenuId);
|
|
$("#midmenu_container").append($midmenuItem2.show()); }
|
|
}
|
|
*/
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
|
|
args.response.error(errorMsg);
|
|
}
|
|
});
|
|
},
|
|
|
|
notification: {
|
|
poll: function(args) {
|
|
args.complete();
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
dataProvider: function(args) {
|
|
var array1 = [];
|
|
var ignoreProject = false;
|
|
if(args.filterBy != null) {
|
|
if(args.filterBy.kind != null) {
|
|
switch(args.filterBy.kind) {
|
|
case "all":
|
|
ignoreProject = true;
|
|
array1.push("&isofilter=all");
|
|
break;
|
|
case "mine":
|
|
array1.push("&isofilter=self");
|
|
break;
|
|
case "featured":
|
|
ignoreProject = true;
|
|
array1.push("&isofilter=featured");
|
|
break;
|
|
case "community":
|
|
ignoreProject = true;
|
|
array1.push("&isofilter=community");
|
|
break;
|
|
}
|
|
}
|
|
if(args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
|
|
switch(args.filterBy.search.by) {
|
|
case "name":
|
|
if(args.filterBy.search.value.length > 0)
|
|
array1.push("&keyword=" + args.filterBy.search.value);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
$.ajax({
|
|
url: createURL("listIsos&page=" + args.page + "&pagesize=" + pageSize + array1.join(""), { ignoreProject: ignoreProject }),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var items = json.listisosresponse.iso;
|
|
args.response.success({
|
|
actionFilter: isoActionfilter,
|
|
data: items
|
|
});
|
|
}
|
|
});
|
|
},
|
|
|
|
detailView: {
|
|
name: 'label.details',
|
|
actions: {
|
|
edit: {
|
|
label: 'label.edit',
|
|
action: function(args) {
|
|
var array1 = [];
|
|
array1.push("&name=" + todb(args.data.name));
|
|
array1.push("&displaytext=" + todb(args.data.displaytext));
|
|
array1.push("&ostypeid=" + args.data.ostypeid);
|
|
$.ajax({
|
|
url: createURL("updateIso&id=" + args.context.isos[0].id + "&zoneid=" + args.context.isos[0].zoneid + array1.join("")),
|
|
dataType: "json",
|
|
async: false,
|
|
success: function(json) {
|
|
//updateIso API returns an incomplete ISO object (isextractable and isfeatured are missing)
|
|
}
|
|
});
|
|
|
|
var array2 = [];
|
|
array2.push("&ispublic=" + (args.data.ispublic=="on"));
|
|
array2.push("&isfeatured=" + (args.data.isfeatured=="on"));
|
|
array2.push("&isextractable=" + (args.data.isextractable=="on"));
|
|
$.ajax({
|
|
url: createURL("updateIsoPermissions&id=" + args.context.isos[0].id + "&zoneid=" + args.context.isos[0].zoneid + array2.join("")),
|
|
dataType: "json",
|
|
async: false,
|
|
success: function(json) {
|
|
//updateIsoPermissions API doesn't return ISO object
|
|
}
|
|
});
|
|
|
|
//So, we call listIsos API to get a complete ISO object
|
|
$.ajax({
|
|
url: createURL("listIsos&id=" + args.context.isos[0].id + "&zoneid=" + args.context.isos[0].zoneid + "&isofilter=self"),
|
|
dataType: "json",
|
|
async: false,
|
|
success: function(json){
|
|
var item = json.listisosresponse.iso;
|
|
args.response.success({data: item});
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
copyISO: {
|
|
label: 'label.action.copy.ISO',
|
|
messages: {
|
|
notification: function(args) {
|
|
return 'Copying ISO';
|
|
}
|
|
},
|
|
createForm: {
|
|
title: 'label.action.copy.ISO',
|
|
desc: 'label.action.copy.ISO',
|
|
fields: {
|
|
destinationZoneId: {
|
|
label: 'label.destination.zone',
|
|
validation: { required: true },
|
|
select: function(args) {
|
|
$.ajax({
|
|
url: createURL("listZones&available=true"),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var zoneObjs = json.listzonesresponse.zone;
|
|
var items = [];
|
|
$(zoneObjs).each(function() {
|
|
if(this.id != args.context.isos[0].zoneid)
|
|
items.push({id: this.id, description: this.name});
|
|
});
|
|
args.response.success({data: items});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
},
|
|
action: function(args) {
|
|
$.ajax({
|
|
url: createURL("copyIso&id=" + args.context.isos[0].id + "&sourcezoneid=" + args.context.isos[0].zoneid + "&destzoneid=" + args.data.destinationZoneId),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var jid = json.copytemplateresponse.jobid;
|
|
args.response.success(
|
|
{_custom:
|
|
{jobId: jid,
|
|
getUpdatedItem: function(json) {
|
|
return {}; //nothing in this ISO needs to be updated
|
|
},
|
|
getActionFilter: function() {
|
|
return isoActionfilter;
|
|
}
|
|
}
|
|
}
|
|
);
|
|
}
|
|
});
|
|
},
|
|
notification: {
|
|
poll: pollAsyncJobResult
|
|
}
|
|
},
|
|
|
|
downloadISO: {
|
|
label: 'label.action.download.ISO',
|
|
messages: {
|
|
confirm: function(args) {
|
|
return 'message.action.download.iso';
|
|
},
|
|
notification: function(args) {
|
|
return 'label.action.download.ISO';
|
|
},
|
|
complete: function(args) {
|
|
var url = decodeURIComponent(args.url);
|
|
var htmlMsg = _l('message.download.ISO');
|
|
var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url);
|
|
return htmlMsg2;
|
|
}
|
|
},
|
|
action: function(args) {
|
|
var apiCmd = "extractIso&mode=HTTP_DOWNLOAD&id=" + args.context.isos[0].id;
|
|
if(args.context.isos[0].zoneid != null)
|
|
apiCmd += "&zoneid=" + args.context.isos[0].zoneid;
|
|
|
|
$.ajax({
|
|
url: createURL(apiCmd),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var jid = json.extractisoresponse.jobid;
|
|
args.response.success(
|
|
{_custom:
|
|
{jobId: jid,
|
|
getUpdatedItem: function(json) {
|
|
return json.queryasyncjobresultresponse.jobresult.iso;
|
|
},
|
|
getActionFilter: function() {
|
|
return isoActionfilter;
|
|
}
|
|
}
|
|
}
|
|
);
|
|
}
|
|
});
|
|
},
|
|
notification: {
|
|
poll: pollAsyncJobResult
|
|
}
|
|
},
|
|
|
|
remove: {
|
|
label: 'label.action.delete.ISO',
|
|
messages: {
|
|
confirm: function(args) {
|
|
return 'message.action.delete.ISO';
|
|
},
|
|
notification: function(args) {
|
|
return 'label.action.delete.ISO';
|
|
}
|
|
},
|
|
action: function(args) {
|
|
var array1 = [];
|
|
if (args.context.isos[0].zoneid != null)
|
|
array1.push("&zoneid=" + args.context.isos[0].zoneid);
|
|
|
|
$.ajax({
|
|
url: createURL("deleteIso&id=" + args.context.isos[0].id + array1.join("")),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var jid = json.deleteisosresponse.jobid;
|
|
args.response.success(
|
|
{_custom:
|
|
{jobId: jid
|
|
}
|
|
}
|
|
);
|
|
}
|
|
});
|
|
},
|
|
notification: {
|
|
poll: pollAsyncJobResult
|
|
}
|
|
}
|
|
|
|
},
|
|
|
|
tabs: {
|
|
details: {
|
|
title: 'label.details',
|
|
|
|
fields: [
|
|
{
|
|
name: {
|
|
label: 'label.name',
|
|
isEditable: true,
|
|
validation: { required: true }
|
|
}
|
|
},
|
|
{
|
|
id: { label: 'ID' },
|
|
zonename: { label: 'label.zone.name' },
|
|
zoneid: { label: 'label.zone.id' },
|
|
displaytext: {
|
|
label: 'label.description',
|
|
isEditable: true,
|
|
validation: { required: true }
|
|
},
|
|
isready: { label: 'state.Ready', converter:cloudStack.converters.toBooleanText },
|
|
status: { label: 'label.status' },
|
|
size : {
|
|
label: 'label.size',
|
|
converter: function(args) {
|
|
if (args == null || args == 0)
|
|
return "";
|
|
else
|
|
return cloudStack.converters.convertBytes(args);
|
|
}
|
|
},
|
|
isextractable: {
|
|
label: 'extractable',
|
|
isBoolean: true,
|
|
isEditable: true,
|
|
converter:cloudStack.converters.toBooleanText
|
|
},
|
|
bootable: {
|
|
label: 'label.bootable',
|
|
converter:cloudStack.converters.toBooleanText
|
|
},
|
|
ispublic: {
|
|
label: 'label.public',
|
|
isBoolean: true,
|
|
isEditable: true,
|
|
converter:cloudStack.converters.toBooleanText
|
|
},
|
|
isfeatured: {
|
|
label: 'label.featured',
|
|
isBoolean: true,
|
|
isEditable: true,
|
|
converter:cloudStack.converters.toBooleanText
|
|
},
|
|
crossZones: {
|
|
label: 'label.cross.zones',
|
|
converter:cloudStack.converters.toBooleanText
|
|
},
|
|
|
|
ostypeid: {
|
|
label: 'label.os.type',
|
|
isEditable: true,
|
|
select: function(args) {
|
|
$.ajax({
|
|
url: createURL("listOsTypes"),
|
|
dataType: "json",
|
|
async: true,
|
|
success: function(json) {
|
|
var ostypes = json.listostypesresponse.ostype;
|
|
var items = [];
|
|
$(ostypes).each(function() {
|
|
items.push({id: this.id, description: this.description});
|
|
});
|
|
args.response.success({data: items});
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
domain: { label: 'label.domain' },
|
|
account: { label: 'label.account' },
|
|
created: { label: 'label.created', converter: cloudStack.converters.toLocalDate }
|
|
}
|
|
],
|
|
|
|
tags: cloudStack.api.tags({ resourceType: 'ISO', contextId: 'isos' }),
|
|
|
|
dataProvider: function(args) {
|
|
var jsonObj = args.context.isos[0];
|
|
var apiCmd = "listIsos&isofilter=self&id="+jsonObj.id;
|
|
if(jsonObj.zoneid != null)
|
|
apiCmd = apiCmd + "&zoneid="+jsonObj.zoneid;
|
|
|
|
$.ajax({
|
|
url: createURL(apiCmd),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
args.response.success({
|
|
actionFilter: isoActionfilter,
|
|
data: json.listisosresponse.iso[0]
|
|
});
|
|
}
|
|
});
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
var templateActionfilter = function(args) {
|
|
var jsonObj = args.context.item;
|
|
var allowedActions = [];
|
|
|
|
// "Edit Template", "Copy Template", "Create VM"
|
|
if ((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)) //if neither root-admin, nor item owner
|
|
|| jsonObj.templatetype == "SYSTEM" || jsonObj.isready == false) {
|
|
//do nothing
|
|
}
|
|
else {
|
|
allowedActions.push("edit");
|
|
|
|
if(havingSwift == false)
|
|
allowedActions.push("copyTemplate");
|
|
|
|
//allowedActions.push("createVm"); // For Beta2, this simply doesn't work without a network.
|
|
}
|
|
|
|
// "Download Template"
|
|
if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account))) //if neither root-admin, nor item owner
|
|
|| (jsonObj.isready == false) || jsonObj.templatetype == "SYSTEM") {
|
|
//do nothing
|
|
}
|
|
else {
|
|
allowedActions.push("downloadTemplate");
|
|
}
|
|
|
|
// "Delete Template"
|
|
//if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)))
|
|
if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account))) //if neither root-admin, nor item owner
|
|
|| (jsonObj.isready == false && jsonObj.status != null && jsonObj.status.indexOf("Downloaded") != -1)
|
|
|| (jsonObj.account == "system")) {
|
|
//do nothing
|
|
}
|
|
else {
|
|
allowedActions.push("remove");
|
|
}
|
|
|
|
return allowedActions;
|
|
}
|
|
|
|
var isoActionfilter = function(args) {
|
|
var jsonObj = args.context.item;
|
|
var allowedActions = [];
|
|
|
|
if ((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)) //if neither root-admin, nor item owner
|
|
|| (jsonObj.isready == false)
|
|
|| (jsonObj.domainid == 1 && jsonObj.account == "system")
|
|
) {
|
|
//do nothing
|
|
}
|
|
else {
|
|
allowedActions.push("edit");
|
|
|
|
if(havingSwift == false)
|
|
allowedActions.push("copyISO");
|
|
}
|
|
|
|
// "Create VM"
|
|
// Commenting this out for Beta2 as it does not support the new network.
|
|
/*
|
|
//if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account))
|
|
if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)) //if neither root-admin, nor item owner
|
|
|| jsonObj.isready == false)
|
|
|| (jsonObj.bootable == false)
|
|
|| (jsonObj.domainid == 1 && jsonObj.account == "system")
|
|
) {
|
|
//do nothing
|
|
}
|
|
else {
|
|
allowedActions.push("createVm");
|
|
}
|
|
*/
|
|
|
|
// "Download ISO"
|
|
//if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)))
|
|
if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account))) //if neither root-admin, nor item owner
|
|
|| (jsonObj.isready == false)
|
|
|| (jsonObj.domainid == 1 && jsonObj.account == "system")
|
|
) {
|
|
//do nothing
|
|
}
|
|
else {
|
|
allowedActions.push("downloadISO");
|
|
}
|
|
|
|
// "Delete ISO"
|
|
//if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)))
|
|
if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account))) //if neither root-admin, nor item owner
|
|
|| (jsonObj.isready == false && jsonObj.status != null && jsonObj.status.indexOf("Downloaded") != -1)
|
|
|| (jsonObj.account == "system")
|
|
) {
|
|
//do nothing
|
|
}
|
|
else {
|
|
allowedActions.push("remove");
|
|
}
|
|
|
|
return allowedActions;
|
|
}
|
|
|
|
})(cloudStack, jQuery);
|