Revision 1c3231aa lib/cmdlib/backup.py
b/lib/cmdlib/backup.py | ||
---|---|---|
35 | 35 |
|
36 | 36 |
from ganeti.cmdlib.base import QueryBase, NoHooksLU, LogicalUnit |
37 | 37 |
from ganeti.cmdlib.common import GetWantedNodes, ShareAll, CheckNodeOnline, \ |
38 |
ExpandNodeName |
|
38 |
ExpandNodeUuidAndName
|
|
39 | 39 |
from ganeti.cmdlib.instance_storage import StartInstanceDisks, \ |
40 | 40 |
ShutdownInstanceDisks |
41 | 41 |
from ganeti.cmdlib.instance_utils import GetClusterDomainSecret, \ |
... | ... | |
53 | 53 |
|
54 | 54 |
# The following variables interact with _QueryBase._GetNames |
55 | 55 |
if self.names: |
56 |
self.wanted = GetWantedNodes(lu, self.names)
|
|
56 |
(self.wanted, _) = GetWantedNodes(lu, self.names)
|
|
57 | 57 |
else: |
58 | 58 |
self.wanted = locking.ALL_SET |
59 | 59 |
|
... | ... | |
82 | 82 |
if level != locking.LEVEL_CLUSTER) or |
83 | 83 |
self.do_locking or self.use_locking) |
84 | 84 |
|
85 |
nodes = self._GetNames(lu, lu.cfg.GetNodeList(), locking.LEVEL_NODE) |
|
85 |
node_uuids = self._GetNames(lu, lu.cfg.GetNodeList(), locking.LEVEL_NODE)
|
|
86 | 86 |
|
87 | 87 |
result = [] |
88 | 88 |
|
89 |
for (node, nres) in lu.rpc.call_export_list(nodes).items():
|
|
89 |
for (node_uuid, nres) in lu.rpc.call_export_list(node_uuids).items():
|
|
90 | 90 |
if nres.fail_msg: |
91 |
result.append((node, None)) |
|
91 |
result.append((node_uuid, None))
|
|
92 | 92 |
else: |
93 |
result.extend((node, expname) for expname in nres.payload) |
|
93 |
result.extend((node_uuid, expname) for expname in nres.payload)
|
|
94 | 94 |
|
95 | 95 |
return result |
96 | 96 |
|
... | ... | |
154 | 154 |
if self.op.mode == constants.EXPORT_MODE_REMOTE: |
155 | 155 |
salt = utils.GenerateSecret(8) |
156 | 156 |
|
157 |
feedback_fn("Generating X509 certificate on %s" % instance.primary_node) |
|
157 |
feedback_fn("Generating X509 certificate on %s" % |
|
158 |
self.cfg.GetNodeName(instance.primary_node)) |
|
158 | 159 |
result = self.rpc.call_x509_cert_create(instance.primary_node, |
159 | 160 |
constants.RIE_CERT_VALIDITY) |
160 |
result.Raise("Can't create X509 key and certificate on %s" % result.node) |
|
161 |
result.Raise("Can't create X509 key and certificate on %s" % |
|
162 |
self.cfg.GetNodeName(result.node)) |
|
161 | 163 |
|
162 | 164 |
(name, cert_pem) = result.payload |
163 | 165 |
|
... | ... | |
203 | 205 |
|
204 | 206 |
# Lock all nodes for local exports |
205 | 207 |
if self.op.mode == constants.EXPORT_MODE_LOCAL: |
208 |
(self.op.target_node_uuid, self.op.target_node) = \ |
|
209 |
ExpandNodeUuidAndName(self.cfg, self.op.target_node_uuid, |
|
210 |
self.op.target_node) |
|
206 | 211 |
# FIXME: lock only instance primary and destination node |
207 | 212 |
# |
208 | 213 |
# Sad but true, for now we have do lock all nodes, as we don't know where |
... | ... | |
248 | 253 |
nl = [self.cfg.GetMasterNode(), self.instance.primary_node] |
249 | 254 |
|
250 | 255 |
if self.op.mode == constants.EXPORT_MODE_LOCAL: |
251 |
nl.append(self.op.target_node) |
|
256 |
nl.append(self.op.target_node_uuid)
|
|
252 | 257 |
|
253 | 258 |
return (nl, nl) |
254 | 259 |
|
... | ... | |
272 | 277 |
" down before", errors.ECODE_STATE) |
273 | 278 |
|
274 | 279 |
if self.op.mode == constants.EXPORT_MODE_LOCAL: |
275 |
self.op.target_node = ExpandNodeName(self.cfg, self.op.target_node) |
|
276 |
self.dst_node = self.cfg.GetNodeInfo(self.op.target_node) |
|
280 |
self.dst_node = self.cfg.GetNodeInfo(self.op.target_node_uuid) |
|
277 | 281 |
assert self.dst_node is not None |
278 | 282 |
|
279 |
CheckNodeOnline(self, self.dst_node.name)
|
|
280 |
CheckNodeNotDrained(self, self.dst_node.name)
|
|
283 |
CheckNodeOnline(self, self.dst_node.uuid)
|
|
284 |
CheckNodeNotDrained(self, self.dst_node.uuid)
|
|
281 | 285 |
|
282 | 286 |
self._cds = None |
283 | 287 |
self.dest_disk_info = None |
... | ... | |
355 | 359 |
""" |
356 | 360 |
assert self.op.mode != constants.EXPORT_MODE_REMOTE |
357 | 361 |
|
358 |
nodelist = self.cfg.GetNodeList()
|
|
359 |
nodelist.remove(self.dst_node.name)
|
|
362 |
node_uuids = self.cfg.GetNodeList()
|
|
363 |
node_uuids.remove(self.dst_node.uuid)
|
|
360 | 364 |
|
361 | 365 |
# on one-node clusters nodelist will be empty after the removal |
362 | 366 |
# if we proceed the backup would be removed because OpBackupQuery |
363 | 367 |
# substitutes an empty list with the full cluster node list. |
364 | 368 |
iname = self.instance.name |
365 |
if nodelist:
|
|
369 |
if node_uuids:
|
|
366 | 370 |
feedback_fn("Removing old exports for instance %s" % iname) |
367 |
exportlist = self.rpc.call_export_list(nodelist)
|
|
368 |
for node in exportlist: |
|
369 |
if exportlist[node].fail_msg: |
|
371 |
exportlist = self.rpc.call_export_list(node_uuids)
|
|
372 |
for node_uuid in exportlist:
|
|
373 |
if exportlist[node_uuid].fail_msg:
|
|
370 | 374 |
continue |
371 |
if iname in exportlist[node].payload: |
|
372 |
msg = self.rpc.call_export_remove(node, iname).fail_msg |
|
375 |
if iname in exportlist[node_uuid].payload:
|
|
376 |
msg = self.rpc.call_export_remove(node_uuid, iname).fail_msg
|
|
373 | 377 |
if msg: |
374 | 378 |
self.LogWarning("Could not remove older export for instance %s" |
375 |
" on node %s: %s", iname, node, msg) |
|
379 |
" on node %s: %s", iname, |
|
380 |
self.cfg.GetNodeName(node_uuid), msg) |
|
376 | 381 |
|
377 | 382 |
def Exec(self, feedback_fn): |
378 | 383 |
"""Export an instance to an image in the cluster. |
... | ... | |
381 | 386 |
assert self.op.mode in constants.EXPORT_MODES |
382 | 387 |
|
383 | 388 |
instance = self.instance |
384 |
src_node = instance.primary_node |
|
389 |
src_node_uuid = instance.primary_node
|
|
385 | 390 |
|
386 | 391 |
if self.op.shutdown: |
387 | 392 |
# shutdown the instance, but not the disks |
388 | 393 |
feedback_fn("Shutting down instance %s" % instance.name) |
389 |
result = self.rpc.call_instance_shutdown(src_node, instance, |
|
394 |
result = self.rpc.call_instance_shutdown(src_node_uuid, instance,
|
|
390 | 395 |
self.op.shutdown_timeout, |
391 | 396 |
self.op.reason) |
392 | 397 |
# TODO: Maybe ignore failures if ignore_remove_failures is set |
393 | 398 |
result.Raise("Could not shutdown instance %s on" |
394 |
" node %s" % (instance.name, src_node)) |
|
399 |
" node %s" % (instance.name, |
|
400 |
self.cfg.GetNodeName(src_node_uuid))) |
|
395 | 401 |
|
396 | 402 |
# set the disks ID correctly since call_instance_start needs the |
397 | 403 |
# correct drbd minor to create the symlinks |
398 | 404 |
for disk in instance.disks: |
399 |
self.cfg.SetDiskID(disk, src_node) |
|
405 |
self.cfg.SetDiskID(disk, src_node_uuid)
|
|
400 | 406 |
|
401 | 407 |
activate_disks = not instance.disks_active |
402 | 408 |
|
... | ... | |
416 | 422 |
not self.op.remove_instance): |
417 | 423 |
assert not activate_disks |
418 | 424 |
feedback_fn("Starting instance %s" % instance.name) |
419 |
result = self.rpc.call_instance_start(src_node, |
|
425 |
result = self.rpc.call_instance_start(src_node_uuid,
|
|
420 | 426 |
(instance, None, None), False, |
421 | 427 |
self.op.reason) |
422 | 428 |
msg = result.fail_msg |
... | ... | |
515 | 521 |
locked_nodes = self.owned_locks(locking.LEVEL_NODE) |
516 | 522 |
exportlist = self.rpc.call_export_list(locked_nodes) |
517 | 523 |
found = False |
518 |
for node in exportlist: |
|
519 |
msg = exportlist[node].fail_msg |
|
524 |
for node_uuid in exportlist:
|
|
525 |
msg = exportlist[node_uuid].fail_msg
|
|
520 | 526 |
if msg: |
521 |
self.LogWarning("Failed to query node %s (continuing): %s", node, msg) |
|
527 |
self.LogWarning("Failed to query node %s (continuing): %s", |
|
528 |
self.cfg.GetNodeName(node_uuid), msg) |
|
522 | 529 |
continue |
523 |
if instance_name in exportlist[node].payload: |
|
530 |
if instance_name in exportlist[node_uuid].payload:
|
|
524 | 531 |
found = True |
525 |
result = self.rpc.call_export_remove(node, instance_name) |
|
532 |
result = self.rpc.call_export_remove(node_uuid, instance_name)
|
|
526 | 533 |
msg = result.fail_msg |
527 | 534 |
if msg: |
528 | 535 |
logging.error("Could not remove export for instance %s" |
529 |
" on node %s: %s", instance_name, node, msg) |
|
536 |
" on node %s: %s", instance_name, |
|
537 |
self.cfg.GetNodeName(node_uuid), msg) |
|
530 | 538 |
|
531 | 539 |
if fqdn_warn and not found: |
532 | 540 |
feedback_fn("Export not found. If trying to remove an export belonging" |
Also available in: Unified diff