
From: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com> Signed-off-by: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com> --- ui/css/theme-default/button.css | 4 + ui/css/theme-default/list.css | 18 +++++ ui/js/src/kimchi.api.js | 34 ++++++++- ui/js/src/kimchi.guest_main.js | 149 +++++++++++++++++++++++++++++++++------ ui/pages/guest.html.tmpl | 6 ++- ui/pages/i18n.json.tmpl | 1 + 6 files changed, 186 insertions(+), 26 deletions(-) diff --git a/ui/css/theme-default/button.css b/ui/css/theme-default/button.css index 499bf4a..0df53a6 100644 --- a/ui/css/theme-default/button.css +++ b/ui/css/theme-default/button.css @@ -50,6 +50,10 @@ cursor: pointer; } +.btn[disabled] { + opacity: 0.3; +} + .btn:not([disabled]):hover { box-shadow: -2px -2px 2px #dadada, 2px 2px 2px #fff, 3px 3px 3px white inset, -3px -3px 3px rgba(0, 0, 0, .25) inset; diff --git a/ui/css/theme-default/list.css b/ui/css/theme-default/list.css index 8ffee69..fc3017b 100644 --- a/ui/css/theme-default/list.css +++ b/ui/css/theme-default/list.css @@ -275,3 +275,21 @@ text-shadow: -1px -1px 1px #ccc, 1px 1px 1px #fff; padding-left: 10px; } + +.guest-clone { + margin: 10px; +} + +.guest-clone .icon { + background: url('../../images/theme-default/loading.gif') no-repeat; + display: inline-block; + width: 20px; + height: 20px; + vertical-align: middle; +} + +.guest-clone .text { + color: #666666; + margin-left: 5px; + text-shadow: -1px -1px 1px #CCCCCC, 1px 1px 1px #FFFFFF; +} diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js index 5895a07..465755c 100644 --- a/ui/js/src/kimchi.api.js +++ b/ui/js/src/kimchi.api.js @@ -695,10 +695,10 @@ var kimchi = { }, 2000); break; case 'finished': - suc(result); + suc && suc(result); break; case 'failed': - err(result); + err && err(result); break; default: break; @@ -806,12 +806,27 @@ var kimchi = { }); }, - getStoragePoolVolume: function(poolName, volumeName, suc, err) { + getStoragePool: function(poolName, suc, err, async) { + var url = kimchi.url + 'storagepools/' + encodeURIComponent(poolName); + kimchi.requestJSON({ + url : url, + type : 'GET', + contentType : 'application/json', + async : async==undefined?true:async, + timeout: 2000, + dataType : 'json', + success : suc, + error : err + }); + }, + + getStoragePoolVolume: function(poolName, volumeName, suc, err, async) { var url = kimchi.url + 'storagepools/' + encodeURIComponent(poolName) + '/storagevolumes/' + encodeURIComponent(volumeName); kimchi.requestJSON({ url : url, type : 'GET', contentType : 'application/json', + async : async==undefined?true:async, timeout: 2000, dataType : 'json', success : suc, @@ -1233,5 +1248,18 @@ var kimchi = { success : suc, error : err }); + }, + + cloneGuest: function(vm, suc, err) { + kimchi.requestJSON({ + url : kimchi.url + 'vms/'+encodeURIComponent(vm)+"/clone", + type : 'POST', + contentType : 'application/json', + dataType : 'json', + success : suc, + error : err ? err : function(data) { + kimchi.message.error(data.responseJSON.reason); + } + }); } }; diff --git a/ui/js/src/kimchi.guest_main.js b/ui/js/src/kimchi.guest_main.js index dbe8753..48e71f7 100644 --- a/ui/js/src/kimchi.guest_main.js +++ b/ui/js/src/kimchi.guest_main.js @@ -15,6 +15,34 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +kimchi.sampleGuestObject = { + "name": "", + "uuid": "", + "state": "shutoff", + "persistent": true, + "icon": null, + "cpus": 0, + "memory": 0, + "stats": { + "net_throughput": 0, + "io_throughput_peak": 100, + "cpu_utilization": 0, + "io_throughput": 0, + "net_throughput_peak": 100 + }, + "screenshot": null, + "graphics": { + "passwd": null, + "passwdValidTo": null, + "type": "vnc", + "port": null, + "listen": "127.0.0.1" + }, + "users": [], + "groups": [], + "access": "full" +}; + kimchi.vmstart = function(event) { var button=$(this); @@ -173,8 +201,24 @@ kimchi.listVmsAuto = function() { if (kimchi.vmTimeout) { clearTimeout(kimchi.vmTimeout); } + var getCloningGuests = function(){ + var guests = []; + kimchi.getTasksByFilter('status=running&target_uri='+encodeURIComponent('^/vms/*'), function(tasks) { + for(var i=0;i<tasks.length;i++){ + var guestUri = tasks[i].target_uri; + var guestName = guestUri.substring(guestUri.lastIndexOf('/')+1, guestUri.length); + guests.push($.extend({}, kimchi.sampleGuestObject, {name: guestName, isCloning: true})); + if(kimchi.trackingTasks.indexOf(tasks[i].id)==-1) + kimchi.trackTask(tasks[i].id, null, function(err){ + kimchi.message.error(err.message); + }, null); + } + }, null, true); + return guests; + }; kimchi.listVMs(function(result, textStatus, jqXHR) { if (result && textStatus=="success") { + result = getCloningGuests().concat(result); if(result.length) { var listHtml = ''; var guestTemplate = kimchi.guestTemplate; @@ -233,14 +277,16 @@ kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) { imgLoad.attr('src',load_src); //Link the stopped tile to the start action, the running tile to open the console - if (vmRunningBool) { - liveTile.off("click", kimchi.vmstart); - liveTile.on("click", kimchi.openVmConsole); - } - else { - liveTile.off("click", kimchi.openVmConsole); - liveTile.on("click", kimchi.vmstart); - liveTile.hover(function(event){$(this).find('.overlay').show()}, function(event){$(this).find('.overlay').hide()}); + if(!vmObject.isCloning){ + if (vmRunningBool) { + liveTile.off("click", kimchi.vmstart); + liveTile.on("click", kimchi.openVmConsole); + } + else { + liveTile.off("click", kimchi.openVmConsole); + liveTile.on("click", kimchi.vmstart); + liveTile.hover(function(event){$(this).find('.overlay').show()}, function(event){$(this).find('.overlay').hide()}); + } } @@ -257,6 +303,7 @@ kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) { //Setup the VM Actions var guestActions=result.find("div[name=guest-actions]"); guestActions.find(".shutoff-disabled").prop('disabled', !vmRunningBool ); + guestActions.find(".running-disabled").prop('disabled', vmRunningBool ); if (vmRunningBool) { guestActions.find(".running-hidden").hide(); @@ -276,21 +323,79 @@ kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) { } //Setup action event handlers - guestActions.find("[name=vm-start]").on({click : kimchi.vmstart}); - guestActions.find("[name=vm-poweroff]").on({click : kimchi.vmpoweroff}); - if (vmRunningBool) { //If the guest is not running, do not enable reset - guestActions.find("[name=vm-reset]").on({click : kimchi.vmreset}); - } - if (vmRunningBool) { //If the guest is not running, do not enable shutdown - guestActions.find("[name=vm-shutdown]").on({click : kimchi.vmshutdown}); - } - guestActions.find("[name=vm-edit]").on({click : kimchi.vmedit}); - guestActions.find("[name=vm-delete]").on({click : kimchi.vmdelete}); + if(!vmObject.isCloning){ + guestActions.find("[name=vm-start]").on({click : kimchi.vmstart}); + guestActions.find("[name=vm-poweroff]").on({click : kimchi.vmpoweroff}); + if (vmRunningBool) { //If the guest is not running, do not enable reset + guestActions.find("[name=vm-reset]").on({click : kimchi.vmreset}); + } + if (vmRunningBool) { //If the guest is not running, do not enable shutdown + guestActions.find("[name=vm-shutdown]").on({click : kimchi.vmshutdown}); + } + guestActions.find("[name=vm-edit]").on({click : kimchi.vmedit}); + guestActions.find("[name=vm-delete]").on({click : kimchi.vmdelete}); + guestActions.find("[name=vm-clone]").click(function(){ + var guest = $(this).closest('li[name=guest]').attr("id"); + kimchi.listVMStorages({ + vm: guest, + storageType: 'disk' + }, function(disks){ + var guestStorage = {}; + for(var i=0; i<disks.length; i++){ + var pool, volume; + kimchi.getStoragePool(disks[i].pool, function(data){ + pool = data; + }, undefined, false); + kimchi.getStoragePoolVolume(disks[i].pool, disks[i].vol, function(data){ + volume = data; + }, undefined, false); + if(!guestStorage[pool.name]){ + guestStorage[pool.name] = { + pool: pool, + volumes: [volume], + totalVolumeSize: volume.capacity + }; + }else{ + guestStorage[pool.name].volumes.push(volume); + guestStorage[pool.name].totalVolumeSize += volume.capacity; + } + } + var needConfirm = false; + for(x in guestStorage){ + if(guestStorage[x].pool.type.indexOf('scsi')!=-1||guestStorage[x].pool.available<guestStorage[x].totalVolumeSize){ + needConfirm = true; + break; + } + } + if(needConfirm){ + kimchi.confirm({ + title : i18n['KCHAPI6006M'], + content : i18n['KCHVM6010M'], + confirm : i18n['KCHAPI6002M'], + cancel : i18n['KCHAPI6003M'] + }, function() { + kimchi.cloneGuest(guest, function(data){ + kimchi.listVmsAuto(); + }); + }, null); + }else{ + kimchi.cloneGuest(guest, function(data){ + kimchi.listVmsAuto(); + }); + } + }); + }); + + //Maintain menu open state + var actionMenu=guestActions.find("div[name=actionmenu]"); + if (openMenu) { + $('.popover', actionMenu).toggle(); + } - //Maintain menu open state - var actionMenu=guestActions.find("div[name=actionmenu]"); - if (openMenu) { - $('.popover', actionMenu).toggle(); + }else{ + guestActions.find('.btn').attr('disabled', true); + result.find('.guest-clone').removeClass('hide-content'); + $('.popover', guestActions.find("div[name=actionmenu]")).remove(); } return result; diff --git a/ui/pages/guest.html.tmpl b/ui/pages/guest.html.tmpl index 43fb350..74206fd 100644 --- a/ui/pages/guest.html.tmpl +++ b/ui/pages/guest.html.tmpl @@ -26,6 +26,9 @@ <div class="guest-general"> <h2 class="title" title="{name}">{name}</h2> </div> + <div class="guest-clone hide-content"> + <span class="icon"></span><span class="text">$_("Cloning")...</span> + </div> </div> <div name="cpu_utilization" class="sortable"> <div class="circleGauge"></div> @@ -56,7 +59,8 @@ <span class="text">$_("Actions")</span><span class="arrow"></span> <div class="popover actionsheet right-side" style="width: 250px"> <button class="button-big shutoff-disabled" name="vm-console" ><span class="text">$_("Connect")</span></button> - <button class="button-big running-disabled" name="vm-edit"><span class="text">$_("Edit")</span></button> + <button class="button-big running-disabled" name="vm-clone"><span class="text">$_("Clone")</span></button> + <button class="button-big" name="vm-edit"><span class="text">$_("Edit")</span></button> <button class="button-big shutoff-hidden" name="vm-reset"><span class="text">$_("Reset")</span></button> <button class="button-big shutoff-hidden" name="vm-shutdown"><span class="text">$_("Shut Down")</span></button> <button class="button-big running-hidden" name="vm-start"><span class="text">$_("Start")</span></button> diff --git a/ui/pages/i18n.json.tmpl b/ui/pages/i18n.json.tmpl index 75f1e43..56abd36 100644 --- a/ui/pages/i18n.json.tmpl +++ b/ui/pages/i18n.json.tmpl @@ -128,6 +128,7 @@ "KCHVM6007M": "$_("Note the guest OS may ignore this request. Would you like to continue?")", "KCHVM6008M": "$_("Virtual Machine delete Confirmation")", "KCHVM6009M": "$_("This virtual machine is not persistent. Power Off will delete it. Continue?")", + "KCHVM6010M": "$_("When the target guest has SCSI or iSCSI volumes, they will be cloned on default storage pool. The same will happen when the target pool does not have enough space to clone the volumes. Do you want to continue?")", "KCHVMCD6001M": "$_("This CDROM will be detached permanently and you can re-attach it. Continue to detach it?")", "KCHVMCD6002M": "$_("Attach")", -- 1.7.1

Cristian, could you test it and provide feedbacks or send to ML the rebased backend patches? On 10/31/2014 08:09 AM, huoyuxin@linux.vnet.ibm.com wrote:
From: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com>
Signed-off-by: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com> --- ui/css/theme-default/button.css | 4 + ui/css/theme-default/list.css | 18 +++++ ui/js/src/kimchi.api.js | 34 ++++++++- ui/js/src/kimchi.guest_main.js | 149 +++++++++++++++++++++++++++++++++------ ui/pages/guest.html.tmpl | 6 ++- ui/pages/i18n.json.tmpl | 1 + 6 files changed, 186 insertions(+), 26 deletions(-)
diff --git a/ui/css/theme-default/button.css b/ui/css/theme-default/button.css index 499bf4a..0df53a6 100644 --- a/ui/css/theme-default/button.css +++ b/ui/css/theme-default/button.css @@ -50,6 +50,10 @@ cursor: pointer; }
+.btn[disabled] { + opacity: 0.3; +} + .btn:not([disabled]):hover { box-shadow: -2px -2px 2px #dadada, 2px 2px 2px #fff, 3px 3px 3px white inset, -3px -3px 3px rgba(0, 0, 0, .25) inset; diff --git a/ui/css/theme-default/list.css b/ui/css/theme-default/list.css index 8ffee69..fc3017b 100644 --- a/ui/css/theme-default/list.css +++ b/ui/css/theme-default/list.css @@ -275,3 +275,21 @@ text-shadow: -1px -1px 1px #ccc, 1px 1px 1px #fff; padding-left: 10px; } + +.guest-clone { + margin: 10px; +} + +.guest-clone .icon { + background: url('../../images/theme-default/loading.gif') no-repeat; + display: inline-block; + width: 20px; + height: 20px; + vertical-align: middle; +} + +.guest-clone .text { + color: #666666; + margin-left: 5px; + text-shadow: -1px -1px 1px #CCCCCC, 1px 1px 1px #FFFFFF; +} diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js index 5895a07..465755c 100644 --- a/ui/js/src/kimchi.api.js +++ b/ui/js/src/kimchi.api.js @@ -695,10 +695,10 @@ var kimchi = { }, 2000); break; case 'finished': - suc(result); + suc && suc(result); break; case 'failed': - err(result); + err && err(result); break; default: break; @@ -806,12 +806,27 @@ var kimchi = { }); },
- getStoragePoolVolume: function(poolName, volumeName, suc, err) { + getStoragePool: function(poolName, suc, err, async) { + var url = kimchi.url + 'storagepools/' + encodeURIComponent(poolName); + kimchi.requestJSON({ + url : url, + type : 'GET', + contentType : 'application/json', + async : async==undefined?true:async, + timeout: 2000, + dataType : 'json', + success : suc, + error : err + }); + }, + + getStoragePoolVolume: function(poolName, volumeName, suc, err, async) { var url = kimchi.url + 'storagepools/' + encodeURIComponent(poolName) + '/storagevolumes/' + encodeURIComponent(volumeName); kimchi.requestJSON({ url : url, type : 'GET', contentType : 'application/json', + async : async==undefined?true:async, timeout: 2000, dataType : 'json', success : suc, @@ -1233,5 +1248,18 @@ var kimchi = { success : suc, error : err }); + }, + + cloneGuest: function(vm, suc, err) { + kimchi.requestJSON({ + url : kimchi.url + 'vms/'+encodeURIComponent(vm)+"/clone", + type : 'POST', + contentType : 'application/json', + dataType : 'json', + success : suc, + error : err ? err : function(data) { + kimchi.message.error(data.responseJSON.reason); + } + }); } }; diff --git a/ui/js/src/kimchi.guest_main.js b/ui/js/src/kimchi.guest_main.js index dbe8753..48e71f7 100644 --- a/ui/js/src/kimchi.guest_main.js +++ b/ui/js/src/kimchi.guest_main.js @@ -15,6 +15,34 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +kimchi.sampleGuestObject = { + "name": "", + "uuid": "", + "state": "shutoff", + "persistent": true, + "icon": null, + "cpus": 0, + "memory": 0, + "stats": { + "net_throughput": 0, + "io_throughput_peak": 100, + "cpu_utilization": 0, + "io_throughput": 0, + "net_throughput_peak": 100 + }, + "screenshot": null, + "graphics": { + "passwd": null, + "passwdValidTo": null, + "type": "vnc", + "port": null, + "listen": "127.0.0.1" + }, + "users": [], + "groups": [], + "access": "full" +}; +
kimchi.vmstart = function(event) { var button=$(this); @@ -173,8 +201,24 @@ kimchi.listVmsAuto = function() { if (kimchi.vmTimeout) { clearTimeout(kimchi.vmTimeout); } + var getCloningGuests = function(){ + var guests = []; + kimchi.getTasksByFilter('status=running&target_uri='+encodeURIComponent('^/vms/*'), function(tasks) { + for(var i=0;i<tasks.length;i++){ + var guestUri = tasks[i].target_uri; + var guestName = guestUri.substring(guestUri.lastIndexOf('/')+1, guestUri.length); + guests.push($.extend({}, kimchi.sampleGuestObject, {name: guestName, isCloning: true})); + if(kimchi.trackingTasks.indexOf(tasks[i].id)==-1) + kimchi.trackTask(tasks[i].id, null, function(err){ + kimchi.message.error(err.message); + }, null); + } + }, null, true); + return guests; + }; kimchi.listVMs(function(result, textStatus, jqXHR) { if (result && textStatus=="success") { + result = getCloningGuests().concat(result); if(result.length) { var listHtml = ''; var guestTemplate = kimchi.guestTemplate; @@ -233,14 +277,16 @@ kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) { imgLoad.attr('src',load_src);
//Link the stopped tile to the start action, the running tile to open the console - if (vmRunningBool) { - liveTile.off("click", kimchi.vmstart); - liveTile.on("click", kimchi.openVmConsole); - } - else { - liveTile.off("click", kimchi.openVmConsole); - liveTile.on("click", kimchi.vmstart); - liveTile.hover(function(event){$(this).find('.overlay').show()}, function(event){$(this).find('.overlay').hide()}); + if(!vmObject.isCloning){ + if (vmRunningBool) { + liveTile.off("click", kimchi.vmstart); + liveTile.on("click", kimchi.openVmConsole); + } + else { + liveTile.off("click", kimchi.openVmConsole); + liveTile.on("click", kimchi.vmstart); + liveTile.hover(function(event){$(this).find('.overlay').show()}, function(event){$(this).find('.overlay').hide()}); + } }
@@ -257,6 +303,7 @@ kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) { //Setup the VM Actions var guestActions=result.find("div[name=guest-actions]"); guestActions.find(".shutoff-disabled").prop('disabled', !vmRunningBool ); + guestActions.find(".running-disabled").prop('disabled', vmRunningBool );
if (vmRunningBool) { guestActions.find(".running-hidden").hide(); @@ -276,21 +323,79 @@ kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) { }
//Setup action event handlers - guestActions.find("[name=vm-start]").on({click : kimchi.vmstart}); - guestActions.find("[name=vm-poweroff]").on({click : kimchi.vmpoweroff}); - if (vmRunningBool) { //If the guest is not running, do not enable reset - guestActions.find("[name=vm-reset]").on({click : kimchi.vmreset}); - } - if (vmRunningBool) { //If the guest is not running, do not enable shutdown - guestActions.find("[name=vm-shutdown]").on({click : kimchi.vmshutdown}); - } - guestActions.find("[name=vm-edit]").on({click : kimchi.vmedit}); - guestActions.find("[name=vm-delete]").on({click : kimchi.vmdelete}); + if(!vmObject.isCloning){ + guestActions.find("[name=vm-start]").on({click : kimchi.vmstart}); + guestActions.find("[name=vm-poweroff]").on({click : kimchi.vmpoweroff}); + if (vmRunningBool) { //If the guest is not running, do not enable reset + guestActions.find("[name=vm-reset]").on({click : kimchi.vmreset}); + } + if (vmRunningBool) { //If the guest is not running, do not enable shutdown + guestActions.find("[name=vm-shutdown]").on({click : kimchi.vmshutdown}); + } + guestActions.find("[name=vm-edit]").on({click : kimchi.vmedit}); + guestActions.find("[name=vm-delete]").on({click : kimchi.vmdelete}); + guestActions.find("[name=vm-clone]").click(function(){ + var guest = $(this).closest('li[name=guest]').attr("id"); + kimchi.listVMStorages({ + vm: guest, + storageType: 'disk' + }, function(disks){ + var guestStorage = {}; + for(var i=0; i<disks.length; i++){ + var pool, volume; + kimchi.getStoragePool(disks[i].pool, function(data){ + pool = data; + }, undefined, false); + kimchi.getStoragePoolVolume(disks[i].pool, disks[i].vol, function(data){ + volume = data; + }, undefined, false); + if(!guestStorage[pool.name]){ + guestStorage[pool.name] = { + pool: pool, + volumes: [volume], + totalVolumeSize: volume.capacity + }; + }else{ + guestStorage[pool.name].volumes.push(volume); + guestStorage[pool.name].totalVolumeSize += volume.capacity; + } + } + var needConfirm = false; + for(x in guestStorage){ + if(guestStorage[x].pool.type.indexOf('scsi')!=-1||guestStorage[x].pool.available<guestStorage[x].totalVolumeSize){ + needConfirm = true; + break; + } + } + if(needConfirm){ + kimchi.confirm({ + title : i18n['KCHAPI6006M'], + content : i18n['KCHVM6010M'], + confirm : i18n['KCHAPI6002M'], + cancel : i18n['KCHAPI6003M'] + }, function() { + kimchi.cloneGuest(guest, function(data){ + kimchi.listVmsAuto(); + }); + }, null); + }else{ + kimchi.cloneGuest(guest, function(data){ + kimchi.listVmsAuto(); + }); + } + }); + }); + + //Maintain menu open state + var actionMenu=guestActions.find("div[name=actionmenu]"); + if (openMenu) { + $('.popover', actionMenu).toggle(); + }
- //Maintain menu open state - var actionMenu=guestActions.find("div[name=actionmenu]"); - if (openMenu) { - $('.popover', actionMenu).toggle(); + }else{ + guestActions.find('.btn').attr('disabled', true); + result.find('.guest-clone').removeClass('hide-content'); + $('.popover', guestActions.find("div[name=actionmenu]")).remove(); }
return result; diff --git a/ui/pages/guest.html.tmpl b/ui/pages/guest.html.tmpl index 43fb350..74206fd 100644 --- a/ui/pages/guest.html.tmpl +++ b/ui/pages/guest.html.tmpl @@ -26,6 +26,9 @@ <div class="guest-general"> <h2 class="title" title="{name}">{name}</h2> </div> + <div class="guest-clone hide-content"> + <span class="icon"></span><span class="text">$_("Cloning")...</span> + </div> </div> <div name="cpu_utilization" class="sortable"> <div class="circleGauge"></div> @@ -56,7 +59,8 @@ <span class="text">$_("Actions")</span><span class="arrow"></span> <div class="popover actionsheet right-side" style="width: 250px"> <button class="button-big shutoff-disabled" name="vm-console" ><span class="text">$_("Connect")</span></button> - <button class="button-big running-disabled" name="vm-edit"><span class="text">$_("Edit")</span></button> + <button class="button-big running-disabled" name="vm-clone"><span class="text">$_("Clone")</span></button> + <button class="button-big" name="vm-edit"><span class="text">$_("Edit")</span></button> <button class="button-big shutoff-hidden" name="vm-reset"><span class="text">$_("Reset")</span></button> <button class="button-big shutoff-hidden" name="vm-shutdown"><span class="text">$_("Shut Down")</span></button> <button class="button-big running-hidden" name="vm-start"><span class="text">$_("Start")</span></button> diff --git a/ui/pages/i18n.json.tmpl b/ui/pages/i18n.json.tmpl index 75f1e43..56abd36 100644 --- a/ui/pages/i18n.json.tmpl +++ b/ui/pages/i18n.json.tmpl @@ -128,6 +128,7 @@ "KCHVM6007M": "$_("Note the guest OS may ignore this request. Would you like to continue?")", "KCHVM6008M": "$_("Virtual Machine delete Confirmation")", "KCHVM6009M": "$_("This virtual machine is not persistent. Power Off will delete it. Continue?")", + "KCHVM6010M": "$_("When the target guest has SCSI or iSCSI volumes, they will be cloned on default storage pool. The same will happen when the target pool does not have enough space to clone the volumes. Do you want to continue?")",
"KCHVMCD6001M": "$_("This CDROM will be detached permanently and you can re-attach it. Continue to detach it?")", "KCHVMCD6002M": "$_("Attach")",

I tried to clone a VM with this patch and the operation doesn't even start. Nothing happens on the UI and the following messages are displayed on the console: 127.0.0.1 - - [02/Nov/2014:23:03:02] "GET /vms/landofooo/storages?type=disk HTTP/1.0" 200 165 "https://localhost:8001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36" libvirt: Storage Driver error : Storage pool not found: no storage pool with matching name 'undefined' 127.0.0.1 - - [02/Nov/2014:23:03:02] "GET /storagepools/undefined HTTP/1.0" 404 765 "https://localhost:8001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36" libvirt: Storage Driver error : Storage pool not found: no storage pool with matching name 'undefined' 127.0.0.1 - - [02/Nov/2014:23:03:02] "GET /storagepools/undefined/storagevolumes/undefined HTTP/1.0" 404 765 "https://localhost:8001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36" "landofooo" is the VM I was trying to clone. On 31-10-2014 08:09, huoyuxin@linux.vnet.ibm.com wrote:
From: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com>
Signed-off-by: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com>

On 11/3/2014 9:04 AM, Crístian Viana wrote:
I tried to clone a VM with this patch and the operation doesn't even start. Nothing happens on the UI and the following messages are displayed on the console:
As discussed in weekly meeting, some API will be enhanced to support conditional popup, as those API enhancement has not been done yet, so error below. In v4, I have made it that "always popup a static message". Let us take this way right now, leave conditional popup as future enhancement. Please check v4.
127.0.0.1 - - [02/Nov/2014:23:03:02] "GET /vms/landofooo/storages?type=disk HTTP/1.0" 200 165 "https://localhost:8001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36" libvirt: Storage Driver error : Storage pool not found: no storage pool with matching name 'undefined' 127.0.0.1 - - [02/Nov/2014:23:03:02] "GET /storagepools/undefined HTTP/1.0" 404 765 "https://localhost:8001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36" libvirt: Storage Driver error : Storage pool not found: no storage pool with matching name 'undefined' 127.0.0.1 - - [02/Nov/2014:23:03:02] "GET /storagepools/undefined/storagevolumes/undefined HTTP/1.0" 404 765 "https://localhost:8001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36"
"landofooo" is the VM I was trying to clone.
On 31-10-2014 08:09, huoyuxin@linux.vnet.ibm.com wrote:
From: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com>
Signed-off-by: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com>

On 11/03/2014 06:55 AM, Yu Xin Huo wrote:
On 11/3/2014 9:04 AM, Crístian Viana wrote:
I tried to clone a VM with this patch and the operation doesn't even start. Nothing happens on the UI and the following messages are displayed on the console:
As discussed in weekly meeting, some API will be enhanced to support conditional popup, as those API enhancement has not been done yet, so error below. In v4, I have made it that "always popup a static message". Let us take this way right now, leave conditional popup as future enhancement. Please check v4.
Thanks for send a V4 without the pre-check! I will send a patch with the backend adjustments to allow it.
127.0.0.1 - - [02/Nov/2014:23:03:02] "GET /vms/landofooo/storages?type=disk HTTP/1.0" 200 165 "https://localhost:8001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36" libvirt: Storage Driver error : Storage pool not found: no storage pool with matching name 'undefined' 127.0.0.1 - - [02/Nov/2014:23:03:02] "GET /storagepools/undefined HTTP/1.0" 404 765 "https://localhost:8001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36" libvirt: Storage Driver error : Storage pool not found: no storage pool with matching name 'undefined' 127.0.0.1 - - [02/Nov/2014:23:03:02] "GET /storagepools/undefined/storagevolumes/undefined HTTP/1.0" 404 765 "https://localhost:8001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36"
"landofooo" is the VM I was trying to clone.
On 31-10-2014 08:09, huoyuxin@linux.vnet.ibm.com wrote:
From: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com>
Signed-off-by: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com>
_______________________________________________ Kimchi-devel mailing list Kimchi-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/kimchi-devel
participants (4)
-
Aline Manera
-
Crístian Viana
-
huoyuxin@linux.vnet.ibm.com
-
Yu Xin Huo