FAM-902 Added vhd_resource_group parameter to 'attach_volume'
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/9866138a Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/9866138a Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/9866138a Branch: refs/heads/trunk Commit: 9866138af52eb2da8047bf8dc3e395ed0a355a45 Parents: 439e4dc Author: mermoldy <s.ba...@scalr.com> Authored: Wed May 24 13:03:58 2017 +0300 Committer: Anthony Shaw <anthonys...@apache.org> Committed: Fri Aug 11 14:59:31 2017 +1000 ---------------------------------------------------------------------- libcloud/compute/drivers/azure_arm.py | 52 ++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/9866138a/libcloud/compute/drivers/azure_arm.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/azure_arm.py b/libcloud/compute/drivers/azure_arm.py index eed44d0..a225429 100644 --- a/libcloud/compute/drivers/azure_arm.py +++ b/libcloud/compute/drivers/azure_arm.py @@ -886,9 +886,10 @@ class AzureNodeDriver(NodeDriver): ) return [self._to_volume(volume) for volume in response.object['value']] - def attach_volume(self, node, volume, ex_lun=None, ex_vhd_uri=None, **ex_kwargs): + def attach_volume(self, node, volume, ex_lun=None, + ex_vhd_uri=None, ex_vhd_resource_group=None, **ex_kwargs): """ - Attach a managed volume to node. + Attach a volume to node. :param node: A node to attach volume. :type node: :class:`Node` @@ -905,6 +906,10 @@ class AzureNodeDriver(NodeDriver): blob. (optional) :type ex_vhd_uri: ``str`` + :param ex_vhd_resource_group: Storage account resource group name. + (required for ``ex_vhd_uri``) + :type ex_vhd_resource_group: ``str`` + :rtype: ``bool`` """ action = node.extra['id'] @@ -921,23 +926,26 @@ class AzureNodeDriver(NodeDriver): raise LibcloudError("No LUN available to attach new disk.") if ex_vhd_uri is not None: + if ex_vhd_resource_group is None: + raise AttributeError( + "'ex_vhd_resource_group' of the VHD blob is not specified.") + # 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) + is_vhd_exists = self._ex_is_vhd_exists( + ex_vhd_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 - } + 'diskSizeGB': volume.size} else: # attach existing managed disk new_disk = { 'lun': ex_lun, 'createOption': 'attach', - 'managedDisk': {'id': volume.id} - } + 'managedDisk': {'id': volume.id}} disks.append(new_disk) self.connection.request( @@ -953,8 +961,7 @@ class AzureNodeDriver(NodeDriver): } }, 'location': location - } - ) + }) return True def detach_volume(self, volume, ex_node=None): @@ -1905,9 +1912,20 @@ class AzureNodeDriver(NodeDriver): except ObjectDoesNotExistError: return True - def _ex_is_vhd_exists(self, resource_group, uri): + def _ex_is_vhd_exists(self, resource_group, vhd_uri): + """ + Check if VHD by given ``vhd_uri`` exists + + :param resource_group: Storage account resource group name. + :type: ``str`` + + :param vhd_uri: Virtual hard disk's uri. + :type: ``str`` + + :rtype: ``bool`` + """ try: - storage_account, blob_container, blob = _split_blob_uri(uri) + storage_account, blob_container, blob = _split_blob_uri(vhd_uri) keys = self.ex_get_storage_account_keys( resource_group, storage_account) blob_driver = AzureBlobsStorageDriver( @@ -2018,8 +2036,8 @@ class AzureNodeDriver(NodeDriver): def _split_blob_uri(uri): - uri = uri.split("/") - storageAccount = uri[2].split(".")[0] - blobContainer = uri[3] - blob = '/'.join(uri[4:]) - return (storageAccount, blobContainer, blob) + uri = uri.split('/') + storage_account = uri[2].split('.')[0] + blob_container = uri[3] + blob_name = '/'.join(uri[4:]) + return storage_account, blob_container, blob_name