Kaynağa Gözat

Implemented Network Sevice (Get, List, Create and Delete etc.)

Venkata.Veera 9 yıl önce
ebeveyn
işleme
0b099a1d59

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

@@ -209,6 +209,25 @@ class AzureClient(object):
         return self.compute_client.disks. \
             get(self.resource_group_name, disk_name)
 
+    def list_networks(self):
+        return self.network_management_client.virtual_networks.list(
+            self.resource_group_name)
+
+    def get_network(self, network_name):
+        return self.network_management_client.virtual_networks.get(
+            self.resource_group_name, network_name)
+
+    def create_network(self, name, params):
+        return self.network_management_client.virtual_networks. \
+            create_or_update(self.resource_group_name,
+                             name,
+                             parameters=params,
+                             raw=True)
+
+    def delete_network(self, network_name):
+        return self.network_management_client.virtual_networks. \
+            delete(self.resource_group_name, network_name).wait()
+
     def list_disks(self):
         return self.compute_client.disks. \
             list_by_resource_group(self.resource_group_name)

+ 48 - 0
cloudbridge/cloud/providers/azure/mock_azure_client.py

@@ -9,6 +9,7 @@ from azure.mgmt.compute.models import CreationData, DataDisk, \
     Snapshot, StorageProfile, VirtualMachine
 from azure.mgmt.network.models import NetworkSecurityGroup
 from azure.mgmt.network.models import SecurityRule
+from azure.mgmt.network.models import VirtualNetwork
 from azure.mgmt.resource.resources.models import ResourceGroup
 from azure.mgmt.storage.models import StorageAccount
 from azure.storage.blob.models import Blob, BlobProperties, \
@@ -90,6 +91,32 @@ class MockAzureClient:
     rg = ResourceGroup(location='westus')
     rg.name = "testResourceGroup"
 
+    network1 = VirtualNetwork()
+    network1.id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96' \
+                  '/resourceGroups/CLOUDBRIDGE-AZURE/providers' \
+                  '/Microsoft.Network/virtualNetworks/CloudBridgeNet1'
+    network1.name = "CloudBridgeNet1"
+    network1.address_space = "{'address_prefixes': ['10.0.0.0/16']}"
+    network1.provisioning_state = "Succeeded"
+
+    network2 = VirtualNetwork()
+    network2.id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96' \
+                  '/resourceGroups/CLOUDBRIDGE-AZURE/providers' \
+                  '/Microsoft.Network/virtualNetworks/CloudBridgeNet2'
+    network2.name = "CloudBridgeNet2"
+    network2.address_space = "{'address_prefixes': ['10.0.0.0/16']}"
+    network2.provisioning_state = "Failed"
+
+    network3 = VirtualNetwork()
+    network3.id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96' \
+                  '/resourceGroups/CLOUDBRIDGE-AZURE/providers' \
+                  '/Microsoft.Network/virtualNetworks/CloudBridgeNet3'
+    network3.name = "CloudBridgeNet3"
+    network3.address_space = "{'address_prefixes': ['10.0.0.0/16']}"
+    network3.provisioning_state = "Succeeded"
+
+    networks = [network1, network2, network3]
+
     volume1 = Disk(location='eastus', creation_data=None)
     volume1.id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
                  'resourceGroups/CLOUDBRIDGE-AZURE' \
@@ -246,6 +273,27 @@ class MockAzureClient:
             raise CloudError(response=response, error='Resource not found')
         return self.rg
 
+    def list_networks(self):
+        return self.networks
+
+    def get_network(self, network_name):
+        for network in self.networks:
+            if network.name == network_name:
+                return network
+        return None
+
+    def create_network(self, name, region=None):
+        for network in self.networks:
+            if network.name == name:
+                return network
+
+    def delete_network(self, network_name):
+        for network in self.networks:
+            if network.name == network_name:
+                self.networks.remove(network)
+                return True
+        return False
+
     def create_resource_group(self, resource_group_name, params):
         rg = ResourceGroup(location='westus')
         rg.name = resource_group_name

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

@@ -7,7 +7,7 @@ from cloudbridge.cloud.providers.azure.azure_client import AzureClient
 from cloudbridge.cloud.providers.azure.mock_azure_client import MockAzureClient
 from cloudbridge.cloud.providers.azure.services \
     import AzureBlockStoreService, AzureComputeService, \
-    AzureObjectStoreService, AzureSecurityService
+    AzureNetworkService, AzureObjectStoreService, AzureSecurityService
 
 
 from msrestazure.azure_exceptions import CloudError
@@ -84,6 +84,7 @@ class AzureCloudProvider(BaseCloudProvider):
         self._object_store = AzureObjectStoreService(self)
         self._block_store = AzureBlockStoreService(self)
         self._compute = AzureComputeService(self)
+        self._network = AzureNetworkService(self)
 
     @property
     def compute(self):
@@ -91,8 +92,7 @@ class AzureCloudProvider(BaseCloudProvider):
 
     @property
     def network(self):
-        raise NotImplementedError(
-            "AzureCloudProvider does not implement this service")
+        return self._network
 
     @property
     def security(self):

+ 75 - 2
cloudbridge/cloud/providers/azure/resources.py

@@ -8,12 +8,12 @@ from azure.common import AzureException
 
 
 from cloudbridge.cloud.base.resources import BaseAttachmentInfo, \
-    BaseBucket, BaseBucketObject, BaseMachineImage, \
+    BaseBucket, BaseBucketObject, BaseMachineImage, BaseNetwork, \
     BaseSecurityGroup, BaseSecurityGroupRule, BaseSnapshot, BaseVolume, \
     ClientPagedResultList
 from cloudbridge.cloud.interfaces import VolumeState
 from cloudbridge.cloud.interfaces.resources import Instance, \
-    MachineImageState, SnapshotState
+    MachineImageState, NetworkState, SnapshotState
 from cloudbridge.cloud.providers.azure import helpers as azure_helpers
 
 from msrestazure.azure_exceptions import CloudError
@@ -787,3 +787,76 @@ class AzureMachineImage(BaseMachineImage):
         except CloudError:
             # image no longer exists
             self._state = "unknown"
+
+
+class AzureNetwork(BaseNetwork):
+    NETWORK_STATE_MAP = {
+        'InProgress': NetworkState.PENDING,
+        'Succeeded': NetworkState.AVAILABLE,
+    }
+
+    def __init__(self, provider, network):
+        super(AzureNetwork, self).__init__(provider)
+        self._network = network
+        self._state = self._network.provisioning_state
+
+    @property
+    def id(self):
+        return self._network.id
+
+    @property
+    def name(self):
+        """
+        Get the network name.
+
+        .. note:: the network must have a (case sensitive) tag ``Name``
+        """
+        return self._network.name
+
+    @name.setter
+    # pylint:disable=arguments-differ
+    def name(self, value):
+        """
+        Set the network name.
+        """
+        self._network.name = value
+
+    @property
+    def external(self):
+        """
+        For Azure, all VPC networks can be connected to the Internet so always
+        return ``True``.
+        """
+        return True
+
+    @property
+    def state(self):
+        return AzureNetwork.NETWORK_STATE_MAP.get(
+            self._state, NetworkState.UNKNOWN)
+
+    def refresh(self):
+        """
+        Refreshes the state of this network by re-querying the cloud provider
+        for its latest state.
+        """
+        try:
+            self._network = self._provider.azure_client.get_network(self.name)
+            self._state = self._network.provisioning_state
+        except (CloudError, ValueError):
+            # The network no longer exists and cannot be refreshed.
+            # set the status to unknown
+            self._state = 'unknown'
+
+    @property
+    def cidr_block(self):
+        return self._network.address_space
+
+    def delete(self):
+        """
+        Delete an existing network.
+        """
+        try:
+            network = self._provider.azure_client.delete_network(self.name)
+            return True if network else False
+        except CloudError:
+            return False

+ 60 - 3
cloudbridge/cloud/providers/azure/services.py

@@ -5,8 +5,8 @@ from azure.common import AzureException
 
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.services import BaseBlockStoreService, \
-    BaseComputeService, BaseImageService, BaseObjectStoreService, \
-    BaseSecurityGroupService, BaseSecurityService, \
+    BaseComputeService, BaseImageService, BaseNetworkService, \
+    BaseObjectStoreService, BaseSecurityGroupService, BaseSecurityService, \
     BaseSnapshotService, BaseVolumeService
 from cloudbridge.cloud.interfaces.resources import PlacementZone, \
     Snapshot, Volume
@@ -15,9 +15,10 @@ from cloudbridge.cloud.providers.azure import helpers as azure_helpers
 from msrestazure.azure_exceptions import CloudError
 
 from .resources import AzureBucket, AzureMachineImage, \
-    AzureSecurityGroup, \
+    AzureNetwork, AzureSecurityGroup, \
     AzureSnapshot, AzureVolume, \
     IMAGE_NAME, IMAGE_RESOURCE_ID, \
+    NETWORK_NAME, NETWORK_RESOURCE_ID, \
     NETWORK_SECURITY_GROUP_RESOURCE_ID, \
     SECURITY_GROUP_NAME, SNAPSHOT_NAME, \
     SNAPSHOT_RESOURCE_ID, VOLUME_NAME, VOLUME_RESOURCE_ID
@@ -349,3 +350,59 @@ class AzureImageService(BaseImageService):
                      for img in azure_images]
         return ClientPagedResultList(self.provider, cb_images,
                                      limit=limit, marker=marker)
+
+
+class AzureNetworkService(BaseNetworkService):
+    def __init__(self, provider):
+        super(AzureNetworkService, self).__init__(provider)
+
+    def get(self, network_id):
+        try:
+            params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+            network = self.provider.azure_client. \
+                get_network(params.get(NETWORK_NAME))
+            return AzureNetwork(self.provider, network) if network else None
+
+        except CloudError as cloudError:
+            log.exception(cloudError.message)
+            return None
+
+    def list(self, limit=None, marker=None):
+        """
+               List all networks.
+        """
+        networks = [AzureNetwork(self.provider, network)
+                    for network in self.provider.azure_client.list_networks()]
+        return ClientPagedResultList(self.provider, networks,
+                                     limit=limit, marker=marker)
+
+    def create(self, name=None):
+        if name is None:
+            name = "{0}-{1}".format(AzureNetwork.CB_DEFAULT_NETWORK_NAME,
+                                    uuid.uuid4().hex[:6])
+
+        params = {
+            'location': self.provider.azure_client.region_name,
+            'address_space': {
+                'address_prefixes': ['10.0.0.0/16']
+            }
+        }
+
+        self.provider.azure_client.create_network(name, params)
+        network = self.provider.azure_client.get_network(name)
+        cb_network = AzureNetwork(self.provider, network)
+
+        return cb_network
+
+    def delete(self, network_id):
+        """
+        Delete an existing network.
+        """
+        try:
+            params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+            network = self.provider.azure_client. \
+                delete_network(params.get(NETWORK_NAME))
+            return True if network else False
+        except CloudError as cloudError:
+            log.exception(cloudError.message)
+            return False

+ 3 - 3
test/test_azure_provider.py

@@ -21,9 +21,9 @@ class AzureProviderTestCase(ProviderTestBase):
             self.assertTrue(compute.regions is not None,
                             'Regions should not be none')
 
-        with self.assertRaises(Exception):
-            network = self.provider.network
-            self.assertTrue(network is not None, 'Network should not be None')
+        network = self.provider.network
+        self.assertTrue(network is not None,
+                        'Network should not be None')
 
         block_store = self.provider.block_store
         self.assertTrue(block_store is not None,