[Kimchi-devel] [PATCH] [Kimchi] Issue #968: Kimchi is searching for 'undefined' VM
Socorro Stoppler
socorro at linux.vnet.ibm.com
Tue Jul 26 20:18:00 UTC 2016
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
>
>
More information about the Kimchi-devel
mailing list