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
30 """Backup related commands"""
31
32
33
34
35
36
37
38 from ganeti.cli import *
39 from ganeti import opcodes
40 from ganeti import constants
41 from ganeti import errors
42 from ganeti import qlang
43
44
45 _LIST_DEF_FIELDS = ["node", "export"]
46
47
49 """Prints a list of all the exported system images.
50
51 @param opts: the command line options selected by the user
52 @type args: list
53 @param args: should be an empty list
54 @rtype: int
55 @return: the desired exit code
56
57 """
58 selected_fields = ParseFields(opts.output, _LIST_DEF_FIELDS)
59
60 qfilter = qlang.MakeSimpleFilter("node", opts.nodes)
61
62 cl = GetClient()
63
64 return GenericList(constants.QR_EXPORT, selected_fields, None, opts.units,
65 opts.separator, not opts.no_headers,
66 verbose=opts.verbose, qfilter=qfilter, cl=cl)
67
68
70 """List export fields.
71
72 @param opts: the command line options selected by the user
73 @type args: list
74 @param args: fields to list, or empty for all
75 @rtype: int
76 @return: the desired exit code
77
78 """
79 cl = GetClient()
80
81 return GenericListFields(constants.QR_EXPORT, args, opts.separator,
82 not opts.no_headers, cl=cl)
83
84
86 """Export an instance to an image in the cluster.
87
88 @param opts: the command line options selected by the user
89 @type args: list
90 @param args: should contain only one element, the name
91 of the instance to be exported
92 @rtype: int
93 @return: the desired exit code
94
95 """
96 ignore_remove_failures = opts.ignore_remove_failures
97
98 if not opts.node:
99 raise errors.OpPrereqError("Target node must be specified",
100 errors.ECODE_INVAL)
101
102 op = opcodes.OpBackupExport(
103 instance_name=args[0],
104 target_node=opts.node,
105 compress=opts.transport_compression,
106 shutdown=opts.shutdown,
107 shutdown_timeout=opts.shutdown_timeout,
108 remove_instance=opts.remove_instance,
109 ignore_remove_failures=ignore_remove_failures,
110 zero_free_space=opts.zero_free_space,
111 zeroing_timeout_fixed=opts.zeroing_timeout_fixed,
112 zeroing_timeout_per_mib=opts.zeroing_timeout_per_mib
113 )
114
115 SubmitOrSend(op, opts)
116 return 0
117
118
126
127
129 """Remove an export from the cluster.
130
131 @param opts: the command line options selected by the user
132 @type args: list
133 @param args: should contain only one element, the name of the
134 instance whose backup should be removed
135 @rtype: int
136 @return: the desired exit code
137
138 """
139 op = opcodes.OpBackupRemove(instance_name=args[0])
140
141 SubmitOrSend(op, opts)
142 return 0
143
144
145
146 import_opts = [
147 IDENTIFY_DEFAULTS_OPT,
148 SRC_DIR_OPT,
149 SRC_NODE_OPT,
150 COMPRESS_OPT,
151 IGNORE_IPOLICY_OPT,
152 HELPER_STARTUP_TIMEOUT_OPT,
153 HELPER_SHUTDOWN_TIMEOUT_OPT,
154 ]
155
156
157 commands = {
158 "list": (
159 PrintExportList, ARGS_NONE,
160 [NODE_LIST_OPT, NOHDR_OPT, SEP_OPT, USEUNITS_OPT, FIELDS_OPT, VERBOSE_OPT],
161 "", "Lists instance exports available in the ganeti cluster"),
162 "list-fields": (
163 ListExportFields, [ArgUnknown()],
164 [NOHDR_OPT, SEP_OPT],
165 "[fields...]",
166 "Lists all available fields for exports"),
167 "export": (
168 ExportInstance, ARGS_ONE_INSTANCE,
169 [FORCE_OPT, SINGLE_NODE_OPT, TRANSPORT_COMPRESSION_OPT, NOSHUTDOWN_OPT,
170 SHUTDOWN_TIMEOUT_OPT, REMOVE_INSTANCE_OPT, IGNORE_REMOVE_FAILURES_OPT,
171 DRY_RUN_OPT, PRIORITY_OPT, ZERO_FREE_SPACE_OPT, ZEROING_TIMEOUT_FIXED_OPT,
172 ZEROING_TIMEOUT_PER_MIB_OPT] + SUBMIT_OPTS,
173 "-n <target_node> [opts...] <name>",
174 "Exports an instance to an image"),
175 "import": (
176 ImportInstance, ARGS_ONE_INSTANCE, COMMON_CREATE_OPTS + import_opts,
177 "[...] -t disk-type -n node[:secondary-node] <name>",
178 "Imports an instance from an exported image"),
179 "remove": (
180 RemoveExport, [ArgUnknown(min=1, max=1)],
181 [DRY_RUN_OPT, PRIORITY_OPT] + SUBMIT_OPTS,
182 "<name>", "Remove exports of named instance from the filesystem."),
183 }
184
185
188