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 long_sleep=opts.long_sleep
114 )
115
116 SubmitOrSend(op, opts)
117 return 0
118
119
127
128
130 """Remove an export from the cluster.
131
132 @param opts: the command line options selected by the user
133 @type args: list
134 @param args: should contain only one element, the name of the
135 instance whose backup should be removed
136 @rtype: int
137 @return: the desired exit code
138
139 """
140 op = opcodes.OpBackupRemove(instance_name=args[0])
141
142 SubmitOrSend(op, opts)
143 return 0
144
145
146
147 import_opts = [
148 IDENTIFY_DEFAULTS_OPT,
149 SRC_DIR_OPT,
150 SRC_NODE_OPT,
151 COMPRESS_OPT,
152 IGNORE_IPOLICY_OPT,
153 HELPER_STARTUP_TIMEOUT_OPT,
154 HELPER_SHUTDOWN_TIMEOUT_OPT,
155 ]
156
157
158 commands = {
159 "list": (
160 PrintExportList, ARGS_NONE,
161 [NODE_LIST_OPT, NOHDR_OPT, SEP_OPT, USEUNITS_OPT, FIELDS_OPT, VERBOSE_OPT],
162 "", "Lists instance exports available in the ganeti cluster"),
163 "list-fields": (
164 ListExportFields, [ArgUnknown()],
165 [NOHDR_OPT, SEP_OPT],
166 "[fields...]",
167 "Lists all available fields for exports"),
168 "export": (
169 ExportInstance, ARGS_ONE_INSTANCE,
170 [FORCE_OPT, SINGLE_NODE_OPT, TRANSPORT_COMPRESSION_OPT, NOSHUTDOWN_OPT,
171 SHUTDOWN_TIMEOUT_OPT, REMOVE_INSTANCE_OPT, IGNORE_REMOVE_FAILURES_OPT,
172 DRY_RUN_OPT, PRIORITY_OPT, ZERO_FREE_SPACE_OPT, ZEROING_TIMEOUT_FIXED_OPT,
173 ZEROING_TIMEOUT_PER_MIB_OPT, LONG_SLEEP_OPT] + SUBMIT_OPTS,
174 "-n <target_node> [opts...] <name>",
175 "Exports an instance to an image"),
176 "import": (
177 ImportInstance, ARGS_ONE_INSTANCE, COMMON_CREATE_OPTS + import_opts,
178 "[...] -t disk-type -n node[:secondary-node] <name>",
179 "Imports an instance from an exported image"),
180 "remove": (
181 RemoveExport, [ArgUnknown(min=1, max=1)],
182 [DRY_RUN_OPT, PRIORITY_OPT] + SUBMIT_OPTS,
183 "<name>", "Remove exports of named instance from the filesystem."),
184 }
185
186
189