Browse Source

Added Subnet Service Get & List method code changes

chandraMsekhar 9 years ago
parent
commit
0f9f37ecaa

+ 73 - 0
azure_integration_test/test_integration_azure_subnet_service.py

@@ -0,0 +1,73 @@
+import azure_integration_test.helpers as helpers
+
+from cloudbridge.cloud.providers.azure.resources import AzurePlacementZone
+
+
+class AzureIntegrationSubnetServiceTestCase(helpers.ProviderTestBase):
+    def test_azure_integration_subnet_service_list(self):
+        subnets = self.provider.network.subnets.list()
+        self.assertIsNotNone(subnets)
+        for subnet in subnets:
+            print(subnet.name)
+            print(subnet.id)
+            print(subnet.cidr_block)
+            print(subnet.network_id)
+            self.assertIsInstance(subnet.zone, AzurePlacementZone)
+            print(subnet.zone.id)
+            print(subnet.zone.name)
+
+    def test_azure_integration_subnet_service_list_filter_network_id(self):
+        network_id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
+                     'resourceGroups/CloudBridge-Azure/providers/' \
+                     'Microsoft.Network/virtualNetworks/CloudBridgeNet'
+        subnets = self.provider.network.subnets.list(network_id)
+        self.assertIsNotNone(subnets)
+        for subnet in subnets:
+            print(subnet.name)
+            print(subnet.id)
+            print(subnet.cidr_block)
+            print(subnet.network_id)
+            self.assertIsInstance(subnet.zone, AzurePlacementZone)
+            print(subnet.zone.id)
+            print(subnet.zone.name)
+
+    def test_azure_integration_subnet_service_list_filter_network_object(self):
+        network_id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
+                     'resourceGroups/CloudBridge-Azure/providers/' \
+                     'Microsoft.Network/virtualNetworks/CloudBridgeNet'
+        network = self.provider.network.get(network_id)
+        subnets = self.provider.network.subnets.list(network)
+        self.assertIsNotNone(subnets)
+        for subnet in subnets:
+            print(subnet.name)
+            print(subnet.id)
+            print(subnet.cidr_block)
+            print(subnet.network_id)
+            self.assertIsInstance(subnet.zone, AzurePlacementZone)
+            print(subnet.zone.id)
+            print(subnet.zone.name)
+
+    def test_azure_integration_subnet_service_get(self):
+        subnet_id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
+                    'resourceGroups/CloudBridge-Azure/providers/' \
+                    'Microsoft.Network/virtualNetworks/' \
+                    'CloudBridgeNet/subnets/MySN1'
+        subnet = self.provider.network.subnets.get(subnet_id)
+        self.assertIsNotNone(subnet)
+        if subnet:
+            print("Subnet found")
+            print(subnet.id)
+            print(subnet.name)
+            print(subnet.cidr_block)
+            print(subnet.network_id)
+            self.assertIsInstance(subnet.zone, AzurePlacementZone)
+            print(subnet.zone.id)
+            print(subnet.zone.name)
+
+    def test_azure_integration_subnet_service_get_invalid_subnet(self):
+        subnet_id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
+                    'resourceGroups/CloudBridge-Azure/providers/' \
+                    'Microsoft.Network/virtualNetworks/' \
+                    'CloudBridgeNet/subnets/MySN'
+        subnet = self.provider.network.subnets.get(subnet_id)
+        self.assertIsNone(subnet)

+ 59 - 0
azure_test/test_azure_subnet_service.py

@@ -0,0 +1,59 @@
+from azure_test.helpers import ProviderTestBase
+
+
+class AzureSubnetServiceTestCase(ProviderTestBase):
+    def test_azure_subnet_service_list(self):
+        subnets = self.provider.network.subnets.list()
+        self.assertIsNotNone(subnets)
+        for subnet in subnets:
+            print(subnet.name)
+            print(subnet.id)
+            print(subnet.cidr_block)
+            print("network_id" + subnet.network_id)
+
+    def test_azure_subnet_service_list_filter_network_id(self):
+        network_id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
+                     'resourceGroups/CloudBridge-Azure/providers/' \
+                     'Microsoft.Network/virtualNetworks/CloudBridgeNet'
+        subnets = self.provider.network.subnets.list(network_id)
+        self.assertIsNotNone(subnets)
+        for subnet in subnets:
+            print(subnet.name)
+            print(subnet.id)
+            print(subnet.cidr_block)
+            print("network_id" + subnet.network_id)
+
+    def test_azure_subnet_service_list_filter_network_object(self):
+        network_id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
+                     'resourceGroups/CloudBridge-Azure/providers/' \
+                     'Microsoft.Network/virtualNetworks/CloudBridgeNet'
+        network = self.provider.network.get(network_id)
+        subnets = self.provider.network.subnets.list(network)
+        self.assertIsNotNone(subnets)
+        for subnet in subnets:
+            print(subnet.name)
+            print(subnet.id)
+            print(subnet.cidr_block)
+            print("network_id" + subnet.network_id)
+
+    def test_azure_subnet_service_get(self):
+        subnet_id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
+                    'resourceGroups/CloudBridge-Azure/providers/' \
+                    'Microsoft.Network/virtualNetworks/' \
+                    'CloudBridgeNet/subnets/MySN1'
+        subnet = self.provider.network.subnets.get(subnet_id)
+        self.assertIsNotNone(subnet)
+        if subnet:
+            print("Subnet found")
+            print(subnet.id)
+            print(subnet.name)
+            print(subnet.cidr_block)
+            print("network_id" + subnet.network_id)
+
+    def test_azure_subnet_service_get_invalid_subnet(self):
+        subnet_id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
+                    'resourceGroups/CloudBridge-Azure/providers/' \
+                    'Microsoft.Network/virtualNetworks/' \
+                    'CloudBridgeNet/subnets/MySN'
+        subnet = self.provider.network.subnets.get(subnet_id)
+        self.assertIsNone(subnet)

+ 8 - 0
cloudbridge/cloud/providers/azure/azure_client.py

@@ -299,3 +299,11 @@ class AzureClient(object):
                              {
                              {
                                  'tags': tags
                                  'tags': tags
                              }).result()
                              }).result()
+
+    def list_subnets(self, network_name):
+        return self.network_management_client.subnets.\
+            list(self.resource_group_name, network_name)
+
+    def get_subnet(self, network_name, subnet_name):
+        return self.network_management_client.subnets.\
+            get(self.resource_group_name, network_name, subnet_name)

+ 28 - 1
cloudbridge/cloud/providers/azure/mock_azure_client.py

@@ -11,7 +11,7 @@ from azure.mgmt.compute.models import CreationData, DataDisk, \
 
 
 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.network.models import VirtualNetwork
+from azure.mgmt.network.models import Subnet, VirtualNetwork
 from azure.mgmt.resource.resources.models import ResourceGroup
 from azure.mgmt.resource.resources.models import ResourceGroup
 from azure.mgmt.resource.subscriptions.models import Location
 from azure.mgmt.resource.subscriptions.models import Location
 from azure.mgmt.storage.models import StorageAccount
 from azure.mgmt.storage.models import StorageAccount
@@ -229,6 +229,22 @@ class MockAzureClient:
 
 
     regions = [region1, region2, region3]
     regions = [region1, region2, region3]
 
 
+    subnet1 = Subnet()
+    subnet1.id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96' \
+                 '/resourceGroups/CloudBridge-Azure/providers/' \
+                 'Microsoft.Network/virtualNetworks/CloudBridgeNet1/subnets/' \
+                 'MySN1'
+    subnet1.name = 'MySN1'
+    subnet1.address_prefix = '10.0.0.0/24'
+    subnet2 = Subnet()
+    subnet2.id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
+                 'resourceGroups/CloudBridge-Azure/providers/' \
+                 'Microsoft.Network/virtualNetworks/CloudBridgeNet1/' \
+                 'subnets/MySN2'
+    subnet2.name = 'MySN2'
+    subnet2.address_prefix = '10.0.0.0/25'
+    subnets = [subnet1, subnet2]
+
     instance_type1 = VirtualMachineSize()
     instance_type1 = VirtualMachineSize()
     instance_type1.name = "instance_type1"
     instance_type1.name = "instance_type1"
     instance_type1.number_of_cores = 1
     instance_type1.number_of_cores = 1
@@ -574,3 +590,14 @@ class MockAzureClient:
         img = self.get_image(name)
         img = self.get_image(name)
         img.tags = tags
         img.tags = tags
         return img
         return img
+
+    def list_subnets(self, network_name):
+        return self.subnets
+
+    def get_subnet(self, network_name, subnet_name):
+        for subnet in self.subnets:
+            if subnet.name == subnet_name:
+                return subnet
+        response = Response()
+        response.status_code = 404
+        raise CloudError(response=response, error='Resource Not found')

+ 50 - 1
cloudbridge/cloud/providers/azure/resources.py

@@ -10,7 +10,7 @@ from cloudbridge.cloud.base.resources import BaseAttachmentInfo, \
     BaseBucket, BaseBucketObject, BaseInstanceType,\
     BaseBucket, BaseBucketObject, BaseInstanceType,\
     BaseMachineImage, BaseNetwork, \
     BaseMachineImage, BaseNetwork, \
     BasePlacementZone, BaseRegion, BaseSecurityGroup, BaseSecurityGroupRule, \
     BasePlacementZone, BaseRegion, BaseSecurityGroup, BaseSecurityGroupRule, \
-    BaseSnapshot, BaseVolume, ClientPagedResultList
+    BaseSnapshot, BaseSubnet, 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, \
     MachineImageState, NetworkState, SnapshotState
     MachineImageState, NetworkState, SnapshotState
@@ -959,6 +959,55 @@ class AzurePlacementZone(BasePlacementZone):
         return self._azure_region
         return self._azure_region
 
 
 
 
+class AzureSubnet(BaseSubnet):
+
+    def __init__(self, provider, subnet):
+        super(AzureSubnet, self).__init__(provider)
+        self._subnet = subnet
+
+    @property
+    def id(self):
+        return self._subnet.id
+
+    @property
+    def name(self):
+        """
+        Get the subnet name.
+
+        .. note:: the subnet must have a (case sensitive) tag ``Name``
+        """
+        return self._subnet.name
+
+    @name.setter
+    # pylint:disable=arguments-differ
+    def name(self, value):
+        """
+        Set the network name.
+        """
+        self._subnet.name = value
+
+    @property
+    def cidr_block(self):
+        return self._subnet.address_prefix
+
+    @property
+    def network_id(self):
+        params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, self._subnet.id)
+        networkname = params.get(NETWORK_NAME)
+        network = self._provider.azure_client.get_network(networkname)
+        if network:
+            return network.id
+        else:
+            return None
+
+    @property
+    def zone(self):
+        return self._provider.compute.regions.current.zones[0]
+
+    def delete(self):
+        return None
+
+
 class AzureInstanceType(BaseInstanceType):
 class AzureInstanceType(BaseInstanceType):
 
 
     def __init__(self, provider, instance_type):
     def __init__(self, provider, instance_type):

+ 63 - 10
cloudbridge/cloud/providers/azure/services.py

@@ -5,27 +5,26 @@ from azure.common import AzureException
 
 
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.services import BaseBlockStoreService, \
 from cloudbridge.cloud.base.services import BaseBlockStoreService, \
-    BaseComputeService, BaseImageService, \
-    BaseInstanceTypesService, BaseNetworkService, \
-    BaseObjectStoreService, BaseRegionService, \
-    BaseSecurityGroupService, \
-    BaseSecurityService, BaseSnapshotService, BaseVolumeService
+    BaseComputeService, BaseImageService, BaseInstanceTypesService, \
+    BaseNetworkService, BaseObjectStoreService, BaseRegionService, \
+    BaseSecurityGroupService, BaseSecurityService, \
+    BaseSnapshotService, BaseSubnetService, BaseVolumeService
 from cloudbridge.cloud.interfaces.resources import PlacementZone, \
 from cloudbridge.cloud.interfaces.resources import PlacementZone, \
     Snapshot, Volume
     Snapshot, Volume
 from cloudbridge.cloud.providers.azure import helpers as azure_helpers
 from cloudbridge.cloud.providers.azure import helpers as azure_helpers
 
 
 from msrestazure.azure_exceptions import CloudError
 from msrestazure.azure_exceptions import CloudError
-
 from .resources import AzureBucket, \
 from .resources import AzureBucket, \
     AzureInstanceType, AzureMachineImage, \
     AzureInstanceType, AzureMachineImage, \
     AzureNetwork, AzureRegion, \
     AzureNetwork, AzureRegion, \
     AzureSecurityGroup, \
     AzureSecurityGroup, \
-    AzureSnapshot, AzureVolume, \
+    AzureSnapshot, AzureSubnet, AzureVolume, \
     IMAGE_NAME, IMAGE_RESOURCE_ID, \
     IMAGE_NAME, IMAGE_RESOURCE_ID, \
     NETWORK_NAME, NETWORK_RESOURCE_ID, \
     NETWORK_NAME, NETWORK_RESOURCE_ID, \
     NETWORK_SECURITY_GROUP_RESOURCE_ID, \
     NETWORK_SECURITY_GROUP_RESOURCE_ID, \
     SECURITY_GROUP_NAME, SNAPSHOT_NAME, \
     SECURITY_GROUP_NAME, SNAPSHOT_NAME, \
-    SNAPSHOT_RESOURCE_ID, VOLUME_NAME, VOLUME_RESOURCE_ID
+    SNAPSHOT_RESOURCE_ID, SUBNET_NAME, SUBNET_RESOURCE_ID, \
+    VOLUME_NAME, VOLUME_RESOURCE_ID
 
 
 log = logging.getLogger(__name__)
 log = logging.getLogger(__name__)
 
 
@@ -385,6 +384,7 @@ class AzureInstanceTypesService(BaseInstanceTypesService):
 class AzureNetworkService(BaseNetworkService):
 class AzureNetworkService(BaseNetworkService):
     def __init__(self, provider):
     def __init__(self, provider):
         super(AzureNetworkService, self).__init__(provider)
         super(AzureNetworkService, self).__init__(provider)
+        self._subnet_svc = AzureSubnetService(self.provider)
 
 
     def get(self, network_id):
     def get(self, network_id):
         try:
         try:
@@ -426,8 +426,7 @@ class AzureNetworkService(BaseNetworkService):
 
 
     @property
     @property
     def subnets(self):
     def subnets(self):
-        raise NotImplementedError('AzureNetworkService '
-                                  'not implemented this property')
+        return self._subnet_svc
 
 
     def floating_ips(self, network_id=None):
     def floating_ips(self, network_id=None):
         raise NotImplementedError('AzureNetworkService '
         raise NotImplementedError('AzureNetworkService '
@@ -458,6 +457,7 @@ class AzureNetworkService(BaseNetworkService):
             log.exception(cloudError.message)
             log.exception(cloudError.message)
             return False
             return False
 
 
+
 class AzureRegionService(BaseRegionService):
 class AzureRegionService(BaseRegionService):
     def __init__(self, provider):
     def __init__(self, provider):
         super(AzureRegionService, self).__init__(provider)
         super(AzureRegionService, self).__init__(provider)
@@ -489,3 +489,56 @@ class AzureRegionService(BaseRegionService):
                 break
                 break
         return region
         return region
 
 
+
+class AzureSubnetService(BaseSubnetService):
+
+    def __init__(self, provider):
+        super(AzureSubnetService, self).__init__(provider)
+
+    def get(self, subnet_id):
+        try:
+            params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
+            subnet = self.provider.azure_client. \
+                get_subnet(params.get(NETWORK_NAME), params.get(SUBNET_NAME))
+            return AzureSubnet(self.provider, subnet)
+
+        except CloudError as cloudError:
+            log.exception(cloudError.message)
+            return None
+
+    def list(self, network=None):
+        subnets = []
+        if network:
+            network_id = (network.id if isinstance(network, AzureNetwork) else
+                          network)
+            params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+            network_name = params.get(NETWORK_NAME)
+            subnets = [AzureSubnet(self.provider, subnet)
+                       for subnet in
+                       self.provider.azure_client.list_subnets(network_name)]
+        else:
+            networks = [AzureNetwork(self.provider, network)
+                        for network in
+                        self.provider.azure_client.list_networks()]
+
+            for network in networks:
+
+                networksubnets = [AzureSubnet(self.provider, subnet)
+                                  for subnet in
+                                  self.provider.
+                                  azure_client.list_subnets(network.name)]
+                subnets.extend(networksubnets)
+        return ClientPagedResultList(self.provider, subnets,
+                                     limit=None, marker=None)
+
+    def create(self, network, cidr_block, name=None, zone=None):
+        raise NotImplementedError('AzureSubnetService '
+                                  'not implemented this method')
+
+    def get_or_create_default(self, zone=None):
+        raise NotImplementedError('AzureSubnetService '
+                                  'not implemented this method')
+
+    def delete(self, subnet):
+        raise NotImplementedError('AzureSubnetService '
+                                  'not implemented this method')