[Kimchi-devel] [PATCH] [Kimchi] Issue #968: Kimchi is searching for 'undefined' VM
Socorro Stoppler
socorro at linux.vnet.ibm.com
Tue Jul 26 23:08:33 UTC 2016
Tested-by: Socorro Stoppler <socorro at linux.vnet.ibm.com>
On 07/26/2016 01:18 PM, Socorro Stoppler wrote:
> Yep! It's now ok. Testing it.... Thanks!
>
> On 07/26/2016 01:15 PM, Aline Manera wrote:
>>
>> Hi Socorro,
>>
>> Seems this patchs depended on "Issue #969: Error message showing up
>> in parent panel rather than modal window in Add Storage" which was
>> just applied today.
>>
>> Could you try to apply and test it on current upstream code?
>>
>> Thanks,
>> Aline Manera
>>
>> On 07/25/2016 11:22 AM, Socorro Stoppler wrote:
>>> Hi Samuel,
>>>
>>> Would you mind resending the patch? I am unable to apply it to
>>> master. Got the following error:
>>>
>>> Applying: Issue #968: Kimchi is searching for 'undefined' VM
>>> fatal: sha1 information is lacking or useless
>>> (ui/js/src/kimchi.guest_main.js).
>>> Repository lacks necessary blobs to fall back on 3-way merge.
>>> Cannot fall back to three-way merge.
>>> Patch failed at 0001 Issue #968: Kimchi is searching for 'undefined' VM
>>>
>>> Thanks
>>> -Socorro
>>>
>>>
>>> On 07/22/2016 12:27 PM, sguimaraes943 at gmail.com wrote:
>>>> From: Samuel Guimarães <sguimaraes943 at gmail.com>
>>>>
>>>> This commit also fixes an issue with an undefined variable with
>>>> wok.substitute() when quickly switching from Guests to Templates tab.
>>>>
>>>> Signed-off-by: Samuel Guimarães <sguimaraes943 at gmail.com>
>>>> ---
>>>> ui/js/src/kimchi.guest_main.js | 919
>>>> +++++++++++++++++++-------------------
>>>> ui/js/src/kimchi.template_main.js | 4 +-
>>>> 2 files changed, 463 insertions(+), 460 deletions(-)
>>>>
>>>> diff --git a/ui/js/src/kimchi.guest_main.js
>>>> b/ui/js/src/kimchi.guest_main.js
>>>> index 605cd2d..ab26fa4 100644
>>>> --- a/ui/js/src/kimchi.guest_main.js
>>>> +++ b/ui/js/src/kimchi.guest_main.js
>>>> @@ -313,6 +313,466 @@ kimchi.initClone = function() {
>>>> wok.window.close();
>>>> };
>>>> +kimchi.guestSetRequestHeader = function(xhr) {
>>>> + xhr.setRequestHeader('Accept', 'text/html');
>>>> +};
>>>> +
>>>> +kimchi.toggleGuestsGallery = function() {
>>>> + $(".wok-guest-list,
>>>> .wok-guest-gallery").toggleClass("wok-guest-list wok-guest-gallery");
>>>> + $(".wok-list, .wok-gallery").toggleClass("wok-list wok-gallery");
>>>> + var text = $('#guest-gallery-table-button span.text').text();
>>>> + $('#guest-gallery-table-button span.text').text(text ==
>>>> i18n['KCHTMPL6005M'] ? i18n['KCHTMPL6004M'] : i18n['KCHTMPL6005M']);
>>>> + var buttonText = $('#guest-gallery-table-button
>>>> span.text').text();
>>>> + if (buttonText.indexOf("Gallery") !== -1) {
>>>> + // Currently in list view
>>>> + kimchi.setGuestView("guestView", "list");
>>>> + } else {
>>>> + // Currently in gallery
>>>> + kimchi.setGuestView("guestView", "gallery");
>>>> + }
>>>> +};
>>>> +
>>>> +kimchi.setGuestView = function(name, value) {
>>>> + window.localStorage.setItem(name, value);
>>>> +};
>>>> +
>>>> +kimchi.readGuestView = function(name) {
>>>> + var viewName = window.localStorage.getItem(name);
>>>> + if (viewName !== "") {
>>>> + return viewName;
>>>> + } else {
>>>> + return null;
>>>> + }
>>>> +};
>>>> +
>>>> +kimchi.showGuestGallery = function() {
>>>> + $(".wok-guest-list").addClass("wok-guest-gallery");
>>>> + $(".wok-list").addClass("wok-gallery");
>>>> + $(".wok-guest-gallery").removeClass("wok-guest-list");
>>>> + $(".wok-gallery").removeClass("wok-list");
>>>> + $('#guest-gallery-table-button
>>>> span.text').text(i18n['KCHTMPL6004M']);
>>>> +};
>>>> +
>>>> +kimchi.showGuestList = function() {
>>>> + $(".wok-guest-list").removeClass("wok-guest-gallery");
>>>> + $(".wok-list").removeClass("wok-gallery");
>>>> + $(".wok-guest-gallery").addClass("wok-guest-list");
>>>> + $(".wok-gallery").addClass("wok-list");
>>>> + $('#guest-gallery-table-button
>>>> span.text').text(i18n['KCHTMPL6005M']);
>>>> +};
>>>> +
>>>> +kimchi.guest_main = function() {
>>>> + $('body').addClass('wok-list');
>>>> + var viewFound = kimchi.readGuestView("guestView");
>>>> + if (viewFound) {
>>>> + if(viewFound === "gallery") {
>>>> + // should be showing gallery
>>>> + kimchi.showGuestGallery();
>>>> + } else {
>>>> + // Should be showing list
>>>> + kimchi.showGuestList();
>>>> + }
>>>> + } else {
>>>> + // Default to showing list
>>>> + kimchi.showGuestList();
>>>> + }
>>>> + if (wok.tabMode['guests'] === 'admin') {
>>>> + $('.tools').attr('style', 'display');
>>>> + $("#vm-add").on("click", function(event) {
>>>> + wok.window.open('plugins/kimchi/guest-add.html');
>>>> + });
>>>> + }
>>>> + kimchi.guestTemplate = $('#guest-tmpl').html();
>>>> + kimchi.guestElem =
>>>> $('<div/>').html(kimchi.guestTemplate).find('li[name="guest"]');
>>>> + $('#guests-root-container').on('remove', function() {
>>>> + kimchi.vmTimeout && clearTimeout(kimchi.vmTimeout);
>>>> + });
>>>> +
>>>> + $('#guest-gallery-table-button').on('click', function(event) {
>>>> + kimchi.toggleGuestsGallery();
>>>> + });
>>>> +
>>>> + kimchi.resetGuestFilter();
>>>> + kimchi.initGuestFilter();
>>>> + kimchi.listVmsAuto();
>>>> +};
>>>> +
>>>> +kimchi.guest_clonevm_main = function() {
>>>> + kimchi.initCloneDialog();
>>>> +};
>>>> +
>>>> +kimchi.initCloneDialog = function(callback) {
>>>> + $("#numberClone").val("1");
>>>> + $("#cloneFormOk").on("click", function() {
>>>> + //Check if input is a number
>>>> + var numClone = parseInt($('#numberClone').val());
>>>> + var err = "";
>>>> + if (isNaN(numClone)) {
>>>> + err = i18n['KCHVM0001E'];
>>>> + wok.message.error(err,'#alert-modal-container');
>>>> + } else {
>>>> + $("#cloneFormOk").prop("disabled", true);
>>>> + kimchi.initClone();
>>>> + }
>>>> + });
>>>> +};
>>>> +
>>>> +
>>>> +kimchi.createGuestLi = function(vmObject, prevScreenImage,
>>>> openMenu) {
>>>> + var result;
>>>> + if (typeof kimchi.guestElem !== 'undefined') {
>>>> + result = kimchi.guestElem.clone();
>>>> + //Setup the VM list entry
>>>> + var currentState = result.find('.guest-state');
>>>> + var vmRunningBool = (vmObject.state == "running");
>>>> + var vmSuspendedBool = (vmObject.state == "paused");
>>>> + var vmPoweredOffBool = (vmObject.state == "shutoff");
>>>> + var vmPersistent = (vmObject.persistent == true);
>>>> +
>>>> + if (vmObject.state !== 'undefined') {
>>>> + currentState.addClass(vmObject.state);
>>>> + };
>>>> + result.attr('id', vmObject.name);
>>>> + result.data(vmObject);
>>>> +
>>>> + //Add the Name
>>>> + var guestTitle = result.find('.title').attr({ 'val':
>>>> vmObject.name, 'title': vmObject.name });
>>>> + guestTitle.html(vmObject.name);
>>>> +
>>>> + if (vmObject.screenshot !== null) {
>>>> + var scrensh =
>>>> result.find('.screenshot').css('background-image', 'url(' +
>>>> vmObject.screenshot + ')');
>>>> + scrensh.attr('title', vmObject.name);
>>>> + } else {
>>>> + var scrensh =
>>>> result.find('.screenshot').css('background-image', 'none');
>>>> + scrensh.attr('title', vmObject.name);
>>>> + }
>>>> +
>>>> + //Add the OS Type and Icon
>>>> + var osType = result.find('.column-type.distro-icon');
>>>> + if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-fedora.png') {
>>>> + osType.addClass('icon-fedora');
>>>> + osType.attr('val', 'Fedora');
>>>> + osType.html('Fedora');
>>>> + } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-ubuntu.png') {
>>>> + osType.addClass('icon-ubuntu');
>>>> + osType.attr('val', 'Ubuntu');
>>>> + osType.html('Ubuntu');
>>>> + } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-centos.png') {
>>>> + osType.addClass('icon-centos');
>>>> + osType.attr('val', 'Centos');
>>>> + osType.html('Centos');
>>>> + } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-opensuse.png') {
>>>> + osType.addClass('icon-opensuse');
>>>> + osType.attr('val', 'openSUSE');
>>>> + osType.html('openSUSE');
>>>> + } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-gentoo.png') {
>>>> + osType.addClass('icon-gentoo');
>>>> + osType.attr('val', 'Gentoo');
>>>> + osType.html('Gentoo');
>>>> + } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-debian.png') {
>>>> + osType.addClass('icon-debian');
>>>> + osType.attr('val', 'Debian');
>>>> + osType.html('Debian');
>>>> + } else if (vmObject.icon !== null) {
>>>> + osType.css('background-image', vmObject.icon);
>>>> + osType.attr('val', 'Unknown');
>>>> + osType.html('Unknown');
>>>> + } else {
>>>> + //Unknown
>>>> + osType.addClass('icon-unknown');
>>>> + osType.attr('val', 'Unknown');
>>>> + osType.html('Unknown');
>>>> + }
>>>> + //Add the OS Icon to VM name in Gallery View
>>>> + var osName = result.find('.column-name.distro-icon');
>>>> + if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-fedora.png') {
>>>> + osName.addClass('icon-fedora');
>>>> + } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-ubuntu.png') {
>>>> + osName.addClass('icon-ubuntu');
>>>> + } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-centos.png') {
>>>> + osName.addClass('icon-centos');
>>>> + } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-opensuse.png') {
>>>> + osName.addClass('icon-opensuse');
>>>> + } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-gentoo.png') {
>>>> + osName.addClass('icon-gentoo');
>>>> + } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-debian.png') {
>>>> + osName.addClass('icon-debian');
>>>> + } else if (vmObject.icon !== null) {
>>>> + osName.css('background-image', vmObject.icon);
>>>> + } else {
>>>> + osName.addClass('icon-unknown');
>>>> + }
>>>> +
>>>> + //Setup the VM console thumbnail display
>>>> + var curImg = vmObject.icon;
>>>> + if (vmObject.screenshot) {
>>>> + curImg = vmObject.screenshot.replace(/^\//, '');
>>>> + }
>>>> + var load_src = curImg || 'plugins/kimchi/images/icon-vm.png';
>>>> + var tile_src = prevScreenImage || vmObject['load-src'];
>>>> + var liveTile = result.find('div[name=guest-tile] > .tile');
>>>> + liveTile.addClass(vmObject.state);
>>>> + liveTile.find('.imgactive').attr('src', tile_src);
>>>> + var imgLoad = liveTile.find('.imgload');
>>>> + imgLoad.on('load', function() {
>>>> + var oldImg = $(this).parent().find('.imgactive');
>>>> + oldImg.removeClass("imgactive").addClass("imgload");
>>>> + oldImg.attr("src", "");
>>>> + $(this).addClass("imgactive").removeClass("imgload");
>>>> + $(this).off('load');
>>>> + });
>>>> + imgLoad.attr('src', load_src);
>>>> +
>>>> + //Link the stopped tile to the start action, the running
>>>> tile to open the console, and the paused tile to resume
>>>> + if (!(vmObject.isCloning || vmObject.isCreating ||
>>>> vmObject.isMigrating)) {
>>>> + if (vmPoweredOffBool) {
>>>> + liveTile.off("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.openVmConsole(event);
>>>> + });
>>>> + liveTile.off("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmresume(event);
>>>> + });
>>>> + liveTile.on("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmstart(event);
>>>> + });
>>>> + liveTile.hover("click", function(event) {
>>>> + event.preventDefault();
>>>> + $(this).find('.overlay').show()
>>>> + }, function(event) {
>>>> + $(this).find('.overlay').hide()
>>>> + });
>>>> + } else if (vmSuspendedBool) {
>>>> + liveTile.off("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmstart(event);
>>>> + });
>>>> + liveTile.off("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.openVmConsole(event);
>>>> + });
>>>> + liveTile.on("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmresume(event);
>>>> + });
>>>> + liveTile.hover("click", function(event) {
>>>> + event.preventDefault();
>>>> + $(this).find('.overlay').show()
>>>> + }, function(event) {
>>>> + $(this).find('.overlay').hide()
>>>> + });
>>>> + if (vmObject.state = "paused") {
>>>> + liveTile.find('.overlay').attr('src',
>>>> "plugins/kimchi/images/theme-default/ac24_resume.png");
>>>> + liveTile.find('.overlay').attr('alt', "Resume");
>>>> + }
>>>> + liveTile.hover(function(event) {
>>>> + $(this).find('.overlay').show()
>>>> + }, function(event) {
>>>> + $(this).find('.overlay').hide()
>>>> + });
>>>> + } else {
>>>> + liveTile.off("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmstart(event);
>>>> + });
>>>> + liveTile.off("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmresume(event);
>>>> + });
>>>> + liveTile.on("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.openVmConsole(event);
>>>> + });
>>>> + }
>>>> + }
>>>> +
>>>> + //Setup progress bars
>>>> + if (!vmPoweredOffBool) {
>>>> + var cpuUtilization = 0;
>>>> + var cpuMaxThreshold = 80;
>>>> + var cpuMediumThreshold = 60;
>>>> + cpuUtilization =
>>>> parseInt(vmObject.stats.cpu_utilization);
>>>> + result.find('.cpu-progress-bar').width(cpuUtilization + '%');
>>>> + result.find('.processors-percentage').html(cpuUtilization + '%');
>>>> + result.find('.medium-grey.cpu').width(cpuMaxThreshold + '%');
>>>> + result.find('.light-grey.cpu').width(cpuMediumThreshold + '%');
>>>> +
>>>> + var memoryUtilization = 0;
>>>> + var memoryMaxThreshold = 80;
>>>> + var memoryMediumThreshold = 60;
>>>> + memoryUtilization =
>>>> parseInt(vmObject.stats.mem_utilization);
>>>> + result.find('.memory-progress-bar').width(memoryUtilization + '%');
>>>> + result.find('.memory-percentage').html(memoryUtilization + '%');
>>>> + result.find('.medium-grey.memory').width(memoryMaxThreshold + '%');
>>>> + result.find('.light-grey.memory').width(memoryMediumThreshold +
>>>> '%');
>>>> +
>>>> + var ioThroughput = 0;
>>>> + var ioMaxThreshold = 80;
>>>> + var ioMediumThreshold = 60;
>>>> + ioValue = parseInt(vmObject.stats.io_throughput);
>>>> + ioThroughput = (ioValue * 100 /
>>>> vmObject.stats.io_throughput_peak);
>>>> + result.find('.storage-progress-bar').width(ioThroughput + '%');
>>>> + result.find('.storage-percentage').html(Math.round(ioThroughput)
>>>> + 'KB/s');
>>>> + result.find('.medium-grey.io').width(ioMaxThreshold + '%');
>>>> + result.find('.light-grey.io').width(ioMediumThreshold + '%');
>>>> +
>>>> + var netThroughput = 0;
>>>> + var netMaxThreshold = 80;
>>>> + var netMediumThreshold = 60;
>>>> + netValue = parseInt(vmObject.stats.net_throughput);
>>>> + netThroughput = (netValue * 100 /
>>>> vmObject.stats.net_throughput_peak);
>>>> + result.find('.network-progress-bar').width(netThroughput + '%');
>>>> + result.find('.network-percentage').html(Math.round(netThroughput)
>>>> + 'KB/s');
>>>> + result.find('.medium-grey.network').width(netMaxThreshold + '%');
>>>> + result.find('.light-grey.network').width(netMediumThreshold + '%');
>>>> + } else {
>>>> + result.find('.progress').css("display", "none");
>>>> + result.find('.percentage-label').html('--');
>>>> + result.find('.measure-label').html('--');
>>>> + }
>>>> +
>>>> + //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);
>>>> + guestActions.find(".non-persistent-disabled").prop("disabled",
>>>> !vmPersistent);
>>>> + guestActions.find(".reset-disabled").prop("disabled",
>>>> vmPoweredOffBool || !vmPersistent);
>>>> + guestActions.find(".pause-disabled").prop("disabled",
>>>> vmPoweredOffBool || !vmPersistent);
>>>> +
>>>> + if (vmSuspendedBool) { //VM is paused
>>>> + //Hide Start
>>>> + guestActions.find(".running-hidden").hide();
>>>> + //Hide Pause button and menu
>>>> + guestActions.find(".pause-disabled").hide();
>>>> + guestActions.find(".pause-hidden").hide();
>>>> + }
>>>> +
>>>> + if (vmRunningBool) { //VM IS running
>>>> + //Hide Start
>>>> + guestActions.find(".running-hidden").hide();
>>>> + //Hide Resume
>>>> + guestActions.find(".resume-hidden").hide();
>>>> + }
>>>> +
>>>> + if (vmPoweredOffBool) { //VM is powered off
>>>> + result.addClass('inactive');
>>>> + result.find('.distro-icon').addClass('inactive');
>>>> + result.find('.vnc-link').css("display", "none");
>>>> + result.find('.column-vnc').html('--');
>>>> + //Hide PowerOff
>>>> + guestActions.find(".shutoff-hidden").hide();
>>>> + //Hide Pause
>>>> + guestActions.find(".pause-hidden").hide();
>>>> + //Hide Resume
>>>> + guestActions.find(".resume-hidden").hide();
>>>> + }
>>>> +
>>>> + var serialConsoleLinkActions =
>>>> guestActions.find("[name=vm-serial-console]");
>>>> + serialConsoleLinkActions.on("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.openVmSerialConsole(event);
>>>> + });
>>>> +
>>>> + var consoleActions = guestActions.find("[name=vm-console]");
>>>> + var consoleLinkActions = result.find(".vnc-link");
>>>> +
>>>> + if (((vmObject.graphics['type'] == 'vnc') ||
>>>> (vmObject.graphics['type'] == 'spice')) && (!vmPoweredOffBool)) {
>>>> + consoleActions.on("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.openVmConsole(event);
>>>> + });
>>>> + consoleLinkActions.on("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.openVmConsole(event);
>>>> + });
>>>> + consoleActions.show();
>>>> + } else { //we don't recognize the VMs supported graphics,
>>>> so hide the menu choice
>>>> + result.find('.vnc-link').css("display", "none");
>>>> + result.find('.column-vnc').html('--');
>>>> + consoleActions.hide();
>>>> + consoleActions.off("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.openVmConsole(event);
>>>> + });
>>>> + consoleLinkActions.off("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.openVmConsole(event);
>>>> + });
>>>> + }
>>>> +
>>>> + //Setup action event handlers
>>>> + if (!(vmObject.isCloning || vmObject.isCreating ||
>>>> vmObject.isMigrating)) {
>>>> +
>>>> + guestActions.find("[name=vm-start]").on("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmstart(event);
>>>> + });
>>>> + guestActions.find("[name=vm-poweroff]").on("click",
>>>> function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmpoweroff(event);
>>>> + });
>>>> + if ((vmRunningBool) || (vmSuspendedBool)) {
>>>> + //If the guest is not running, do not enable
>>>> reset; otherwise, reset is enabled (when running or paused)
>>>> + guestActions.find("[name=vm-reset]").on("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmreset(event);
>>>> + });
>>>> + //If the guest is not running, do not enable
>>>> shutdown;otherwise, shutdown is enabled (when running or paused)
>>>> + guestActions.find("[name=vm-shutdown]").on("click",
>>>> function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmshutdown(event);
>>>> + });
>>>> + }
>>>> +
>>>> + if (vmSuspendedBool) {
>>>> + guestActions.find("[name=vm-resume]").on("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmresume(event);
>>>> + });
>>>> + }
>>>> +
>>>> + if (vmRunningBool) {
>>>> + guestActions.find("[name=vm-pause]").on("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmsuspend(event);
>>>> + });
>>>> + }
>>>> +
>>>> + guestActions.find("[name=vm-edit]").on("click",
>>>> function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmedit(event);
>>>> + });
>>>> + guestActions.find("[name=vm-delete]").on("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmdelete(event);
>>>> + });
>>>> + guestActions.find("[name=vm-clone]").on("click", function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmclone(event);
>>>> + });
>>>> + guestActions.find("[name=vm-migrate]").on('click', function(event) {
>>>> + event.preventDefault();
>>>> + kimchi.vmmigrate(event);
>>>> + });
>>>> + } else {
>>>> + guestActions.find('.btn').attr('disabled', true);
>>>> + result.find('.guest-done').addClass('hidden');
>>>> + result.find('.guest-state').addClass('hidden');
>>>> + result.find('.guest-pending').removeClass('hidden');
>>>> + pendingText = result.find('.guest-pending .text')
>>>> + if (vmObject.isCloning)
>>>> + pendingText.text(i18n['KCHAPI6009M']);
>>>> + else if (vmObject.isMigrating)
>>>> + pendingText.text(i18n['KCHAPI6012M']);
>>>> + else
>>>> + pendingText.text(i18n['KCHAPI6008M']);
>>>> + }
>>>> + }
>>>> + return result;
>>>> +};
>>>> +
>>>> kimchi.listVmsAuto = function() {
>>>> $('#guests-root-container > .wok-mask').removeClass('hidden');
>>>> @@ -458,465 +918,6 @@ kimchi.listVmsAuto = function() {
>>>> }
>>>> };
>>>> -kimchi.createGuestLi = function(vmObject, prevScreenImage,
>>>> openMenu) {
>>>> - var result = kimchi.guestElem.clone();
>>>> - //Setup the VM list entry
>>>> - var currentState = result.find('.guest-state');
>>>> - var vmRunningBool = (vmObject.state == "running");
>>>> - var vmSuspendedBool = (vmObject.state == "paused");
>>>> - var vmPoweredOffBool = (vmObject.state == "shutoff");
>>>> - var vmPersistent = (vmObject.persistent == true);
>>>> -
>>>> - if (vmObject.state !== 'undefined') {
>>>> - currentState.addClass(vmObject.state);
>>>> - };
>>>> - result.attr('id', vmObject.name);
>>>> - result.data(vmObject);
>>>> -
>>>> - //Add the Name
>>>> - var guestTitle = result.find('.title').attr({'val':
>>>> vmObject.name, 'title': vmObject.name});
>>>> - guestTitle.html(vmObject.name);
>>>> -
>>>> - if(vmObject.screenshot !== null){
>>>> - var scrensh =
>>>> result.find('.screenshot').css('background-image',
>>>> 'url('+vmObject.screenshot+')');
>>>> - scrensh.attr('title', vmObject.name);
>>>> - } else {
>>>> - var scrensh =
>>>> result.find('.screenshot').css('background-image', 'none');
>>>> - scrensh.attr('title', vmObject.name);
>>>> - }
>>>> -
>>>> - //Add the OS Type and Icon
>>>> - var osType = result.find('.column-type.distro-icon');
>>>> - if (vmObject.icon == 'plugins/kimchi/images/icon-fedora.png') {
>>>> - osType.addClass('icon-fedora');
>>>> - osType.attr('val', 'Fedora');
>>>> - osType.html('Fedora');
>>>> - } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-ubuntu.png') {
>>>> - osType.addClass('icon-ubuntu');
>>>> - osType.attr('val', 'Ubuntu');
>>>> - osType.html('Ubuntu');
>>>> - } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-centos.png') {
>>>> - osType.addClass('icon-centos');
>>>> - osType.attr('val', 'Centos');
>>>> - osType.html('Centos');
>>>> - } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-opensuse.png') {
>>>> - osType.addClass('icon-opensuse');
>>>> - osType.attr('val', 'openSUSE');
>>>> - osType.html('openSUSE');
>>>> - } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-gentoo.png') {
>>>> - osType.addClass('icon-gentoo');
>>>> - osType.attr('val', 'Gentoo');
>>>> - osType.html('Gentoo');
>>>> - } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-debian.png') {
>>>> - osType.addClass('icon-debian');
>>>> - osType.attr('val', 'Debian');
>>>> - osType.html('Debian');
>>>> - } else if (vmObject.icon !== null) {
>>>> - osType.css('background-image',vmObject.icon);
>>>> - osType.attr('val', 'Unknown');
>>>> - osType.html('Unknown');
>>>> - } else {
>>>> - //Unknown
>>>> - osType.addClass('icon-unknown');
>>>> - osType.attr('val', 'Unknown');
>>>> - osType.html('Unknown');
>>>> - }
>>>> - //Add the OS Icon to VM name in Gallery View
>>>> - var osName = result.find('.column-name.distro-icon');
>>>> - if (vmObject.icon == 'plugins/kimchi/images/icon-fedora.png') {
>>>> - osName.addClass('icon-fedora');
>>>> - } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-ubuntu.png') {
>>>> - osName.addClass('icon-ubuntu');
>>>> - } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-centos.png') {
>>>> - osName.addClass('icon-centos');
>>>> - } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-opensuse.png') {
>>>> - osName.addClass('icon-opensuse');
>>>> - } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-gentoo.png') {
>>>> - osName.addClass('icon-gentoo');
>>>> - } else if (vmObject.icon ==
>>>> 'plugins/kimchi/images/icon-debian.png') {
>>>> - osName.addClass('icon-debian');
>>>> - } else if (vmObject.icon !== null) {
>>>> - osName.css('background-image',vmObject.icon);
>>>> - } else {
>>>> - osName.addClass('icon-unknown');
>>>> - }
>>>> -
>>>> - //Setup the VM console thumbnail display
>>>> - var curImg = vmObject.icon;
>>>> - if (vmObject.screenshot) {
>>>> - curImg = vmObject.screenshot.replace(/^\//, '');
>>>> - }
>>>> - var load_src = curImg || 'plugins/kimchi/images/icon-vm.png';
>>>> - var tile_src = prevScreenImage || vmObject['load-src'];
>>>> - var liveTile = result.find('div[name=guest-tile] > .tile');
>>>> - liveTile.addClass(vmObject.state);
>>>> - liveTile.find('.imgactive').attr('src', tile_src);
>>>> - var imgLoad = liveTile.find('.imgload');
>>>> - imgLoad.on('load', function() {
>>>> - var oldImg = $(this).parent().find('.imgactive');
>>>> - oldImg.removeClass("imgactive").addClass("imgload");
>>>> - oldImg.attr("src", "");
>>>> - $(this).addClass("imgactive").removeClass("imgload");
>>>> - $(this).off('load');
>>>> - });
>>>> - imgLoad.attr('src', load_src);
>>>> -
>>>> - //Link the stopped tile to the start action, the running tile
>>>> to open the console, and the paused tile to resume
>>>> - if (!(vmObject.isCloning || vmObject.isCreating ||
>>>> vmObject.isMigrating)) {
>>>> - if (vmPoweredOffBool) {
>>>> - liveTile.off("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.openVmConsole(event);
>>>> - });
>>>> - liveTile.off("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmresume(event);
>>>> - });
>>>> - liveTile.on("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmstart(event);
>>>> - });
>>>> - liveTile.hover("click", function(event) {
>>>> - event.preventDefault();
>>>> - $(this).find('.overlay').show()
>>>> - }, function(event) {
>>>> - $(this).find('.overlay').hide()
>>>> - });
>>>> - } else if (vmSuspendedBool) {
>>>> - liveTile.off("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmstart(event);
>>>> - });
>>>> - liveTile.off("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.openVmConsole(event);
>>>> - });
>>>> - liveTile.on("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmresume(event);
>>>> - });
>>>> - liveTile.hover("click", function(event) {
>>>> - event.preventDefault();
>>>> - $(this).find('.overlay').show()
>>>> - }, function(event) {
>>>> - $(this).find('.overlay').hide()
>>>> - });
>>>> - if (vmObject.state = "paused") {
>>>> - liveTile.find('.overlay').attr('src',
>>>> "plugins/kimchi/images/theme-default/ac24_resume.png");
>>>> - liveTile.find('.overlay').attr('alt', "Resume");
>>>> - }
>>>> - liveTile.hover(function(event) {
>>>> - $(this).find('.overlay').show()
>>>> - }, function(event) {
>>>> - $(this).find('.overlay').hide()
>>>> - });
>>>> - } else {
>>>> - liveTile.off("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmstart(event);
>>>> - });
>>>> - liveTile.off("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmresume(event);
>>>> - });
>>>> - liveTile.on("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.openVmConsole(event);
>>>> - });
>>>> - }
>>>> - }
>>>> -
>>>> - //Setup progress bars
>>>> - if (!vmPoweredOffBool) {
>>>> - var cpuUtilization = 0;
>>>> - var cpuMaxThreshold = 80;
>>>> - var cpuMediumThreshold = 60;
>>>> - cpuUtilization = parseInt(vmObject.stats.cpu_utilization);
>>>> - result.find('.cpu-progress-bar').width(cpuUtilization + '%');
>>>> - result.find('.processors-percentage').html(cpuUtilization + '%');
>>>> - result.find('.medium-grey.cpu').width(cpuMaxThreshold + '%');
>>>> - result.find('.light-grey.cpu').width(cpuMediumThreshold + '%');
>>>> -
>>>> - var memoryUtilization = 0;
>>>> - var memoryMaxThreshold = 80;
>>>> - var memoryMediumThreshold = 60;
>>>> - memoryUtilization = parseInt(vmObject.stats.mem_utilization);
>>>> - result.find('.memory-progress-bar').width(memoryUtilization + '%');
>>>> - result.find('.memory-percentage').html(memoryUtilization + '%');
>>>> - result.find('.medium-grey.memory').width(memoryMaxThreshold + '%');
>>>> - result.find('.light-grey.memory').width(memoryMediumThreshold +
>>>> '%');
>>>> -
>>>> - var ioThroughput = 0;
>>>> - var ioMaxThreshold = 80;
>>>> - var ioMediumThreshold = 60;
>>>> - ioValue = parseInt(vmObject.stats.io_throughput);
>>>> - ioThroughput = (ioValue * 100 /
>>>> vmObject.stats.io_throughput_peak);
>>>> - result.find('.storage-progress-bar').width(ioThroughput + '%');
>>>> - result.find('.storage-percentage').html(Math.round(ioThroughput)
>>>> + 'KB/s');
>>>> - result.find('.medium-grey.io').width(ioMaxThreshold + '%');
>>>> - result.find('.light-grey.io').width(ioMediumThreshold + '%');
>>>> -
>>>> - var netThroughput = 0;
>>>> - var netMaxThreshold = 80;
>>>> - var netMediumThreshold = 60;
>>>> - netValue = parseInt(vmObject.stats.net_throughput);
>>>> - netThroughput = (netValue * 100 /
>>>> vmObject.stats.net_throughput_peak);
>>>> - result.find('.network-progress-bar').width(netThroughput + '%');
>>>> - result.find('.network-percentage').html(Math.round(netThroughput)
>>>> + 'KB/s');
>>>> - result.find('.medium-grey.network').width(netMaxThreshold + '%');
>>>> - result.find('.light-grey.network').width(netMediumThreshold + '%');
>>>> - } else {
>>>> - result.find('.progress').css("display", "none");
>>>> - result.find('.percentage-label').html('--');
>>>> - result.find('.measure-label').html('--');
>>>> - }
>>>> -
>>>> - //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);
>>>> - guestActions.find(".non-persistent-disabled").prop("disabled",
>>>> !vmPersistent);
>>>> - guestActions.find(".reset-disabled").prop("disabled",
>>>> vmPoweredOffBool || !vmPersistent);
>>>> - guestActions.find(".pause-disabled").prop("disabled",
>>>> vmPoweredOffBool || !vmPersistent);
>>>> -
>>>> - if (vmSuspendedBool) { //VM is paused
>>>> - //Hide Start
>>>> - guestActions.find(".running-hidden").hide();
>>>> - //Hide Pause button and menu
>>>> - guestActions.find(".pause-disabled").hide();
>>>> - guestActions.find(".pause-hidden").hide();
>>>> - }
>>>> -
>>>> - if (vmRunningBool) { //VM IS running
>>>> - //Hide Start
>>>> - guestActions.find(".running-hidden").hide();
>>>> - //Hide Resume
>>>> - guestActions.find(".resume-hidden").hide();
>>>> - }
>>>> -
>>>> - if (vmPoweredOffBool) { //VM is powered off
>>>> - result.addClass('inactive');
>>>> - result.find('.distro-icon').addClass('inactive');
>>>> - result.find('.vnc-link').css("display", "none");
>>>> - result.find('.column-vnc').html('--');
>>>> - //Hide PowerOff
>>>> - guestActions.find(".shutoff-hidden").hide();
>>>> - //Hide Pause
>>>> - guestActions.find(".pause-hidden").hide();
>>>> - //Hide Resume
>>>> - guestActions.find(".resume-hidden").hide();
>>>> - }
>>>> -
>>>> - var serialConsoleLinkActions =
>>>> guestActions.find("[name=vm-serial-console]");
>>>> - serialConsoleLinkActions.on("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.openVmSerialConsole(event);
>>>> - });
>>>> -
>>>> - var consoleActions = guestActions.find("[name=vm-console]");
>>>> - var consoleLinkActions = result.find(".vnc-link");
>>>> -
>>>> - if (((vmObject.graphics['type'] == 'vnc') ||
>>>> (vmObject.graphics['type'] == 'spice'))
>>>> - && (!vmPoweredOffBool)) {
>>>> - consoleActions.on("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.openVmConsole(event);
>>>> - });
>>>> - consoleLinkActions.on("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.openVmConsole(event);
>>>> - });
>>>> - consoleActions.show();
>>>> - } else { //we don't recognize the VMs supported graphics, so
>>>> hide the menu choice
>>>> - result.find('.vnc-link').css("display", "none");
>>>> - result.find('.column-vnc').html('--');
>>>> - consoleActions.hide();
>>>> - consoleActions.off("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.openVmConsole(event);
>>>> - });
>>>> - consoleLinkActions.off("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.openVmConsole(event);
>>>> - });
>>>> - }
>>>> -
>>>> - //Setup action event handlers
>>>> - if (!(vmObject.isCloning || vmObject.isCreating ||
>>>> vmObject.isMigrating)) {
>>>> -
>>>> - guestActions.find("[name=vm-start]").on("click",
>>>> function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmstart(event);
>>>> - });
>>>> - guestActions.find("[name=vm-poweroff]").on("click",
>>>> function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmpoweroff(event);
>>>> - });
>>>> - if ((vmRunningBool) || (vmSuspendedBool)) {
>>>> - //If the guest is not running, do not enable reset;
>>>> otherwise, reset is enabled (when running or paused)
>>>> - guestActions.find("[name=vm-reset]").on("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmreset(event);
>>>> - });
>>>> - //If the guest is not running, do not enable
>>>> shutdown;otherwise, shutdown is enabled (when running or paused)
>>>> - guestActions.find("[name=vm-shutdown]").on("click",
>>>> function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmshutdown(event);
>>>> - });
>>>> - }
>>>> -
>>>> - if (vmSuspendedBool) {
>>>> - guestActions.find("[name=vm-resume]").on("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmresume(event);
>>>> - });
>>>> - }
>>>> -
>>>> - if (vmRunningBool) {
>>>> - guestActions.find("[name=vm-pause]").on("click", function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmsuspend(event);
>>>> - });
>>>> - }
>>>> -
>>>> - guestActions.find("[name=vm-edit]").on("click",
>>>> function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmedit(event);
>>>> - });
>>>> - guestActions.find("[name=vm-delete]").on("click",
>>>> function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmdelete(event);
>>>> - });
>>>> - guestActions.find("[name=vm-clone]").on("click",
>>>> function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmclone(event);
>>>> - });
>>>> - guestActions.find("[name=vm-migrate]").on('click',
>>>> function(event) {
>>>> - event.preventDefault();
>>>> - kimchi.vmmigrate(event);
>>>> - });
>>>> - } else {
>>>> - guestActions.find('.btn').attr('disabled', true);
>>>> - result.find('.guest-done').addClass('hidden');
>>>> - result.find('.guest-state').addClass('hidden');
>>>> - result.find('.guest-pending').removeClass('hidden');
>>>> - pendingText = result.find('.guest-pending .text')
>>>> - if (vmObject.isCloning)
>>>> - pendingText.text(i18n['KCHAPI6009M']);
>>>> - else if (vmObject.isMigrating)
>>>> - pendingText.text(i18n['KCHAPI6012M']);
>>>> - else
>>>> - pendingText.text(i18n['KCHAPI6008M']);
>>>> - }
>>>> - return result;
>>>> -};
>>>> -
>>>> -kimchi.guestSetRequestHeader = function(xhr) {
>>>> - xhr.setRequestHeader('Accept', 'text/html');
>>>> -};
>>>> -
>>>> -kimchi.toggleGuestsGallery = function() {
>>>> - $(".wok-guest-list,
>>>> .wok-guest-gallery").toggleClass("wok-guest-list wok-guest-gallery");
>>>> - $(".wok-list, .wok-gallery").toggleClass("wok-list wok-gallery");
>>>> - var text = $('#guest-gallery-table-button span.text').text();
>>>> - $('#guest-gallery-table-button span.text').text(text ==
>>>> i18n['KCHTMPL6005M'] ? i18n['KCHTMPL6004M'] : i18n['KCHTMPL6005M']);
>>>> - var buttonText = $('#guest-gallery-table-button
>>>> span.text').text();
>>>> - if (buttonText.indexOf("Gallery") !== -1) {
>>>> - // Currently in list view
>>>> - kimchi.setGuestView("guestView", "list");
>>>> - } else {
>>>> - // Currently in gallery
>>>> - kimchi.setGuestView("guestView", "gallery");
>>>> - }
>>>> -};
>>>> -
>>>> -kimchi.setGuestView = function(name, value) {
>>>> - window.localStorage.setItem(name, value);
>>>> -};
>>>> -
>>>> -kimchi.readGuestView = function(name) {
>>>> - var viewName = window.localStorage.getItem(name);
>>>> - if (viewName !== "") {
>>>> - return viewName;
>>>> - } else {
>>>> - return null;
>>>> - }
>>>> -};
>>>> -
>>>> -kimchi.showGuestGallery = function() {
>>>> - $(".wok-guest-list").addClass("wok-guest-gallery");
>>>> - $(".wok-list").addClass("wok-gallery");
>>>> - $(".wok-guest-gallery").removeClass("wok-guest-list");
>>>> - $(".wok-gallery").removeClass("wok-list");
>>>> - $('#guest-gallery-table-button
>>>> span.text').text(i18n['KCHTMPL6004M']);
>>>> -};
>>>> -
>>>> -kimchi.showGuestList = function() {
>>>> - $(".wok-guest-list").removeClass("wok-guest-gallery");
>>>> - $(".wok-list").removeClass("wok-gallery");
>>>> - $(".wok-guest-gallery").addClass("wok-guest-list");
>>>> - $(".wok-gallery").addClass("wok-list");
>>>> - $('#guest-gallery-table-button
>>>> span.text').text(i18n['KCHTMPL6005M']);
>>>> -};
>>>> -
>>>> -kimchi.guest_main = function() {
>>>> - $('body').addClass('wok-list');
>>>> - var viewFound = kimchi.readGuestView("guestView");
>>>> - if (viewFound) {
>>>> - if(viewFound === "gallery") {
>>>> - // should be showing gallery
>>>> - kimchi.showGuestGallery();
>>>> - } else {
>>>> - // Should be showing list
>>>> - kimchi.showGuestList();
>>>> - }
>>>> - } else {
>>>> - // Default to showing list
>>>> - kimchi.showGuestList();
>>>> - }
>>>> - if (wok.tabMode['guests'] === 'admin') {
>>>> - $('.tools').attr('style', 'display');
>>>> - $("#vm-add").on("click", function(event) {
>>>> - wok.window.open('plugins/kimchi/guest-add.html');
>>>> - });
>>>> - }
>>>> - kimchi.guestTemplate = $('#guest-tmpl').html();
>>>> - kimchi.guestElem =
>>>> $('<div/>').html(kimchi.guestTemplate).find('li[name="guest"]');
>>>> - $('#guests-root-container').on('remove', function() {
>>>> - kimchi.vmTimeout && clearTimeout(kimchi.vmTimeout);
>>>> - });
>>>> -
>>>> - $('#guest-gallery-table-button').on('click', function(event) {
>>>> - kimchi.toggleGuestsGallery();
>>>> - });
>>>> -
>>>> - kimchi.resetGuestFilter();
>>>> - kimchi.initGuestFilter();
>>>> - kimchi.listVmsAuto();
>>>> -};
>>>> -
>>>> -kimchi.guest_clonevm_main = function() {
>>>> - kimchi.initCloneDialog();
>>>> -};
>>>> -
>>>> -kimchi.initCloneDialog = function(callback) {
>>>> - $("#numberClone").val("1");
>>>> - $("#cloneFormOk").on("click", function() {
>>>> - //Check if input is a number
>>>> - var numClone = parseInt($('#numberClone').val());
>>>> - var err = "";
>>>> - if (isNaN(numClone)) {
>>>> - err = i18n['KCHVM0001E'];
>>>> - wok.message.error(err,'#alert-modal-container');
>>>> - } else {
>>>> - $("#cloneFormOk").prop("disabled", true);
>>>> - kimchi.initClone();
>>>> - }
>>>> - });
>>>> -};
>>>> -
>>>> -
>>>> -
>>>> kimchi.editTemplate = function(guestTemplate, oldPopStat) {
>>>> if (oldPopStat) {
>>>> return guestTemplate.replace("vm-action", "vm-action open");
>>>> diff --git a/ui/js/src/kimchi.template_main.js
>>>> b/ui/js/src/kimchi.template_main.js
>>>> index ed49246..302d906 100644
>>>> --- a/ui/js/src/kimchi.template_main.js
>>>> +++ b/ui/js/src/kimchi.template_main.js
>>>> @@ -28,7 +28,9 @@ kimchi.doListTemplates = function() {
>>>> if ($.isEmptyObject(value.invalid)) {
>>>> value.invalid_indicator = "valid";
>>>> }
>>>> - listHtml += wok.substitute(templateHtml, value);
>>>> + if (typeof templateHtml !== 'undefined') {
>>>> + listHtml += wok.substitute(templateHtml, value);
>>>> + }
>>>> });
>>>> $('ul#templates-grid').removeClass('hidden');
>>>> $('#templates-container').removeClass('hidden');
>>>
>>> _______________________________________________
>>> Kimchi-devel mailing list
>>> Kimchi-devel at ovirt.org
>>> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>>
>>
>
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
More information about the Kimchi-devel
mailing list