瀏覽代碼

NetworkService refactored

almahmoud 7 年之前
父節點
當前提交
0883b7b0b9

+ 3 - 0
cloudbridge/cloud/base/resources.py

@@ -823,6 +823,9 @@ class BaseNetwork(BaseCloudResource, BaseObjectLifeCycleMixin, Network):
             timeout=timeout,
             interval=interval)
 
+    def delete(self):
+        self._provider.networking.networks.delete(self.id)
+
     def create_subnet(self, label, cidr_block, zone):
         return self._provider.networking.subnets.create(
             label=label, network=self, cidr_block=cidr_block, zone=zone)

+ 75 - 6
cloudbridge/cloud/base/services.py

@@ -351,12 +351,6 @@ class BaseNetworkService(
         return [subnet for subnet in self.provider.subnets
                 if subnet.network_id == self.id]
 
-    def delete(self, network_id):
-        network = self.get(network_id)
-        if network:
-            log.info("Deleting network %s", network_id)
-            network.delete()
-
     def get_or_create_default(self):
         networks = self.provider.networking.networks.find(
             label=BaseNetwork.CB_DEFAULT_NETWORK_LABEL)
@@ -369,6 +363,81 @@ class BaseNetworkService(
             return self.provider.networking.networks.create(
                 BaseNetwork.CB_DEFAULT_NETWORK_LABEL, '10.0.0.0/16')
 
+    @implement(event_pattern="provider.networking.networks.find",
+               priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
+        obj_list = self
+        filters = ['label']
+        matches = cb_helpers.generic_find(filters, kwargs, obj_list)
+
+        # All kwargs should have been popped at this time.
+        if len(kwargs) > 0:
+            raise TypeError("Unrecognised parameters for search: %s."
+                            " Supported attributes: %s" % (kwargs,
+                                                           ", ".join(filters)))
+
+        return ClientPagedResultList(self.provider,
+                                     matches if matches else [])
+
+    def get(self, network_id):
+        """
+        Returns a network given its ID. Returns ``None`` if the network
+        does not exist.
+
+        :type network_id: str
+        :param network_id: The id of the desired network.
+
+        :rtype: ``network``
+        :return:  ``None`` is returned if the network does not exist, and
+                  the network's provider-specific CloudBridge object is
+                  returned if the network is found.
+        """
+        return self.dispatch(self, "provider.networking.networks.get",
+                             network_id)
+
+    def find(self, **kwargs):
+        """
+        Returns a list of networks filtered by the given keyword arguments.
+        Accepted search arguments are: 'label'
+        """
+        return self.dispatch(self, "provider.networking.networks.find",
+                             **kwargs)
+
+    def list(self, limit=None, marker=None):
+        """
+        List all networks.
+        """
+        return self.dispatch(self, "provider.networking.networks.list",
+                             limit=limit, marker=marker)
+
+    def create(self, label, cidr_block):
+        """
+        Create a new network.
+
+        :type label: str
+        :param label: The label of the network to be created. Note that labels
+                      do not have to be unique and can be changed.
+        :type cidr_block: str
+        :param cidr_block: A string representing a 'Classless Inter-Domain
+                           Routing' notation
+
+        :rtype: ``Network``
+        :return:  The created network's provider-specific CloudBridge object.
+        """
+        BaseNetwork.assert_valid_resource_label(label)
+        return self.dispatch(self, "provider.networking.networks.create",
+                             label, cidr_block)
+
+    def delete(self, network_id):
+        """
+        Delete an existing network.
+
+        :type network_id: str
+        :param network_id: The ID of the network to be deleted.
+        """
+        return self.dispatch(self, "provider.networking.networks.delete",
+                             network_id)
+
 
 class BaseSubnetService(
         BasePageableObjectMixin, SubnetService, BaseCloudService):

+ 0 - 3
cloudbridge/cloud/providers/aws/resources.py

@@ -980,9 +980,6 @@ class AWSNetwork(BaseNetwork):
     def cidr_block(self):
         return self._vpc.cidr_block
 
-    def delete(self):
-        self._vpc.delete()
-
     @property
     def subnets(self):
         return [AWSSubnet(self._provider, s) for s in self._vpc.subnets.all()]

+ 18 - 8
cloudbridge/cloud/providers/aws/services.py

@@ -750,15 +750,19 @@ class AWSNetworkService(BaseNetworkService):
                                   cb_resource=AWSNetwork,
                                   boto_collection_name='vpcs')
 
-    def get(self, network_id):
-        log.debug("Getting AWS Network Service with the id: %s",
-                  network_id)
+    @implement(event_pattern="provider.networking.networks.get",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _get(self, network_id):
         return self.svc.get(network_id)
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.networking.networks.list",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker)
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.networking.networks.find",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         label = kwargs.pop('label', None)
 
         # All kwargs should have been popped at this time.
@@ -769,9 +773,9 @@ class AWSNetworkService(BaseNetworkService):
         log.debug("Searching for AWS Network Service %s", label)
         return self.svc.find(filter_name='tag:Name', filter_value=label)
 
-    def create(self, label, cidr_block):
-        log.debug("Creating AWS Network Service with the params "
-                  "[label: %s block: %s]", label, cidr_block)
+    @implement(event_pattern="provider.networking.networks.create",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, cidr_block):
         AWSNetwork.assert_valid_resource_label(label)
 
         cb_net = self.svc.create('create_vpc', CidrBlock=cidr_block)
@@ -781,6 +785,12 @@ class AWSNetworkService(BaseNetworkService):
             cb_net.label = label
         return cb_net
 
+    @implement(event_pattern="provider.networking.networks.delete",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, network_id):
+        net = self.get(network_id)
+        net._vpc.delete()
+
     def get_or_create_default(self):
         # # Look for provided default network
         # for net in self.provider.networking.networks:

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

@@ -931,7 +931,9 @@ class AzureNetworkService(BaseNetworkService):
     def __init__(self, provider):
         super(AzureNetworkService, self).__init__(provider)
 
-    def get(self, network_id):
+    @implement(event_pattern="provider.networking.networks.get",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _get(self, network_id):
         try:
             network = self.provider.azure_client.get_network(network_id)
             return AzureNetwork(self.provider, network)
@@ -940,31 +942,17 @@ class AzureNetworkService(BaseNetworkService):
             log.exception(cloud_error)
             return None
 
-    def list(self, limit=None, marker=None):
-        """
-        List all networks.
-        """
+    @implement(event_pattern="provider.networking.networks.list",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         networks = [AzureNetwork(self.provider, network)
                     for network in self.provider.azure_client.list_networks()]
         return ClientPagedResultList(self.provider, networks,
                                      limit=limit, marker=marker)
 
-    def find(self, **kwargs):
-        obj_list = self
-        filters = ['label']
-        matches = cb_helpers.generic_find(filters, kwargs, obj_list)
-
-        # All kwargs should have been popped at this time.
-        if len(kwargs) > 0:
-            raise TypeError("Unrecognised parameters for search: %s."
-                            " Supported attributes: %s" % (kwargs,
-                                                           ", ".join(filters)))
-
-        return ClientPagedResultList(self.provider,
-                                     matches if matches else [])
-
-    def create(self, label, cidr_block):
-        AzureNetwork.assert_valid_resource_label(label)
+    @implement(event_pattern="provider.networking.networks.create",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, cidr_block):
         params = {
             'location': self.provider.azure_client.region_name,
             'address_space': {
@@ -980,10 +968,9 @@ class AzureNetworkService(BaseNetworkService):
         cb_network = AzureNetwork(self.provider, az_network)
         return cb_network
 
-    def delete(self, network_id):
-        """
-        Delete an existing network.
-        """
+    @implement(event_pattern="provider.networking.networks.delete",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, network_id):
         self.provider.azure_client.delete_network(network_id)
 
 

+ 23 - 13
cloudbridge/cloud/providers/gce/services.py

@@ -591,11 +591,15 @@ class GCENetworkService(BaseNetworkService):
     def __init__(self, provider):
         super(GCENetworkService, self).__init__(provider)
 
-    def get(self, network_id):
+    @implement(event_pattern="provider.networking.networks.get",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _get(self, network_id):
         network = self.provider.get_resource('networks', network_id)
         return GCENetwork(self.provider, network) if network else None
 
-    def find(self, limit=None, marker=None, **kwargs):
+    @implement(event_pattern="provider.networking.networks.find",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _find(self, limit=None, marker=None, **kwargs):
         """
         GCE networks are global. There is at most one network with a given
         name.
@@ -605,7 +609,9 @@ class GCENetworkService(BaseNetworkService):
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
         return ClientPagedResultList(self._provider, list(matches))
 
-    def list(self, limit=None, marker=None, filter=None):
+    @implement(event_pattern="provider.networking.networks.list",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None, filter=None):
         # TODO: Decide whether we keep filter in 'list'
         networks = []
         response = (self.provider
@@ -619,7 +625,9 @@ class GCENetworkService(BaseNetworkService):
         return ClientPagedResultList(self.provider, networks,
                                      limit=limit, marker=marker)
 
-    def create(self, label, cidr_block):
+    @implement(event_pattern="provider.networking.networks.create",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, cidr_block):
         """
         Creates an auto mode VPC network with default subnets. It is possible
         to add additional subnets later.
@@ -652,15 +660,17 @@ class GCENetworkService(BaseNetworkService):
                 label=GCENetwork.CB_DEFAULT_NETWORK_LABEL,
                 cidr_block=GCENetwork.CB_DEFAULT_IPV4RANGE)
 
-    def delete(self, network):
+    @implement(event_pattern="provider.networking.networks.delete",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, network_id):
         # Accepts network object
-        if isinstance(network, GCENetwork):
-            name = network.name
+        if isinstance(network_id, GCENetwork):
+            name = network_id.name
         # Accepts both name and ID
-        elif 'googleapis' in network:
-            name = network.split('/')[-1]
+        elif 'googleapis' in network_id:
+            name = network_id.split('/')[-1]
         else:
-            name = network
+            name = network_id
         response = (self.provider
                         .gce_compute
                         .networks()
@@ -672,7 +682,7 @@ class GCENetworkService(BaseNetworkService):
         tag_name = "_".join(["network", name, "label"])
         if not helpers.remove_metadata_item(self.provider, tag_name):
             log.warning('No label was found associated with this network '
-                        '"{}" when deleted.'.format(network.name))
+                        '"{}" when deleted.'.format(network_id))
         return True
 
 
@@ -1218,10 +1228,10 @@ class GCSBucketService(BaseBucketService):
         Delete this bucket.
         """
         # GCE uses name rather than URL to identify resources
-        name = (self._provider._storage_resources
+        name = (self.provider._storage_resources
                     .parse_url(bucket_id)
                     .parameters.get("bucket"))
-        (self._provider
+        (self.provider
              .gcs_storage
              .buckets()
              .delete(bucket=name)

+ 0 - 17
cloudbridge/cloud/providers/openstack/resources.py

@@ -14,8 +14,6 @@ except ImportError:  # python 2
 
 from keystoneclient.v3.regions import Region
 
-from neutronclient.common.exceptions import PortNotFoundClient
-
 import novaclient.exceptions as novaex
 
 from openstack.exceptions import HttpException
@@ -894,21 +892,6 @@ class OpenStackNetwork(BaseNetwork):
         # OpenStack does not define a CIDR block for networks
         return ''
 
-    def delete(self):
-        if not self.external and self.id in str(
-                self._provider.neutron.list_networks()):
-            # If there are ports associated with the network, it won't delete
-            ports = self._provider.neutron.list_ports(
-                network_id=self.id).get('ports', [])
-            for port in ports:
-                try:
-                    self._provider.neutron.delete_port(port.get('id'))
-                except PortNotFoundClient:
-                    # Ports could have already been deleted if instances
-                    # are terminated etc. so exceptions can be safely ignored
-                    pass
-            self._provider.neutron.delete_network(self.id)
-
     @property
     def subnets(self):
         subnets = (self._provider.neutron.list_subnets(network_id=self.id)

+ 31 - 7
cloudbridge/cloud/providers/openstack/services.py

@@ -6,6 +6,7 @@ import logging
 from cinderclient.exceptions import NotFound as CinderNotFound
 
 from neutronclient.common.exceptions import NeutronClientException
+from neutronclient.common.exceptions import PortNotFoundClient
 
 from novaclient.exceptions import NotFound as NovaNotFound
 
@@ -851,19 +852,24 @@ class OpenStackNetworkService(BaseNetworkService):
     def __init__(self, provider):
         super(OpenStackNetworkService, self).__init__(provider)
 
-    def get(self, network_id):
-        log.debug("Getting OpenStack Network with the id: %s", network_id)
+    @implement(event_pattern="provider.networking.networks.get",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _get(self, network_id):
         network = (n for n in self if n.id == network_id)
         return next(network, None)
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.networking.networks.list",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         networks = [OpenStackNetwork(self.provider, network)
                     for network in self.provider.neutron.list_networks()
                     .get('networks') if network]
         return ClientPagedResultList(self.provider, networks,
                                      limit=limit, marker=marker)
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.networking.networks.find",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         label = kwargs.pop('label', None)
 
         # All kwargs should have been popped at this time.
@@ -878,9 +884,9 @@ class OpenStackNetworkService(BaseNetworkService):
                     .get('networks') if network]
         return ClientPagedResultList(self.provider, networks)
 
-    def create(self, label, cidr_block):
-        log.debug("Creating OpenStack Network with the params: "
-                  "[label: %s Cinder Block: %s]", label, cidr_block)
+    @implement(event_pattern="provider.networking.networks.create",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, cidr_block):
         OpenStackNetwork.assert_valid_resource_label(label)
         net_info = {'name': label or ""}
         network = self.provider.neutron.create_network({'network': net_info})
@@ -889,6 +895,24 @@ class OpenStackNetworkService(BaseNetworkService):
             cb_net.label = label
         return cb_net
 
+    @implement(event_pattern="provider.networking.networks.create",
+               priority=BaseNetworkService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, network_id):
+        network = self.get(network_id)
+        if not network.external and network_id in str(
+                self.provider.neutron.list_networks()):
+            # If there are ports associated with the network, it won't delete
+            ports = self.provider.neutron.list_ports(
+                network_id=network_id).get('ports', [])
+            for port in ports:
+                try:
+                    self.provider.neutron.delete_port(port.get('id'))
+                except PortNotFoundClient:
+                    # Ports could have already been deleted if instances
+                    # are terminated etc. so exceptions can be safely ignored
+                    pass
+            self.provider.neutron.delete_network(network_id)
+
 
 class OpenStackSubnetService(BaseSubnetService):