From: Mike Perez <thingee@gmail.com>
Date: Thu, 29 Nov 2012 11:18:08 +0000 (-0800)
Subject: attaching volumes will set instance_uuid instantly
X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=e27b171883c1b87b8d2fdf0994947d4b93e640d9;p=openstack-build%2Fcinder-build.git

attaching volumes will set instance_uuid instantly

This change allows the instance_uuid field to be set instantly when
beginning an attach action. The user will no longer have to wait for the
attachment to be complete to know what it is attaching to. If attaching
fails on the driver layer, we got error state and keep the instance_uuid
set for troubleshooting purposes.

blueprint instance-attached-field
Change-Id: Ie9860876ab865f766c0ae4cb616a45fd363931f8
---

diff --git a/cinder/tests/test_volume.py b/cinder/tests/test_volume.py
index 513118aae..35f467afa 100644
--- a/cinder/tests/test_volume.py
+++ b/cinder/tests/test_volume.py
@@ -274,6 +274,23 @@ class VolumeTestCase(test.TestCase):
                           self.context,
                           volume_id)
 
+    def test_preattach_status_volume(self):
+        """Ensure volume goes into pre-attaching state"""
+
+        instance_uuid = '12345678-1234-5678-1234-567812345678'
+        mountpoint = "/dev/sdf"
+        volume = db.volume_create(self.context, {'size': 1,
+                                                 'status': 'available'})
+        volume_id = volume['id']
+
+        volume_api = cinder.volume.api.API()
+        volume_api.attach(self.context, volume, instance_uuid, mountpoint)
+
+        vol = db.volume_get(self.context, volume_id)
+        self.assertEqual(vol['status'], "attaching")
+        self.assertEqual(vol['attach_status'], None)
+        self.assertEqual(vol['instance_uuid'], instance_uuid)
+
     def test_concurrent_volumes_get_different_targets(self):
         """Ensure multiple concurrent volumes get different targets."""
         volume_ids = []
diff --git a/cinder/volume/api.py b/cinder/volume/api.py
index 3b53a6dcc..e96a82dac 100644
--- a/cinder/volume/api.py
+++ b/cinder/volume/api.py
@@ -383,6 +383,8 @@ class API(base.Base):
 
     @wrap_check_policy
     def attach(self, context, volume, instance_uuid, mountpoint):
+        self.update(context, volume, {"instance_uuid": instance_uuid,
+                                      "status": "attaching"})
         return self.volume_rpcapi.attach_volume(context,
                                                 volume,
                                                 instance_uuid,