mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-21 14:50:08 +03:00
Feature #1112: Update Sunstone dashboards, allow DS select on image creation, list images in DS in extended info and various small bugfixes.
(cherry picked from commit b20a063d7f13f136f06e97137638dc134262c552)
This commit is contained in:
parent
46776157a3
commit
557124605e
@ -37,7 +37,7 @@ module OpenNebulaJSON
|
||||
template = template_to_str(image_hash)
|
||||
end
|
||||
|
||||
self.allocate(template,ds_id)
|
||||
self.allocate(template,ds_id.to_i)
|
||||
end
|
||||
|
||||
def perform_action(template_json)
|
||||
|
@ -130,9 +130,22 @@ class SunstoneServer < CloudServer
|
||||
############################################################################
|
||||
def upload(template, file_path)
|
||||
image_hash = parse_json(template, 'image')
|
||||
if OpenNebula.is_error?(image_hash)
|
||||
return [500, image_hash.to_json]
|
||||
end
|
||||
|
||||
image_hash['PATH'] = file_path
|
||||
|
||||
new_template = {:image => image_hash}.to_json
|
||||
ds_id = parse_json(template, 'ds_id')
|
||||
if OpenNebula.is_error?(ds_id)
|
||||
return [500, ds_id.to_json]
|
||||
end
|
||||
|
||||
new_template = {
|
||||
:image => image_hash,
|
||||
:ds_id => ds_id,
|
||||
}.to_json
|
||||
|
||||
image = ImageJSON.new(Image.build_xml, @client)
|
||||
|
||||
rc = image.create(new_template)
|
||||
|
@ -58,6 +58,10 @@ var dashboard_tab_content =
|
||||
<td class="key_td">' + tr("Hosts (total/active)") + '</td>\
|
||||
<td class="value_td"><span id="total_hosts"></span><span id="active_hosts" class="green"></span></td>\
|
||||
</tr>\
|
||||
<tr>\
|
||||
<td class="key_td">' + tr("Clusters") + '</td>\
|
||||
<td class="value_td"><span id="total_clusters"></span></td>\
|
||||
</tr>\
|
||||
<tr>\
|
||||
<td class="key_td">' + tr("Groups") + '</td>\
|
||||
<td class="value_td"><span id="total_groups"></span></td>\
|
||||
@ -78,6 +82,10 @@ var dashboard_tab_content =
|
||||
<td class="key_td">' + tr("Virtual Networks (total/public)") + '</td>\
|
||||
<td class="value_td"><span id="total_vnets"></span><span id="public_vnets"></span></td>\
|
||||
</tr>\
|
||||
<tr>\
|
||||
<td class="key_td">' + tr("Datastores") + '</td>\
|
||||
<td class="value_td"><span id="total_datastores"></span></td>\
|
||||
</tr>\
|
||||
<tr>\
|
||||
<td class="key_td">' + tr("Images (total/public)") + '</td>\
|
||||
<td class="value_td"><span id="total_images"></span><span id="public_images"></span></td>\
|
||||
@ -102,11 +110,13 @@ var dashboard_tab_content =
|
||||
<h3>' + tr("Quickstart") + '</h3>\
|
||||
<form id="quickstart_form"><fieldset>\
|
||||
<table style="width:100%;"><tr style="vertical-align:middle;"><td style="width:70%">\
|
||||
<label style="font-weight:bold;width:40px;height:10em;">' + tr("New")+': </label>\
|
||||
<label style="font-weight:bold;width:40px;height:12em;">' + tr("New")+': </label>\
|
||||
<input type="radio" name="quickstart" value="Host.create_dialog">' + tr("Host") + '</input><br />\
|
||||
<input type="radio" name="quickstart" value="Cluster.create_dialog">' + tr("Cluster") + '</input><br />\
|
||||
<input type="radio" name="quickstart" value="VM.create_dialog">' + tr("VM Instance") + '</input><br />\
|
||||
<input type="radio" name="quickstart" value="Template.create_dialog">' + tr("VM Template") + '</input><br />\
|
||||
<input type="radio" name="quickstart" value="Network.create_dialog">' + tr("Virtual Network") + '</input><br />\
|
||||
<input type="radio" name="quickstart" value="Network.create_dialog">' + tr("Virtual Network") + '</iput><br />\
|
||||
<input type="radio" name="quickstart" value="Datastore.create_dialog">' + tr("Datastore") + '</input><br />\
|
||||
<input type="radio" name="quickstart" value="Image.create_dialog">' + tr("Image") + '</input><br />\
|
||||
<input type="radio" name="quickstart" value="User.create_dialog">' + tr("User") + '</input><br />\
|
||||
<input type="radio" name="quickstart" value="Group.create_dialog">' + tr("Group") + '</input><br />\
|
||||
@ -316,5 +326,13 @@ function updateDashboard(what,json_info){
|
||||
var total_acls=json_info.length;
|
||||
$('#total_acls',db).html(total_acls);
|
||||
break;
|
||||
case "clusters":
|
||||
var total_clusters=json_info.length;
|
||||
$('#total_clusters',db).html(total_clusters);
|
||||
break;
|
||||
case "datastores":
|
||||
var total_datastores=json_info.length;
|
||||
$('#total_datastores',db).html(total_datastores);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -69,6 +69,10 @@ var dashboard_tab_content =
|
||||
<td class="key_td">'+tr("Virtual Networks (total/public)")+'</td>\
|
||||
<td class="value_td"><span id="total_vnets"></span><span id="public_vnets"></span></td>\
|
||||
</tr>\
|
||||
<tr>\
|
||||
<td class="key_td">' + tr("Datastores") + '</td>\
|
||||
<td class="value_td"><span id="total_datastores"></span></td>\
|
||||
</tr>\
|
||||
<tr>\
|
||||
<td class="key_td">'+tr("Images (total/public)")+'</td>\
|
||||
<td class="value_td"><span id="total_images"></span><span id="public_images"></span></td>\
|
||||
@ -85,7 +89,7 @@ var dashboard_tab_content =
|
||||
<h3>'+tr("Quickstart")+'</h3>\
|
||||
<form id="quickstart_form"><fieldset>\
|
||||
<table style="width:100%;"><tr style="vertical-align:middle;"><td style="width:70%">\
|
||||
<label style="font-weight:bold;width:40px;height:4em;">New:</label>\
|
||||
<label style="font-weight:bold;width:40px;height:6em;">New:</label>\
|
||||
<input type="radio" name="quickstart" value="Template.create_dialog">'+tr("VM Template")+'</input><br />\
|
||||
<input type="radio" name="quickstart" value="VM.create_dialog">'+tr("VM Instance")+'</input><br />\
|
||||
<input type="radio" name="quickstart" value="Network.create_dialog">'+tr("Virtual Network")+'</input><br />\
|
||||
@ -296,5 +300,13 @@ function updateDashboard(what,json_info){
|
||||
var total_acls=json_info.length;
|
||||
$('#total_acls',db).html(total_acls);
|
||||
break;
|
||||
case "clusters":
|
||||
var total_clusters=json_info.length;
|
||||
$('#total_clusters',db).html(total_clusters);
|
||||
break;
|
||||
case "datastores":
|
||||
var total_datastores=json_info.length;
|
||||
$('#total_datastores',db).html(total_datastores);
|
||||
break;
|
||||
}
|
||||
}
|
@ -265,7 +265,8 @@ var datastore_buttons = {
|
||||
},
|
||||
"Datastore.create_dialog" : {
|
||||
type: "create_dialog",
|
||||
text: tr("+ New")
|
||||
text: tr("+ New"),
|
||||
condition: mustBeAdmin,
|
||||
},
|
||||
"Datastore.update_dialog" : {
|
||||
type: "action",
|
||||
@ -277,6 +278,7 @@ var datastore_buttons = {
|
||||
text: tr("Select cluster"),
|
||||
select: clusters_sel,
|
||||
tip: tr("Select the destination cluster:"),
|
||||
condition: mustBeAdmin,
|
||||
},
|
||||
"Datastore.chown" : {
|
||||
type: "confirm_with_select",
|
||||
@ -354,22 +356,34 @@ function datastoreInfoListener(){
|
||||
Sunstone.runAction("Datastore.showinfo",id);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
function updateDatastoreSelect(){
|
||||
datastores_select = makeSelectOptions(dataTable_datastores,
|
||||
1,
|
||||
4,
|
||||
[],
|
||||
[]
|
||||
);
|
||||
};
|
||||
|
||||
function updateDatastoreElement(request, element_json){
|
||||
var id = element_json.DATASTORE.ID;
|
||||
var element = datastoreElementArray(element_json);
|
||||
updateSingleElement(element,dataTable_datastores,'#datastore_'+id)
|
||||
updateDatastoreSelect();
|
||||
}
|
||||
|
||||
function deleteDatastoreElement(request){
|
||||
deleteElement(dataTable_datastores,'#datastore_'+request.request.data);
|
||||
updateDatastoreSelect();
|
||||
}
|
||||
|
||||
function addDatastoreElement(request,element_json){
|
||||
var id = element_json.DATASTORE.ID;
|
||||
var element = datastoreElementArray(element_json);
|
||||
addElement(element,dataTable_datastores);
|
||||
updateDatastoreSelect();
|
||||
}
|
||||
|
||||
|
||||
@ -381,17 +395,28 @@ function updateDatastoresView(request, list){
|
||||
});
|
||||
|
||||
updateView(list_array,dataTable_datastores);
|
||||
updateDatastoreSelect();
|
||||
updateDashboard("datastores",list);
|
||||
}
|
||||
|
||||
|
||||
function updateDatastoreInfo(request,ds){
|
||||
var info = ds.DATASTORE;
|
||||
var images_str = "";
|
||||
if (info.IMAGES.ID &&
|
||||
info.IMAGES.ID.constructor == Array){
|
||||
for (var i=0; i<info.IMAGES.ID.length;i++){
|
||||
images_str+=getImageName(info.IMAGES.ID[i])+', ';
|
||||
};
|
||||
images_str=images_str.slice(0,-2);
|
||||
} else if (info.IMAGES.ID){
|
||||
images_str=getImageName(info.IMAGES.ID);
|
||||
};
|
||||
|
||||
var info_tab = {
|
||||
title : tr("Datastore information"),
|
||||
content:
|
||||
'<table id="info_datastore_table" class="info_table">\
|
||||
'<table id="info_datastore_table" class="info_table" style="width:80%">\
|
||||
<thead>\
|
||||
<tr><th colspan="2">'+tr("Datastore information")+' - '+info.NAME+'</th></tr>\
|
||||
</thead>\
|
||||
@ -428,6 +453,10 @@ function updateDatastoreInfo(request,ds){
|
||||
<td class="key_td">'+tr("Base path")+'</td>\
|
||||
<td class="value_td">'+info.BASE_PATH+'</td>\
|
||||
</tr>\
|
||||
<tr>\
|
||||
<td class="key_td">'+tr("Images")+'</td>\
|
||||
<td class="value_td">'+images_str+'</td>\
|
||||
</tr>\
|
||||
<tr><td class="key_td">'+tr("Permissions")+'</td><td></td></tr>\
|
||||
<tr>\
|
||||
<td class="key_td"> '+tr("Owner")+'</td>\
|
||||
|
@ -63,6 +63,12 @@ var create_image_tmpl =
|
||||
<textarea name="img_desc" id="img_desc" style="height:4em"></textarea>\
|
||||
<div class="tip">'+tr("Human readable description of the image for other users.")+'</div>\
|
||||
</div>\
|
||||
<div class="img_param">\
|
||||
<label for="img_type">'+tr("Datastore")+':</label>\
|
||||
<select id="img_datastore" name="img_datastore">\
|
||||
</select>\
|
||||
<div class="tip">'+tr("Select the datastore for this image")+'</div>\
|
||||
</div>\
|
||||
</fieldset>\
|
||||
<fieldset>\
|
||||
<div class="img_param">\
|
||||
@ -850,7 +856,11 @@ function setupCreateImageDialog(){
|
||||
});
|
||||
if (exit) { return false; }
|
||||
|
||||
var ds_id = $('#img_ds_id',this).val();
|
||||
var ds_id = $('#img_datastore',this).val();
|
||||
if (!ds_id){
|
||||
notifyError(tr("Please select a datastore for this image"));
|
||||
return false;
|
||||
};
|
||||
|
||||
var img_json = {};
|
||||
|
||||
@ -906,7 +916,6 @@ function setupCreateImageDialog(){
|
||||
img_json[attr_name] = attr_value;
|
||||
});
|
||||
|
||||
ds_id = 1;
|
||||
img_obj = { "image" : img_json,
|
||||
"ds_id" : ds_id};
|
||||
|
||||
@ -932,6 +941,8 @@ function popUpCreateImageDialog(){
|
||||
$('#file-uploader input',$create_image_dialog).removeAttr("style");
|
||||
$('#file-uploader input',$create_image_dialog).attr('style','margin:0;width:256px!important');
|
||||
|
||||
$('#img_datastore',$create_image_dialog).html(datastores_sel());
|
||||
|
||||
$create_image_dialog.dialog('open');
|
||||
}
|
||||
|
||||
|
@ -419,6 +419,7 @@ var vnet_buttons = {
|
||||
text: tr("Select cluster"),
|
||||
select: clusters_sel,
|
||||
tip: tr("Select the destination cluster:"),
|
||||
condition: mustBeAdmin,
|
||||
},
|
||||
"Network.chown" : {
|
||||
type: "confirm_with_select",
|
||||
|
@ -403,19 +403,26 @@ function waitingNodes(dataTable){
|
||||
|
||||
function getUserName(uid){
|
||||
if (typeof(dataTable_users) != "undefined"){
|
||||
return getName(uid,dataTable_users);
|
||||
return getName(uid,dataTable_users,2);
|
||||
}
|
||||
return uid;
|
||||
}
|
||||
|
||||
function getGroupName(gid){
|
||||
if (typeof(dataTable_groups) != "undefined"){
|
||||
return getName(gid,dataTable_groups);
|
||||
return getName(gid,dataTable_groups,2);
|
||||
}
|
||||
return gid;
|
||||
}
|
||||
|
||||
function getName(id,dataTable){
|
||||
function getImageName(id){
|
||||
if (typeof(dataTable_images) != "undefined"){
|
||||
return getName(id,dataTable_images,4);
|
||||
}
|
||||
return id;
|
||||
};
|
||||
|
||||
function getName(id,dataTable,name_col){
|
||||
var name = id;
|
||||
if (typeof(dataTable) == "undefined") {
|
||||
return name;
|
||||
@ -424,7 +431,7 @@ function getName(id,dataTable){
|
||||
|
||||
$.each(nodes,function(){
|
||||
if (id == this[1]) {
|
||||
name = this[2];
|
||||
name = this[name_col];
|
||||
return false;
|
||||
}
|
||||
});
|
||||
@ -755,6 +762,10 @@ function clusters_sel() {
|
||||
return clusters_select;
|
||||
}
|
||||
|
||||
function datastores_sel() {
|
||||
return datastores_select;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function ownerUse(resource){
|
||||
|
Loading…
x
Reference in New Issue
Block a user