awscli2/python312.patch
ccowman 20258e0b59 Revise patches and update to 2.22.9
Update to 2.22.9 and revise patches to reflect code changes

Remove patch hunks that fixed whitespace errors which are no
longer present in release

Remove patch hunk which stops the initialization of io.BufferedIOBase
with arbitrary binary data. The latest code post adding support
for python 3.12 instantiates a BufferedStream class which
requires initialization

Stop applying assertions.patch to fix EKS test suite. This test suite
is no longer broken: https://github.com/aws/aws-cli/pull/8917

Resolves: RHEL-66152

Signed-off-by: ccowman <ccowman@redhat.com>
2024-12-23 10:54:01 +00:00

895 lines
40 KiB
Diff

diff --git a/awscli/botocore/auth.py b/awscli/botocore/auth.py
index 0c1bc74a..de33e127 100644
--- a/awscli/botocore/auth.py
+++ b/awscli/botocore/auth.py
@@ -395,7 +395,7 @@ class SigV4Auth(BaseSigner):
def add_auth(self, request):
if self.credentials is None:
raise NoCredentialsError()
- datetime_now = datetime.datetime.utcnow()
+ datetime_now = datetime.datetime.now(datetime.timezone.utc)
request.context['timestamp'] = datetime_now.strftime(SIGV4_TIMESTAMP)
# This could be a retry. Make sure the previous
# authorization header is removed first.
@@ -439,7 +439,7 @@ class SigV4Auth(BaseSigner):
if 'Date' in request.headers:
del request.headers['Date']
datetime_timestamp = datetime.datetime.strptime(
- request.context['timestamp'], SIGV4_TIMESTAMP)
+ request.context['timestamp'], SIGV4_TIMESTAMP[:-1] + '%z')
request.headers['Date'] = formatdate(
int(calendar.timegm(datetime_timestamp.timetuple())))
if 'X-Amz-Date' in request.headers:
@@ -527,7 +527,7 @@ class S3ExpressPostAuth(S3ExpressAuth):
REQUIRES_IDENTITY_CACHE = True
def add_auth(self, request):
- datetime_now = datetime.datetime.utcnow()
+ datetime_now = datetime.datetime.now(datetime.timezone.utc)
request.context['timestamp'] = datetime_now.strftime(SIGV4_TIMESTAMP)
fields = {}
@@ -780,7 +780,7 @@ class S3SigV4PostAuth(SigV4Auth):
http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-UsingHTTPPOST.html
"""
def add_auth(self, request):
- datetime_now = datetime.datetime.utcnow()
+ datetime_now = datetime.datetime.now(datetime.timezone.utc)
request.context['timestamp'] = datetime_now.strftime(SIGV4_TIMESTAMP)
fields = {}
diff --git a/awscli/botocore/crt/auth.py b/awscli/botocore/crt/auth.py
index 534a7f8d..5046b35b 100644
--- a/awscli/botocore/crt/auth.py
+++ b/awscli/botocore/crt/auth.py
@@ -55,10 +55,7 @@ class CrtSigV4Auth(BaseSigner):
if self.credentials is None:
raise NoCredentialsError()
- # Use utcnow() because that's what gets mocked by tests, but set
- # timezone because CRT assumes naive datetime is local time.
- datetime_now = datetime.datetime.utcnow().replace(
- tzinfo=datetime.timezone.utc)
+ datetime_now = datetime.datetime.now(datetime.timezone.utc)
# Use existing 'X-Amz-Content-SHA256' header if able
existing_sha256 = self._get_existing_sha256(request)
@@ -245,10 +242,7 @@ class CrtSigV4AsymAuth(BaseSigner):
if self.credentials is None:
raise NoCredentialsError()
- # Use utcnow() because that's what gets mocked by tests, but set
- # timezone because CRT assumes naive datetime is local time.
- datetime_now = datetime.datetime.utcnow().replace(
- tzinfo=datetime.timezone.utc)
+ datetime_now = datetime.datetime.now(datetime.timezone.utc)
# Use existing 'X-Amz-Content-SHA256' header if able
existing_sha256 = self._get_existing_sha256(request)
diff --git a/awscli/botocore/signers.py b/awscli/botocore/signers.py
index 604f6553..6c55277e 100644
--- a/awscli/botocore/signers.py
+++ b/awscli/botocore/signers.py
@@ -549,7 +549,7 @@ class S3PostPresigner(object):
policy = {}
# Create an expiration date for the policy
- datetime_now = datetime.datetime.utcnow()
+ datetime_now = datetime.datetime.now(datetime.timezone.utc)
expire_date = datetime_now + datetime.timedelta(seconds=expires_in)
policy['expiration'] = expire_date.strftime(botocore.auth.ISO8601)
diff --git a/awscli/botocore/utils.py b/awscli/botocore/utils.py
index 89bcc2aa..8d3688c5 100644
--- a/awscli/botocore/utils.py
+++ b/awscli/botocore/utils.py
@@ -582,13 +582,13 @@ class InstanceMetadataFetcher(IMDSFetcher):
return
try:
expiration = datetime.datetime.strptime(
- expiration, "%Y-%m-%dT%H:%M:%SZ"
+ expiration, "%Y-%m-%dT%H:%M:%S%z"
)
refresh_interval = self._config.get(
"ec2_credential_refresh_window", 60 * 10
)
refresh_interval_with_jitter = refresh_interval + random.randint(120, 600)
- current_time = datetime.datetime.utcnow()
+ current_time = datetime.datetime.now(datetime.timezone.utc)
refresh_offset = datetime.timedelta(seconds=refresh_interval_with_jitter)
extension_time = expiration - refresh_offset
if current_time >= extension_time:
diff --git a/awscli/compat.py b/awscli/compat.py
index b6ae8981..a41c4c6b 100644
--- a/awscli/compat.py
+++ b/awscli/compat.py
@@ -29,6 +29,8 @@ from functools import partial
import urllib.parse as urlparse
from urllib.error import URLError
+import queue
+import urllib.request
from botocore.compat import six
from botocore.compat import OrderedDict
diff --git a/awscli/customizations/cloudformation/deployer.py b/awscli/customizations/cloudformation/deployer.py
index 3733c55e..8236d33c 100644
--- a/awscli/customizations/cloudformation/deployer.py
+++ b/awscli/customizations/cloudformation/deployer.py
@@ -20,7 +20,7 @@ import collections
from awscli.customizations.cloudformation import exceptions
from awscli.customizations.cloudformation.artifact_exporter import mktempfile, parse_s3_url
-from datetime import datetime
+from datetime import datetime, timezone
LOG = logging.getLogger(__name__)
@@ -85,7 +85,7 @@ class Deployer(object):
:return:
"""
- now = datetime.utcnow().isoformat()
+ now = datetime.now(timezone.utc).isoformat()
description = "Created by AWS CLI at {0} UTC".format(now)
# Each changeset will get a unique name based on time
diff --git a/awscli/customizations/cloudtrail/validation.py b/awscli/customizations/cloudtrail/validation.py
index 78e25408..ad135077 100644
--- a/awscli/customizations/cloudtrail/validation.py
+++ b/awscli/customizations/cloudtrail/validation.py
@@ -19,7 +19,7 @@ import re
import sys
import zlib
from zlib import error as ZLibError
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
from dateutil import tz, parser
import cryptography
@@ -401,7 +401,7 @@ class DigestTraverser(object):
:param end_date: Date to stop validating at (inclusive).
"""
if end_date is None:
- end_date = datetime.utcnow()
+ end_date = datetime.now(timezone.utc)
end_date = normalize_date(end_date)
start_date = normalize_date(start_date)
bucket = self.starting_bucket
@@ -703,7 +703,7 @@ class CloudTrailValidateLogs(BasicCommand):
if args.end_time:
self.end_time = normalize_date(parse_date(args.end_time))
else:
- self.end_time = normalize_date(datetime.utcnow())
+ self.end_time = datetime.now(timezone.utc)
if self.start_time > self.end_time:
raise ParamValidationError(
'Invalid time range specified: start-time must '
diff --git a/awscli/customizations/codecommit.py b/awscli/customizations/codecommit.py
index 6b30e834..7859fb89 100644
--- a/awscli/customizations/codecommit.py
+++ b/awscli/customizations/codecommit.py
@@ -150,7 +150,7 @@ class CodeCommitGetCommand(BasicCommand):
request = AWSRequest()
request.url = url_to_sign
request.method = 'GIT'
- now = datetime.datetime.utcnow()
+ now = datetime.datetime.now(datetime.timezone.utc)
request.context['timestamp'] = now.strftime('%Y%m%dT%H%M%S')
split = urlsplit(request.url)
# we don't want to include the port number in the signature
diff --git a/awscli/customizations/codedeploy/push.py b/awscli/customizations/codedeploy/push.py
index 4e0fbcff..9f71f7c2 100644
--- a/awscli/customizations/codedeploy/push.py
+++ b/awscli/customizations/codedeploy/push.py
@@ -16,7 +16,7 @@ import sys
import zipfile
import tempfile
import contextlib
-from datetime import datetime
+from datetime import datetime, timezone
from botocore.exceptions import ClientError
@@ -132,7 +132,7 @@ class Push(BasicCommand):
if not parsed_args.description:
parsed_args.description = (
'Uploaded by AWS CLI {0} UTC'.format(
- datetime.utcnow().isoformat()
+ datetime.now(timezone.utc).isoformat()
)
)
diff --git a/awscli/customizations/datapipeline/__init__.py b/awscli/customizations/datapipeline/__init__.py
index c47ca94f..0c12c394 100644
--- a/awscli/customizations/datapipeline/__init__.py
+++ b/awscli/customizations/datapipeline/__init__.py
@@ -12,7 +12,7 @@
# language governing permissions and limitations under the License.
import json
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
from awscli.formatter import get_formatter
from awscli.arguments import CustomArgument
@@ -186,7 +186,7 @@ class QueryArgBuilder(object):
"""
def __init__(self, current_time=None):
if current_time is None:
- current_time = datetime.utcnow()
+ current_time = datetime.now(timezone.utc)
self.current_time = current_time
def build_query(self, parsed_args):
diff --git a/awscli/customizations/ec2/bundleinstance.py b/awscli/customizations/ec2/bundleinstance.py
index cc6802d6..56c1efa6 100644
--- a/awscli/customizations/ec2/bundleinstance.py
+++ b/awscli/customizations/ec2/bundleinstance.py
@@ -118,7 +118,7 @@ def _generate_policy(params):
# Called if there is no policy supplied by the user.
# Creates a policy that provides access for 24 hours.
delta = datetime.timedelta(hours=24)
- expires = datetime.datetime.utcnow() + delta
+ expires = datetime.datetime.now(datetime.timezone.utc) + delta
expires_iso = expires.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
policy = POLICY.format(expires=expires_iso,
bucket=params['Bucket'],
diff --git a/awscli/customizations/eks/get_token.py b/awscli/customizations/eks/get_token.py
index c85b86dd..9812be4f 100644
--- a/awscli/customizations/eks/get_token.py
+++ b/awscli/customizations/eks/get_token.py
@@ -16,7 +16,7 @@ import json
import os
import sys
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
from botocore.signers import RequestSigner
from botocore.model import ServiceId
@@ -106,7 +106,7 @@ class GetTokenCommand(BasicCommand):
]
def get_expiration_time(self):
- token_expiration = datetime.utcnow() + timedelta(
+ token_expiration = datetime.now(timezone.utc) + timedelta(
minutes=TOKEN_EXPIRATION_MINS
)
return token_expiration.strftime('%Y-%m-%dT%H:%M:%SZ')
diff --git a/awscli/customizations/logs/tail.py b/awscli/customizations/logs/tail.py
index cb315100..623e0272 100644
--- a/awscli/customizations/logs/tail.py
+++ b/awscli/customizations/logs/tail.py
@@ -11,7 +11,8 @@
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
from collections import defaultdict
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
+import functools
import json
import re
import time
@@ -261,7 +262,7 @@ class TimestampUtils(object):
def __init__(self, now=None):
self._now = now
if now is None:
- self._now = datetime.utcnow
+ self._now = functools.partial(datetime.now, timezone.utc)
def to_epoch_millis(self, timestamp):
re_match = self._RELATIVE_TIMESTAMP_REGEX.match(timestamp)
diff --git a/awscli/customizations/opsworks.py b/awscli/customizations/opsworks.py
index e91d4789..9f848c64 100644
--- a/awscli/customizations/opsworks.py
+++ b/awscli/customizations/opsworks.py
@@ -507,7 +507,7 @@ class OpsWorksRegister(BasicCommand):
"Resource": arn,
}
if timeout is not None:
- valid_until = datetime.datetime.utcnow() + timeout
+ valid_until = datetime.datetime.now(datetime.timezone.utc) + timeout
statement["Condition"] = {
"DateLessThan": {
"aws:CurrentTime":
diff --git a/tests/functional/botocore/test_credentials.py b/tests/functional/botocore/test_credentials.py
index 18bd248d..8af69de4 100644
--- a/tests/functional/botocore/test_credentials.py
+++ b/tests/functional/botocore/test_credentials.py
@@ -18,7 +18,7 @@ import math
import time
import tempfile
import shutil
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
import sys
import pytest
@@ -46,8 +46,8 @@ from botocore.stub import Stubber
from botocore.tokens import SSOTokenProvider
from botocore.utils import datetime2timestamp
-TIME_IN_ONE_HOUR = datetime.utcnow() + timedelta(hours=1)
-TIME_IN_SIX_MONTHS = datetime.utcnow() + timedelta(hours=4320)
+TIME_IN_ONE_HOUR = datetime.now(timezone.utc) + timedelta(hours=1)
+TIME_IN_SIX_MONTHS = datetime.now(timezone.utc) + timedelta(hours=4320)
class TestCredentialRefreshRaces(unittest.TestCase):
diff --git a/tests/functional/botocore/test_ec2.py b/tests/functional/botocore/test_ec2.py
index a5aec4aa..475134cc 100644
--- a/tests/functional/botocore/test_ec2.py
+++ b/tests/functional/botocore/test_ec2.py
@@ -85,13 +85,13 @@ class TestCopySnapshotCustomization(BaseSessionTest):
'<snapshotId>%s</snapshotId>\n'
'</CopySnapshotResponse>\n'
)
- self.now = datetime.datetime(2011, 9, 9, 23, 36)
+ self.now = datetime.datetime(2011, 9, 9, 23, 36, tzinfo=datetime.timezone.utc)
self.datetime_patch = mock.patch.object(
botocore.auth.datetime, 'datetime',
mock.Mock(wraps=datetime.datetime)
)
self.mocked_datetime = self.datetime_patch.start()
- self.mocked_datetime.utcnow.return_value = self.now
+ self.mocked_datetime.now.return_value = self.now
def tearDown(self):
super(TestCopySnapshotCustomization, self).tearDown()
diff --git a/tests/functional/botocore/test_lex.py b/tests/functional/botocore/test_lex.py
index 659296fd..614691e8 100644
--- a/tests/functional/botocore/test_lex.py
+++ b/tests/functional/botocore/test_lex.py
@@ -10,7 +10,7 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
-from datetime import datetime
+from datetime import datetime, timezone
from tests import mock, BaseSessionTest, ClientHTTPStubber
@@ -31,10 +31,10 @@ class TestLex(BaseSessionTest):
'inputStream': b''
}
- timestamp = datetime(2017, 3, 22, 0, 0)
+ timestamp = datetime(2017, 3, 22, 0, 0, tzinfo=timezone.utc)
with mock.patch('botocore.auth.datetime') as _datetime:
- _datetime.datetime.utcnow.return_value = timestamp
+ _datetime.datetime.now.return_value = timestamp
self.http_stubber.add_response(body=b'{}')
with self.http_stubber:
self.client.post_content(**params)
diff --git a/tests/functional/botocore/test_s3express.py b/tests/functional/botocore/test_s3express.py
index 390721ee..ebb89b0b 100644
--- a/tests/functional/botocore/test_s3express.py
+++ b/tests/functional/botocore/test_s3express.py
@@ -108,7 +108,6 @@ class TestS3ExpressAuth:
class TestS3ExpressIdentityCache:
def test_default_s3_express_cache(self, default_s3_client, mock_datetime):
mock_datetime.now.return_value = DATE
- mock_datetime.utcnow.return_value = DATE
identity_cache = S3ExpressIdentityCache(
default_s3_client,
@@ -126,7 +125,6 @@ class TestS3ExpressIdentityCache:
self, default_s3_client, mock_datetime
):
mock_datetime.now.return_value = DATE
- mock_datetime.utcnow.return_value = DATE
bucket = 'my_bucket'
identity_cache = S3ExpressIdentityCache(
@@ -151,7 +149,6 @@ class TestS3ExpressIdentityCache:
self, default_s3_client, mock_datetime
):
mock_datetime.now.return_value = DATE
- mock_datetime.utcnow.return_value = DATE
bucket = 'my_bucket'
other_bucket = 'other_bucket'
@@ -204,7 +201,7 @@ class TestS3ExpressRequests:
)
def test_create_bucket(self, default_s3_client, mock_datetime):
- mock_datetime.utcnow.return_value = DATE
+ mock_datetime.now.return_value = DATE
with ClientHTTPStubber(default_s3_client) as stubber:
stubber.add_response()
@@ -228,7 +225,6 @@ class TestS3ExpressRequests:
self._assert_standard_sigv4_signature(stubber.requests[0].headers)
def test_get_object(self, default_s3_client, mock_datetime):
- mock_datetime.utcnow.return_value = DATE
mock_datetime.now.return_value = DATE
with ClientHTTPStubber(default_s3_client) as stubber:
@@ -250,7 +246,6 @@ class TestS3ExpressRequests:
def test_cache_with_multiple_requests(
self, default_s3_client, mock_datetime
):
- mock_datetime.utcnow.return_value = DATE
mock_datetime.now.return_value = DATE
with ClientHTTPStubber(default_s3_client) as stubber:
@@ -275,7 +270,6 @@ class TestS3ExpressRequests:
def test_delete_objects_injects_correct_checksum(
self, default_s3_client, mock_datetime
):
- mock_datetime.utcnow.return_value = DATE
mock_datetime.now.return_value = DATE
with ClientHTTPStubber(default_s3_client) as stubber:
diff --git a/tests/functional/botocore/test_sts.py b/tests/functional/botocore/test_sts.py
index beb48030..e6978795 100644
--- a/tests/functional/botocore/test_sts.py
+++ b/tests/functional/botocore/test_sts.py
@@ -10,7 +10,7 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
-from datetime import datetime
+from datetime import datetime, timezone
import re
from tests import BaseSessionTest
@@ -36,9 +36,9 @@ class TestSTSPresignedUrl(BaseSessionTest):
self.stubber.activate()
def test_presigned_url_contains_no_content_type(self):
- timestamp = datetime(2017, 3, 22, 0, 0)
+ timestamp = datetime(2017, 3, 22, 0, 0, tzinfo=timezone.utc)
with mock.patch('botocore.auth.datetime') as _datetime:
- _datetime.datetime.utcnow.return_value = timestamp
+ _datetime.datetime.now.return_value = timestamp
url = self.client.generate_presigned_url('get_caller_identity', {})
# There should be no 'content-type' in x-amz-signedheaders
diff --git a/tests/functional/ec2/test_bundle_instance.py b/tests/functional/ec2/test_bundle_instance.py
index 1c485d88..d5037fe0 100644
--- a/tests/functional/ec2/test_bundle_instance.py
+++ b/tests/functional/ec2/test_bundle_instance.py
@@ -31,7 +31,7 @@ class TestBundleInstance(BaseAWSCommandParamsTest):
def setUp(self):
super(TestBundleInstance, self).setUp()
- # This mocks out datetime.datetime.utcnow() so that it always
+ # This mocks out datetime.datetime.now() so that it always
# returns the same datetime object. This is because this value
# is embedded into the policy file that is generated and we
# don't what the policy or its signature to change each time
@@ -41,7 +41,7 @@ class TestBundleInstance(BaseAWSCommandParamsTest):
mock.Mock(wraps=datetime.datetime)
)
mocked_datetime = self.datetime_patcher.start()
- mocked_datetime.utcnow.return_value = datetime.datetime(2013, 8, 9)
+ mocked_datetime.now.return_value = datetime.datetime(2013, 8, 9, tzinfo=datetime.timezone.utc)
def tearDown(self):
super(TestBundleInstance, self).tearDown()
diff --git a/tests/functional/ec2instanceconnect/test_opentunnel.py b/tests/functional/ec2instanceconnect/test_opentunnel.py
index 83f824d2..ddefc47f 100644
--- a/tests/functional/ec2instanceconnect/test_opentunnel.py
+++ b/tests/functional/ec2instanceconnect/test_opentunnel.py
@@ -310,10 +310,10 @@ def request_params_for_describe_eice():
@pytest.fixture
-def datetime_utcnow_patch():
+def datetime_now_patch():
clock = datetime.datetime(2020, 1, 1, 1, 1, 1, tzinfo=tzutc())
with mock.patch('datetime.datetime') as dt:
- dt.utcnow.return_value = clock
+ dt.now.return_value = clock
yield dt
@@ -393,7 +393,7 @@ class TestOpenTunnel:
describe_eice_response,
request_params_for_describe_instance,
request_params_for_describe_eice,
- datetime_utcnow_patch,
+ datetime_now_patch,
):
cli_runner.env["AWS_USE_FIPS_ENDPOINT"] = "false"
cmdline = [
diff --git a/tests/functional/eks/test_get_token.py b/tests/functional/eks/test_get_token.py
index 89801f9b..cdf51f7b 100644
--- a/tests/functional/eks/test_get_token.py
+++ b/tests/functional/eks/test_get_token.py
@@ -11,7 +11,7 @@
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
import base64
-from datetime import datetime
+from datetime import datetime, timezone
import json
import os
@@ -80,7 +80,7 @@ class TestGetTokenCommand(BaseAWSCommandParamsTest):
@mock.patch('awscli.customizations.eks.get_token.datetime')
def test_get_token(self, mock_datetime):
- mock_datetime.utcnow.return_value = datetime(2019, 10, 23, 23, 0, 0, 0)
+ mock_datetime.now.return_value = datetime(2019, 10, 23, 23, 0, 0, 0, tzinfo=timezone.utc)
cmd = 'eks get-token --cluster-name %s' % self.cluster_name
response = self.run_get_token(cmd)
self.assertEqual(
@@ -98,7 +98,7 @@ class TestGetTokenCommand(BaseAWSCommandParamsTest):
@mock.patch('awscli.customizations.eks.get_token.datetime')
def test_query_nested_object(self, mock_datetime):
- mock_datetime.utcnow.return_value = datetime(2019, 10, 23, 23, 0, 0, 0)
+ mock_datetime.now.return_value = datetime(2019, 10, 23, 23, 0, 0, 0, tzinfo=timezone.utc)
cmd = 'eks get-token --cluster-name %s' % self.cluster_name
cmd += ' --query status'
response = self.run_get_token(cmd)
@@ -120,7 +120,7 @@ class TestGetTokenCommand(BaseAWSCommandParamsTest):
@mock.patch('awscli.customizations.eks.get_token.datetime')
def test_output_text(self, mock_datetime):
- mock_datetime.utcnow.return_value = datetime(2019, 10, 23, 23, 0, 0, 0)
+ mock_datetime.now.return_value = datetime(2019, 10, 23, 23, 0, 0, 0, tzinfo=timezone.utc)
cmd = 'eks get-token --cluster-name %s' % self.cluster_name
cmd += ' --output text'
stdout, _, _ = self.run_cmd(cmd)
@@ -130,7 +130,7 @@ class TestGetTokenCommand(BaseAWSCommandParamsTest):
@mock.patch('awscli.customizations.eks.get_token.datetime')
def test_output_table(self, mock_datetime):
- mock_datetime.utcnow.return_value = datetime(2019, 10, 23, 23, 0, 0, 0)
+ mock_datetime.now.return_value = datetime(2019, 10, 23, 23, 0, 0, 0, tzinfo=timezone.utc)
cmd = 'eks get-token --cluster-name %s' % self.cluster_name
cmd += ' --output table'
stdout, _, _ = self.run_cmd(cmd)
diff --git a/tests/functional/logs/test_tail.py b/tests/functional/logs/test_tail.py
index 6049a7f8..5707da93 100644
--- a/tests/functional/logs/test_tail.py
+++ b/tests/functional/logs/test_tail.py
@@ -152,7 +152,7 @@ class TestTailCommand(BaseAWSCommandParamsTest):
def test_tail_defaults_to_10m(self):
datetime_mock = mock.Mock(wraps=datetime)
- datetime_mock.utcnow = mock.Mock(
+ datetime_mock.now = mock.Mock(
return_value=datetime(1970, 1, 1, 0, 10, 1, tzinfo=tz.tzutc()))
with mock.patch('awscli.customizations.logs.tail.datetime',
new=datetime_mock):
@@ -177,7 +177,7 @@ class TestTailCommand(BaseAWSCommandParamsTest):
def test_tail_with_relative_since(self):
datetime_mock = mock.Mock(wraps=datetime)
- datetime_mock.utcnow = mock.Mock(
+ datetime_mock.now = mock.Mock(
return_value=datetime(1970, 1, 1, 0, 0, 2, tzinfo=tz.tzutc()))
with mock.patch('awscli.customizations.logs.tail.datetime',
new=datetime_mock):
diff --git a/tests/functional/rds/test_generate_db_auth_token.py b/tests/functional/rds/test_generate_db_auth_token.py
index 79634ed0..1008ba39 100644
--- a/tests/functional/rds/test_generate_db_auth_token.py
+++ b/tests/functional/rds/test_generate_db_auth_token.py
@@ -51,7 +51,7 @@ class TestGenerateDBAuthToken(BaseAWSCommandParamsTest):
clock = datetime.datetime(2016, 11, 7, 17, 39, 33, tzinfo=tzutc())
with mock.patch('datetime.datetime') as dt:
- dt.utcnow.return_value = clock
+ dt.now.return_value = clock
stdout, _, _ = self.run_cmd(command, expected_rc=0)
expected = (
diff --git a/tests/functional/s3/test_presign_command.py b/tests/functional/s3/test_presign_command.py
index 2db338a0..03741d19 100644
--- a/tests/functional/s3/test_presign_command.py
+++ b/tests/functional/s3/test_presign_command.py
@@ -18,13 +18,13 @@ from awscli.testutils import BaseAWSCommandParamsTest, mock, temporary_file
from awscli.testutils import create_clidriver
-# Values used to fix time.time() and datetime.datetime.utcnow()
+# Values used to fix time.time() and datetime.datetime.now()
# so we know the exact values of the signatures generated.
FROZEN_TIMESTAMP = 1471305652
DEFAULT_EXPIRES = 3600
FROZEN_TIME = mock.Mock(return_value=FROZEN_TIMESTAMP)
FROZEN_DATETIME = mock.Mock(
- return_value=datetime.datetime(2016, 8, 18, 14, 33, 3, 0))
+ return_value=datetime.datetime(2016, 8, 18, 14, 33, 3, 0, tzinfo=datetime.timezone.utc))
class TestPresignCommand(BaseAWSCommandParamsTest):
@@ -78,7 +78,7 @@ class TestPresignCommand(BaseAWSCommandParamsTest):
def get_presigned_url_for_cmd(self, cmdline):
with mock.patch('time.time', FROZEN_TIME):
with mock.patch('datetime.datetime') as d:
- d.utcnow = FROZEN_DATETIME
+ d.now = FROZEN_DATETIME
stdout = self.assert_params_for_cmd(cmdline, None)[0].strip()
return stdout
diff --git a/tests/integration/customizations/test_codecommit.py b/tests/integration/customizations/test_codecommit.py
index 7ffbed65..25c78faf 100644
--- a/tests/integration/customizations/test_codecommit.py
+++ b/tests/integration/customizations/test_codecommit.py
@@ -14,7 +14,7 @@
import awscli
import os
-from datetime import datetime
+from datetime import datetime, timezone
from awscli.compat import StringIO
from botocore.session import Session
@@ -59,7 +59,7 @@ class TestCodeCommitCredentialHelper(unittest.TestCase):
@mock.patch('sys.stdout', new_callable=StringIOWithFileNo)
@mock.patch.object(awscli.customizations.codecommit.datetime, 'datetime')
def test_integration_using_cli_driver(self, dt_mock, stdout_mock):
- dt_mock.utcnow.return_value = datetime(2010, 10, 8)
+ dt_mock.now.return_value = datetime(2010, 10, 8, tzinfo=timezone.utc)
driver = create_clidriver()
entry_point = AWSCLIEntryPoint(driver)
rc = entry_point.main('codecommit credential-helper get'.split())
@@ -75,7 +75,7 @@ class TestCodeCommitCredentialHelper(unittest.TestCase):
@mock.patch('sys.stdout', new_callable=StringIOWithFileNo)
@mock.patch.object(awscli.customizations.codecommit.datetime, 'datetime')
def test_integration_fips_using_cli_driver(self, dt_mock, stdout_mock):
- dt_mock.utcnow.return_value = datetime(2010, 10, 8)
+ dt_mock.now.return_value = datetime(2010, 10, 8, tzinfo=timezone.utc)
driver = create_clidriver()
entry_point = AWSCLIEntryPoint(driver)
rc = entry_point.main('codecommit credential-helper get'.split())
@@ -91,7 +91,7 @@ class TestCodeCommitCredentialHelper(unittest.TestCase):
@mock.patch('sys.stdout', new_callable=StringIOWithFileNo)
@mock.patch.object(awscli.customizations.codecommit.datetime, 'datetime')
def test_integration_vpc_using_cli_driver(self, dt_mock, stdout_mock):
- dt_mock.utcnow.return_value = datetime(2010, 10, 8)
+ dt_mock.now.return_value = datetime(2010, 10, 8, tzinfo=timezone.utc)
driver = create_clidriver()
entry_point = AWSCLIEntryPoint(driver)
rc = entry_point.main('codecommit credential-helper get'.split())
diff --git a/tests/unit/botocore/auth/test_signers.py b/tests/unit/botocore/auth/test_signers.py
index 19d559ac..e7db8d8b 100644
--- a/tests/unit/botocore/auth/test_signers.py
+++ b/tests/unit/botocore/auth/test_signers.py
@@ -27,10 +27,10 @@ from botocore.awsrequest import AWSRequest
class BaseTestWithFixedDate(unittest.TestCase):
def setUp(self):
- self.fixed_date = datetime.datetime(2014, 3, 10, 17, 2, 55, 0)
+ self.fixed_date = datetime.datetime(2014, 3, 10, 17, 2, 55, 0, tzinfo=datetime.timezone.utc)
self.datetime_patch = mock.patch('botocore.auth.datetime.datetime')
self.datetime_mock = self.datetime_patch.start()
- self.datetime_mock.utcnow.return_value = self.fixed_date
+ self.datetime_mock.now.return_value = self.fixed_date
self.datetime_mock.strptime.return_value = self.fixed_date
def tearDown(self):
@@ -357,9 +357,9 @@ class TestSigV4(unittest.TestCase):
with mock.patch.object(
botocore.auth.datetime, 'datetime',
mock.Mock(wraps=datetime.datetime)) as mock_datetime:
- original_utcnow = datetime.datetime(2014, 1, 1, 0, 0)
+ original_now = datetime.datetime(2014, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)
- mock_datetime.utcnow.return_value = original_utcnow
+ mock_datetime.now.return_value = original_now
# Go through the add_auth process once. This will attach
# a timestamp to the request at the beginning of auth.
auth.add_auth(request)
@@ -367,8 +367,8 @@ class TestSigV4(unittest.TestCase):
# Ensure the date is in the Authorization header
self.assertIn('20140101', request.headers['Authorization'])
# Now suppose the utc time becomes the next day all of a sudden
- mock_datetime.utcnow.return_value = datetime.datetime(
- 2014, 1, 2, 0, 0)
+ mock_datetime.now.return_value = datetime.datetime(
+ 2014, 1, 2, 0, 0, tzinfo=datetime.timezone.utc)
# Smaller methods like the canonical request and string_to_sign
# should have the timestamp attached to the request in their
# body and not what the time is now mocked as. This is to ensure
@@ -534,8 +534,8 @@ class TestSigV4Presign(BasePresignTest):
mock.Mock(wraps=datetime.datetime)
)
mocked_datetime = self.datetime_patcher.start()
- mocked_datetime.utcnow.return_value = datetime.datetime(
- 2014, 1, 1, 0, 0)
+ mocked_datetime.now.return_value = datetime.datetime(
+ 2014, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)
def tearDown(self):
self.datetime_patcher.stop()
@@ -729,8 +729,8 @@ class TestS3SigV4Post(BaseS3PresignPostTest):
mock.Mock(wraps=datetime.datetime)
)
mocked_datetime = self.datetime_patcher.start()
- mocked_datetime.utcnow.return_value = datetime.datetime(
- 2014, 1, 1, 0, 0)
+ mocked_datetime.now.return_value = datetime.datetime(
+ 2014, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)
def tearDown(self):
self.datetime_patcher.stop()
diff --git a/tests/unit/botocore/test_credentials.py b/tests/unit/botocore/test_credentials.py
index b9931216..7fdcf4ba 100644
--- a/tests/unit/botocore/test_credentials.py
+++ b/tests/unit/botocore/test_credentials.py
@@ -11,7 +11,7 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
import subprocess
import os
import tempfile
@@ -110,7 +110,7 @@ class TestRefreshableCredentials(TestCredentials):
def test_refresh_needed(self):
# The expiry time was set for 30 minutes ago, so if we
- # say the current time is utcnow(), then we should need
+ # say the current time is now(), then we should need
# a refresh.
self.mock_time.return_value = datetime.now(tzlocal())
self.assertTrue(self.creds.refresh_needed())
@@ -290,8 +290,8 @@ class TestAssumeRoleCredentialFetcher(BaseEnvVar):
self.assertEqual(response, expected_response)
def test_retrieves_from_cache(self):
- date_in_future = datetime.utcnow() + timedelta(seconds=1000)
- utc_timestamp = date_in_future.isoformat() + 'Z'
+ date_in_future = datetime.now(timezone.utc) + timedelta(seconds=1000)
+ utc_timestamp = date_in_future.isoformat()
cache_key = (
'793d6e2f27667ab2da104824407e486bfec24a47'
)
@@ -702,8 +702,8 @@ class TestAssumeRoleWithWebIdentityCredentialFetcher(BaseEnvVar):
self.assertEqual(response, expected_response)
def test_retrieves_from_cache(self):
- date_in_future = datetime.utcnow() + timedelta(seconds=1000)
- utc_timestamp = date_in_future.isoformat() + 'Z'
+ date_in_future = datetime.now(timezone.utc) + timedelta(seconds=1000)
+ utc_timestamp = date_in_future.isoformat()
cache_key = (
'793d6e2f27667ab2da104824407e486bfec24a47'
)
@@ -822,8 +822,8 @@ class TestAssumeRoleWithWebIdentityCredentialProvider(unittest.TestCase):
mock_loader_cls.assert_called_with('/some/path/token.jwt')
def test_assume_role_retrieves_from_cache(self):
- date_in_future = datetime.utcnow() + timedelta(seconds=1000)
- utc_timestamp = date_in_future.isoformat() + 'Z'
+ date_in_future = datetime.now(timezone.utc) + timedelta(seconds=1000)
+ utc_timestamp = date_in_future.isoformat()
cache_key = (
'c29461feeacfbed43017d20612606ff76abc073d'
@@ -1960,8 +1960,8 @@ class TestAssumeRoleCredentialProvider(unittest.TestCase):
self.assertEqual(expiry_time, '2016-11-06T01:30:00UTC')
def test_assume_role_retrieves_from_cache(self):
- date_in_future = datetime.utcnow() + timedelta(seconds=1000)
- utc_timestamp = date_in_future.isoformat() + 'Z'
+ date_in_future = datetime.now(timezone.utc) + timedelta(seconds=1000)
+ utc_timestamp = date_in_future.isoformat()
self.fake_config['profiles']['development']['role_arn'] = 'myrole'
cache_key = (
@@ -1988,8 +1988,8 @@ class TestAssumeRoleCredentialProvider(unittest.TestCase):
self.assertEqual(creds.token, 'baz-cached')
def test_chain_prefers_cache(self):
- date_in_future = datetime.utcnow() + timedelta(seconds=1000)
- utc_timestamp = date_in_future.isoformat() + 'Z'
+ date_in_future = datetime.now(timezone.utc) + timedelta(seconds=1000)
+ utc_timestamp = date_in_future.isoformat()
# The profile we will be using has a cache entry, but the profile it
# is sourcing from does not. This should result in the cached
diff --git a/tests/unit/botocore/test_signers.py b/tests/unit/botocore/test_signers.py
index a38d1b59..b0840d54 100644
--- a/tests/unit/botocore/test_signers.py
+++ b/tests/unit/botocore/test_signers.py
@@ -607,9 +607,9 @@ class TestS3PostPresigner(BaseSignerTest):
self.datetime_patch = mock.patch('botocore.signers.datetime')
self.datetime_mock = self.datetime_patch.start()
- self.fixed_date = datetime.datetime(2014, 3, 10, 17, 2, 55, 0)
+ self.fixed_date = datetime.datetime(2014, 3, 10, 17, 2, 55, 0, tzinfo=datetime.timezone.utc)
self.fixed_delta = datetime.timedelta(seconds=3600)
- self.datetime_mock.datetime.utcnow.return_value = self.fixed_date
+ self.datetime_mock.datetime.now.return_value = self.fixed_date
self.datetime_mock.timedelta.return_value = self.fixed_delta
def tearDown(self):
@@ -1004,7 +1004,7 @@ class TestGenerateDBAuthToken(BaseSignerTest):
clock = datetime.datetime(2016, 11, 7, 17, 39, 33, tzinfo=tzutc())
with mock.patch('datetime.datetime') as dt:
- dt.utcnow.return_value = clock
+ dt.now.return_value = clock
result = generate_db_auth_token(
self.client, hostname, port, username)
diff --git a/tests/unit/botocore/test_utils.py b/tests/unit/botocore/test_utils.py
index b4699c6c..2d128bf1 100644
--- a/tests/unit/botocore/test_utils.py
+++ b/tests/unit/botocore/test_utils.py
@@ -98,7 +98,7 @@ from botocore.stub import Stubber
from botocore.config import Config
from botocore.endpoint_provider import RuleSetEndpoint
-DATE = datetime.datetime(2021, 12, 10, 00, 00, 00)
+DATE = datetime.datetime(2021, 12, 10, 00, 00, 00, tzinfo=datetime.timezone.utc)
DT_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
@@ -2913,7 +2913,7 @@ class TestInstanceMetadataFetcher(unittest.TestCase):
self, dt=None, offset=None, offset_func=operator.add
):
if dt is None:
- dt = datetime.datetime.utcnow()
+ dt = datetime.datetime.now(datetime.timezone.utc)
if offset is not None:
dt = offset_func(dt, offset)
diff --git a/tests/unit/customizations/eks/test_get_token.py b/tests/unit/customizations/eks/test_get_token.py
index 9575aa0d..2664e1fe 100644
--- a/tests/unit/customizations/eks/test_get_token.py
+++ b/tests/unit/customizations/eks/test_get_token.py
@@ -46,6 +46,6 @@ class TestGetTokenCommand(BaseTokenTest):
cmd = GetTokenCommand(self._session)
timestamp = cmd.get_expiration_time()
try:
- datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%SZ')
+ datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S%z')
except ValueError:
raise ValueError("Incorrect data format, should be %Y-%m-%dT%H:%M:%SZ")
diff --git a/tests/unit/customizations/test_opsworks.py b/tests/unit/customizations/test_opsworks.py
index d5a6eba3..bad37a90 100644
--- a/tests/unit/customizations/test_opsworks.py
+++ b/tests/unit/customizations/test_opsworks.py
@@ -33,8 +33,8 @@ class TestOpsWorksBase(unittest.TestCase):
mock.Mock(wraps=datetime.datetime)
)
mocked_datetime = self.datetime_patcher.start()
- mocked_datetime.utcnow.return_value = datetime.datetime(
- 2013, 8, 9, 23, 42)
+ mocked_datetime.now.return_value = datetime.datetime(
+ 2013, 8, 9, 23, 42, tzinfo=datetime.timezone.utc)
def tearDown(self):
self.datetime_patcher.stop()
diff --git a/tests/utils/botocore/__init__.py b/tests/utils/botocore/__init__.py
index 106736f3..c76288b5 100644
--- a/tests/utils/botocore/__init__.py
+++ b/tests/utils/botocore/__init__.py
@@ -559,12 +559,12 @@ class FreezeTime(contextlib.ContextDecorator):
:param module: reference to imported module to patch (e.g. botocore.auth.datetime)
:type date: datetime.datetime
- :param date: datetime object specifying the output for utcnow()
+ :param date: datetime object specifying the output for now()
"""
def __init__(self, module, date=None):
if date is None:
- date = datetime.datetime.utcnow()
+ date = datetime.datetime.now(datetime.timezone.utc)
self.date = date
self.datetime_patcher = mock.patch.object(
module, 'datetime',
@@ -573,7 +573,7 @@ class FreezeTime(contextlib.ContextDecorator):
def __enter__(self, *args, **kwargs):
mock = self.datetime_patcher.start()
- mock.utcnow.return_value = self.date
+ mock.now.return_value = self.date
def __exit__(self, *args, **kwargs):
self.datetime_patcher.stop()