gnt-backup 5.95 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,
Iustin Pop's avatar
Iustin Pop committed
102
                                wait_for_sync=opts.wait_for_sync, mac="auto")
103
104
105
106
107
108
109
  SubmitOpCode(op)
  return 0


# this is defined separately due to readability only
import_opts = [
  DEBUG_OPT,
110
111
112
  make_option("-n", "--node", dest="node",
              help="Target node and optional secondary node",
              metavar="<pnode>[:<snode>]"),
113
114
  cli_option("-s", "--os-size", dest="size", help="Disk size, in MiB unless"
             " a suffix is used",
115
116
117
118
119
120
121
122
             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",
123
124
              help="Custom disk setup (diskless, plain, local_raid1,"
              " remote_raid1 or drbd)", default=None, metavar="TEMPL"),
125
126
127
128
129
130
131
132
133
134
135
136
  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>"),
137
138
139
  make_option("--no-ip-check", dest="ip_check", default=True,
              action="store_false", help="Don't check that the instance's IP"
              " is alive"),
140
141
142
143
144
  ]

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

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