Path: blob/develop/tests/unit/customizations/codedeploy/test_register.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.1213from argparse import Namespace14from awscli.customizations.codedeploy.register import Register15from awscli.customizations.codedeploy.utils import MAX_TAGS_PER_INSTANCE16from awscli.testutils import mock, unittest171819class TestRegister(unittest.TestCase):20def setUp(self):21self.path = '/AWS/CodeDeploy/'22self.instance_name = 'instance-name'23self.tags = [{'Key': 'k1', 'Value': 'v1'}]24self.iam_user_arn = 'arn:aws:iam::012345678912:user/instance-name'25self.access_key_id = 'ACCESSKEYID'26self.secret_access_key = 'SECRETACCESSKEY'27self.region = 'us-east-1'28self.policy_name = 'codedeploy-agent'29self.policy_document = (30'{\n'31' "Version": "2012-10-17",\n'32' "Statement": [ {\n'33' "Action": [ "s3:Get*", "s3:List*" ],\n'34' "Effect": "Allow",\n'35' "Resource": "*"\n'36' } ]\n'37'}'38)39self.config_file = 'codedeploy.onpremises.yml'40self.endpoint_url = 'https://codedeploy.aws.amazon.com'4142self.args = Namespace()43self.args.instance_name = self.instance_name44self.args.tags = None45self.args.iam_user_arn = None4647self.globals = Namespace()48self.globals.region = self.region49self.globals.endpoint_url = self.endpoint_url50self.globals.verify_ssl = False5152self.open_patcher = mock.patch(53'awscli.customizations.codedeploy.register.open',54mock.mock_open(), create=True55)56self.open = self.open_patcher.start()5758self.codedeploy = mock.MagicMock()5960self.iam = mock.MagicMock()61self.iam.create_user.return_value = {62'User': {'Arn': self.iam_user_arn}63}64self.iam.create_access_key.return_value = {65'AccessKey': {66'AccessKeyId': self.access_key_id,67'SecretAccessKey': self.secret_access_key68}69}7071self.session = mock.MagicMock()72self.session.create_client.side_effect = [self.codedeploy, self.iam]73self.register = Register(self.session)7475def tearDown(self):76self.open_patcher.stop()7778def test_register_throws_on_invalid_region(self):79self.globals.region = None80self.session.get_config_variable.return_value = None81with self.assertRaisesRegex(RuntimeError, 'Region not specified.'):82self.register._run_main(self.args, self.globals)8384def test_register_throws_on_invalid_instance_name(self):85self.args.instance_name = 'invalid%@^&%#&'86with self.assertRaisesRegex(87ValueError, 'Instance name contains invalid characters.'):88self.register._run_main(self.args, self.globals)8990def test_register_throws_on_invalid_tags(self):91self.args.tags = [92{'Key': 'k' + str(x), 'Value': 'v' + str(x)} for x in range(11)93]94with self.assertRaisesRegex(95ValueError,96'Instances can only have a maximum of {0} tags.'.format(97MAX_TAGS_PER_INSTANCE)):98self.register._run_main(self.args, self.globals)99100def test_register_throws_on_invalid_iam_user_arn(self):101self.args.iam_user_arn = 'invalid%@^&%#&'102with self.assertRaisesRegex(ValueError, 'Invalid IAM user ARN.'):103self.register._run_main(self.args, self.globals)104105def test_register_creates_clients(self):106self.register._run_main(self.args, self.globals)107self.session.create_client.assert_has_calls([108mock.call(109'codedeploy',110region_name=self.region,111endpoint_url=self.endpoint_url,112verify=self.globals.verify_ssl113),114mock.call('iam', region_name=self.region)115])116117def test_register_with_no_iam_user_arn(self):118self.args.iam_user_arn = None119self.register._run_main(self.args, self.globals)120self.register.iam.create_user.assert_called_with(121Path=self.path,122UserName=self.instance_name123)124self.assertIn('iam_user_arn', self.args)125self.assertEqual(self.iam_user_arn, self.args.iam_user_arn)126self.register.iam.create_access_key.assert_called_with(127UserName=self.instance_name128)129self.assertIn('access_key_id', self.args)130self.assertEqual(self.access_key_id, self.args.access_key_id)131self.assertIn('secret_access_key', self.args)132self.assertEqual(self.secret_access_key, self.args.secret_access_key)133self.register.iam.put_user_policy.assert_called_with(134UserName=self.instance_name,135PolicyName=self.policy_name,136PolicyDocument=self.policy_document137)138self.assertIn('policy_name', self.args)139self.assertEqual(self.policy_name, self.args.policy_name)140self.assertIn('policy_document', self.args)141self.assertEqual(self.policy_document, self.args.policy_document)142self.open.assert_called_with(self.config_file, 'w')143self.open().write.assert_called_with(144'---\n'145'region: {0}\n'146'iam_user_arn: {1}\n'147'aws_access_key_id: {2}\n'148'aws_secret_access_key: {3}\n'.format(149self.region,150self.iam_user_arn,151self.access_key_id,152self.secret_access_key153)154)155self.register.codedeploy.register_on_premises_instance.\156assert_called_with(157instanceName=self.instance_name,158iamUserArn=self.iam_user_arn159)160161def test_register_with_iam_user_arn(self):162self.args.iam_user_arn = self.iam_user_arn163self.register._run_main(self.args, self.globals)164self.assertFalse(self.register.iam.create_user.called)165self.assertFalse(self.register.iam.create_access_key.called)166self.assertFalse(self.register.iam.put_user_policy.called)167self.assertFalse(self.open.called)168self.register.codedeploy.register_on_premises_instance.\169assert_called_with(170instanceName=self.instance_name,171iamUserArn=self.iam_user_arn172)173174def test_register_with_no_tags(self):175self.args.tags = None176self.register._run_main(self.args, self.globals)177self.register.codedeploy.register_on_premises_instance.\178assert_called_with(179instanceName=self.instance_name,180iamUserArn=self.iam_user_arn181)182self.assertFalse(183self.register.codedeploy.add_tags_to_on_premises_instances.called184)185186def test_register_with_tags(self):187self.args.tags = self.tags188self.register._run_main(self.args, self.globals)189self.register.codedeploy.register_on_premises_instance.\190assert_called_with(191instanceName=self.instance_name,192iamUserArn=self.iam_user_arn193)194self.register.codedeploy.add_tags_to_on_premises_instances.\195assert_called_with(196tags=self.tags,197instanceNames=[self.instance_name]198)199200201if __name__ == "__main__":202unittest.main()203204205