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

+ 37 - 28
cloudbridge/cloud/providers/gce/services.py

@@ -634,6 +634,13 @@ class GCENetworkService(BaseNetworkService):
                 return network
         return None
 
+    def find(self, name, limit=None, marker=None):
+        """
+        GCE networks are global. There is at most one network with a given
+        name.
+        """
+        return [self.get(name)]
+
     def get_by_name(self, network_name):
         if network_name is None:
             return None
@@ -743,18 +750,14 @@ class GCERouterService(BaseRouterService):
         super(GCERouterService, self).__init__(provider)
 
     def get(self, router_id):
-        try:
-            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 None
+        return self._get_in_region(router_id)
+
+    def find(self, name, limit=None, marker=None):
+        routers = []
+        for region in self.provider.compute.regions.list():
+            routers.append(self._get_in_region(name, region.name))
+        return ClientPagedResultList(self.provider, routers, limit=limit,
+                                     marker=marker)
 
     def list(self, limit=None, marker=None):
         region = self.provider.region_name
@@ -778,9 +781,10 @@ class GCERouterService(BaseRouterService):
                                      False, data=routers)
 
     def create(self, network, name=None):
-        network_url = 'global/networks/default'
-        if isinstance(network, GCENetwork):
-            network_url = network.resource_url
+        if not isinstance(network, GCENetwork):
+            network = self.provider.networking.networks.get(network)
+        network_url = network.resource_url
+        name = name if name else 'router-{0}'.format(uuid.uuid4())
         region = self.provider.region_name
         try:
             response = (self.provider
@@ -794,33 +798,38 @@ class GCERouterService(BaseRouterService):
             if 'error' in response:
                 return None
             self.provider.wait_for_operation(response, region=region)
-            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
+            return self._get_in_region(name, region)
         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
+        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)
+                                router=name)
                         .execute())
         self._provider.wait_for_operation(response, region=region)
 
+    def _get_in_region(self, router_id, region=None):
+        region = region if region else self.provider.region_name
+        try:
+            response = (self.provider
+                            .gce_compute
+                            .routers()
+                            .get(project=self.provider.project_name,
+                                 region=region,
+                                 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 None
+
 
 class GCEGatewayService(BaseGatewayService):
     _DEFAULT_GATEWAY_NAME = 'default-internet-gateway'