Statistics
| Branch: | Tag: | Revision:

root / scripts / gnt-backup @ 936f3c59

History | View | Annotate | Download (4.5 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
28 dd4b1106 Iustin Pop
from ganeti.cli import *
29 dd4b1106 Iustin Pop
from ganeti import opcodes
30 dd4b1106 Iustin Pop
from ganeti import constants
31 50a707fa Iustin Pop
from ganeti import errors
32 50a707fa Iustin Pop
from ganeti import utils
33 dd4b1106 Iustin Pop
34 7c0d6283 Michael Hanselmann
35 e1d2aa39 Alexander Schreiber
_VALUE_TRUE = "true"
36 e1d2aa39 Alexander Schreiber
37 a8005e17 Michael Hanselmann
38 dd4b1106 Iustin Pop
def PrintExportList(opts, args):
39 dd4b1106 Iustin Pop
  """Prints a list of all the exported system images.
40 dd4b1106 Iustin Pop
41 48de3413 Iustin Pop
  @param opts: the command line options selected by the user
42 48de3413 Iustin Pop
  @type args: list
43 48de3413 Iustin Pop
  @param args: should be an empty list
44 48de3413 Iustin Pop
  @rtype: int
45 48de3413 Iustin Pop
  @return: the desired exit code
46 dd4b1106 Iustin Pop
47 dd4b1106 Iustin Pop
  """
48 77921a95 Iustin Pop
  exports = GetClient().QueryExports(opts.nodes, False)
49 d70b3058 Iustin Pop
  retcode = 0
50 dd4b1106 Iustin Pop
  for node in exports:
51 3a24c527 Iustin Pop
    ToStdout("Node: %s", node)
52 3a24c527 Iustin Pop
    ToStdout("Exports:")
53 461f0538 Guido Trotter
    if isinstance(exports[node], list):
54 461f0538 Guido Trotter
      for instance_name in exports[node]:
55 3a24c527 Iustin Pop
        ToStdout("\t%s", instance_name)
56 461f0538 Guido Trotter
    else:
57 3a24c527 Iustin Pop
      ToStdout("  Could not get exports list")
58 d70b3058 Iustin Pop
      retcode = 1
59 d70b3058 Iustin Pop
  return retcode
60 dd4b1106 Iustin Pop
61 dd4b1106 Iustin Pop
62 dd4b1106 Iustin Pop
def ExportInstance(opts, args):
63 dd4b1106 Iustin Pop
  """Export an instance to an image in the cluster.
64 dd4b1106 Iustin Pop
65 48de3413 Iustin Pop
  @param opts: the command line options selected by the user
66 48de3413 Iustin Pop
  @type args: list
67 48de3413 Iustin Pop
  @param args: should contain only one element, the name
68 48de3413 Iustin Pop
      of the instance to be exported
69 48de3413 Iustin Pop
  @rtype: int
70 48de3413 Iustin Pop
  @return: the desired exit code
71 dd4b1106 Iustin Pop
72 dd4b1106 Iustin Pop
  """
73 dd4b1106 Iustin Pop
  op = opcodes.OpExportInstance(instance_name=args[0],
74 dd4b1106 Iustin Pop
                                target_node=opts.node,
75 17c3f802 Guido Trotter
                                shutdown=opts.shutdown,
76 4d98c565 Guido Trotter
                                shutdown_timeout=opts.shutdown_timeout)
77 dd4b1106 Iustin Pop
78 084f05a5 Iustin Pop
  fin_resu, dlist = SubmitOpCode(op)
79 084f05a5 Iustin Pop
  if not isinstance(dlist, list):
80 084f05a5 Iustin Pop
    ToStderr("Cannot parse execution results")
81 084f05a5 Iustin Pop
    return 1
82 084f05a5 Iustin Pop
  tot_dsk = len(dlist)
83 084f05a5 Iustin Pop
  # TODO: handle diskless instances
84 084f05a5 Iustin Pop
  if dlist.count(False) == 0:
85 084f05a5 Iustin Pop
    # all OK
86 084f05a5 Iustin Pop
    rcode = 0
87 084f05a5 Iustin Pop
  elif dlist.count(True) == 0:
88 084f05a5 Iustin Pop
    ToStderr("Error: No disks were backed up successfully."
89 084f05a5 Iustin Pop
             " The export doesn't have any valid data,"
90 084f05a5 Iustin Pop
             " it is recommended to retry the operation.")
91 084f05a5 Iustin Pop
    rcode = 1
92 084f05a5 Iustin Pop
  else:
93 084f05a5 Iustin Pop
    ToStderr("Partial export failure: %d disks backed up, %d disks failed.",
94 084f05a5 Iustin Pop
             dlist.count(True), dlist.count(False))
95 084f05a5 Iustin Pop
    rcode = 2
96 084f05a5 Iustin Pop
  if not fin_resu:
97 084f05a5 Iustin Pop
    rcode = 1
98 084f05a5 Iustin Pop
  return rcode
99 60d49723 Michael Hanselmann
100 dd4b1106 Iustin Pop
def ImportInstance(opts, args):
101 dd4b1106 Iustin Pop
  """Add an instance to the cluster.
102 dd4b1106 Iustin Pop
103 d77490c5 Iustin Pop
  This is just a wrapper over GenericInstanceCreate.
104 dd4b1106 Iustin Pop
105 dd4b1106 Iustin Pop
  """
106 d77490c5 Iustin Pop
  return GenericInstanceCreate(constants.INSTANCE_IMPORT, opts, args)
107 dd4b1106 Iustin Pop
108 dd4b1106 Iustin Pop
109 9ac99fda Guido Trotter
def RemoveExport(opts, args):
110 9ac99fda Guido Trotter
  """Remove an export from the cluster.
111 9ac99fda Guido Trotter
112 48de3413 Iustin Pop
  @param opts: the command line options selected by the user
113 48de3413 Iustin Pop
  @type args: list
114 48de3413 Iustin Pop
  @param args: should contain only one element, the name of the
115 48de3413 Iustin Pop
      instance whose backup should be removed
116 48de3413 Iustin Pop
  @rtype: int
117 48de3413 Iustin Pop
  @return: the desired exit code
118 9ac99fda Guido Trotter
119 9ac99fda Guido Trotter
  """
120 9ac99fda Guido Trotter
  instance = args[0]
121 9ac99fda Guido Trotter
  op = opcodes.OpRemoveExport(instance_name=args[0])
122 9ac99fda Guido Trotter
123 9ac99fda Guido Trotter
  SubmitOpCode(op)
124 9ac99fda Guido Trotter
  return 0
125 9ac99fda Guido Trotter
126 9ac99fda Guido Trotter
127 dd4b1106 Iustin Pop
# this is defined separately due to readability only
128 dd4b1106 Iustin Pop
import_opts = [
129 990b7886 Iustin Pop
  NODE_PLACEMENT_OPT,
130 087ed2ed Iustin Pop
  BACKEND_OPT,
131 4f365444 Iustin Pop
  DISK_TEMPLATE_OPT,
132 e3876ccb Iustin Pop
  DISK_OPT,
133 ff00c1a7 Iustin Pop
  OS_SIZE_OPT,
134 7d3a9fab Iustin Pop
  NET_OPT,
135 26023ecd Iustin Pop
  NONICS_OPT,
136 3f75b4f3 Iustin Pop
  NWSYNC_OPT,
137 df62e5db Iustin Pop
  SRC_DIR_OPT,
138 df62e5db Iustin Pop
  SRC_NODE_OPT,
139 91e0748c Iustin Pop
  NOIPCHECK_OPT,
140 4eb62659 Iustin Pop
  IALLOCATOR_OPT,
141 4a25828c Iustin Pop
  FILESTORE_DIR_OPT,
142 0f87c43e Iustin Pop
  FILESTORE_DRIVER_OPT,
143 236fd9c4 Iustin Pop
  HYPERVISOR_OPT,
144 d77490c5 Iustin Pop
  SUBMIT_OPT,
145 dd4b1106 Iustin Pop
  ]
146 dd4b1106 Iustin Pop
147 dd4b1106 Iustin Pop
commands = {
148 6ea815cf Iustin Pop
  'list': (
149 6ea815cf Iustin Pop
    PrintExportList, ARGS_NONE,
150 064c21f8 Iustin Pop
    [NODE_LIST_OPT],
151 6ea815cf Iustin Pop
    "", "Lists instance exports available in the ganeti cluster"),
152 6ea815cf Iustin Pop
  'export': (
153 6ea815cf Iustin Pop
    ExportInstance, ARGS_ONE_INSTANCE,
154 17c3f802 Guido Trotter
    [FORCE_OPT, SINGLE_NODE_OPT, NOSHUTDOWN_OPT, SHUTDOWN_TIMEOUT_OPT],
155 6ea815cf Iustin Pop
    "-n <target_node> [opts...] <name>",
156 6ea815cf Iustin Pop
    "Exports an instance to an image"),
157 6ea815cf Iustin Pop
  'import': (
158 6ea815cf Iustin Pop
    ImportInstance, ARGS_ONE_INSTANCE, import_opts,
159 6ea815cf Iustin Pop
    "[...] -t disk-type -n node[:secondary-node] <name>",
160 6ea815cf Iustin Pop
    "Imports an instance from an exported image"),
161 6ea815cf Iustin Pop
  'remove': (
162 064c21f8 Iustin Pop
    RemoveExport, [ArgUnknown(min=1, max=1)], [],
163 6ea815cf Iustin Pop
    "<name>", "Remove exports of named instance from the filesystem."),
164 dd4b1106 Iustin Pop
  }
165 dd4b1106 Iustin Pop
166 a8005e17 Michael Hanselmann
167 dd4b1106 Iustin Pop
if __name__ == '__main__':
168 3ecf6786 Iustin Pop
  sys.exit(GenericMain(commands))