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

[Xen-changelog] [xen-unstable] Added support for configuration file for xm, and use that to specify



# HG changeset patch
# User Ewan Mellor <ewan@xxxxxxxxxxxxx>
# Node ID cf1ca06154147cb49b41fc56835ee2cffea31e32
# Parent  92127156ec49568f737b54ff093bdca56e877097
Added support for configuration file for xm, and use that to specify
contact and authentication details for the Xen-API server.

The default behaviour is still to use the existing legacy XML-RPC server.

Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>
---
 tools/examples/xm-config.xml    |   43 +++++++++++++++++++
 tools/python/xen/xm/create.py   |    2 
 tools/python/xen/xm/main.py     |   89 +++++++++++++++++++++++++++++++++++++---
 tools/python/xen/xm/migrate.py  |    3 -
 tools/python/xen/xm/new.py      |    5 --
 tools/python/xen/xm/shutdown.py |    4 -
 6 files changed, 134 insertions(+), 12 deletions(-)

diff -r 92127156ec49 -r cf1ca0615414 tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py     Wed Dec 06 10:47:31 2006 +0000
+++ b/tools/python/xen/xm/create.py     Wed Dec 06 11:02:32 2006 +0000
@@ -29,13 +29,13 @@ from xen.xend import sxp
 from xen.xend import sxp
 from xen.xend import PrettyPrint
 import xen.xend.XendClient
-from xen.xend.XendClient import server
 from xen.xend.XendBootloader import bootloader
 from xen.util import blkif
 from xen.util import security
 
 from xen.xm.opts import *
 
+from main import server
 import console
 
 
diff -r 92127156ec49 -r cf1ca0615414 tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py       Wed Dec 06 10:47:31 2006 +0000
+++ b/tools/python/xen/xm/main.py       Wed Dec 06 11:02:32 2006 +0000
@@ -21,6 +21,7 @@
 
 """Grand unified management application for Xen.
 """
+import atexit
 import os
 import sys
 import re
@@ -31,6 +32,7 @@ import traceback
 import traceback
 import datetime
 from select import select
+import xml.dom.minidom
 
 import warnings
 warnings.filterwarnings('ignore', category=FutureWarning)
@@ -38,18 +40,26 @@ from xen.xend import PrettyPrint
 from xen.xend import PrettyPrint
 from xen.xend import sxp
 from xen.xend import XendClient
-from xen.xend.XendClient import server
 from xen.xend.XendConstants import *
 
 from xen.xm.opts import OptionError, Opts, wrap, set_true
 from xen.xm import console
 from xen.util import security
+from xen.util.xmlrpclib2 import ServerProxy
+
+import XenAPI
 
 # getopt.gnu_getopt is better, but only exists in Python 2.3+.  Use
 # getopt.getopt if gnu_getopt is not available.  This will mean that options
 # may only be specified before positional arguments.
 if not hasattr(getopt, 'gnu_getopt'):
     getopt.gnu_getopt = getopt.getopt
+
+XM_CONFIG_FILE = '/etc/xen/xm-config.xml'
+
+# Supported types of server
+SERVER_LEGACY_XMLRPC = 'LegacyXMLRPC'
+SERVER_XEN_API = 'Xen-API'
 
 # General help message
 
@@ -319,6 +329,35 @@ all_commands = (domain_commands + host_c
 all_commands = (domain_commands + host_commands + scheduler_commands +
                 device_commands + vnet_commands + acm_commands)
 
+
+##
+# Configuration File Parsing
+##
+
+if os.path.isfile(XM_CONFIG_FILE):
+    config = xml.dom.minidom.parse(XM_CONFIG_FILE)
+else:
+    config = None
+
+def parseServer():
+    if config:
+        server = config.getElementsByTagName('server')
+        if server:
+            st = server[0].getAttribute('type')
+            if st != SERVER_XEN_API:
+                st = SERVER_LEGACY_XMLRPC
+            return (st, server[0].getAttribute('uri'))
+
+    return SERVER_LEGACY_XMLRPC, XendClient.uri
+
+def parseAuthentication():
+    server = config.getElementsByTagName('server')[0]
+    return (server.getAttribute('username'),
+            server.getAttribute('password'))
+
+serverType, serverURI = parseServer()
+
+
 ####################################################################
 #
 #  Help/usage printing functions
@@ -467,6 +506,16 @@ def int_unit(str, dest):
 
 def err(msg):
     print >>sys.stderr, "Error:", msg
+
+
+def get_single_vm(dom):
+    uuids = server.xenapi.VM.get_by_name_label(dom)
+    n = len(uuids)
+    if n == 1:
+        return uuids[0]
+    else:
+        dominfo = server.xend.domain(dom, False)
+        return dominfo['uuid']
 
 
 #########################################################################
@@ -767,17 +816,26 @@ def xm_start(args):
         sys.exit(1)
 
     dom = params[0]
-    server.xend.domain.start(dom, paused)
+    if serverType == SERVER_XEN_API:
+        server.xenapi.VM.start(get_single_vm(dom), paused)
+    else:
+        server.xend.domain.start(dom, paused)
 
 def xm_delete(args):
     arg_check(args, "delete", 1)
     dom = args[0]
-    server.xend.domain.delete(dom)
+    if serverType == SERVER_XEN_API:
+        server.xenapi.VM.destroy(dom)
+    else:
+        server.xend.domain.delete(dom)
 
 def xm_suspend(args):
     arg_check(args, "suspend", 1)
     dom = args[0]
-    server.xend.domain.suspend(dom)
+    if serverType == SERVER_XEN_API:
+        server.xenapi.VM.suspend(get_single_vm(dom))
+    else:
+        server.xend.domain.suspend(dom)
 
 def xm_resume(args):
     arg_check(args, "resume", 1, 2)
@@ -799,7 +857,10 @@ def xm_resume(args):
         sys.exit(1)
 
     dom = params[0]
-    server.xend.domain.resume(dom, paused)
+    if serverType == SERVER_XEN_API:
+        server.xenapi.VM.resume(dom, paused)
+    else:
+        server.xend.domain.resume(dom, paused)
     
 def xm_reboot(args):
     arg_check(args, "reboot", 1, 3)
@@ -1577,6 +1638,8 @@ def deprecated(old,new):
         "Command %s is deprecated.  Please use xm %s instead." % (old, new))
 
 def main(argv=sys.argv):
+    global server
+
     if len(argv) < 2:
         usage()
 
@@ -1595,6 +1658,19 @@ def main(argv=sys.argv):
     args = argv[2:]
     if cmd:
         try:
+            if serverType == SERVER_XEN_API:
+                server = XenAPI.Session(serverURI)
+                username, password = parseAuthentication()
+                server.login_with_password(username, password)
+                def logout():
+                    try:
+                        server.xenapi.session.logout()
+                    except:
+                        pass
+                atexit.register(logout)
+            else:
+                server = ServerProxy(serverURI)
+
             rc = cmd(args)
             if rc:
                 usage()
@@ -1614,6 +1690,9 @@ def main(argv=sys.argv):
                 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:
diff -r 92127156ec49 -r cf1ca0615414 tools/python/xen/xm/migrate.py
--- a/tools/python/xen/xm/migrate.py    Wed Dec 06 10:47:31 2006 +0000
+++ b/tools/python/xen/xm/migrate.py    Wed Dec 06 11:02:32 2006 +0000
@@ -21,8 +21,9 @@
 
 import sys
 
-from xen.xend.XendClient import server
 from xen.xm.opts import *
+
+from main import server
 
 gopts = Opts(use="""[options] DOM HOST
 
diff -r 92127156ec49 -r cf1ca0615414 tools/python/xen/xm/new.py
--- a/tools/python/xen/xm/new.py        Wed Dec 06 10:47:31 2006 +0000
+++ b/tools/python/xen/xm/new.py        Wed Dec 06 11:02:32 2006 +0000
@@ -21,10 +21,9 @@ from xen.xend import PrettyPrint
 from xen.xend import PrettyPrint
 from xen.xend import sxp
 from xen.xend import XendClient
-from xen.xend.XendClient import server
 
-from xen.xm.opts import *
-from xen.xm.create import *
+from opts import *
+from create import *
 
 def make_unstarted_domain(opts, config):
     """Create an unstarted domain.
diff -r 92127156ec49 -r cf1ca0615414 tools/python/xen/xm/shutdown.py
--- a/tools/python/xen/xm/shutdown.py   Wed Dec 06 10:47:31 2006 +0000
+++ b/tools/python/xen/xm/shutdown.py   Wed Dec 06 11:02:32 2006 +0000
@@ -19,9 +19,9 @@
 """
 import time
 
-from xen.xend.XendClient import server
 from xen.xend import sxp
-from xen.xm.opts import *
+from opts import *
+from main import server
 
 gopts = Opts(use="""[options] [DOM]
 
diff -r 92127156ec49 -r cf1ca0615414 tools/examples/xm-config.xml
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/examples/xm-config.xml      Wed Dec 06 11:02:32 2006 +0000
@@ -0,0 +1,43 @@
+<!--
+
+Copyright (C) 2006 XenSource Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of version 2.1 of the GNU Lesser General Public
+License as published by the Free Software Foundation.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+-->
+
+<!--
+
+This is a configuration file for xm; it should be placed in
+/etc/xen/xm-config.xml.  If this file is missing, then xm will fall back to
+the normal behaviour that's in Xen 3.0.4 and below.  The settings here are
+most useful for experimenting with the Xen-API preview in Xen 3.0.4.
+
+-->
+
+<xm>
+  <!-- The server element describes how to talk to Xend.  The type may be 
+       Xen-API or LegacyXMLRPC (the default).  The URI is that of the
+       server; you might try http://server:9363/ or
+       httpu:///var/run/xend/xen-api.sock for the Xen-API, or
+       httpu:///var/run/xend/xmlrpc.sock for the legacy server.
+
+       The username and password attributes will be used to log in if Xen-API
+       is being used.
+    -->
+  <server type='Xen-API'
+          uri='http://localhost:9363/'
+          username='me'
+          password='mypassword' />
+</xm>

_______________________________________________
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®.