FAM-902 Added attaching blob based disk

Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/4004c0dd
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/4004c0dd
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/4004c0dd

Branch: refs/heads/trunk
Commit: 4004c0dd7bb047af5f96a8b8398a711bb0e5660d
Parents: f4fa364
Author: mermoldy <s.ba...@scalr.com>
Authored: Fri May 12 17:18:03 2017 +0300
Committer: Anthony Shaw <anthonys...@apache.org>
Committed: Fri Aug 11 14:59:31 2017 +1000

----------------------------------------------------------------------
 libcloud/compute/drivers/azure_arm.py | 47 ++++++++++++++++++++++++------
 1 file changed, 38 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/4004c0dd/libcloud/compute/drivers/azure_arm.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/azure_arm.py 
b/libcloud/compute/drivers/azure_arm.py
index a24368c..d5d56b7 100644
--- a/libcloud/compute/drivers/azure_arm.py
+++ b/libcloud/compute/drivers/azure_arm.py
@@ -21,6 +21,7 @@ http://azure.microsoft.com/en-us/services/virtual-machines/
 
 import base64
 import binascii
+import uuid
 import os
 import time
 
@@ -778,7 +779,7 @@ class AzureNodeDriver(NodeDriver):
                       ex_resource_group=None, ex_account_type=None,
                       ex_tags=None):
         """
-        Create a new volume.
+        Create a new managed volume.
 
         :param size: Size of volume in gigabytes.
         :type size: ``int``
@@ -798,7 +799,7 @@ class AzureNodeDriver(NodeDriver):
 
         :param ex_account_type: The Storage Account type,
             ``Standard_LRS``(HDD disks) or ``Premium_LRS``(SSD disks).
-        :type ex_account_type: str
+        :type ex_account_type: ``str``
 
         :param ex_tags: Optional tags to associate with this resource.
         :type ex_tags: ``dict``
@@ -885,7 +886,7 @@ class AzureNodeDriver(NodeDriver):
         )
         return [self._to_volume(volume) for volume in response.object['value']]
 
-    def attach_volume(self, node, volume, ex_lun=None, **ex_kwargs):
+    def attach_volume(self, node, volume, ex_lun=None, ex_vhd_uri=None, 
**ex_kwargs):
         """
         Attach a managed volume to node.
 
@@ -900,6 +901,10 @@ class AzureNodeDriver(NodeDriver):
             a unique LUN.
         :type ex_lun: ``int``
 
+        :param ex_vhd_uri: Attach old-style un-managed disk from VHD
+            blob. (optional)
+        :type ex_vhd_uri: ``str``
+
         :rtype: ``bool``
         """
         action = node.extra['id']
@@ -915,14 +920,26 @@ class AzureNodeDriver(NodeDriver):
             else:
                 raise LibcloudError("No LUN available to attach new disk.")
 
-        disks.append({
-            'lun': ex_lun,
-            'createOption': 'attach',
-            'managedDisk': {
-                'id': volume.id
+        if ex_vhd_uri is not None:
+            # attach new or existing unmanaged disk
+            resource_group = node.id.split('/')[4]
+            is_vhd_exists = self._ex_is_vhd_exists(resource_group, ex_vhd_uri)
+            new_disk = {
+                'lun': ex_lun,
+                'name': 'unmanaged-vol-{}'.format(str(uuid.uuid4())[0:8]),
+                'createOption': 'attach' if is_vhd_exists else 'empty',
+                'vhd': {'uri': ex_vhd_uri},
+                'diskSizeGB': volume.size
+            }
+        else:
+            # attach existing managed disk
+            new_disk = {
+                'lun': ex_lun,
+                'createOption': 'attach',
+                'managedDisk': {'id': volume.id}
             }
-        })
 
+        disks.append(new_disk)
         self.connection.request(
             action,
             method='PUT',
@@ -1843,6 +1860,18 @@ class AzureNodeDriver(NodeDriver):
         except ObjectDoesNotExistError:
             return True
 
+    def _ex_is_vhd_exists(self, resource_group, uri):
+        try:
+            storage_account, blob_container, blob = _split_blob_uri(uri)
+            keys = self.ex_get_storage_account_keys(
+                resource_group, storage_account)
+            blob_driver = AzureBlobsStorageDriver(
+                storage_account, keys['key1'])
+            blob_driver.get_object(blob_container, blob)
+            return True
+        except ObjectDoesNotExistError:
+            return False
+
     def _ex_connection_class_kwargs(self):
         kwargs = super(AzureNodeDriver, self)._ex_connection_class_kwargs()
         kwargs['tenant_id'] = self.tenant_id

Reply via email to