Statistics
| Branch: | Tag: | Revision:

root / scripts / gnt-backup @ 2f79bd34

History | View | Annotate | Download (7.8 kB)

1 dd4b1106 Iustin Pop
#!/usr/bin/python
2 dd4b1106 Iustin Pop
#
3 dd4b1106 Iustin Pop
4 dd4b1106 Iustin Pop
# Copyright (C) 2006, 2007 Google Inc.
5 dd4b1106 Iustin Pop
#
6 dd4b1106 Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 dd4b1106 Iustin Pop
# it under the terms of the GNU General Public License as published by
8 dd4b1106 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 dd4b1106 Iustin Pop
# (at your option) any later version.
10 dd4b1106 Iustin Pop
#
11 dd4b1106 Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 dd4b1106 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 dd4b1106 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 dd4b1106 Iustin Pop
# General Public License for more details.
15 dd4b1106 Iustin Pop
#
16 dd4b1106 Iustin Pop
# You should have received a copy of the GNU General Public License
17 dd4b1106 Iustin Pop
# along with this program; if not, write to the Free Software
18 dd4b1106 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 dd4b1106 Iustin Pop
# 02110-1301, USA.
20 dd4b1106 Iustin Pop
21 dd4b1106 Iustin Pop
22 2f79bd34 Iustin Pop
# pylint: disable-msg=W0401,W0614
23 2f79bd34 Iustin Pop
# W0401: Wildcard import ganeti.cli
24 2f79bd34 Iustin Pop
# W0614: Unused import %s from wildcard import (since we need cli)
25 2f79bd34 Iustin Pop
26 dd4b1106 Iustin Pop
import sys
27 dd4b1106 Iustin Pop
from optparse import make_option
28 dd4b1106 Iustin Pop
29 dd4b1106 Iustin Pop
from ganeti.cli import *
30 dd4b1106 Iustin Pop
from ganeti import opcodes
31 dd4b1106 Iustin Pop
from ganeti import constants
32 dd4b1106 Iustin Pop
33 7c0d6283 Michael Hanselmann
34 e1d2aa39 Alexander Schreiber
_VALUE_TRUE = "true"
35 e1d2aa39 Alexander Schreiber
36 dd4b1106 Iustin Pop
def PrintExportList(opts, args):
37 dd4b1106 Iustin Pop
  """Prints a list of all the exported system images.
38 dd4b1106 Iustin Pop
39 dd4b1106 Iustin Pop
  Args:
40 dd4b1106 Iustin Pop
   opts - class with options as members (should be empty)
41 dd4b1106 Iustin Pop
   args - should be empty
42 dd4b1106 Iustin Pop
43 dd4b1106 Iustin Pop
  Returns:
44 dd4b1106 Iustin Pop
    nothing
45 dd4b1106 Iustin Pop
46 dd4b1106 Iustin Pop
  """
47 8bb66978 Michael Hanselmann
  exports = GetClient().QueryExports(opts.nodes)
48 dd4b1106 Iustin Pop
  for node in exports:
49 3a24c527 Iustin Pop
    ToStdout("Node: %s", node)
50 3a24c527 Iustin Pop
    ToStdout("Exports:")
51 461f0538 Guido Trotter
    if isinstance(exports[node], list):
52 461f0538 Guido Trotter
      for instance_name in exports[node]:
53 3a24c527 Iustin Pop
        ToStdout("\t%s", instance_name)
54 461f0538 Guido Trotter
    else:
55 3a24c527 Iustin Pop
      ToStdout("  Could not get exports list")
56 dd4b1106 Iustin Pop
57 dd4b1106 Iustin Pop
58 dd4b1106 Iustin Pop
def ExportInstance(opts, args):
59 dd4b1106 Iustin Pop
  """Export an instance to an image in the cluster.
60 dd4b1106 Iustin Pop
61 dd4b1106 Iustin Pop
  Args:
62 dd4b1106 Iustin Pop
   opts - class with options as members
63 dd4b1106 Iustin Pop
   args - list with a single element, the instance name
64 dd4b1106 Iustin Pop
65 dd4b1106 Iustin Pop
  Returns:
66 dd4b1106 Iustin Pop
    1 in case of error, 0 otherwise
67 dd4b1106 Iustin Pop
68 dd4b1106 Iustin Pop
  """
69 dd4b1106 Iustin Pop
  op = opcodes.OpExportInstance(instance_name=args[0],
70 dd4b1106 Iustin Pop
                                target_node=opts.node,
71 dd4b1106 Iustin Pop
                                shutdown=opts.shutdown)
72 dd4b1106 Iustin Pop
73 dd4b1106 Iustin Pop
  SubmitOpCode(op)
74 dd4b1106 Iustin Pop
75 60d49723 Michael Hanselmann
76 dd4b1106 Iustin Pop
def ImportInstance(opts, args):
77 dd4b1106 Iustin Pop
  """Add an instance to the cluster.
78 dd4b1106 Iustin Pop
79 dd4b1106 Iustin Pop
  Args:
80 dd4b1106 Iustin Pop
   opts - class with options as members
81 dd4b1106 Iustin Pop
   args - list with a single element, the new instance name
82 dd4b1106 Iustin Pop
  Opts used:
83 dd4b1106 Iustin Pop
   memory - amount of memory to allocate to instance (MiB)
84 dd4b1106 Iustin Pop
   size - amount of disk space to allocate to instance (MiB)
85 dd4b1106 Iustin Pop
   os - which OS to run on instance
86 dd4b1106 Iustin Pop
   node - node to run new instance on
87 dd4b1106 Iustin Pop
   src_node - node containing the export
88 dd4b1106 Iustin Pop
   src_dir - directory on the old node with the export in it
89 dd4b1106 Iustin Pop
90 dd4b1106 Iustin Pop
  Returns:
91 dd4b1106 Iustin Pop
    1 in case of error, 0 otherwise
92 dd4b1106 Iustin Pop
93 dd4b1106 Iustin Pop
  """
94 dd4b1106 Iustin Pop
  instance = args[0]
95 dd4b1106 Iustin Pop
96 60d49723 Michael Hanselmann
  (pnode, snode) = SplitNodeOption(opts.node)
97 60d49723 Michael Hanselmann
98 b03efa30 Guido Trotter
  hypervisor = None
99 b03efa30 Guido Trotter
  hvparams = {}
100 b03efa30 Guido Trotter
  if opts.hypervisor:
101 b03efa30 Guido Trotter
    hypervisor, hvparams = opts.hypervisor
102 b03efa30 Guido Trotter
103 b03efa30 Guido Trotter
  ValidateBeParams(opts.beparams)
104 b03efa30 Guido Trotter
105 338e51e8 Iustin Pop
  op = opcodes.OpCreateInstance(instance_name=instance,
106 dd4b1106 Iustin Pop
                                disk_size=opts.size, swap_size=opts.swap,
107 dd4b1106 Iustin Pop
                                disk_template=opts.disk_template,
108 098c0958 Michael Hanselmann
                                mode=constants.INSTANCE_IMPORT,
109 60d49723 Michael Hanselmann
                                pnode=pnode, snode=snode,
110 338e51e8 Iustin Pop
                                ip_check=opts.ip_check,
111 dd4b1106 Iustin Pop
                                ip=opts.ip, bridge=opts.bridge, start=False,
112 dd4b1106 Iustin Pop
                                src_node=opts.src_node, src_path=opts.src_dir,
113 538475ca Iustin Pop
                                wait_for_sync=opts.wait_for_sync, mac="auto",
114 93cb65c5 Manuel Franceschini
                                file_storage_dir=opts.file_storage_dir,
115 93cb65c5 Manuel Franceschini
                                file_driver=opts.file_driver,
116 e1d2aa39 Alexander Schreiber
                                iallocator=opts.iallocator,
117 b03efa30 Guido Trotter
                                hypervisor=hypervisor,
118 b03efa30 Guido Trotter
                                hvparams=hvparams,
119 b03efa30 Guido Trotter
                                beparams=opts.beparams)
120 e1d2aa39 Alexander Schreiber
121 dd4b1106 Iustin Pop
  SubmitOpCode(op)
122 dd4b1106 Iustin Pop
  return 0
123 dd4b1106 Iustin Pop
124 dd4b1106 Iustin Pop
125 9ac99fda Guido Trotter
def RemoveExport(opts, args):
126 9ac99fda Guido Trotter
  """Remove an export from the cluster.
127 9ac99fda Guido Trotter
128 9ac99fda Guido Trotter
  Args:
129 9ac99fda Guido Trotter
   opts - class with options as members
130 9ac99fda Guido Trotter
   args - list with a single element, the exported instance to remove
131 9ac99fda Guido Trotter
  Opts used:
132 9ac99fda Guido Trotter
133 9ac99fda Guido Trotter
  Returns:
134 9ac99fda Guido Trotter
    1 in case of error, 0 otherwise
135 9ac99fda Guido Trotter
136 9ac99fda Guido Trotter
  """
137 9ac99fda Guido Trotter
  instance = args[0]
138 9ac99fda Guido Trotter
  op = opcodes.OpRemoveExport(instance_name=args[0])
139 9ac99fda Guido Trotter
140 9ac99fda Guido Trotter
  SubmitOpCode(op)
141 9ac99fda Guido Trotter
  return 0
142 9ac99fda Guido Trotter
143 9ac99fda Guido Trotter
144 dd4b1106 Iustin Pop
# this is defined separately due to readability only
145 dd4b1106 Iustin Pop
import_opts = [
146 dd4b1106 Iustin Pop
  DEBUG_OPT,
147 60d49723 Michael Hanselmann
  make_option("-n", "--node", dest="node",
148 60d49723 Michael Hanselmann
              help="Target node and optional secondary node",
149 60d49723 Michael Hanselmann
              metavar="<pnode>[:<snode>]"),
150 d5687e89 Guido Trotter
  cli_option("-s", "--os-size", dest="size", help="Disk size, in MiB unless"
151 d5687e89 Guido Trotter
             " a suffix is used",
152 dd4b1106 Iustin Pop
             default=20 * 1024, type="unit", metavar="<size>"),
153 dd4b1106 Iustin Pop
  cli_option("--swap-size", dest="swap", help="Swap size",
154 dd4b1106 Iustin Pop
             default=4 * 1024, type="unit", metavar="<size>"),
155 b03efa30 Guido Trotter
  keyval_option("-B", "--backend", dest="beparams",
156 b03efa30 Guido Trotter
                type="keyval", default={},
157 b03efa30 Guido Trotter
                help="Backend parameters"),
158 dd4b1106 Iustin Pop
  make_option("-t", "--disk-template", dest="disk_template",
159 726a7f7f Iustin Pop
              help="Custom disk setup (diskless, file, plain, drbd)",
160 abdf0113 Iustin Pop
              default=None, metavar="TEMPL"),
161 dd4b1106 Iustin Pop
  make_option("-i", "--ip", dest="ip",
162 dd4b1106 Iustin Pop
              help="IP address ('none' [default], 'auto', or specify address)",
163 dd4b1106 Iustin Pop
              default='none', type="string", metavar="<ADDRESS>"),
164 dd4b1106 Iustin Pop
  make_option("--no-wait-for-sync", dest="wait_for_sync", default=True,
165 dd4b1106 Iustin Pop
              action="store_false", help="Don't wait for sync (DANGEROUS!)"),
166 dd4b1106 Iustin Pop
  make_option("-b", "--bridge", dest="bridge",
167 dd4b1106 Iustin Pop
              help="Bridge to connect this instance to",
168 dd4b1106 Iustin Pop
              default=None, metavar="<bridge>"),
169 dd4b1106 Iustin Pop
  make_option("--src-node", dest="src_node", help="Source node",
170 dd4b1106 Iustin Pop
              metavar="<node>"),
171 dd4b1106 Iustin Pop
  make_option("--src-dir", dest="src_dir", help="Source directory",
172 dd4b1106 Iustin Pop
              metavar="<dir>"),
173 bdd55f71 Iustin Pop
  make_option("--no-ip-check", dest="ip_check", default=True,
174 bdd55f71 Iustin Pop
              action="store_false", help="Don't check that the instance's IP"
175 bdd55f71 Iustin Pop
              " is alive"),
176 538475ca Iustin Pop
  make_option("--iallocator", metavar="<NAME>",
177 538475ca Iustin Pop
              help="Select nodes for the instance automatically using the"
178 538475ca Iustin Pop
              " <NAME> iallocator plugin", default=None, type="string"),
179 93cb65c5 Manuel Franceschini
  make_option("--file-storage-dir", dest="file_storage_dir",
180 93cb65c5 Manuel Franceschini
              help="Relative path under default cluster-wide file storage dir"
181 93cb65c5 Manuel Franceschini
              " to store file-based disks", default=None,
182 93cb65c5 Manuel Franceschini
              metavar="<DIR>"),
183 93cb65c5 Manuel Franceschini
  make_option("--file-driver", dest="file_driver", help="Driver to use"
184 93cb65c5 Manuel Franceschini
              " for image files", default="loop", metavar="<DRIVER>"),
185 b03efa30 Guido Trotter
  ikv_option("-H", "--hypervisor", dest="hypervisor",
186 b03efa30 Guido Trotter
              help="Hypervisor and hypervisor options, in the format"
187 b03efa30 Guido Trotter
              " hypervisor:option=value,option=value,...", default=None,
188 b03efa30 Guido Trotter
              type="identkeyval"),
189 dd4b1106 Iustin Pop
  ]
190 dd4b1106 Iustin Pop
191 dd4b1106 Iustin Pop
commands = {
192 dd4b1106 Iustin Pop
  'list': (PrintExportList, ARGS_NONE,
193 dd4b1106 Iustin Pop
           [DEBUG_OPT,
194 1e020d1b Michael Hanselmann
            make_option("--node", dest="nodes", default=[], action="append",
195 59885275 Guido Trotter
                        help="List only backups stored on this node"
196 59885275 Guido Trotter
                             " (can be used multiple times)"),
197 dd4b1106 Iustin Pop
            ],
198 9a033156 Iustin Pop
           "", "Lists instance exports available in the ganeti cluster"),
199 dd4b1106 Iustin Pop
  'export': (ExportInstance, ARGS_ONE,
200 60d49723 Michael Hanselmann
             [DEBUG_OPT, FORCE_OPT,
201 60d49723 Michael Hanselmann
              make_option("-n", "--node", dest="node", help="Target node",
202 60d49723 Michael Hanselmann
                          metavar="<node>"),
203 dd4b1106 Iustin Pop
              make_option("","--noshutdown", dest="shutdown",
204 dd4b1106 Iustin Pop
                          action="store_false", default=True,
205 dd4b1106 Iustin Pop
                          help="Don't shutdown the instance (unsafe)"), ],
206 9a033156 Iustin Pop
             "-n <target_node> [opts...] <name>",
207 dd4b1106 Iustin Pop
             "Exports an instance to an image"),
208 bdb7d4e8 Michael Hanselmann
  'import': (ImportInstance, ARGS_ONE, import_opts,
209 bdb7d4e8 Michael Hanselmann
             ("[...] -t disk-type -n node[:secondary-node]"
210 bdb7d4e8 Michael Hanselmann
              " --src-node node --src-dir dir"
211 bdb7d4e8 Michael Hanselmann
              " <name>"),
212 dd4b1106 Iustin Pop
             "Imports an instance from an exported image"),
213 9ac99fda Guido Trotter
  'remove': (RemoveExport, ARGS_ONE,
214 9ac99fda Guido Trotter
             [DEBUG_OPT],
215 9a033156 Iustin Pop
             "<name>",
216 9ac99fda Guido Trotter
             "Remove exports of named instance from the filesystem."),
217 dd4b1106 Iustin Pop
  }
218 dd4b1106 Iustin Pop
219 dd4b1106 Iustin Pop
if __name__ == '__main__':
220 3ecf6786 Iustin Pop
  sys.exit(GenericMain(commands))