Sfoglia il codice sorgente

NetworkService refactored

almahmoud 7 anni fa
parent
commit
0883b7b0b9

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

@@ -823,6 +823,9 @@ class BaseNetwork(BaseCloudResource, BaseObjectLifeCycleMixin, Network):
             timeout=timeout,
             timeout=timeout,
             interval=interval)
             interval=interval)
 
 
+    def delete(self):
+        self._provider.networking.networks.delete(self.id)
+
     def create_subnet(self, label, cidr_block, zone):
     def create_subnet(self, label, cidr_block, zone):
         return self._provider.networking.subnets.create(
         return self._provider.networking.subnets.create(
             label=label, network=self, cidr_block=cidr_block, zone=zone)
             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
         return [subnet for subnet in self.provider.subnets
                 if subnet.network_id == self.id]
                 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):
     def get_or_create_default(self):
         networks = self.provider.networking.networks.find(
         networks = self.provider.networking.networks.find(
             label=BaseNetwork.CB_DEFAULT_NETWORK_LABEL)
             label=BaseNetwork.CB_DEFAULT_NETWORK_LABEL)
@@ -369,6 +363,81 @@ class BaseNetworkService(
             return self.provider.networking.networks.create(
             return self.provider.networking.networks.create(
                 BaseNetwork.CB_DEFAULT_NETWORK_LABEL, '10.0.0.0/16')
                 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(
 class BaseSubnetService(
         BasePageableObjectMixin, SubnetService, BaseCloudService):
         BasePageableObjectMixin, SubnetService, BaseCloudService):

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

@@ -980,9 +980,6 @@ class AWSNetwork(BaseNetwork):
     def cidr_block(self):
     def cidr_block(self):
         return self._vpc.cidr_block
         return self._vpc.cidr_block
 
 
-    def delete(self):
-        self._vpc.delete()
-
     @property
     @property
     def subnets(self):
     def subnets(self):
         return [AWSSubnet(self._provider, s) for s in self._vpc.subnets.all()]
         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,
                                   cb_resource=AWSNetwork,
                                   boto_collection_name='vpcs')
                                   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)
         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)
         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)
         label = kwargs.pop('label', None)
 
 
         # All kwargs should have been popped at this time.
         # 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)
         log.debug("Searching for AWS Network Service %s", label)
         return self.svc.find(filter_name='tag:Name', filter_value=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)
         AWSNetwork.assert_valid_resource_label(label)
 
 
         cb_net = self.svc.create('create_vpc', CidrBlock=cidr_block)
         cb_net = self.svc.create('create_vpc', CidrBlock=cidr_block)
@@ -781,6 +785,12 @@ class AWSNetworkService(BaseNetworkService):
             cb_net.label = label
             cb_net.label = label
         return cb_net
         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):
     def get_or_create_default(self):
         # # Look for provided default network
         # # Look for provided default network
         # for net in self.provider.networking.networks:
         # 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):
     def __init__(self, provider):
         super(AzureNetworkService, self).__init__(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:
         try:
             network = self.provider.azure_client.get_network(network_id)
             network = self.provider.azure_client.get_network(network_id)
             return AzureNetwork(self.provider, network)
             return AzureNetwork(self.provider, network)
@@ -940,31 +942,17 @@ class AzureNetworkService(BaseNetworkService):
             log.exception(cloud_error)
             log.exception(cloud_error)
             return None
             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)
         networks = [AzureNetwork(self.provider, network)
                     for network in self.provider.azure_client.list_networks()]
                     for network in self.provider.azure_client.list_networks()]
         return ClientPagedResultList(self.provider, networks,
         return ClientPagedResultList(self.provider, networks,
                                      limit=limit, marker=marker)
                                      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 = {
         params = {
             'location': self.provider.azure_client.region_name,
             'location': self.provider.azure_client.region_name,
             'address_space': {
             'address_space': {
@@ -980,10 +968,9 @@ class AzureNetworkService(BaseNetworkService):
         cb_network = AzureNetwork(self.provider, az_network)
         cb_network = AzureNetwork(self.provider, az_network)
         return cb_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)
         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):
     def __init__(self, provider):
         super(GCENetworkService, self).__init__(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)
         network = self.provider.get_resource('networks', network_id)
         return GCENetwork(self.provider, network) if network else None
         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
         GCE networks are global. There is at most one network with a given
         name.
         name.
@@ -605,7 +609,9 @@ class GCENetworkService(BaseNetworkService):
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
         return ClientPagedResultList(self._provider, list(matches))
         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'
         # TODO: Decide whether we keep filter in 'list'
         networks = []
         networks = []
         response = (self.provider
         response = (self.provider
@@ -619,7 +625,9 @@ class GCENetworkService(BaseNetworkService):
         return ClientPagedResultList(self.provider, networks,
         return ClientPagedResultList(self.provider, networks,
                                      limit=limit, marker=marker)
                                      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
         Creates an auto mode VPC network with default subnets. It is possible
         to add additional subnets later.
         to add additional subnets later.
@@ -652,15 +660,17 @@ class GCENetworkService(BaseNetworkService):
                 label=GCENetwork.CB_DEFAULT_NETWORK_LABEL,
                 label=GCENetwork.CB_DEFAULT_NETWORK_LABEL,
                 cidr_block=GCENetwork.CB_DEFAULT_IPV4RANGE)
                 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
         # Accepts network object
-        if isinstance(network, GCENetwork):
-            name = network.name
+        if isinstance(network_id, GCENetwork):
+            name = network_id.name
         # Accepts both name and ID
         # Accepts both name and ID
-        elif 'googleapis' in network:
-            name = network.split('/')[-1]
+        elif 'googleapis' in network_id:
+            name = network_id.split('/')[-1]
         else:
         else:
-            name = network
+            name = network_id
         response = (self.provider
         response = (self.provider
                         .gce_compute
                         .gce_compute
                         .networks()
                         .networks()
@@ -672,7 +682,7 @@ class GCENetworkService(BaseNetworkService):
         tag_name = "_".join(["network", name, "label"])
         tag_name = "_".join(["network", name, "label"])
         if not helpers.remove_metadata_item(self.provider, tag_name):
         if not helpers.remove_metadata_item(self.provider, tag_name):
             log.warning('No label was found associated with this network '
             log.warning('No label was found associated with this network '
-                        '"{}" when deleted.'.format(network.name))
+                        '"{}" when deleted.'.format(network_id))
         return True
         return True
 
 
 
 
@@ -1218,10 +1228,10 @@ class GCSBucketService(BaseBucketService):
         Delete this bucket.
         Delete this bucket.
         """
         """
         # GCE uses name rather than URL to identify resources
         # GCE uses name rather than URL to identify resources
-        name = (self._provider._storage_resources
+        name = (self.provider._storage_resources
                     .parse_url(bucket_id)
                     .parse_url(bucket_id)
                     .parameters.get("bucket"))
                     .parameters.get("bucket"))
-        (self._provider
+        (self.provider
              .gcs_storage
              .gcs_storage
              .buckets()
              .buckets()
              .delete(bucket=name)
              .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 keystoneclient.v3.regions import Region
 
 
-from neutronclient.common.exceptions import PortNotFoundClient
-
 import novaclient.exceptions as novaex
 import novaclient.exceptions as novaex
 
 
 from openstack.exceptions import HttpException
 from openstack.exceptions import HttpException
@@ -894,21 +892,6 @@ class OpenStackNetwork(BaseNetwork):
         # OpenStack does not define a CIDR block for networks
         # OpenStack does not define a CIDR block for networks
         return ''
         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
     @property
     def subnets(self):
     def subnets(self):
         subnets = (self._provider.neutron.list_subnets(network_id=self.id)
         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 cinderclient.exceptions import NotFound as CinderNotFound
 
 
 from neutronclient.common.exceptions import NeutronClientException
 from neutronclient.common.exceptions import NeutronClientException
+from neutronclient.common.exceptions import PortNotFoundClient
 
 
 from novaclient.exceptions import NotFound as NovaNotFound
 from novaclient.exceptions import NotFound as NovaNotFound
 
 
@@ -851,19 +852,24 @@ class OpenStackNetworkService(BaseNetworkService):
     def __init__(self, provider):
     def __init__(self, provider):
         super(OpenStackNetworkService, self).__init__(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)
         network = (n for n in self if n.id == network_id)
         return next(network, None)
         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)
         networks = [OpenStackNetwork(self.provider, network)
                     for network in self.provider.neutron.list_networks()
                     for network in self.provider.neutron.list_networks()
                     .get('networks') if network]
                     .get('networks') if network]
         return ClientPagedResultList(self.provider, networks,
         return ClientPagedResultList(self.provider, networks,
                                      limit=limit, marker=marker)
                                      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)
         label = kwargs.pop('label', None)
 
 
         # All kwargs should have been popped at this time.
         # All kwargs should have been popped at this time.
@@ -878,9 +884,9 @@ class OpenStackNetworkService(BaseNetworkService):
                     .get('networks') if network]
                     .get('networks') if network]
         return ClientPagedResultList(self.provider, networks)
         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)
         OpenStackNetwork.assert_valid_resource_label(label)
         net_info = {'name': label or ""}
         net_info = {'name': label or ""}
         network = self.provider.neutron.create_network({'network': net_info})
         network = self.provider.neutron.create_network({'network': net_info})
@@ -889,6 +895,24 @@ class OpenStackNetworkService(BaseNetworkService):
             cb_net.label = label
             cb_net.label = label
         return cb_net
         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):
 class OpenStackSubnetService(BaseSubnetService):