[Kimchi-devel] [PATCH] [Kimchi] Issue #968: Kimchi is searching for 'undefined' VM
Aline Manera
alinefm at linux.vnet.ibm.com
Tue Jul 26 20:15:00 UTC 2016
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