From dab69e9770b1c733dbbf8effb34beda317a4f3d8 Mon Sep 17 00:00:00 2001
From: Iustin Pop <iustin@google.com>
Date: Mon, 19 Jan 2009 11:10:19 +0000
Subject: [PATCH] Switch call_blockdev_create call to (status, data)

This allows errors to be visible at the user level instead of just node
daemon logs.

Reviewed-by: ultrotter
---
 lib/backend.py | 12 +++++++-----
 lib/cmdlib.py  |  9 +++++----
 2 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/lib/backend.py b/lib/backend.py
index c9e9af5ba..c0b546764 100644
--- a/lib/backend.py
+++ b/lib/backend.py
@@ -1017,14 +1017,16 @@ def CreateBlockDevice(disk, size, owner, on_primary, info):
         crdev.Open()
       clist.append(crdev)
 
-  device = bdev.Create(disk.dev_type, disk.physical_id, clist, size)
+  try:
+    device = bdev.Create(disk.dev_type, disk.physical_id, clist, size)
+  except errors.GenericError, err:
+    return False, "Can't create block device: %s" % str(err)
 
   if on_primary or disk.AssembleOnSecondary():
     if not device.Assemble():
-      errorstring = "Can't assemble device after creation"
+      errorstring = "Can't assemble device after creation, very unusual event"
       logging.error(errorstring)
-      raise errors.BlockDeviceError("%s, very unusual event - check the node"
-                                    " daemon logs" % errorstring)
+      return False, errorstring
     device.SetSyncSpeed(constants.SYNC_SPEED)
     if on_primary or disk.OpenOnSecondary():
       device.Open(force=True)
@@ -1034,7 +1036,7 @@ def CreateBlockDevice(disk, size, owner, on_primary, info):
   device.SetInfo(info)
 
   physical_id = device.unique_id
-  return physical_id
+  return True, physical_id
 
 
 def RemoveBlockDevice(disk):
diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 6ddb1f398..443746bd8 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -3702,13 +3702,14 @@ def _CreateBlockDevOnPrimary(lu, node, instance, device, info):
       _CreateBlockDevOnPrimary(lu, node, instance, child, info)
 
   lu.cfg.SetDiskID(device, node)
-  new_id = lu.rpc.call_blockdev_create(node, device, device.size,
+  result = lu.rpc.call_blockdev_create(node, device, device.size,
                                        instance.name, True, info)
-  if new_id.failed or not new_id.data:
+  msg = result.RemoteFailMsg()
+  if msg:
     raise errors.OpExecError("Can't create block device %s on primary"
-                             " node %s" % (device, node))
+                             " node %s: %s" % (device, node, msg))
   if device.physical_id is None:
-    device.physical_id = new_id
+    device.physical_id = result.data[1]
 
 
 def _CreateBlockDevOnSecondary(lu, node, instance, device, force, info):
-- 
GitLab