# HG changeset patch # User Juergen Gross # Date 1287651985 -7200 # Node ID efde94758aed20eb84201c0b512462701b13ae4e # Parent cf8b16d5108ce9b0644e835cf017dcb8a8e38f56 Rename cpu-pool commands in xm to cpupool-* The xm commands pool-* are renamed to cpupool-* The old pool-* commands are defined as aliases. Signed-off-by: juergen.gross@xxxxxxxxxxxxxx diff -r cf8b16d5108c -r efde94758aed tools/python/xen/xm/cpupool-create.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/python/xen/xm/cpupool-create.py Thu Oct 21 11:06:25 2010 +0200 @@ -0,0 +1,51 @@ +#============================================================================ +# 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) 2009 Fujitsu Technology Solutions +#============================================================================ + +""" Create a new unmanaged cpupool. +""" + +import sys +from xen.xm.main import serverType, SERVER_XEN_API, server +from xen.xm.cpupool import parseCommandLine, err, help as help_options +from xen.util.sxputils import sxp2map + +def help(): + return help_options() + + +def main(argv): + try: + (opts, config) = parseCommandLine(argv) + except StandardError, ex: + err(str(ex)) + + if not opts: + return + + if serverType == SERVER_XEN_API: + record = sxp2map(config) + if type(record.get('proposed_CPUs', [])) != list: + record['proposed_CPUs'] = [record['proposed_CPUs']] + ref = server.xenapi.cpu_pool.create(record) + if ref: + server.xenapi.cpu_pool.activate(ref) + else: + server.xend.cpu_pool.create(config) + +if __name__ == '__main__': + main(sys.argv) + diff -r cf8b16d5108c -r efde94758aed tools/python/xen/xm/cpupool-new.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/python/xen/xm/cpupool-new.py Thu Oct 21 11:06:25 2010 +0200 @@ -0,0 +1,50 @@ +#============================================================================ +# 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) 2009 Fujitsu Technology Solutions +#============================================================================ + +""" Create a new managed cpupool. +""" + +import sys +from xen.xm.main import serverType, SERVER_XEN_API, server +from xen.xm.cpupool import parseCommandLine, err, help as help_options +from xen.util.sxputils import sxp2map + + +def help(): + return help_options() + + +def main(argv): + try: + (opts, config) = parseCommandLine(argv) + except StandardError, ex: + err(str(ex)) + + if not opts: + return + + if serverType == SERVER_XEN_API: + record = sxp2map(config) + if type(record.get('proposed_CPUs', [])) != list: + record['proposed_CPUs'] = [record['proposed_CPUs']] + server.xenapi.cpu_pool.create(record) + else: + server.xend.cpu_pool.new(config) + +if __name__ == '__main__': + main(sys.argv) + diff -r cf8b16d5108c -r efde94758aed tools/python/xen/xm/cpupool.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/python/xen/xm/cpupool.py Thu Oct 21 11:06:25 2010 +0200 @@ -0,0 +1,236 @@ +#============================================================================ +# 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) 2009 Fujitsu Technology Solutions +#============================================================================ + +""" Common function of cmds cpupool-new / cpupool-create. +""" + +import sys +import types +import os + +from xen.xend import PrettyPrint +from xen.xend import sxp + +from xen.xm.opts import Opts, set_value, set_true, append_value, OptionError + +GOPTS = Opts(use="""[options] [vars] + +Create a cpupool. + +Pool creation parameters can be set by command-line switches, from +a python configuration script or an SXP config file. See documentation +for --defconfig, --config. Configuration variables can be set using +VAR=VAL on the command line. For example name=Pool-1 sets name to Pool-1. + +""") + +GOPTS.opt('help', short='h', + fn=set_true, default=0, + use="Print this help.") + +GOPTS.opt('help_config', + fn=set_true, default=0, + use="Print the available configuration variables (vars) for the " + "configuration script.") + +GOPTS.opt('path', val='PATH', + fn=set_value, default='.:/etc/xen/cpupool', + use="Search path for configuration scripts. " + "The value of PATH is a colon-separated directory list.") + +GOPTS.opt('defconfig', short='f', val='FILE', + fn=set_value, default='xmdefconfig', + use="Use the given Python configuration script." + "The configuration script is loaded after arguments have been " + "processed. Each command-line option sets a configuration " + "variable named after its long option name, and these " + "variables are placed in the environment of the script before " + "it is loaded. Variables for options that may be repeated have " + "list values. Other variables can be set using VAR=VAL on the " + "command line. " + "After the script is loaded, option values that were not set " + "on the command line are replaced by the values set in the script.") + +GOPTS.default('defconfig') + +GOPTS.opt('config', short='F', val='FILE', + fn=set_value, default=None, + use="CPU pool configuration to use (SXP).\n" + "SXP is the underlying configuration format used by Xen.\n" + "SXP configurations can be hand-written or generated from Python " + "configuration scripts, using the -n (dryrun) option to print " + "the configuration.") + +GOPTS.opt('dryrun', short='n', + fn=set_true, default=0, + use="Dry run - prints the resulting configuration in SXP but " + "does not create the CPU pool.") + +GOPTS.var('name', val='NAME', fn=set_value, default=None, + use="CPU pool name.") + +GOPTS.var('sched', val='SCHED', fn=set_value, default='credit', + use="Scheduler to use for the CPU pool.") + +GOPTS.var('cpus', val='CPUS', fn=set_value, default=1, + use="CPUS to assign to the CPU pool.") + +GOPTS.var('other_config', val='OTHER_CONFIG', fn=append_value, default=[], + use="Additional info for CPU pool") + + +def sxp2map(sxp_val): + record = {} + for x in sxp_val: + if isinstance(x, (types.ListType, types.TupleType)) \ + and len(x) > 1: + if isinstance(x[1], (types.ListType, types.TupleType)): + record[x[0]] = sxp2map(x[1]) + else: + record[x[0]] = x[1] + return record + +def err(msg): + print >> sys.stderr, "Error: %s" % msg + sys.exit(-1) + +def make_cpus_config(cfg_cpus): + """ Taken from XendConfig. """ + # Convert 'cpus' to list of list of ints + + cpus_list = [] + # Convert the following string to list of ints. + # The string supports a list of ranges (0-3), + # seperated by commas, and negation (^1). + # Precedence is settled by order of the string: + # "0-3,^1" -> [0,2,3] + # "0-3,^1,1" -> [0,1,2,3] + def cnv(s): + l = [] + for c in s.split(','): + if c.find('-') != -1: + (x, y) = c.split('-') + for i in range(int(x), int(y)+1): + l.append(int(i)) + else: + # remove this element from the list + if len(c) > 0: + if c[0] == '^': + l = [x for x in l if x != int(c[1:])] + else: + l.append(int(c)) + return l + + if type(cfg_cpus) == list: + if len(cfg_cpus) > 0 and type(cfg_cpus[0]) == list: + # If sxp_cfg was created from config.sxp, + # the form of 'cpus' is list of list of string. + # Convert 'cpus' to list of list of ints. + # Conversion examples: + # [['1']] -> [[1]] + # [['0','2'],['1','3']] -> [[0,2],[1,3]] + try: + for c1 in cfg_cpus: + cpus = [] + for c2 in c1: + cpus.append(int(c2)) + cpus_list.append(cpus) + except ValueError, e: + raise err('cpus = %s: %s' % (cfg_cpus, e)) + else: + # Conversion examples: + # ["1"] -> [[1]] + # ["0,2","1,3"] -> [[0,2],[1,3]] + # ["0-3,^1","1-4,^2"] -> [[0,2,3],[1,3,4]] + try: + for c in cfg_cpus: + cpus = cnv(c) + cpus_list.append(cpus) + except ValueError, e: + raise err('cpus = %s: %s' % (cfg_cpus, e)) + else: + # Conversion examples: + # cpus=1: + # "1" -> [[1]] + # "0-3,^1" -> [[0,2,3]] + # cpus=2: + # "1" -> [[1],[1]] + # "0-3,^1" -> [[0,2,3],[0,2,3]] + try: + cpus_list = cnv(cfg_cpus) + except ValueError, e: + err('cpus = %s: %s' % (cfg_cpus, e)) + return cpus_list + +def make_config(vals): + config = ['pool'] + config += [['name_label', vals.name]] + config += [['sched_policy', vals.sched]] + if type(vals.cpus) == int: + config += [['ncpu', vals.cpus], ['proposed_CPUs' , []]] + elif type(vals.cpus) == str and len(vals.cpus) > 1 and vals.cpus[0] == '#': + try: + config += [['ncpu', int(vals.cpus[1:])], ['proposed_CPUs' , []]] + except ValueError, ex: + err('Wrong illegal of parameter "cpus"') + else: + prop_cpus = make_cpus_config(vals.cpus) + config += [['ncpu', len(prop_cpus)], + ['proposed_CPUs'] + prop_cpus] + other_config = [] + for entry in vals.other_config: + if '=' in entry: + (var, val) = entry.strip().split('=', 1) + other_config.append([var, val]) + config += [['other_config'] + other_config] + return config + +def parseCommandLine(argv): + GOPTS.reset() + args = GOPTS.parse(argv) + + if GOPTS.vals.help or GOPTS.vals.help_config: + if GOPTS.vals.help_config: + print GOPTS.val_usage() + return (None, None) + + # Process remaining args as config variables. + for arg in args: + if '=' in arg: + (var, val) = arg.strip().split('=', 1) + GOPTS.setvar(var.strip(), val.strip()) + if GOPTS.vals.config: + try: + config = sxp.parse(file(GOPTS.vals.config))[0] + except IOError, ex: + raise OptionError("Cannot read file %s: %s" % (config, ex[1])) + else: + GOPTS.load_defconfig() + if not GOPTS.getopt('name') and GOPTS.getopt('defconfig'): + GOPTS.setopt('name', os.path.basename( + GOPTS.getopt('defconfig'))) + config = make_config(GOPTS.vals) + + if GOPTS.vals.dryrun: + PrettyPrint.prettyprint(config) + return (None, None) + + return (GOPTS, config) + +def help(): + return str(GOPTS) + diff -r cf8b16d5108c -r efde94758aed tools/python/xen/xm/main.py --- a/tools/python/xen/xm/main.py Thu Oct 21 09:47:13 2010 +0200 +++ b/tools/python/xen/xm/main.py Thu Oct 21 11:06:25 2010 +0200 @@ -242,20 +242,20 @@ 'tmem-shared-auth' : ('[|-a|--all] [--uuid=] [--auth=<0|1>]', 'De/authenticate shared tmem pool.'), # - # pool commands + # cpupool commands # - 'pool-create' : (' [vars]', + 'cpupool-create' : (' [vars]', 'Create a CPU pool based an ConfigFile.'), - 'pool-new' : (' [vars]', + 'cpupool-new' : (' [vars]', 'Adds a CPU pool to Xend CPU pool management'), - 'pool-start' : ('', 'Starts a Xend CPU pool'), - 'pool-list' : ('[] [-l|--long] [-c|--cpus]', 'List CPU pools on host'), - 'pool-destroy' : ('', 'Deactivates a CPU pool'), - 'pool-delete' : ('', + 'cpupool-start' : ('', 'Starts a Xend CPU pool'), + 'cpupool-list' : ('[] [-l|--long] [-c|--cpus]', 'List CPU pools on host'), + 'cpupool-destroy' : ('', 'Deactivates a CPU pool'), + 'cpupool-delete' : ('', 'Removes a CPU pool from Xend management'), - 'pool-cpu-add' : (' ', 'Adds a CPU to a CPU pool'), - 'pool-cpu-remove': (' ', 'Removes a CPU from a CPU pool'), - 'pool-migrate' : (' ', + 'cpupool-cpu-add' : (' ', 'Adds a CPU to a CPU pool'), + 'cpupool-cpu-remove': (' ', 'Removes a CPU from a CPU pool'), + 'cpupool-migrate' : (' ', 'Moves a domain into a CPU pool'), # security @@ -370,7 +370,7 @@ ('-u', '--uuid', 'Specify uuid (abcdef01-2345-6789-01234567890abcdef).'), ('-A', '--auth', '0=auth,1=deauth'), ), - 'pool-list': ( + 'cpupool-list': ( ('-l', '--long', 'Output all CPU pool details in SXP format'), ('-c', '--cpus', 'Output list of CPUs used by a pool'), ), @@ -521,21 +521,21 @@ "tmem-shared-auth", ] -pool_commands = [ - "pool-create", - "pool-new", - "pool-start", - "pool-list", - "pool-destroy", - "pool-delete", - "pool-cpu-add", - "pool-cpu-remove", - "pool-migrate", +cpupool_commands = [ + "cpupool-create", + "cpupool-new", + "cpupool-start", + "cpupool-list", + "cpupool-destroy", + "cpupool-delete", + "cpupool-cpu-add", + "cpupool-cpu-remove", + "cpupool-migrate", ] all_commands = (domain_commands + host_commands + scheduler_commands + device_commands + vnet_commands + security_commands + - acm_commands + flask_commands + tmem_commands + pool_commands + + acm_commands + flask_commands + tmem_commands + cpupool_commands + ['shell', 'event-monitor']) @@ -3625,7 +3625,7 @@ else: return server.xend.node.tmem_shared_auth(domid,uuid_str,auth) -def get_pool_ref(name): +def get_cpupool_ref(name): refs = server.xenapi.cpu_pool.get_by_name_label(name) if len(refs) > 0: return refs[0] @@ -3633,15 +3633,15 @@ err('unknown pool name') sys.exit(1) -def xm_pool_start(args): - arg_check(args, "pool-start", 1) - if serverType == SERVER_XEN_API: - ref = get_pool_ref(args[0]) +def xm_cpupool_start(args): + arg_check(args, "cpupool-start", 1) + if serverType == SERVER_XEN_API: + ref = get_cpupool_ref(args[0]) server.xenapi.cpu_pool.activate(ref) else: server.xend.cpu_pool.start(args[0]) -def brief_pool_list(sxprs): +def brief_cpupool_list(sxprs): format_str = "%-16s %3s %8s %s %s" for sxpr in sxprs: if sxpr == sxprs[0]: @@ -3665,7 +3665,7 @@ active = 'n' print format_str % (name, cpu_count, sched_policy, active, vm_count) -def brief_pool_list_cpus(sxprs): +def brief_cpupool_list_cpus(sxprs): format_str = "%-16s %s" for sxpr in sxprs: if sxpr == sxprs[0]: @@ -3685,16 +3685,16 @@ cpus = "-" print format_str % (name, cpus) -def xm_pool_list(args): - arg_check(args, "pool-list", 0, 2) +def xm_cpupool_list(args): + arg_check(args, "cpupool-list", 0, 2) try: (options, params) = getopt.gnu_getopt(args, 'lc', ['long','cpus']) except getopt.GetoptError, opterr: err(opterr) - usage('pool-list') + usage('cpupool-list') if len(params) > 1: - err("Only one pool name for selection allowed") - usage('pool-list') + err("Only one cpupool name for selection allowed") + usage('cpupool-list') use_long = False show_cpus = False @@ -3730,30 +3730,30 @@ for sxpr in sxprs: PrettyPrint.prettyprint(sxpr) elif show_cpus: - brief_pool_list_cpus(sxprs) - else: - brief_pool_list(sxprs) - -def xm_pool_destroy(args): - arg_check(args, "pool-destroy", 1) - if serverType == SERVER_XEN_API: - ref = get_pool_ref(args[0]) + brief_cpupool_list_cpus(sxprs) + else: + brief_cpupool_list(sxprs) + +def xm_cpupool_destroy(args): + arg_check(args, "cpupool-destroy", 1) + if serverType == SERVER_XEN_API: + ref = get_cpupool_ref(args[0]) server.xenapi.cpu_pool.deactivate(ref) else: server.xend.cpu_pool.destroy(args[0]) -def xm_pool_delete(args): - arg_check(args, "pool-delete", 1) - if serverType == SERVER_XEN_API: - ref = get_pool_ref(args[0]) +def xm_cpupool_delete(args): + arg_check(args, "cpupool-delete", 1) + if serverType == SERVER_XEN_API: + ref = get_cpupool_ref(args[0]) server.xenapi.cpu_pool.destroy(ref) else: server.xend.cpu_pool.delete(args[0]) -def xm_pool_cpu_add(args): - arg_check(args, "pool-cpu-add", 2) - if serverType == SERVER_XEN_API: - ref = get_pool_ref(args[0]) +def xm_cpupool_cpu_add(args): + arg_check(args, "cpupool-cpu-add", 2) + if serverType == SERVER_XEN_API: + ref = get_cpupool_ref(args[0]) cpu_ref_list = server.xenapi.host_cpu.get_all_records() cpu_ref = [ c_rec['uuid'] for c_rec in cpu_ref_list.values() if c_rec['number'] == args[1] ] @@ -3764,10 +3764,10 @@ else: server.xend.cpu_pool.cpu_add(args[0], args[1]) -def xm_pool_cpu_remove(args): - arg_check(args, "pool-cpu-remove", 2) - if serverType == SERVER_XEN_API: - ref = get_pool_ref(args[0]) +def xm_cpupool_cpu_remove(args): + arg_check(args, "cpupool-cpu-remove", 2) + if serverType == SERVER_XEN_API: + ref = get_cpupool_ref(args[0]) cpu_ref_list = server.xenapi.host_cpu.get_all_records() cpu_ref = [ c_rec['uuid'] for c_rec in cpu_ref_list.values() if c_rec['number'] == args[1] ] @@ -3778,12 +3778,12 @@ else: server.xend.cpu_pool.cpu_remove(args[0], args[1]) -def xm_pool_migrate(args): - arg_check(args, "pool-migrate", 2) +def xm_cpupool_migrate(args): + arg_check(args, "cpupool-migrate", 2) domname = args[0] poolname = args[1] if serverType == SERVER_XEN_API: - pool_ref = get_pool_ref(poolname) + pool_ref = get_cpupool_ref(poolname) server.xenapi.VM.cpu_pool_migrate(get_single_vm(domname), pool_ref) else: server.xend.cpu_pool.migrate(domname, poolname) @@ -3874,14 +3874,14 @@ "usb-list-assignable-devices": xm_usb_list_assignable_devices, "usb-hc-create": xm_usb_hc_create, "usb-hc-destroy": xm_usb_hc_destroy, - # pool - "pool-start": xm_pool_start, - "pool-list": xm_pool_list, - "pool-destroy": xm_pool_destroy, - "pool-delete": xm_pool_delete, - "pool-cpu-add": xm_pool_cpu_add, - "pool-cpu-remove": xm_pool_cpu_remove, - "pool-migrate": xm_pool_migrate, + # cpupool + "cpupool-start": xm_cpupool_start, + "cpupool-list": xm_cpupool_list, + "cpupool-destroy": xm_cpupool_destroy, + "cpupool-delete": xm_cpupool_delete, + "cpupool-cpu-add": xm_cpupool_cpu_add, + "cpupool-cpu-remove": xm_cpupool_cpu_remove, + "cpupool-migrate": xm_cpupool_migrate, # tmem "tmem-thaw": xm_tmem_thaw, "tmem-freeze": xm_tmem_freeze, @@ -3915,8 +3915,8 @@ 'resetpolicy', 'getenforce', 'setenforce', - 'pool-create', - 'pool-new', + 'cpupool-create', + 'cpupool-new', ] for c in IMPORTED_COMMANDS: @@ -3924,6 +3924,15 @@ aliases = { "balloon": "mem-set", + "pool-create": "cpupool-create", + "pool-new": "cpupool-new", + "pool-start": "cpupool-start", + "pool-list": "cpupool-list", + "pool-destroy": "cpupool-destroy", + "pool-delete": "cpupool-delete", + "pool-cpu-add": "cpupool-cpu-add", + "pool-cpu-remove": "cpupool-cpu-remove", + "pool-migrate": "cpupool-migrate", "set-vcpus": "vcpu-set", "vif-list": "network-list", "vbd-create": "block-attach", diff -r cf8b16d5108c -r efde94758aed tools/python/xen/xm/pool-create.py --- a/tools/python/xen/xm/pool-create.py Thu Oct 21 09:47:13 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -#============================================================================ -# 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) 2009 Fujitsu Technology Solutions -#============================================================================ - -""" Create a new unmanaged pool. -""" - -import sys -from xen.xm.main import serverType, SERVER_XEN_API, server -from xen.xm.pool import parseCommandLine, err, help as help_options -from xen.util.sxputils import sxp2map - -def help(): - return help_options() - - -def main(argv): - try: - (opts, config) = parseCommandLine(argv) - except StandardError, ex: - err(str(ex)) - - if not opts: - return - - if serverType == SERVER_XEN_API: - record = sxp2map(config) - if type(record.get('proposed_CPUs', [])) != list: - record['proposed_CPUs'] = [record['proposed_CPUs']] - ref = server.xenapi.cpu_pool.create(record) - if ref: - server.xenapi.cpu_pool.activate(ref) - else: - server.xend.cpu_pool.create(config) - -if __name__ == '__main__': - main(sys.argv) - diff -r cf8b16d5108c -r efde94758aed tools/python/xen/xm/pool-new.py --- a/tools/python/xen/xm/pool-new.py Thu Oct 21 09:47:13 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -#============================================================================ -# 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) 2009 Fujitsu Technology Solutions -#============================================================================ - -""" Create a new managed pool. -""" - -import sys -from xen.xm.main import serverType, SERVER_XEN_API, server -from xen.xm.pool import parseCommandLine, err, help as help_options -from xen.util.sxputils import sxp2map - - -def help(): - return help_options() - - -def main(argv): - try: - (opts, config) = parseCommandLine(argv) - except StandardError, ex: - err(str(ex)) - - if not opts: - return - - if serverType == SERVER_XEN_API: - record = sxp2map(config) - if type(record.get('proposed_CPUs', [])) != list: - record['proposed_CPUs'] = [record['proposed_CPUs']] - server.xenapi.cpu_pool.create(record) - else: - server.xend.cpu_pool.new(config) - -if __name__ == '__main__': - main(sys.argv) - diff -r cf8b16d5108c -r efde94758aed tools/python/xen/xm/pool.py --- a/tools/python/xen/xm/pool.py Thu Oct 21 09:47:13 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,236 +0,0 @@ -#============================================================================ -# 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) 2009 Fujitsu Technology Solutions -#============================================================================ - -""" Common function of cmds pool-new / pool-create. -""" - -import sys -import types -import os - -from xen.xend import PrettyPrint -from xen.xend import sxp - -from xen.xm.opts import Opts, set_value, set_true, append_value, OptionError - -GOPTS = Opts(use="""[options] [vars] - -Create a pool. - -Pool creation parameters can be set by command-line switches, from -a python configuration script or an SXP config file. See documentation -for --defconfig, --config. Configuration variables can be set using -VAR=VAL on the command line. For example name=Pool-1 sets name to Pool-1. - -""") - -GOPTS.opt('help', short='h', - fn=set_true, default=0, - use="Print this help.") - -GOPTS.opt('help_config', - fn=set_true, default=0, - use="Print the available configuration variables (vars) for the " - "configuration script.") - -GOPTS.opt('path', val='PATH', - fn=set_value, default='.:/etc/xen/pool', - use="Search path for configuration scripts. " - "The value of PATH is a colon-separated directory list.") - -GOPTS.opt('defconfig', short='f', val='FILE', - fn=set_value, default='xmdefconfig', - use="Use the given Python configuration script." - "The configuration script is loaded after arguments have been " - "processed. Each command-line option sets a configuration " - "variable named after its long option name, and these " - "variables are placed in the environment of the script before " - "it is loaded. Variables for options that may be repeated have " - "list values. Other variables can be set using VAR=VAL on the " - "command line. " - "After the script is loaded, option values that were not set " - "on the command line are replaced by the values set in the script.") - -GOPTS.default('defconfig') - -GOPTS.opt('config', short='F', val='FILE', - fn=set_value, default=None, - use="CPU pool configuration to use (SXP).\n" - "SXP is the underlying configuration format used by Xen.\n" - "SXP configurations can be hand-written or generated from Python " - "configuration scripts, using the -n (dryrun) option to print " - "the configuration.") - -GOPTS.opt('dryrun', short='n', - fn=set_true, default=0, - use="Dry run - prints the resulting configuration in SXP but " - "does not create the CPU pool.") - -GOPTS.var('name', val='NAME', fn=set_value, default=None, - use="CPU pool name.") - -GOPTS.var('sched', val='SCHED', fn=set_value, default='credit', - use="Scheduler to use for the CPU pool.") - -GOPTS.var('cpus', val='CPUS', fn=set_value, default=1, - use="CPUS to assign to the CPU pool.") - -GOPTS.var('other_config', val='OTHER_CONFIG', fn=append_value, default=[], - use="Additional info for CPU pool") - - -def sxp2map(sxp_val): - record = {} - for x in sxp_val: - if isinstance(x, (types.ListType, types.TupleType)) \ - and len(x) > 1: - if isinstance(x[1], (types.ListType, types.TupleType)): - record[x[0]] = sxp2map(x[1]) - else: - record[x[0]] = x[1] - return record - -def err(msg): - print >> sys.stderr, "Error: %s" % msg - sys.exit(-1) - -def make_cpus_config(cfg_cpus): - """ Taken from XendConfig. """ - # Convert 'cpus' to list of list of ints - - cpus_list = [] - # Convert the following string to list of ints. - # The string supports a list of ranges (0-3), - # seperated by commas, and negation (^1). - # Precedence is settled by order of the string: - # "0-3,^1" -> [0,2,3] - # "0-3,^1,1" -> [0,1,2,3] - def cnv(s): - l = [] - for c in s.split(','): - if c.find('-') != -1: - (x, y) = c.split('-') - for i in range(int(x), int(y)+1): - l.append(int(i)) - else: - # remove this element from the list - if len(c) > 0: - if c[0] == '^': - l = [x for x in l if x != int(c[1:])] - else: - l.append(int(c)) - return l - - if type(cfg_cpus) == list: - if len(cfg_cpus) > 0 and type(cfg_cpus[0]) == list: - # If sxp_cfg was created from config.sxp, - # the form of 'cpus' is list of list of string. - # Convert 'cpus' to list of list of ints. - # Conversion examples: - # [['1']] -> [[1]] - # [['0','2'],['1','3']] -> [[0,2],[1,3]] - try: - for c1 in cfg_cpus: - cpus = [] - for c2 in c1: - cpus.append(int(c2)) - cpus_list.append(cpus) - except ValueError, e: - raise err('cpus = %s: %s' % (cfg_cpus, e)) - else: - # Conversion examples: - # ["1"] -> [[1]] - # ["0,2","1,3"] -> [[0,2],[1,3]] - # ["0-3,^1","1-4,^2"] -> [[0,2,3],[1,3,4]] - try: - for c in cfg_cpus: - cpus = cnv(c) - cpus_list.append(cpus) - except ValueError, e: - raise err('cpus = %s: %s' % (cfg_cpus, e)) - else: - # Conversion examples: - # cpus=1: - # "1" -> [[1]] - # "0-3,^1" -> [[0,2,3]] - # cpus=2: - # "1" -> [[1],[1]] - # "0-3,^1" -> [[0,2,3],[0,2,3]] - try: - cpus_list = cnv(cfg_cpus) - except ValueError, e: - err('cpus = %s: %s' % (cfg_cpus, e)) - return cpus_list - -def make_config(vals): - config = ['pool'] - config += [['name_label', vals.name]] - config += [['sched_policy', vals.sched]] - if type(vals.cpus) == int: - config += [['ncpu', vals.cpus], ['proposed_CPUs' , []]] - elif type(vals.cpus) == str and len(vals.cpus) > 1 and vals.cpus[0] == '#': - try: - config += [['ncpu', int(vals.cpus[1:])], ['proposed_CPUs' , []]] - except ValueError, ex: - err('Wrong illegal of parameter "cpus"') - else: - prop_cpus = make_cpus_config(vals.cpus) - config += [['ncpu', len(prop_cpus)], - ['proposed_CPUs'] + prop_cpus] - other_config = [] - for entry in vals.other_config: - if '=' in entry: - (var, val) = entry.strip().split('=', 1) - other_config.append([var, val]) - config += [['other_config'] + other_config] - return config - -def parseCommandLine(argv): - GOPTS.reset() - args = GOPTS.parse(argv) - - if GOPTS.vals.help or GOPTS.vals.help_config: - if GOPTS.vals.help_config: - print GOPTS.val_usage() - return (None, None) - - # Process remaining args as config variables. - for arg in args: - if '=' in arg: - (var, val) = arg.strip().split('=', 1) - GOPTS.setvar(var.strip(), val.strip()) - if GOPTS.vals.config: - try: - config = sxp.parse(file(GOPTS.vals.config))[0] - except IOError, ex: - raise OptionError("Cannot read file %s: %s" % (config, ex[1])) - else: - GOPTS.load_defconfig() - if not GOPTS.getopt('name') and GOPTS.getopt('defconfig'): - GOPTS.setopt('name', os.path.basename( - GOPTS.getopt('defconfig'))) - config = make_config(GOPTS.vals) - - if GOPTS.vals.dryrun: - PrettyPrint.prettyprint(config) - return (None, None) - - return (GOPTS, config) - -def help(): - return str(GOPTS) -