gnt-backup 6.2 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/python
#

# Copyright (C) 2006, 2007 Google Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.


import sys
from optparse import make_option

from ganeti.cli import *
from ganeti import cmdlib
from ganeti import opcodes
from ganeti import constants

30

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
def PrintExportList(opts, args):
  """Prints a list of all the exported system images.

  Args:
   opts - class with options as members (should be empty)
   args - should be empty

  Returns:
    nothing

  """
  op = opcodes.OpQueryExports(nodes=opts.nodes)
  exports = SubmitOpCode(op)
  for node in exports:
    print ("Node: %s" % node)
    print ("Exports:")
47
48
49
50
51
    if isinstance(exports[node], list):
      for instance_name in exports[node]:
        print ("\t%s" % instance_name)
    else:
      print ("  Could not get exports list")
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70


def ExportInstance(opts, args):
  """Export an instance to an image in the cluster.

  Args:
   opts - class with options as members
   args - list with a single element, the instance name

  Returns:
    1 in case of error, 0 otherwise

  """
  op = opcodes.OpExportInstance(instance_name=args[0],
                                target_node=opts.node,
                                shutdown=opts.shutdown)

  SubmitOpCode(op)

71

72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
def ImportInstance(opts, args):
  """Add an instance to the cluster.

  Args:
   opts - class with options as members
   args - list with a single element, the new instance name
  Opts used:
   memory - amount of memory to allocate to instance (MiB)
   size - amount of disk space to allocate to instance (MiB)
   os - which OS to run on instance
   node - node to run new instance on
   src_node - node containing the export
   src_dir - directory on the old node with the export in it

  Returns:
    1 in case of error, 0 otherwise

  """
  instance = args[0]

92
93
  (pnode, snode) = SplitNodeOption(opts.node)

94
95
96
  op = opcodes.OpCreateInstance(instance_name=instance, mem_size=opts.mem,
                                disk_size=opts.size, swap_size=opts.swap,
                                disk_template=opts.disk_template,
97
                                mode=constants.INSTANCE_IMPORT,
98
                                pnode=pnode, snode=snode,
99
                                vcpus=opts.vcpus, ip_check=opts.ip_check,
100
101
                                ip=opts.ip, bridge=opts.bridge, start=False,
                                src_node=opts.src_node, src_path=opts.src_dir,
102
103
                                wait_for_sync=opts.wait_for_sync, mac="auto",
                                iallocator=opts.iallocator)
104
105
106
107
108
109
110
  SubmitOpCode(op)
  return 0


# this is defined separately due to readability only
import_opts = [
  DEBUG_OPT,
111
112
113
  make_option("-n", "--node", dest="node",
              help="Target node and optional secondary node",
              metavar="<pnode>[:<snode>]"),
114
115
  cli_option("-s", "--os-size", dest="size", help="Disk size, in MiB unless"
             " a suffix is used",
116
117
118
119
120
121
122
123
             default=20 * 1024, type="unit", metavar="<size>"),
  cli_option("--swap-size", dest="swap", help="Swap size",
             default=4 * 1024, type="unit", metavar="<size>"),
  cli_option("-m", "--memory", dest="mem", help="Memory size",
             default=128, type="unit", metavar="<mem>"),
  make_option("-p", "--cpu", dest="vcpus", help="Number of virtual CPUs",
              default=1, type="int", metavar="<PROC>"),
  make_option("-t", "--disk-template", dest="disk_template",
124
125
              help="Custom disk setup (diskless, plain, local_raid1,"
              " remote_raid1 or drbd)", default=None, metavar="TEMPL"),
126
127
128
129
130
131
132
133
134
135
136
137
  make_option("-i", "--ip", dest="ip",
              help="IP address ('none' [default], 'auto', or specify address)",
              default='none', type="string", metavar="<ADDRESS>"),
  make_option("--no-wait-for-sync", dest="wait_for_sync", default=True,
              action="store_false", help="Don't wait for sync (DANGEROUS!)"),
  make_option("-b", "--bridge", dest="bridge",
              help="Bridge to connect this instance to",
              default=None, metavar="<bridge>"),
  make_option("--src-node", dest="src_node", help="Source node",
              metavar="<node>"),
  make_option("--src-dir", dest="src_dir", help="Source directory",
              metavar="<dir>"),
138
139
140
  make_option("--no-ip-check", dest="ip_check", default=True,
              action="store_false", help="Don't check that the instance's IP"
              " is alive"),
141
142
143
  make_option("--iallocator", metavar="<NAME>",
              help="Select nodes for the instance automatically using the"
              " <NAME> iallocator plugin", default=None, type="string"),
144
145
146
147
148
  ]

commands = {
  'list': (PrintExportList, ARGS_NONE,
           [DEBUG_OPT,
149
            make_option("--node", dest="nodes", default=[], action="append",
Guido Trotter's avatar
Guido Trotter committed
150
151
                        help="List only backups stored on this node"
                             " (can be used multiple times)"),
152
153
154
            ],
           "", "Lists instance exports available in the ganeti cluster"),
  'export': (ExportInstance, ARGS_ONE,
155
156
157
             [DEBUG_OPT, FORCE_OPT,
              make_option("-n", "--node", dest="node", help="Target node",
                          metavar="<node>"),
158
159
160
              make_option("","--noshutdown", dest="shutdown",
                          action="store_false", default=True,
                          help="Don't shutdown the instance (unsafe)"), ],
161
             "-n <target_node> [opts...] <name>",
162
163
164
165
166
167
             "Exports an instance to an image"),
  'import': (ImportInstance, ARGS_ONE, import_opts, "[opts...] <name>",
             "Imports an instance from an exported image"),
  }

if __name__ == '__main__':
168
  sys.exit(GenericMain(commands))