Explorar o código

Get or create a default network

Enis Afgan %!s(int64=9) %!d(string=hai) anos
pai
achega
39670be4c1

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

@@ -514,12 +514,14 @@ class NetworkService(PageableObjectMixin, CloudService):
         pass
         pass
 
 
     @abstractmethod
     @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
         A default network is one marked as such by the provider or matches the
         default network name used by this library (e.g., CloudBridgeNet).
         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`
         :rtype: ``object`` of :class:`.Network`
         :return: a Network object
         :return: a Network object

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

@@ -540,32 +540,10 @@ class AWSInstanceService(BaseInstanceService):
             :rtype: ``str``
             :rtype: ``str``
             :return: Default VPC ID.
             :return: Default VPC ID.
             """
             """
-            default_vpc = None
             for vpc in vpcs:
             for vpc in vpcs:
                 if vpc.is_default:
                 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):
         def _get_potential_subnets(filters, exc):
             """
             """
@@ -878,19 +856,30 @@ class AWSNetworkService(BaseNetworkService):
             return AWSNetwork(self.provider, network[0])
             return AWSNetwork(self.provider, network[0])
         return None
         return None
 
 
-    def get_default(self):
+    def get_or_create_default(self):
         default_vpc = None
         default_vpc = None
         vpcs = self.provider.vpc_conn.get_all_vpcs()
         vpcs = self.provider.vpc_conn.get_all_vpcs()
         for vpc in vpcs:
         for vpc in vpcs:
             if vpc.is_default:
             if vpc.is_default:
-                default_vpc = AWSNetwork(self.provider, vpc)
-                break
+                return AWSNetwork(self.provider, vpc)
         if not default_vpc:
         if not default_vpc:
             for vpc in vpcs:
             for vpc in vpcs:
                 if vpc.tags.get('Name', '') == \
                 if vpc.tags.get('Name', '') == \
                    AWSNetwork.CB_DEFAULT_NETWORK_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
         return default_vpc
 
 
     def list(self, limit=None, marker=None):
     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)
         network = (n for n in self.list() if n.id == network_id)
         return next(network, None)
         return next(network, None)
 
 
-    def get_default(self):
+    def get_or_create_default(self):
         for net in self.list():
         for net in self.list():
             if net.name == OpenStackNetwork.CB_DEFAULT_NETWORK_NAME:
             if net.name == OpenStackNetwork.CB_DEFAULT_NETWORK_NAME:
                 return net
                 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):
     def list(self, limit=None, marker=None):
         networks = [OpenStackNetwork(self.provider, network)
         networks = [OpenStackNetwork(self.provider, network)