Merge pull request #736 from okomestudio/ts/botocore_update

Remove botocore version pinning
This commit is contained in:
Steve Pulec 2016-11-06 09:50:28 -05:00 committed by GitHub
commit 721d1b3a3f
7 changed files with 74 additions and 32 deletions

View File

@ -1,6 +1,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime
import json import json
import logging
import re import re
import pytz import pytz
@ -18,6 +19,9 @@ from moto.compat import OrderedDict
from moto.core.utils import camelcase_to_underscores, method_names_from_class from moto.core.utils import camelcase_to_underscores, method_names_from_class
log = logging.getLogger(__name__)
def _decode_dict(d): def _decode_dict(d):
decoded = {} decoded = {}
for key, value in d.items(): for key, value in d.items():
@ -550,11 +554,20 @@ def xml_to_json_response(service_spec, operation, xml, result_node=None):
od = OrderedDict() od = OrderedDict()
for k, v in value.items(): for k, v in value.items():
if k.startswith('@') or v is None: if k.startswith('@'):
continue
if k not in spec:
# this can happen when with an older version of
# botocore for which the node in XML template is not
# defined in service spec.
log.warning('Field %s is not defined by the botocore version in use', k)
continue continue
if spec[k]['type'] == 'list': if spec[k]['type'] == 'list':
if len(spec[k]['member']) == 1: if v is None:
od[k] = []
elif len(spec[k]['member']) == 1:
if isinstance(v['member'], list): if isinstance(v['member'], list):
od[k] = transform(v['member'], spec[k]['member']) od[k] = transform(v['member'], spec[k]['member'])
else: else:
@ -566,11 +579,22 @@ def xml_to_json_response(service_spec, operation, xml, result_node=None):
else: else:
raise ValueError('Malformatted input') raise ValueError('Malformatted input')
elif spec[k]['type'] == 'map': elif spec[k]['type'] == 'map':
key = from_str(v['entry']['key'], spec[k]['key']) if v is None:
val = from_str(v['entry']['value'], spec[k]['value']) od[k] = {}
od[k] = {key: val} else:
items = ([v['entry']] if not isinstance(v['entry'], list) else
v['entry'])
for item in items:
key = from_str(item['key'], spec[k]['key'])
val = from_str(item['value'], spec[k]['value'])
if k not in od:
od[k] = {}
od[k][key] = val
else: else:
od[k] = transform(v, spec[k]) if v is None:
od[k] = None
else:
od[k] = transform(v, spec[k])
return od return od
dic = xmltodict.parse(xml) dic = xmltodict.parse(xml)

View File

@ -26,12 +26,19 @@ class FakeBootstrapAction(object):
class FakeInstanceGroup(object): class FakeInstanceGroup(object):
def __init__(self, instance_count, instance_role, instance_type, market, name, def __init__(self, instance_count, instance_role, instance_type,
id=None, bid_price=None): market='ON_DEMAND', name=None, id=None, bid_price=None):
self.id = id or random_instance_group_id() self.id = id or random_instance_group_id()
self.bid_price = bid_price self.bid_price = bid_price
self.market = market self.market = market
if name is None:
if instance_role == 'MASTER':
name = 'master'
elif instance_role == 'CORE':
name = 'slave'
else:
name = 'Task instance group'
self.name = name self.name = name
self.num_instances = instance_count self.num_instances = instance_count
self.role = instance_role self.role = instance_role

View File

@ -5,21 +5,6 @@ sure==1.2.24
coverage coverage
freezegun freezegun
flask flask
# botocore 1.4.29 breaks the following tests: boto3>=1.3.1
# test_nat_gateway.test_delete_nat_gateway botocore>=1.4.28
# test `list -> create -> list -> get -> delete -> list` integration
# test_lambda.test_get_function
# test_lambda.test_delete_function
# test_lambda.test_create_function_from_zipfile
# test_lambda.test_create_function_from_aws_bucket
# test_apigateway.test_integrations
# test_apigateway.test_integration_response
# test_apigateway.test_deployment
# test_apigateway.test_create_resource
# test_apigateway.test_create_method_response
# test_apigateway.test_create_method
# test_apigateway.test_child_resource
# so we need to pin a boto3 and botocore revision pair that we know works
boto3==1.3.1
botocore==1.4.28
six six

View File

@ -79,6 +79,7 @@ def test_create_resource():
resourceId=root_id, resourceId=root_id,
) )
root_resource['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it root_resource['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
root_resource['ResponseMetadata'].pop('RetryAttempts', None)
root_resource.should.equal({ root_resource.should.equal({
'path': '/', 'path': '/',
'id': root_id, 'id': root_id,
@ -137,6 +138,7 @@ def test_child_resource():
resourceId=tags_id, resourceId=tags_id,
) )
child_resource['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it child_resource['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
child_resource['ResponseMetadata'].pop('RetryAttempts', None)
child_resource.should.equal({ child_resource.should.equal({
'path': '/users/tags', 'path': '/users/tags',
'pathPart': 'tags', 'pathPart': 'tags',
@ -173,6 +175,7 @@ def test_create_method():
) )
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'httpMethod': 'GET', 'httpMethod': 'GET',
'authorizationType': 'none', 'authorizationType': 'none',
@ -212,6 +215,7 @@ def test_create_method_response():
statusCode='200', statusCode='200',
) )
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'ResponseMetadata': {'HTTPStatusCode': 200}, 'ResponseMetadata': {'HTTPStatusCode': 200},
'statusCode': '200' 'statusCode': '200'
@ -224,6 +228,7 @@ def test_create_method_response():
statusCode='200', statusCode='200',
) )
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'ResponseMetadata': {'HTTPStatusCode': 200}, 'ResponseMetadata': {'HTTPStatusCode': 200},
'statusCode': '200' 'statusCode': '200'
@ -236,6 +241,7 @@ def test_create_method_response():
statusCode='200', statusCode='200',
) )
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({'ResponseMetadata': {'HTTPStatusCode': 200}}) response.should.equal({'ResponseMetadata': {'HTTPStatusCode': 200}})
@ -273,6 +279,7 @@ def test_integrations():
uri='http://httpbin.org/robots.txt', uri='http://httpbin.org/robots.txt',
) )
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'ResponseMetadata': {'HTTPStatusCode': 200}, 'ResponseMetadata': {'HTTPStatusCode': 200},
'httpMethod': 'GET', 'httpMethod': 'GET',
@ -294,6 +301,7 @@ def test_integrations():
httpMethod='GET' httpMethod='GET'
) )
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'ResponseMetadata': {'HTTPStatusCode': 200}, 'ResponseMetadata': {'HTTPStatusCode': 200},
'httpMethod': 'GET', 'httpMethod': 'GET',
@ -314,6 +322,7 @@ def test_integrations():
resourceId=root_id, resourceId=root_id,
) )
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response['resourceMethods']['GET']['methodIntegration'].should.equal({ response['resourceMethods']['GET']['methodIntegration'].should.equal({
'httpMethod': 'GET', 'httpMethod': 'GET',
'integrationResponses': { 'integrationResponses': {
@ -363,6 +372,7 @@ def test_integrations():
requestTemplates=templates requestTemplates=templates
) )
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response['ResponseMetadata'].should.equal({'HTTPStatusCode': 200}) response['ResponseMetadata'].should.equal({'HTTPStatusCode': 200})
response = client.get_integration( response = client.get_integration(
@ -416,6 +426,7 @@ def test_integration_response():
selectionPattern='foobar', selectionPattern='foobar',
) )
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'statusCode': '200', 'statusCode': '200',
'selectionPattern': 'foobar', 'selectionPattern': 'foobar',
@ -432,6 +443,7 @@ def test_integration_response():
statusCode='200', statusCode='200',
) )
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'statusCode': '200', 'statusCode': '200',
'selectionPattern': 'foobar', 'selectionPattern': 'foobar',
@ -447,6 +459,7 @@ def test_integration_response():
httpMethod='GET', httpMethod='GET',
) )
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response['methodIntegration']['integrationResponses'].should.equal({ response['methodIntegration']['integrationResponses'].should.equal({
'200': { '200': {
'responseTemplates': { 'responseTemplates': {
@ -495,6 +508,7 @@ def test_update_stage_configuration():
) )
response.pop('createdDate',None) # createdDate is hard to match against, remove it response.pop('createdDate',None) # createdDate is hard to match against, remove it
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'id': deployment_id, 'id': deployment_id,
'ResponseMetadata': {'HTTPStatusCode': 200}, 'ResponseMetadata': {'HTTPStatusCode': 200},
@ -658,6 +672,7 @@ def test_create_stage():
) )
response.pop('createdDate',None) # createdDate is hard to match against, remove it response.pop('createdDate',None) # createdDate is hard to match against, remove it
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'id': deployment_id, 'id': deployment_id,
'ResponseMetadata': {'HTTPStatusCode': 200}, 'ResponseMetadata': {'HTTPStatusCode': 200},
@ -677,6 +692,7 @@ def test_create_stage():
) )
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response['items'][0].pop('createdDate') response['items'][0].pop('createdDate')
response['items'][1].pop('createdDate') response['items'][1].pop('createdDate')
@ -688,6 +704,7 @@ def test_create_stage():
response = client.create_stage(restApiId=api_id,stageName=new_stage_name,deploymentId=deployment_id2) response = client.create_stage(restApiId=api_id,stageName=new_stage_name,deploymentId=deployment_id2)
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'stageName':new_stage_name, 'stageName':new_stage_name,
@ -712,6 +729,7 @@ def test_create_stage():
}) })
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'stageName':new_stage_name_with_vars, 'stageName':new_stage_name_with_vars,
@ -737,6 +755,7 @@ def test_create_stage():
}, cacheClusterEnabled=True,description="hello moto") }, cacheClusterEnabled=True,description="hello moto")
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'stageName':new_stage_name, 'stageName':new_stage_name,
@ -762,6 +781,7 @@ def test_create_stage():
}, cacheClusterEnabled=True,cacheClusterSize="1.6",description="hello moto") }, cacheClusterEnabled=True,cacheClusterSize="1.6",description="hello moto")
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'stageName':new_stage_name, 'stageName':new_stage_name,
@ -807,6 +827,7 @@ def test_deployment():
) )
response.pop('createdDate',None) # createdDate is hard to match against, remove it response.pop('createdDate',None) # createdDate is hard to match against, remove it
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'id': deployment_id, 'id': deployment_id,
'ResponseMetadata': {'HTTPStatusCode': 200}, 'ResponseMetadata': {'HTTPStatusCode': 200},

View File

@ -57,6 +57,7 @@ def test_delete_nat_gateway():
response = conn.delete_nat_gateway(NatGatewayId=nat_gateway_id) response = conn.delete_nat_gateway(NatGatewayId=nat_gateway_id)
response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it response['ResponseMetadata'].pop('HTTPHeaders', None) # this is hard to match against, so remove it
response['ResponseMetadata'].pop('RetryAttempts', None)
response.should.equal({ response.should.equal({
'NatGatewayId': nat_gateway_id, 'NatGatewayId': nat_gateway_id,
'ResponseMetadata': { 'ResponseMetadata': {

View File

@ -46,6 +46,8 @@ def test_describe_cluster():
'Configurations.member.1.Classification': 'yarn-site', 'Configurations.member.1.Classification': 'yarn-site',
'Configurations.member.1.Properties.entry.1.key': 'someproperty', 'Configurations.member.1.Properties.entry.1.key': 'someproperty',
'Configurations.member.1.Properties.entry.1.value': 'somevalue', 'Configurations.member.1.Properties.entry.1.value': 'somevalue',
'Configurations.member.1.Properties.entry.2.key': 'someotherproperty',
'Configurations.member.1.Properties.entry.2.value': 'someothervalue',
'Instances.EmrManagedMasterSecurityGroup': 'master-security-group', 'Instances.EmrManagedMasterSecurityGroup': 'master-security-group',
'Instances.Ec2SubnetId': 'subnet-8be41cec', 'Instances.Ec2SubnetId': 'subnet-8be41cec',
}, },

View File

@ -63,7 +63,8 @@ def test_describe_cluster():
args['Applications'] = [{'Name': 'Spark', 'Version': '2.4.2'}] args['Applications'] = [{'Name': 'Spark', 'Version': '2.4.2'}]
args['Configurations'] = [ args['Configurations'] = [
{'Classification': 'yarn-site', {'Classification': 'yarn-site',
'Properties': {'someproperty': 'somevalue'}}] 'Properties': {'someproperty': 'somevalue',
'someotherproperty': 'someothervalue'}}]
args['Instances']['AdditionalMasterSecurityGroups'] = ['additional-master'] args['Instances']['AdditionalMasterSecurityGroups'] = ['additional-master']
args['Instances']['AdditionalSlaveSecurityGroups'] = ['additional-slave'] args['Instances']['AdditionalSlaveSecurityGroups'] = ['additional-slave']
args['Instances']['Ec2KeyName'] = 'mykey' args['Instances']['Ec2KeyName'] = 'mykey'
@ -232,8 +233,8 @@ def test_describe_job_flow():
jf['LogUri'].should.equal(args['LogUri']) jf['LogUri'].should.equal(args['LogUri'])
jf['Name'].should.equal(args['Name']) jf['Name'].should.equal(args['Name'])
jf['ServiceRole'].should.equal(args['ServiceRole']) jf['ServiceRole'].should.equal(args['ServiceRole'])
jf.shouldnt.have.key('Steps') jf['Steps'].should.equal([])
jf.shouldnt.have.key('SupportedProducts') jf['SupportedProducts'].should.equal([])
jf['VisibleToAllUsers'].should.equal(True) jf['VisibleToAllUsers'].should.equal(True)
@ -320,7 +321,7 @@ def test_run_job_flow():
resp['LogUri'].should.equal(args['LogUri']) resp['LogUri'].should.equal(args['LogUri'])
resp['VisibleToAllUsers'].should.equal(args['VisibleToAllUsers']) resp['VisibleToAllUsers'].should.equal(args['VisibleToAllUsers'])
resp['Instances']['NormalizedInstanceHours'].should.equal(0) resp['Instances']['NormalizedInstanceHours'].should.equal(0)
resp.shouldnt.have.key('Steps') resp['Steps'].should.equal([])
@mock_emr @mock_emr
@ -445,10 +446,11 @@ def test_bootstrap_actions():
{'Name': 'bs1', {'Name': 'bs1',
'ScriptBootstrapAction': { 'ScriptBootstrapAction': {
'Args': ['arg1', 'arg2'], 'Args': ['arg1', 'arg2'],
'Path': 'path/to/script'}}, 'Path': 's3://path/to/script'}},
{'Name': 'bs2', {'Name': 'bs2',
'ScriptBootstrapAction': { 'ScriptBootstrapAction': {
'Path': 'path/to/anotherscript'}} 'Args': [],
'Path': 's3://path/to/anotherscript'}}
] ]
client = boto3.client('emr', region_name='us-east-1') client = boto3.client('emr', region_name='us-east-1')
@ -658,4 +660,4 @@ def test_tags():
client.remove_tags(ResourceId=cluster_id, TagKeys=[t['Key'] for t in input_tags]) client.remove_tags(ResourceId=cluster_id, TagKeys=[t['Key'] for t in input_tags])
resp = client.describe_cluster(ClusterId=cluster_id)['Cluster'] resp = client.describe_cluster(ClusterId=cluster_id)['Cluster']
resp.shouldnt.have.key('Tags') resp['Tags'].should.equal([])