[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] Added xm shell command, taken from xapi.py, to make testing the Xen-API calls



# HG changeset patch
# User Ewan Mellor <ewan@xxxxxxxxxxxxx>
# Node ID c91f6506b270be0ceabf3bb25fc8db5775b92493
# Parent  de7d7b223db20a852c8bf099a5076dbddafbd198
Added xm shell command, taken from xapi.py, to make testing the Xen-API calls
a little easier.

Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>
---
 tools/python/xen/xm/XenAPI.py |    4 
 tools/python/xen/xm/main.py   |  204 ++++++++++++++++++++++++++----------------
 2 files changed, 129 insertions(+), 79 deletions(-)

diff -r de7d7b223db2 -r c91f6506b270 tools/python/xen/xm/XenAPI.py
--- a/tools/python/xen/xm/XenAPI.py     Thu Dec 14 14:50:35 2006 +0000
+++ b/tools/python/xen/xm/XenAPI.py     Thu Dec 14 14:54:24 2006 +0000
@@ -82,7 +82,7 @@ class Session(xen.util.xmlrpclib2.Server
         self._session = None
 
 
-    def _xen_request(self, methodname, params):
+    def xenapi_request(self, methodname, params):
         full_params = (self._session,) + params
         return _parse_result(getattr(self, methodname)(*full_params))
 
@@ -94,7 +94,7 @@ class Session(xen.util.xmlrpclib2.Server
 
     def __getattr__(self, name):
         if name == 'xenapi':
-            return _Dispatcher(self._xen_request, None)
+            return _Dispatcher(self.xenapi_request, None)
         elif name.startswith('login'):
             return lambda u, p: self._login(name, u, p)
         else:
diff -r de7d7b223db2 -r c91f6506b270 tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py       Thu Dec 14 14:50:35 2006 +0000
+++ b/tools/python/xen/xm/main.py       Thu Dec 14 14:54:24 2006 +0000
@@ -22,7 +22,10 @@
 """Grand unified management application for Xen.
 """
 import atexit
+import cmd
 import os
+import pprint
+import shlex
 import sys
 import re
 import getopt
@@ -77,6 +80,8 @@ USAGE_FOOTER = '<Domain> can either be t
 
 SUBCOMMAND_HELP = {
     # common commands
+
+    'shell'       : ('', 'Launch an interactive shell.'),
     
     'console'     : ('[-q|--quiet] <Domain>',
                      'Attach to <Domain>\'s console.'),
@@ -245,6 +250,7 @@ common_commands = [
     "restore",
     "resume",
     "save",
+    "shell",
     "shutdown",
     "start",
     "suspend",
@@ -328,7 +334,7 @@ acm_commands = [
     ]
 
 all_commands = (domain_commands + host_commands + scheduler_commands +
-                device_commands + vnet_commands + acm_commands)
+                device_commands + vnet_commands + acm_commands + ['shell'])
 
 
 ##
@@ -362,6 +368,7 @@ def parseAuthentication():
             server.getAttribute('password'))
 
 serverType, serverURI = parseServer()
+server = None
 
 
 ####################################################################
@@ -455,12 +462,16 @@ def longHelp():
     print
     print USAGE_FOOTER        
 
+def _usage(cmd):
+    """ Print help usage information """
+    if cmd:
+        cmdHelp(cmd)
+    else:
+        shortHelp()
+
 def usage(cmd = None):
     """ Print help usage information and exits """
-    if cmd:
-        cmdHelp(cmd)
-    else:
-        shortHelp()
+    _usage(cmd)
     sys.exit(1)
 
 
@@ -522,6 +533,49 @@ def get_single_vm(dom):
     else:
         dominfo = server.xend.domain(dom, False)
         return dominfo['uuid']
+
+##
+#
+# Xen-API Shell
+#
+##
+
+class Shell(cmd.Cmd):
+    def __init__(self):
+        cmd.Cmd.__init__(self)
+        self.prompt = "xm> "
+
+    def default(self, line):
+        words = shlex.split(line)
+        if len(words) > 0 and words[0] == 'xm':
+            words = words[1:]
+        if len(words) > 0:
+            cmd = xm_lookup_cmd(words[0])
+            if cmd:
+                _run_cmd(cmd, words[0], words[1:])
+            elif serverType == SERVER_XEN_API:
+                ok, res = _run_cmd(lambda x: server.xenapi_request(words[0],
+                                                                   tuple(x)),
+                                   words[0], words[1:])
+                if ok and res != '':
+                    pprint.pprint(res)
+            else:
+                print '*** Unknown command: %s' % words[0]
+        return False
+
+    def emptyline(self):
+        pass
+
+    def do_EOF(self, line):
+        print
+        sys.exit(0)
+
+    def do_help(self, line):
+        _usage(line)
+
+
+def xm_shell(args):
+    Shell().cmdloop('The Xen Master. Type "help" for a list of functions.')
 
 
 #########################################################################
@@ -1560,6 +1614,7 @@ def xm_vnet_delete(args):
     server.xend_vnet_delete(vnet)
 
 commands = {
+    "shell": xm_shell,
     # console commands
     "console": xm_console,
     # xenstat commands
@@ -1663,17 +1718,13 @@ def xm_lookup_cmd(cmd):
             # only execute if there is only 1 match
             if len(same_prefix_cmds) == 1:
                 return same_prefix_cmds[0]
-            
-        err('Sub Command %s not found!' % cmd)
-        usage()
+        return None
 
 def deprecated(old,new):
     print >>sys.stderr, (
         "Command %s is deprecated.  Please use xm %s instead." % (old, new))
 
 def main(argv=sys.argv):
-    global server
-
     if len(argv) < 2:
         usage()
 
@@ -1682,16 +1733,26 @@ def main(argv=sys.argv):
         if help in argv[1:]:
             if help == argv[1]:
                 longHelp()
+                sys.exit(0)
             else:
                 usage(argv[1])
-            sys.exit(0)
-
-    cmd = xm_lookup_cmd(argv[1])
-
-    # strip off prog name and subcmd
-    args = argv[2:]
+
+    cmd_name = argv[1]
+    cmd = xm_lookup_cmd(cmd_name)
     if cmd:
-        try:
+        # strip off prog name and subcmd
+        args = argv[2:]
+        _, rc = _run_cmd(cmd, cmd_name, args)
+        if rc:
+            usage(cmd_name)
+    else:
+        usage()
+
+def _run_cmd(cmd, cmd_name, args):
+    global server
+
+    try:
+        if server is None:
             if serverType == SERVER_XEN_API:
                 server = XenAPI.Session(serverURI)
                 username, password = parseAuthentication()
@@ -1705,66 +1766,55 @@ def main(argv=sys.argv):
             else:
                 server = ServerProxy(serverURI)
 
-            rc = cmd(args)
-            if rc:
-                usage()
-        except socket.error, ex:
-            if os.geteuid() != 0:
-                err("Most commands need root access. Please try again as 
root.")
-            else:
-                err("Unable to connect to xend: %s. Is xend running?" % ex[1])
-            sys.exit(1)
-        except KeyboardInterrupt:
-            print "Interrupted."
-            sys.exit(1)
-        except IOError, ex:
-            if os.geteuid() != 0:
-                err("Most commands need root access.  Please try again as 
root.")
-            else:
-                err("Unable to connect to xend: %s." % ex[1])
-            sys.exit(1)
-        except SystemExit:
-            sys.exit(1)
-        except XenAPI.Failure, exn:
-            err(str(exn))
-            sys.exit(1)
-        except xmlrpclib.Fault, ex:
-            if ex.faultCode == XendClient.ERROR_INVALID_DOMAIN:
-                err("Domain '%s' does not exist." % ex.faultString)
-            else:
-                err(ex.faultString)
-            usage(argv[1])
-            sys.exit(1)
-        except xmlrpclib.ProtocolError, ex:
-            if ex.errcode == -1:
-                print  >>sys.stderr, (
-                    "Xend has probably crashed!  Invalid or missing HTTP "
-                    "status code.")
-            else:
-                print  >>sys.stderr, (
-                    "Xend has probably crashed!  ProtocolError(%d, %s)." %
-                    (ex.errcode, ex.errmsg))
-            sys.exit(1)
-        except (ValueError, OverflowError):
-            err("Invalid argument.")
-            usage(argv[1])
-            sys.exit(1)
-        except OptionError, e:
-            err(str(e))
-            usage(argv[1])
-            print e.usage()
-            sys.exit(1)
-        except security.ACMError, e:
-            err(str(e))
-            sys.exit(1)
-        except:
-            print "Unexpected error:", sys.exc_info()[0]
-            print
-            print "Please report to xen-devel@xxxxxxxxxxxxxxxxxxx"
-            raise
-                
-    else:
-        usage()
+        return True, cmd(args)
+    except socket.error, ex:
+        if os.geteuid() != 0:
+            err("Most commands need root access. Please try again as root.")
+        else:
+            err("Unable to connect to xend: %s. Is xend running?" % ex[1])
+    except KeyboardInterrupt:
+        print "Interrupted."
+        return True, ''
+    except IOError, ex:
+        if os.geteuid() != 0:
+            err("Most commands need root access.  Please try again as root.")
+        else:
+            err("Unable to connect to xend: %s." % ex[1])
+    except SystemExit:
+        return True, ''
+    except XenAPI.Failure, exn:
+        err(str(exn))
+    except xmlrpclib.Fault, ex:
+        if ex.faultCode == XendClient.ERROR_INVALID_DOMAIN:
+            err("Domain '%s' does not exist." % ex.faultString)
+        else:
+            err(ex.faultString)
+        _usage(cmd_name)
+    except xmlrpclib.ProtocolError, ex:
+        if ex.errcode == -1:
+            print  >>sys.stderr, (
+                "Xend has probably crashed!  Invalid or missing HTTP "
+                "status code.")
+        else:
+            print  >>sys.stderr, (
+                "Xend has probably crashed!  ProtocolError(%d, %s)." %
+                (ex.errcode, ex.errmsg))
+    except (ValueError, OverflowError):
+        err("Invalid argument.")
+        _usage(cmd_name)
+    except OptionError, e:
+        err(str(e))
+        _usage(cmd_name)
+        print e.usage()
+    except security.ACMError, e:
+        err(str(e))
+    except:
+        print "Unexpected error:", sys.exc_info()[0]
+        print
+        print "Please report to xen-devel@xxxxxxxxxxxxxxxxxxx"
+        raise
+
+    return False, 1
 
 if __name__ == "__main__":
     main()

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.