diff -r b622e411eef8 tools/python/xen/xend/XendDomain.py --- a/tools/python/xen/xend/XendDomain.py Thu Jun 24 21:56:03 2010 +0100 +++ b/tools/python/xen/xend/XendDomain.py Tue Jun 29 11:06:56 2010 +0800 @@ -250,6 +250,18 @@ @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. diff -r b622e411eef8 tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Thu Jun 24 21:56:03 2010 +0100 +++ b/tools/python/xen/xend/XendDomainInfo.py Tue Jun 29 11:06:56 2010 +0800 @@ -329,6 +329,8 @@ @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 @@ 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) diff -r b622e411eef8 tools/python/xen/xend/server/SrvDomain.py --- a/tools/python/xen/xend/server/SrvDomain.py Thu Jun 24 21:56:03 2010 +0100 +++ b/tools/python/xen/xend/server/SrvDomain.py Tue Jun 29 11:06:56 2010 +0800 @@ -238,6 +238,20 @@ 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) diff -r b622e411eef8 tools/python/xen/xm/main.py --- a/tools/python/xen/xm/main.py Thu Jun 24 21:56:03 2010 +0100 +++ b/tools/python/xen/xm/main.py Tue Jun 29 11:06:56 2010 +0800 @@ -169,6 +169,8 @@ #usb 'usb-add' : (' <[host:bus.addr] [host:vendor_id:product_id]>','Add the usb device to FV VM.'), 'usb-del' : (' <[host:bus.addr] [host:vendor_id:product_id]>','Delete the usb device to FV VM.'), + #domstate + 'domstate' : (' ', 'get the state of a domain'), # device commands @@ -401,6 +403,7 @@ "uptime", "usb-add", "usb-del", + "domstate", "vcpu-set", ] @@ -435,6 +438,7 @@ "uptime", "usb-add", "usb-del", + "domstate", "vcpu-list", "vcpu-pin", "vcpu-set", @@ -948,7 +952,6 @@ 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 @@ 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 @@ 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 @@ 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 @@ #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.