 -            args += ['--new-format']
 -        args += self._ceph_args()
 -        libvirt_utils.import_rbd_image(*args)
+-
+-        base_size = disk.get_disk_size(base)
 +        # prepare_template() may have cloned the image into a new rbd
 +        # image already instead of downloading it locally
 +        if not self.check_image_exists():
 +            self.driver.import_image(base, self.rbd_name)
  
--        base_size = disk.get_disk_size(base)
--
 -        if size and size > base_size:
 -            self._resize(self.rbd_name, size)
 +        if size and size > self.get_disk_size(self.rbd_name):

         info.driver_format = 'raw'
         info.driver_cache = cache_mode
         info.target_bus = disk_bus
@@ -647,42 +582,55 @@ class Rbd(Image):
         return False
 
     def check_image_exists(self):

-        for vol in rbd_volumes:
-            if vol.startswith(self.rbd_name):
-                return True
-
-        return False
+        return self.driver.exists(self.rbd_name)
 
-    def _resize(self, volume_name, size):
-        size = int(size) * units.Ki
+    def get_disk_size(self, name):
+        """Returns the size of the virtual disk in bytes.
 
-        with RBDVolumeProxy(self, volume_name) as vol:
-            vol.resize(size)
+        The name argument is ignored since this backend already knows
+        its name, and callers may pass a non-existent local file path.
+        """
