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