gnt-backup 7.29 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
                                wait_for_sync=opts.wait_for_sync, mac="auto",
103
104
                                file_storage_dir=opts.file_storage_dir,
                                file_driver=opts.file_driver,
105
                                iallocator=opts.iallocator)
106
107
108
109
  SubmitOpCode(op)
  return 0


110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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


129
130
131
# this is defined separately due to readability only
import_opts = [
  DEBUG_OPT,
132
133
134
  make_option("-n", "--node", dest="node",
              help="Target node and optional secondary node",
              metavar="<pnode>[:<snode>]"),
135
136
  cli_option("-s", "--os-size", dest="size", help="Disk size, in MiB unless"
             " a suffix is used",
137
138
139
140
141
142
143
144
             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",
Iustin Pop's avatar
Iustin Pop committed
145
              help="Custom disk setup (diskless, file, plain, drbd)",
146
              default=None, metavar="TEMPL"),
147
148
149
150
151
152
153
154
155
156
157
158
  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>"),
159
160
161
  make_option("--no-ip-check", dest="ip_check", default=True,
              action="store_false", help="Don't check that the instance's IP"
              " is alive"),
162
163
164
  make_option("--iallocator", metavar="<NAME>",
              help="Select nodes for the instance automatically using the"
              " <NAME> iallocator plugin", default=None, type="string"),
165
166
167
168
169
170
  make_option("--file-storage-dir", dest="file_storage_dir",
              help="Relative path under default cluster-wide file storage dir"
              " to store file-based disks", default=None,
              metavar="<DIR>"),
  make_option("--file-driver", dest="file_driver", help="Driver to use"
              " for image files", default="loop", metavar="<DRIVER>"),
171
172
173
174
175
  ]

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

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