Statistics
| Branch: | Tag: | Revision:

root / scripts / gnt-instance @ 3fc175f0

History | View | Annotate | Download (38.8 kB)

1 a8083063 Iustin Pop
#!/usr/bin/python
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 a8083063 Iustin Pop
# Copyright (C) 2006, 2007 Google Inc.
5 a8083063 Iustin Pop
#
6 a8083063 Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 a8083063 Iustin Pop
# it under the terms of the GNU General Public License as published by
8 a8083063 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 a8083063 Iustin Pop
# (at your option) any later version.
10 a8083063 Iustin Pop
#
11 a8083063 Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 a8083063 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 a8083063 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 a8083063 Iustin Pop
# General Public License for more details.
15 a8083063 Iustin Pop
#
16 a8083063 Iustin Pop
# You should have received a copy of the GNU General Public License
17 a8083063 Iustin Pop
# along with this program; if not, write to the Free Software
18 a8083063 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 a8083063 Iustin Pop
# 02110-1301, USA.
20 a8083063 Iustin Pop
21 a8083063 Iustin Pop
22 a8083063 Iustin Pop
import sys
23 a8083063 Iustin Pop
import os
24 312ac745 Iustin Pop
import itertools
25 a8083063 Iustin Pop
from optparse import make_option
26 a8083063 Iustin Pop
from cStringIO import StringIO
27 a8083063 Iustin Pop
28 a8083063 Iustin Pop
from ganeti.cli import *
29 a8083063 Iustin Pop
from ganeti import opcodes
30 a8083063 Iustin Pop
from ganeti import logger
31 a8083063 Iustin Pop
from ganeti import constants
32 a8083063 Iustin Pop
from ganeti import utils
33 312ac745 Iustin Pop
from ganeti import errors
34 312ac745 Iustin Pop
35 312ac745 Iustin Pop
36 312ac745 Iustin Pop
_SHUTDOWN_CLUSTER = "cluster"
37 312ac745 Iustin Pop
_SHUTDOWN_NODES_BOTH = "nodes"
38 312ac745 Iustin Pop
_SHUTDOWN_NODES_PRI = "nodes-pri"
39 312ac745 Iustin Pop
_SHUTDOWN_NODES_SEC = "nodes-sec"
40 312ac745 Iustin Pop
_SHUTDOWN_INSTANCES = "instances"
41 312ac745 Iustin Pop
42 7c0d6283 Michael Hanselmann
43 31a853d2 Iustin Pop
_VALUE_TRUE = "true"
44 31a853d2 Iustin Pop
45 48c4dfa8 Iustin Pop
_LIST_DEF_FIELDS = [
46 48c4dfa8 Iustin Pop
  "name", "os", "pnode", "status", "oper_ram",
47 48c4dfa8 Iustin Pop
  ]
48 48c4dfa8 Iustin Pop
49 bdb7d4e8 Michael Hanselmann
50 312ac745 Iustin Pop
def _ExpandMultiNames(mode, names):
51 312ac745 Iustin Pop
  """Expand the given names using the passed mode.
52 312ac745 Iustin Pop
53 312ac745 Iustin Pop
  Args:
54 312ac745 Iustin Pop
    - mode, which can be one of _SHUTDOWN_CLUSTER, _SHUTDOWN_NODES_BOTH,
55 312ac745 Iustin Pop
      _SHUTDOWN_NODES_PRI, _SHUTDOWN_NODES_SEC or _SHUTDOWN_INSTANCES
56 312ac745 Iustin Pop
    - names, which is a list of names; for cluster, it must be empty,
57 312ac745 Iustin Pop
      and for node and instance it must be a list of valid item
58 312ac745 Iustin Pop
      names (short names are valid as usual, e.g. node1 instead of
59 312ac745 Iustin Pop
      node1.example.com)
60 312ac745 Iustin Pop
61 312ac745 Iustin Pop
  For _SHUTDOWN_CLUSTER, all instances will be returned. For
62 312ac745 Iustin Pop
  _SHUTDOWN_NODES_PRI/SEC, all instances having those nodes as
63 312ac745 Iustin Pop
  primary/secondary will be shutdown. For _SHUTDOWN_NODES_BOTH, all
64 312ac745 Iustin Pop
  instances having those nodes as either primary or secondary will be
65 312ac745 Iustin Pop
  returned. For _SHUTDOWN_INSTANCES, the given instances will be
66 312ac745 Iustin Pop
  returned.
67 312ac745 Iustin Pop
68 312ac745 Iustin Pop
  """
69 312ac745 Iustin Pop
  if mode == _SHUTDOWN_CLUSTER:
70 312ac745 Iustin Pop
    if names:
71 312ac745 Iustin Pop
      raise errors.OpPrereqError("Cluster filter mode takes no arguments")
72 312ac745 Iustin Pop
    op = opcodes.OpQueryInstances(output_fields=["name"], names=[])
73 312ac745 Iustin Pop
    idata = SubmitOpCode(op)
74 312ac745 Iustin Pop
    inames = [row[0] for row in idata]
75 312ac745 Iustin Pop
76 312ac745 Iustin Pop
  elif mode in (_SHUTDOWN_NODES_BOTH,
77 312ac745 Iustin Pop
                _SHUTDOWN_NODES_PRI,
78 312ac745 Iustin Pop
                _SHUTDOWN_NODES_SEC):
79 312ac745 Iustin Pop
    if not names:
80 312ac745 Iustin Pop
      raise errors.OpPrereqError("No node names passed")
81 312ac745 Iustin Pop
    op = opcodes.OpQueryNodes(output_fields=["name", "pinst_list",
82 312ac745 Iustin Pop
                                             "sinst_list"], names=names)
83 312ac745 Iustin Pop
    ndata = SubmitOpCode(op)
84 312ac745 Iustin Pop
    ipri = [row[1] for row in ndata]
85 312ac745 Iustin Pop
    pri_names = list(itertools.chain(*ipri))
86 312ac745 Iustin Pop
    isec = [row[2] for row in ndata]
87 312ac745 Iustin Pop
    sec_names = list(itertools.chain(*isec))
88 312ac745 Iustin Pop
    if mode == _SHUTDOWN_NODES_BOTH:
89 312ac745 Iustin Pop
      inames = pri_names + sec_names
90 312ac745 Iustin Pop
    elif mode == _SHUTDOWN_NODES_PRI:
91 312ac745 Iustin Pop
      inames = pri_names
92 312ac745 Iustin Pop
    elif mode == _SHUTDOWN_NODES_SEC:
93 312ac745 Iustin Pop
      inames = sec_names
94 312ac745 Iustin Pop
    else:
95 312ac745 Iustin Pop
      raise errors.ProgrammerError("Unhandled shutdown type")
96 312ac745 Iustin Pop
97 312ac745 Iustin Pop
  elif mode == _SHUTDOWN_INSTANCES:
98 312ac745 Iustin Pop
    if not names:
99 312ac745 Iustin Pop
      raise errors.OpPrereqError("No instance names passed")
100 312ac745 Iustin Pop
    op = opcodes.OpQueryInstances(output_fields=["name"], names=names)
101 312ac745 Iustin Pop
    idata = SubmitOpCode(op)
102 312ac745 Iustin Pop
    inames = [row[0] for row in idata]
103 312ac745 Iustin Pop
104 312ac745 Iustin Pop
  else:
105 312ac745 Iustin Pop
    raise errors.OpPrereqError("Unknown mode '%s'" % mode)
106 312ac745 Iustin Pop
107 312ac745 Iustin Pop
  return inames
108 a8083063 Iustin Pop
109 a8083063 Iustin Pop
110 804a1e8e Iustin Pop
def _ConfirmOperation(inames, text):
111 804a1e8e Iustin Pop
  """Ask the user to confirm an operation on a list of instances.
112 804a1e8e Iustin Pop
113 804a1e8e Iustin Pop
  This function is used to request confirmation for doing an operation
114 804a1e8e Iustin Pop
  on a given list of instances.
115 804a1e8e Iustin Pop
116 804a1e8e Iustin Pop
  The inames argument is what the selection algorithm computed, and
117 804a1e8e Iustin Pop
  the text argument is the operation we should tell the user to
118 804a1e8e Iustin Pop
  confirm (e.g. 'shutdown' or 'startup').
119 804a1e8e Iustin Pop
120 804a1e8e Iustin Pop
  Returns: boolean depending on user's confirmation.
121 804a1e8e Iustin Pop
122 804a1e8e Iustin Pop
  """
123 804a1e8e Iustin Pop
  count = len(inames)
124 804a1e8e Iustin Pop
  msg = ("The %s will operate on %d instances.\n"
125 804a1e8e Iustin Pop
         "Do you want to continue?" % (text, count))
126 804a1e8e Iustin Pop
  affected = ("\nAffected instances:\n" +
127 804a1e8e Iustin Pop
              "\n".join(["  %s" % name for name in inames]))
128 804a1e8e Iustin Pop
129 804a1e8e Iustin Pop
  choices = [('y', True, 'Yes, execute the %s' % text),
130 804a1e8e Iustin Pop
             ('n', False, 'No, abort the %s' % text)]
131 804a1e8e Iustin Pop
132 804a1e8e Iustin Pop
  if count > 20:
133 804a1e8e Iustin Pop
    choices.insert(1, ('v', 'v', 'View the list of affected instances'))
134 804a1e8e Iustin Pop
    ask = msg
135 804a1e8e Iustin Pop
  else:
136 804a1e8e Iustin Pop
    ask = msg + affected
137 804a1e8e Iustin Pop
138 804a1e8e Iustin Pop
  choice = AskUser(ask, choices)
139 804a1e8e Iustin Pop
  if choice == 'v':
140 804a1e8e Iustin Pop
    choices.pop(1)
141 5e66b7e6 Iustin Pop
    choice = AskUser(msg + affected, choices)
142 804a1e8e Iustin Pop
  return choice
143 804a1e8e Iustin Pop
144 804a1e8e Iustin Pop
145 973d7867 Iustin Pop
def _TransformPath(user_input):
146 973d7867 Iustin Pop
  """Transform a user path into a canonical value.
147 973d7867 Iustin Pop
148 973d7867 Iustin Pop
  This function transforms the a path passed as textual information
149 973d7867 Iustin Pop
  into the constants that the LU code expects.
150 973d7867 Iustin Pop
151 973d7867 Iustin Pop
  """
152 973d7867 Iustin Pop
  if user_input:
153 973d7867 Iustin Pop
    if user_input.lower() == "default":
154 973d7867 Iustin Pop
      result_path = constants.VALUE_DEFAULT
155 973d7867 Iustin Pop
    elif user_input.lower() == "none":
156 973d7867 Iustin Pop
      result_path = constants.VALUE_NONE
157 973d7867 Iustin Pop
    else:
158 973d7867 Iustin Pop
      if not os.path.isabs(user_input):
159 973d7867 Iustin Pop
        raise errors.OpPrereqError("Path '%s' is not an absolute filename" %
160 973d7867 Iustin Pop
                                   user_input)
161 973d7867 Iustin Pop
      result_path = user_input
162 973d7867 Iustin Pop
  else:
163 973d7867 Iustin Pop
    result_path = constants.VALUE_DEFAULT
164 973d7867 Iustin Pop
165 973d7867 Iustin Pop
  return result_path
166 973d7867 Iustin Pop
167 973d7867 Iustin Pop
168 a8083063 Iustin Pop
def ListInstances(opts, args):
169 f5abe9bd Oleksiy Mishchenko
  """List instances and their properties.
170 a8083063 Iustin Pop
171 a8083063 Iustin Pop
  """
172 a8083063 Iustin Pop
  if opts.output is None:
173 48c4dfa8 Iustin Pop
    selected_fields = _LIST_DEF_FIELDS
174 48c4dfa8 Iustin Pop
  elif opts.output.startswith("+"):
175 48c4dfa8 Iustin Pop
    selected_fields = _LIST_DEF_FIELDS + opts.output[1:].split(",")
176 a8083063 Iustin Pop
  else:
177 a8083063 Iustin Pop
    selected_fields = opts.output.split(",")
178 a8083063 Iustin Pop
179 1f05af2b Michael Hanselmann
  output = GetClient().QueryInstances([], selected_fields)
180 a8083063 Iustin Pop
181 a8083063 Iustin Pop
  if not opts.no_headers:
182 d8052456 Iustin Pop
    headers = {
183 d8052456 Iustin Pop
      "name": "Instance", "os": "OS", "pnode": "Primary_node",
184 d8052456 Iustin Pop
      "snodes": "Secondary_Nodes", "admin_state": "Autostart",
185 d8052456 Iustin Pop
      "oper_state": "Running", "admin_ram": "Configured_memory",
186 d8052456 Iustin Pop
      "oper_ram": "Memory", "disk_template": "Disk_template",
187 d8052456 Iustin Pop
      "ip": "IP Address", "mac": "MAC Address",
188 d8052456 Iustin Pop
      "bridge": "Bridge", "vcpus": "VCPUs",
189 d8052456 Iustin Pop
      "sda_size": "Disk/0", "sdb_size": "Disk/1",
190 130a6a6f Iustin Pop
      "status": "Status", "tags": "Tags",
191 d8052456 Iustin Pop
      }
192 137161c9 Michael Hanselmann
  else:
193 137161c9 Michael Hanselmann
    headers = None
194 137161c9 Michael Hanselmann
195 137161c9 Michael Hanselmann
  if opts.human_readable:
196 644eeef9 Iustin Pop
    unitfields = ["admin_ram", "oper_ram", "sda_size", "sdb_size"]
197 137161c9 Michael Hanselmann
  else:
198 137161c9 Michael Hanselmann
    unitfields = None
199 137161c9 Michael Hanselmann
200 d6d415e8 Iustin Pop
  numfields = ["admin_ram", "oper_ram", "sda_size", "sdb_size", "vcpus"]
201 137161c9 Michael Hanselmann
202 130a6a6f Iustin Pop
  list_type_fields = ("tags",)
203 8a23d2d3 Iustin Pop
  # change raw values to nicer strings
204 8a23d2d3 Iustin Pop
  for row in output:
205 8a23d2d3 Iustin Pop
    for idx, field in enumerate(selected_fields):
206 8a23d2d3 Iustin Pop
      val = row[idx]
207 8a23d2d3 Iustin Pop
      if field == "snodes":
208 8a23d2d3 Iustin Pop
        val = ",".join(val) or "-"
209 8a23d2d3 Iustin Pop
      elif field == "admin_state":
210 8a23d2d3 Iustin Pop
        if val:
211 8a23d2d3 Iustin Pop
          val = "yes"
212 8a23d2d3 Iustin Pop
        else:
213 8a23d2d3 Iustin Pop
          val = "no"
214 8a23d2d3 Iustin Pop
      elif field == "oper_state":
215 8a23d2d3 Iustin Pop
        if val is None:
216 8a23d2d3 Iustin Pop
          val = "(node down)"
217 8a23d2d3 Iustin Pop
        elif val: # True
218 8a23d2d3 Iustin Pop
          val = "running"
219 8a23d2d3 Iustin Pop
        else:
220 8a23d2d3 Iustin Pop
          val = "stopped"
221 8a23d2d3 Iustin Pop
      elif field == "oper_ram":
222 8a23d2d3 Iustin Pop
        if val is None:
223 8a23d2d3 Iustin Pop
          val = "(node down)"
224 8a23d2d3 Iustin Pop
      elif field == "sda_size" or field == "sdb_size":
225 8a23d2d3 Iustin Pop
        if val is None:
226 8a23d2d3 Iustin Pop
          val = "N/A"
227 130a6a6f Iustin Pop
      elif field in list_type_fields:
228 130a6a6f Iustin Pop
        val = ",".join(val)
229 8a23d2d3 Iustin Pop
      row[idx] = str(val)
230 8a23d2d3 Iustin Pop
231 16be8703 Iustin Pop
  data = GenerateTable(separator=opts.separator, headers=headers,
232 16be8703 Iustin Pop
                       fields=selected_fields, unitfields=unitfields,
233 16be8703 Iustin Pop
                       numfields=numfields, data=output)
234 16be8703 Iustin Pop
235 16be8703 Iustin Pop
  for line in data:
236 16be8703 Iustin Pop
    logger.ToStdout(line)
237 a8083063 Iustin Pop
238 a8083063 Iustin Pop
  return 0
239 a8083063 Iustin Pop
240 a8083063 Iustin Pop
241 a8083063 Iustin Pop
def AddInstance(opts, args):
242 a8083063 Iustin Pop
  """Add an instance to the cluster.
243 a8083063 Iustin Pop
244 a8083063 Iustin Pop
  Args:
245 a8083063 Iustin Pop
    opts - class with options as members
246 a8083063 Iustin Pop
    args - list with a single element, the instance name
247 a8083063 Iustin Pop
  Opts used:
248 a8083063 Iustin Pop
    mem - amount of memory to allocate to instance (MiB)
249 a8083063 Iustin Pop
    size - amount of disk space to allocate to instance (MiB)
250 a8083063 Iustin Pop
    os - which OS to run on instance
251 a8083063 Iustin Pop
    node - node to run new instance on
252 a8083063 Iustin Pop
253 a8083063 Iustin Pop
  """
254 a8083063 Iustin Pop
  instance = args[0]
255 a8083063 Iustin Pop
256 60d49723 Michael Hanselmann
  (pnode, snode) = SplitNodeOption(opts.node)
257 60d49723 Michael Hanselmann
258 3b6d8c9b Iustin Pop
  kernel_path = _TransformPath(opts.kernel_path)
259 3b6d8c9b Iustin Pop
  initrd_path = _TransformPath(opts.initrd_path)
260 3b6d8c9b Iustin Pop
261 31a853d2 Iustin Pop
  hvm_acpi = opts.hvm_acpi == _VALUE_TRUE
262 31a853d2 Iustin Pop
  hvm_pae = opts.hvm_pae == _VALUE_TRUE
263 31a853d2 Iustin Pop
264 31a853d2 Iustin Pop
  if ((opts.hvm_cdrom_image_path is not None) and
265 31a853d2 Iustin Pop
      (opts.hvm_cdrom_image_path.lower() == constants.VALUE_NONE)):
266 31a853d2 Iustin Pop
    hvm_cdrom_image_path = None
267 31a853d2 Iustin Pop
  else:
268 31a853d2 Iustin Pop
    hvm_cdrom_image_path = opts.hvm_cdrom_image_path
269 31a853d2 Iustin Pop
270 a8083063 Iustin Pop
  op = opcodes.OpCreateInstance(instance_name=instance, mem_size=opts.mem,
271 a8083063 Iustin Pop
                                disk_size=opts.size, swap_size=opts.swap,
272 a8083063 Iustin Pop
                                disk_template=opts.disk_template,
273 a8083063 Iustin Pop
                                mode=constants.INSTANCE_CREATE,
274 60d49723 Michael Hanselmann
                                os_type=opts.os, pnode=pnode,
275 60d49723 Michael Hanselmann
                                snode=snode, vcpus=opts.vcpus,
276 bdd55f71 Iustin Pop
                                ip=opts.ip, bridge=opts.bridge,
277 bdd55f71 Iustin Pop
                                start=opts.start, ip_check=opts.ip_check,
278 3b6d8c9b Iustin Pop
                                wait_for_sync=opts.wait_for_sync,
279 3b6d8c9b Iustin Pop
                                mac=opts.mac,
280 3b6d8c9b Iustin Pop
                                kernel_path=kernel_path,
281 25c5878d Alexander Schreiber
                                initrd_path=initrd_path,
282 31a853d2 Iustin Pop
                                iallocator=opts.iallocator,
283 45873083 Manuel Franceschini
                                hvm_boot_order=opts.hvm_boot_order,
284 35a0d128 Iustin Pop
                                file_storage_dir=opts.file_storage_dir,
285 35a0d128 Iustin Pop
                                file_driver=opts.file_driver,
286 31a853d2 Iustin Pop
                                hvm_acpi=hvm_acpi, hvm_pae=hvm_pae,
287 31a853d2 Iustin Pop
                                hvm_cdrom_image_path=hvm_cdrom_image_path,
288 31a853d2 Iustin Pop
                                vnc_bind_address=opts.vnc_bind_address)
289 31a853d2 Iustin Pop
290 a8083063 Iustin Pop
  SubmitOpCode(op)
291 a8083063 Iustin Pop
  return 0
292 a8083063 Iustin Pop
293 a8083063 Iustin Pop
294 fe7b0351 Michael Hanselmann
def ReinstallInstance(opts, args):
295 fe7b0351 Michael Hanselmann
  """Reinstall an instance.
296 fe7b0351 Michael Hanselmann
297 fe7b0351 Michael Hanselmann
  Args:
298 fe7b0351 Michael Hanselmann
    opts - class with options as members
299 fe7b0351 Michael Hanselmann
    args - list containing a single element, the instance name
300 fe7b0351 Michael Hanselmann
301 fe7b0351 Michael Hanselmann
  """
302 fe7b0351 Michael Hanselmann
  instance_name = args[0]
303 fe7b0351 Michael Hanselmann
304 fe7b0351 Michael Hanselmann
  if not opts.force:
305 f4bc1f2c Michael Hanselmann
    usertext = ("This will reinstall the instance %s and remove"
306 f4bc1f2c Michael Hanselmann
                " all data. Continue?") % instance_name
307 47988778 Iustin Pop
    if not AskUser(usertext):
308 fe7b0351 Michael Hanselmann
      return 1
309 fe7b0351 Michael Hanselmann
310 d0834de3 Michael Hanselmann
  op = opcodes.OpReinstallInstance(instance_name=instance_name,
311 d0834de3 Michael Hanselmann
                                   os_type=opts.os)
312 fe7b0351 Michael Hanselmann
  SubmitOpCode(op)
313 fe7b0351 Michael Hanselmann
314 fe7b0351 Michael Hanselmann
  return 0
315 fe7b0351 Michael Hanselmann
316 fe7b0351 Michael Hanselmann
317 a8083063 Iustin Pop
def RemoveInstance(opts, args):
318 a8083063 Iustin Pop
  """Remove an instance.
319 a8083063 Iustin Pop
320 a8083063 Iustin Pop
  Args:
321 a8083063 Iustin Pop
    opts - class with options as members
322 a8083063 Iustin Pop
    args - list containing a single element, the instance name
323 a8083063 Iustin Pop
324 a8083063 Iustin Pop
  """
325 a8083063 Iustin Pop
  instance_name = args[0]
326 a8083063 Iustin Pop
  force = opts.force
327 a8083063 Iustin Pop
328 a8083063 Iustin Pop
  if not force:
329 a8083063 Iustin Pop
    usertext = ("This will remove the volumes of the instance %s"
330 a8083063 Iustin Pop
                " (including mirrors), thus removing all the data"
331 a8083063 Iustin Pop
                " of the instance. Continue?") % instance_name
332 47988778 Iustin Pop
    if not AskUser(usertext):
333 a8083063 Iustin Pop
      return 1
334 a8083063 Iustin Pop
335 1d67656e Iustin Pop
  op = opcodes.OpRemoveInstance(instance_name=instance_name,
336 1d67656e Iustin Pop
                                ignore_failures=opts.ignore_failures)
337 a8083063 Iustin Pop
  SubmitOpCode(op)
338 a8083063 Iustin Pop
  return 0
339 a8083063 Iustin Pop
340 a8083063 Iustin Pop
341 decd5f45 Iustin Pop
def RenameInstance(opts, args):
342 4ab0b9e3 Guido Trotter
  """Rename an instance.
343 decd5f45 Iustin Pop
344 decd5f45 Iustin Pop
  Args:
345 decd5f45 Iustin Pop
    opts - class with options as members
346 decd5f45 Iustin Pop
    args - list containing two elements, the instance name and the new name
347 decd5f45 Iustin Pop
348 decd5f45 Iustin Pop
  """
349 decd5f45 Iustin Pop
  op = opcodes.OpRenameInstance(instance_name=args[0],
350 decd5f45 Iustin Pop
                                new_name=args[1],
351 decd5f45 Iustin Pop
                                ignore_ip=opts.ignore_ip)
352 decd5f45 Iustin Pop
  SubmitOpCode(op)
353 decd5f45 Iustin Pop
354 decd5f45 Iustin Pop
  return 0
355 decd5f45 Iustin Pop
356 decd5f45 Iustin Pop
357 a8083063 Iustin Pop
def ActivateDisks(opts, args):
358 a8083063 Iustin Pop
  """Activate an instance's disks.
359 a8083063 Iustin Pop
360 a8083063 Iustin Pop
  This serves two purposes:
361 a8083063 Iustin Pop
    - it allows one (as long as the instance is not running) to mount
362 a8083063 Iustin Pop
    the disks and modify them from the node
363 a8083063 Iustin Pop
    - it repairs inactive secondary drbds
364 a8083063 Iustin Pop
365 a8083063 Iustin Pop
  """
366 a8083063 Iustin Pop
  instance_name = args[0]
367 a8083063 Iustin Pop
  op = opcodes.OpActivateInstanceDisks(instance_name=instance_name)
368 a8083063 Iustin Pop
  disks_info = SubmitOpCode(op)
369 a8083063 Iustin Pop
  for host, iname, nname in disks_info:
370 a8083063 Iustin Pop
    print "%s:%s:%s" % (host, iname, nname)
371 a8083063 Iustin Pop
  return 0
372 a8083063 Iustin Pop
373 a8083063 Iustin Pop
374 a8083063 Iustin Pop
def DeactivateDisks(opts, args):
375 a8083063 Iustin Pop
  """Command-line interface for _ShutdownInstanceBlockDevices.
376 a8083063 Iustin Pop
377 a8083063 Iustin Pop
  This function takes the instance name, looks for its primary node
378 a8083063 Iustin Pop
  and the tries to shutdown its block devices on that node.
379 a8083063 Iustin Pop
380 a8083063 Iustin Pop
  """
381 a8083063 Iustin Pop
  instance_name = args[0]
382 a8083063 Iustin Pop
  op = opcodes.OpDeactivateInstanceDisks(instance_name=instance_name)
383 a8083063 Iustin Pop
  SubmitOpCode(op)
384 a8083063 Iustin Pop
  return 0
385 a8083063 Iustin Pop
386 a8083063 Iustin Pop
387 c6e911bc Iustin Pop
def GrowDisk(opts, args):
388 c6e911bc Iustin Pop
  """Command-line interface for _ShutdownInstanceBlockDevices.
389 c6e911bc Iustin Pop
390 c6e911bc Iustin Pop
  This function takes the instance name, looks for its primary node
391 c6e911bc Iustin Pop
  and the tries to shutdown its block devices on that node.
392 c6e911bc Iustin Pop
393 c6e911bc Iustin Pop
  """
394 c6e911bc Iustin Pop
  instance = args[0]
395 c6e911bc Iustin Pop
  disk = args[1]
396 c6e911bc Iustin Pop
  amount = utils.ParseUnit(args[2])
397 c6e911bc Iustin Pop
  op = opcodes.OpGrowDisk(instance_name=instance, disk=disk, amount=amount)
398 c6e911bc Iustin Pop
  SubmitOpCode(op)
399 c6e911bc Iustin Pop
  return 0
400 c6e911bc Iustin Pop
401 c6e911bc Iustin Pop
402 a8083063 Iustin Pop
def StartupInstance(opts, args):
403 decd5f45 Iustin Pop
  """Startup an instance.
404 a8083063 Iustin Pop
405 a8083063 Iustin Pop
  Args:
406 a8083063 Iustin Pop
    opts - class with options as members
407 a8083063 Iustin Pop
    args - list containing a single element, the instance name
408 a8083063 Iustin Pop
409 a8083063 Iustin Pop
  """
410 312ac745 Iustin Pop
  if opts.multi_mode is None:
411 312ac745 Iustin Pop
    opts.multi_mode = _SHUTDOWN_INSTANCES
412 312ac745 Iustin Pop
  inames = _ExpandMultiNames(opts.multi_mode, args)
413 bcee9cb4 Iustin Pop
  if not inames:
414 bcee9cb4 Iustin Pop
    raise errors.OpPrereqError("Selection filter does not match any instances")
415 804a1e8e Iustin Pop
  multi_on = opts.multi_mode != _SHUTDOWN_INSTANCES or len(inames) > 1
416 804a1e8e Iustin Pop
  if not (opts.force_multi or not multi_on
417 804a1e8e Iustin Pop
          or _ConfirmOperation(inames, "startup")):
418 804a1e8e Iustin Pop
    return 1
419 312ac745 Iustin Pop
  for name in inames:
420 312ac745 Iustin Pop
    op = opcodes.OpStartupInstance(instance_name=name,
421 312ac745 Iustin Pop
                                   force=opts.force,
422 312ac745 Iustin Pop
                                   extra_args=opts.extra_args)
423 312ac745 Iustin Pop
    if multi_on:
424 312ac745 Iustin Pop
      logger.ToStdout("Starting up %s" % name)
425 312ac745 Iustin Pop
    SubmitOpCode(op)
426 a8083063 Iustin Pop
  return 0
427 a8083063 Iustin Pop
428 7c0d6283 Michael Hanselmann
429 579d4337 Alexander Schreiber
def RebootInstance(opts, args):
430 579d4337 Alexander Schreiber
  """Reboot an instance
431 579d4337 Alexander Schreiber
432 579d4337 Alexander Schreiber
  Args:
433 579d4337 Alexander Schreiber
    opts - class with options as members
434 579d4337 Alexander Schreiber
    args - list containing a single element, the instance name
435 579d4337 Alexander Schreiber
436 579d4337 Alexander Schreiber
  """
437 579d4337 Alexander Schreiber
  if opts.multi_mode is None:
438 579d4337 Alexander Schreiber
    opts.multi_mode = _SHUTDOWN_INSTANCES
439 579d4337 Alexander Schreiber
  inames = _ExpandMultiNames(opts.multi_mode, args)
440 bcee9cb4 Iustin Pop
  if not inames:
441 bcee9cb4 Iustin Pop
    raise errors.OpPrereqError("Selection filter does not match any instances")
442 579d4337 Alexander Schreiber
  multi_on = opts.multi_mode != _SHUTDOWN_INSTANCES or len(inames) > 1
443 579d4337 Alexander Schreiber
  if not (opts.force_multi or not multi_on
444 579d4337 Alexander Schreiber
          or _ConfirmOperation(inames, "reboot")):
445 579d4337 Alexander Schreiber
    return 1
446 579d4337 Alexander Schreiber
  for name in inames:
447 579d4337 Alexander Schreiber
    op = opcodes.OpRebootInstance(instance_name=name,
448 579d4337 Alexander Schreiber
                                  reboot_type=opts.reboot_type,
449 579d4337 Alexander Schreiber
                                  ignore_secondaries=opts.ignore_secondaries)
450 579d4337 Alexander Schreiber
451 579d4337 Alexander Schreiber
    SubmitOpCode(op)
452 579d4337 Alexander Schreiber
  return 0
453 a8083063 Iustin Pop
454 7c0d6283 Michael Hanselmann
455 a8083063 Iustin Pop
def ShutdownInstance(opts, args):
456 a8083063 Iustin Pop
  """Shutdown an instance.
457 a8083063 Iustin Pop
458 a8083063 Iustin Pop
  Args:
459 a8083063 Iustin Pop
    opts - class with options as members
460 a8083063 Iustin Pop
    args - list containing a single element, the instance name
461 a8083063 Iustin Pop
462 a8083063 Iustin Pop
  """
463 312ac745 Iustin Pop
  if opts.multi_mode is None:
464 312ac745 Iustin Pop
    opts.multi_mode = _SHUTDOWN_INSTANCES
465 312ac745 Iustin Pop
  inames = _ExpandMultiNames(opts.multi_mode, args)
466 bcee9cb4 Iustin Pop
  if not inames:
467 bcee9cb4 Iustin Pop
    raise errors.OpPrereqError("Selection filter does not match any instances")
468 804a1e8e Iustin Pop
  multi_on = opts.multi_mode != _SHUTDOWN_INSTANCES or len(inames) > 1
469 804a1e8e Iustin Pop
  if not (opts.force_multi or not multi_on
470 804a1e8e Iustin Pop
          or _ConfirmOperation(inames, "shutdown")):
471 804a1e8e Iustin Pop
    return 1
472 312ac745 Iustin Pop
  for name in inames:
473 312ac745 Iustin Pop
    op = opcodes.OpShutdownInstance(instance_name=name)
474 312ac745 Iustin Pop
    if multi_on:
475 312ac745 Iustin Pop
      logger.ToStdout("Shutting down %s" % name)
476 312ac745 Iustin Pop
    SubmitOpCode(op)
477 a8083063 Iustin Pop
  return 0
478 a8083063 Iustin Pop
479 a8083063 Iustin Pop
480 a8083063 Iustin Pop
def ReplaceDisks(opts, args):
481 a8083063 Iustin Pop
  """Replace the disks of an instance
482 a8083063 Iustin Pop
483 a8083063 Iustin Pop
  Args:
484 a8083063 Iustin Pop
    opts - class with options as members
485 a8083063 Iustin Pop
    args - list with a single element, the instance name
486 a8083063 Iustin Pop
487 a8083063 Iustin Pop
  """
488 a8083063 Iustin Pop
  instance_name = args[0]
489 a9e0c397 Iustin Pop
  new_2ndary = opts.new_secondary
490 b6e82a65 Iustin Pop
  iallocator = opts.iallocator
491 a9e0c397 Iustin Pop
  if opts.disks is None:
492 a9e0c397 Iustin Pop
    disks = ["sda", "sdb"]
493 a9e0c397 Iustin Pop
  else:
494 a9e0c397 Iustin Pop
    disks = opts.disks.split(",")
495 a9e0c397 Iustin Pop
  if opts.on_primary == opts.on_secondary: # no -p or -s passed, or both passed
496 a9e0c397 Iustin Pop
    mode = constants.REPLACE_DISK_ALL
497 a9e0c397 Iustin Pop
  elif opts.on_primary: # only on primary:
498 a9e0c397 Iustin Pop
    mode = constants.REPLACE_DISK_PRI
499 b6e82a65 Iustin Pop
    if new_2ndary is not None or iallocator is not None:
500 a9e0c397 Iustin Pop
      raise errors.OpPrereqError("Can't change secondary node on primary disk"
501 a9e0c397 Iustin Pop
                                 " replacement")
502 b6e82a65 Iustin Pop
  elif opts.on_secondary is not None or iallocator is not None:
503 b6e82a65 Iustin Pop
    # only on secondary
504 a9e0c397 Iustin Pop
    mode = constants.REPLACE_DISK_SEC
505 a9e0c397 Iustin Pop
506 a9e0c397 Iustin Pop
  op = opcodes.OpReplaceDisks(instance_name=args[0], disks=disks,
507 b6e82a65 Iustin Pop
                              remote_node=new_2ndary, mode=mode,
508 b6e82a65 Iustin Pop
                              iallocator=iallocator)
509 a8083063 Iustin Pop
  SubmitOpCode(op)
510 a8083063 Iustin Pop
  return 0
511 a8083063 Iustin Pop
512 a8083063 Iustin Pop
513 a8083063 Iustin Pop
def FailoverInstance(opts, args):
514 a8083063 Iustin Pop
  """Failover an instance.
515 a8083063 Iustin Pop
516 a8083063 Iustin Pop
  The failover is done by shutting it down on its present node and
517 a8083063 Iustin Pop
  starting it on the secondary.
518 a8083063 Iustin Pop
519 a8083063 Iustin Pop
  Args:
520 a8083063 Iustin Pop
    opts - class with options as members
521 a8083063 Iustin Pop
    args - list with a single element, the instance name
522 a8083063 Iustin Pop
  Opts used:
523 a8083063 Iustin Pop
    force - whether to failover without asking questions.
524 a8083063 Iustin Pop
525 a8083063 Iustin Pop
  """
526 80de0e3f Iustin Pop
  instance_name = args[0]
527 80de0e3f Iustin Pop
  force = opts.force
528 a8083063 Iustin Pop
529 80de0e3f Iustin Pop
  if not force:
530 80de0e3f Iustin Pop
    usertext = ("Failover will happen to image %s."
531 80de0e3f Iustin Pop
                " This requires a shutdown of the instance. Continue?" %
532 80de0e3f Iustin Pop
                (instance_name,))
533 80de0e3f Iustin Pop
    if not AskUser(usertext):
534 80de0e3f Iustin Pop
      return 1
535 a8083063 Iustin Pop
536 80de0e3f Iustin Pop
  op = opcodes.OpFailoverInstance(instance_name=instance_name,
537 80de0e3f Iustin Pop
                                  ignore_consistency=opts.ignore_consistency)
538 80de0e3f Iustin Pop
  SubmitOpCode(op)
539 80de0e3f Iustin Pop
  return 0
540 a8083063 Iustin Pop
541 a8083063 Iustin Pop
542 a8083063 Iustin Pop
def ConnectToInstanceConsole(opts, args):
543 a8083063 Iustin Pop
  """Connect to the console of an instance.
544 a8083063 Iustin Pop
545 a8083063 Iustin Pop
  Args:
546 a8083063 Iustin Pop
    opts - class with options as members
547 a8083063 Iustin Pop
    args - list with a single element, the instance name
548 a8083063 Iustin Pop
549 a8083063 Iustin Pop
  """
550 a8083063 Iustin Pop
  instance_name = args[0]
551 a8083063 Iustin Pop
552 a8083063 Iustin Pop
  op = opcodes.OpConnectConsole(instance_name=instance_name)
553 0a80a26f Michael Hanselmann
  cmd = SubmitOpCode(op)
554 51c6e7b5 Michael Hanselmann
555 51c6e7b5 Michael Hanselmann
  if opts.show_command:
556 51c6e7b5 Michael Hanselmann
    print utils.ShellQuoteArgs(cmd)
557 51c6e7b5 Michael Hanselmann
  else:
558 51c6e7b5 Michael Hanselmann
    try:
559 51c6e7b5 Michael Hanselmann
      os.execvp(cmd[0], cmd)
560 51c6e7b5 Michael Hanselmann
    finally:
561 51c6e7b5 Michael Hanselmann
      sys.stderr.write("Can't run console command %s with arguments:\n'%s'" %
562 51c6e7b5 Michael Hanselmann
                       (cmd, " ".join(argv)))
563 51c6e7b5 Michael Hanselmann
      os._exit(1)
564 a8083063 Iustin Pop
565 a8083063 Iustin Pop
566 a8083063 Iustin Pop
def _FormatBlockDevInfo(buf, dev, indent_level):
567 a8083063 Iustin Pop
  """Show block device information.
568 a8083063 Iustin Pop
569 a8083063 Iustin Pop
  This is only used by ShowInstanceConfig(), but it's too big to be
570 a8083063 Iustin Pop
  left for an inline definition.
571 a8083063 Iustin Pop
572 a8083063 Iustin Pop
  """
573 a8083063 Iustin Pop
  def helper(buf, dtype, status):
574 f2e9e0e8 Alexander Schreiber
    """Format one line for physical device status."""
575 a8083063 Iustin Pop
    if not status:
576 a8083063 Iustin Pop
      buf.write("not active\n")
577 a8083063 Iustin Pop
    else:
578 0834c866 Iustin Pop
      (path, major, minor, syncp, estt, degr, ldisk) = status
579 fd38ef95 Manuel Franceschini
      if major is None:
580 fd38ef95 Manuel Franceschini
        major_string = "N/A"
581 fd38ef95 Manuel Franceschini
      else:
582 fd38ef95 Manuel Franceschini
        major_string = str(major)
583 fd38ef95 Manuel Franceschini
584 fd38ef95 Manuel Franceschini
      if minor is None:
585 fd38ef95 Manuel Franceschini
        minor_string = "N/A"
586 fd38ef95 Manuel Franceschini
      else:
587 fd38ef95 Manuel Franceschini
        minor_string = str(minor)
588 fd38ef95 Manuel Franceschini
589 fd38ef95 Manuel Franceschini
      buf.write("%s (%s:%s)" % (path, major_string, minor_string))
590 00fb8246 Michael Hanselmann
      if dtype in (constants.LD_DRBD8, ):
591 a8083063 Iustin Pop
        if syncp is not None:
592 a8083063 Iustin Pop
          sync_text = "*RECOVERING* %5.2f%%," % syncp
593 a8083063 Iustin Pop
          if estt:
594 a8083063 Iustin Pop
            sync_text += " ETA %ds" % estt
595 a8083063 Iustin Pop
          else:
596 a8083063 Iustin Pop
            sync_text += " ETA unknown"
597 a8083063 Iustin Pop
        else:
598 a8083063 Iustin Pop
          sync_text = "in sync"
599 a8083063 Iustin Pop
        if degr:
600 a8083063 Iustin Pop
          degr_text = "*DEGRADED*"
601 a8083063 Iustin Pop
        else:
602 a8083063 Iustin Pop
          degr_text = "ok"
603 0834c866 Iustin Pop
        if ldisk:
604 0834c866 Iustin Pop
          ldisk_text = " *MISSING DISK*"
605 0834c866 Iustin Pop
        else:
606 0834c866 Iustin Pop
          ldisk_text = ""
607 0834c866 Iustin Pop
        buf.write(" %s, status %s%s" % (sync_text, degr_text, ldisk_text))
608 9db6dbce Iustin Pop
      elif dtype == constants.LD_LV:
609 0834c866 Iustin Pop
        if ldisk:
610 0834c866 Iustin Pop
          ldisk_text = " *FAILED* (failed drive?)"
611 9db6dbce Iustin Pop
        else:
612 0834c866 Iustin Pop
          ldisk_text = ""
613 0834c866 Iustin Pop
        buf.write(ldisk_text)
614 a8083063 Iustin Pop
      buf.write("\n")
615 a8083063 Iustin Pop
616 a8083063 Iustin Pop
  if dev["iv_name"] is not None:
617 a8083063 Iustin Pop
    data = "  - %s, " % dev["iv_name"]
618 a8083063 Iustin Pop
  else:
619 a8083063 Iustin Pop
    data = "  - "
620 a8083063 Iustin Pop
  data += "type: %s" % dev["dev_type"]
621 a8083063 Iustin Pop
  if dev["logical_id"] is not None:
622 a8083063 Iustin Pop
    data += ", logical_id: %s" % (dev["logical_id"],)
623 a8083063 Iustin Pop
  elif dev["physical_id"] is not None:
624 a8083063 Iustin Pop
    data += ", physical_id: %s" % (dev["physical_id"],)
625 a8083063 Iustin Pop
  buf.write("%*s%s\n" % (2*indent_level, "", data))
626 a8083063 Iustin Pop
  buf.write("%*s    primary:   " % (2*indent_level, ""))
627 a8083063 Iustin Pop
  helper(buf, dev["dev_type"], dev["pstatus"])
628 a8083063 Iustin Pop
629 a8083063 Iustin Pop
  if dev["sstatus"]:
630 a8083063 Iustin Pop
    buf.write("%*s    secondary: " % (2*indent_level, ""))
631 a8083063 Iustin Pop
    helper(buf, dev["dev_type"], dev["sstatus"])
632 a8083063 Iustin Pop
633 a8083063 Iustin Pop
  if dev["children"]:
634 a8083063 Iustin Pop
    for child in dev["children"]:
635 a8083063 Iustin Pop
      _FormatBlockDevInfo(buf, child, indent_level+1)
636 a8083063 Iustin Pop
637 a8083063 Iustin Pop
638 a8083063 Iustin Pop
def ShowInstanceConfig(opts, args):
639 a8083063 Iustin Pop
  """Compute instance run-time status.
640 a8083063 Iustin Pop
641 a8083063 Iustin Pop
  """
642 a8083063 Iustin Pop
  retcode = 0
643 a8083063 Iustin Pop
  op = opcodes.OpQueryInstanceData(instances=args)
644 a8083063 Iustin Pop
  result = SubmitOpCode(op)
645 a8340917 Iustin Pop
  hvm_parameters = ("hvm_acpi", "hvm_pae", "hvm_cdrom_image_path",
646 a8340917 Iustin Pop
                    "hvm_boot_order")
647 a8340917 Iustin Pop
648 a8340917 Iustin Pop
  pvm_parameters = ("kernel_path", "initrd_path")
649 a8083063 Iustin Pop
650 a8083063 Iustin Pop
  if not result:
651 a8083063 Iustin Pop
    logger.ToStdout("No instances.")
652 a8083063 Iustin Pop
    return 1
653 a8083063 Iustin Pop
654 a8083063 Iustin Pop
  buf = StringIO()
655 a8083063 Iustin Pop
  retcode = 0
656 a8083063 Iustin Pop
  for instance_name in result:
657 a8083063 Iustin Pop
    instance = result[instance_name]
658 a8083063 Iustin Pop
    buf.write("Instance name: %s\n" % instance["name"])
659 a8083063 Iustin Pop
    buf.write("State: configured to be %s, actual state is %s\n" %
660 a8083063 Iustin Pop
              (instance["config_state"], instance["run_state"]))
661 a8083063 Iustin Pop
    buf.write("  Nodes:\n")
662 a8083063 Iustin Pop
    buf.write("    - primary: %s\n" % instance["pnode"])
663 a8083063 Iustin Pop
    buf.write("    - secondaries: %s\n" % ", ".join(instance["snodes"]))
664 a8083063 Iustin Pop
    buf.write("  Operating system: %s\n" % instance["os"])
665 a8340917 Iustin Pop
    if instance.has_key("network_port"):
666 a8340917 Iustin Pop
      buf.write("  Allocated network port: %s\n" % instance["network_port"])
667 a8340917 Iustin Pop
    if False not in map(instance.has_key, pvm_parameters):
668 a8340917 Iustin Pop
      if instance["kernel_path"] in (None, constants.VALUE_DEFAULT):
669 a8340917 Iustin Pop
        kpath = "(default: %s)" % constants.XEN_KERNEL
670 a8340917 Iustin Pop
      else:
671 a8340917 Iustin Pop
        kpath = instance["kernel_path"]
672 a8340917 Iustin Pop
      buf.write("  Kernel path: %s\n" % kpath)
673 a8340917 Iustin Pop
      if instance["initrd_path"] in (None, constants.VALUE_DEFAULT):
674 a8340917 Iustin Pop
        initrd = "(default: %s)" % constants.XEN_INITRD
675 a8340917 Iustin Pop
      elif instance["initrd_path"] == constants.VALUE_NONE:
676 a8340917 Iustin Pop
        initrd = "(none)"
677 a8340917 Iustin Pop
      else:
678 a8340917 Iustin Pop
        initrd = instance["initrd_path"]
679 a8340917 Iustin Pop
      buf.write("       initrd: %s\n" % initrd)
680 a8340917 Iustin Pop
    if False not in map(instance.has_key, hvm_parameters):
681 a8340917 Iustin Pop
      buf.write("  HVM:\n")
682 a8340917 Iustin Pop
      buf.write("    - boot order: %s\n" % instance["hvm_boot_order"])
683 a8340917 Iustin Pop
      buf.write("    - ACPI support: %s\n" % instance["hvm_acpi"])
684 a8340917 Iustin Pop
      buf.write("    - PAE support: %s\n" % instance["hvm_pae"])
685 a8340917 Iustin Pop
      buf.write("    - virtual CDROM: %s\n" % instance["hvm_cdrom_image_path"])
686 a8340917 Iustin Pop
    if instance.has_key("vnc_bind_address"):
687 a8340917 Iustin Pop
      buf.write("  VNC bind address: %s\n" % instance["vnc_bind_address"])
688 a8083063 Iustin Pop
    buf.write("  Hardware:\n")
689 f55ff7ec Iustin Pop
    buf.write("    - VCPUs: %d\n" % instance["vcpus"])
690 a8083063 Iustin Pop
    buf.write("    - memory: %dMiB\n" % instance["memory"])
691 a8083063 Iustin Pop
    buf.write("    - NICs: %s\n" %
692 a8083063 Iustin Pop
        ", ".join(["{MAC: %s, IP: %s, bridge: %s}" %
693 a8083063 Iustin Pop
                   (mac, ip, bridge)
694 a8083063 Iustin Pop
                     for mac, ip, bridge in instance["nics"]]))
695 a8083063 Iustin Pop
    buf.write("  Block devices:\n")
696 a8083063 Iustin Pop
697 a8083063 Iustin Pop
    for device in instance["disks"]:
698 a8083063 Iustin Pop
      _FormatBlockDevInfo(buf, device, 1)
699 a8083063 Iustin Pop
700 a8083063 Iustin Pop
  logger.ToStdout(buf.getvalue().rstrip('\n'))
701 a8083063 Iustin Pop
  return retcode
702 a8083063 Iustin Pop
703 a8083063 Iustin Pop
704 7767bbf5 Manuel Franceschini
def SetInstanceParams(opts, args):
705 a8083063 Iustin Pop
  """Modifies an instance.
706 a8083063 Iustin Pop
707 a8083063 Iustin Pop
  All parameters take effect only at the next restart of the instance.
708 a8083063 Iustin Pop
709 a8083063 Iustin Pop
  Args:
710 a8083063 Iustin Pop
    opts - class with options as members
711 a8083063 Iustin Pop
    args - list with a single element, the instance name
712 a8083063 Iustin Pop
  Opts used:
713 a8083063 Iustin Pop
    memory - the new memory size
714 a8083063 Iustin Pop
    vcpus - the new number of cpus
715 1862d460 Alexander Schreiber
    mac - the new MAC address of the instance
716 a8083063 Iustin Pop
717 a8083063 Iustin Pop
  """
718 973d7867 Iustin Pop
  if not (opts.mem or opts.vcpus or opts.ip or opts.bridge or opts.mac or
719 31a853d2 Iustin Pop
          opts.kernel_path or opts.initrd_path or opts.hvm_boot_order or
720 917f91d5 Iustin Pop
          opts.hvm_acpi or opts.hvm_pae or opts.hvm_cdrom_image_path or
721 31a853d2 Iustin Pop
          opts.vnc_bind_address):
722 a8083063 Iustin Pop
    logger.ToStdout("Please give at least one of the parameters.")
723 a8083063 Iustin Pop
    return 1
724 a8083063 Iustin Pop
725 973d7867 Iustin Pop
  kernel_path = _TransformPath(opts.kernel_path)
726 973d7867 Iustin Pop
  initrd_path = _TransformPath(opts.initrd_path)
727 40cece88 Iustin Pop
  if opts.hvm_boot_order == 'default':
728 25c5878d Alexander Schreiber
    hvm_boot_order = constants.VALUE_DEFAULT
729 25c5878d Alexander Schreiber
  else:
730 25c5878d Alexander Schreiber
    hvm_boot_order = opts.hvm_boot_order
731 973d7867 Iustin Pop
732 3fc175f0 Alexander Schreiber
  if opts.hvm_acpi is None:
733 3fc175f0 Alexander Schreiber
    hvm_acpi = opts.hvm_acpi
734 3fc175f0 Alexander Schreiber
  else:
735 3fc175f0 Alexander Schreiber
    hvm_acpi = opts.hvm_acpi == _VALUE_TRUE
736 31a853d2 Iustin Pop
737 3fc175f0 Alexander Schreiber
  if opts.hvm_pae is None:
738 3fc175f0 Alexander Schreiber
    hvm_pae = opts.hvm_pae
739 31a853d2 Iustin Pop
  else:
740 3fc175f0 Alexander Schreiber
    hvm_pae = opts.hvm_pae == _VALUE_TRUE
741 31a853d2 Iustin Pop
742 7767bbf5 Manuel Franceschini
  op = opcodes.OpSetInstanceParams(instance_name=args[0], mem=opts.mem,
743 7767bbf5 Manuel Franceschini
                                   vcpus=opts.vcpus, ip=opts.ip,
744 7767bbf5 Manuel Franceschini
                                   bridge=opts.bridge, mac=opts.mac,
745 7767bbf5 Manuel Franceschini
                                   kernel_path=opts.kernel_path,
746 7767bbf5 Manuel Franceschini
                                   initrd_path=opts.initrd_path,
747 31a853d2 Iustin Pop
                                   hvm_boot_order=hvm_boot_order,
748 31a853d2 Iustin Pop
                                   hvm_acpi=hvm_acpi, hvm_pae=hvm_pae,
749 3fc175f0 Alexander Schreiber
                                   hvm_cdrom_image_path=
750 3fc175f0 Alexander Schreiber
                                   opts.hvm_cdrom_image_path,
751 31a853d2 Iustin Pop
                                   vnc_bind_address=opts.vnc_bind_address)
752 31a853d2 Iustin Pop
753 a8083063 Iustin Pop
  result = SubmitOpCode(op)
754 a8083063 Iustin Pop
755 a8083063 Iustin Pop
  if result:
756 a8083063 Iustin Pop
    logger.ToStdout("Modified instance %s" % args[0])
757 a8083063 Iustin Pop
    for param, data in result:
758 a8083063 Iustin Pop
      logger.ToStdout(" - %-5s -> %s" % (param, data))
759 a8083063 Iustin Pop
    logger.ToStdout("Please don't forget that these parameters take effect"
760 a8083063 Iustin Pop
                    " only at the next start of the instance.")
761 a8083063 Iustin Pop
  return 0
762 a8083063 Iustin Pop
763 a8083063 Iustin Pop
764 a8083063 Iustin Pop
# options used in more than one cmd
765 a8083063 Iustin Pop
node_opt = make_option("-n", "--node", dest="node", help="Target node",
766 a8083063 Iustin Pop
                       metavar="<node>")
767 a8083063 Iustin Pop
768 d0834de3 Michael Hanselmann
os_opt = cli_option("-o", "--os-type", dest="os", help="What OS to run",
769 739ecd56 Michael Hanselmann
                    metavar="<os>")
770 d0834de3 Michael Hanselmann
771 312ac745 Iustin Pop
# multi-instance selection options
772 804a1e8e Iustin Pop
m_force_multi = make_option("--force-multiple", dest="force_multi",
773 804a1e8e Iustin Pop
                            help="Do not ask for confirmation when more than"
774 804a1e8e Iustin Pop
                            " one instance is affected",
775 804a1e8e Iustin Pop
                            action="store_true", default=False)
776 804a1e8e Iustin Pop
777 312ac745 Iustin Pop
m_pri_node_opt = make_option("--primary", dest="multi_mode",
778 312ac745 Iustin Pop
                             help="Filter by nodes (primary only)",
779 312ac745 Iustin Pop
                             const=_SHUTDOWN_NODES_PRI, action="store_const")
780 312ac745 Iustin Pop
781 312ac745 Iustin Pop
m_sec_node_opt = make_option("--secondary", dest="multi_mode",
782 312ac745 Iustin Pop
                             help="Filter by nodes (secondary only)",
783 312ac745 Iustin Pop
                             const=_SHUTDOWN_NODES_SEC, action="store_const")
784 312ac745 Iustin Pop
785 312ac745 Iustin Pop
m_node_opt = make_option("--node", dest="multi_mode",
786 312ac745 Iustin Pop
                         help="Filter by nodes (primary and secondary)",
787 312ac745 Iustin Pop
                         const=_SHUTDOWN_NODES_BOTH, action="store_const")
788 312ac745 Iustin Pop
789 312ac745 Iustin Pop
m_clust_opt = make_option("--all", dest="multi_mode",
790 312ac745 Iustin Pop
                          help="Select all instances in the cluster",
791 312ac745 Iustin Pop
                          const=_SHUTDOWN_CLUSTER, action="store_const")
792 312ac745 Iustin Pop
793 312ac745 Iustin Pop
m_inst_opt = make_option("--instance", dest="multi_mode",
794 312ac745 Iustin Pop
                         help="Filter by instance name [default]",
795 312ac745 Iustin Pop
                         const=_SHUTDOWN_INSTANCES, action="store_const")
796 312ac745 Iustin Pop
797 312ac745 Iustin Pop
798 a8083063 Iustin Pop
# this is defined separately due to readability only
799 a8083063 Iustin Pop
add_opts = [
800 a8083063 Iustin Pop
  DEBUG_OPT,
801 60d49723 Michael Hanselmann
  make_option("-n", "--node", dest="node",
802 60d49723 Michael Hanselmann
              help="Target node and optional secondary node",
803 60d49723 Michael Hanselmann
              metavar="<pnode>[:<snode>]"),
804 b9ac33e9 Iustin Pop
  cli_option("-s", "--os-size", dest="size", help="Disk size, in MiB unless"
805 b9ac33e9 Iustin Pop
             " a suffix is used",
806 a8083063 Iustin Pop
             default=20 * 1024, type="unit", metavar="<size>"),
807 b9ac33e9 Iustin Pop
  cli_option("--swap-size", dest="swap", help="Swap size, in MiB unless a"
808 b9ac33e9 Iustin Pop
             " suffix is used",
809 a8083063 Iustin Pop
             default=4 * 1024, type="unit", metavar="<size>"),
810 d0834de3 Michael Hanselmann
  os_opt,
811 b9ac33e9 Iustin Pop
  cli_option("-m", "--memory", dest="mem", help="Memory size (in MiB)",
812 a8083063 Iustin Pop
              default=128, type="unit", metavar="<mem>"),
813 a8083063 Iustin Pop
  make_option("-p", "--cpu", dest="vcpus", help="Number of virtual CPUs",
814 a8083063 Iustin Pop
              default=1, type="int", metavar="<PROC>"),
815 a8083063 Iustin Pop
  make_option("-t", "--disk-template", dest="disk_template",
816 45873083 Manuel Franceschini
              help="Custom disk setup (diskless, file, plain or drbd)",
817 f9193417 Iustin Pop
              default=None, metavar="TEMPL"),
818 a8083063 Iustin Pop
  make_option("-i", "--ip", dest="ip",
819 a8083063 Iustin Pop
              help="IP address ('none' [default], 'auto', or specify address)",
820 a8083063 Iustin Pop
              default='none', type="string", metavar="<ADDRESS>"),
821 1862d460 Alexander Schreiber
  make_option("--mac", dest="mac",
822 1862d460 Alexander Schreiber
              help="MAC address ('auto' [default], or specify address)",
823 1862d460 Alexander Schreiber
              default='auto', type="string", metavar="<MACADDRESS>"),
824 a8083063 Iustin Pop
  make_option("--no-wait-for-sync", dest="wait_for_sync", default=True,
825 a8083063 Iustin Pop
              action="store_false", help="Don't wait for sync (DANGEROUS!)"),
826 a8083063 Iustin Pop
  make_option("-b", "--bridge", dest="bridge",
827 a8083063 Iustin Pop
              help="Bridge to connect this instance to",
828 bdd55f71 Iustin Pop
              default=None, metavar="<bridge>"),
829 bdd55f71 Iustin Pop
  make_option("--no-start", dest="start", default=True,
830 bdd55f71 Iustin Pop
              action="store_false", help="Don't start the instance after"
831 bdd55f71 Iustin Pop
              " creation"),
832 bdd55f71 Iustin Pop
  make_option("--no-ip-check", dest="ip_check", default=True,
833 bdd55f71 Iustin Pop
              action="store_false", help="Don't check that the instance's IP"
834 bdd55f71 Iustin Pop
              " is alive (only valid with --no-start)"),
835 3b6d8c9b Iustin Pop
  make_option("--kernel", dest="kernel_path",
836 3b6d8c9b Iustin Pop
              help="Path to the instances' kernel (or 'default')",
837 3b6d8c9b Iustin Pop
              default=None,
838 3b6d8c9b Iustin Pop
              type="string", metavar="<FILENAME>"),
839 3b6d8c9b Iustin Pop
  make_option("--initrd", dest="initrd_path",
840 3b6d8c9b Iustin Pop
              help="Path to the instances' initrd (or 'none', or 'default')",
841 3b6d8c9b Iustin Pop
              default=None,
842 3b6d8c9b Iustin Pop
              type="string", metavar="<FILENAME>"),
843 25c5878d Alexander Schreiber
  make_option("--hvm-boot-order", dest="hvm_boot_order",
844 538475ca Iustin Pop
              help="Boot device order for HVM (one or more of [acdn])",
845 25c5878d Alexander Schreiber
              default=None, type="string", metavar="<BOOTORDER>"),
846 45873083 Manuel Franceschini
  make_option("--file-storage-dir", dest="file_storage_dir",
847 45873083 Manuel Franceschini
              help="Relative path under default cluster-wide file storage dir"
848 45873083 Manuel Franceschini
              " to store file-based disks", default=None,
849 45873083 Manuel Franceschini
              metavar="<DIR>"),
850 45873083 Manuel Franceschini
  make_option("--file-driver", dest="file_driver", help="Driver to use"
851 538475ca Iustin Pop
              " for image files", default="loop", metavar="<DRIVER>"),
852 538475ca Iustin Pop
  make_option("--iallocator", metavar="<NAME>",
853 538475ca Iustin Pop
              help="Select nodes for the instance automatically using the"
854 538475ca Iustin Pop
              " <NAME> iallocator plugin", default=None, type="string"),
855 31a853d2 Iustin Pop
  make_option("--hvm-acpi", dest="hvm_acpi",
856 31a853d2 Iustin Pop
              help="ACPI support for HVM (true|false)",
857 31a853d2 Iustin Pop
              metavar="<BOOL>", choices=["true", "false"]),
858 31a853d2 Iustin Pop
  make_option("--hvm-pae", dest="hvm_pae",
859 31a853d2 Iustin Pop
              help="PAE support for HVM (true|false)",
860 31a853d2 Iustin Pop
              metavar="<BOOL>", choices=["true", "false"]),
861 31a853d2 Iustin Pop
  make_option("--hvm-cdrom-image-path", dest="hvm_cdrom_image_path",
862 31a853d2 Iustin Pop
              help="CDROM image path for HVM (absolute path or None)",
863 31a853d2 Iustin Pop
              default=None, type="string", metavar="<CDROMIMAGE>"),
864 31a853d2 Iustin Pop
  make_option("--vnc-bind-address", dest="vnc_bind_address",
865 31a853d2 Iustin Pop
              help="bind address for VNC (IP address)",
866 31a853d2 Iustin Pop
              default=None, type="string", metavar="<VNCADDRESS>"),
867 a8083063 Iustin Pop
  ]
868 a8083063 Iustin Pop
869 a8083063 Iustin Pop
commands = {
870 a8083063 Iustin Pop
  'add': (AddInstance, ARGS_ONE, add_opts,
871 bdb7d4e8 Michael Hanselmann
          "[...] -t disk-type -n node[:secondary-node] -o os-type <name>",
872 a8083063 Iustin Pop
          "Creates and adds a new instance to the cluster"),
873 51c6e7b5 Michael Hanselmann
  'console': (ConnectToInstanceConsole, ARGS_ONE,
874 51c6e7b5 Michael Hanselmann
              [DEBUG_OPT,
875 51c6e7b5 Michael Hanselmann
               make_option("--show-cmd", dest="show_command",
876 51c6e7b5 Michael Hanselmann
                           action="store_true", default=False,
877 51c6e7b5 Michael Hanselmann
                           help=("Show command instead of executing it"))],
878 9a033156 Iustin Pop
              "[--show-cmd] <instance>",
879 a8083063 Iustin Pop
              "Opens a console on the specified instance"),
880 80de0e3f Iustin Pop
  'failover': (FailoverInstance, ARGS_ONE,
881 fe7b0351 Michael Hanselmann
               [DEBUG_OPT, FORCE_OPT,
882 a8083063 Iustin Pop
                make_option("--ignore-consistency", dest="ignore_consistency",
883 a8083063 Iustin Pop
                            action="store_true", default=False,
884 a8083063 Iustin Pop
                            help="Ignore the consistency of the disks on"
885 a8083063 Iustin Pop
                            " the secondary"),
886 a8083063 Iustin Pop
                ],
887 9a033156 Iustin Pop
               "[-f] <instance>",
888 a8083063 Iustin Pop
               "Stops the instance and starts it on the backup node, using"
889 99e2be3b Guido Trotter
               " the remote mirror (only for instances of type drbd)"),
890 9a033156 Iustin Pop
  'info': (ShowInstanceConfig, ARGS_ANY, [DEBUG_OPT], "[<instance>...]",
891 a8083063 Iustin Pop
           "Show information on the specified instance"),
892 a8083063 Iustin Pop
  'list': (ListInstances, ARGS_NONE,
893 9a033156 Iustin Pop
           [DEBUG_OPT, NOHDR_OPT, SEP_OPT, USEUNITS_OPT, FIELDS_OPT], "",
894 d8052456 Iustin Pop
           "Lists the instances and their status. The available fields are"
895 d8052456 Iustin Pop
           " (see the man page for details): status, oper_state, oper_ram,"
896 d8a4b51d Iustin Pop
           " name, os, pnode, snodes, admin_state, admin_ram, disk_template,"
897 d8a4b51d Iustin Pop
           " ip, mac, bridge, sda_size, sdb_size, vcpus. The default field"
898 48c4dfa8 Iustin Pop
           " list is (in order): %s." % ", ".join(_LIST_DEF_FIELDS),
899 48c4dfa8 Iustin Pop
           ),
900 d0834de3 Michael Hanselmann
  'reinstall': (ReinstallInstance, ARGS_ONE, [DEBUG_OPT, FORCE_OPT, os_opt],
901 9a033156 Iustin Pop
                "[-f] <instance>", "Reinstall a stopped instance"),
902 1d67656e Iustin Pop
  'remove': (RemoveInstance, ARGS_ONE,
903 1d67656e Iustin Pop
             [DEBUG_OPT, FORCE_OPT,
904 1d67656e Iustin Pop
              make_option("--ignore-failures", dest="ignore_failures",
905 1d67656e Iustin Pop
                          action="store_true", default=False,
906 1d67656e Iustin Pop
                          help=("Remove the instance from the cluster even"
907 1d67656e Iustin Pop
                                " if there are failures during the removal"
908 1d67656e Iustin Pop
                                " process (shutdown, disk removal, etc.)")),
909 1d67656e Iustin Pop
              ],
910 9a033156 Iustin Pop
             "[-f] <instance>", "Shuts down the instance and removes it"),
911 decd5f45 Iustin Pop
  'rename': (RenameInstance, ARGS_FIXED(2),
912 decd5f45 Iustin Pop
             [DEBUG_OPT,
913 decd5f45 Iustin Pop
              make_option("--no-ip-check", dest="ignore_ip",
914 decd5f45 Iustin Pop
                          help="Do not check that the IP of the new name"
915 decd5f45 Iustin Pop
                          " is alive",
916 decd5f45 Iustin Pop
                          default=False, action="store_true"),
917 decd5f45 Iustin Pop
              ],
918 9a033156 Iustin Pop
             "<instance> <new_name>", "Rename the instance"),
919 a8083063 Iustin Pop
  'replace-disks': (ReplaceDisks, ARGS_ONE,
920 a8083063 Iustin Pop
                    [DEBUG_OPT,
921 a8083063 Iustin Pop
                     make_option("-n", "--new-secondary", dest="new_secondary",
922 a9e0c397 Iustin Pop
                                 help=("New secondary node (for secondary"
923 a9e0c397 Iustin Pop
                                       " node change)"), metavar="NODE"),
924 a9e0c397 Iustin Pop
                     make_option("-p", "--on-primary", dest="on_primary",
925 a9e0c397 Iustin Pop
                                 default=False, action="store_true",
926 a9e0c397 Iustin Pop
                                 help=("Replace the disk(s) on the primary"
927 12c3449a Michael Hanselmann
                                       " node (only for the drbd template)")),
928 a9e0c397 Iustin Pop
                     make_option("-s", "--on-secondary", dest="on_secondary",
929 a9e0c397 Iustin Pop
                                 default=False, action="store_true",
930 a9e0c397 Iustin Pop
                                 help=("Replace the disk(s) on the secondary"
931 12c3449a Michael Hanselmann
                                       " node (only for the drbd template)")),
932 a9e0c397 Iustin Pop
                     make_option("--disks", dest="disks", default=None,
933 a9e0c397 Iustin Pop
                                 help=("Comma-separated list of disks"
934 a9e0c397 Iustin Pop
                                       " to replace (e.g. sda) (optional,"
935 a9e0c397 Iustin Pop
                                       " defaults to all disks")),
936 b6e82a65 Iustin Pop
                     make_option("--iallocator", metavar="<NAME>",
937 b6e82a65 Iustin Pop
                                 help="Select new secondary for the instance"
938 b6e82a65 Iustin Pop
                                 " automatically using the"
939 b6e82a65 Iustin Pop
                                 " <NAME> iallocator plugin (enables"
940 b6e82a65 Iustin Pop
                                 " secondary node replacement)",
941 b6e82a65 Iustin Pop
                                 default=None, type="string"),
942 a9e0c397 Iustin Pop
                     ],
943 9a033156 Iustin Pop
                    "[-s|-p|-n NODE] <instance>",
944 a8083063 Iustin Pop
                    "Replaces all disks for the instance"),
945 7767bbf5 Manuel Franceschini
  'modify': (SetInstanceParams, ARGS_ONE,
946 fe7b0351 Michael Hanselmann
             [DEBUG_OPT, FORCE_OPT,
947 a8083063 Iustin Pop
              cli_option("-m", "--memory", dest="mem",
948 a8083063 Iustin Pop
                         help="Memory size",
949 a8083063 Iustin Pop
                         default=None, type="unit", metavar="<mem>"),
950 a8083063 Iustin Pop
              make_option("-p", "--cpu", dest="vcpus",
951 a8083063 Iustin Pop
                          help="Number of virtual CPUs",
952 a8083063 Iustin Pop
                          default=None, type="int", metavar="<PROC>"),
953 a8083063 Iustin Pop
              make_option("-i", "--ip", dest="ip",
954 a8083063 Iustin Pop
                          help="IP address ('none' or numeric IP)",
955 a8083063 Iustin Pop
                          default=None, type="string", metavar="<ADDRESS>"),
956 a8083063 Iustin Pop
              make_option("-b", "--bridge", dest="bridge",
957 a8083063 Iustin Pop
                          help="Bridge to connect this instance to",
958 decd5f45 Iustin Pop
                          default=None, type="string", metavar="<bridge>"),
959 1862d460 Alexander Schreiber
              make_option("--mac", dest="mac",
960 1862d460 Alexander Schreiber
                          help="MAC address", default=None,
961 1862d460 Alexander Schreiber
                          type="string", metavar="<MACADDRESS>"),
962 973d7867 Iustin Pop
              make_option("--kernel", dest="kernel_path",
963 973d7867 Iustin Pop
                          help="Path to the instances' kernel (or"
964 973d7867 Iustin Pop
                          " 'default')", default=None,
965 973d7867 Iustin Pop
                          type="string", metavar="<FILENAME>"),
966 973d7867 Iustin Pop
              make_option("--initrd", dest="initrd_path",
967 973d7867 Iustin Pop
                          help="Path to the instances' initrd (or 'none', or"
968 973d7867 Iustin Pop
                          " 'default')", default=None,
969 973d7867 Iustin Pop
                          type="string", metavar="<FILENAME>"),
970 25c5878d Alexander Schreiber
              make_option("--hvm-boot-order", dest="hvm_boot_order",
971 25c5878d Alexander Schreiber
                          help="boot device order for HVM"
972 25c5878d Alexander Schreiber
                          "(either one or more of [acdn] or 'default')",
973 25c5878d Alexander Schreiber
                          default=None, type="string", metavar="<BOOTORDER>"),
974 31a853d2 Iustin Pop
              make_option("--hvm-acpi", dest="hvm_acpi",
975 31a853d2 Iustin Pop
                          help="ACPI support for HVM (true|false)",
976 31a853d2 Iustin Pop
                          metavar="<BOOL>", choices=["true", "false"]),
977 31a853d2 Iustin Pop
              make_option("--hvm-pae", dest="hvm_pae",
978 31a853d2 Iustin Pop
                          help="PAE support for HVM (true|false)",
979 31a853d2 Iustin Pop
                          metavar="<BOOL>", choices=["true", "false"]),
980 31a853d2 Iustin Pop
              make_option("--hvm-cdrom-image-path",
981 31a853d2 Iustin Pop
                          dest="hvm_cdrom_image_path",
982 31a853d2 Iustin Pop
                          help="CDROM image path for HVM"
983 31a853d2 Iustin Pop
                          "(absolute path or None)",
984 31a853d2 Iustin Pop
                          default=None, type="string", metavar="<CDROMIMAGE>"),
985 31a853d2 Iustin Pop
              make_option("--vnc-bind-address", dest="vnc_bind_address",
986 31a853d2 Iustin Pop
                          help="bind address for VNC (IP address)",
987 31a853d2 Iustin Pop
                          default=None, type="string", metavar="<VNCADDRESS>"),
988 a8083063 Iustin Pop
              ],
989 9a033156 Iustin Pop
             "<instance>", "Alters the parameters of an instance"),
990 312ac745 Iustin Pop
  'shutdown': (ShutdownInstance, ARGS_ANY,
991 312ac745 Iustin Pop
               [DEBUG_OPT, m_node_opt, m_pri_node_opt, m_sec_node_opt,
992 804a1e8e Iustin Pop
                m_clust_opt, m_inst_opt, m_force_multi],
993 9a033156 Iustin Pop
               "<instance>", "Stops an instance"),
994 312ac745 Iustin Pop
  'startup': (StartupInstance, ARGS_ANY,
995 804a1e8e Iustin Pop
              [DEBUG_OPT, FORCE_OPT, m_force_multi,
996 a8083063 Iustin Pop
               make_option("-e", "--extra", dest="extra_args",
997 a8083063 Iustin Pop
                           help="Extra arguments for the instance's kernel",
998 a8083063 Iustin Pop
                           default=None, type="string", metavar="<PARAMS>"),
999 312ac745 Iustin Pop
               m_node_opt, m_pri_node_opt, m_sec_node_opt,
1000 312ac745 Iustin Pop
               m_clust_opt, m_inst_opt,
1001 a8083063 Iustin Pop
               ],
1002 9a033156 Iustin Pop
            "<instance>", "Starts an instance"),
1003 579d4337 Alexander Schreiber
1004 579d4337 Alexander Schreiber
  'reboot': (RebootInstance, ARGS_ANY,
1005 579d4337 Alexander Schreiber
              [DEBUG_OPT, m_force_multi,
1006 579d4337 Alexander Schreiber
               make_option("-e", "--extra", dest="extra_args",
1007 579d4337 Alexander Schreiber
                           help="Extra arguments for the instance's kernel",
1008 579d4337 Alexander Schreiber
                           default=None, type="string", metavar="<PARAMS>"),
1009 579d4337 Alexander Schreiber
               make_option("-t", "--type", dest="reboot_type",
1010 579d4337 Alexander Schreiber
                           help="Type of reboot: soft/hard/full",
1011 579d4337 Alexander Schreiber
                           default=constants.INSTANCE_REBOOT_SOFT,
1012 579d4337 Alexander Schreiber
                           type="string", metavar="<REBOOT>"),
1013 579d4337 Alexander Schreiber
               make_option("--ignore-secondaries", dest="ignore_secondaries",
1014 579d4337 Alexander Schreiber
                           default=False, action="store_true",
1015 579d4337 Alexander Schreiber
                           help="Ignore errors from secondaries"),
1016 579d4337 Alexander Schreiber
               m_node_opt, m_pri_node_opt, m_sec_node_opt,
1017 579d4337 Alexander Schreiber
               m_clust_opt, m_inst_opt,
1018 579d4337 Alexander Schreiber
               ],
1019 9a033156 Iustin Pop
            "<instance>", "Reboots an instance"),
1020 a8083063 Iustin Pop
  'activate-disks': (ActivateDisks, ARGS_ONE, [DEBUG_OPT],
1021 9a033156 Iustin Pop
                     "<instance>",
1022 a8083063 Iustin Pop
                     "Activate an instance's disks"),
1023 a8083063 Iustin Pop
  'deactivate-disks': (DeactivateDisks, ARGS_ONE, [DEBUG_OPT],
1024 9a033156 Iustin Pop
                       "<instance>",
1025 a8083063 Iustin Pop
                       "Deactivate an instance's disks"),
1026 c6e911bc Iustin Pop
  'grow-disk': (GrowDisk, ARGS_FIXED(3), [DEBUG_OPT],
1027 c6e911bc Iustin Pop
                "<instance> <disk> <size>", "Grow an instance's disk"),
1028 846baef9 Iustin Pop
  'list-tags': (ListTags, ARGS_ONE, [DEBUG_OPT],
1029 9a033156 Iustin Pop
                "<node_name>", "List the tags of the given instance"),
1030 810c50b7 Iustin Pop
  'add-tags': (AddTags, ARGS_ATLEAST(1), [DEBUG_OPT, TAG_SRC_OPT],
1031 9a033156 Iustin Pop
               "<node_name> tag...", "Add tags to the given instance"),
1032 810c50b7 Iustin Pop
  'remove-tags': (RemoveTags, ARGS_ATLEAST(1), [DEBUG_OPT, TAG_SRC_OPT],
1033 9a033156 Iustin Pop
                  "<node_name> tag...", "Remove tags from given instance"),
1034 a8083063 Iustin Pop
  }
1035 a8083063 Iustin Pop
1036 dbfd89dd Guido Trotter
aliases = {
1037 dbfd89dd Guido Trotter
  'activate_block_devs': 'activate-disks',
1038 00ce8b29 Guido Trotter
  'replace_disks': 'replace-disks',
1039 536fda25 Guido Trotter
  'start': 'startup',
1040 536fda25 Guido Trotter
  'stop': 'shutdown',
1041 dbfd89dd Guido Trotter
  }
1042 dbfd89dd Guido Trotter
1043 a8083063 Iustin Pop
if __name__ == '__main__':
1044 dbfd89dd Guido Trotter
  sys.exit(GenericMain(commands, aliases=aliases,
1045 846baef9 Iustin Pop
                       override={"tag_type": constants.TAG_INSTANCE}))