diff --git a/file.tmp b/file.tmp
deleted file mode 100644
index 80053c647..000000000
--- a/file.tmp
+++ /dev/null
@@ -1,9 +0,0 @@
-
- AWSTemplateFormatVersion: '2010-09-09'
- Description: Simple CloudFormation Test Template
- Resources:
- S3Bucket:
- Type: AWS::S3::Bucket
- Properties:
- AccessControl: PublicRead
- BucketName: cf-test-bucket-1
diff --git a/moto/iam/models.py b/moto/iam/models.py
index 86a5d7a32..a5f40b996 100644
--- a/moto/iam/models.py
+++ b/moto/iam/models.py
@@ -51,8 +51,8 @@ class Policy(BaseModel):
self.default_version_id = default_version_id or 'v1'
self.versions = [PolicyVersion(self.arn, document, True)]
- self.create_datetime = datetime.now(pytz.utc)
- self.update_datetime = datetime.now(pytz.utc)
+ self.create_datetime = datetime.strftime(datetime.utcnow(), "%Y-%m-%dT%H:%M:%SZ")
+ self.update_datetime = datetime.strftime(datetime.utcnow(), "%Y-%m-%dT%H:%M:%SZ")
class SAMLProvider(BaseModel):
@@ -76,7 +76,7 @@ class PolicyVersion(object):
self.is_default = is_default
self.version_id = 'v1'
- self.create_datetime = datetime.now(pytz.utc)
+ self.create_datetime = datetime.strftime(datetime.utcnow(), "%Y-%m-%dT%H:%M:%SZ")
class ManagedPolicy(Policy):
@@ -132,8 +132,9 @@ class Role(BaseModel):
self.path = path or '/'
self.policies = {}
self.managed_policies = {}
- self.create_date = datetime.now(pytz.utc)
+ self.create_date = datetime.strftime(datetime.utcnow(), "%Y-%m-%dT%H:%M:%SZ")
self.tags = {}
+ self.description = ""
@classmethod
def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
@@ -473,6 +474,10 @@ class IAMBackend(BaseBackend):
policy = arns[policy_arn]
policy.attach_to(self.get_role(role_name))
+ def update_role_description(self, role_name, role_description):
+ role = self.get_role(role_name)
+ role.description = role_description
+
def detach_role_policy(self, policy_arn, role_name):
arns = dict((p.arn, p) for p in self.managed_policies.values())
try:
diff --git a/moto/iam/responses.py b/moto/iam/responses.py
index e3cc4b90b..e624c18c3 100644
--- a/moto/iam/responses.py
+++ b/moto/iam/responses.py
@@ -107,6 +107,10 @@ class IamResponse(BaseResponse):
template = self.response_template(LIST_POLICIES_TEMPLATE)
return template.render(policies=policies, marker=marker)
+ def list_entities_for_policy(self):
+ template = self.response_template(LIST_ENTITIES_FOR_POLICY_TEMPLATE)
+ return template.render()
+
def create_role(self):
role_name = self._get_param('RoleName')
path = self._get_param('Path')
@@ -169,6 +173,20 @@ class IamResponse(BaseResponse):
template = self.response_template(GENERIC_EMPTY_TEMPLATE)
return template.render(name="UpdateAssumeRolePolicyResponse")
+ def update_role_description(self):
+ role_name = self._get_param('RoleName')
+ description = self._get_param('Description')
+ role = iam_backend.update_role_description(role_name,description)
+ template = self.response_template(UPDATE_ROLE_DESCRIPTION_TEMPLATE)
+ return template.render(role=role)
+
+ def update_role(self):
+ role_name = self._get_param('RoleName')
+ description = self._get_param('Description')
+ role = iam_backend.update_role_description(role_name,description)
+ template = self.response_template(UPDATE_ROLE_DESCRIPTION_TEMPLATE)
+ return template.render(role=role)
+
def create_policy_version(self):
policy_arn = self._get_param('PolicyArn')
policy_document = self._get_param('PolicyDocument')
@@ -654,6 +672,33 @@ class IamResponse(BaseResponse):
template = self.response_template(UNTAG_ROLE_TEMPLATE)
return template.render()
+LIST_ENTITIES_FOR_POLICY_TEMPLATE = """
+
+
+
+ DevRole
+
+
+
+
+ Dev
+
+
+ false
+
+
+ Alice
+
+
+ Bob
+
+
+
+
+ eb358e22-9d1f-11e4-93eb-190ecEXAMPLE
+
+"""
+
ATTACH_ROLE_POLICY_TEMPLATE = """
@@ -696,12 +741,12 @@ CREATE_POLICY_TEMPLATE = """
{{ policy.arn }}
{{ policy.attachment_count }}
- {{ policy.create_datetime.isoformat() }}
+ {{ policy.create_datetime }}
{{ policy.default_version_id }}
{{ policy.path }}
{{ policy.id }}
{{ policy.name }}
- {{ policy.update_datetime.isoformat() }}
+ {{ policy.update_datetime }}
@@ -719,8 +764,8 @@ GET_POLICY_TEMPLATE = """
{{ policy.path }}
{{ policy.arn }}
{{ policy.attachment_count }}
- {{ policy.create_datetime.isoformat() }}
- {{ policy.update_datetime.isoformat() }}
+ {{ policy.create_datetime }}
+ {{ policy.update_datetime }}
@@ -898,6 +943,32 @@ GET_ROLE_POLICY_TEMPLATE = """
+
+
+ {{ role.path }}
+ {{ role.arn }}
+ {{ role.name }}
+ {{ role.assume_role_policy_document }}
+ {{ role.create_date }}
+ {{ role.id }}
+ {% if role.tags %}
+
+ {% for tag in role.get_tags() %}
+
+ {{ tag['Key'] }}
+ {{ tag['Value'] }}
+
+ {% endfor %}
+
+ {% endif %}
+
+
+
+ df37e965-9967-11e1-a4c3-270EXAMPLE04
+
+"""
+
GET_ROLE_TEMPLATE = """
diff --git a/moto/packages/httpretty/core.py b/moto/packages/httpretty/core.py
index 168f18431..4eb92108f 100644
--- a/moto/packages/httpretty/core.py
+++ b/moto/packages/httpretty/core.py
@@ -72,19 +72,6 @@ from datetime import datetime
from datetime import timedelta
from errno import EAGAIN
-import logging
-from inspect import currentframe
-import inspect
-
-logging.basicConfig(filename='/tmp/models.log',level=logging.DEBUG)
-
-DEBUG=0
-
-def get_linenumber():
- cf = currentframe()
- return " - "+str(cf.f_back.f_lineno)
-
-
# Some versions of python internally shadowed the
# SocketType variable incorrectly https://bugs.python.org/issue20386
BAD_SOCKET_SHADOW = socket.socket != socket.SocketType
@@ -168,34 +155,15 @@ class HTTPrettyRequest(BaseHTTPRequestHandler, BaseClass):
"""
def __init__(self, headers, body=''):
-
- if DEBUG:
- logging.debug('__init__ - '
- ' -caller: ' + str(
- inspect.stack()[1][3]) + "-" + get_linenumber())
- logging.debug('headers: '+str(headers))
-
# first of all, lets make sure that if headers or body are
# unicode strings, it must be converted into a utf-8 encoded
# byte string
self.raw_headers = utf8(headers.strip())
-
- if DEBUG:
- logging.debug('raw_headers: '+str(self.raw_headers))
-
self.body = utf8(body)
- if DEBUG:
- logging.debug('body: '+str(self.body))
-
# Now let's concatenate the headers with the body, and create
# `rfile` based on it
self.rfile = StringIO(b'\r\n\r\n'.join([self.raw_headers, self.body]))
-
- if DEBUG:
- logging.debug('rfile: '+str(self.rfile))
-
-
self.wfile = StringIO() # Creating `wfile` as an empty
# StringIO, just to avoid any real
# I/O calls
@@ -203,10 +171,6 @@ class HTTPrettyRequest(BaseHTTPRequestHandler, BaseClass):
# parsing the request line preemptively
self.raw_requestline = self.rfile.readline()
- if DEBUG:
- logging.debug('raw_requestline: '+str(self.raw_requestline))
-
-
# initiating the error attributes with None
self.error_code = None
self.error_message = None
@@ -218,9 +182,6 @@ class HTTPrettyRequest(BaseHTTPRequestHandler, BaseClass):
# making the HTTP method string available as the command
self.method = self.command
- if DEBUG:
- logging.debug('method: '+str(self.method))
-
# Now 2 convenient attributes for the HTTPretty API:
# `querystring` holds a dictionary with the parsed query string
@@ -246,23 +207,8 @@ class HTTPrettyRequest(BaseHTTPRequestHandler, BaseClass):
)
def parse_querystring(self, qs):
-
- if DEBUG:
- logging.debug('parse_querystring - '
- ' -caller: ' + str(
- inspect.stack()[1][3]) + "-" + get_linenumber())
- logging.debug('qs: '+str(qs))
-
expanded = unquote_utf8(qs)
-
- if DEBUG:
- logging.debug('expanded: '+str(expanded))
-
parsed = parse_qs(expanded)
-
- if DEBUG:
- logging.debug('parsed: '+str(parsed))
-
result = {}
for k in parsed:
result[k] = list(map(decode_utf8, parsed[k]))
@@ -272,12 +218,6 @@ class HTTPrettyRequest(BaseHTTPRequestHandler, BaseClass):
def parse_request_body(self, body):
""" Attempt to parse the post based on the content-type passed. Return the regular body if not """
- if DEBUG:
- logging.debug('parse_request_body - '
- ' -caller: ' + str(
- inspect.stack()[1][3]) + "-" + get_linenumber())
- logging.debug('body: '+str(body))
-
PARSING_FUNCTIONS = {
'application/json': json.loads,
'text/json': json.loads,
@@ -1173,4 +1113,4 @@ def httprettified(test):
if isinstance(test, ClassTypes):
return decorate_class(test)
- return decorate_callable(test)
+ return decorate_callable(test)
\ No newline at end of file
diff --git a/moto/packages/httpretty/http.py b/moto/packages/httpretty/http.py
index 17d580f5f..ee1625905 100644
--- a/moto/packages/httpretty/http.py
+++ b/moto/packages/httpretty/http.py
@@ -133,7 +133,6 @@ def parse_requestline(s):
...
ValueError: Not a Request-Line
"""
-
methods = '|'.join(HttpBaseClass.METHODS)
m = re.match(r'(' + methods + ')\s+(.*)\s+HTTP/(1.[0|1])', s, re.I)
if m:
@@ -146,7 +145,6 @@ def last_requestline(sent_data):
"""
Find the last line in sent_data that can be parsed with parse_requestline
"""
-
for line in reversed(sent_data):
try:
parse_requestline(decode_utf8(line))
diff --git a/tests/test_awslambda/test_lambda.py b/tests/test_awslambda/test_lambda.py
index c05f9f0ac..71f6746a9 100644
--- a/tests/test_awslambda/test_lambda.py
+++ b/tests/test_awslambda/test_lambda.py
@@ -821,7 +821,6 @@ def get_function_policy():
assert res['Statement'][0]['Action'] == 'lambda:InvokeFunction'
-
@mock_lambda
@mock_s3
def test_list_versions_by_function():
@@ -854,7 +853,6 @@ def test_list_versions_by_function():
assert versions['Versions'][0]['FunctionArn'] == 'arn:aws:lambda:us-west-2:123456789012:function:testFunction:$LATEST'
-
@mock_lambda
@mock_s3
def test_create_function_with_already_exists():
diff --git a/tests/test_kms/test_kms.py b/tests/test_kms/test_kms.py
index 520c7262c..0f7bab4cd 100644
--- a/tests/test_kms/test_kms.py
+++ b/tests/test_kms/test_kms.py
@@ -1,6 +1,5 @@
from __future__ import unicode_literals
import os, re
-
import boto3
import boto.kms
from boto.exception import JSONResponseError