Statistics
| Branch: | Tag: | Revision:

root / scripts / gnt-backup @ 1f05af2b

History | View | Annotate | Download (7.3 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 dd4b1106 Iustin Pop
import sys
23 dd4b1106 Iustin Pop
from optparse import make_option
24 dd4b1106 Iustin Pop
25 dd4b1106 Iustin Pop
from ganeti.cli import *
26 dd4b1106 Iustin Pop
from ganeti import cmdlib
27 dd4b1106 Iustin Pop
from ganeti import opcodes
28 dd4b1106 Iustin Pop
from ganeti import constants
29 dd4b1106 Iustin Pop
30 7c0d6283 Michael Hanselmann
31 dd4b1106 Iustin Pop
def PrintExportList(opts, args):
32 dd4b1106 Iustin Pop
  """Prints a list of all the exported system images.
33 dd4b1106 Iustin Pop
34 dd4b1106 Iustin Pop
  Args:
35 dd4b1106 Iustin Pop
   opts - class with options as members (should be empty)
36 dd4b1106 Iustin Pop
   args - should be empty
37 dd4b1106 Iustin Pop
38 dd4b1106 Iustin Pop
  Returns:
39 dd4b1106 Iustin Pop
    nothing
40 dd4b1106 Iustin Pop
41 dd4b1106 Iustin Pop
  """
42 dd4b1106 Iustin Pop
  op = opcodes.OpQueryExports(nodes=opts.nodes)
43 dd4b1106 Iustin Pop
  exports = SubmitOpCode(op)
44 dd4b1106 Iustin Pop
  for node in exports:
45 dd4b1106 Iustin Pop
    print ("Node: %s" % node)
46 dd4b1106 Iustin Pop
    print ("Exports:")
47 461f0538 Guido Trotter
    if isinstance(exports[node], list):
48 461f0538 Guido Trotter
      for instance_name in exports[node]:
49 461f0538 Guido Trotter
        print ("\t%s" % instance_name)
50 461f0538 Guido Trotter
    else:
51 461f0538 Guido Trotter
      print ("  Could not get exports list")
52 dd4b1106 Iustin Pop
53 dd4b1106 Iustin Pop
54 dd4b1106 Iustin Pop
def ExportInstance(opts, args):
55 dd4b1106 Iustin Pop
  """Export an instance to an image in the cluster.
56 dd4b1106 Iustin Pop
57 dd4b1106 Iustin Pop
  Args:
58 dd4b1106 Iustin Pop
   opts - class with options as members
59 dd4b1106 Iustin Pop
   args - list with a single element, the instance name
60 dd4b1106 Iustin Pop
61 dd4b1106 Iustin Pop
  Returns:
62 dd4b1106 Iustin Pop
    1 in case of error, 0 otherwise
63 dd4b1106 Iustin Pop
64 dd4b1106 Iustin Pop
  """
65 dd4b1106 Iustin Pop
  op = opcodes.OpExportInstance(instance_name=args[0],
66 dd4b1106 Iustin Pop
                                target_node=opts.node,
67 dd4b1106 Iustin Pop
                                shutdown=opts.shutdown)
68 dd4b1106 Iustin Pop
69 dd4b1106 Iustin Pop
  SubmitOpCode(op)
70 dd4b1106 Iustin Pop
71 60d49723 Michael Hanselmann
72 dd4b1106 Iustin Pop
def ImportInstance(opts, args):
73 dd4b1106 Iustin Pop
  """Add an instance to the cluster.
74 dd4b1106 Iustin Pop
75 dd4b1106 Iustin Pop
  Args:
76 dd4b1106 Iustin Pop
   opts - class with options as members
77 dd4b1106 Iustin Pop
   args - list with a single element, the new instance name
78 dd4b1106 Iustin Pop
  Opts used:
79 dd4b1106 Iustin Pop
   memory - amount of memory to allocate to instance (MiB)
80 dd4b1106 Iustin Pop
   size - amount of disk space to allocate to instance (MiB)
81 dd4b1106 Iustin Pop
   os - which OS to run on instance
82 dd4b1106 Iustin Pop
   node - node to run new instance on
83 dd4b1106 Iustin Pop
   src_node - node containing the export
84 dd4b1106 Iustin Pop
   src_dir - directory on the old node with the export in it
85 dd4b1106 Iustin Pop
86 dd4b1106 Iustin Pop
  Returns:
87 dd4b1106 Iustin Pop
    1 in case of error, 0 otherwise
88 dd4b1106 Iustin Pop
89 dd4b1106 Iustin Pop
  """
90 dd4b1106 Iustin Pop
  instance = args[0]
91 dd4b1106 Iustin Pop
92 60d49723 Michael Hanselmann
  (pnode, snode) = SplitNodeOption(opts.node)
93 60d49723 Michael Hanselmann
94 dd4b1106 Iustin Pop
  op = opcodes.OpCreateInstance(instance_name=instance, mem_size=opts.mem,
95 dd4b1106 Iustin Pop
                                disk_size=opts.size, swap_size=opts.swap,
96 dd4b1106 Iustin Pop
                                disk_template=opts.disk_template,
97 098c0958 Michael Hanselmann
                                mode=constants.INSTANCE_IMPORT,
98 60d49723 Michael Hanselmann
                                pnode=pnode, snode=snode,
99 a181730e Michael Hanselmann
                                vcpus=opts.vcpus, ip_check=opts.ip_check,
100 dd4b1106 Iustin Pop
                                ip=opts.ip, bridge=opts.bridge, start=False,
101 dd4b1106 Iustin Pop
                                src_node=opts.src_node, src_path=opts.src_dir,
102 538475ca Iustin Pop
                                wait_for_sync=opts.wait_for_sync, mac="auto",
103 93cb65c5 Manuel Franceschini
                                file_storage_dir=opts.file_storage_dir,
104 93cb65c5 Manuel Franceschini
                                file_driver=opts.file_driver,
105 538475ca Iustin Pop
                                iallocator=opts.iallocator)
106 dd4b1106 Iustin Pop
  SubmitOpCode(op)
107 dd4b1106 Iustin Pop
  return 0
108 dd4b1106 Iustin Pop
109 dd4b1106 Iustin Pop
110 9ac99fda Guido Trotter
def RemoveExport(opts, args):
111 9ac99fda Guido Trotter
  """Remove an export from the cluster.
112 9ac99fda Guido Trotter
113 9ac99fda Guido Trotter
  Args:
114 9ac99fda Guido Trotter
   opts - class with options as members
115 9ac99fda Guido Trotter
   args - list with a single element, the exported instance to remove
116 9ac99fda Guido Trotter
  Opts used:
117 9ac99fda Guido Trotter
118 9ac99fda Guido Trotter
  Returns:
119 9ac99fda Guido Trotter
    1 in case of error, 0 otherwise
120 9ac99fda Guido Trotter
121 9ac99fda Guido Trotter
  """
122 9ac99fda Guido Trotter
  instance = args[0]
123 9ac99fda Guido Trotter
  op = opcodes.OpRemoveExport(instance_name=args[0])
124 9ac99fda Guido Trotter
125 9ac99fda Guido Trotter
  SubmitOpCode(op)
126 9ac99fda Guido Trotter
  return 0
127 9ac99fda Guido Trotter
128 9ac99fda Guido Trotter
129 dd4b1106 Iustin Pop
# this is defined separately due to readability only
130 dd4b1106 Iustin Pop
import_opts = [
131 dd4b1106 Iustin Pop
  DEBUG_OPT,
132 60d49723 Michael Hanselmann
  make_option("-n", "--node", dest="node",
133 60d49723 Michael Hanselmann
              help="Target node and optional secondary node",
134 60d49723 Michael Hanselmann
              metavar="<pnode>[:<snode>]"),
135 d5687e89 Guido Trotter
  cli_option("-s", "--os-size", dest="size", help="Disk size, in MiB unless"
136 d5687e89 Guido Trotter
             " a suffix is used",
137 dd4b1106 Iustin Pop
             default=20 * 1024, type="unit", metavar="<size>"),
138 dd4b1106 Iustin Pop
  cli_option("--swap-size", dest="swap", help="Swap size",
139 dd4b1106 Iustin Pop
             default=4 * 1024, type="unit", metavar="<size>"),
140 dd4b1106 Iustin Pop
  cli_option("-m", "--memory", dest="mem", help="Memory size",
141 dd4b1106 Iustin Pop
             default=128, type="unit", metavar="<mem>"),
142 dd4b1106 Iustin Pop
  make_option("-p", "--cpu", dest="vcpus", help="Number of virtual CPUs",
143 dd4b1106 Iustin Pop
              default=1, type="int", metavar="<PROC>"),
144 dd4b1106 Iustin Pop
  make_option("-t", "--disk-template", dest="disk_template",
145 726a7f7f Iustin Pop
              help="Custom disk setup (diskless, file, plain, drbd)",
146 abdf0113 Iustin Pop
              default=None, metavar="TEMPL"),
147 dd4b1106 Iustin Pop
  make_option("-i", "--ip", dest="ip",
148 dd4b1106 Iustin Pop
              help="IP address ('none' [default], 'auto', or specify address)",
149 dd4b1106 Iustin Pop
              default='none', type="string", metavar="<ADDRESS>"),
150 dd4b1106 Iustin Pop
  make_option("--no-wait-for-sync", dest="wait_for_sync", default=True,
151 dd4b1106 Iustin Pop
              action="store_false", help="Don't wait for sync (DANGEROUS!)"),
152 dd4b1106 Iustin Pop
  make_option("-b", "--bridge", dest="bridge",
153 dd4b1106 Iustin Pop
              help="Bridge to connect this instance to",
154 dd4b1106 Iustin Pop
              default=None, metavar="<bridge>"),
155 dd4b1106 Iustin Pop
  make_option("--src-node", dest="src_node", help="Source node",
156 dd4b1106 Iustin Pop
              metavar="<node>"),
157 dd4b1106 Iustin Pop
  make_option("--src-dir", dest="src_dir", help="Source directory",
158 dd4b1106 Iustin Pop
              metavar="<dir>"),
159 bdd55f71 Iustin Pop
  make_option("--no-ip-check", dest="ip_check", default=True,
160 bdd55f71 Iustin Pop
              action="store_false", help="Don't check that the instance's IP"
161 bdd55f71 Iustin Pop
              " is alive"),
162 538475ca Iustin Pop
  make_option("--iallocator", metavar="<NAME>",
163 538475ca Iustin Pop
              help="Select nodes for the instance automatically using the"
164 538475ca Iustin Pop
              " <NAME> iallocator plugin", default=None, type="string"),
165 93cb65c5 Manuel Franceschini
  make_option("--file-storage-dir", dest="file_storage_dir",
166 93cb65c5 Manuel Franceschini
              help="Relative path under default cluster-wide file storage dir"
167 93cb65c5 Manuel Franceschini
              " to store file-based disks", default=None,
168 93cb65c5 Manuel Franceschini
              metavar="<DIR>"),
169 93cb65c5 Manuel Franceschini
  make_option("--file-driver", dest="file_driver", help="Driver to use"
170 93cb65c5 Manuel Franceschini
              " for image files", default="loop", metavar="<DRIVER>"),
171 dd4b1106 Iustin Pop
  ]
172 dd4b1106 Iustin Pop
173 dd4b1106 Iustin Pop
commands = {
174 dd4b1106 Iustin Pop
  'list': (PrintExportList, ARGS_NONE,
175 dd4b1106 Iustin Pop
           [DEBUG_OPT,
176 1e020d1b Michael Hanselmann
            make_option("--node", dest="nodes", default=[], action="append",
177 59885275 Guido Trotter
                        help="List only backups stored on this node"
178 59885275 Guido Trotter
                             " (can be used multiple times)"),
179 dd4b1106 Iustin Pop
            ],
180 9a033156 Iustin Pop
           "", "Lists instance exports available in the ganeti cluster"),
181 dd4b1106 Iustin Pop
  'export': (ExportInstance, ARGS_ONE,
182 60d49723 Michael Hanselmann
             [DEBUG_OPT, FORCE_OPT,
183 60d49723 Michael Hanselmann
              make_option("-n", "--node", dest="node", help="Target node",
184 60d49723 Michael Hanselmann
                          metavar="<node>"),
185 dd4b1106 Iustin Pop
              make_option("","--noshutdown", dest="shutdown",
186 dd4b1106 Iustin Pop
                          action="store_false", default=True,
187 dd4b1106 Iustin Pop
                          help="Don't shutdown the instance (unsafe)"), ],
188 9a033156 Iustin Pop
             "-n <target_node> [opts...] <name>",
189 dd4b1106 Iustin Pop
             "Exports an instance to an image"),
190 bdb7d4e8 Michael Hanselmann
  'import': (ImportInstance, ARGS_ONE, import_opts,
191 bdb7d4e8 Michael Hanselmann
             ("[...] -t disk-type -n node[:secondary-node]"
192 bdb7d4e8 Michael Hanselmann
              " --src-node node --src-dir dir"
193 bdb7d4e8 Michael Hanselmann
              " <name>"),
194 dd4b1106 Iustin Pop
             "Imports an instance from an exported image"),
195 9ac99fda Guido Trotter
  'remove': (RemoveExport, ARGS_ONE,
196 9ac99fda Guido Trotter
             [DEBUG_OPT],
197 9a033156 Iustin Pop
             "<name>",
198 9ac99fda Guido Trotter
             "Remove exports of named instance from the filesystem."),
199 dd4b1106 Iustin Pop
  }
200 dd4b1106 Iustin Pop
201 dd4b1106 Iustin Pop
if __name__ == '__main__':
202 3ecf6786 Iustin Pop
  sys.exit(GenericMain(commands))