Przeglądaj źródła

Get or create a default network

Enis Afgan 9 lat temu
rodzic
commit
39670be4c1

+ 4 - 2
cloudbridge/cloud/interfaces/services.py

@@ -514,12 +514,14 @@ class NetworkService(PageableObjectMixin, CloudService):
         pass
 
     @abstractmethod
-    def get_default(self):
+    def get_or_create_default(self):
         """
-        Return a default network for the account or ``None`` if not found.
+        Return a default network for the account or create one if not found.
 
         A default network is one marked as such by the provider or matches the
         default network name used by this library (e.g., CloudBridgeNet).
+        In addition to creating a subnet, this will create subnet(s) within
+        the network.
 
         :rtype: ``object`` of :class:`.Network`
         :return: a Network object

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

@@ -540,32 +540,10 @@ class AWSInstanceService(BaseInstanceService):
             :rtype: ``str``
             :return: Default VPC ID.
             """
-            default_vpc = None
             for vpc in vpcs:
                 if vpc.is_default:
-                    default_vpc = vpc.id
-                    break
-            if not default_vpc:
-                for vpc in self.provider.vpc_conn.get_all_vpcs():
-                    if vpc.tags.get('Name', '') == \
-                       AWSNetwork.CB_DEFAULT_NETWORK_NAME:
-                        default_vpc = vpc.id
-                        break
-            if not default_vpc:
-                net = self.provider.network.create(
-                    name=AWSNetwork.CB_DEFAULT_NETWORK_NAME)
-                default_vpc = net.id
-                # Create a subnet in each of the region's zones
-                # Otherwise, a CloudBridge-default network will exist but
-                # possibly not work in future requests when the zone for the
-                # only existing subnet and a target launch zone don't match.
-                region = self.provider.compute.regions.get(
-                    self.provider.vpc_conn.DefaultRegionName)
-                for i, zone in enumerate(region.zones):
-                    self.provider.vpc_conn.create_subnet(
-                        net.id, '10.0.{0}.0/24'.format(i),
-                        availability_zone=zone.name)
-            return default_vpc
+                    return vpc.id
+            return self.provider.network.get_or_create_default().id
 
         def _get_potential_subnets(filters, exc):
             """
@@ -878,19 +856,30 @@ class AWSNetworkService(BaseNetworkService):
             return AWSNetwork(self.provider, network[0])
         return None
 
-    def get_default(self):
+    def get_or_create_default(self):
         default_vpc = None
         vpcs = self.provider.vpc_conn.get_all_vpcs()
         for vpc in vpcs:
             if vpc.is_default:
-                default_vpc = AWSNetwork(self.provider, vpc)
-                break
+                return AWSNetwork(self.provider, vpc)
         if not default_vpc:
             for vpc in vpcs:
                 if vpc.tags.get('Name', '') == \
                    AWSNetwork.CB_DEFAULT_NETWORK_NAME:
-                    default_vpc = AWSNetwork(self.provider, vpc)
-                    break
+                    return AWSNetwork(self.provider, vpc)
+        # No default network exists; create one.
+        default_vpc = self.provider.network.create(
+            name=AWSNetwork.CB_DEFAULT_NETWORK_NAME)
+        # Create a subnet in each of the region's zones
+        # Otherwise, a CloudBridge-default network will exist but
+        # possibly not work in future requests when the zone for the
+        # only existing subnet and a target launch zone don't match.
+        region = self.provider.compute.regions.get(
+            self.provider.vpc_conn.DefaultRegionName)
+        for i, zone in enumerate(region.zones):
+            self.provider.vpc_conn.create_subnet(
+                default_vpc.id, '10.0.{0}.0/24'.format(i),
+                availability_zone=zone.name)
         return default_vpc
 
     def list(self, limit=None, marker=None):

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

@@ -738,11 +738,15 @@ class OpenStackNetworkService(BaseNetworkService):
         network = (n for n in self.list() if n.id == network_id)
         return next(network, None)
 
-    def get_default(self):
+    def get_or_create_default(self):
         for net in self.list():
             if net.name == OpenStackNetwork.CB_DEFAULT_NETWORK_NAME:
                 return net
-        return None
+        net = self.create(OpenStackNetwork.CB_DEFAULT_NETWORK_NAME)
+        net.create_subnet(
+            cidr_block='10.0.0.0/24',
+            name="{0}Subnet".format(OpenStackNetwork.CB_DEFAULT_NETWORK_NAME))
+        return net
 
     def list(self, limit=None, marker=None):
         networks = [OpenStackNetwork(self.provider, network)