Răsfoiți Sursa

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 ani în urmă
părinte
comite
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):