From 9e9e057289f67aaef6691cc9b3b85934c98ab9cf Mon Sep 17 00:00:00 2001 From: Steve Pulec Date: Sun, 10 Mar 2013 16:55:34 -0400 Subject: [PATCH] Mock out instance metadata. Make basic connection with iam roles work. Closes #3. --- moto/core/models.py | 8 ++++++++ moto/core/responses.py | 27 +++++++++++++++++++++++++ tests/test_core/test_decorator_calls.py | 5 +++++ 3 files changed, 40 insertions(+) diff --git a/moto/core/models.py b/moto/core/models.py index 606ff8117..e98c1eed3 100644 --- a/moto/core/models.py +++ b/moto/core/models.py @@ -2,6 +2,7 @@ import functools import re from moto.packages.httpretty import HTTPretty +from .responses import metadata_response from .utils import convert_regex_to_flask_path @@ -30,6 +31,13 @@ class MockAWS(object): body=value, ) + # Mock out localhost instance metadata + HTTPretty.register_uri( + method=method, + uri=re.compile('http://169.254.169.254/latest/meta-data/.*'), + body=metadata_response + ) + def stop(self): HTTPretty.disable() diff --git a/moto/core/responses.py b/moto/core/responses.py index 63d051d0c..83699aa13 100644 --- a/moto/core/responses.py +++ b/moto/core/responses.py @@ -1,3 +1,6 @@ +import datetime +import json + from urlparse import parse_qs from moto.core.utils import headers_to_dict, camelcase_to_underscores, method_names_from_class @@ -24,3 +27,27 @@ class BaseResponse(object): method = getattr(self, action) return method() raise NotImplementedError("The {} action has not been implemented".format(action)) + + +def metadata_response(uri, body, headers): + """ + Mock response for localhost metadata + + http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html + """ + + tomorrow = datetime.datetime.now() + datetime.timedelta(days=1) + path = uri.path.lstrip("/latest/meta-data/") + if path == '': + return "iam/" + elif path == 'iam/': + return 'security-credentials/' + elif path == 'iam/security-credentials/': + return 'default-role' + elif path == 'iam/security-credentials/default-role': + return json.dumps(dict( + AccessKeyId="test-key", + SecretAccessKey="test-secret-key", + Token="test-session-token", + Expiration=tomorrow.strftime("%Y-%m-%dT%H:%M:%SZ") + )) diff --git a/tests/test_core/test_decorator_calls.py b/tests/test_core/test_decorator_calls.py index 5bf78b45c..bdf1d8a86 100644 --- a/tests/test_core/test_decorator_calls.py +++ b/tests/test_core/test_decorator_calls.py @@ -9,6 +9,11 @@ Test the different ways that the decorator can be used ''' +@mock_ec2 +def test_basic_connect(): + conn = boto.connect_ec2() + + @mock_ec2 def test_basic_decorator(): conn = boto.connect_ec2('the_key', 'the_secret')