Ehsan Chiniforooshan 8 лет назад
Родитель
Сommit
cd51ae1873
1 измененных файлов с 69 добавлено и 18 удалено
  1. 69 18
      cloudbridge/cloud/providers/gce/services.py

+ 69 - 18
cloudbridge/cloud/providers/gce/services.py

@@ -13,6 +13,7 @@ from cloudbridge.cloud.base.services import BaseKeyPairService
 from cloudbridge.cloud.base.services import BaseNetworkService
 from cloudbridge.cloud.base.services import BaseNetworkingService
 from cloudbridge.cloud.base.services import BaseRegionService
+from cloudbridge.cloud.base.services import BaseRouterService
 from cloudbridge.cloud.base.services import BaseSecurityService
 from cloudbridge.cloud.base.services import BaseSnapshotService
 from cloudbridge.cloud.base.services import BaseStorageService
@@ -594,6 +595,7 @@ class GCENetworkingService(BaseNetworkingService):
         super(GCENetworkingService, self).__init__(provider)
         self._network_service = GCENetworkService(self.provider)
         self._subnet_service = GCESubnetService(self.provider)
+        self._router_service = GCERouterService(self.provider)
 
     @property
     def networks(self):
@@ -603,6 +605,10 @@ class GCENetworkingService(BaseNetworkingService):
     def subnets(self):
         return self._subnet_service
 
+    @property
+    def routers(self):
+        return self._router_service
+
 
 class GCENetworkService(BaseNetworkService):
 
@@ -723,26 +729,52 @@ class GCENetworkService(BaseNetworkService):
             cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
             return None
 
-    def routers(self, region=None):
-        if not region:
-            region = self.provider.region_name
+
+class GCERouterService(BaseRouterService):
+
+    def __init__(self, provider):
+        super(GCERouterService, self).__init__(provider)
+
+    def get(self, router_id):
         try:
-            routers = []
-            for router in helpers.iter_all(self.provider.gce_compute.routers(),
-                                           project=self.provider.project_name,
-                                           region=region):
-                routers.append(GCERouter(self.provider, router))
-            return routers
+            response = (self.provider
+                            .gce_compute
+                            .routers()
+                            .get(project=self.provider.project_name,
+                                 region=self.provider.region_name,
+                                 router=router_id)
+                            .execute())
+            return GCERouter(self.provider, response)
         except googleapiclient.errors.HttpError as http_error:
             cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
-            return []
+            return None
+
+    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
+                        .gce_compute
+                        .routers()
+                        .list(project=self.provider.project_name,
+                              region=region,
+                              maxResults=max_result,
+                              pageToken=marker)
+                        .execute())
+        routers = []
+        for router in response.get('items', []):
+            routers.append(GCERouter(self.provider, router))
+        if len(routers) > max_result:
+            cb.log.warning('Expected at most %d results; go %d',
+                           max_result, len(routers))
+        return ServerPagedResultList('nextPageToken' in response,
+                                     response.get('nextPageToken'),
+                                     False, data=routers)
 
-    def create_router(self, name=None, network=None, region=None):
+    def create(self, network, name=None):
         network_url = 'global/networks/default'
         if isinstance(network, GCENetwork):
             network_url = network.resource_url
-        if not region:
-            region = self.provider.region_name
+        region = self.provider.region_name
         try:
             response = (self.provider
                             .gce_compute
@@ -755,14 +787,33 @@ class GCENetworkService(BaseNetworkService):
             if 'error' in response:
                 return None
             self.provider.wait_for_operation(response, region=region)
-            routers = self.routers()
-            for router in routers:
-                if router.id == response['targetId']:
-                    return router
+            marker = None
+            while True:
+                routers = self.list(marker=marker)
+                for router in routers:
+                    if router.id == response['targetId']:
+                        return router
+                if routers.is_truncated:
+                    marker = routers.marker
+                else:
+                    cb.log.warning('Failed to create the router')
+                    return None
         except googleapiclient.errors.HttpError as http_error:
             cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
             return None
 
+    def delete(self, router):
+        region = self.provider.region_name
+        router_name = router.name if isinstance(router, GCERouter) else router
+        response = (self.provider
+                        .gce_compute
+                        .routers()
+                        .delete(project=self.provider.project_name,
+                                region=region,
+                                router=router_name)
+                        .execute())
+        self._provider.wait_for_operation(response, region=region)
+
 
 class GCESubnetService(BaseSubnetService):
 
@@ -857,7 +908,7 @@ class GCESubnetService(BaseSubnetService):
                         .subnetworks()
                         .delete(project=self.provider.project_name,
                                 region=subnet.region,
-                                router=subnet.name)
+                                subnetwork=subnet.name)
                         .execute())
         self._provider.wait_for_operation(response, region=subnet.region)