
On 11/05/2015 07:04 PM, Aline Manera wrote:
On 04/11/2015 12:11, chandra@linux.vnet.ibm.com wrote:
From: chandrureddy <chandra@linux.vnet.ibm.com>
--- src/wok/plugins/gingerbase/model/host.py | 47 +++++++++++++++------- .../gingerbase/ui/js/src/gingerbase.host.js | 27 +++++++------ src/wok/plugins/gingerbase/ui/pages/i18n.json.tmpl | 3 ++ 3 files changed, 50 insertions(+), 27 deletions(-)
diff --git a/src/wok/plugins/gingerbase/model/host.py b/src/wok/plugins/gingerbase/model/host.py index 670fec5..8c5ca5f 100644 --- a/src/wok/plugins/gingerbase/model/host.py +++ b/src/wok/plugins/gingerbase/model/host.py @@ -39,6 +39,14 @@ from wok.plugins.gingerbase.repositories import Repositories from wok.plugins.gingerbase.swupdate import SoftwareUpdate
HOST_STATS_INTERVAL = 1 +DOM_STATE_MAP = {0: 'nostate', + 1: 'running', + 2: 'blocked', + 3: 'paused', + 4: 'shutdown', + 5: 'shutoff', + 6: 'crashed', + 7: 'pmsuspended'}
class HostModel(object): @@ -142,29 +150,40 @@ class HostModel(object):
def shutdown(self, args=None): # Check for running vms before shutdown - # FIXME : Find alternative way to figure out if any vms running - # running_vms = self._get_vms_list_by_state('running') - # if len(running_vms) > 0: - # raise OperationFailed("GGBHOST0001E") + running_vms = self.get_vmlist_bystate('running') + if len(running_vms) > 0: + raise OperationFailed("GGBHOST0001E")
wok_log.info('Host is going to shutdown.') os.system('shutdown -h now')
def reboot(self, args=None): - # Find running VMs - # FIXME : Find alternative way to figure out if any vms running - # running_vms = self._get_vms_list_by_state('running') - # if len(running_vms) > 0: - # raise OperationFailed("GGBHOST0002E") + # Check for running vms before reboot + running_vms = self.get_vmlist_bystate('running') + if len(running_vms) > 0: + raise OperationFailed("GGBHOST0002E")
wok_log.info('Host is going to reboot.') os.system('reboot')
- # def _get_vms_list_by_state(self, state): - # conn = self.conn.get() - # return [dom.name().decode('utf-8') - # for dom in conn.listAllDomains(0) - # if (DOM_STATE_MAP[dom.info()[0]]) == state] + def get_vmlist_bystate(self, state='running'): + try: + libvirt_mod = __import__('libvirt') + except Exception, e: + wok_log.info("Unable to import libvirt module. Details:", + e.message) + # Ignore any error and assume there is no vm running in the host + return [] + + try:
+ conn = libvirt_mod.open("qemu:///system")
Use "None" to open the libvirt connection (instead of 'qemu:///system') so it connects to the current libvirtd process which may be pointing to a different address than qemu:///system
Done. For some reason I got empty list when I tried with None on Fedora 21 (with normal user). But with code changes are part of installation it works as expected.
+ return [dom.name().decode('utf-8') + for dom in conn.listAllDomains(0) + if (DOM_STATE_MAP[dom.info()[0]] == state)] + except Exception, e: + wok_log.info("Unable to get virtual machines information. " + "Details:", e.message) + raise OperationFailed("There may be vms running on the host")
class SoftwareUpdateProgressModel(object): diff --git a/src/wok/plugins/gingerbase/ui/js/src/gingerbase.host.js b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.host.js index 0d52b92..e07b2bd 100644 --- a/src/wok/plugins/gingerbase/ui/js/src/gingerbase.host.js +++ b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.host.js @@ -496,22 +496,23 @@ kimchi.host_main = function() { };
wok.confirm(settings, function() { - kimchi.shutdown(params); $(shutdownButtonID).prop('disabled', true); $(restartButtonID).prop('disabled', true); // Check if there is any VM is running. - // FIXME : Find alternative way to figure out if any vms running - // kimchi.listVMs(function(vms) { - // for(var i = 0; i < vms.length; i++) { - // if(vms[i]['state'] === 'running') { - // wok.message.error.code('GGBHOST6001E'); - // $(shutdownButtonID).prop('disabled', false); - // $(restartButtonID).prop('disabled', false); - // return; - // } - // } - // - // }); + // Based on the success will shutdown/reboot + kimchi.shutdown(params, function(success) { + wok.message.success(i18n['GGBHOST6009M']) + $(shutdownButtonID).prop('disabled', false); + $(restartButtonID).prop('disabled', false); + return; + }, function(error) {
+ if (error['status'] == 500) {
You don't need to verify the error code. On any error, we should display the error message to user.
Done.
+ // Looks like VMs are running. + wok.message.error.code('GGBHOST6001E'); + }
+ $(shutdownButtonID).prop('disabled', false); + $(restartButtonID).prop('disabled', false);
Why did you disabled the buttons? Can't user try to reboot/shutdown again after an error?
Basically we will try to disable after click 'ok' of actions shutdown/reboot and once REST API gets back with the response these buttons will be enabled back. So I do feel we should keep this code as it is.
+ }); }, function() { }); }; diff --git a/src/wok/plugins/gingerbase/ui/pages/i18n.json.tmpl b/src/wok/plugins/gingerbase/ui/pages/i18n.json.tmpl index f6228ab..3f3b662 100644 --- a/src/wok/plugins/gingerbase/ui/pages/i18n.json.tmpl +++ b/src/wok/plugins/gingerbase/ui/pages/i18n.json.tmpl @@ -69,6 +69,7 @@ "GGBHOST6006M": "$_("Received")", "GGBHOST6007M": "$_("Sent")", "GGBHOST6008M": "$_("Shutting down or restarting host will cause unsaved work lost. Continue to shut down/restarting?")", + "GGBHOST6009M": "$_("The system is going down")",
"GGBREPO6001M": "$_("Confirm")", @@ -113,6 +114,8 @@ "GGBDR6012M": "$_("Pending...")", "GGBDR6013M": "$_("Report name is the same as the original one.")",
+ "GGBHOST6001E": "$_("Unable to shut down system as there are some virtual machines running!")", + "GGBVM6001M": "$_("This will delete the virtual machine and its virtual disks. This operation cannot be undone. Would you like to continue?")", "GGBVM6002M": "$_("Power off Confirmation")", "GGBVM6003M": "$_("This action may produce undesirable results, "