diff --git a/src/cloud/occi/lib/ui/public/js/occi.js b/src/cloud/occi/lib/ui/public/js/occi.js
index f53b3832cc..b91c2dda6e 100644
--- a/src/cloud/occi/lib/ui/public/js/occi.js
+++ b/src/cloud/occi/lib/ui/public/js/occi.js
@@ -66,16 +66,14 @@ var OCCI = {
"Helper": {
"action": function(action, params)
{
- obj = {
- "action": {
- "perform": action
- }
+ action = {
+ "perform": action
}
if (params)
{
- obj.action.params = params;
+ action.params = params;
}
- return obj;
+ return action;
},
"request": function(resource, method, data) {
@@ -257,6 +255,37 @@ var OCCI = {
});
},
+ "simple_action" : function(params, resource, method, action_obj){
+ var callback = params.success;
+ var callback_error = params.error;
+ var id = params.data.id;
+
+ var action,request;
+ if (action_obj) {
+ action = OCCI.Helper.action(method, action_obj);
+ request = OCCI.Helper.request(resource,method, [id, action_obj]);
+ } else {
+ action = OCCI.Helper.action(method);
+ request = OCCI.Helper.request(resource,method, id);
+ };
+
+ $.ajax({
+ url: resource.toLowerCase() + "/" + id + '/action',
+ type: "POST",
+ data: json2xml(action,'ACTION'),
+ dataType: "xml ONEjson",
+ success: function(response){
+ var res = {};
+ res[resource] = response;
+ return callback ? callback(request,res) : null;
+ },
+ error: function(response){
+ return callback_error ?
+ callback_error(request, OCCI.Error(response)) : null;
+ }
+ });
+ },
+
"accounting": function(params, resource){
var callback = params.success;
var callback_error = params.error;
@@ -455,7 +484,6 @@ var OCCI = {
var resource = OCCI.VM.resource;
var method = startstop;
- var action = OCCI.Helper.action(method);
var request = OCCI.Helper.request(resource,method, id);
$.ajax({
url: "ui/" + method + "/" + id,
@@ -532,52 +560,11 @@ var OCCI = {
"nonpersistent": function(params){
params.data.body = { "PERSISTENT":"NO" };
OCCI.Action.update(params,OCCI.Image.resource,"nonpersistent");
- }
- },
-
- "Template" : {
- "resource" : "VMTEMPLATE",
-
- "create" : function(params){
- OCCI.Action.create(params,OCCI.Template.resource);
},
- "del" : function(params){
- OCCI.Action.del(params,OCCI.Template.resource);
- },
- "list" : function(params){
- OCCI.Action.list(params,OCCI.Template.resource);
- },
- "show" : function(params){
- OCCI.Action.show(params,OCCI.Template.resource);
- },
- "chown" : function(params){
- OCCI.Action.chown(params,OCCI.Template.resource);
- },
- "chgrp" : function(params){
- OCCI.Action.chgrp(params,OCCI.Template.resource);
- },
- "update" : function(params){
- var action_obj = {"template_raw" : params.data.extra_param };
- OCCI.Action.simple_action(params,
- OCCI.Template.resource,
- "update",
- action_obj);
- },
- "fetch_template" : function(params){
- OCCI.Action.show(params,OCCI.Template.resource,"template");
- },
- "publish" : function(params){
- OCCI.Action.simple_action(params,OCCI.Template.resource,"publish");
- },
- "unpublish" : function(params){
- OCCI.Action.simple_action(params,OCCI.Template.resource,"unpublish");
- },
-
- "instantiate" : function(params) {
- var vm_name = params.data.extra_param ? params.data.extra_param : "";
- var action_obj = { "vm_name" : vm_name };
- OCCI.Action.simple_action(params,OCCI.Template.resource,
- "instantiate",action_obj);
+ "clone" : function(params){
+ var action_obj = { 'NAME' : params.data.extra_param };
+ OCCI.Action.simple_action(params, OCCI.Image.resource,
+ "clone", action_obj)
}
},
diff --git a/src/cloud/occi/lib/ui/public/js/plugins/storage.js b/src/cloud/occi/lib/ui/public/js/plugins/storage.js
index 37e09ce498..c8d73f35aa 100644
--- a/src/cloud/occi/lib/ui/public/js/plugins/storage.js
+++ b/src/cloud/occi/lib/ui/public/js/plugins/storage.js
@@ -100,13 +100,27 @@ var create_image_tmpl =
\
';
+var clone_image_tmpl = '
'
+
var image_dashboard = '\

'+
storage_dashboard_html +
'
';
var dataTable_images;
-var $create_image_dialog;
var image_actions = {
@@ -175,6 +189,18 @@ var image_actions = {
notify: true
},
+ "Image.clone_dialog" : {
+ type: "custom",
+ call: popUpImageCloneDialog
+ },
+
+ "Image.clone" : {
+ type: "single",
+ call: OCCI.Image.clone,
+ error: onError,
+ notify: true
+ },
+
// "Image.publish" : {
// type: "multiple",
// call: OCCI.Image.publish,
@@ -239,6 +265,10 @@ var image_buttons = {
// },
// }
// },
+ "Image.clone_dialog" : {
+ type: "action",
+ text: tr("Clone")
+ },
"Image.delete" : {
type: "action",
text: tr("Delete")
@@ -259,6 +289,13 @@ var image_create_panel = {
}
};
+var image_clone_panel = {
+ "image_clone_panel" : {
+ title: tr("Clone image"),
+ content: clone_image_tmpl
+ }
+}
+
var images_tab = {
title: ''+tr("Storage"),
content: images_tab_content,
@@ -269,6 +306,7 @@ Sunstone.addActions(image_actions);
Sunstone.addMainTab('images_tab',images_tab);
Sunstone.addInfoPanel('image_info_panel',image_info_panel);
Sunstone.addInfoPanel('image_create_panel',image_create_panel);
+Sunstone.addInfoPanel('image_clone_panel',image_clone_panel);
function imageElements() {
@@ -390,7 +428,6 @@ function updateImageInfo(request,img){
function popUpCreateImageDialog(){
Sunstone.popUpInfoPanel("image_create_panel");
var dialog = $('#dialog');
- $create_image_dialog = dialog;
$('#create_image',dialog).button({
icons: {
@@ -429,13 +466,13 @@ function popUpCreateImageDialog(){
*/
$('#img_type',dialog).change(function(){
if ($(this).val() == "DATABLOCK"){
- $('#img_fstype',$create_image_dialog).parents('div.img_param').show();
- $('#img_size',$create_image_dialog).parents('div.img_param').show();
- $('#upload_div',$create_image_dialog).hide();
+ $('#img_fstype',dialog).parents('div.img_param').show();
+ $('#img_size',dialog).parents('div.img_param').show();
+ $('#upload_div',dialog).hide();
} else {
- $('#img_fstype',$create_image_dialog).parents('div.img_param').hide();
- $('#img_size',$create_image_dialog).parents('div.img_param').hide();
- $('#upload_div',$create_image_dialog).show();
+ $('#img_fstype',dialog).parents('div.img_param').hide();
+ $('#img_size',dialog).parents('div.img_param').hide();
+ $('#upload_div',dialog).show();
};
});
@@ -454,7 +491,7 @@ function popUpCreateImageDialog(){
var img_obj;
var uploader = new qq.FileUploaderBasic({
- button: $('#file-uploader',$create_image_dialog)[0],
+ button: $('#file-uploader',dialog)[0],
action: 'ui/upload',
multiple: false,
params: {},
@@ -493,8 +530,6 @@ function popUpCreateImageDialog(){
$('#file-uploader input').attr('style','margin:0;width:256px!important');
var processCreateImageForm = function(){
- var dialog = $create_image_dialog;
-
var img_json = {};
var name = $('#img_name',dialog).val();
@@ -551,6 +586,63 @@ function popUpCreateImageDialog(){
});
}
+function popUpImageCloneDialog(){
+ Sunstone.popUpInfoPanel("image_clone_panel");
+ var dialog = $('#dialog');
+
+ $('#clone_image',dialog).button({
+ icons: {
+ primary: "ui-icon-check"
+ },
+ text: true
+ });
+
+ $('.image_close_dialog_link',dialog).button({
+ icons: {
+ primary: "ui-icon-closethick"
+ },
+ text: true
+ });
+
+ $('form',dialog).submit(function(){
+ var name = $('input', this).val();
+ var sel_elems = imageElements();
+ if (!name || !sel_elems.length)
+ notifyError('A name or prefix is needed!');
+ if (sel_elems.length > 1){
+ for (var i=0; i< sel_elems.length; i++)
+ //If we are cloning several images we
+ //use the name as prefix
+ Sunstone.runAction('Image.clone',
+ sel_elems[i],
+ name+getName(sel_elems[i],
+ dataTable_images, 2));
+ } else {
+ Sunstone.runAction('Image.clone',sel_elems[0],name)
+ };
+ setTimeout(function(){
+ Sunstone.runAction('Image.refresh');
+ }, 1500);
+ popUpImageDashboard();
+ return false;
+ });
+
+ var sel_elems = imageElements();
+ //show different text depending on how many elements are selected
+ if (sel_elems.length > 1){
+ $('.clone_one',dialog).hide();
+ $('.clone_several',dialog).show();
+ $('input',dialog).val('Copy of ');
+ }
+ else {
+ $('.clone_one',dialog).show();
+ $('.clone_several',dialog).hide();
+ $('input',dialog).val('Copy of '+getName(sel_elems[0],
+ dataTable_images, 2));
+ };
+
+}
+
function popUpImageDashboard(){
var count = dataTable_images.fnGetNodes().length;
popDialog(image_dashboard);