WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

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

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [XENAPI] Example tools to create/destroy/shutdown VMs
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 02 Nov 2006 22:08:42 +0000
Delivery-date: Thu, 02 Nov 2006 21:41:50 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [XENAPI] Example tools to create/destroy/shutdown VMs, Xen patchbot-unstable <=