Revision 063613aa
b/lib/cmdlib/instance.py | ||
---|---|---|
1820 | 1820 |
self.cfg.ReleaseDRBDMinors(self.instance.uuid) |
1821 | 1821 |
raise |
1822 | 1822 |
|
1823 |
cluster_name = self.cfg.GetClusterInfo().cluster_name |
|
1824 |
|
|
1825 | 1823 |
errs = [] |
1826 |
# activate, get path, copy the data over |
|
1824 |
transfers = [] |
|
1825 |
# activate, get path, create transfer jobs |
|
1827 | 1826 |
for idx, disk in enumerate(self.instance.disks): |
1828 |
self.LogInfo("Copying data for disk %d", idx) |
|
1829 |
result = self.rpc.call_blockdev_assemble( |
|
1830 |
target_node.uuid, (disk, self.instance), self.instance.name, |
|
1831 |
True, idx) |
|
1832 |
if result.fail_msg: |
|
1833 |
self.LogWarning("Can't assemble newly created disk %d: %s", |
|
1834 |
idx, result.fail_msg) |
|
1835 |
errs.append(result.fail_msg) |
|
1836 |
break |
|
1837 |
dev_path = result.payload |
|
1838 |
result = self.rpc.call_blockdev_export(source_node.uuid, (disk, |
|
1839 |
self.instance), |
|
1840 |
target_node.secondary_ip, |
|
1841 |
dev_path, cluster_name) |
|
1842 |
if result.fail_msg: |
|
1843 |
self.LogWarning("Can't copy data over for disk %d: %s", |
|
1844 |
idx, result.fail_msg) |
|
1845 |
errs.append(result.fail_msg) |
|
1846 |
break |
|
1827 |
# FIXME: pass debug option from opcode to backend |
|
1828 |
dt = masterd.instance.DiskTransfer("disk/%s" % idx, |
|
1829 |
constants.IEIO_RAW_DISK, |
|
1830 |
(disk, self.instance), |
|
1831 |
constants.IEIO_RAW_DISK, |
|
1832 |
(disk, self.instance), |
|
1833 |
None) |
|
1834 |
transfers.append(dt) |
|
1835 |
|
|
1836 |
import_result = \ |
|
1837 |
masterd.instance.TransferInstanceData(self, feedback_fn, |
|
1838 |
source_node.uuid, |
|
1839 |
target_node.uuid, |
|
1840 |
target_node.secondary_ip, |
|
1841 |
self.instance, transfers) |
|
1842 |
if not compat.all(import_result): |
|
1843 |
errs.append("Failed to transfer instance data") |
|
1847 | 1844 |
|
1848 | 1845 |
if errs: |
1849 | 1846 |
self.LogWarning("Some disks failed to copy, aborting") |
b/lib/rpc.py | ||
---|---|---|
934 | 934 |
|
935 | 935 |
""" |
936 | 936 |
if ieio == constants.IEIO_RAW_DISK: |
937 |
assert len(ieioargs) == 1
|
|
938 |
return (ieio, (self._SingleDiskDictDP(node, ieioargs[0]), ))
|
|
937 |
assert len(ieioargs) == 2
|
|
938 |
return (ieio, (self._SingleDiskDictDP(node, ieioargs), )) |
|
939 | 939 |
|
940 | 940 |
if ieio == constants.IEIO_SCRIPT: |
941 | 941 |
assert len(ieioargs) == 2 |
b/test/py/cmdlib/instance_unittest.py | ||
---|---|---|
1492 | 1492 |
self.rpc.call_blockdev_assemble.return_value = \ |
1493 | 1493 |
self.RpcResultsBuilder() \ |
1494 | 1494 |
.CreateSuccessfulNodeResult(self.node, "/dev/mocked_path") |
1495 |
self.rpc.call_blockdev_export.return_value = \ |
|
1496 |
self.RpcResultsBuilder() \ |
|
1497 |
.CreateSuccessfulNodeResult(self.master, "") |
|
1498 | 1495 |
self.rpc.call_blockdev_remove.return_value = \ |
1499 | 1496 |
self.RpcResultsBuilder() \ |
1500 | 1497 |
.CreateSuccessfulNodeResult(self.master, "") |
1501 | 1498 |
|
1499 |
def ImportStart(node_uuid, opt, inst, component, args): |
|
1500 |
return self.RpcResultsBuilder() \ |
|
1501 |
.CreateSuccessfulNodeResult(node_uuid, |
|
1502 |
"deamon_on_%s" % node_uuid) |
|
1503 |
self.rpc.call_import_start.side_effect = ImportStart |
|
1504 |
|
|
1505 |
def ImpExpStatus(node_uuid, name): |
|
1506 |
return self.RpcResultsBuilder() \ |
|
1507 |
.CreateSuccessfulNodeResult(node_uuid, |
|
1508 |
[objects.ImportExportStatus( |
|
1509 |
exit_status=0 |
|
1510 |
)]) |
|
1511 |
self.rpc.call_impexp_status.side_effect = ImpExpStatus |
|
1512 |
|
|
1513 |
def ImpExpCleanup(node_uuid, name): |
|
1514 |
return self.RpcResultsBuilder() \ |
|
1515 |
.CreateSuccessfulNodeResult(node_uuid) |
|
1516 |
self.rpc.call_impexp_cleanup.side_effect = ImpExpCleanup |
|
1517 |
|
|
1502 | 1518 |
def testMissingInstance(self): |
1503 | 1519 |
op = opcodes.OpInstanceMove(instance_name="missing.inst", |
1504 | 1520 |
target_node=self.node.name) |
... | ... | |
1540 | 1556 |
target_node=self.node.name) |
1541 | 1557 |
self.ExecOpCode(op) |
1542 | 1558 |
|
1543 |
def testMoveFailingStart(self): |
|
1559 |
def testMoveFailingStartInstance(self):
|
|
1544 | 1560 |
self.rpc.call_node_info.return_value = \ |
1545 | 1561 |
self.RpcResultsBuilder() \ |
1546 | 1562 |
.AddSuccessfulNode(self.node, |
... | ... | |
1557 | 1573 |
self.ExecOpCodeExpectOpExecError( |
1558 | 1574 |
op, "Could not start instance .* on node .*") |
1559 | 1575 |
|
1560 |
def testMoveFailingBlockdevAssemble(self):
|
|
1576 |
def testMoveFailingImpExpDaemonExitCode(self):
|
|
1561 | 1577 |
inst = self.cfg.AddNewInstance() |
1562 |
self.rpc.call_blockdev_assemble.return_value = \ |
|
1578 |
self.rpc.call_impexp_status.side_effect = None |
|
1579 |
self.rpc.call_impexp_status.return_value = \ |
|
1563 | 1580 |
self.RpcResultsBuilder() \ |
1564 |
.CreateFailedNodeResult(self.node) |
|
1581 |
.CreateSuccessfulNodeResult(self.node, |
|
1582 |
[objects.ImportExportStatus( |
|
1583 |
exit_status=1, |
|
1584 |
recent_output=["mock output"] |
|
1585 |
)]) |
|
1565 | 1586 |
op = opcodes.OpInstanceMove(instance_name=inst.name, |
1566 | 1587 |
target_node=self.node.name) |
1567 | 1588 |
self.ExecOpCodeExpectOpExecError(op, "Errors during disk copy") |
1568 | 1589 |
|
1569 |
def testMoveFailingBlockdevExport(self):
|
|
1590 |
def testMoveFailingStartImpExpDaemon(self):
|
|
1570 | 1591 |
inst = self.cfg.AddNewInstance() |
1571 |
self.rpc.call_blockdev_export.return_value = \ |
|
1592 |
self.rpc.call_import_start.side_effect = None |
|
1593 |
self.rpc.call_import_start.return_value = \ |
|
1572 | 1594 |
self.RpcResultsBuilder() \ |
1573 | 1595 |
.CreateFailedNodeResult(self.node) |
1574 | 1596 |
op = opcodes.OpInstanceMove(instance_name=inst.name, |
Also available in: Unified diff