Statistics
| Branch: | Tag: | Revision:

root / scripts / gnt-instance @ 137161c9

History | View | Annotate | Download (17.7 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 a8083063 Iustin Pop
from optparse import make_option
25 a8083063 Iustin Pop
import textwrap
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 a8083063 Iustin Pop
34 a8083063 Iustin Pop
35 a8083063 Iustin Pop
def ListInstances(opts, args):
36 a8083063 Iustin Pop
  """List nodes and their properties.
37 a8083063 Iustin Pop
38 a8083063 Iustin Pop
  """
39 a8083063 Iustin Pop
  if opts.output is None:
40 a8083063 Iustin Pop
    selected_fields = ["name", "os", "pnode", "admin_state",
41 a8083063 Iustin Pop
                       "oper_state", "oper_ram"]
42 a8083063 Iustin Pop
  else:
43 a8083063 Iustin Pop
    selected_fields = opts.output.split(",")
44 a8083063 Iustin Pop
45 a8083063 Iustin Pop
  op = opcodes.OpQueryInstances(output_fields=selected_fields)
46 a8083063 Iustin Pop
  output = SubmitOpCode(op)
47 a8083063 Iustin Pop
48 a8083063 Iustin Pop
  if not opts.no_headers:
49 137161c9 Michael Hanselmann
    headers = {"name": "Instance", "os": "OS", "pnode": "Primary_node",
50 137161c9 Michael Hanselmann
               "snodes": "Secondary_Nodes", "admin_state": "Autostart",
51 137161c9 Michael Hanselmann
               "oper_state": "Status", "admin_ram": "Configured_memory",
52 137161c9 Michael Hanselmann
               "oper_ram": "Memory", "disk_template": "Disk_template",
53 137161c9 Michael Hanselmann
               "ip": "IP Address", "mac": "MAC Address",
54 137161c9 Michael Hanselmann
               "bridge": "Bridge"}
55 137161c9 Michael Hanselmann
  else:
56 137161c9 Michael Hanselmann
    headers = None
57 137161c9 Michael Hanselmann
58 137161c9 Michael Hanselmann
  if opts.human_readable:
59 137161c9 Michael Hanselmann
    unitfields = ["admin_ram", "oper_ram"]
60 137161c9 Michael Hanselmann
  else:
61 137161c9 Michael Hanselmann
    unitfields = None
62 137161c9 Michael Hanselmann
63 137161c9 Michael Hanselmann
  numfields = ["admin_ram", "oper_ram"]
64 137161c9 Michael Hanselmann
65 137161c9 Michael Hanselmann
  OutputTable(separator=opts.separator, headers=headers,
66 137161c9 Michael Hanselmann
      fields=selected_fields, unitfields=unitfields,
67 137161c9 Michael Hanselmann
      numfields=numfields, data=output)
68 a8083063 Iustin Pop
69 a8083063 Iustin Pop
  return 0
70 a8083063 Iustin Pop
71 a8083063 Iustin Pop
72 a8083063 Iustin Pop
def AddInstance(opts, args):
73 a8083063 Iustin Pop
  """Add an instance to the cluster.
74 a8083063 Iustin Pop
75 a8083063 Iustin Pop
  Args:
76 a8083063 Iustin Pop
    opts - class with options as members
77 a8083063 Iustin Pop
    args - list with a single element, the instance name
78 a8083063 Iustin Pop
  Opts used:
79 a8083063 Iustin Pop
    mem - amount of memory to allocate to instance (MiB)
80 a8083063 Iustin Pop
    size - amount of disk space to allocate to instance (MiB)
81 a8083063 Iustin Pop
    os - which OS to run on instance
82 a8083063 Iustin Pop
    node - node to run new instance on
83 a8083063 Iustin Pop
84 a8083063 Iustin Pop
  """
85 a8083063 Iustin Pop
86 a8083063 Iustin Pop
  instance = args[0]
87 a8083063 Iustin Pop
88 a8083063 Iustin Pop
  op = opcodes.OpCreateInstance(instance_name=instance, mem_size=opts.mem,
89 a8083063 Iustin Pop
                                disk_size=opts.size, swap_size=opts.swap,
90 a8083063 Iustin Pop
                                disk_template=opts.disk_template,
91 a8083063 Iustin Pop
                                mode=constants.INSTANCE_CREATE,
92 a8083063 Iustin Pop
                                os_type=opts.os, pnode=opts.node,
93 a8083063 Iustin Pop
                                snode=opts.snode, vcpus=opts.vcpus,
94 a8083063 Iustin Pop
                                ip=opts.ip, bridge=opts.bridge, start=True,
95 a8083063 Iustin Pop
                                wait_for_sync=opts.wait_for_sync)
96 a8083063 Iustin Pop
  SubmitOpCode(op)
97 a8083063 Iustin Pop
  return 0
98 a8083063 Iustin Pop
99 a8083063 Iustin Pop
100 a8083063 Iustin Pop
def RemoveInstance(opts, args):
101 a8083063 Iustin Pop
  """Remove an instance.
102 a8083063 Iustin Pop
103 a8083063 Iustin Pop
  Args:
104 a8083063 Iustin Pop
    opts - class with options as members
105 a8083063 Iustin Pop
    args - list containing a single element, the instance name
106 a8083063 Iustin Pop
107 a8083063 Iustin Pop
  """
108 a8083063 Iustin Pop
  instance_name = args[0]
109 a8083063 Iustin Pop
  force = opts.force
110 a8083063 Iustin Pop
111 a8083063 Iustin Pop
  if not force:
112 a8083063 Iustin Pop
    usertext = ("This will remove the volumes of the instance %s"
113 a8083063 Iustin Pop
                " (including mirrors), thus removing all the data"
114 a8083063 Iustin Pop
                " of the instance. Continue?") % instance_name
115 a8083063 Iustin Pop
    if not opts._ask_user(usertext):
116 a8083063 Iustin Pop
      return 1
117 a8083063 Iustin Pop
118 a8083063 Iustin Pop
  op = opcodes.OpRemoveInstance(instance_name=instance_name)
119 a8083063 Iustin Pop
  SubmitOpCode(op)
120 a8083063 Iustin Pop
  return 0
121 a8083063 Iustin Pop
122 a8083063 Iustin Pop
123 a8083063 Iustin Pop
def ActivateDisks(opts, args):
124 a8083063 Iustin Pop
  """Activate an instance's disks.
125 a8083063 Iustin Pop
126 a8083063 Iustin Pop
  This serves two purposes:
127 a8083063 Iustin Pop
    - it allows one (as long as the instance is not running) to mount
128 a8083063 Iustin Pop
    the disks and modify them from the node
129 a8083063 Iustin Pop
    - it repairs inactive secondary drbds
130 a8083063 Iustin Pop
131 a8083063 Iustin Pop
  """
132 a8083063 Iustin Pop
  instance_name = args[0]
133 a8083063 Iustin Pop
  op = opcodes.OpActivateInstanceDisks(instance_name=instance_name)
134 a8083063 Iustin Pop
  disks_info = SubmitOpCode(op)
135 a8083063 Iustin Pop
  for host, iname, nname in disks_info:
136 a8083063 Iustin Pop
    print "%s:%s:%s" % (host, iname, nname)
137 a8083063 Iustin Pop
  return 0
138 a8083063 Iustin Pop
139 a8083063 Iustin Pop
140 a8083063 Iustin Pop
def DeactivateDisks(opts, args):
141 a8083063 Iustin Pop
  """Command-line interface for _ShutdownInstanceBlockDevices.
142 a8083063 Iustin Pop
143 a8083063 Iustin Pop
  This function takes the instance name, looks for its primary node
144 a8083063 Iustin Pop
  and the tries to shutdown its block devices on that node.
145 a8083063 Iustin Pop
146 a8083063 Iustin Pop
  """
147 a8083063 Iustin Pop
  instance_name = args[0]
148 a8083063 Iustin Pop
  op = opcodes.OpDeactivateInstanceDisks(instance_name=instance_name)
149 a8083063 Iustin Pop
  SubmitOpCode(op)
150 a8083063 Iustin Pop
  return 0
151 a8083063 Iustin Pop
152 a8083063 Iustin Pop
153 a8083063 Iustin Pop
def StartupInstance(opts, args):
154 a8083063 Iustin Pop
  """Shutdown an instance.
155 a8083063 Iustin Pop
156 a8083063 Iustin Pop
  Args:
157 a8083063 Iustin Pop
    opts - class with options as members
158 a8083063 Iustin Pop
    args - list containing a single element, the instance name
159 a8083063 Iustin Pop
160 a8083063 Iustin Pop
  """
161 a8083063 Iustin Pop
  instance_name = args[0]
162 a8083063 Iustin Pop
  op = opcodes.OpStartupInstance(instance_name=instance_name, force=opts.force,
163 a8083063 Iustin Pop
                                 extra_args=opts.extra_args)
164 a8083063 Iustin Pop
  SubmitOpCode(op)
165 a8083063 Iustin Pop
  return 0
166 a8083063 Iustin Pop
167 a8083063 Iustin Pop
168 a8083063 Iustin Pop
def ShutdownInstance(opts, args):
169 a8083063 Iustin Pop
  """Shutdown an instance.
170 a8083063 Iustin Pop
171 a8083063 Iustin Pop
  Args:
172 a8083063 Iustin Pop
    opts - class with options as members
173 a8083063 Iustin Pop
    args - list containing a single element, the instance name
174 a8083063 Iustin Pop
175 a8083063 Iustin Pop
  """
176 a8083063 Iustin Pop
  instance_name = args[0]
177 a8083063 Iustin Pop
  op = opcodes.OpShutdownInstance(instance_name=instance_name)
178 a8083063 Iustin Pop
  SubmitOpCode(op)
179 a8083063 Iustin Pop
  return 0
180 a8083063 Iustin Pop
181 a8083063 Iustin Pop
182 a8083063 Iustin Pop
def AddMDDRBDComponent(opts, args):
183 a8083063 Iustin Pop
  """Add a new component to a remote_raid1 disk.
184 a8083063 Iustin Pop
185 a8083063 Iustin Pop
  Args:
186 a8083063 Iustin Pop
    opts - class with options as members
187 a8083063 Iustin Pop
    args - list with a single element, the instance name
188 a8083063 Iustin Pop
189 a8083063 Iustin Pop
  """
190 a8083063 Iustin Pop
  op = opcodes.OpAddMDDRBDComponent(instance_name=args[0],
191 a8083063 Iustin Pop
                                    disk_name=opts.disk,
192 a8083063 Iustin Pop
                                    remote_node=opts.node)
193 a8083063 Iustin Pop
  SubmitOpCode(op)
194 a8083063 Iustin Pop
  return 0
195 a8083063 Iustin Pop
196 a8083063 Iustin Pop
197 a8083063 Iustin Pop
def RemoveMDDRBDComponent(opts, args):
198 a8083063 Iustin Pop
  """Connect to the console of an instance
199 a8083063 Iustin Pop
200 a8083063 Iustin Pop
  Args:
201 a8083063 Iustin Pop
    opts - class with options as members
202 a8083063 Iustin Pop
    args - list with a single element, the instance name
203 a8083063 Iustin Pop
204 a8083063 Iustin Pop
  """
205 a8083063 Iustin Pop
  op = opcodes.OpRemoveMDDRBDComponent(instance_name=args[0],
206 a8083063 Iustin Pop
                                       disk_name=opts.disk,
207 a8083063 Iustin Pop
                                       disk_id=opts.port)
208 a8083063 Iustin Pop
  SubmitOpCode(op)
209 a8083063 Iustin Pop
  return 0
210 a8083063 Iustin Pop
211 a8083063 Iustin Pop
212 a8083063 Iustin Pop
def ReplaceDisks(opts, args):
213 a8083063 Iustin Pop
  """Replace the disks of an instance
214 a8083063 Iustin Pop
215 a8083063 Iustin Pop
  Args:
216 a8083063 Iustin Pop
    opts - class with options as members
217 a8083063 Iustin Pop
    args - list with a single element, the instance name
218 a8083063 Iustin Pop
219 a8083063 Iustin Pop
  """
220 a8083063 Iustin Pop
  instance_name = args[0]
221 a8083063 Iustin Pop
  new_secondary = opts.new_secondary
222 a8083063 Iustin Pop
  op = opcodes.OpReplaceDisks(instance_name=args[0],
223 a8083063 Iustin Pop
                              remote_node=opts.new_secondary)
224 a8083063 Iustin Pop
  SubmitOpCode(op)
225 a8083063 Iustin Pop
  return 0
226 a8083063 Iustin Pop
227 a8083063 Iustin Pop
228 a8083063 Iustin Pop
def FailoverInstance(opts, args):
229 a8083063 Iustin Pop
  """Failover an instance.
230 a8083063 Iustin Pop
231 a8083063 Iustin Pop
  The failover is done by shutting it down on its present node and
232 a8083063 Iustin Pop
  starting it on the secondary.
233 a8083063 Iustin Pop
234 a8083063 Iustin Pop
  Args:
235 a8083063 Iustin Pop
    opts - class with options as members
236 a8083063 Iustin Pop
    args - list with a single element, the instance name
237 a8083063 Iustin Pop
  Opts used:
238 a8083063 Iustin Pop
    force - whether to failover without asking questions.
239 a8083063 Iustin Pop
240 a8083063 Iustin Pop
  """
241 a8083063 Iustin Pop
  instance_name = args[0]
242 a8083063 Iustin Pop
  force = opts.force
243 a8083063 Iustin Pop
244 a8083063 Iustin Pop
  if not force:
245 a8083063 Iustin Pop
    usertext = ("Failover will happen to image %s."
246 a8083063 Iustin Pop
                " This requires a shutdown of the instance. Continue?" %
247 a8083063 Iustin Pop
                (instance_name,))
248 a8083063 Iustin Pop
    usertext = textwrap.fill(usertext)
249 a8083063 Iustin Pop
    if not opts._ask_user(usertext):
250 a8083063 Iustin Pop
      return 1
251 a8083063 Iustin Pop
252 a8083063 Iustin Pop
  op = opcodes.OpFailoverInstance(instance_name=instance_name,
253 a8083063 Iustin Pop
                                  ignore_consistency=opts.ignore_consistency)
254 a8083063 Iustin Pop
  SubmitOpCode(op)
255 a8083063 Iustin Pop
  return 0
256 a8083063 Iustin Pop
257 a8083063 Iustin Pop
258 a8083063 Iustin Pop
def ConnectToInstanceConsole(opts, args):
259 a8083063 Iustin Pop
  """Connect to the console of an instance.
260 a8083063 Iustin Pop
261 a8083063 Iustin Pop
  Args:
262 a8083063 Iustin Pop
    opts - class with options as members
263 a8083063 Iustin Pop
    args - list with a single element, the instance name
264 a8083063 Iustin Pop
265 a8083063 Iustin Pop
  """
266 a8083063 Iustin Pop
  instance_name = args[0]
267 a8083063 Iustin Pop
268 a8083063 Iustin Pop
  op = opcodes.OpConnectConsole(instance_name=instance_name)
269 a8083063 Iustin Pop
  node, console_cmd = SubmitOpCode(op)
270 a8083063 Iustin Pop
  # drop lock and exec so other commands can run while we have console
271 a8083063 Iustin Pop
  utils.Unlock("cmd")
272 a8083063 Iustin Pop
  try:
273 a8083063 Iustin Pop
    os.execv("/usr/bin/ssh", ["ssh", "-qt", node, console_cmd])
274 a8083063 Iustin Pop
  finally:
275 a8083063 Iustin Pop
    sys.stderr.write("Can't run console command %s on node %s" %
276 a8083063 Iustin Pop
                     (console_cmd, node))
277 a8083063 Iustin Pop
    os._exit(1)
278 a8083063 Iustin Pop
279 a8083063 Iustin Pop
280 a8083063 Iustin Pop
def _FormatBlockDevInfo(buf, dev, indent_level):
281 a8083063 Iustin Pop
  """Show block device information.
282 a8083063 Iustin Pop
283 a8083063 Iustin Pop
  This is only used by ShowInstanceConfig(), but it's too big to be
284 a8083063 Iustin Pop
  left for an inline definition.
285 a8083063 Iustin Pop
286 a8083063 Iustin Pop
  """
287 a8083063 Iustin Pop
  def helper(buf, dtype, status):
288 a8083063 Iustin Pop
    """Format one line for phsyical device status."""
289 a8083063 Iustin Pop
    if not status:
290 a8083063 Iustin Pop
      buf.write("not active\n")
291 a8083063 Iustin Pop
    else:
292 a8083063 Iustin Pop
      (path, major, minor, syncp, estt, degr) = status
293 a8083063 Iustin Pop
      buf.write("%s (%d:%d)" % (path, major, minor))
294 a8083063 Iustin Pop
      if dtype in ("md_raid1", "drbd"):
295 a8083063 Iustin Pop
        if syncp is not None:
296 a8083063 Iustin Pop
          sync_text = "*RECOVERING* %5.2f%%," % syncp
297 a8083063 Iustin Pop
          if estt:
298 a8083063 Iustin Pop
            sync_text += " ETA %ds" % estt
299 a8083063 Iustin Pop
          else:
300 a8083063 Iustin Pop
            sync_text += " ETA unknown"
301 a8083063 Iustin Pop
        else:
302 a8083063 Iustin Pop
          sync_text = "in sync"
303 a8083063 Iustin Pop
        if degr:
304 a8083063 Iustin Pop
          degr_text = "*DEGRADED*"
305 a8083063 Iustin Pop
        else:
306 a8083063 Iustin Pop
          degr_text = "ok"
307 a8083063 Iustin Pop
        buf.write(" %s, status %s" % (sync_text, degr_text))
308 a8083063 Iustin Pop
      buf.write("\n")
309 a8083063 Iustin Pop
310 a8083063 Iustin Pop
  if dev["iv_name"] is not None:
311 a8083063 Iustin Pop
    data = "  - %s, " % dev["iv_name"]
312 a8083063 Iustin Pop
  else:
313 a8083063 Iustin Pop
    data = "  - "
314 a8083063 Iustin Pop
  data += "type: %s" % dev["dev_type"]
315 a8083063 Iustin Pop
  if dev["logical_id"] is not None:
316 a8083063 Iustin Pop
    data += ", logical_id: %s" % (dev["logical_id"],)
317 a8083063 Iustin Pop
  elif dev["physical_id"] is not None:
318 a8083063 Iustin Pop
    data += ", physical_id: %s" % (dev["physical_id"],)
319 a8083063 Iustin Pop
  buf.write("%*s%s\n" % (2*indent_level, "", data))
320 a8083063 Iustin Pop
  buf.write("%*s    primary:   " % (2*indent_level, ""))
321 a8083063 Iustin Pop
  helper(buf, dev["dev_type"], dev["pstatus"])
322 a8083063 Iustin Pop
323 a8083063 Iustin Pop
  if dev["sstatus"]:
324 a8083063 Iustin Pop
    buf.write("%*s    secondary: " % (2*indent_level, ""))
325 a8083063 Iustin Pop
    helper(buf, dev["dev_type"], dev["sstatus"])
326 a8083063 Iustin Pop
327 a8083063 Iustin Pop
  if dev["children"]:
328 a8083063 Iustin Pop
    for child in dev["children"]:
329 a8083063 Iustin Pop
      _FormatBlockDevInfo(buf, child, indent_level+1)
330 a8083063 Iustin Pop
331 a8083063 Iustin Pop
332 a8083063 Iustin Pop
def ShowInstanceConfig(opts, args):
333 a8083063 Iustin Pop
  """Compute instance run-time status.
334 a8083063 Iustin Pop
335 a8083063 Iustin Pop
  """
336 a8083063 Iustin Pop
337 a8083063 Iustin Pop
  retcode = 0
338 a8083063 Iustin Pop
  op = opcodes.OpQueryInstanceData(instances=args)
339 a8083063 Iustin Pop
  result = SubmitOpCode(op)
340 a8083063 Iustin Pop
341 a8083063 Iustin Pop
  if not result:
342 a8083063 Iustin Pop
    logger.ToStdout("No instances.")
343 a8083063 Iustin Pop
    return 1
344 a8083063 Iustin Pop
345 a8083063 Iustin Pop
  buf = StringIO()
346 a8083063 Iustin Pop
  retcode = 0
347 a8083063 Iustin Pop
  for instance_name in result:
348 a8083063 Iustin Pop
    instance = result[instance_name]
349 a8083063 Iustin Pop
    buf.write("Instance name: %s\n" % instance["name"])
350 a8083063 Iustin Pop
    buf.write("State: configured to be %s, actual state is %s\n" %
351 a8083063 Iustin Pop
              (instance["config_state"], instance["run_state"]))
352 a8083063 Iustin Pop
    buf.write("  Nodes:\n")
353 a8083063 Iustin Pop
    buf.write("    - primary: %s\n" % instance["pnode"])
354 a8083063 Iustin Pop
    buf.write("    - secondaries: %s\n" % ", ".join(instance["snodes"]))
355 a8083063 Iustin Pop
    buf.write("  Operating system: %s\n" % instance["os"])
356 a8083063 Iustin Pop
    buf.write("  Hardware:\n")
357 a8083063 Iustin Pop
    buf.write("    - memory: %dMiB\n" % instance["memory"])
358 a8083063 Iustin Pop
    buf.write("    - NICs: %s\n" %
359 a8083063 Iustin Pop
        ", ".join(["{MAC: %s, IP: %s, bridge: %s}" %
360 a8083063 Iustin Pop
                   (mac, ip, bridge)
361 a8083063 Iustin Pop
                     for mac, ip, bridge in instance["nics"]]))
362 a8083063 Iustin Pop
    buf.write("  Block devices:\n")
363 a8083063 Iustin Pop
364 a8083063 Iustin Pop
    for device in instance["disks"]:
365 a8083063 Iustin Pop
      _FormatBlockDevInfo(buf, device, 1)
366 a8083063 Iustin Pop
367 a8083063 Iustin Pop
  logger.ToStdout(buf.getvalue().rstrip('\n'))
368 a8083063 Iustin Pop
  return retcode
369 a8083063 Iustin Pop
370 a8083063 Iustin Pop
371 a8083063 Iustin Pop
def SetInstanceParms(opts, args):
372 a8083063 Iustin Pop
  """Modifies an instance.
373 a8083063 Iustin Pop
374 a8083063 Iustin Pop
  All parameters take effect only at the next restart of the instance.
375 a8083063 Iustin Pop
376 a8083063 Iustin Pop
  Args:
377 a8083063 Iustin Pop
    opts - class with options as members
378 a8083063 Iustin Pop
    args - list with a single element, the instance name
379 a8083063 Iustin Pop
  Opts used:
380 a8083063 Iustin Pop
    memory - the new memory size
381 a8083063 Iustin Pop
    vcpus - the new number of cpus
382 a8083063 Iustin Pop
383 a8083063 Iustin Pop
  """
384 a8083063 Iustin Pop
  if not opts.mem and not opts.vcpus and not opts.ip and not opts.bridge:
385 a8083063 Iustin Pop
    logger.ToStdout("Please give at least one of the parameters.")
386 a8083063 Iustin Pop
    return 1
387 a8083063 Iustin Pop
388 a8083063 Iustin Pop
  op = opcodes.OpSetInstanceParms(instance_name=args[0], mem=opts.mem,
389 a8083063 Iustin Pop
                                  vcpus=opts.vcpus, ip=opts.ip,
390 a8083063 Iustin Pop
                                  bridge=opts.bridge)
391 a8083063 Iustin Pop
  result = SubmitOpCode(op)
392 a8083063 Iustin Pop
393 a8083063 Iustin Pop
  if result:
394 a8083063 Iustin Pop
    logger.ToStdout("Modified instance %s" % args[0])
395 a8083063 Iustin Pop
    for param, data in result:
396 a8083063 Iustin Pop
      logger.ToStdout(" - %-5s -> %s" % (param, data))
397 a8083063 Iustin Pop
    logger.ToStdout("Please don't forget that these parameters take effect"
398 a8083063 Iustin Pop
                    " only at the next start of the instance.")
399 a8083063 Iustin Pop
  return 0
400 a8083063 Iustin Pop
401 a8083063 Iustin Pop
402 a8083063 Iustin Pop
# options used in more than one cmd
403 a8083063 Iustin Pop
node_opt = make_option("-n", "--node", dest="node", help="Target node",
404 a8083063 Iustin Pop
                       metavar="<node>")
405 a8083063 Iustin Pop
force_opt = make_option("-f", "--force", dest="force", action="store_true",
406 a8083063 Iustin Pop
                        default=False, help="Force the operation")
407 a8083063 Iustin Pop
408 a8083063 Iustin Pop
# this is defined separately due to readability only
409 a8083063 Iustin Pop
add_opts = [
410 a8083063 Iustin Pop
  DEBUG_OPT,
411 a8083063 Iustin Pop
  node_opt,
412 a8083063 Iustin Pop
  cli_option("-s", "--os-size", dest="size", help="Disk size",
413 a8083063 Iustin Pop
             default=20 * 1024, type="unit", metavar="<size>"),
414 a8083063 Iustin Pop
  cli_option("--swap-size", dest="swap", help="Swap size",
415 a8083063 Iustin Pop
             default=4 * 1024, type="unit", metavar="<size>"),
416 a8083063 Iustin Pop
  cli_option("-o", "--os-type", dest="os", help="What OS to run",
417 a8083063 Iustin Pop
             metavar="<os>"),
418 a8083063 Iustin Pop
  cli_option("-m", "--memory", dest="mem", help="Memory size",
419 a8083063 Iustin Pop
              default=128, type="unit", metavar="<mem>"),
420 a8083063 Iustin Pop
  make_option("-p", "--cpu", dest="vcpus", help="Number of virtual CPUs",
421 a8083063 Iustin Pop
              default=1, type="int", metavar="<PROC>"),
422 a8083063 Iustin Pop
  make_option("-t", "--disk-template", dest="disk_template",
423 a8083063 Iustin Pop
              help="Custom disk setup (diskless, plain, local_raid1 or"
424 a8083063 Iustin Pop
              " remote_raid1)", default=None, metavar="TEMPL"),
425 a8083063 Iustin Pop
  make_option("-i", "--ip", dest="ip",
426 a8083063 Iustin Pop
              help="IP address ('none' [default], 'auto', or specify address)",
427 a8083063 Iustin Pop
              default='none', type="string", metavar="<ADDRESS>"),
428 a8083063 Iustin Pop
  make_option("--no-wait-for-sync", dest="wait_for_sync", default=True,
429 a8083063 Iustin Pop
              action="store_false", help="Don't wait for sync (DANGEROUS!)"),
430 a8083063 Iustin Pop
  make_option("--secondary-node", dest="snode",
431 a8083063 Iustin Pop
              help="Secondary node for remote_raid1 disk layout",
432 a8083063 Iustin Pop
              metavar="<node>"),
433 a8083063 Iustin Pop
  make_option("-b", "--bridge", dest="bridge",
434 a8083063 Iustin Pop
              help="Bridge to connect this instance to",
435 a8083063 Iustin Pop
              default=None, metavar="<bridge>")
436 a8083063 Iustin Pop
  ]
437 a8083063 Iustin Pop
438 a8083063 Iustin Pop
439 a8083063 Iustin Pop
commands = {
440 a8083063 Iustin Pop
  'add': (AddInstance, ARGS_ONE, add_opts,
441 a8083063 Iustin Pop
          "[opts...] <name>",
442 a8083063 Iustin Pop
          "Creates and adds a new instance to the cluster"),
443 a8083063 Iustin Pop
  'add-mirror': (AddMDDRBDComponent, ARGS_ONE,
444 a8083063 Iustin Pop
                [DEBUG_OPT, node_opt,
445 a8083063 Iustin Pop
                 make_option("-b", "--disk", dest="disk", metavar="sdX",
446 a8083063 Iustin Pop
                             help=("The name of the instance disk for which to"
447 a8083063 Iustin Pop
                                   " add the mirror"))],
448 a8083063 Iustin Pop
                "-n node -b disk <instance>",
449 a8083063 Iustin Pop
                "Creates a new mirror for the instance"),
450 a8083063 Iustin Pop
  'console': (ConnectToInstanceConsole, ARGS_ONE, [DEBUG_OPT],
451 a8083063 Iustin Pop
              "<instance>",
452 a8083063 Iustin Pop
              "Opens a console on the specified instance"),
453 a8083063 Iustin Pop
  'failover': (FailoverInstance, ARGS_ONE,
454 a8083063 Iustin Pop
               [DEBUG_OPT, force_opt,
455 a8083063 Iustin Pop
                make_option("--ignore-consistency", dest="ignore_consistency",
456 a8083063 Iustin Pop
                            action="store_true", default=False,
457 a8083063 Iustin Pop
                            help="Ignore the consistency of the disks on"
458 a8083063 Iustin Pop
                            " the secondary"),
459 a8083063 Iustin Pop
                ],
460 a8083063 Iustin Pop
               "[-f] <instance>",
461 a8083063 Iustin Pop
               "Stops the instance and starts it on the backup node, using"
462 a8083063 Iustin Pop
               " the remote mirror (only for instances of type remote_raid1)"),
463 a8083063 Iustin Pop
  'info': (ShowInstanceConfig, ARGS_ANY, [DEBUG_OPT], "[<instance>...]",
464 a8083063 Iustin Pop
           "Show information on the specified instance"),
465 a8083063 Iustin Pop
  'list': (ListInstances, ARGS_NONE,
466 dcb93971 Michael Hanselmann
           [DEBUG_OPT, NOHDR_OPT, SEP_OPT, USEUNITS_OPT, FIELDS_OPT],
467 a8083063 Iustin Pop
           "", "Lists the instances and their status"),
468 a8083063 Iustin Pop
  'remove': (RemoveInstance, ARGS_ONE, [DEBUG_OPT, force_opt],
469 a8083063 Iustin Pop
             "[-f] <instance>", "Shuts down the instance and removes it"),
470 a8083063 Iustin Pop
  'remove-mirror': (RemoveMDDRBDComponent, ARGS_ONE,
471 a8083063 Iustin Pop
                   [DEBUG_OPT, node_opt,
472 a8083063 Iustin Pop
                    make_option("-b", "--disk", dest="disk", metavar="sdX",
473 a8083063 Iustin Pop
                                help=("The name of the instance disk"
474 a8083063 Iustin Pop
                                      " for which to add the mirror")),
475 a8083063 Iustin Pop
                    make_option("-p", "--port", dest="port", metavar="PORT",
476 a8083063 Iustin Pop
                                help=("The port of the drbd device"
477 a8083063 Iustin Pop
                                      " which to remove from the mirror"),
478 a8083063 Iustin Pop
                                type="int"),
479 a8083063 Iustin Pop
                    ],
480 a8083063 Iustin Pop
                   "-b disk -p port <instance>",
481 a8083063 Iustin Pop
                   "Removes a mirror from the instance"),
482 a8083063 Iustin Pop
  'replace-disks': (ReplaceDisks, ARGS_ONE,
483 a8083063 Iustin Pop
                    [DEBUG_OPT,
484 a8083063 Iustin Pop
                     make_option("-n", "--new-secondary", dest="new_secondary",
485 a8083063 Iustin Pop
                                 metavar="NODE",
486 a8083063 Iustin Pop
                                 help=("New secondary node (if you want to"
487 a8083063 Iustin Pop
                                       " change the secondary)"))],
488 a8083063 Iustin Pop
                    "[-n NODE] <instance>",
489 a8083063 Iustin Pop
                    "Replaces all disks for the instance"),
490 a8083063 Iustin Pop
491 a8083063 Iustin Pop
  'modify': (SetInstanceParms, ARGS_ONE,
492 a8083063 Iustin Pop
             [DEBUG_OPT, force_opt,
493 a8083063 Iustin Pop
              cli_option("-m", "--memory", dest="mem",
494 a8083063 Iustin Pop
                         help="Memory size",
495 a8083063 Iustin Pop
                         default=None, type="unit", metavar="<mem>"),
496 a8083063 Iustin Pop
              make_option("-p", "--cpu", dest="vcpus",
497 a8083063 Iustin Pop
                          help="Number of virtual CPUs",
498 a8083063 Iustin Pop
                          default=None, type="int", metavar="<PROC>"),
499 a8083063 Iustin Pop
              make_option("-i", "--ip", dest="ip",
500 a8083063 Iustin Pop
                          help="IP address ('none' or numeric IP)",
501 a8083063 Iustin Pop
                          default=None, type="string", metavar="<ADDRESS>"),
502 a8083063 Iustin Pop
              make_option("-b", "--bridge", dest="bridge",
503 a8083063 Iustin Pop
                          help="Bridge to connect this instance to",
504 a8083063 Iustin Pop
                          default=None, type="string", metavar="<bridge>")
505 a8083063 Iustin Pop
              ],
506 a8083063 Iustin Pop
             "<instance>", "Alters the parameters of an instance"),
507 a8083063 Iustin Pop
  'shutdown': (ShutdownInstance, ARGS_ONE, [DEBUG_OPT],
508 a8083063 Iustin Pop
               "<instance>", "Stops an instance"),
509 a8083063 Iustin Pop
  'startup': (StartupInstance, ARGS_ONE,
510 a8083063 Iustin Pop
              [DEBUG_OPT, force_opt,
511 a8083063 Iustin Pop
               make_option("-e", "--extra", dest="extra_args",
512 a8083063 Iustin Pop
                           help="Extra arguments for the instance's kernel",
513 a8083063 Iustin Pop
                           default=None, type="string", metavar="<PARAMS>"),
514 a8083063 Iustin Pop
               ],
515 a8083063 Iustin Pop
            "<instance>", "Starts an instance"),
516 a8083063 Iustin Pop
  'activate-disks': (ActivateDisks, ARGS_ONE, [DEBUG_OPT],
517 a8083063 Iustin Pop
                     "<instance>",
518 a8083063 Iustin Pop
                     "Activate an instance's disks"),
519 a8083063 Iustin Pop
  'deactivate-disks': (DeactivateDisks, ARGS_ONE, [DEBUG_OPT],
520 a8083063 Iustin Pop
                       "<instance>",
521 a8083063 Iustin Pop
                       "Deactivate an instance's disks"),
522 a8083063 Iustin Pop
  }
523 a8083063 Iustin Pop
524 a8083063 Iustin Pop
if __name__ == '__main__':
525 a8083063 Iustin Pop
  retcode = GenericMain(commands)
526 a8083063 Iustin Pop
  sys.exit(retcode)