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

[Xen-changelog] [xen-unstable] [XENAPI] Example tools to create/destroy/shutdown VMs



# HG changeset patch
# User Alastair Tse <atse@xxxxxxxxxxxxx>
# Node ID d147be77861d1497325ffed96b287e4686db0241
# Parent  c383cb0945a7f87b77a825f42dfdc553ae3a76c1
[XENAPI] Example tools to create/destroy/shutdown VMs

Example Session:

xapi.py vm-list
xapi.py host-info
xapi.py vm-create xapi.domcfg.py
xapi.py vbd-create GentooAPI xapi.vbdcfg.py
xapi.py vif-create GentooAPI xapi.vifcfg.py
xapi.py vm-start GentooAPI
xapi.py vm-shutdown GentooAPI
xapi.py vm-delete xapi.py

signed-off-by: Alastair Tse <atse@xxxxxxxxxxxxx>
---
 tools/python/scripts/xapi.domcfg.py |   39 ++++++
 tools/python/scripts/xapi.py        |  207 ++++++++++++++++++++++++++++++++++++
 tools/python/scripts/xapi.vbdcfg.py |   12 ++
 tools/python/scripts/xapi.vifcfg.py |   10 +
 4 files changed, 268 insertions(+)

diff -r c383cb0945a7 -r d147be77861d tools/python/scripts/xapi.domcfg.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/scripts/xapi.domcfg.py       Fri Oct 06 11:48:21 2006 +0100
@@ -0,0 +1,39 @@
+#
+# VM Configuration for Xen API
+#
+
+name_label =  'GentooAPI'
+name_description =  'Gentoo VM via API'
+user_version =  1
+is_a_template =  False
+memory_static_max =  32
+memory_dynamic_max =  32
+memory_dynamic_min =  32
+memory_static_min =  32
+VCPUs_policy =  ''
+VCPUs_params =  ''
+VCPUS_features_required =  ''
+VCPUs_features_can_use =  ''
+VCPUs_features_force_on =  ''
+VCPUs_features_force_off =  ''
+actions_after_shutdown =  'destroy'
+actions_after_reboot =  'restart'
+actions_after_suspend =  'destroy'
+actions_after_crash =  'restart'
+TPM_instance =  ''
+TPM_backend =  ''
+bios_boot =  ''
+platform_std_VGA =  False
+platform_serial =  ''
+platform_localtime =  False
+platform_clock_offset =  False
+platform_enable_audio =  False
+builder =  ''
+boot_method =  '' # this will remove the kernel/initrd ??
+kernel_kernel =  '/boot/vmlinuz-2.6.16.29-xen'
+kernel_initrd =  '/root/initrd.img-2.6.16.29-xen.ramfs'
+kernel_args =  'root=/dev/sda1 ro'
+grub_cmdline =  ''
+PCI_bus =  ''
+other_config =  ''
+
diff -r c383cb0945a7 -r d147be77861d tools/python/scripts/xapi.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/scripts/xapi.py      Fri Oct 06 11:48:21 2006 +0100
@@ -0,0 +1,207 @@
+#!/usr/bin/python
+#============================================================================
+# 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
+#============================================================================
+# Copyright (C) 2006 XenSource Ltd.
+#============================================================================
+
+from xen.util.xmlrpclib2 import ServerProxy
+from optparse import *
+from types import DictType
+
+HOST_INFO_FORMAT = '%-20s: %-50s'
+VM_LIST_FORMAT = '%(name_label)-24s %(memory_actual)-5s %(vcpus_number)-5s'\
+                 ' %(power_state)-5s %(uuid)-32s'
+
+LOGIN = ('atse', 'passwd')
+
+COMMANDS = {
+    'host-info': ('', 'Get Xen Host Info'),
+    'vm-list':   ('', 'List all domains.'),
+    'vm-uuid':   ('<name>', 'UUID of a domain by name.'),
+    'vm-name':   ('<uuid>', 'Name of UUID.'),
+    'vm-start':  ('<name>', 'Start VM with name'),
+    'vm-shutdown': ('<name>', 'Shutdown VM with name'),
+    'vm-create': ('<pycfg>', 'Create VM with python config'),
+    'vbd-create': ('<domname> <pycfg>', 'Create VBD attached to domname'),
+    'vif-create': ('<domname> <pycfg>', 'Create VIF attached to domname'),
+    'vm-delete': ('<domname>', 'Delete VM'),
+}
+
+class OptionError(Exception):
+    pass
+
+# 
+# Extra utility functions
+#
+
+def execute(fn, *args):
+    result = fn(*args)
+    if type(result) != DictType:
+        raise TypeError("Function returned object of type: %s" %
+                        str(type(result)))
+    if 'Value' not in result:
+        raise Exception(result['ErrorDescription'])
+    return result['Value']
+
+
+def _connect(*args):
+    server = ServerProxy('httpu:///var/run/xend/xmlrpc.sock')        
+    session = execute(server.Session.login_with_password, *LOGIN)
+    host = execute(server.Session.get_this_host, session)
+    return (server, session)
+
+def _stringify(adict):
+    return dict([(k, str(v)) for k, v in adict.items()])
+
+def _read_python_cfg(filename):
+    cfg_globals = {}
+    execfile(filename, cfg_globals, {})
+    return cfg_globals
+
+#
+# Actual commands
+#
+
+def xapi_host_info(*args):
+    server, session = _connect()
+    hosts = execute(server.Host.get_all, session)
+    for host in hosts: # there is only one, but ..
+        hostinfo = execute(server.Host.get_record, session, host)
+        print HOST_INFO_FORMAT % ('Name', hostinfo['name_label'])
+        print HOST_INFO_FORMAT % ('Version', hostinfo['software_version'])
+        print HOST_INFO_FORMAT % ('CPUs', len(hostinfo['host_CPUs']))
+        print HOST_INFO_FORMAT % ('VMs', len(hostinfo['resident_VMs']))
+        print HOST_INFO_FORMAT % ('UUID', host)        
+
+def xapi_vm_list(*args):
+    server, session = _connect()
+    vm_uuids = execute(server.VM.get_all, session)
+    print VM_LIST_FORMAT % {'name_label':'Name',
+                            'memory_actual':'Mem',
+                            'vcpus_number': 'VCPUs',
+                            'power_state': 'State',
+                            'uuid': 'UUID'}
+    for uuid in vm_uuids:
+        vm_info = execute(server.VM.get_record, session, uuid)
+        print VM_LIST_FORMAT % _stringify(vm_info)
+
+def xapi_vm_create(*args):
+    if len(args) < 1:
+        raise OptionError("Configuration file not specified")
+
+    filename = args[0]
+    cfg = _read_python_cfg(filename)
+
+    print 'Creating VM from %s ..' % filename
+    server, session = _connect()
+    uuid = execute(server.VM.create, session, cfg)
+    print 'Done.'
+    print uuid
+
+def xapi_vm_delete(*args):
+    if len(args) < 1:
+        raise OptionError("No domain name specified.")
+    
+    server, session = _connect()
+    vm_uuid = execute(server.VM.get_by_label, session, args[0])
+    print 'Destroying VM %s (%s)' % (args[0], vm_uuid)
+    success = execute(server.VM.destroy, session, vm_uuid)
+    print 'Done.'
+    
+
+def xapi_vm_start(*args):
+    if len(args) < 1:
+        raise OptionError("No Domain name specified.")
+    
+    server, session = _connect()
+    vm_uuid = execute(server.VM.get_by_label, session, args[0])
+    print 'Starting VM %s (%s)' % (args[0], vm_uuid)
+    success = execute(server.VM.start, session, vm_uuid)
+    print 'Done.'
+
+def xapi_vm_shutdown(*args):
+    if len(args) < 1:
+        raise OptionError("No Domain name specified.")
+
+    server, session = _connect()
+    vm_uuid = execute(server.VM.get_by_label, session, args[0])
+    print 'Shutting down VM %s (%s)' % (args[0], vm_uuid)
+    success = execute(server.VM.clean_shutdown, session, vm_uuid)
+    print 'Done.'
+
+def xapi_vbd_create(*args):
+    if len(args) < 2:
+        raise OptionError("Configuration file not specified")
+
+    domname = args[0]
+    filename = args[1]
+    cfg = _read_python_cfg(filename)
+    print 'Creating VBD from %s ..' % filename
+    server, session = _connect()
+    vm_uuid = execute(server.VM.get_by_label, session, domname)
+    cfg['VM'] = vm_uuid
+    vbd_uuid = execute(server.VBD.create, session, cfg)
+    print 'Done.'
+    print vbd_uuid
+
+def xapi_vif_create(*args):
+    if len(args) < 2:
+        raise OptionError("Configuration file not specified")
+
+    domname = args[0]
+    filename = args[1]
+    cfg = _read_python_cfg(filename)
+    print 'Creating VIF from %s ..' % filename
+    server, session = _connect()
+    vm_uuid = execute(server.VM.get_by_label, session, domname)
+    cfg['VM'] = vm_uuid
+    vif_uuid = execute(server.VIF.create, session, cfg)
+    print 'Done.'
+    print vif_uuid        
+
+#
+# Command Line Utils
+#
+
+def usage(command = None):
+    print 'Usage: xapi <subcommand> [options] [args]'
+    print
+    print 'Subcommands:'
+    print
+    sorted_commands = sorted(COMMANDS.keys())
+    for command  in sorted_commands:
+        args, description = COMMANDS[command]
+        print '%-16s  %-40s' % (command, description)
+    print
+
+def main(args):
+
+    if len(args) < 1 or args[0] in ('-h', '--help', 'help'):
+        usage()
+        sys.exit(1)
+
+    subcmd = args[0]
+
+    subcmd_func_name = 'xapi_' + subcmd.replace('-', '_')
+    subcmd_func = globals().get(subcmd_func_name, None)
+    if subcmd_func and callable(subcmd_func):
+        subcmd_func(*args[1:])
+    else:
+        print 'Error: Unable to find subcommand \'%s\'' % subcmd
+        usage()
+    
+if __name__ == "__main__":
+    import sys
+    main(sys.argv[1:])
diff -r c383cb0945a7 -r d147be77861d tools/python/scripts/xapi.vbdcfg.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/scripts/xapi.vbdcfg.py       Fri Oct 06 11:48:21 2006 +0100
@@ -0,0 +1,12 @@
+#
+# Virtual Block Device (VBD) Xen API Configuration
+# 
+# Note: There is a non-API field here called "image" which is a backwards
+#       compat addition so you can mount to old images.
+# 
+
+VDI =  ''
+device = 'sda1'
+mode = 'RW'
+driver = 'paravirtualised'
+image = 'file:/root/gentoo-64-xenU.img'
diff -r c383cb0945a7 -r d147be77861d tools/python/scripts/xapi.vifcfg.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/scripts/xapi.vifcfg.py       Fri Oct 06 11:48:21 2006 +0100
@@ -0,0 +1,10 @@
+#
+# Virtual Network Interface Configuration for the Xen API
+#
+
+name = ''
+type = 'paravirtualised'
+#device = 'eth0' # this is the dom0 device, not domU!
+network = '' # ignored
+MAC = ''
+MTU = '1500'

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