[Kimchi-devel] [PATCH 1/2] Initial checkin for live migration UI support
sguimaraes943 at gmail.com
sguimaraes943 at gmail.com
Wed Dec 2 16:09:20 UTC 2015
From: Socorro Stoppler <socorro at linux.vnet.ibm.com>
Signed-off-by: Socorro Stoppler <socorro at linux.vnet.ibm.com>
Signed-off-by: samhenri <samuel.guimaraes at eldorado.org.br>
---
ui/js/src/kimchi.api.js | 3 +-
ui/js/src/kimchi.guest_main.js | 46 +++++++++++++++++++++++++--
ui/pages/guest-migration.html.tmpl | 65 ++++++++++++++++++++++++++++++++++++++
ui/pages/guest.html.tmpl | 7 ++--
4 files changed, 114 insertions(+), 7 deletions(-)
create mode 100644 ui/pages/guest-migration.html.tmpl
diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js
index cb6aaab..6cc8714 100644
--- a/ui/js/src/kimchi.api.js
+++ b/ui/js/src/kimchi.api.js
@@ -1045,12 +1045,13 @@ var kimchi = {
});
},
- migrateGuest: function(vm, suc, err) {
+ migrateGuest: function(vm, data, suc, err) {
wok.requestJSON({
url : 'plugins/kimchi/vms/' + encodeURIComponent(vm) + "/migrate",
type : 'POST',
contentType : 'application/json',
dataType : 'json',
+ data : JSON.stringify(data),
success : suc,
error : err ? err : function(data) {
wok.message.error(data.responseJSON.reason);
diff --git a/ui/js/src/kimchi.guest_main.js b/ui/js/src/kimchi.guest_main.js
index 3287c00..68e17cc 100644
--- a/ui/js/src/kimchi.guest_main.js
+++ b/ui/js/src/kimchi.guest_main.js
@@ -303,8 +303,24 @@ kimchi.listVmsAuto = function() {
}, null, true);
return guests;
};
+ var getMigratingGuests = function(){
+ var guests = [];
+ kimchi.getTasksByFilter('status=running&target_uri='+encodeURIComponent('^/vms/.+/migrate'), 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, isMigrating: 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 = getMigratingGuests().concat(result);
result = getCloningGuests().concat(result);
result = getCreatingGuests().concat(result);
if (result.length) {
@@ -344,6 +360,26 @@ kimchi.listVmsAuto = function() {
kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) {
var result = kimchi.guestElem.clone();
+ var initializeMigratePanel = function() {
+ $("#migrateFormOk").on("click", function() {
+ //TODO: Get values from UI for remote_host, user, password
+ var data = {
+ "remote_host" : "ltc-hab1.aus.stglabs.ibm.com",
+ "user" : "root",
+ "password" : "passw0rd"
+ };
+ //TODO: Need to get guest to be passed in here
+ kimchi.migrateGuest(guest, data, function(){
+ kimchi.listVmsAuto();
+ wok.window.close();
+ }, function(err) {
+ wok.message.error(err.responseJSON.reason);
+ });
+ });
+ }
+
+ initializeMigratePanel();
+
//Setup the VM list entry
var currentState = result.find('.guest-state');
var vmRunningBool = (vmObject.state == "running");
@@ -554,7 +590,7 @@ kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) {
result.addClass('inactive');
result.find('.distro-icon').addClass('inactive');
result.find('.vnc-link').css("display", "none");
- result.find('.column-vnc').html('--');
+ result.find('.column-vnc').html('--');
//Hide PowerOff
guestActions.find(".shutoff-hidden").hide();
//Hide Pause
@@ -589,7 +625,7 @@ kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) {
}
//Setup action event handlers
- if (!(vmObject.isCloning || vmObject.isCreating)) {
+ if(!(vmObject.isCloning || vmObject.isCreating || vmObject.isMigrating)){
guestActions.find("[name=vm-start]").on("click", function(event) {
event.preventDefault();
@@ -648,12 +684,18 @@ kimchi.createGuestLi = function(vmObject, prevScreenImage, openMenu) {
});
}, null);
});
+ guestActions.find("[name=vm-migrate]").click(function(){
+ var guest = $(this).closest('li[name=guest]').attr("id");
+ wok.window.open('plugins/kimchi/guest-migration.html');
+ });
} else {
guestActions.find('.btn').attr('disabled', true);
result.find('.guest-pending').removeClass('hide-content');
pendingText = result.find('.guest-pending .text')
if (vmObject.isCloning)
pendingText.text(i18n['KCHAPI6009M']);
+ else if(vmObject.isMigrating)
+ pendingText.text("Migrating");
else
pendingText.text(i18n['KCHAPI6008M']);
}
diff --git a/ui/pages/guest-migration.html.tmpl b/ui/pages/guest-migration.html.tmpl
new file mode 100644
index 0000000..278d22c
--- /dev/null
+++ b/ui/pages/guest-migration.html.tmpl
@@ -0,0 +1,65 @@
+#*
+ * Project Kimchi
+ *
+ * Copyright IBM, Corp. 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.
+ *#
+#unicode UTF-8
+#import gettext
+#from wok.cachebust import href
+#silent t = gettext.translation($lang.domain, $lang.localedir, languages=$lang.lang, fallback=True)
+#silent _ = t.gettext
+#silent _t = t.gettext
+<div id="migrate-guest-window" class="window modal-content">
+ <div class="modal-header">
+ <h4 class="modal-title" id="migrateModalLabel">$_("Migrate a Guest")</h4>
+ </div>
+ <div id="migrateInfo" class="modal-body">
+ <div class="alert alert-warning" role="alert">Disclaimer: This process cannot be stopped after started,
+ can take a long time to complete and will turn off the VM on this Hypervisor when it is successfully
+ migrated to the remote destination.
+ </div>
+ <div class="form-group">
+ <label for="remoteHostName">$_("Remote Server")</label>
+ <input type="text" class="form-control" id="remoteHostName" />
+ <p class="help-block">
+ <i class="fa fa-info-circle"></i> $_("IP Address or Hostname")</p>
+ </div>
+ <div class="alert alert-info" role="alert">The following fields are optional. Fill them if you want Kimchi to
+ setup a password-less ssh session between the localhost and the remote host. The setup process will only
+ be successful if the user has 'SUDO ALL' permission in the remote machine.
+ </div>
+ <div class="form-group">
+ <label for="user">$_("User")</label>
+ <input type="text" class="form-control" id="user" />
+ <p class="help-block">
+ <i class="fa fa-info-circle"></i> $_("Username of the remote host")</p>
+ </div>
+ <div class="form-group">
+ <label for="password">$_("Password")</label>
+ <input type="password" class="form-control" id="password" />
+ <p class="help-block">
+ <i class="fa fa-info-circle"></i> $_("Password of the user in the remote host")</p>
+ </div>
+ <div class="form-group">
+ <input id="deleteVM" class="wok-checkbox" type="checkbox" value="" />
+ <label for="deleteVM" id="labelDeleteVM">$_("Delete this VM when the migration is completed") </label>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <button type="submit" id="migrateFormOk" class="btn btn-default">$_("Start")</button>
+ <button type="button" id="migrateFormCancel" data-dismiss="modal" class="btn btn-default">$_("Cancel")</button>
+ </div>
+</div>
+
diff --git a/ui/pages/guest.html.tmpl b/ui/pages/guest.html.tmpl
index c2d9ba8..080d918 100644
--- a/ui/pages/guest.html.tmpl
+++ b/ui/pages/guest.html.tmpl
@@ -40,7 +40,8 @@
<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="clone" class='running-disabled' name="vm-clone" href="#"><i class="fa fa-copy"></i>$_("Clone")</a></li>
+ <li role="presentation"><a nwAct="migrate" name="vm-migrate" href="#"><i class="fa fa-exchange"></i>$_("Migrate")</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>
@@ -95,6 +96,4 @@
</div>
</span><!--
--><span class="item-hidden">$_("Network I/O")</span>
- </li>
-
-
+ </li>
\ No newline at end of file
--
1.9.3
More information about the Kimchi-devel
mailing list