Просмотр исходного кода

Implemented flake 8 coding styles

vikramdoda 9 лет назад
Родитель
Сommit
6e097a39ee

+ 2 - 2
cloudbridge/cloud/providers/azure/__init__.py

@@ -2,5 +2,5 @@
 Exports from this provider
 Exports from this provider
 """
 """
 
 
-from .provider import AzureCloudProvider
-from .provider import MockAzureCloudProvider
+from .provider import AzureCloudProvider  # noqa
+from .provider import MockAzureCloudProvider  # noqa

+ 27 - 9
cloudbridge/cloud/providers/azure/azure_client.py

@@ -127,7 +127,8 @@ class AzureClient(object):
             get(self.resource_group_name, name)
             get(self.resource_group_name, name)
 
 
     def delete_security_group(self, name):
     def delete_security_group(self, name):
-        delete_async = self.network_management_client.network_security_groups. \
+        delete_async = self.network_management_client \
+            .network_security_groups. \
             delete(self.resource_group_name, name)
             delete(self.resource_group_name, name)
         delete_async.wait()
         delete_async.wait()
 
 
@@ -171,21 +172,27 @@ class AzureClient(object):
         return out_stream
         return out_stream
 
 
     def create_empty_disk(self, disk_name, size,
     def create_empty_disk(self, disk_name, size,
-                          region=None, snapshot_id=None):
+                          region=None, snapshot_id=None,
+                          description=None):
+
         if snapshot_id:
         if snapshot_id:
             return self.create_snapshot_disk(disk_name,
             return self.create_snapshot_disk(disk_name,
                                              snapshot_id, region=region)
                                              snapshot_id, region=region)
 
 
+        params = {
+            'location': region or self.region_name,
+            'disk_size_gb': size,
+            'creation_data': {
+                'create_option': 'empty'
+            }
+        }
+        if description:
+            params['tags'] = {'Description': description}
+
         async_creation = self.compute_client.disks.create_or_update(
         async_creation = self.compute_client.disks.create_or_update(
             self.resource_group_name,
             self.resource_group_name,
             disk_name,
             disk_name,
-            {
-                'location': region or self.region_name,
-                'disk_size_gb': size,
-                'creation_data': {
-                    'create_option': 'empty'
-                }
-            },
+            params,
             raw=True
             raw=True
         )
         )
         return async_creation
         return async_creation
@@ -206,6 +213,17 @@ class AzureClient(object):
 
 
         return disk_response
         return disk_response
 
 
+    def update_disk_tags(self, disk_name, tags, region=None):
+        disk_result = self.compute_client.disks.update(
+            self.resource_group_name,
+            disk_name,
+            {
+                'tags': tags
+            },
+            raw=True
+        )
+        return disk_result
+
     def get_disk(self, disk_name):
     def get_disk(self, disk_name):
         return self.compute_client.disks. \
         return self.compute_client.disks. \
             get(self.resource_group_name, disk_name)
             get(self.resource_group_name, disk_name)

+ 13 - 5
cloudbridge/cloud/providers/azure/mock_azure_client.py

@@ -1,13 +1,15 @@
 from io import BytesIO
 from io import BytesIO
 
 
 from azure.common import AzureException
 from azure.common import AzureException
-from azure.mgmt.compute.models import Disk, CreationData, DiskCreateOption
+from azure.mgmt.compute.models import CreationData, Disk, DiskCreateOption
 from azure.mgmt.network.models import NetworkSecurityGroup
 from azure.mgmt.network.models import NetworkSecurityGroup
 from azure.mgmt.network.models import SecurityRule
 from azure.mgmt.network.models import SecurityRule
 from azure.mgmt.resource.resources.models import ResourceGroup
 from azure.mgmt.resource.resources.models import ResourceGroup
 from azure.mgmt.storage.models import StorageAccount
 from azure.mgmt.storage.models import StorageAccount
-from azure.storage.blob.models import Container, Blob
+from azure.storage.blob.models import Blob, Container
+
 from msrestazure.azure_exceptions import CloudError
 from msrestazure.azure_exceptions import CloudError
+
 from requests import Response
 from requests import Response
 
 
 
 
@@ -84,10 +86,11 @@ class MockAzureClient:
     volume1.time_created = '20-04-2017'
     volume1.time_created = '20-04-2017'
     volume1.owner_id = 'ubuntu-intro1'
     volume1.owner_id = 'ubuntu-intro1'
     volume1.provisioning_state = 'InProgress'
     volume1.provisioning_state = 'InProgress'
+    volume1.tags = {'Name': 'Volume1'}
 
 
     volume2 = Disk(location='eastus', creation_data=None)
     volume2 = Disk(location='eastus', creation_data=None)
-    volume2.id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
-                 'resourceGroups/CLOUDBRIDGE-AZURE' \
+    volume2.id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96' \
+                 '/resourceGroups/CLOUDBRIDGE-AZURE' \
                  '/providers/Microsoft.Compute/disks/Volume2'
                  '/providers/Microsoft.Compute/disks/Volume2'
     volume2.name = "Volume2"
     volume2.name = "Volume2"
     volume2.disk_size_gb = 1
     volume2.disk_size_gb = 1
@@ -95,6 +98,7 @@ class MockAzureClient:
     volume2.time_created = '20-04-2017'
     volume2.time_created = '20-04-2017'
     volume2.owner_id = None
     volume2.owner_id = None
     volume2.provisioning_state = 'Succeeded'
     volume2.provisioning_state = 'Succeeded'
+    volume2.tags = {'Name': 'Volume2'}
 
 
     volumes = [volume1, volume2]
     volumes = [volume1, volume2]
 
 
@@ -217,7 +221,7 @@ class MockAzureClient:
         return 'https://cloudbridgeazure.blob.core.windows.net/vhds/block1'
         return 'https://cloudbridgeazure.blob.core.windows.net/vhds/block1'
 
 
     def create_empty_disk(self, disk_name, size,
     def create_empty_disk(self, disk_name, size,
-                          region=None, snapshot_id=None):
+                          region=None, snapshot_id=None, description=None):
         volume = Disk(location='eastus', creation_data=None)
         volume = Disk(location='eastus', creation_data=None)
         volume.id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
         volume.id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
                     'resourceGroups/cloudbridge-azure' \
                     'resourceGroups/cloudbridge-azure' \
@@ -232,6 +236,7 @@ class MockAzureClient:
             '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
             '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
             'resourceGroups/CloudBridge-Azure' \
             'resourceGroups/CloudBridge-Azure' \
             's/providers/Microsoft.Compute/virtualMachines/ubuntu-intro1'
             's/providers/Microsoft.Compute/virtualMachines/ubuntu-intro1'
+        volume.tags = {'Name': disk_name}
         self.volumes.append(volume)
         self.volumes.append(volume)
         return volume
         return volume
 
 
@@ -263,3 +268,6 @@ class MockAzureClient:
         storage_account = StorageAccount()
         storage_account = StorageAccount()
         storage_account.name = storage_account_name
         storage_account.name = storage_account_name
         return storage_account
         return storage_account
+
+    def update_disk_tags(self, disk_name, tags):
+        pass

+ 5 - 5
cloudbridge/cloud/providers/azure/provider.py

@@ -1,16 +1,16 @@
 import logging
 import logging
 import os
 import os
 
 
-from msrestazure.azure_exceptions import CloudError
-
 from cloudbridge.cloud.base import BaseCloudProvider
 from cloudbridge.cloud.base import BaseCloudProvider
 from cloudbridge.cloud.interfaces import TestMockHelperMixin
 from cloudbridge.cloud.interfaces import TestMockHelperMixin
-
 from cloudbridge.cloud.providers.azure.azure_client import AzureClient
 from cloudbridge.cloud.providers.azure.azure_client import AzureClient
 from cloudbridge.cloud.providers.azure.mock_azure_client import MockAzureClient
 from cloudbridge.cloud.providers.azure.mock_azure_client import MockAzureClient
 from cloudbridge.cloud.providers.azure.services \
 from cloudbridge.cloud.providers.azure.services \
-    import AzureSecurityService, AzureObjectStoreService, \
-    AzureBlockStoreService
+    import AzureBlockStoreService, AzureObjectStoreService, \
+    AzureSecurityService
+
+
+from msrestazure.azure_exceptions import CloudError
 
 
 log = logging.getLogger(__name__)
 log = logging.getLogger(__name__)
 
 

+ 27 - 14
cloudbridge/cloud/providers/azure/resources.py

@@ -4,16 +4,18 @@ DataTypes used by this provider
 import inspect
 import inspect
 import json
 import json
 
 
-from cloudbridge.cloud.providers.azure import helpers as azure_helpers
-
 from azure.common import AzureException
 from azure.common import AzureException
-from msrestazure.azure_exceptions import CloudError
 
 
-from cloudbridge.cloud.base.resources import BaseBucket, BaseSecurityGroup, \
-    BaseSecurityGroupRule, BaseBucketObject, \
-    ClientPagedResultList, BaseVolume, BaseAttachmentInfo
+
+from cloudbridge.cloud.base.resources import BaseAttachmentInfo,\
+    BaseBucket, BaseBucketObject, BaseSecurityGroup, \
+    BaseSecurityGroupRule, BaseVolume, \
+    ClientPagedResultList
 from cloudbridge.cloud.interfaces import VolumeState
 from cloudbridge.cloud.interfaces import VolumeState
 from cloudbridge.cloud.interfaces.resources import Instance
 from cloudbridge.cloud.interfaces.resources import Instance
+from cloudbridge.cloud.providers.azure import helpers as azure_helpers
+
+from msrestazure.azure_exceptions import CloudError
 
 
 NETWORK_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
 NETWORK_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
                       '{resourceGroupName}/providers/Microsoft.Network/' \
                       '{resourceGroupName}/providers/Microsoft.Network/' \
@@ -166,9 +168,9 @@ class AzureSecurityGroup(BaseSecurityGroup):
                  cidr_ip=None, src_group=None):
                  cidr_ip=None, src_group=None):
         for rule in self.rules:
         for rule in self.rules:
             if (rule.ip_protocol == ip_protocol and
             if (rule.ip_protocol == ip_protocol and
-                        rule.from_port == str(from_port) and
-                        rule.to_port == str(to_port) and
-                        rule.cidr_ip == cidr_ip):
+                rule.from_port == str(from_port) and
+                rule.to_port == str(to_port) and
+                    rule.cidr_ip == cidr_ip):
                 return rule
                 return rule
         return None
         return None
 
 
@@ -393,6 +395,7 @@ class AzureBucket(BaseBucket):
 class AzureVolume(BaseVolume):
 class AzureVolume(BaseVolume):
     VOLUME_STATE_MAP = {
     VOLUME_STATE_MAP = {
         'InProgress': VolumeState.CREATING,
         'InProgress': VolumeState.CREATING,
+        'Creating': VolumeState.CREATING,
         'Unattached': VolumeState.AVAILABLE,
         'Unattached': VolumeState.AVAILABLE,
         'Attached': VolumeState.IN_USE,
         'Attached': VolumeState.IN_USE,
         'Deleting': VolumeState.CONFIGURING,
         'Deleting': VolumeState.CONFIGURING,
@@ -404,9 +407,13 @@ class AzureVolume(BaseVolume):
     def __init__(self, provider, volume):
     def __init__(self, provider, volume):
         super(AzureVolume, self).__init__(provider)
         super(AzureVolume, self).__init__(provider)
         self._volume = volume
         self._volume = volume
+        self._url_params = azure_helpers.\
+            parse_url(VOLUME_RESOURCE_ID, volume.id)
         self._description = None
         self._description = None
         self._status = 'unknown'
         self._status = 'unknown'
         self.update_status()
         self.update_status()
+        if not self._volume.tags:
+            self._volume.tags = {}
 
 
     def update_status(self):
     def update_status(self):
         if not self._volume.provisioning_state == 'Succeeded':
         if not self._volume.provisioning_state == 'Succeeded':
@@ -418,7 +425,7 @@ class AzureVolume(BaseVolume):
 
 
     @property
     @property
     def id(self):
     def id(self):
-        return self._volume.id.lower()
+        return self._volume.id
 
 
     @property
     @property
     def name(self):
     def name(self):
@@ -439,11 +446,14 @@ class AzureVolume(BaseVolume):
 
 
     @property
     @property
     def description(self):
     def description(self):
-        return self._description
+        return self._volume.tags.get('Description', None)
 
 
     @description.setter
     @description.setter
     def description(self, value):
     def description(self, value):
-        self._description = value
+        self._volume.tags.update(Description=value)
+        self._provider.azure_client.\
+            update_disk_tags(self._url_params.get(VOLUME_NAME),
+                             self._volume.tags)
 
 
     @property
     @property
     def size(self):
     def size(self):
@@ -510,7 +520,8 @@ class AzureVolume(BaseVolume):
         Delete this volume.
         Delete this volume.
         """
         """
         try:
         try:
-            self._provider.azure_client.delete_disk(self.name)
+            self._provider.azure_client.\
+                delete_disk(self._url_params.get(VOLUME_NAME))
             return True
             return True
         except CloudError:
         except CloudError:
             return False
             return False
@@ -526,7 +537,9 @@ class AzureVolume(BaseVolume):
         for its latest state.
         for its latest state.
         """
         """
         try:
         try:
-            self._volume = self._provider.azure_client.get_disk(self.name)
+            print('Volume status ' + self._status)
+            self._volume = self._provider.azure_client.\
+                get_disk(self._url_params.get(VOLUME_NAME))
             self.update_status()
             self.update_status()
         except (CloudError, ValueError):
         except (CloudError, ValueError):
             # The volume no longer exists and cannot be refreshed.
             # The volume no longer exists and cannot be refreshed.

+ 12 - 12
cloudbridge/cloud/providers/azure/services.py

@@ -1,21 +1,21 @@
 import logging
 import logging
 
 
 from azure.common import AzureException
 from azure.common import AzureException
-from msrestazure.azure_exceptions import CloudError
-
-from cloudbridge.cloud.interfaces.resources import PlacementZone, Snapshot
-
-from .resources import VOLUME_RESOURCE_ID, VOLUME_NAME, \
-    NETWORK_SECURITY_GROUP_RESOURCE_ID, SECURITY_GROUP_NAME, AzureVolume
 
 
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.resources import ClientPagedResultList
-from cloudbridge.cloud.base.services import BaseObjectStoreService, \
-    BaseSecurityGroupService, BaseSecurityService, \
-    BaseVolumeService, BaseBlockStoreService, BaseSnapshotService
-
+from cloudbridge.cloud.base.services import BaseBlockStoreService, \
+    BaseObjectStoreService, BaseSecurityGroupService, \
+    BaseSecurityService, BaseSnapshotService, BaseVolumeService
+from cloudbridge.cloud.interfaces.resources import PlacementZone,\
+    Snapshot
 from cloudbridge.cloud.providers.azure import helpers as azure_helpers
 from cloudbridge.cloud.providers.azure import helpers as azure_helpers
 
 
-from .resources import AzureBucket, AzureSecurityGroup
+from msrestazure.azure_exceptions import CloudError
+
+from .resources import AzureBucket, AzureSecurityGroup,\
+    AzureVolume,\
+    NETWORK_SECURITY_GROUP_RESOURCE_ID, SECURITY_GROUP_NAME, \
+    VOLUME_NAME, VOLUME_RESOURCE_ID
 
 
 log = logging.getLogger(__name__)
 log = logging.getLogger(__name__)
 
 
@@ -140,7 +140,7 @@ class AzureObjectStoreService(BaseObjectStoreService):
         """
         """
         Create a new bucket.
         Create a new bucket.
         """
         """
-        bucket = self.provider.azure_client.create_container(name)
+        bucket = self.provider.azure_client.create_container(name.lower())
         return AzureBucket(self.provider, bucket)
         return AzureBucket(self.provider, bucket)
 
 
 
 

+ 2 - 1
integration_test/test_integration_azure_security_group.py

@@ -1,8 +1,9 @@
 import uuid
 import uuid
 
 
-from azure_integration_test.helpers import ProviderTestBase
 import azure_integration_test.helpers as helpers
 import azure_integration_test.helpers as helpers
 
 
+from azure_integration_test.helpers import ProviderTestBase
+
 
 
 class AzureIntegrationSecurityServiceTestCase(ProviderTestBase):
 class AzureIntegrationSecurityServiceTestCase(ProviderTestBase):
     @helpers.skipIfNoService(['security.security_groups'])
     @helpers.skipIfNoService(['security.security_groups'])

+ 1 - 1
test/helpers/__init__.py

@@ -198,7 +198,7 @@ class ProviderTestBase(unittest.TestCase):
             return 1
             return 1
 
 
     def create_provider_instance(self):
     def create_provider_instance(self):
-        provider_name = os.environ.get("CB_TEST_PROVIDER", "aws")
+        provider_name = os.environ.get("CB_TEST_PROVIDER", "azure")
         use_mock_drivers = parse_bool(
         use_mock_drivers = parse_bool(
             os.environ.get("CB_USE_MOCK_PROVIDERS", "True"))
             os.environ.get("CB_USE_MOCK_PROVIDERS", "True"))
         factory = CloudProviderFactory()
         factory = CloudProviderFactory()

+ 1 - 0
test/test_azure_helpers.py

@@ -1,4 +1,5 @@
 from azure_test.helpers import ProviderTestBase
 from azure_test.helpers import ProviderTestBase
+
 from cloudbridge.cloud.providers.azure import helpers as azure_helpers
 from cloudbridge.cloud.providers.azure import helpers as azure_helpers