gnt-backup 7.2 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",
145 146
              help="Custom disk setup (diskless, plain, local_raid1,"
              " remote_raid1 or drbd)", 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
  'import': (ImportInstance, ARGS_ONE, import_opts, "[opts...] <name>",
191
             "Imports an instance from an exported image"),
192 193
  'remove': (RemoveExport, ARGS_ONE,
             [DEBUG_OPT],
194
             "<name>",
195
             "Remove exports of named instance from the filesystem."),
196 197 198
  }

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