[Kimchi-devel] [PATCH 2/3] [new-ui] Guests tab
sguimaraes943 at gmail.com
sguimaraes943 at gmail.com
Thu Nov 26 18:29:34 UTC 2015
From: samhenri <samuel.guimaraes at eldorado.org.br>
Signed-off-by: samhenri <samuel.guimaraes at eldorado.org.br>
---
.../plugins/kimchi/ui/css/theme-default/list.css | 330 ----------
.../plugins/kimchi/ui/js/src/kimchi.guest_main.js | 677 +++++++++++++--------
src/wok/plugins/kimchi/ui/pages/guest.html.tmpl | 122 ++--
src/wok/plugins/kimchi/ui/pages/guests.html.tmpl | 33 +-
.../plugins/kimchi/ui/pages/templates.html.tmpl | 2 +-
ui/css/src/modules/_guests.scss | 237 ++++++++
ui/images/theme-default/icon-unknown.png | Bin 761 -> 3797 bytes
7 files changed, 757 insertions(+), 644 deletions(-)
delete mode 100644 src/wok/plugins/kimchi/ui/css/theme-default/list.css
diff --git a/src/wok/plugins/kimchi/ui/css/theme-default/list.css b/src/wok/plugins/kimchi/ui/css/theme-default/list.css
deleted file mode 100644
index 1f75f6c..0000000
--- a/src/wok/plugins/kimchi/ui/css/theme-default/list.css
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Project Kimchi
- *
- * Copyright IBM, Corp. 2013-2015
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-.list-vm {
- margin: 10px;
-}
-
-/* Generated at http://colorzilla.com/gradient-editor/ */
-.list-vm>li {
- margin-bottom: 10px;
- background: #ffffff;
- background: -moz-linear-gradient(top, #ffffff 0%, #e5e5e5 100%);
- background: -webkit-gradient(linear, left top, left bottom,
- color-stop(0%, #ffffff), color-stop(100%, #e5e5e5));
- background: -webkit-linear-gradient(top, #ffffff 0%, #e5e5e5 100%);
- background: -o-linear-gradient(top, #ffffff 0%, #e5e5e5 100%);
- background: -ms-linear-gradient(top, #ffffff 0%, #e5e5e5 100%);
- background: linear-gradient(to bottom, #ffffff 0%, #e5e5e5 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',
- endColorstr='#e5e5e5', GradientType=0);
- border: 1px solid #ccc;
- color: #333;
- -webkit-border-radius: 8px;
- -moz-border-radius: 8px;
- border-radius: 8px;
-}
-
-.list-vm li>* {
- height: 130px;
- display: table-cell;
- vertical-align: top;
- position: relative;
- border-left: 1px solid #ccc;
- border-right: 1px solid #fff;
-}
-
-.list-vm li>*:FIRST-CHILD {
- border-left: none;
-}
-
-.list-vm li>*:LAST-CHILD {
- border-right: none;
-}
-
-.list-vm li>.guest-tile{
- text-align: center;
- vertical-align: middle;
-}
-
-.list-vm .handle {
- display: block;
- width: 50px;
- height: 130px;
- box-sizing: border-box;
- box-shadow: inset 4px 4px 4px #0289e2, inset -4px -4px 4px #04385d;
- background: #0b6bad url(../images/theme-default/arrow_out.png) center
- center no-repeat;
- border-top-right: 1px solid #CCC;
- -webkit-border-top-right-radius: 8px;
- -moz-border-top-right-radius: 8px;
- border-top-right-radius: 8px;
- border-bottom-right: 1px solid #CCC;
- -webkit-border-bottom-right-radius: 8px;
- -moz-border-bottom-right-radius: 8px;
- border-bottom-right-radius: 8px;
-}
-
-.list-vm .subtitle {
- color: #666;
- font-size: 13px;
- text-align: center;
- line-height: 10px;
- font-weight: bold;
-}
-
-.list-vm .tile .imgload {
- display: none;
-}
-
-.list-vm .tile.shutoff .imgactive {
- max-height: 110px;
- max-width: 170px;
- height: auto;
- width: auto;
- display:inline;
- border: none;
- position: relative;
-}
-
-.list-vm .tile.paused .imgactive {
- max-height: 110px;
- max-width: 170px;
- height: auto;
- width: auto;
- display:inline;
- border: none;
- position: relative;
-}
-
-.list-vm .tile.running .imgactive{
- max-height: 110px;
- max-width: 170px;
- height: auto;
- width: auto;
- display:inline;
- border: none;
- cursor: crosshair;
- cursor: -moz-zoom-in;
- cursor: -webkit-zoom-in;
-}
-
-.list-vm .tile .overlay {
- max-height: 110px;
- max-width: 170px;
- height: auto;
- width: auto;
- position:absolute;
- bottom:0;
- right:0;
- display:none;
-}
-
-.guest-type {
- width: 257px;
-}
-
-.guest-cpu {
- width: 90px;
-}
-
-.guest-memory {
- width: 90px;
-}
-
-.guest-network {
- width: 95px;
-}
-
-.guest-storage {
- width: 90px;
-}
-
-.guest-tile {
- width: 190px;
-}
-
-.guest-users {
- width: 93px;
-}
-
-.guest-actions {
- width: 125px;
- min-width: 125px;
-}
-
-.guest-handle {
- width: 50px;
-}
-
-.guest-general {
- padding: 10px;
- border-bottom: 1px solid #ccc;
- width: 237px;
-}
-
-.guest-ip {
- padding: 0 10px;
- border-top: 1px solid #fff;
-}
-
-.guest-general .title {
- color: #666;
- font-size: 16px;
- font-weight: normal;
- height: 25px;
- line-height: 25px;
- text-shadow: -1px -1px 1px #ccc, 1px 1px 1px #fff;
- max-width: 237px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.guest-general .text {
- font-weight: bold;
- color: #999;
- font-size: 11px;
- text-shadow: -1px -1px 1px #ccc, 1px 1px 1px #fff;
-}
-
-.guest-users .top {
- border-bottom: 1px solid #ccc;
- padding: 3px 10px;
-}
-
-.guest-users .bottom {
- border-top: 1px solid #fff;
- padding: 3px 10px;
-}
-
-.guest-users .users {
- height: 45px;
- line-height: 45px;
- background: url(../images/theme-default/icon-user.png) left
- center no-repeat;
- padding-left: 50px;
- font-size: 36px;
- font-weight: bold;
-}
-
-.guest-users .snapshots {
- height: 40px;
- line-height: 40px;
- background: url(../images/theme-default/icon-camera.png) left
- center no-repeat;
- padding-left: 50px;
- font-size: 36px;
- font-weight: bold;
-}
-
-.guest-users .mini-text {
- font-size: 11px;
- font-weight: normal;
- text-shadow: -1px -1px 1px #ccc, 1px 1px 1px #fff;
-}
-
-.guest-actions .top {
- padding: 7px 10px;
- width: 200px;
-}
-
-.guest-actions .top button {
- display: inline-block;
- width: 42px;
- height: 42px;
-}
-
- at -moz-document url-prefix() {
- .guest-actions .top button span {
- margin-left: -3px;
- margin-top: -1px;
- }
-}
-
-.guest-actions .bottom {
- padding: 0 10px;
-}
-
-.list-vm .tile {
- max-width: 170px;
- max-height: 110px;
- width: auto;
- height: auto;
- margin: 10px;
-}
-
-.list-vm .tile:not(.shutoff) && .tile:not(.paused) img {
- box-shadow: -1px -1px 2px rgb(0, 0, 0, .25), 3px 3px 3px #fff;
-}
-
-.list-vm .shutoff {
- position: relative;
- box-shadow: none !important;
-}
-
-.list-vm .shutoff img {
- opacity: 0.4;
-}
-
-.list-vm .paused {
- position: relative;
- box-shadow: none !important;
-}
-
-.list-vm .paused img {
- opacity: 0.6;
-}
-
-.list-title {
- color: #666;
- font-weight: bold;
- font-size: 12px;
- overflow: hidden;
- margin: 10px;
-}
-
-.list-title li {
- display: table-cell;
- padding: 0 1px;
-}
-
-.list-no-result {
- font-size: 16px;
- height: 48px;
- line-height: 48px;
- text-shadow: -1px -1px 1px #ccc, 1px 1px 1px #fff;
- padding-left: 10px;
-}
-
-.guest-pending {
- margin: 10px;
-}
-
-.guest-pending .icon {
- background: url('../images/theme-default/kimchi-loading15x15.gif') no-repeat;
- display: inline-block;
- width: 20px;
- height: 20px;
- vertical-align: middle;
-}
-
-.guest-pending .text {
- color: #666666;
- margin-left: 5px;
- text-shadow: -1px -1px 1px #CCCCCC, 1px 1px 1px #FFFFFF;
-}
diff --git a/src/wok/plugins/kimchi/ui/js/src/kimchi.guest_main.js b/src/wok/plugins/kimchi/ui/js/src/kimchi.guest_main.js
index eb563fb..3287c00 100644
--- a/src/wok/plugins/kimchi/ui/js/src/kimchi.guest_main.js
+++ b/src/wok/plugins/kimchi/ui/js/src/kimchi.guest_main.js
@@ -46,19 +46,29 @@ kimchi.sampleGuestObject = {
};
kimchi.vmstart = function(event) {
- var button=$(this);
- if (!button.hasClass('loading')) {
- button.addClass('loading');
- var vm=$(this).closest('li[name=guest]');
- var vm_id=vm.attr("id");
+ var button = event.target;
+ if (!$(button).hasClass('loading')) {
+ $(button).addClass('loading');
+ var vm = $(button).closest('li[name=guest]');
+ var vm_id = $(vm).attr("id");
+ // setting up css class when starting
+ $(vm).find('.guest-state').removeClass('shutoff');
+ $(vm).find('.guest-state').addClass('starting');
+ $(vm).find('.progress').css("display", "none");
+ $(vm).find('.percentage - label').html('--');
+ $(vm).find('.measure-label').html('--');
+ $(vm).find('.guest-actions').css("margin-top", "3px");
+ $(vm).addClass('inactive');
+ $(vm).find('.distro-icon').addClass('inactive');
+ $(vm).find('.vnc-link').css("display", "none");
+ $(vm).find('.column-vnc').html('--');
kimchi.startVM(vm_id, function(result) {
- button.removeClass('loading');
+ $(button).removeClass('loading');
kimchi.listVmsAuto();
- }, function(err) {
- button.removeClass('loading');
- wok.message.error(err.responseJSON.reason);
- }
- );
+ }, function(err) {
+ $(button).removeClass('loading');
+ wok.message.error(err.responseJSON.reason);
+ });
} else {
event.preventDefault();
event.stopPropagation();
@@ -67,19 +77,18 @@ kimchi.vmstart = function(event) {
};
kimchi.vmsuspend = function(event) {
- var button=$(this);
- if (!button.hasClass('pause-gray')) {
- button.addClass('pause-gray');
- var vm=$(this).closest('li[name=guest]');
- var vm_id=vm.attr("id");
+ var button = event.target;
+ if (!$(button).hasClass('pause-gray')) {
+ $(button).addClass('pause-gray');
+ var vm = $(button).closest('li[name=guest]');
+ var vm_id = $(vm).attr("id");
kimchi.suspendVM(vm_id, function(result) {
- button.removeClass('pause-gray');
+ $(button).removeClass('pause-gray');
kimchi.listVmsAuto();
- }, function(err) {
- button.removeClass('pause-gray');
- wok.message.error(err.responseJSON.reason);
- }
- );
+ }, function(err) {
+ $(button).removeClass('pause-gray');
+ wok.message.error(err.responseJSON.reason);
+ });
} else {
event.preventDefault();
event.stopPropagation();
@@ -88,19 +97,18 @@ kimchi.vmsuspend = function(event) {
};
kimchi.vmresume = function(event) {
- var button=$(this);
- if (!button.hasClass('resume-gray')) {
- button.addClass('resume-gray');
- var vm=$(this).closest('li[name=guest]');
- var vm_id=vm.attr("id");
+ var button = event.target;
+ if (!$(button).hasClass('resume-gray')) {
+ $(button).addClass('resume-gray');
+ var vm = $(button).closest('li[name=guest]');
+ var vm_id = vm.attr("id");
kimchi.resumeVM(vm_id, function(result) {
- button.removeClass('resume-gray');
+ $(button).removeClass('resume-gray');
kimchi.listVmsAuto();
- }, function(err) {
- button.removeClass('resume-gray');
- wok.message.error(err.responseJSON.reason);
- }
- );
+ }, function(err) {
+ $(button).removeClass('resume-gray');
+ wok.message.error(err.responseJSON.reason);
+ });
} else {
event.preventDefault();
event.stopPropagation();
@@ -109,84 +117,95 @@ kimchi.vmresume = function(event) {
};
kimchi.vmpoweroff = function(event) {
- var button=$(this);
- if (!button.hasClass('loading')) {
- button.addClass('loading');
- var vm=button.closest('li[name=guest]');
- var vm_id=vm.attr("id");
- var vmObject=vm.data();
- var vm_persistent=vmObject.persistent == true;
+ var button = event.target;
+ if (!$(button).hasClass('loading')) {
+ $(button).addClass('loading');
+ var vm = $(button).closest('li[name=guest]');
+ var vm_id = vm.attr("id");
+ var vmObject = vm.data();
+ var vm_persistent = vmObject.persistent == true;
var content_msg = vm_persistent ? i18n['KCHVM6003M'] :
i18n['KCHVM6009M'];
var settings = {
- title : i18n['KCHVM6002M'],
- content : content_msg,
- confirm : i18n['KCHAPI6002M'],
- cancel : i18n['KCHAPI6003M']
+ title: i18n['KCHVM6002M'],
+ content: content_msg,
+ confirm: i18n['KCHAPI6002M'],
+ cancel: i18n['KCHAPI6003M']
};
wok.confirm(settings, function() {
kimchi.poweroffVM(vm_id, function(result) {
- button.removeClass('loading');
+ $(button).removeClass('loading');
kimchi.listVmsAuto();
}, function(err) {
wok.message.error(err.responseJSON.reason);
});
- }, function() {
- });
+ }, function() {});
} else {
event.preventDefault();
event.stopPropagation();
}
};
-kimchi.vmshutdown = function(event){
- var vm=$(this).closest('li[name=guest]');
- var vm_id=vm.attr("id");
+kimchi.vmshutdown = function(event) {
+ var button = event.target;
+ var vm = $(button).closest('li[name=guest]');
+ var vm_id = vm.attr("id");
var settings = {
- title : i18n['KCHVM6006M'],
- content : i18n['KCHVM6007M'],
- confirm : i18n['KCHAPI6002M'],
- cancel : i18n['KCHAPI6003M']
+ title: i18n['KCHVM6006M'],
+ content: i18n['KCHVM6007M'],
+ confirm: i18n['KCHAPI6002M'],
+ cancel: i18n['KCHAPI6003M']
};
wok.confirm(settings, function() {
kimchi.shutdownVM(vm_id, function(result) {
- kimchi.listVmsAuto();
- }, function(err) {
- wok.message.error(err.responseJSON.reason);
- }
- );
- }, function() {
- });
+ kimchi.listVmsAuto();
+ }, function(err) {
+ wok.message.error(err.responseJSON.reason);
+ });
+ }, function() {});
};
-kimchi.vmreset = function(event){
- var vm=$(this).closest('li[name=guest]');
- var vm_id=vm.attr("id");
- var settings = {
- title : i18n['KCHVM6004M'],
- content : i18n['KCHVM6005M'],
- confirm : i18n['KCHAPI6002M'],
- cancel : i18n['KCHAPI6003M']
- };
- wok.confirm(settings, function() {
- kimchi.resetVM(vm_id, function(result) {
+kimchi.vmreset = function(event) {
+ var button = event.target;
+ if (!$(button).hasClass('loading')) {
+ $(button).addClass('loading');
+ var vm = $(button).closest('li[name=guest]');
+ var vm_id = $(vm).attr("id");
+ var settings = {
+ title: i18n['KCHVM6004M'],
+ content: i18n['KCHVM6005M'],
+ confirm: i18n['KCHAPI6002M'],
+ cancel: i18n['KCHAPI6003M']
+ };
+ wok.confirm(settings, function() {
+ // setting up css class when resetting
+ $(vm).find('.guest-state').removeClass('running');
+ $(vm).find('.guest-state').addClass('resetting');
+ $(vm).find('.fa-spin').addClass('active');
+ kimchi.resetVM(vm_id, function(result) {
+ $(button).removeClass('loading');
kimchi.listVmsAuto();
}, function(err) {
+ $(button).removeClass('loading');
wok.message.error(err.responseJSON.reason);
- }
- );
- }, function() {
- });
+ });
+ }, function() {});
+ } else {
+ event.preventDefault();
+ event.stopPropagation();
+ return;
+ }
};
kimchi.vmdelete = function(event) {
- var vm = $(this).closest('li[name=guest]');
- var vm_id=vm.attr("id");
+ var button = event.target;
+ var vm = $(button).closest('li[name=guest]');
+ var vm_id = $(vm).attr("id");
var settings = {
- title : i18n['KCHVM6008M'],
- content : i18n['KCHVM6001M'],
- confirm : i18n['KCHAPI6002M'],
- cancel : i18n['KCHAPI6003M']
+ title: i18n['KCHVM6008M'],
+ content: i18n['KCHVM6001M'],
+ confirm: i18n['KCHAPI6002M'],
+ cancel: i18n['KCHAPI6003M']
};
wok.confirm(settings, function() {
kimchi.deleteVM(vm_id, function(result) {
@@ -194,13 +213,13 @@ kimchi.vmdelete = function(event) {
}, function(err) {
wok.message.error(err.responseJSON.reason);
});
- }, function() {
- });
+ }, function() {});
};
kimchi.vmedit = function(event) {
- var vm = $(this).closest('li[name=guest]');
- var vm_id=vm.attr("id");
+ var button = event.target;
+ var vm = $(button).closest('li[name=guest]');
+ var vm_id = $(vm).attr("id");
kimchi.selectedGuest = vm_id;
wok.window.open({
url: 'plugins/kimchi/guest-edit.html',
@@ -211,13 +230,13 @@ kimchi.vmedit = function(event) {
};
kimchi.openVmConsole = function(event) {
- var vm=$(this).closest('li[name=guest]');
- var vmObject=vm.data();
+ var button = event.target;
+ var vm = $(button).closest('li[name=guest]');
+ var vmObject = $(vm).data();
if (vmObject.graphics['type'] == 'vnc') {
- kimchi.vncToVM(vm.attr('id'));
- }
- else if (vmObject.graphics['type'] == 'spice') {
- kimchi.spiceToVM(vm.attr('id'));
+ kimchi.vncToVM($(vm).attr('id'));
+ } else if (vmObject.graphics['type'] == 'spice') {
+ kimchi.spiceToVM($(vm).attr('id'));
}
};
@@ -232,95 +251,150 @@ kimchi.getVmsCurrentConsoleImgs = function() {
kimchi.getOpenMenuVmId = function() {
var result;
- var openMenu = $('#guestList div[name="actionmenu"] .popover:visible');
- if(openMenu) {
- var li_element=openMenu.closest('li');
- result=li_element.attr('id');
+ var openMenu = $('#guestList div[name="actionmenu"] .dropdown-menu:visible');
+ if (openMenu) {
+ var li_element = openMenu.closest('li');
+ result = li_element.attr('id');
}
return result;
};
kimchi.listVmsAuto = function() {
- if (kimchi.vmTimeout) {
- clearTimeout(kimchi.vmTimeout);
- }
- var getCreatingGuests = function(){
- var guests = [];
- kimchi.getTasksByFilter('status=running&target_uri='+encodeURIComponent('^/plugins/kimchi/vms/[^/]+$'), function(tasks) {
- for(var i=0;i<tasks.length;i++){
- var guestUri = tasks[i].target_uri;
- var guestName = guestUri.split('/')[4]
- guests.push($.extend({}, kimchi.sampleGuestObject, {name: guestName, isCreating: true}));
- if(kimchi.trackingTasks.indexOf(tasks[i].id)==-1)
- kimchi.trackTask(tasks[i].id, null, function(err){
- wok.message.error(err.message);
- }, null);
- }
- }, null, true);
- return guests;
- };
- var getCloningGuests = function(){
- var guests = [];
- kimchi.getTasksByFilter('status=running&target_uri='+encodeURIComponent('^/plugins/kimchi/vms/.+/clone'), function(tasks) {
- for(var i=0;i<tasks.length;i++){
- var guestUri = tasks[i].target_uri;
- var guestName = guestUri.split('/')[4]
- guests.push($.extend({}, kimchi.sampleGuestObject, {name: guestName, isCloning: true}));
- if(kimchi.trackingTasks.indexOf(tasks[i].id)==-1)
- kimchi.trackTask(tasks[i].id, null, function(err){
- wok.message.error(err.message);
- }, null);
- }
- }, null, true);
- return guests;
- };
- kimchi.listVMs(function(result, textStatus, jqXHR) {
- if (result && textStatus=="success") {
- result = getCloningGuests().concat(result);
- result = getCreatingGuests().concat(result);
- if(result.length) {
- var listHtml = '';
- var guestTemplate = kimchi.guestTemplate;
- var currentConsoleImages = kimchi.getVmsCurrentConsoleImgs();
- var openMenuGuest = kimchi.getOpenMenuVmId();
- $('#guestList').empty();
- $('#guestListField').show();
- $('#noGuests').hide();
-
- $.each(result, function(index, vm) {
- var guestLI = kimchi.createGuestLi(vm, currentConsoleImages[vm.name], vm.name==openMenuGuest);
- $('#guestList').append(guestLI);
- });
- } else {
- $('#guestListField').hide();
- $('#noGuests').show();
- }
- }
-
- kimchi.vmTimeout = window.setTimeout("kimchi.listVmsAuto();", 5000);
- }, function(errorResponse, textStatus, errorThrown) {
- if(errorResponse.responseJSON && errorResponse.responseJSON.reason) {
- wok.message.error(errorResponse.responseJSON.reason);
+ //Check if the actions button is opened or not,
+ //if opended stop the reload of the itens until closed
+ var $isDropdownOpened = $('[name="guest-actions"] ul.dropdown-menu').is(":visible");
+ if (!$isDropdownOpened) {
+ if (kimchi.vmTimeout) {
+ clearTimeout(kimchi.vmTimeout);
}
+ var getCreatingGuests = function() {
+ var guests = [];
+ kimchi.getTasksByFilter('status=running&target_uri=' + encodeURIComponent('^/plugins/kimchi/vms/[^/]+$'), function(tasks) {
+ for (var i = 0; i < tasks.length; i++) {
+ var guestUri = tasks[i].target_uri;
+ var guestName = guestUri.split('/')[2]
+ guests.push($.extend({}, kimchi.sampleGuestObject, {
+ name: guestName,
+ isCreating: true
+ }));
+ if (kimchi.trackingTasks.indexOf(tasks[i].id) == -1)
+ kimchi.trackTask(tasks[i].id, null, function(err) {
+ wok.message.error(err.message);
+ }, null);
+ }
+ }, null, true);
+ return guests;
+ };
+ var getCloningGuests = function() {
+ var guests = [];
+ kimchi.getTasksByFilter('status=running&target_uri=' + encodeURIComponent('^/plugins/kimchi/vms/.+/clone'), function(tasks) {
+ for (var i = 0; i < tasks.length; i++) {
+ var guestUri = tasks[i].target_uri;
+ var guestName = guestUri.split('/')[2]
+ guests.push($.extend({}, kimchi.sampleGuestObject, {
+ name: guestName,
+ isCloning: true
+ }));
+ if (kimchi.trackingTasks.indexOf(tasks[i].id) == -1)
+ kimchi.trackTask(tasks[i].id, null, function(err) {
+ wok.message.error(err.message);
+ }, null);
+ }
+ }, null, true);
+ return guests;
+ };
+ kimchi.listVMs(function(result, textStatus, jqXHR) {
+ if (result && textStatus == "success") {
+ result = getCloningGuests().concat(result);
+ result = getCreatingGuests().concat(result);
+ if (result.length) {
+ var listHtml = '';
+ var guestTemplate = kimchi.guestTemplate;
+ var currentConsoleImages = kimchi.getVmsCurrentConsoleImgs();
+ var openMenuGuest = kimchi.getOpenMenuVmId();
+ $('#guestList').empty();
+ $('#guestListField').show();
+ $('#noGuests').hide();
+
+ $.each(result, function(index, vm) {
+ var guestLI = kimchi.createGuestLi(vm, currentConsoleImages[vm.name], vm.name == openMenuGuest);
+ $('#guestList').append(guestLI);
+ });
+ } else {
+ $('#guestListField').hide();
+ $('#noGuests').show();
+ }
+ }
+
+ kimchi.vmTimeout = window.setTimeout("kimchi.listVmsAuto();", 5000);
+ },
+ function(errorResponse, textStatus, errorThrown) {
+ if (errorResponse.responseJSON && errorResponse.responseJSON.reason) {
+ wok.message.error(errorResponse.responseJSON.reason);
+ }
+ kimchi.vmTimeout = window.setTimeout("kimchi.listVmsAuto();", 5000);
+ });
+ } else {
+ clearTimeout(kimchi.vmTimeout);
kimchi.vmTimeout = window.setTimeout("kimchi.listVmsAuto();", 5000);
- });
+ }
};
+
kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) {
- var result=kimchi.guestElem.clone();
-
+ var result = kimchi.guestElem.clone();
+
//Setup the VM list entry
- var vmRunningBool=(vmObject.state=="running");
- var vmSuspendedBool = (vmObject.state=="paused");
- var vmPoweredOffBool = (vmObject.state=="shutoff");
+ 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);
- result.attr('id',vmObject.name);
+
+ 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('title',vmObject.name);
+ var guestTitle = result.find('.title').attr('val', vmObject.name);
guestTitle.html(vmObject.name);
+ //Add the OS Type and Icon
+ var osType = result.find('.distro-icon');
+ console.log(vmObject);
+ 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 {
+ //Unknown
+ osType.addClass('icon-unknown');
+ osType.attr('val', 'Unknown');
+ osType.html('Unknown');
+ }
+
//Setup the VM console thumbnail display
var curImg = vmObject.icon;
if (vmObject.screenshot) {
@@ -328,56 +402,133 @@ kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) {
}
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');
+ 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');
+ 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);
+ 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)){
+ if (!(vmObject.isCloning || vmObject.isCreating)) {
if (vmPoweredOffBool) {
- liveTile.off("click", kimchi.openVmConsole);
- liveTile.off("click", kimchi.vmresume);
- liveTile.on("click", kimchi.vmstart);
- liveTile.hover(function(event){$(this).find('.overlay').show()}, function(event){$(this).find('.overlay').hide()});
+ 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", kimchi.vmstart);
- liveTile.off("click", kimchi.openVmConsole);
- liveTile.on("click", kimchi.vmresume);
- 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()});
+ 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", kimchi.vmstart);
- liveTile.off("click", kimchi.vmresume);
- liveTile.on("click", kimchi.openVmConsole);
+ 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 the gauges
- var stats=vmObject.stats;
- var gaugeValue=0;
- gaugeValue=parseInt(stats.net_throughput);
- kimchi.circleGaugeInit(result, "net_throughput",gaugeValue,(gaugeValue*100/stats.net_throughput_peak));
- gaugeValue=parseInt(stats.io_throughput);
- kimchi.circleGaugeInit(result, "io_throughput",gaugeValue,(gaugeValue*100/stats.io_throughput_peak));
- gaugeValue=parseInt(stats.cpu_utilization);
- kimchi.circleGaugeInit(result, "cpu_utilization",gaugeValue+"%",gaugeValue);
- gaugeValue=parseInt(stats.mem_utilization);
- kimchi.circleGaugeInit(result, "mem_utilization",gaugeValue+"%",gaugeValue);
+ //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('--');
+ result.find('.measure-label').html('--');
+ result.find('.guest-actions').css("margin-top", "3px");
+ }
//Setup the VM Actions
- var guestActions=result.find("div[name=guest-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);
@@ -390,7 +541,7 @@ kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) {
//Hide Pause button and menu
guestActions.find(".pause-disabled").hide();
guestActions.find(".pause-hidden").hide();
- }
+ }
if (vmRunningBool) { //VM IS running
//Hide Start
@@ -400,6 +551,10 @@ kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) {
}
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
@@ -408,98 +563,116 @@ kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) {
guestActions.find(".resume-hidden").hide();
}
- var consoleActions=guestActions.find("[name=vm-console]");
+ var consoleActions = guestActions.find("[name=vm-console]");
+ var consoleLinkActions = result.find(".vnc-link");
if ((vmObject.graphics['type'] == 'vnc') || (vmObject.graphics['type'] == 'spice')) {
- consoleActions.on("click", kimchi.openVmConsole);
+ 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
+ } else { //we don't recognize the VMs supported graphics, so hide the menu choice
consoleActions.hide();
- consoleActions.off("click",kimchi.openVmConsole);
+ 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)){
- guestActions.find("[name=vm-start]").on({click : kimchi.vmstart});
- guestActions.find("[name=vm-poweroff]").on({click : kimchi.vmpoweroff});
- 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 : kimchi.vmreset});
+ if (!(vmObject.isCloning || vmObject.isCreating)) {
- //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 : kimchi.vmshutdown});
+ 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 : kimchi.vmresume});
+ guestActions.find("[name=vm-resume]").on("click", function(event) {
+ event.preventDefault();
+ kimchi.vmresume(event);
+ });
}
if (vmRunningBool) {
- guestActions.find("[name=vm-pause]").on({click : kimchi.vmsuspend});
+ guestActions.find("[name=vm-pause]").on("click", function(event) {
+ event.preventDefault();
+ kimchi.vmsuspend(event);
+ });
}
- guestActions.find("[name=vm-edit]").on({click : kimchi.vmedit});
- guestActions.find("[name=vm-delete]").on({click : kimchi.vmdelete});
- guestActions.find("[name=vm-clone]").click(function(){
+ 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();
var guest = $(this).closest('li[name=guest]').attr("id");
wok.confirm({
- title : i18n['KCHAPI6006M'],
- content : i18n['KCHVM6010M'],
- confirm : i18n['KCHAPI6002M'],
- cancel : i18n['KCHAPI6003M']
+ title: i18n['KCHAPI6006M'],
+ content: i18n['KCHVM6010M'],
+ confirm: i18n['KCHAPI6002M'],
+ cancel: i18n['KCHAPI6003M']
}, function() {
- kimchi.cloneGuest(guest, function(data){
+ kimchi.cloneGuest(guest, function(data) {
kimchi.listVmsAuto();
});
}, null);
});
-
- //Maintain menu open state
- var actionMenu=guestActions.find("div[name=actionmenu]");
- if (openMenu) {
- $('.popover', actionMenu).toggle();
- }
-
- }else{
+ } else {
guestActions.find('.btn').attr('disabled', true);
- $('.popover', guestActions.find("div[name=actionmenu]")).remove();
-
result.find('.guest-pending').removeClass('hide-content');
pendingText = result.find('.guest-pending .text')
- if(vmObject.isCloning)
+ if (vmObject.isCloning)
pendingText.text(i18n['KCHAPI6009M']);
else
pendingText.text(i18n['KCHAPI6008M']);
}
-
return result;
};
-kimchi.circleGaugeInit = function(topElement, divName, display, percentage){
- var gauge=topElement.find('div[name="' + divName + '"] .circleGauge');
- if(gauge) {
- var data=Object();
- data.percentage = percentage;
- data.display = display;
- gauge.data(data);
- }
- gauge.circleGauge();
- return(gauge);
-};
-
kimchi.guestSetRequestHeader = function(xhr) {
xhr.setRequestHeader('Accept', 'text/html');
};
kimchi.guest_main = function() {
- if(wok.tabMode['guests'] === 'admin') {
- $('.tools').attr('style','display');
+ 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');
+ kimchi.guestElem = $('<div/>').html(kimchi.guestTemplate).find('li[name="guest"]');
$('#guests-root-container').on('remove', function() {
kimchi.vmTimeout && clearTimeout(kimchi.vmTimeout);
});
diff --git a/src/wok/plugins/kimchi/ui/pages/guest.html.tmpl b/src/wok/plugins/kimchi/ui/pages/guest.html.tmpl
index 4aba5ad..c2d9ba8 100644
--- a/src/wok/plugins/kimchi/ui/pages/guest.html.tmpl
+++ b/src/wok/plugins/kimchi/ui/pages/guest.html.tmpl
@@ -21,60 +21,80 @@
#silent t = gettext.translation($lang.domain, $lang.localedir, languages=$lang.lang, fallback=True)
#silent _ = t.gettext
#silent _t = t.gettext
- <li name="guest" class="guest">
- <div class="sortable guest-type">
- <div class="guest-general">
- <h2 class="title" title="{name}">{name}</h2>
+ <li name="guest" class="wok-guest-list-body">
+ <span class='column-state'>
+ <span class='guest-state'>
+ <i class="fa fa-power-off"></i>
+ <i class="fa fa-ban"></i>
+ <i class="fa fa-undo"></i>
+ <i class="fa fa-refresh fa-spin"></i>
+ </span>
+ </span><!--
+ --><span class='column-name title'></span><!--
+ --><span class='column-action pull-right'>
+ <span class="pull-right">
+ <div class="dropdown menu-flat guest-actions" name="guest-actions" style="margin-top: 6px">
+ <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown" aria-expanded="false"><span class="edit-alt"></span>$_("Actions")<span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu" role="menu">
+ <li role="presentation"><a nwAct="connect-vnc" class='shutoff-disabled' name="vm-console" href="#"><i class="fa fa-list-alt"></i>$_("Connect VNC")</a></li>
+ <!-- <li role="presentation"><a nwAct="view-vnc" class='shutoff-disabled' name="vm-view-vnc" href="#"><i class="fa fa-eye"></i>$_("View VNC Console")</a></li> -->
+ <li role="presentation"><a nwAct="edit" name="vm-edit" href="#"><i class="fa fa-pencil"></i>$_("Edit")</a></li>
+ <li role="presentation"><a href="#" nwAct="clone" class='running-disabled' name="vm-clone"><i class="fa fa-copy"></i>$_("Clone")</a></li>
+ <li role="presentation"><a nwAct="reset" class='shutoff-hidden non-persistent-disabled' name="vm-reset" href="#"><i class="fa fa-refresh"></i>$_("Reset")</a></li>
+ <li role="presentation"><a nwAct="pause" class='pause-hidden non-persistent-disabled' name="vm-pause" href="#"><i class="fa fa-pause"></i>$_("Pause")</a></li>
+ <li role="presentation"><a nwAct="resume" class='resume-hidden' name="vm-resume" href="#"><i class="fa fa-play-circle"></i>$_("Resume")</a></li>
+ <li role="presentation"><a nwAct="shutdown" class='shutoff-hidden' name="vm-shutdown" href="#"><i class="fa fa-ban"></i>$_("Shut Down")</a></li>
+ <li role="presentation"><a nwAct="start" class='running-hidden' name="vm-start" href="#"><i class="fa fa-power-off"></i>$_("Start")</a></li>
+ <li role="presentation"><a nwAct="power-off" class='shutoff-hidden' name="vm-poweroff" href="#"><i class="fa fa-power-off"></i>$_("Power Off")</a></li>
+ <li role="presentation" class='critical'><a nwAct="delete" class='non-persistent-disabled' name="vm-delete" href="#"><i class="fa fa-minus-circle"></i>$_("Delete")</a></li>
+ </ul>
+ </div>
+ </span>
+ </span><!--
+ --><span class='column-type distro-icon' style='padding-left: 40px !important'></span><!--
+ --><span class='column-vnc'><i class="fa fa-spinner fa-spin"></i><a nwAct="connect-vnc" name="vm-console" class="vnc-link" href="#">$_("View Console")</a></span><!--
+ --><span class='column-processors'>
+ <div class="percentage-label processors-percentage">
</div>
- <div class="guest-pending hide-content">
- <span class="icon"></span><span class="text"></span>
+ <div class="progress">
+ <div class="progress-bar dark-grey cpu" style="width: 100%"></div>
+ <div class="progress-bar medium-grey cpu"></div>
+ <div class="progress-bar light-grey cpu"></div>
+ <div class="progress-bar cpu-progress-bar"></div>
</div>
- </div>
- <div name="cpu_utilization" class="sortable">
- <div class="circleGauge"></div>
- </div>
- <div name="mem_utilization" class="sortable">
- <div class="circleGauge"></div>
- </div>
- <div name="io_throughput" class="sortable">
- <div class="circleGauge"></div>
- <div class="subtitle">KB/s</div>
- </div>
- <div name="net_throughput" class="sortable">
- <div class="circleGauge"></div>
- <div class="subtitle">KB/s</div>
- </div>
- <div name="guest-tile" class="sortable guest-tile">
- <div class="tile ">
- <img class="imgactive" alt="" src="">
- <img class="imgload" alt="" src="">
- <img class="overlay shutoff-hidden" alt="$_("Start")" src="plugins/kimchi/images/theme-default/icon-power-down.png" >
+ </span><!--
+ --><span class="item-hidden">$_("Processors Used")</span><!--
+ --><span class='column-memory'>
+ <div class='percentage-label memory-percentage'></div>
+ <div class="progress">
+ <div class="progress-bar dark-grey" style="width: 100%"></div>
+ <div class="progress-bar medium-grey memory"></div>
+ <div class="progress-bar light-grey memory"></div>
+ <div class="progress-bar memory-progress-bar"></div>
</div>
- </div>
- <div class="sortable guest-actions" name="guest-actions">
- <div class="top">
- <button class="btn reset-disabled" name="vm-reset" href="javascript:void(0);" title="$_("Reset")"><span class="icon reset"></span></button>
- <button class="btn pause-disabled" name="vm-pause" href="javascript:void(0);" title="$_("Pause")"><span class="icon pause"></span></button>
- <button class="btn resume-hidden" name="vm-resume" href="javascript:void(0);" title="$_("Resume")"><span class="icon resume"></span></button>
- <button class="btn running-hidden" name="vm-start" href="javascript:void(0);" title="$_("Start")"><span class="icon power-down"></span></button>
- <button class="btn shutoff-hidden" name="vm-poweroff" href="javascript:void(0);" title="$_("Power Off")"><span class="icon power-up"></span></button>
+ </span><!--
+ --><span class="item-hidden">$_("Memory Available")</span><!--
+ --><span class='column-storage'>
+ <div class='measure-label storage-percentage'></div>
+ <div class="progress">
+ <div class="progress-bar dark-grey" style="width: 100%"></div>
+ <div class="progress-bar medium-grey io"></div>
+ <div class="progress-bar light-grey io"></div>
+ <div class="progress-bar storage-progress-bar"></div>
</div>
- <div class="bottom">
- <div name="actionmenu" class="btn dropdown popable vm-action" style="width: 126px">
- <span class="text">$_("Actions")</span><span class="arrow"></span>
- <div class="popover actionsheet right-side" style="width: 250px">
- <button class="button-big shutoff-disabled" name="vm-console" ><span class="text">$_("Connect")</span></button>
- <button class="button-big running-disabled" name="vm-clone"><span class="text">$_("Clone")</span></button>
- <button class="button-big" name="vm-edit"><span class="text">$_("Edit")</span></button>
- <button class="button-big shutoff-hidden non-persistent-disabled" name="vm-reset"><span class="text">$_("Reset")</span></button>
- <button class="button-big pause-hidden non-persistent-disabled" name="vm-pause"><span class="text">$_("Pause")</span></button>
- <button class="button-big resume-hidden" name="vm-resume"><span class="text">$_("Resume")</span></button>
- <button class="button-big shutoff-hidden" name="vm-shutdown"><span class="text">$_("Shut Down")</span></button>
- <button class="button-big running-hidden" name="vm-start"><span class="text">$_("Start")</span></button>
- <button class="button-big shutoff-hidden" name="vm-poweroff"><span class="text">$_("Power Off")</span></button>
- <button class="button-big red non-persistent-disabled" name="vm-delete">$_("Delete")</button>
- </div>
- </div>
+ </span><!--
+ --><span class="item-hidden">$_("Storage I/O")</span><!--
+ --><span class='column-network'>
+ <div class='measure-label network-percentage'></div>
+ <div class="progress">
+ <div class="progress-bar dark-grey" style="width: 100%"></div>
+ <div class="progress-bar medium-grey network" style="width: 85%"></div>
+ <div class="progress-bar light-grey network" style="width: 75%"></div>
+ <div class="progress-bar network-progress-bar"></div>
</div>
- </div>
+ </span><!--
+ --><span class="item-hidden">$_("Network I/O")</span>
</li>
+
+
diff --git a/src/wok/plugins/kimchi/ui/pages/guests.html.tmpl b/src/wok/plugins/kimchi/ui/pages/guests.html.tmpl
index a5c6846..66a6e00 100644
--- a/src/wok/plugins/kimchi/ui/pages/guests.html.tmpl
+++ b/src/wok/plugins/kimchi/ui/pages/guests.html.tmpl
@@ -55,18 +55,31 @@
</nav>
<div id="guest-content-container">
<div class="container">
+ <div class="row grid-control hidden">
+ <div class="pull-right">
+ <label for="guests-filter" class="sr-only">$_("Filter"):</label>
+ <input type="text" class="filter form-control" placeholder="$_("Filter")">
+ </div>
+ </div>
<div id="alert-container"></div>
<div id="guestListField" style="display: none">
- <ul class="list-title">
- <li class="guest-type">$_("Name")</li>
- <li class="guest-cpu">$_("CPU")</li>
- <li class="guest-memory">$_("Memory")</li>
- <li class="guest-storage">$_("Disk I/O")</li>
- <li class="guest-network">$_("Network I/O")</li>
- <li class="guest-tile">$_("Livetile")</li>
- <li class="guest-actions">$_("Actions")</li>
- </ul>
- <ul id="guestList" class="list-vm empty-when-logged-off">
+ <ul class="wok-guest-list">
+ <li class="wok-guest-list-header">
+ <span class="column-state"><span class="sr-only">$_("State")</span></span><!--
+ --><span class="column-name"><span>$_("Guest Name ID")</span></span><!--
+ --><span class="column-type"><span>$_("OS Type")</span></span><!--
+ --><span class="column-vnc"><span>$_("VNC")</span></span><!--
+ --><span class="column-processors"><span>$_("Processors Used")</span></span><!--
+ --><span class="column-memory"><span>$_("Memory Utilization")</span></span><!--
+ --><span class="column-storage"><span>$_("Storage I/O")</span></span><!--
+ --><span class="column-network"><span>$_("Network I/O")</span></span><!--
+ --><span class="column-action" style="display:none">
+ <span class="sr-only">Actions</span><!--
+ --></span>
+ </li>
+ <li class="wok-guest-list-body">
+ <ul id="guestList" class="wok-guest-list empty-when-logged-off" style="-webkit-padding-start: 0px;">
+ </li>
</ul>
</div>
<div id="noGuests" class="list-no-result" style="display: none;">
diff --git a/src/wok/plugins/kimchi/ui/pages/templates.html.tmpl b/src/wok/plugins/kimchi/ui/pages/templates.html.tmpl
index 373e4d8..1031f52 100644
--- a/src/wok/plugins/kimchi/ui/pages/templates.html.tmpl
+++ b/src/wok/plugins/kimchi/ui/pages/templates.html.tmpl
@@ -50,7 +50,7 @@
</nav>
<div class="templates">
<div class="container">
- <div class="row grid-control">
+ <div class="row grid-control hidden">
<div class="pull-right">
<label for="templates-filter" class="sr-only">$_("Filter"):</label>
<input type="text" class="filter form-control" placeholder="$_("Filter")">
diff --git a/ui/css/src/modules/_guests.scss b/ui/css/src/modules/_guests.scss
index 23c361a..24b36c6 100644
--- a/ui/css/src/modules/_guests.scss
+++ b/ui/css/src/modules/_guests.scss
@@ -90,3 +90,240 @@
width: 592px;
}
}
+
+#guest-content-container {
+ .wok-guest-list {
+ display: block;
+ width: 100%;
+ list-style-type: none;
+ > li:nth-child(even) {
+ background-color: $table-bg-accent;
+ }
+ > li:nth-child(odd) {
+ background-color: $table-bg;
+ }
+ > li:first-child {
+ border-top: 0;
+ }
+ .wok-guest-list-header {
+ border-top: 0 none;
+ height: 36px;
+ > span {
+ height: 36px;
+ padding: 6px 2px;
+ display: inline-block;
+ vertical-align: middle;
+ font-family: $font-family-sans-serif;
+ font-weight: 400;
+ font-size: 12.5pt;
+ line-height: 1.42857;
+ border-bottom: none;
+ border-top: 0;
+ }
+ > span.column-state {
+ width: 2.9272%;
+ text-align: center;
+ }
+ }
+ .wok-guest-list-body {
+ border-top: 1px solid $table-border-color;
+ > span {
+ padding: 6px 2px;
+ display: inline-block;
+ vertical-align: middle;
+ font-family: $font-family-sans-serif;
+ font-size: 12.5pt;
+ line-height: 2.42857;
+ font-weight: bold;
+ }
+ .progress {
+ display: inline-block;
+ width: 60%;
+ position: relative;
+ vertical-align: top;
+ margin-top: 15px;
+ border-radius: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ }
+ .progress-bar {
+ position: absolute;
+ top: 0;
+ left: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ &.dark-grey {
+ background-color: map-get($guestCharts, darkGray);
+ }
+ &.medium-grey {
+ background-color: map-get($guestCharts, mediumGray);
+ }
+ &.light-grey {
+ background-color: map-get($guestCharts, lightGray);
+ }
+ }
+ div.percentage-label {
+ display: inline-block;
+ width: 25%;
+ margin-top: 6px;
+ }
+ div.measure-label {
+ display: inline-block;
+ width: 35%;
+ margin-top: 6px;
+ }
+ }
+ }
+ .wok-guest-list .wok-guest-list-header,
+ .wok-guest-list .wok-guest-list-body {
+ > span.column-state {
+ width: 2.9272%;
+ text-align: center;
+ > span.guest-state {
+ font-size: 22px;
+ position: relative;
+ }
+ > span.guest-state.running > .fa-ban {
+ display: none;
+ }
+ > span.guest-state.running > .fa-power-off {
+ color: $fa-green;
+ }
+ > span.guest-state.running > .fa-undo {
+ display: none;
+ }
+ > span.guest-state.running > .fa-refresh {
+ display: none;
+ }
+ > span.guest-state.shutoff > .fa-ban {
+ color: $gray-light;
+ }
+ > span.guest-state.shutoff > .fa-power-off {
+ display: none;
+ }
+ > span.guest-state.shutoff > .fa-undo {
+ display: none;
+ }
+ > span.guest-state.shutoff > .fa-refresh {
+ display: none;
+ }
+ > span.guest-state.starting > .fa-ban {
+ display: none;
+ }
+ > span.guest-state.starting > .fa-power-off {
+ display: none;
+ }
+ > span.guest-state.starting > .fa-undo {
+ color: $gray-light;
+ }
+ > span.guest-state.starting > .fa-refresh {
+ display: none;
+ }
+ > span.guest-state.resetting > .fa-ban {
+ display: none;
+ }
+ > span.guest-state.resetting > .fa-power-off {
+ display: none;
+ }
+ > span.guest-state.resetting > .fa-undo {
+ display: none;
+ }
+ > span.guest-state.resetting > .fa-refresh {
+ color: $fa-green;
+ }
+ > span.guest-state.paused > .fa {
+ display: none;
+ }
+ }
+ > span.column-name {
+ width: 13.6867%;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+ > span.column-type {
+ width: 9.9683%;
+ }
+ > span.column-vnc {
+ width: 11.8670%;
+ > a {
+ font-weight: normal;
+ color: $vnc-blue !important;
+ }
+ .fa-spin {
+ display: none
+ }
+ .fa-spin.active {
+ display: inline-block;
+ margin-right: 8px;
+ font-size: 22px;
+ color: $vnc-blue !important;
+ }
+ }
+ > span.column-processors {
+ width: 12.1838%;
+ > div > div.progress-bar.cpu-progress-bar {
+ background-color: map-get($colors, administration);
+ }
+ }
+ > span.column-memory {
+ width: 12.1838%;
+ > div > div.progress-bar.memory-progress-bar {
+ background-color: map-get($colors, host);
+ }
+ }
+ > span.column-storage {
+ width: 12.9746%;
+ > div > div.progress-bar.storage-progress-bar {
+ background-color: $state-warning-border;
+ }
+ }
+ > span.column-network {
+ width: 12.9746%;
+ > div > div.progress-bar.network-progress-bar {
+ background-color: map-get($colors, network);
+ }
+ }
+ > span.column-action {
+ width: 10.9968%;
+ }
+ > span.item-hidden {
+ display: none !important;
+ }
+ }
+ .wok-guest-list .distro-icon {
+ background-color: transparent;
+ background-size: 27px 27px;
+ background-repeat: no-repeat;
+ background-position: left;
+ }
+ .wok-guest-list .distro-icon.inactive {
+ -webkit-filter: grayscale(100%) contrast(0.8) brightness(110%);
+ -moz-filter: grayscale(100%) contrast(0.8) brightness(110%);
+ filter: grayscale(100%) contrast(0.8) brightness(110%);
+ }
+ .wok-guest-list .distro-icon.icon-centos {
+ background-image: url('#{$wok-icon-path}/icon-centos.png');
+ }
+ .wok-guest-list .distro-icon.icon-debian {
+ background-image: url('#{$wok-icon-path}/icon-debian.png');
+ }
+ .wok-guest-list .distro-icon.icon-fedora {
+ background-image: url('#{$wok-icon-path}/icon-fedora.png');
+ }
+ .wok-guest-list .distro-icon.icon-opensuse {
+ background-image: url('#{$wok-icon-path}/icon-opensuse.png');
+ }
+ .wok-guest-list .distro-icon.icon-ubuntu {
+ background-image: url('#{$wok-icon-path}/icon-ubuntu.png');
+ }
+ .wok-guest-list .distro-icon.icon-gentoo {
+ background-image: url('#{$wok-icon-path}/icon-gentoo.png');
+ }
+ .wok-guest-list .distro-icon.icon-unknown {
+ background-image: url('#{$wok-icon-path}/icon-unknown.png');
+ }
+ .wok-guest-list .wok-guest-list-body.inactive {
+ color: $disabled-color !important;
+ }
+}
diff --git a/ui/images/theme-default/icon-unknown.png b/ui/images/theme-default/icon-unknown.png
index 83c7fe0fe4a452b815fab60aabb2a915777d8921..0de494b683ffa3da1646efdb93526ed880390093 100644
GIT binary patch
literal 3797
zcmV;`4l419P)<h;3K|Lk000e1NJLTq000{R000{Z1^@s6jnwp200009a7bBm000XU
z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-oy)XH-+^7Crag
z^g>IBfRsybQWXdwQbLP>6p<z>Aqfylh#{fb6;Z(vMMVS~$e at S=j*ftg6;Uh<iVD~V
z<RPMtgQJLw%KPDaqifc at _vX$1wbwr9tn;0-&j-K=43<bUQ8j=JsX`tR;Dg7+#^K~H
zK!FM*Z~zbpvt%K2{UZSY_<lS*D<Z%Lz5oGu(+dayz)hRLFdT>f59&ghTmgWD0l;*T
zI7<kC6aYYajzXpYKt=(8otP$50H6c_V9R4-;{Z at C0AMG7=F<Rxo%or10RUT+Ar%3j
zkpLhQWr#!oXgdI`&sK^>09Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p
z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-<?i
z0%4j!F2Z at 488U%158(66005wo6%pWr^Zj_v4zAA5HjcIqUoGmt2LB>rV&neh&#Q1i
z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_<lS*MWK+n+1cgf
z<k(8YLR(?VSAG6x!e78w{cQPuJpA|d;J)G{fihizM+Erb!p!tcr5w+a34~(Y=8s4G
zw+sLL9n&JjNn*KJDiq^U5^;`1nvC- at r6P$!k}1U{(*I=Q-z at tBKHoI}uxdU5dyy at u
zU1J0GOD7Ombim^G008p4Z^6_k2m^p<gW=D2|L;HjN1!DDfM!XOaR2~bL?kX$%CkSm
z2mk;?pn)o|K^yeJ7%adB9Ki+L!3+FgHiSYX#KJ-lLJDMn9CBbOtb#%)hRv`YDqt_v
zKpix|QD}yfa1JiQRk#j4a1Z)n2%f<xynzV>LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW
zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_Ifq<Ex{*7`05XF7hP+2Hl!3BQJ=6 at fL%FCo
z8iYoo3(#bAF`ADSpqtQgv>H8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X
zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ<AYmRsNLWl*PS{AOARHt#5!wki2?K;t
z!Y3k=s7tgax)J%r7-BLphge7~Bi0g+6E6^Zh(p9TBoc{3GAFr^0!gu?RMHaCM$&Fl
zBk3%un>0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA at W-aonk<7r1(?fC{oI5N*U!4
z<uv66WtcKSRim0x-Ke2d5jBrmLam{;Qm;{ms1r1GnmNsb7D-E`t)i9F8fX`2_i3-_
zbh;7Ul^#x)&{xvS=|||7=mYe33=M`AgU5(xC>fg=2N-7=cNnjjOr{yriy6mMFgG#l
znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U
zt5vF<Q0r40Q)j6=sE4X&sBct1q<&fbi3VB2Ov6t at q*0);U*o*SAPZv|vv at 2aYYnT0
zb%8a+Cb7-ge0D0knEf5Qi#@8Tp*ce{N;6lpQuCB%KL_KOarm5cP6_8Ir<e17iry6O
zDdH&`rZh~sF=bq9s+O0QSgS~@QL9Jmy*94xr=6y~MY~!1fet~(N+(<=M`w at D1)b+p
z*;C!83a1uLJv#NSE~;y#8=<>IcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya?
z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y
zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB
zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt
z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a<fJbF^|4I#xQ~n$Dc=
zKYhjYmgz5NSkDm8*fZm{6U!;YX`NG>(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C
z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB
zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe
zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w at Jt%Bvjts!X0
z?2xS?_ve_-k<Mujg;0Lz*3buG=3$G&ehepthlN*$KaOySSQ^nWmo<0M+(UEUMEXRQ
zMBbZcF;6+KElM>iKB_KiJlZ$9G`c^=E at oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$
z3*&nim at mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz at C5{St!X3hAA}`T4
z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu
zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu
z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E
ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw
zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX
z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i&
z_B8C(+grT%{XWUQ+f at NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01
z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R
z9cLXcYC at Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw
zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD
zJpPl at Psh8QyPB@KTx+ at RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3|
zawq-H%e&ckC+ at AhPrP6BK<z=<L*0kfKU at CX*zeqbYQT4(^U>T#_XdT7&;F71j}Joy
zkC~6lh7E at 6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z
zrTyx_>lv at x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot<a{81DF0~rvGr5Xr~8u`lav1h
z1DNytV>2z=00004XF*Lt006O$eEU(80000WV at Og>004R=004l4008;_004mL004C`
z008P>0026e000+nl3&F}000B<Nkl<Zc-rjMTWcd_7zglw4n1ufHj_h7q>vW02MF7S
zmQrkONHUoe+DRvqOlC64OlEQ}WYZ=k&00mIH(sb0u7WJxMZEIDuduj?_z^@FFZ5ys
zQ511^p<C_ig`Jr61BhTR-kbN&%kO<2o_Pm^5d2#U*Vr}o- at y`z#8NOAd at mdh-;YM4
zuVu4Ycdb@~EX$y28Z67+*xugW3x~s}p-|`pmStZNMbX7D%<GqX_gI$Ive|53u~@{(
z$qCx+HaL!pheDx`XqrBaL?Ul<9QQIfj#CB(1_%Js*VjjQp1*y3d<<RJ5ex>w^E~5l
zI9>oCX0w?v409lgV$f!@T>u~eh|A at ArfFKB-EJe3$v{=rIj`6I#K^5yD~ZKobyO;q
zm!_wue=vgO<>g29dVL_9&4OVVL?V&*jcj~;{8=uSyCq4|_Q=QxG4=tFU at -VG$8ks`
z64=_>ddq6Hl5ULSxHih=G6I3XCq^(aG4Xq;R9eYoGGJNO>GS!%HnP>#)rYlO4e4}x
z_bN6uHT83`Se!jLIH2a|=fCOBF0mF=RfQx;@tZeqb_aL%_VyqM!VX1I1OOQv93-(=
z>~=n%ha^dH1G88x#AGrNv)N2omVHwY1bt{|h?q<!VpP|`j*gB{tJT~K3k#hJR#sLX
z)oL{>P1E;`J+IgMW3gDA)pZ?`B=H93bUMl8<Rk$=d_LckwY9Zx0T7SJL)>n6FIFy>
zQ79A;iA3Hpo6Q6O85<k>O;uHKc6PRNfz8d$Pn*pqs?{n)QS4xDxBHKcjg4Q8>W7Di
z2>=oZ1b!MF9X;>CbX`Y2pNFcdn{K!J%xFzC8hvcH+s^<Ho6Saeo|jZr#ns9vih7<(
zrS9A9_UFdMD2jS2isFY(r}JqK)@uFT%6h$i!|(Th*)=G{VzCeaWNvQmakW|<FPF>6
z<#Iik-EM!OC`xK+Y3U2&tl#hdTu~Ix;c%SwV49{u*LCD_IqdB0wEFw|d!`HkVHoCa
zv)RP{{ysEKyNX at NvK&k#67iXtneS(2X1+@%lQBh6UZp7N&mOE)Dxp*=p;D=!P$>93
z9?vh`kjv#dPo+|{EXz<71((y9=)#C7id&kdK~>e!Y&JV8NfIPUqA7~H==siCt$$kC
zXf(|0>+7F&V~dN6Uo{#H+u`9MGMNknK|nH at -0s58d7cmM?(QO$N<k0=@H`Je5H=}_
zI`4TwWLfU4bUF>5=Wj(Kk#}jDKBZ~;Zaf~}NT<`t<#K2=8fZ3~P*ruDrs+4r;qU{7
zVeZJX?9z1|rBVsHu0vH-WHK3NG#Wh$hr<s#Z{zj<>>B%jVt)+)m+A||QZPP500000
LNkvXXu0mjfHh&jM
delta 737
zcmV<70v`R<9r*>2B!2{FK}|sb0I$e51&Zka000?uMObuGZ)S9NVRB^vL1b at YWgtmy
zVP|DhWnpA_ami&o0007uNkl<Zc-pL%O-NKx6vy8<YJ+7FeL_L>MfA1E+yqS#5ft=I
zi`p49n|1{mRvW2JD;J7rP at AGC+GQX?K|zaJNI?bJ2bqGT*?*!T95ZM7U-&(F%-r4_
z(+fYC``)|vf6lq*o-;wAPzW4`u~gg?1LB)_DK3c0atkLljAB*dv0E46w|FC3XIgA~
zk&xquc*gH-7O{%JHa3YrVvPAXp-eN+ST?bW%@y~=N#<9?A#sWMhM5!_5t~K5=n-?o
z6VZ#u3CkvxMt`w93Gq~17Hh;p&dM1)pClT$WlH=wA(}m*&ET2aU{yH{t7m=Un)oON
zMM^BeySJiW>=o^Cn<PT75{cNbH;R3D at m~BC55+K{&5B=QD<LoO%o;|Q6rb_JWnhz7
z6nWnqxqD})bE#{|xV9K$HX`J_o)G*0SFDMR&c}!)#eX9)M0kg&qf-)FE<O;#6^07q
zgt{@VZK`5tSlDRH*jM5?1t7~An`)y=&0}Iz+&7B34zQXqx(ZWgEmudyVm25win-LU
zjuh*(RqP at q=u==HFCfQ!omH%x#CT08%Z+N1sE)cB(1Oa=#@VEEjkqlu44q>S9Xq_-
zz0nNzWq;#ZaYURJ^Z0HV7Pex&Z#bh4V_>JaAy$gr6l<^8aVmFh(Pjs*_D)RLPkG)Q
z#PAAV>L<A$*`h at c#9h)l?-ANb0jMc at -X*>gt&#+BEo0U{EI%i1iCwgpDg at klb|94V
zG~6DVZb_$J5YuV<S=>pOCpgcratu?5!?A_%e_EjxmGrYTALR*UAD8+&A#Ug3lU(32
zL{k*r9e9yppB8HCWVZX7XNnNH;<}z^u7ABFlsV7;nCl!tmiu`%dcL8?UjYUH-C8&C
T(|TA^00000NkvXXu0mjf`2A9?
--
1.9.3
More information about the Kimchi-devel
mailing list