Przeglądaj źródła

Fixed remaining errors in networking tests for boto3

Nuwan Goonasekera 8 lat temu
rodzic
commit
0c628ff996

+ 5 - 5
cloudbridge/cloud/providers/aws/resources.py

@@ -1207,7 +1207,7 @@ class AWSFloatingIP(BaseFloatingIP):
         return True if self._ip.instance_id else False
 
     def delete(self):
-        return self._ip.delete()
+        return self._ip.release()
 
 
 class AWSRouter(BaseRouter):
@@ -1227,7 +1227,7 @@ class AWSRouter(BaseRouter):
 
         .. note:: the router must have a (case sensitive) tag ``Name``
         """
-        for tag in self._router.tags or []:
+        for tag in self._route_table.tags or []:
             if tag.get('Key') == 'Name':
                 return tag.get('Value')
         return None
@@ -1239,7 +1239,7 @@ class AWSRouter(BaseRouter):
         Set the router name.
         """
         self.assert_valid_resource_name(value)
-        self._router.create_tags(Tags=[{'Key': 'Name', 'Value': value}])
+        self._route_table.create_tags(Tags=[{'Key': 'Name', 'Value': value}])
 
     def refresh(self):
         try:
@@ -1277,13 +1277,13 @@ class AWSRouter(BaseRouter):
         gw_id = (gateway.id if isinstance(gateway, AWSInternetGateway)
                  else gateway)
         return self._provider.ec2_conn.meta.client.attach_internet_gateway(
-            InternetGatewayId=gw_id, VpcId=self.vpc_id)
+            InternetGatewayId=gw_id, VpcId=self._route_table.vpc_id)
 
     def detach_gateway(self, gateway):
         gw_id = (gateway.id if isinstance(gateway, AWSInternetGateway)
                  else gateway)
         return self._provider.ec2_conn.meta.client.detach_internet_gateway(
-            InternetGatewayId=gw_id, VpcId=self.vpc_id)
+            InternetGatewayId=gw_id, VpcId=self._route_table.vpc_id)
 
 
 class AWSInternetGateway(BaseInternetGateway):

+ 30 - 40
cloudbridge/cloud/providers/aws/services.py

@@ -1,6 +1,5 @@
 """Services implemented by the AWS provider."""
 import string
-import time
 
 from botocore.exceptions import ClientError
 
@@ -115,7 +114,7 @@ class EC2ServiceFilter(object):
                     'Name': filter_name,
                     'Values': [val]
                 }])
-            ]
+            ] if val else []
         except ClientError:
             objs = list()
         return ClientPagedResultList(self.provider, objs,
@@ -673,8 +672,10 @@ class AWSNetworkService(BaseNetworkService):
 
     def create_floating_ip(self):
         ip = self.provider.ec2_conn.meta.client.allocate_address(
-            Domain='vpc')['AllocationId']
-        return AWSFloatingIP(self.provider, ip)
+            Domain='vpc')
+        return AWSFloatingIP(
+            self.provider,
+            self.provider.ec2_conn.VpcAddress(ip.get('AllocationId')))
 
 
 class AWSSubnetService(BaseSubnetService):
@@ -712,21 +713,24 @@ class AWSSubnetService(BaseSubnetService):
         return res
 
     def get_or_create_default(self, zone=None):
-        filtr = {'availabilityZone': zone} if zone else None
-        sns = self.provider.vpc_conn.get_all_subnets(filters=filtr)
-        for sn in sns:
-            if sn.defaultForAz:
+        if zone:
+            snl = self.iface.find(zone, 'availabilityZone')
+        else:
+            snl = self.iface.service.limit(None)
+        for sn in snl:
+            if sn.default_for_az:
                 return AWSSubnet(self.provider, sn)
         # No provider-default Subnet exists, look for a library-default one
-        for sn in sns:
-            if sn.tags.get('Name') == AWSSubnet.CB_DEFAULT_SUBNET_NAME:
-                return AWSSubnet(self.provider, sn)
+        for sn in snl:
+            for tag in sn.tags or {}:
+                if (tag.get('Key') == 'Name' and
+                        tag.get('Value') == AWSSubnet.CB_DEFAULT_SUBNET_NAME):
+                    return AWSSubnet(self.provider, sn)
         # No provider-default Subnet exists, try to create it (net + subnets)
         default_net = self.provider.networking.networks.create(
             name=AWSNetwork.CB_DEFAULT_NETWORK_NAME, cidr_block='10.0.0.0/16')
         # Create a subnet in each of the region's zones
-        region = self.provider.compute.regions.get(
-            self.provider.vpc_conn.region.name)
+        region = self.provider.compute.regions.get(self.provider.region_name)
         default_sn = None
         for i, z in enumerate(region.zones):
             sn = self.create(AWSSubnet.CB_DEFAULT_SUBNET_NAME, default_net,
@@ -748,56 +752,42 @@ class AWSRouterService(BaseRouterService):
 
     def __init__(self, provider):
         super(AWSRouterService, self).__init__(provider)
+        self.iface = EC2ServiceFilter(self.provider, 'route_tables', AWSRouter)
 
     def get(self, router_id):
-        try:
-            routers = self.provider.vpc_conn.get_all_route_tables([router_id])
-            return AWSRouter(self.provider, routers[0]) if routers else None
-        except ClientError as ec2e:
-            if ec2e.code == 'InvalidRouteTableID.NotFound':
-                return None
-            elif ec2e.code == 'InvalidParameterValue':
-                # Occurs if id does not start with 'rtb-...'
-                return None
-            raise ec2e
+        return self.iface.get(router_id, 'route-table-id')
 
     def find(self, name, limit=None, marker=None):
-        filtr = {'tag:Name': name}
-        routers = self.provider.vpc_conn.get_all_route_tables(filters=filtr)
-        aws_routers = [AWSRouter(self.provider, r) for r in routers]
-        return ClientPagedResultList(self.provider, aws_routers, limit=limit,
-                                     marker=marker)
+        return self.iface.find(name, 'tag:Name', limit=limit, marker=marker)
 
     def list(self, limit=None, marker=None):
-        routers = self.provider.vpc_conn.get_all_route_tables()
-        aws_routers = [AWSRouter(self.provider, r) for r in routers]
-        return ClientPagedResultList(self.provider, aws_routers, limit=limit,
-                                     marker=marker)
+        return self.iface.list(limit=limit, marker=marker)
 
     def create(self, name, network):
         AWSRouter.assert_valid_resource_name(name)
 
         network_id = network.id if isinstance(network, AWSNetwork) else network
-        router = self.provider.vpc_conn.create_route_table(vpc_id=network_id)
-        cb_router = AWSRouter(self.provider, router)
+        res = self.iface.create('create_route_table', **{
+            k: v for k, v in {
+                'VpcId': network_id
+            }.items() if v is not None})
         if name:
-            time.sleep(2)  # Some time is required
-            cb_router.name = name
-        return cb_router
+            res.name = name
+        return res
 
 
 class AWSGatewayService(BaseGatewayService):
 
     def __init__(self, provider):
         super(AWSGatewayService, self).__init__(provider)
-        self.iface_igws = EC2ServiceFilter(self.provider,
-                                           'internet_gateways', AWSRouter)
+        self.iface_igws = EC2ServiceFilter(self.provider, 'internet_gateways',
+                                           AWSInternetGateway)
 
     def get_or_create_inet_gateway(self, name):
         AWSInternetGateway.assert_valid_resource_name(name)
 
         cb_gateway = self.iface_igws.create('create_internet_gateway')
-        self.iface_igws.wait_for_create(cb_gateway.id, 'internet-gateway-id')
+        # self.iface_igws.wait_for_create(cb_gateway.id, 'internet-gateway-id')
         cb_gateway.name = name
         return cb_gateway
 

+ 1 - 1
requirements.txt

@@ -1,2 +1,2 @@
-git+git://github.com/gvlproject/moto
+pydevd
 -e ".[dev]"

+ 1 - 1
setup.py

@@ -36,7 +36,7 @@ REQS_FULL = REQS_BASE + REQS_AWS + REQS_OPENSTACK
 # httpretty is required with/for moto 1.0.0 or AWS tests fail
 REQS_DEV = ([
     'tox>=2.1.1',
-    'moto>=1.0.0',
+    'moto>=1.1.7',
     'sphinx>=1.3.1',
     'flake8>=3.3.0',
     'flake8-import-order>=0.12'] + REQS_FULL

+ 4 - 4
test/test_compute_service.py

@@ -134,10 +134,10 @@ class CloudComputeServiceTestCase(ProviderTestBase):
                 itype.name, expected_type,
                 "Instance type {0} does not match expected type {1}".format(
                     itype.name, expected_type))
-            if isinstance(self.provider, TestMockHelperMixin):
-                raise self.skipTest(
-                    "Skipping rest of test because Moto is not returning the"
-                    " instance's placement zone correctly")
+#             if isinstance(self.provider, TestMockHelperMixin):
+#                 raise self.skipTest(
+#                     "Skipping rest of test because Moto is not returning the"
+#                     " instance's placement zone correctly")
             find_zone = [zone for zone in
                          self.provider.compute.regions.current.zones
                          if zone.id == test_instance.zone_id]