Statistics
| Branch: | Tag: | Revision:

root / lib / client / gnt_group.py @ ea0f78c8

History | View | Annotate | Download (11.5 kB)

1 667dbd6b Adeodato Simo
#
2 667dbd6b Adeodato Simo
#
3 667dbd6b Adeodato Simo
4 57dc299a Iustin Pop
# Copyright (C) 2010, 2011, 2012 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 1f5d9bf8 Agata Murawska
from ganeti import objects
30 66e884e1 Adeodato Simo
from ganeti import opcodes
31 4edc512c Adeodato Simo
from ganeti import utils
32 216d23c0 René Nussbaumer
from cStringIO import StringIO
33 667dbd6b Adeodato Simo
34 667dbd6b Adeodato Simo
35 667dbd6b Adeodato Simo
#: default list of fields for L{ListGroups}
36 b288b6f3 René Nussbaumer
_LIST_DEF_FIELDS = ["name", "node_cnt", "pinst_cnt", "alloc_policy", "ndparams"]
37 667dbd6b Adeodato Simo
38 667dbd6b Adeodato Simo
39 ef9fa5b9 René Nussbaumer
_ENV_OVERRIDE = frozenset(["list"])
40 ef9fa5b9 René Nussbaumer
41 ef9fa5b9 René Nussbaumer
42 66e884e1 Adeodato Simo
def AddGroup(opts, args):
43 66e884e1 Adeodato Simo
  """Add a node group to the cluster.
44 66e884e1 Adeodato Simo

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

51 66e884e1 Adeodato Simo
  """
52 1f5d9bf8 Agata Murawska
  ipolicy = \
53 1f5d9bf8 Agata Murawska
    objects.CreateIPolicyFromOpts(ispecs_mem_size=opts.ispecs_mem_size,
54 1f5d9bf8 Agata Murawska
                                  ispecs_cpu_count=opts.ispecs_cpu_count,
55 1f5d9bf8 Agata Murawska
                                  ispecs_disk_count=opts.ispecs_disk_count,
56 1f5d9bf8 Agata Murawska
                                  ispecs_disk_size=opts.ispecs_disk_size,
57 1f5d9bf8 Agata Murawska
                                  ispecs_nic_count=opts.ispecs_nic_count,
58 1f5d9bf8 Agata Murawska
                                  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 ca4ac9c9 Adeodato Simo
  return GenericList(constants.QR_GROUP, desired_fields, args, None,
127 ca4ac9c9 Adeodato Simo
                     opts.separator, not opts.no_headers,
128 1b1a08e8 Michael Hanselmann
                     format_override=fmtoverride, verbose=opts.verbose,
129 1b1a08e8 Michael Hanselmann
                     force_filter=opts.force_filter)
130 667dbd6b Adeodato Simo
131 667dbd6b Adeodato Simo
132 ca4ac9c9 Adeodato Simo
def ListGroupFields(opts, args):
133 ca4ac9c9 Adeodato Simo
  """List node fields.
134 667dbd6b Adeodato Simo

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

141 ca4ac9c9 Adeodato Simo
  """
142 ca4ac9c9 Adeodato Simo
  return GenericListFields(constants.QR_GROUP, args, opts.separator,
143 ca4ac9c9 Adeodato Simo
                           not opts.no_headers)
144 667dbd6b Adeodato Simo
145 667dbd6b Adeodato Simo
146 4da7909a Adeodato Simo
def SetGroupParams(opts, args):
147 4da7909a Adeodato Simo
  """Modifies a node group's parameters.
148 4da7909a Adeodato Simo

149 fecbc0b6 Stephen Shirley
  @param opts: the command line options selected by the user
150 4da7909a Adeodato Simo
  @type args: list
151 4da7909a Adeodato Simo
  @param args: should contain only one element, the node group name
152 4da7909a Adeodato Simo

153 4da7909a Adeodato Simo
  @rtype: int
154 4da7909a Adeodato Simo
  @return: the desired exit code
155 4da7909a Adeodato Simo

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

219 66e884e1 Adeodato Simo
  @param opts: the command line options selected by the user
220 66e884e1 Adeodato Simo
  @type args: list
221 66e884e1 Adeodato Simo
  @param args: a list of length 1 with the name of the group to remove
222 66e884e1 Adeodato Simo
  @rtype: int
223 66e884e1 Adeodato Simo
  @return: the desired exit code
224 66e884e1 Adeodato Simo

225 66e884e1 Adeodato Simo
  """
226 66e884e1 Adeodato Simo
  (group_name,) = args
227 4d1baa51 Iustin Pop
  op = opcodes.OpGroupRemove(group_name=group_name)
228 dcbeccd9 Michael Hanselmann
  SubmitOrSend(op, opts)
229 66e884e1 Adeodato Simo
230 66e884e1 Adeodato Simo
231 66e884e1 Adeodato Simo
def RenameGroup(opts, args):
232 66e884e1 Adeodato Simo
  """Rename a node group.
233 66e884e1 Adeodato Simo

234 66e884e1 Adeodato Simo
  @param opts: the command line options selected by the user
235 66e884e1 Adeodato Simo
  @type args: list
236 66e884e1 Adeodato Simo
  @param args: a list of length 2, [old_name, new_name]
237 66e884e1 Adeodato Simo
  @rtype: int
238 66e884e1 Adeodato Simo
  @return: the desired exit code
239 66e884e1 Adeodato Simo

240 66e884e1 Adeodato Simo
  """
241 12da663a Michael Hanselmann
  group_name, new_name = args
242 12da663a Michael Hanselmann
  op = opcodes.OpGroupRename(group_name=group_name, new_name=new_name)
243 dcbeccd9 Michael Hanselmann
  SubmitOrSend(op, opts)
244 66e884e1 Adeodato Simo
245 66e884e1 Adeodato Simo
246 f6eb380d Michael Hanselmann
def EvacuateGroup(opts, args):
247 f6eb380d Michael Hanselmann
  """Evacuate a node group.
248 f6eb380d Michael Hanselmann

249 f6eb380d Michael Hanselmann
  """
250 f6eb380d Michael Hanselmann
  (group_name, ) = args
251 f6eb380d Michael Hanselmann
252 f6eb380d Michael Hanselmann
  cl = GetClient()
253 f6eb380d Michael Hanselmann
254 f6eb380d Michael Hanselmann
  op = opcodes.OpGroupEvacuate(group_name=group_name,
255 f6eb380d Michael Hanselmann
                               iallocator=opts.iallocator,
256 f6eb380d Michael Hanselmann
                               target_groups=opts.to,
257 f6eb380d Michael Hanselmann
                               early_release=opts.early_release)
258 dcbeccd9 Michael Hanselmann
  result = SubmitOrSend(op, opts, cl=cl)
259 f6eb380d Michael Hanselmann
260 f6eb380d Michael Hanselmann
  # Keep track of submitted jobs
261 f6eb380d Michael Hanselmann
  jex = JobExecutor(cl=cl, opts=opts)
262 f6eb380d Michael Hanselmann
263 f6eb380d Michael Hanselmann
  for (status, job_id) in result[constants.JOB_IDS_KEY]:
264 f6eb380d Michael Hanselmann
    jex.AddJobId(None, status, job_id)
265 f6eb380d Michael Hanselmann
266 f6eb380d Michael Hanselmann
  results = jex.GetResults()
267 f6eb380d Michael Hanselmann
  bad_cnt = len([row for row in results if not row[0]])
268 f6eb380d Michael Hanselmann
  if bad_cnt == 0:
269 f6eb380d Michael Hanselmann
    ToStdout("All instances evacuated successfully.")
270 f6eb380d Michael Hanselmann
    rcode = constants.EXIT_SUCCESS
271 f6eb380d Michael Hanselmann
  else:
272 f6eb380d Michael Hanselmann
    ToStdout("There were %s errors during the evacuation.", bad_cnt)
273 f6eb380d Michael Hanselmann
    rcode = constants.EXIT_FAILURE
274 f6eb380d Michael Hanselmann
275 f6eb380d Michael Hanselmann
  return rcode
276 f6eb380d Michael Hanselmann
277 216d23c0 René Nussbaumer
278 216d23c0 René Nussbaumer
def _FormatDict(custom, actual, level=2):
279 216d23c0 René Nussbaumer
  """Helper function to L{cli.FormatParameterDict}.
280 216d23c0 René Nussbaumer

281 216d23c0 René Nussbaumer
  @param custom: The customized dict
282 216d23c0 René Nussbaumer
  @param actual: The fully filled dict
283 216d23c0 René Nussbaumer

284 216d23c0 René Nussbaumer
  """
285 216d23c0 René Nussbaumer
  buf = StringIO()
286 216d23c0 René Nussbaumer
  FormatParameterDict(buf, custom, actual, level=level)
287 216d23c0 René Nussbaumer
  return buf.getvalue().rstrip("\n")
288 216d23c0 René Nussbaumer
289 216d23c0 René Nussbaumer
290 216d23c0 René Nussbaumer
def GroupInfo(_, args):
291 216d23c0 René Nussbaumer
  """Shows info about node group.
292 216d23c0 René Nussbaumer

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