almahmoud 7 лет назад
Родитель
Сommit
7d29fb89e7
2 измененных файлов с 46 добавлено и 28 удалено
  1. 28 20
      cloudbridge/cloud/providers/aws/services.py
  2. 18 8
      cloudbridge/cloud/providers/openstack/services.py

+ 28 - 20
cloudbridge/cloud/providers/aws/services.py

@@ -771,40 +771,48 @@ class AWSSubnetService(BaseSubnetService):
         return subnet
         return subnet
 
 
     def get_or_create_default(self, zone):
     def get_or_create_default(self, zone):
-        zone_name = zone.name if isinstance(
-            zone, AWSPlacementZone) else zone
-        snl = self.svc.find('availabilityZone', zone_name)
-        # Find first available default subnet by sorted order
-        # of availability zone. Prefer zone us-east-1a over 1e,
-        # because newer zones tend to have less compatibility
-        # with different instance types (e.g. c5.large not available
-        # on us-east-1e as of 14 Dec. 2017).
-        # pylint:disable=protected-access
-        snl.sort(key=lambda sn: sn._subnet.availability_zone)
+        if zone:
+            zone_name = zone.name if isinstance(
+                zone, AWSPlacementZone) else zone
+            snl = self.svc.find('availabilityZone', zone_name)
+
+        else:
+            snl = self.svc.list()
+            # Find first available default subnet by sorted order
+            # of availability zone. Prefer zone us-east-1a over 1e,
+            # because newer zones tend to have less compatibility
+            # with different instance types (e.g. c5.large not available
+            # on us-east-1e as of 14 Dec. 2017).
+            # pylint:disable=protected-access
+            snl.sort(key=lambda sn: sn._subnet.availability_zone)
+
         for sn in snl:
         for sn in snl:
             # pylint:disable=protected-access
             # pylint:disable=protected-access
             if sn._subnet.default_for_az:
             if sn._subnet.default_for_az:
                 return sn
                 return sn
 
 
-        # Refresh the list for the default label
-        snl = self.find(label=AWSSubnet.CB_DEFAULT_SUBNET_LABEL)
+        # If no provider-default subnet has been found, look for
+        # cloudbridge-default by label. We suffix labels by availability zone,
+        # thus we add the wildcard for the regular expression to find the
+        # subnet
+        snl = self.find(label=AWSSubnet.CB_DEFAULT_SUBNET_LABEL + "*")
 
 
         if len(snl) > 0:
         if len(snl) > 0:
+            snl.sort(key=lambda sn: sn._subnet.availability_zone)
             return snl[0]
             return snl[0]
 
 
-        """
-        No provider-default Subnet exists, try to create a CloudBridge-specific
-        network. This involves creating the network, subnets, internet gateway,
-        and connecting it all together so that the network has Internet
-        connectivity.
-        """
+        # No default Subnet exists, try to create a CloudBridge-specific
+        # subnet. This involves creating the network, subnets, internet
+        # gateway, and connecting it all together so that the network has
+        # Internet connectivity.
+
         # Check if a default net already exists
         # Check if a default net already exists
         default_nets = self.provider.networking.networks.find(
         default_nets = self.provider.networking.networks.find(
             label=AWSNetwork.CB_DEFAULT_NETWORK_LABEL)
             label=AWSNetwork.CB_DEFAULT_NETWORK_LABEL)
         if len(default_nets) > 0:
         if len(default_nets) > 0:
             default_net = default_nets[0]
             default_net = default_nets[0]
             for sn in default_net.subnets:
             for sn in default_net.subnets:
-                if zone and zone == sn.zone.name:
+                if zone and zone_name == sn.zone.name:
                     return sn
                     return sn
             if len(default_net.subnets) == 0:
             if len(default_net.subnets) == 0:
                 pass  # No subnets exist within the default net so continue
                 pass  # No subnets exist within the default net so continue
@@ -848,7 +856,7 @@ class AWSSubnetService(BaseSubnetService):
             # Create a route table entry between the SN and the inet gateway
             # Create a route table entry between the SN and the inet gateway
             # See note above about why this is commented
             # See note above about why this is commented
             # default_router.attach_subnet(sn)
             # default_router.attach_subnet(sn)
-            if zone and zone == z.name:
+            if zone and zone_name == z.name:
                 default_sn = sn
                 default_sn = sn
         # No specific zone was supplied; return the last created subnet
         # No specific zone was supplied; return the last created subnet
         if not default_sn:
         if not default_sn:

+ 18 - 8
cloudbridge/cloud/providers/openstack/services.py

@@ -876,18 +876,28 @@ class OpenStackSubnetService(BaseSubnetService):
             sn = self.find(label=OpenStackSubnet.CB_DEFAULT_SUBNET_LABEL)
             sn = self.find(label=OpenStackSubnet.CB_DEFAULT_SUBNET_LABEL)
             if sn:
             if sn:
                 return sn[0]
                 return sn[0]
-            # No default; create one
-            net = self.provider.networking.networks.create(
-                label=OpenStackNetwork.CB_DEFAULT_NETWORK_LABEL,
-                cidr_block='10.0.0.0/16')
+            # No default subnet look for default network
+            networks = self.provider.networking.networks.find(
+                label=OpenStackNetwork.CB_DEFAULT_NETWORK_LABEL)
+            if networks:
+                net = networks[0]
+            else:
+                net = self.provider.networking.networks.create(
+                    label=OpenStackNetwork.CB_DEFAULT_NETWORK_LABEL,
+                    cidr_block='10.0.0.0/16')
             sn = net.create_subnet(
             sn = net.create_subnet(
                 label=OpenStackSubnet.CB_DEFAULT_SUBNET_LABEL,
                 label=OpenStackSubnet.CB_DEFAULT_SUBNET_LABEL,
                 cidr_block='10.0.0.0/24')
                 cidr_block='10.0.0.0/24')
-            router = self.provider.networking.routers.create(
-                network=net, label=OpenStackRouter.CB_DEFAULT_ROUTER_LABEL)
+            routers = self.provider.networking.routers.find(
+                label=OpenStackRouter.CB_DEFAULT_ROUTER_LABEL)
+            if routers:
+                router = routers[0]
+            else:
+                router = self.provider.networking.routers.create(
+                    network=net, label=OpenStackRouter.CB_DEFAULT_ROUTER_LABEL)
             router.attach_subnet(sn)
             router.attach_subnet(sn)
-            gteway = net.gateways.get_or_create_inet_gateway()
-            router.attach_gateway(gteway)
+            gateway = net.gateways.get_or_create_inet_gateway()
+            router.attach_gateway(gateway)
             return sn
             return sn
         except NeutronClientException:
         except NeutronClientException:
             return None
             return None