#
#
-# Copyright (C) 2010, 2011, 2012 Google Inc.
+# Copyright (C) 2010, 2011, 2012, 2013 Google Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# W0401: Wildcard import ganeti.cli
# W0614: Unused import %s from wildcard import (since we need cli)
+from cStringIO import StringIO
+
from ganeti.cli import *
from ganeti import constants
-from ganeti import objects
from ganeti import opcodes
from ganeti import utils
+from ganeti import compat
#: default list of fields for L{ListGroups}
_LIST_DEF_FIELDS = ["name", "node_cnt", "pinst_cnt", "alloc_policy", "ndparams"]
-
-_ENV_OVERRIDE = frozenset(["list"])
+_ENV_OVERRIDE = compat.UniqueFrozenset(["list"])
def AddGroup(opts, args):
@return: the desired exit code
"""
- ipolicy = \
- objects.CreateIPolicyFromOpts(ispecs_mem_size=opts.ispecs_mem_size,
- ispecs_cpu_count=opts.ispecs_cpu_count,
- ispecs_disk_count=opts.ispecs_disk_count,
- ispecs_disk_size=opts.ispecs_disk_size,
- ispecs_nic_count=opts.ispecs_nic_count,
- group_ipolicy=True)
+ ipolicy = CreateIPolicyFromOpts(
+ minmax_ispecs=opts.ipolicy_bounds_specs,
+ ipolicy_vcpu_ratio=opts.ipolicy_vcpu_ratio,
+ ipolicy_spindle_ratio=opts.ipolicy_spindle_ratio,
+ group_ipolicy=True)
(group_name,) = args
diskparams = dict(opts.diskparams)
"ndparams": (_FmtDict, False),
}
+ cl = GetClient(query=True)
+
return GenericList(constants.QR_GROUP, desired_fields, args, None,
opts.separator, not opts.no_headers,
format_override=fmtoverride, verbose=opts.verbose,
- force_filter=opts.force_filter)
+ force_filter=opts.force_filter, cl=cl)
def ListGroupFields(opts, args):
@return: the desired exit code
"""
+ cl = GetClient(query=True)
+
return GenericListFields(constants.QR_GROUP, args, opts.separator,
- not opts.no_headers)
+ not opts.no_headers, cl=cl)
def SetGroupParams(opts, args):
"""
allmods = [opts.ndparams, opts.alloc_policy, opts.diskparams, opts.hv_state,
- opts.disk_state, opts.ispecs_mem_size, opts.ispecs_cpu_count,
- opts.ispecs_disk_count, opts.ispecs_disk_size,
- opts.ispecs_nic_count, opts.diskparams]
+ opts.disk_state, opts.ipolicy_bounds_specs,
+ opts.ipolicy_vcpu_ratio, opts.ipolicy_spindle_ratio,
+ opts.diskparams]
if allmods.count(None) == len(allmods):
ToStderr("Please give at least one of the parameters.")
return 1
diskparams = dict(opts.diskparams)
- # set the default values
- to_ipolicy = [
- opts.ispecs_mem_size,
- opts.ispecs_cpu_count,
- opts.ispecs_disk_count,
- opts.ispecs_disk_size,
- opts.ispecs_nic_count,
- ]
- for ispec in to_ipolicy:
- for param in ispec:
- if isinstance(ispec[param], basestring):
- if ispec[param].lower() == "default":
- ispec[param] = constants.VALUE_DEFAULT
# create ipolicy object
- ipolicy = objects.CreateIPolicyFromOpts(\
- ispecs_mem_size=opts.ispecs_mem_size,
- ispecs_cpu_count=opts.ispecs_cpu_count,
- ispecs_disk_count=opts.ispecs_disk_count,
- ispecs_disk_size=opts.ispecs_disk_size,
- ispecs_nic_count=opts.ispecs_nic_count,
+ ipolicy = CreateIPolicyFromOpts(
+ minmax_ispecs=opts.ipolicy_bounds_specs,
ipolicy_disk_templates=opts.ipolicy_disk_templates,
+ ipolicy_vcpu_ratio=opts.ipolicy_vcpu_ratio,
+ ipolicy_spindle_ratio=opts.ipolicy_spindle_ratio,
group_ipolicy=True,
allowed_values=[constants.VALUE_DEFAULT])
return rcode
+
+def _FormatGroupInfo(group):
+ (name, ndparams, custom_ndparams, diskparams, custom_diskparams,
+ ipolicy, custom_ipolicy) = group
+ return [
+ ("Node group", name),
+ ("Node parameters", FormatParamsDictInfo(custom_ndparams, ndparams)),
+ ("Disk parameters", FormatParamsDictInfo(custom_diskparams, diskparams)),
+ ("Instance policy", FormatPolicyInfo(custom_ipolicy, ipolicy, False)),
+ ]
+
+
+def GroupInfo(_, args):
+ """Shows info about node group.
+
+ """
+ cl = GetClient(query=True)
+ selected_fields = ["name",
+ "ndparams", "custom_ndparams",
+ "diskparams", "custom_diskparams",
+ "ipolicy", "custom_ipolicy"]
+ result = cl.QueryGroups(names=args, fields=selected_fields,
+ use_locking=False)
+
+ PrintGenericInfo([
+ _FormatGroupInfo(group) for group in result
+ ])
+
+
+def _GetCreateCommand(group):
+ (name, ipolicy) = group
+ buf = StringIO()
+ buf.write("gnt-group add")
+ PrintIPolicyCommand(buf, ipolicy, True)
+ buf.write(" ")
+ buf.write(name)
+ return buf.getvalue()
+
+
+def ShowCreateCommand(opts, args):
+ """Shows the command that can be used to re-create a node group.
+
+ Currently it works only for ipolicy specs.
+
+ """
+ cl = GetClient(query=True)
+ selected_fields = ["name"]
+ if opts.include_defaults:
+ selected_fields += ["ipolicy"]
+ else:
+ selected_fields += ["custom_ipolicy"]
+ result = cl.QueryGroups(names=args, fields=selected_fields,
+ use_locking=False)
+
+ for group in result:
+ ToStdout(_GetCreateCommand(group))
+
+
commands = {
"add": (
AddGroup, ARGS_ONE_GROUP,
RemoveTags, [ArgGroup(min=1, max=1), ArgUnknown()],
[TAG_SRC_OPT, PRIORITY_OPT, SUBMIT_OPT],
"<group_name> tag...", "Remove tags from the given group"),
+ "info": (
+ GroupInfo, ARGS_MANY_GROUPS, [], "[<group_name>...]",
+ "Show group information"),
+ "show-ispecs-cmd": (
+ ShowCreateCommand, ARGS_MANY_GROUPS, [INCLUDEDEFAULTS_OPT],
+ "[--include-defaults] [<group_name>...]",
+ "Show the command line to re-create a group"),
}