gnt-backup 6.71 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
  SubmitOpCode(op)
  return 0


108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
def RemoveExport(opts, args):
  """Remove an export from the cluster.

  Args:
   opts - class with options as members
   args - list with a single element, the exported instance to remove
  Opts used:

  Returns:
    1 in case of error, 0 otherwise

  """
  instance = args[0]
  op = opcodes.OpRemoveExport(instance_name=args[0])

  SubmitOpCode(op)
  return 0


127
128
129
# this is defined separately due to readability only
import_opts = [
  DEBUG_OPT,
130
131
132
  make_option("-n", "--node", dest="node",
              help="Target node and optional secondary node",
              metavar="<pnode>[:<snode>]"),
133
134
  cli_option("-s", "--os-size", dest="size", help="Disk size, in MiB unless"
             " a suffix is used",
135
136
137
138
139
140
141
142
             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",
143
144
              help="Custom disk setup (diskless, plain, local_raid1,"
              " remote_raid1 or drbd)", default=None, metavar="TEMPL"),
145
146
147
148
149
150
151
152
153
154
155
156
  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>"),
157
158
159
  make_option("--no-ip-check", dest="ip_check", default=True,
              action="store_false", help="Don't check that the instance's IP"
              " is alive"),
160
161
162
  make_option("--iallocator", metavar="<NAME>",
              help="Select nodes for the instance automatically using the"
              " <NAME> iallocator plugin", default=None, type="string"),
163
164
165
166
167
  ]

commands = {
  'list': (PrintExportList, ARGS_NONE,
           [DEBUG_OPT,
168
            make_option("--node", dest="nodes", default=[], action="append",
Guido Trotter's avatar
Guido Trotter committed
169
170
                        help="List only backups stored on this node"
                             " (can be used multiple times)"),
171
172
173
            ],
           "", "Lists instance exports available in the ganeti cluster"),
  'export': (ExportInstance, ARGS_ONE,
174
175
176
             [DEBUG_OPT, FORCE_OPT,
              make_option("-n", "--node", dest="node", help="Target node",
                          metavar="<node>"),
177
178
179
              make_option("","--noshutdown", dest="shutdown",
                          action="store_false", default=True,
                          help="Don't shutdown the instance (unsafe)"), ],
180
             "-n <target_node> [opts...] <name>",
181
182
183
             "Exports an instance to an image"),
  'import': (ImportInstance, ARGS_ONE, import_opts, "[opts...] <name>",
             "Imports an instance from an exported image"),
184
185
186
187
  'remove': (RemoveExport, ARGS_ONE,
             [DEBUG_OPT],
             "<name>",
             "Remove exports of named instance from the filesystem."),
188
189
190
  }

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