almahmoud 7 лет назад
Родитель
Сommit
c53d2aed94

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

@@ -941,6 +941,9 @@ class BaseRouter(BaseCloudResource, Router):
                 self._provider == other._provider and
                 self.id == other.id)
 
+    def delete(self):
+        self._provider.networking.routers.delete(self.id)
+
 
 class BaseInternetGateway(BaseCloudResource, BaseObjectLifeCycleMixin,
                           InternetGateway):

+ 58 - 12
cloudbridge/cloud/base/services.py

@@ -17,7 +17,6 @@ from cloudbridge.cloud.base.resources import BaseVolume
 from cloudbridge.cloud.interfaces.exceptions import \
     InvalidConfigurationException
 from cloudbridge.cloud.interfaces.resources import Network
-from cloudbridge.cloud.interfaces.resources import Router
 from cloudbridge.cloud.interfaces.services import BucketObjectService
 from cloudbridge.cloud.interfaces.services import BucketService
 from cloudbridge.cloud.interfaces.services import CloudService
@@ -896,17 +895,6 @@ class BaseRouterService(
         super(BaseRouterService, self).__init__(provider)
         self._service_event_pattern += ".networking.routers"
 
-    def delete(self, router):
-        if isinstance(router, Router):
-            log.info("Router %s successful deleted.", router)
-            router.delete()
-        else:
-            log.info("Getting router %s", router)
-            router = self.get(router)
-            if router:
-                log.info("Router %s successful deleted.", router)
-                router.delete()
-
     def get_or_create_default(self, network):
         net_id = network.id if isinstance(network, Network) else network
         routers = self.provider.networking.routers.find(
@@ -917,3 +905,61 @@ class BaseRouterService(
         else:
             return self.provider.networking.routers.create(
                 network=net_id, label=BaseRouter.CB_DEFAULT_ROUTER_LABEL)
+
+    def get(self, router_id):
+        """
+        Returns a router given its ID. Returns ``None`` if the router
+        does not exist.
+
+        :type router_id: str
+        :param router_id: The id of the desired router.
+
+        :rtype: ``Router``
+        :return:  ``None`` is returned if the router does not exist, and
+                  the router's provider-specific CloudBridge object is
+                  returned if the router is found.
+        """
+        return self.dispatch(self, "provider.networking.routers.get",
+                             router_id)
+
+    def find(self, **kwargs):
+        """
+        Returns a list of routers filtered by the given keyword arguments.
+        Accepted search arguments are: 'label'
+        """
+        return self.dispatch(self, "provider.networking.routers.find",
+                             **kwargs)
+
+    def list(self, limit=None, marker=None):
+        """
+        List all routers.
+        """
+        return self.dispatch(self, "provider.networking.routers.list",
+                             limit=limit, marker=marker)
+
+    def create(self, label, network):
+        """
+        Create a new router.
+
+        :type label: str
+        :param label: The label of the router to be created. Note that labels
+                      do not have to be unique and can be changed.
+        :type network: ``Network``
+        :param network: The network in which the router should be created
+
+        :rtype: ``Router``
+        :return:  The created router's provider-specific CloudBridge object.
+        """
+        BaseRouter.assert_valid_resource_label(label)
+        return self.dispatch(self, "provider.networking.routers.create",
+                             label, network)
+
+    def delete(self, router_id):
+        """
+        Delete an existing router.
+
+        :type router_id: str
+        :param router_id: The ID of the router to be deleted.
+        """
+        return self.dispatch(self, "provider.networking.routers.delete",
+                             router_id)

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

@@ -1153,9 +1153,6 @@ class AWSRouter(BaseRouter):
     def network_id(self):
         return self._route_table.vpc_id
 
-    def delete(self):
-        self._route_table.delete()
-
     def attach_subnet(self, subnet):
         subnet_id = subnet.id if isinstance(subnet, AWSSubnet) else subnet
         self._route_table.associate_with_subnet(SubnetId=subnet_id)

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

@@ -1022,11 +1022,14 @@ class AWSRouterService(BaseRouterService):
                                   cb_resource=AWSRouter,
                                   boto_collection_name='route_tables')
 
-    def get(self, router_id):
-        log.debug("Getting AWS Router Service with the id: %s", router_id)
+    @implement(event_pattern="provider.networking.routers.get",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _get(self, router_id):
         return self.svc.get(router_id)
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.networking.routers.find",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         label = kwargs.pop('label', None)
 
         # All kwargs should have been popped at this time.
@@ -1037,17 +1040,23 @@ class AWSRouterService(BaseRouterService):
         log.debug("Searching for AWS Router Service %s", label)
         return self.svc.find(filter_name='tag:Name', filter_value=label)
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.networking.routers.list",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker)
 
-    def create(self, label, network):
-        log.debug("Creating AWS Router Service with the params "
-                  "[label: %s network: %s]", label, network)
-        AWSRouter.assert_valid_resource_label(label)
-
+    @implement(event_pattern="provider.networking.routers.create",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, network):
         network_id = network.id if isinstance(network, AWSNetwork) else network
 
         cb_router = self.svc.create('create_route_table', VpcId=network_id)
         if label:
             cb_router.label = label
         return cb_router
+
+    @implement(event_pattern="provider.networking.routers.delete",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, router_id):
+        aws_router = self.svc.get_raw(router_id)
+        aws_router.delete()

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

@@ -1618,9 +1618,6 @@ class AzureRouter(BaseRouter):
     def network_id(self):
         return None
 
-    def delete(self):
-        self._provider.azure_client.delete_route_table(self.name)
-
     def attach_subnet(self, subnet):
         self._provider.azure_client. \
             attach_subnet_to_route_table(subnet.id,

+ 18 - 5
cloudbridge/cloud/providers/azure/services.py

@@ -1141,7 +1141,9 @@ class AzureRouterService(BaseRouterService):
     def __init__(self, provider):
         super(AzureRouterService, self).__init__(provider)
 
-    def get(self, router_id):
+    @implement(event_pattern="provider.networking.routers.get",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _get(self, router_id):
         try:
             route = self.provider.azure_client.get_route_table(router_id)
             return AzureRouter(self.provider, route)
@@ -1150,7 +1152,9 @@ class AzureRouterService(BaseRouterService):
             log.exception(cloud_error)
             return None
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.networking.routers.find",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         obj_list = self
         filters = ['label']
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
@@ -1164,7 +1168,9 @@ class AzureRouterService(BaseRouterService):
         return ClientPagedResultList(self.provider,
                                      matches if matches else [])
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.networking.routers.list",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         routes = [AzureRouter(self.provider, route)
                   for route in
                   self.provider.azure_client.list_route_tables()]
@@ -1172,8 +1178,9 @@ class AzureRouterService(BaseRouterService):
                                      routes,
                                      limit=limit, marker=marker)
 
-    def create(self, label, network):
-        AzureRouter.assert_valid_resource_label(label)
+    @implement(event_pattern="provider.networking.routers.create",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, network):
         router_name = AzureRouter._generate_name_from_label(label, "cb-router")
 
         parameters = {"location": self.provider.region_name,
@@ -1182,3 +1189,9 @@ class AzureRouterService(BaseRouterService):
         route = self.provider.azure_client. \
             create_route_table(router_name, parameters)
         return AzureRouter(self.provider, route)
+
+    @implement(event_pattern="provider.networking.routers.delete",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, router_id):
+        az_router = self.provider.azure_client.get_route_table(router_id)
+        self.provider.azure_client.delete_route_table(az_router.name)

+ 0 - 15
cloudbridge/cloud/providers/gce/resources.py

@@ -1592,21 +1592,6 @@ class GCERouter(BaseRouter):
         network = self._provider.networking.networks.get(self.network_id)
         return network.subnets
 
-    def delete(self):
-        operation = (self._provider
-                     .gce_compute
-                     .routers()
-                     .delete(project=self._provider.project_name,
-                             region=self.region_name,
-                             router=self.name)
-                     .execute())
-        self._provider.wait_for_operation(operation, region=self.region_name)
-        # Remove label
-        tag_name = "_".join(["router", self.name, "label"])
-        if not helpers.remove_metadata_item(self._provider, tag_name):
-            log.warning('No label was found associated with this router '
-                        '"{}" when deleted.'.format(self.name))
-
     def attach_subnet(self, subnet):
         if not isinstance(subnet, GCESubnet):
             subnet = self._provider.networking.subnets.get(subnet)

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

@@ -739,18 +739,24 @@ class GCERouterService(BaseRouterService):
     def __init__(self, provider):
         super(GCERouterService, self).__init__(provider)
 
-    def get(self, router_id):
+    @implement(event_pattern="provider.networking.routers.get",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _get(self, router_id):
         router = self.provider.get_resource(
             'routers', router_id, region=self.provider.region_name)
         return GCERouter(self.provider, router) if router else None
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.networking.routers.find",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         obj_list = self
         filters = ['name', 'label']
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
         return ClientPagedResultList(self._provider, list(matches))
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.networking.routers.list",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         region = self.provider.region_name
         max_result = limit if limit is not None and limit < 500 else 500
         response = (self.provider
@@ -771,7 +777,9 @@ class GCERouterService(BaseRouterService):
                                      response.get('nextPageToken'),
                                      False, data=routers)
 
-    def create(self, label, network):
+    @implement(event_pattern="provider.networking.routers.create",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, network):
         log.debug("Creating GCE Router Service with params "
                   "[label: %s network: %s]", label, network)
         GCERouter.assert_valid_resource_label(label)
@@ -794,9 +802,13 @@ class GCERouterService(BaseRouterService):
         cb_router.label = label
         return cb_router
 
-    def delete(self, router):
+    @implement(event_pattern="provider.networking.routers.delete",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, router_id):
         region_name = self.provider.region_name
-        name = router.name if isinstance(router, GCERouter) else router
+        gce_router = self.provider.get_resource(
+            'routers', router_id, region=region_name)
+        name = gce_router['name']
         (self.provider
          .gce_compute
          .routers()
@@ -804,6 +816,11 @@ class GCERouterService(BaseRouterService):
                  region=region_name,
                  router=name)
          .execute())
+        # Remove label
+        tag_name = "_".join(["router", name, "label"])
+        if not helpers.remove_metadata_item(self.provider, tag_name):
+            log.warning('No label was found associated with this router '
+                        '"{}" when deleted.'.format(name))
 
     def _get_in_region(self, router_id, region=None):
         region_name = self.provider.region_name

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

@@ -1056,9 +1056,6 @@ class OpenStackRouter(BaseRouter):
             return ports[0].network_id
         return None
 
-    def delete(self):
-        self._provider.os_conn.delete_router(self.id)
-
     def attach_subnet(self, subnet):
         ret = self._provider.os_conn.add_router_interface(
             self._router.toDict(), subnet.id)

+ 17 - 6
cloudbridge/cloud/providers/openstack/services.py

@@ -1034,26 +1034,37 @@ class OpenStackRouterService(BaseRouterService):
     def __init__(self, provider):
         super(OpenStackRouterService, self).__init__(provider)
 
-    def get(self, router_id):
+    @implement(event_pattern="provider.networking.routers.get",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _get(self, router_id):
         log.debug("Getting OpenStack Router with the id: %s", router_id)
         router = self.provider.os_conn.get_router(router_id)
         return OpenStackRouter(self.provider, router) if router else None
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.networking.routers.list",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         routers = self.provider.os_conn.list_routers()
         os_routers = [OpenStackRouter(self.provider, r) for r in routers]
         return ClientPagedResultList(self.provider, os_routers, limit=limit,
                                      marker=marker)
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.networking.routers.find",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         obj_list = self
         filters = ['label']
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
         return ClientPagedResultList(self._provider, list(matches))
 
-    def create(self, label, network):
+    @implement(event_pattern="provider.networking.routers.create",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, network):
         """Parameter ``network`` is not used by OpenStack."""
-        log.debug("Creating OpenStack Router with the label: %s", label)
-        OpenStackRouter.assert_valid_resource_label(label)
         router = self.provider.os_conn.create_router(name=label)
         return OpenStackRouter(self.provider, router)
+
+    @implement(event_pattern="provider.networking.routers.delete",
+               priority=BaseRouterService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, router_id):
+        self._provider.os_conn.delete_router(router_id)