tools/xend, xm: add a command to get the state of VMs
authorIan Jackson <Ian.Jackson@eu.citrix.com>
Tue, 29 Jun 2010 13:52:51 +0000 (14:52 +0100)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Tue, 29 Jun 2010 13:52:51 +0000 (14:52 +0100)
add a command "domstate" to get the state of Vms, which may have one state of
{'shutoff', 'idle','shutdown','running','crashed','paused' or 'paused by
admin"}.

For case of pause, I distinguish it into two conditions. One is "paused" the
other is "paused by admin".
"pasued by admin" means that users pause a domain voluntary by "xm paused
VM" or " API"

Signed-off-by James (Song Wei) <jsong@novell.com>

tools/python/xen/xend/XendDomain.py
tools/python/xen/xend/XendDomainInfo.py
tools/python/xen/xend/server/SrvDomain.py
tools/python/xen/xm/main.py

index 73fee7077b12a55e69e58beefe2d27b98204b922..71aae2a58e4f6c044d7469d3d7adec470b38f79d 100644 (file)
@@ -250,6 +250,18 @@ class XendDomain:
         @return: path to config file.
         """
         return os.path.join(self._managed_path(domuuid), CACHED_CONFIG_FILE)
+    def domain_setpauseflag(self, dom, flag=False):
+        try:
+            dominfo = self.domain_lookup_nr(dom)
+            dominfo.paused_by_admin = flag
+        except Exception, err:
+            log.debug("error in in setpauseflag")
+    def domain_getpauseflag(self, dom):
+        try:
+            dominfo = self.domain_lookup_nr(dom)
+            return dominfo.paused_by_admin
+        except Exception, err:
+            log.debug("error in in getpauseflag")
 
     def _managed_check_point_path(self, domuuid):
         """Returns absolute path to check point file for managed domain.
index 1432725a11b2298c2b589b1a2632f3310b3b9b89..5a8d71a7182c4853a1948b3f250d1cd376124456 100644 (file)
@@ -329,6 +329,8 @@ class XendDomainInfo:
     @type info: dictionary
     @ivar domid: Domain ID (if VM has started)
     @type domid: int or None
+    @ivar paused_by_admin: Is this Domain paused by command or API 
+    @type paused_by_admin: bool 
     @ivar guest_bitsize: the bitsize of guest 
     @type guest_bitsize: int or None
     @ivar alloc_mem: the memory domain allocated when booting 
@@ -392,6 +394,7 @@ class XendDomainInfo:
             self.domid = domid
         self.guest_bitsize = None
         self.alloc_mem = None
+        self.paused_by_admin = False
 
         maxmem = self.info.get('memory_static_max', 0)
         memory = self.info.get('memory_dynamic_max', 0)
index 46e6ecd6cb980bafc08c8dc7b8edd28b30902eca..aa07b7ab19be8218eb013a4eba3073ebdb647f0d 100644 (file)
@@ -238,6 +238,20 @@ class SrvDomain(SrvDir):
     def op_reset(self, _, req):
         self.acceptCommand(req)
         return self.xd.domain_reset(self.dom.getName())
+    def op_do_get_pauseflag(self, op, req):
+        self.acceptCommand(req)
+        return req.threadRequest(self.do_get_pauseflag, op, req)
+
+    def do_get_pauseflag(self, _, req):
+        return self.xd.domain_getpauseflag(self.dom.getName(), req)
+    def op_do_set_pauseflag(self, op, req):
+        self.acceptCommand(req)
+        return req.threadRequest(self.do_set_pauseflag, op, req)
+
+    def do_set_pauseflag(self, _, req):
+        return self.xd.domain_setpauseflag(self.dom.getName(), req)
 
     def op_usb_add(self, op, req):
         self.acceptCommand(req)
index 33d734fe1c9803793df38aab1c624ebab0ae66b2..e0e3d154b2f437cf9d590a5abcd17dafaf851636 100644 (file)
@@ -169,6 +169,8 @@ SUBCOMMAND_HELP = {
     #usb
     'usb-add'     : ('<domain> <[host:bus.addr] [host:vendor_id:product_id]>','Add the usb device to FV VM.'),
     'usb-del'     : ('<domain> <[host:bus.addr] [host:vendor_id:product_id]>','Delete the usb device to FV VM.'),
+    #domstate
+    'domstate'  : ('<domain> ', 'get the state of a domain'),
 
     # device commands
 
@@ -401,6 +403,7 @@ common_commands = [
     "uptime",
     "usb-add",
     "usb-del",
+    "domstate",
     "vcpu-set",
     ]
 
@@ -435,6 +438,7 @@ domain_commands = [
     "uptime",
     "usb-add",
     "usb-del",
+    "domstate",
     "vcpu-list",
     "vcpu-pin",
     "vcpu-set",
@@ -948,7 +952,6 @@ def getDomains(domain_names, state, full = 0, pool = None):
                     return "-"
             state_str = "".join([state_on_off(state)
                                  for state in states])
-            
             dom_rec.update({'name':     dom_rec['name_label'],
                             'memory_actual': int(dom_metrics_rec['memory_actual'])/1024,
                             'vcpus':    dom_metrics_rec['VCPUs_number'],
@@ -1457,8 +1460,10 @@ def xm_pause(args):
 
     if serverType == SERVER_XEN_API:
         server.xenapi.VM.pause(get_single_vm(dom))
+        server.xenapi.VM.set_pauseflag(get_single_vm(dom), True)
     else:
         server.xend.domain.pause(dom)
+        server.xend.domain.setpauseflag(dom, True)
 
 def xm_unpause(args):
     arg_check(args, "unpause", 1)
@@ -1466,8 +1471,10 @@ def xm_unpause(args):
 
     if serverType == SERVER_XEN_API:
         server.xenapi.VM.unpause(get_single_vm(dom))
+        server.xenapi.VM.set_pauseflag(get_single_vm(dom), False)
     else:
         server.xend.domain.unpause(dom)
+        server.xend.domain.setpauseflag(dom, False)
 
 def xm_dump_core(args):
     live = False
@@ -1579,6 +1586,32 @@ def xm_usb_add(args):
     arg_check(args, "usb-add", 2)
     server.xend.domain.usb_add(args[0],args[1])
 
+def xm_domstate(args):
+    arg_check(args, "domstate", 1)
+    (opitons, params) = getopt.gnu_getopt(args, 's',  ['domname='])
+    doms = getDomains(params, 'all')
+    d = parse_doms_info(doms[0])
+    state =  d['state']
+    if state:
+        if   state.find('s') > 0:
+            print 'shutoff'  
+        elif state.find('b') > 0: 
+            print 'idle'  
+        elif state.find('d') > 0: 
+            print 'shutdown'  
+        elif state.find('r') > 0: 
+            print 'running'  
+        elif state.find('c') > 0:
+            print 'crashed' 
+        elif state.find('p') > 0:
+            if server.xend.domain.getpauseflag(args[0]):
+                print 'paused by admin'
+            else:
+                print 'paused'
+    else:
+        print 'shutoff'
+    return 
+
 def xm_usb_del(args):
     arg_check(args, "usb-del", 2)
     server.xend.domain.usb_del(args[0],args[1])
@@ -3861,6 +3894,8 @@ commands = {
     #usb
     "usb-add": xm_usb_add,
     "usb-del": xm_usb_del,
+    #domstate
+    "domstate": xm_domstate,
     }
 
 ## The commands supported by a separate argument parser in xend.xm.