Path: blob/develop/tests/unit/customizations/codedeploy/test_utils.py
2637 views
# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.1#2# Licensed under the Apache License, Version 2.0 (the "License"). You3# may not use this file except in compliance with the License. A copy of4# the License is located at5#6# http://aws.amazon.com/apache2.0/7#8# or in the "license" file accompanying this file. This file is9# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF10# ANY KIND, either express or implied. See the License for the specific11# language governing permissions and limitations under the License.1213import sys1415from socket import timeout16from argparse import Namespace17from awscli.customizations.codedeploy.systems import Ubuntu, Windows, RHEL, System18from awscli.customizations.codedeploy.utils import \19validate_region, validate_instance_name, validate_tags, \20validate_iam_user_arn, validate_instance, validate_s3_location, \21MAX_INSTANCE_NAME_LENGTH, MAX_TAGS_PER_INSTANCE, MAX_TAG_KEY_LENGTH, \22MAX_TAG_VALUE_LENGTH23from awscli.testutils import mock, unittest242526class TestUtils(unittest.TestCase):27def setUp(self):28self.iam_user_arn = 'arn:aws:iam::012345678912:user/AWS/CodeDeploy/foo'29self.region = 'us-east-1'30self.arg_name = 's3-location'31self.bucket = 'bucket'32self.key = 'key'3334self.system_patcher = mock.patch('platform.system')35self.system = self.system_patcher.start()36self.system.return_value = 'Linux'3738self.linux_distribution_patcher = mock.patch('awscli.compat.linux_distribution')39self.linux_distribution = self.linux_distribution_patcher.start()40self.linux_distribution.return_value = ('Ubuntu', '', '')4142self.urlopen_patcher = mock.patch(43'awscli.customizations.codedeploy.utils.urlopen'44)45self.urlopen = self.urlopen_patcher.start()46self.urlopen.side_effect = timeout('Not EC2 instance')4748self.globals = mock.MagicMock()49self.session = mock.MagicMock()50self.params = Namespace()51self.params.session = self.session5253def tearDown(self):54self.system_patcher.stop()55self.linux_distribution_patcher.stop()56self.urlopen_patcher.stop()5758def test_validate_region_returns_global_region(self):59self.globals.region = self.region60self.session.get_config_variable.return_value = None61validate_region(self.params, self.globals)62self.assertIn('region', self.params)63self.assertEqual(self.region, self.params.region)6465def test_validate_region_returns_session_region(self):66self.globals.region = None67self.session.get_config_variable.return_value = self.region68validate_region(self.params, self.globals)69self.assertIn('region', self.params)70self.assertEqual(self.region, self.params.region)7172def test_validate_region_throws_on_no_region(self):73self.globals.region = None74self.session.get_config_variable.return_value = None75with self.assertRaisesRegex(RuntimeError, 'Region not specified.'):76validate_region(self.params, self.globals)7778def test_validate_instance_name(self):79instance_name = 'instance-name'80self.params.instance_name = instance_name81validate_instance_name(self.params)8283def test_validate_instance_name_throws_on_invalid_characters(self):84self.params.instance_name = '!#$%^&*()<>/?;:[{]}'85with self.assertRaisesRegex(86ValueError, 'Instance name contains invalid characters.'):87validate_instance_name(self.params)8889def test_validate_instance_name_throws_on_i_dash(self):90self.params.instance_name = 'i-instance'91with self.assertRaisesRegex(92ValueError, "Instance name cannot start with 'i-'."):93validate_instance_name(self.params)9495def test_validate_instance_name_throws_on_long_name(self):96self.params.instance_name = (97'01234567890123456789012345678901234567890123456789'98'012345678901234567890123456789012345678901234567891'99)100with self.assertRaisesRegex(101ValueError,102'Instance name cannot be longer than {0} characters.'.format(103MAX_INSTANCE_NAME_LENGTH)):104validate_instance_name(self.params)105106def test_validate_tags_throws_on_too_many_tags(self):107self.params.tags = [108{'Key': 'k' + str(x), 'Value': 'v' + str(x)} for x in range(11)109]110with self.assertRaisesRegex(111ValueError,112'Instances can only have a maximum of {0} '113'tags.'.format(MAX_TAGS_PER_INSTANCE)):114validate_tags(self.params)115116def test_validate_tags_throws_on_max_key_not_accepted(self):117key = 'k' * 128118self.params.tags = [{'Key': key, 'Value': 'v1'}]119validate_tags(self.params)120121def test_validate_tags_throws_on_long_key(self):122key = 'k' * 129123self.params.tags = [{'Key': key, 'Value': 'v1'}]124with self.assertRaisesRegex(125ValueError,126'Tag Key cannot be longer than {0} characters.'.format(127MAX_TAG_KEY_LENGTH)):128validate_tags(self.params)129130def test_validate_tags_throws_on_max_value_not_accepted(self):131value = 'v' * 256132self.params.tags = [{'Key': 'k1', 'Value': value}]133validate_tags(self.params)134135def test_validate_tags_throws_on_long_value(self):136value = 'v' * 257137self.params.tags = [{'Key': 'k1', 'Value': value}]138with self.assertRaisesRegex(139ValueError,140'Tag Value cannot be longer than {0} characters.'.format(141MAX_TAG_VALUE_LENGTH)):142validate_tags(self.params)143144def test_validate_iam_user_arn(self):145self.params.iam_user_arn = self.iam_user_arn146validate_iam_user_arn(self.params)147148def test_validate_iam_user_arn_throws_on_invalid_arn_pattern(self):149self.params.iam_user_arn = 'invalid-arn-pattern'150with self.assertRaisesRegex(ValueError, 'Invalid IAM user ARN.'):151validate_iam_user_arn(self.params)152153def test_validate_instance_ubuntu(self):154self.urlopen.side_effect = timeout('Not EC2 instance')155self.system.return_value = 'Linux'156self.linux_distribution.return_value = ('Ubuntu', None, None)157self.params.session = self.session158self.params.region = self.region159validate_instance(self.params)160self.assertIn('system', self.params)161self.assertTrue(isinstance(self.params.system, Ubuntu))162163def test_validate_instance_rhel(self):164self.urlopen.side_effect = timeout('Not EC2 instance')165self.system.return_value = 'Linux'166self.linux_distribution.return_value = ('Red Hat Enterprise Linux Server', None, None)167self.params.session = self.session168self.params.region = self.region169validate_instance(self.params)170self.assertIn('system', self.params)171self.assertTrue(isinstance(self.params.system, RHEL))172173def test_validate_instance_windows(self):174self.urlopen.side_effect = timeout('Not EC2 instance')175self.system.return_value = 'Windows'176self.params.session = self.session177self.params.region = self.region178validate_instance(self.params)179self.assertIn('system', self.params)180self.assertTrue(isinstance(self.params.system, Windows))181182def test_validate_instance_throws_on_unsupported_system(self):183self.system.return_value = 'Unsupported'184with self.assertRaisesRegex(185RuntimeError, System.UNSUPPORTED_SYSTEM_MSG):186validate_instance(self.params)187188def test_validate_instance_throws_on_ec2_instance(self):189self.params.session = self.session190self.params.region = self.region191self.urlopen.side_effect = None192with self.assertRaisesRegex(193RuntimeError, 'Amazon EC2 instances are not supported.'):194validate_instance(self.params)195196def test_validate_s3_location_returns_bucket_key(self):197self.params.s3_location = 's3://{0}/{1}'.format(self.bucket, self.key)198validate_s3_location(self.params, self.arg_name)199self.assertIn('bucket', self.params)200self.assertEqual(self.bucket, self.params.bucket)201self.assertIn('key', self.params)202self.assertEqual(self.key, self.params.key)203204def test_validate_s3_location_not_present(self):205validate_s3_location(self.params, 'unknown')206self.assertNotIn('bucket', self.params)207self.assertNotIn('key', self.params)208209def test_validate_s3_location_throws_on_invalid_location(self):210self.params.s3_location = 'invalid-s3-location'211with self.assertRaisesRegex(212ValueError,213'--{0} must specify the Amazon S3 URL format as '214's3://<bucket>/<key>.'.format(self.arg_name)):215validate_s3_location(self.params, self.arg_name)216217218if __name__ == "__main__":219unittest.main()220221222