Просмотр исходного кода

If zone is None in SubnetService.list, list all

Previous behaviour was that, if zone is not given, we list subnets in the
project default region. But, looking at the tests, it looks like the expected
behaviour is to list all subnets.
Ehsan Chiniforooshan 8 лет назад
Родитель
Сommit
b5ea5ee426

+ 4 - 3
cloudbridge/cloud/providers/gce/resources.py

@@ -1237,6 +1237,10 @@ class GCENetwork(BaseNetwork):
             return self._network['IPv4Range']
         return GCENetwork.DEFAULT_IPV4RANGE
 
+    @property
+    def subnets(self):
+        return self._provider.networking.subnets.list(network=self)
+
     def delete(self):
         try:
             response = (self._provider
@@ -1253,9 +1257,6 @@ class GCENetwork(BaseNetwork):
             return False
         return True
 
-    def subnets(self):
-        return self._provider.networking.subnets.list()
-
     def create_subnet(self, cidr_block, name=None, zone=None):
         return self._provider.networking.subnets.create(
             self, cidr_block, name, zone)

+ 25 - 30
cloudbridge/cloud/providers/gce/services.py

@@ -902,9 +902,28 @@ class GCESubnetService(BaseSubnetService):
         return None
 
     def list(self, network=None, zone=None, limit=None, marker=None):
-        region = zone.region_name if zone else self.provider.region_name
-        return ClientPagedResultList(self.provider,
-                                     self._list_all(network, region),
+        """
+        If the zone is not given, we list all subnetworks, in all regions.
+        """
+        filter = None
+        if network is not None:
+            filter = 'network eq %s' % network.resource_url
+        if zone:
+            regions = [zone.region_name]
+        else:
+            regions = [r.name for r in self.provider.compute.regions.list()]
+        subnets = []
+        for region in regions:
+            response = (self.provider
+                            .gce_compute
+                            .subnetworks()
+                            .list(project=self.provider.project_name,
+                                  region=region,
+                                  filter=filter)
+                            .execute())
+            for subnet in response.get('items', []):
+                subnets.append(GCESubnet(self.provider, subnet))
+        return ClientPagedResultList(self.provider, subnets,
                                      limit=limit, marker=marker)
 
     def create(self, network, cidr_block, name=None, zone=None):
@@ -917,7 +936,7 @@ class GCESubnetService(BaseSubnetService):
         instead of creating a new subnet. In this case, other parameters, i.e.
         the name and the zone, are ignored.
         """
-        subnets = self._list_all(network)
+        subnets = self.list(network)
         for subnet in subnets:
             if BaseNetwork.cidr_blocks_overlap(subnet.cidr_block, cidr_block):
                 return subnet
@@ -966,11 +985,12 @@ class GCESubnetService(BaseSubnetService):
         return None
 
     def delete(self, subnet):
+        region_url = self.provider.parse_url(subnet.region)
         response = (self.provider
                         .gce_compute
                         .subnetworks()
                         .delete(project=self.provider.project_name,
-                                region=subnet.region,
+                                region=region_url.parameters['region'],
                                 subnetwork=subnet.name)
                         .execute())
         self._provider.wait_for_operation(response, region=subnet.region)
@@ -985,31 +1005,6 @@ class GCESubnetService(BaseSubnetService):
                         return z.region_name
         return self.provider.region_name
 
-    def _list_all(self, network=None, region=None):
-        """
-        Similar to the list method, but if region is not given we list subnets
-        in all regions, not just the project default region.
-        """
-        filter = None
-        if network is not None:
-            filter = 'network eq %s' % network.resource_url
-        if region:
-            regions = [region]
-        else:
-            regions = [r.name for r in self.provider.compute.regions.list()]
-        subnets = []
-        for region in regions:
-            response = (self.provider
-                            .gce_compute
-                            .subnetworks()
-                            .list(project=self.provider.project_name,
-                                  region=region,
-                                  filter=filter)
-                            .execute())
-            for subnet in response.get('items', []):
-                subnets.append(GCESubnet(self.provider, subnet))
-        return subnets
-
 
 class GCPStorageService(BaseStorageService):