Statistics
| Branch: | Tag: | Revision:

root / lib / client / gnt_group.py @ f7f03738

History | View | Annotate | Download (11.4 kB)

1 667dbd6b Adeodato Simo
#
2 667dbd6b Adeodato Simo
#
3 667dbd6b Adeodato Simo
4 801bccba Bernardo Dal Seno
# Copyright (C) 2010, 2011, 2012, 2013 Google Inc.
5 667dbd6b Adeodato Simo
#
6 667dbd6b Adeodato Simo
# This program is free software; you can redistribute it and/or modify
7 667dbd6b Adeodato Simo
# it under the terms of the GNU General Public License as published by
8 667dbd6b Adeodato Simo
# the Free Software Foundation; either version 2 of the License, or
9 667dbd6b Adeodato Simo
# (at your option) any later version.
10 667dbd6b Adeodato Simo
#
11 667dbd6b Adeodato Simo
# This program is distributed in the hope that it will be useful, but
12 667dbd6b Adeodato Simo
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 667dbd6b Adeodato Simo
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 667dbd6b Adeodato Simo
# General Public License for more details.
15 667dbd6b Adeodato Simo
#
16 667dbd6b Adeodato Simo
# You should have received a copy of the GNU General Public License
17 667dbd6b Adeodato Simo
# along with this program; if not, write to the Free Software
18 667dbd6b Adeodato Simo
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 667dbd6b Adeodato Simo
# 02110-1301, USA.
20 667dbd6b Adeodato Simo
21 667dbd6b Adeodato Simo
"""Node group related commands"""
22 667dbd6b Adeodato Simo
23 b459a848 Andrea Spadaccini
# pylint: disable=W0401,W0614
24 667dbd6b Adeodato Simo
# W0401: Wildcard import ganeti.cli
25 667dbd6b Adeodato Simo
# W0614: Unused import %s from wildcard import (since we need cli)
26 667dbd6b Adeodato Simo
27 667dbd6b Adeodato Simo
from ganeti.cli import *
28 ca4ac9c9 Adeodato Simo
from ganeti import constants
29 66e884e1 Adeodato Simo
from ganeti import opcodes
30 4edc512c Adeodato Simo
from ganeti import utils
31 b8028dcf Michael Hanselmann
from ganeti import compat
32 667dbd6b Adeodato Simo
33 667dbd6b Adeodato Simo
34 667dbd6b Adeodato Simo
#: default list of fields for L{ListGroups}
35 b288b6f3 René Nussbaumer
_LIST_DEF_FIELDS = ["name", "node_cnt", "pinst_cnt", "alloc_policy", "ndparams"]
36 667dbd6b Adeodato Simo
37 b8028dcf Michael Hanselmann
_ENV_OVERRIDE = compat.UniqueFrozenset(["list"])
38 ef9fa5b9 René Nussbaumer
39 ef9fa5b9 René Nussbaumer
40 66e884e1 Adeodato Simo
def AddGroup(opts, args):
41 66e884e1 Adeodato Simo
  """Add a node group to the cluster.
42 66e884e1 Adeodato Simo

43 66e884e1 Adeodato Simo
  @param opts: the command line options selected by the user
44 66e884e1 Adeodato Simo
  @type args: list
45 66e884e1 Adeodato Simo
  @param args: a list of length 1 with the name of the group to create
46 66e884e1 Adeodato Simo
  @rtype: int
47 66e884e1 Adeodato Simo
  @return: the desired exit code
48 66e884e1 Adeodato Simo

49 66e884e1 Adeodato Simo
  """
50 703fa9ab Iustin Pop
  ipolicy = CreateIPolicyFromOpts(
51 703fa9ab Iustin Pop
    ispecs_mem_size=opts.ispecs_mem_size,
52 703fa9ab Iustin Pop
    ispecs_cpu_count=opts.ispecs_cpu_count,
53 703fa9ab Iustin Pop
    ispecs_disk_count=opts.ispecs_disk_count,
54 703fa9ab Iustin Pop
    ispecs_disk_size=opts.ispecs_disk_size,
55 703fa9ab Iustin Pop
    ispecs_nic_count=opts.ispecs_nic_count,
56 eb70f6cf René Nussbaumer
    ipolicy_vcpu_ratio=opts.ipolicy_vcpu_ratio,
57 eb70f6cf René Nussbaumer
    ipolicy_spindle_ratio=opts.ipolicy_spindle_ratio,
58 703fa9ab Iustin Pop
    group_ipolicy=True)
59 1f5d9bf8 Agata Murawska
60 66e884e1 Adeodato Simo
  (group_name,) = args
61 bc5d0215 Andrea Spadaccini
  diskparams = dict(opts.diskparams)
62 e4c03256 René Nussbaumer
63 e4c03256 René Nussbaumer
  if opts.disk_state:
64 e4c03256 René Nussbaumer
    disk_state = utils.FlatToDict(opts.disk_state)
65 e4c03256 René Nussbaumer
  else:
66 e4c03256 René Nussbaumer
    disk_state = {}
67 e4c03256 René Nussbaumer
  hv_state = dict(opts.hv_state)
68 e4c03256 René Nussbaumer
69 fabf1731 Iustin Pop
  op = opcodes.OpGroupAdd(group_name=group_name, ndparams=opts.ndparams,
70 bc5d0215 Andrea Spadaccini
                          alloc_policy=opts.alloc_policy,
71 e4c03256 René Nussbaumer
                          diskparams=diskparams, ipolicy=ipolicy,
72 e4c03256 René Nussbaumer
                          hv_state=hv_state,
73 e4c03256 René Nussbaumer
                          disk_state=disk_state)
74 dcbeccd9 Michael Hanselmann
  SubmitOrSend(op, opts)
75 66e884e1 Adeodato Simo
76 66e884e1 Adeodato Simo
77 919852da Adeodato Simo
def AssignNodes(opts, args):
78 919852da Adeodato Simo
  """Assign nodes to a group.
79 919852da Adeodato Simo

80 919852da Adeodato Simo
  @param opts: the command line options selected by the user
81 919852da Adeodato Simo
  @type args: list
82 919852da Adeodato Simo
  @param args: args[0]: group to assign nodes to; args[1:]: nodes to assign
83 919852da Adeodato Simo
  @rtype: int
84 919852da Adeodato Simo
  @return: the desired exit code
85 919852da Adeodato Simo

86 919852da Adeodato Simo
  """
87 919852da Adeodato Simo
  group_name = args[0]
88 919852da Adeodato Simo
  node_names = args[1:]
89 919852da Adeodato Simo
90 934704ae Iustin Pop
  op = opcodes.OpGroupAssignNodes(group_name=group_name, nodes=node_names,
91 919852da Adeodato Simo
                                  force=opts.force)
92 dcbeccd9 Michael Hanselmann
  SubmitOrSend(op, opts)
93 919852da Adeodato Simo
94 919852da Adeodato Simo
95 b288b6f3 René Nussbaumer
def _FmtDict(data):
96 b288b6f3 René Nussbaumer
  """Format dict data into command-line format.
97 b288b6f3 René Nussbaumer

98 b288b6f3 René Nussbaumer
  @param data: The input dict to be formatted
99 b288b6f3 René Nussbaumer
  @return: The formatted dict
100 b288b6f3 René Nussbaumer

101 b288b6f3 René Nussbaumer
  """
102 b288b6f3 René Nussbaumer
  if not data:
103 b288b6f3 René Nussbaumer
    return "(empty)"
104 b288b6f3 René Nussbaumer
105 b288b6f3 René Nussbaumer
  return utils.CommaJoin(["%s=%s" % (key, value)
106 b288b6f3 René Nussbaumer
                          for key, value in data.items()])
107 b288b6f3 René Nussbaumer
108 b288b6f3 René Nussbaumer
109 667dbd6b Adeodato Simo
def ListGroups(opts, args):
110 667dbd6b Adeodato Simo
  """List node groups and their properties.
111 667dbd6b Adeodato Simo

112 667dbd6b Adeodato Simo
  @param opts: the command line options selected by the user
113 667dbd6b Adeodato Simo
  @type args: list
114 667dbd6b Adeodato Simo
  @param args: groups to list, or empty for all
115 667dbd6b Adeodato Simo
  @rtype: int
116 667dbd6b Adeodato Simo
  @return: the desired exit code
117 667dbd6b Adeodato Simo

118 667dbd6b Adeodato Simo
  """
119 667dbd6b Adeodato Simo
  desired_fields = ParseFields(opts.output, _LIST_DEF_FIELDS)
120 b288b6f3 René Nussbaumer
  fmtoverride = {
121 b288b6f3 René Nussbaumer
    "node_list": (",".join, False),
122 b288b6f3 René Nussbaumer
    "pinst_list": (",".join, False),
123 b288b6f3 René Nussbaumer
    "ndparams": (_FmtDict, False),
124 b288b6f3 René Nussbaumer
    }
125 667dbd6b Adeodato Simo
126 9fbf0098 Iustin Pop
  cl = GetClient(query=True)
127 9fbf0098 Iustin Pop
128 ca4ac9c9 Adeodato Simo
  return GenericList(constants.QR_GROUP, desired_fields, args, None,
129 ca4ac9c9 Adeodato Simo
                     opts.separator, not opts.no_headers,
130 1b1a08e8 Michael Hanselmann
                     format_override=fmtoverride, verbose=opts.verbose,
131 9fbf0098 Iustin Pop
                     force_filter=opts.force_filter, cl=cl)
132 667dbd6b Adeodato Simo
133 667dbd6b Adeodato Simo
134 ca4ac9c9 Adeodato Simo
def ListGroupFields(opts, args):
135 ca4ac9c9 Adeodato Simo
  """List node fields.
136 667dbd6b Adeodato Simo

137 ca4ac9c9 Adeodato Simo
  @param opts: the command line options selected by the user
138 ca4ac9c9 Adeodato Simo
  @type args: list
139 ca4ac9c9 Adeodato Simo
  @param args: fields to list, or empty for all
140 ca4ac9c9 Adeodato Simo
  @rtype: int
141 ca4ac9c9 Adeodato Simo
  @return: the desired exit code
142 667dbd6b Adeodato Simo

143 ca4ac9c9 Adeodato Simo
  """
144 9fbf0098 Iustin Pop
  cl = GetClient(query=True)
145 9fbf0098 Iustin Pop
146 ca4ac9c9 Adeodato Simo
  return GenericListFields(constants.QR_GROUP, args, opts.separator,
147 9fbf0098 Iustin Pop
                           not opts.no_headers, cl=cl)
148 667dbd6b Adeodato Simo
149 667dbd6b Adeodato Simo
150 4da7909a Adeodato Simo
def SetGroupParams(opts, args):
151 4da7909a Adeodato Simo
  """Modifies a node group's parameters.
152 4da7909a Adeodato Simo

153 fecbc0b6 Stephen Shirley
  @param opts: the command line options selected by the user
154 4da7909a Adeodato Simo
  @type args: list
155 4da7909a Adeodato Simo
  @param args: should contain only one element, the node group name
156 4da7909a Adeodato Simo

157 4da7909a Adeodato Simo
  @rtype: int
158 4da7909a Adeodato Simo
  @return: the desired exit code
159 4da7909a Adeodato Simo

160 4da7909a Adeodato Simo
  """
161 fb644e77 Agata Murawska
  allmods = [opts.ndparams, opts.alloc_policy, opts.diskparams, opts.hv_state,
162 fb644e77 Agata Murawska
             opts.disk_state, opts.ispecs_mem_size, opts.ispecs_cpu_count,
163 fb644e77 Agata Murawska
             opts.ispecs_disk_count, opts.ispecs_disk_size,
164 eb70f6cf René Nussbaumer
             opts.ispecs_nic_count, opts.ipolicy_vcpu_ratio,
165 eb70f6cf René Nussbaumer
             opts.ipolicy_spindle_ratio, opts.diskparams]
166 fb644e77 Agata Murawska
  if allmods.count(None) == len(allmods):
167 4da7909a Adeodato Simo
    ToStderr("Please give at least one of the parameters.")
168 4da7909a Adeodato Simo
    return 1
169 4da7909a Adeodato Simo
170 a8282327 René Nussbaumer
  if opts.disk_state:
171 a8282327 René Nussbaumer
    disk_state = utils.FlatToDict(opts.disk_state)
172 a8282327 René Nussbaumer
  else:
173 a8282327 René Nussbaumer
    disk_state = {}
174 a8282327 René Nussbaumer
175 a8282327 René Nussbaumer
  hv_state = dict(opts.hv_state)
176 a8282327 René Nussbaumer
177 bc5d0215 Andrea Spadaccini
  diskparams = dict(opts.diskparams)
178 fb644e77 Agata Murawska
179 fb644e77 Agata Murawska
  # set the default values
180 fb644e77 Agata Murawska
  to_ipolicy = [
181 fb644e77 Agata Murawska
    opts.ispecs_mem_size,
182 fb644e77 Agata Murawska
    opts.ispecs_cpu_count,
183 fb644e77 Agata Murawska
    opts.ispecs_disk_count,
184 fb644e77 Agata Murawska
    opts.ispecs_disk_size,
185 fb644e77 Agata Murawska
    opts.ispecs_nic_count,
186 fb644e77 Agata Murawska
    ]
187 fb644e77 Agata Murawska
  for ispec in to_ipolicy:
188 fb644e77 Agata Murawska
    for param in ispec:
189 fb644e77 Agata Murawska
      if isinstance(ispec[param], basestring):
190 fb644e77 Agata Murawska
        if ispec[param].lower() == "default":
191 fb644e77 Agata Murawska
          ispec[param] = constants.VALUE_DEFAULT
192 fb644e77 Agata Murawska
  # create ipolicy object
193 703fa9ab Iustin Pop
  ipolicy = CreateIPolicyFromOpts(
194 fb644e77 Agata Murawska
    ispecs_mem_size=opts.ispecs_mem_size,
195 fb644e77 Agata Murawska
    ispecs_cpu_count=opts.ispecs_cpu_count,
196 fb644e77 Agata Murawska
    ispecs_disk_count=opts.ispecs_disk_count,
197 fb644e77 Agata Murawska
    ispecs_disk_size=opts.ispecs_disk_size,
198 fb644e77 Agata Murawska
    ispecs_nic_count=opts.ispecs_nic_count,
199 d04c9d45 Iustin Pop
    ipolicy_disk_templates=opts.ipolicy_disk_templates,
200 eb70f6cf René Nussbaumer
    ipolicy_vcpu_ratio=opts.ipolicy_vcpu_ratio,
201 eb70f6cf René Nussbaumer
    ipolicy_spindle_ratio=opts.ipolicy_spindle_ratio,
202 fb644e77 Agata Murawska
    group_ipolicy=True,
203 fb644e77 Agata Murawska
    allowed_values=[constants.VALUE_DEFAULT])
204 fb644e77 Agata Murawska
205 8e47b5da Michael Hanselmann
  op = opcodes.OpGroupSetParams(group_name=args[0],
206 8e47b5da Michael Hanselmann
                                ndparams=opts.ndparams,
207 bc5d0215 Andrea Spadaccini
                                alloc_policy=opts.alloc_policy,
208 a8282327 René Nussbaumer
                                hv_state=hv_state,
209 a8282327 René Nussbaumer
                                disk_state=disk_state,
210 fb644e77 Agata Murawska
                                diskparams=diskparams,
211 fb644e77 Agata Murawska
                                ipolicy=ipolicy)
212 fb644e77 Agata Murawska
213 4da7909a Adeodato Simo
  result = SubmitOrSend(op, opts)
214 4da7909a Adeodato Simo
215 4da7909a Adeodato Simo
  if result:
216 4da7909a Adeodato Simo
    ToStdout("Modified node group %s", args[0])
217 4da7909a Adeodato Simo
    for param, data in result:
218 4da7909a Adeodato Simo
      ToStdout(" - %-5s -> %s", param, data)
219 4da7909a Adeodato Simo
220 4da7909a Adeodato Simo
  return 0
221 4da7909a Adeodato Simo
222 4da7909a Adeodato Simo
223 66e884e1 Adeodato Simo
def RemoveGroup(opts, args):
224 66e884e1 Adeodato Simo
  """Remove a node group from the cluster.
225 66e884e1 Adeodato Simo

226 66e884e1 Adeodato Simo
  @param opts: the command line options selected by the user
227 66e884e1 Adeodato Simo
  @type args: list
228 66e884e1 Adeodato Simo
  @param args: a list of length 1 with the name of the group to remove
229 66e884e1 Adeodato Simo
  @rtype: int
230 66e884e1 Adeodato Simo
  @return: the desired exit code
231 66e884e1 Adeodato Simo

232 66e884e1 Adeodato Simo
  """
233 66e884e1 Adeodato Simo
  (group_name,) = args
234 4d1baa51 Iustin Pop
  op = opcodes.OpGroupRemove(group_name=group_name)
235 dcbeccd9 Michael Hanselmann
  SubmitOrSend(op, opts)
236 66e884e1 Adeodato Simo
237 66e884e1 Adeodato Simo
238 66e884e1 Adeodato Simo
def RenameGroup(opts, args):
239 66e884e1 Adeodato Simo
  """Rename a node group.
240 66e884e1 Adeodato Simo

241 66e884e1 Adeodato Simo
  @param opts: the command line options selected by the user
242 66e884e1 Adeodato Simo
  @type args: list
243 66e884e1 Adeodato Simo
  @param args: a list of length 2, [old_name, new_name]
244 66e884e1 Adeodato Simo
  @rtype: int
245 66e884e1 Adeodato Simo
  @return: the desired exit code
246 66e884e1 Adeodato Simo

247 66e884e1 Adeodato Simo
  """
248 12da663a Michael Hanselmann
  group_name, new_name = args
249 12da663a Michael Hanselmann
  op = opcodes.OpGroupRename(group_name=group_name, new_name=new_name)
250 dcbeccd9 Michael Hanselmann
  SubmitOrSend(op, opts)
251 66e884e1 Adeodato Simo
252 66e884e1 Adeodato Simo
253 f6eb380d Michael Hanselmann
def EvacuateGroup(opts, args):
254 f6eb380d Michael Hanselmann
  """Evacuate a node group.
255 f6eb380d Michael Hanselmann

256 f6eb380d Michael Hanselmann
  """
257 f6eb380d Michael Hanselmann
  (group_name, ) = args
258 f6eb380d Michael Hanselmann
259 f6eb380d Michael Hanselmann
  cl = GetClient()
260 f6eb380d Michael Hanselmann
261 f6eb380d Michael Hanselmann
  op = opcodes.OpGroupEvacuate(group_name=group_name,
262 f6eb380d Michael Hanselmann
                               iallocator=opts.iallocator,
263 f6eb380d Michael Hanselmann
                               target_groups=opts.to,
264 f6eb380d Michael Hanselmann
                               early_release=opts.early_release)
265 dcbeccd9 Michael Hanselmann
  result = SubmitOrSend(op, opts, cl=cl)
266 f6eb380d Michael Hanselmann
267 f6eb380d Michael Hanselmann
  # Keep track of submitted jobs
268 f6eb380d Michael Hanselmann
  jex = JobExecutor(cl=cl, opts=opts)
269 f6eb380d Michael Hanselmann
270 f6eb380d Michael Hanselmann
  for (status, job_id) in result[constants.JOB_IDS_KEY]:
271 f6eb380d Michael Hanselmann
    jex.AddJobId(None, status, job_id)
272 f6eb380d Michael Hanselmann
273 f6eb380d Michael Hanselmann
  results = jex.GetResults()
274 f6eb380d Michael Hanselmann
  bad_cnt = len([row for row in results if not row[0]])
275 f6eb380d Michael Hanselmann
  if bad_cnt == 0:
276 f6eb380d Michael Hanselmann
    ToStdout("All instances evacuated successfully.")
277 f6eb380d Michael Hanselmann
    rcode = constants.EXIT_SUCCESS
278 f6eb380d Michael Hanselmann
  else:
279 f6eb380d Michael Hanselmann
    ToStdout("There were %s errors during the evacuation.", bad_cnt)
280 f6eb380d Michael Hanselmann
    rcode = constants.EXIT_FAILURE
281 f6eb380d Michael Hanselmann
282 f6eb380d Michael Hanselmann
  return rcode
283 f6eb380d Michael Hanselmann
284 216d23c0 René Nussbaumer
285 801bccba Bernardo Dal Seno
def _FormatGroupInfo(group):
286 801bccba Bernardo Dal Seno
  (name, ndparams, custom_ndparams, diskparams, custom_diskparams,
287 801bccba Bernardo Dal Seno
   ipolicy, custom_ipolicy) = group
288 801bccba Bernardo Dal Seno
  return [
289 801bccba Bernardo Dal Seno
    ("Node group", name),
290 801bccba Bernardo Dal Seno
    ("Node parameters", FormatParamsDictInfo(custom_ndparams, ndparams)),
291 801bccba Bernardo Dal Seno
    ("Disk parameters", FormatParamsDictInfo(custom_diskparams, diskparams)),
292 801bccba Bernardo Dal Seno
    ("Instance policy", FormatPolicyInfo(custom_ipolicy, ipolicy, False)),
293 801bccba Bernardo Dal Seno
    ]
294 216d23c0 René Nussbaumer
295 216d23c0 René Nussbaumer
296 216d23c0 René Nussbaumer
def GroupInfo(_, args):
297 216d23c0 René Nussbaumer
  """Shows info about node group.
298 216d23c0 René Nussbaumer

299 216d23c0 René Nussbaumer
  """
300 9fbf0098 Iustin Pop
  cl = GetClient(query=True)
301 216d23c0 René Nussbaumer
  selected_fields = ["name",
302 216d23c0 René Nussbaumer
                     "ndparams", "custom_ndparams",
303 216d23c0 René Nussbaumer
                     "diskparams", "custom_diskparams",
304 216d23c0 René Nussbaumer
                     "ipolicy", "custom_ipolicy"]
305 216d23c0 René Nussbaumer
  result = cl.QueryGroups(names=args, fields=selected_fields,
306 216d23c0 René Nussbaumer
                          use_locking=False)
307 216d23c0 René Nussbaumer
308 801bccba Bernardo Dal Seno
  PrintGenericInfo([
309 801bccba Bernardo Dal Seno
    _FormatGroupInfo(group) for group in result
310 801bccba Bernardo Dal Seno
    ])
311 216d23c0 René Nussbaumer
312 216d23c0 René Nussbaumer
313 667dbd6b Adeodato Simo
commands = {
314 66e884e1 Adeodato Simo
  "add": (
315 bc5d0215 Andrea Spadaccini
    AddGroup, ARGS_ONE_GROUP,
316 e4c03256 René Nussbaumer
    [DRY_RUN_OPT, ALLOC_POLICY_OPT, NODE_PARAMS_OPT, DISK_PARAMS_OPT,
317 dcbeccd9 Michael Hanselmann
     HV_STATE_OPT, DISK_STATE_OPT, PRIORITY_OPT,
318 dcbeccd9 Michael Hanselmann
     SUBMIT_OPT] + INSTANCE_POLICY_OPTS,
319 66e884e1 Adeodato Simo
    "<group_name>", "Add a new node group to the cluster"),
320 919852da Adeodato Simo
  "assign-nodes": (
321 dcbeccd9 Michael Hanselmann
    AssignNodes, ARGS_ONE_GROUP + ARGS_MANY_NODES,
322 dcbeccd9 Michael Hanselmann
    [DRY_RUN_OPT, FORCE_OPT, PRIORITY_OPT, SUBMIT_OPT],
323 919852da Adeodato Simo
    "<group_name> <node>...", "Assign nodes to a group"),
324 667dbd6b Adeodato Simo
  "list": (
325 667dbd6b Adeodato Simo
    ListGroups, ARGS_MANY_GROUPS,
326 1b1a08e8 Michael Hanselmann
    [NOHDR_OPT, SEP_OPT, FIELDS_OPT, VERBOSE_OPT, FORCE_FILTER_OPT],
327 4edc512c Adeodato Simo
    "[<group_name>...]",
328 ca4ac9c9 Adeodato Simo
    "Lists the node groups in the cluster. The available fields can be shown"
329 ca4ac9c9 Adeodato Simo
    " using the \"list-fields\" command (see the man page for details)."
330 ca4ac9c9 Adeodato Simo
    " The default list is (in order): %s." % utils.CommaJoin(_LIST_DEF_FIELDS)),
331 ca4ac9c9 Adeodato Simo
  "list-fields": (
332 ca4ac9c9 Adeodato Simo
    ListGroupFields, [ArgUnknown()], [NOHDR_OPT, SEP_OPT], "[fields...]",
333 ca4ac9c9 Adeodato Simo
    "Lists all available fields for node groups"),
334 4da7909a Adeodato Simo
  "modify": (
335 4da7909a Adeodato Simo
    SetGroupParams, ARGS_ONE_GROUP,
336 a8282327 René Nussbaumer
    [DRY_RUN_OPT, SUBMIT_OPT, ALLOC_POLICY_OPT, NODE_PARAMS_OPT, HV_STATE_OPT,
337 dcbeccd9 Michael Hanselmann
     DISK_STATE_OPT, DISK_PARAMS_OPT, PRIORITY_OPT] + INSTANCE_POLICY_OPTS,
338 4da7909a Adeodato Simo
    "<group_name>", "Alters the parameters of a node group"),
339 66e884e1 Adeodato Simo
  "remove": (
340 dcbeccd9 Michael Hanselmann
    RemoveGroup, ARGS_ONE_GROUP, [DRY_RUN_OPT, PRIORITY_OPT, SUBMIT_OPT],
341 12da663a Michael Hanselmann
    "[--dry-run] <group-name>",
342 66e884e1 Adeodato Simo
    "Remove an (empty) node group from the cluster"),
343 66e884e1 Adeodato Simo
  "rename": (
344 dcbeccd9 Michael Hanselmann
    RenameGroup, [ArgGroup(min=2, max=2)],
345 dcbeccd9 Michael Hanselmann
    [DRY_RUN_OPT, SUBMIT_OPT, PRIORITY_OPT],
346 12da663a Michael Hanselmann
    "[--dry-run] <group-name> <new-name>", "Rename a node group"),
347 f6eb380d Michael Hanselmann
  "evacuate": (
348 f6eb380d Michael Hanselmann
    EvacuateGroup, [ArgGroup(min=1, max=1)],
349 dcbeccd9 Michael Hanselmann
    [TO_GROUP_OPT, IALLOCATOR_OPT, EARLY_RELEASE_OPT, SUBMIT_OPT, PRIORITY_OPT],
350 6e80da8b Michael Hanselmann
    "[-I <iallocator>] [--to <group>]",
351 6e80da8b Michael Hanselmann
    "Evacuate all instances within a group"),
352 819cbfe5 Michael Hanselmann
  "list-tags": (
353 6bc3ed14 Michael Hanselmann
    ListTags, ARGS_ONE_GROUP, [],
354 36c70d4d Iustin Pop
    "<group_name>", "List the tags of the given group"),
355 819cbfe5 Michael Hanselmann
  "add-tags": (
356 819cbfe5 Michael Hanselmann
    AddTags, [ArgGroup(min=1, max=1), ArgUnknown()],
357 6bc3ed14 Michael Hanselmann
    [TAG_SRC_OPT, PRIORITY_OPT, SUBMIT_OPT],
358 36c70d4d Iustin Pop
    "<group_name> tag...", "Add tags to the given group"),
359 819cbfe5 Michael Hanselmann
  "remove-tags": (
360 819cbfe5 Michael Hanselmann
    RemoveTags, [ArgGroup(min=1, max=1), ArgUnknown()],
361 6bc3ed14 Michael Hanselmann
    [TAG_SRC_OPT, PRIORITY_OPT, SUBMIT_OPT],
362 36c70d4d Iustin Pop
    "<group_name> tag...", "Remove tags from the given group"),
363 216d23c0 René Nussbaumer
  "info": (
364 2c398e80 Bernardo Dal Seno
    GroupInfo, ARGS_MANY_GROUPS, [], "[<group_name>...]",
365 2c398e80 Bernardo Dal Seno
    "Show group information"),
366 819cbfe5 Michael Hanselmann
  }
367 667dbd6b Adeodato Simo
368 667dbd6b Adeodato Simo
369 667dbd6b Adeodato Simo
def Main():
370 819cbfe5 Michael Hanselmann
  return GenericMain(commands,
371 ef9fa5b9 René Nussbaumer
                     override={"tag_type": constants.TAG_NODEGROUP},
372 ef9fa5b9 René Nussbaumer
                     env_override=_ENV_OVERRIDE)