Path: blob/develop/tests/unit/customizations/emr/test_create_default_role.py
1569 views
# Copyright 2014 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.12from botocore.compat import json13from botocore.awsrequest import AWSResponse14from botocore.exceptions import ClientError1516import awscli.customizations.emr.emrutils as emrutils17import awscli.customizations.emr.createdefaultroles as createdefaultroles18from awscli.testutils import mock, unittest19from tests.unit.customizations.emr import EMRBaseAWSCommandParamsTest as \20BaseAWSCommandParamsTest212223EC2_ROLE_NAME = "EMR_EC2_DefaultRole"24EMR_ROLE_NAME = "EMR_DefaultRole"25EMR_AUTOSCALING_ROLE_NAME = "EMR_AutoScaling_DefaultRole"2627EC2_ROLE_POLICY = {28"Statement": [29{30"Action": [31"cloudwatch:*",32"dynamodb:*",33"ec2:Describe*",34"elasticmapreduce:Describe*",35"rds:Describe*",36"s3:*",37"sdb:*",38"sns:*",39"sqs:*"40],41"Effect": "Allow",42"Resource": ["*"]43}44]45}4647CREATE_EC2_ROLE_RESULT = {48"Role": {49"AssumeRolePolicyDocument": {50"Version": "2008-10-17",51"Statement": [52{53"Action": "sts:AssumeRole",54"Sid": "",55"Effect": "Allow",56"Principal": {57"Service": "ec2.amazonaws.com"58}59}60]61},62"RoleId": "AROAJG7O4RNNSRINMF6DI",63"CreateDate": "2014-05-01T23:47:14.552Z",64"RoleName": EC2_ROLE_NAME,65"Path": "/",66"Arn": "arn:aws:iam::176430881729:role/"+EC2_ROLE_NAME67}68}6970CONSTRUCTED_RESULT_OUTPUT = [71{72"Role": CREATE_EC2_ROLE_RESULT['Role'],73"RolePolicy": EC2_ROLE_POLICY74}75]7677http_response = AWSResponse(None, 200, {}, None)7879CN_EC2_ROLE_ARN = ('arn:aws-cn:iam::aws:policy/service-role/'80'AmazonElasticMapReduceforEC2Role')81US_GOV_EC2_ROLE_ARN = ('arn:aws-us-gov:iam::aws:policy/service-role/'82'AmazonElasticMapReduceforEC2Role')8384EC2_ROLE_ARN = ('arn:aws:iam::aws:policy/service-role/'85'AmazonElasticMapReduceforEC2Role')8687CN_EMR_ROLE_ARN = ('arn:aws-cn:iam::aws:policy/service-role/'88'AmazonElasticMapReduceRole')8990US_GOV_EMR_ROLE_ARN = ('arn:aws-us-gov:iam::aws:policy/'91'service-role/AmazonElasticMapReduceRole')9293EMR_ROLE_ARN = ('arn:aws:iam::aws:policy/service-role/'94'AmazonElasticMapReduceRole')9596CN_EMR_AUTOSCALING_ROLE_ARN = 'arn:aws-cn:iam::aws:policy/service-role/AmazonElasticMapReduceforAutoScalingRole'9798US_GOV_EMR_AUTOSCALING_ROLE_ARN = 'arn:aws-us-gov:iam::aws:policy/service-role/' \99'AmazonElasticMapReduceforAutoScalingRole'100101EMR_AUTOSCALING_ROLE_ARN = 'arn:aws:iam::aws:policy/service-role/AmazonElasticMapReduceforAutoScalingRole'102103class TestCreateDefaultRole(BaseAWSCommandParamsTest):104prefix = 'emr create-default-roles'105106ec2_role_policy_document = {107"Version": "2008-10-17",108"Statement": [109{110"Sid": "",111"Effect": "Allow",112"Principal": {"Service": "ec2.amazonaws.com"},113"Action": "sts:AssumeRole"114}115]116}117118emr_role_policy_document = {119"Version": "2008-10-17",120"Statement": [121{122"Sid": "",123"Effect": "Allow",124"Principal": {"Service": "elasticmapreduce.amazonaws.com.cn"},125"Action": "sts:AssumeRole"126}127]128}129130emr_autoscaling_role_policy_document_cn = {131"Version": "2008-10-17",132"Statement": [133{134"Sid": "",135"Effect": "Allow",136"Principal": {137"Service": [138"elasticmapreduce.amazonaws.com.cn",139"application-autoscaling.amazonaws.com.cn"140]141},142"Action": "sts:AssumeRole"143}144]145}146147emr_autoscaling_role_policy_document = {148"Version": "2008-10-17",149"Statement": [150{151"Sid": "",152"Effect": "Allow",153"Principal": {154"Service": [155"elasticmapreduce.amazonaws.com",156"application-autoscaling.amazonaws.com"157]158},159"Action": "sts:AssumeRole"160}161]162}163164def test_default_roles_exist(self):165cmdline = self.prefix166167self.run_cmd(cmdline, expected_rc=0)168self.assertEqual(len(self.operations_called), 4)169170self.assertEqual(self.operations_called[0][0].name, 'GetRole')171self.assertEqual(self.operations_called[0][1]['RoleName'],172EC2_ROLE_NAME)173174self.assertEqual(self.operations_called[1][0].name,175'GetInstanceProfile')176self.assertEqual(self.operations_called[1][1]['InstanceProfileName'],177EC2_ROLE_NAME)178self.assertEqual(self.operations_called[2][0].name, 'GetRole')179self.assertEqual(self.operations_called[2][1]['RoleName'],180EMR_ROLE_NAME)181182self.assertEqual(self.operations_called[3][0].name, 'GetRole')183self.assertEqual(self.operations_called[3][1]['RoleName'],184EMR_AUTOSCALING_ROLE_NAME)185186@mock.patch('awscli.customizations.emr.emr.'187'CreateDefaultRoles._construct_result')188@mock.patch('awscli.customizations.emr.emr.'189'CreateDefaultRoles.check_if_instance_profile_exists')190@mock.patch('awscli.customizations.emr.emr.'191'CreateDefaultRoles.check_if_role_exists')192@mock.patch('awscli.customizations.emr.emr.'193'CreateDefaultRoles._get_role_policy')194def test_default_autoscaling_role_commercial(self, get_rp_patch,195role_exists_patch,196instance_profile_exists_patch,197construct_result_patch):198get_rp_patch.return_value = False199role_exists_patch.return_value = False200instance_profile_exists_patch.return_value = False201construct_result_patch.return_value = []202203cmdline = self.prefix + ' --region us-east-1'204205self.run_cmd(cmdline, expected_rc=0)206207# Only 8 operations will be called as we are mocking208# check_if_role_exists and check_if_instance_profile_exists methods.209self.assertEqual(len(self.operations_called), 8)210self.assertEqual(211self.operations_called[6][1]['AssumeRolePolicyDocument'],212emrutils.dict_to_string(self.emr_autoscaling_role_policy_document))213214@mock.patch('awscli.customizations.emr.emr.'215'CreateDefaultRoles._construct_result')216@mock.patch('awscli.customizations.emr.emr.'217'CreateDefaultRoles.check_if_instance_profile_exists')218@mock.patch('awscli.customizations.emr.emr.'219'CreateDefaultRoles.check_if_role_exists')220@mock.patch('awscli.customizations.emr.emr.'221'CreateDefaultRoles._get_role_policy')222def test_default_roles_not_exist(self, get_rp_patch,223role_exists_patch,224instance_profile_exists_patch,225construct_result_patch):226get_rp_patch.return_value = False227role_exists_patch.return_value = False228instance_profile_exists_patch.return_value = False229construct_result_patch.return_value = []230231cmdline = self.prefix + ' --region cn-north-1'232233self.run_cmd(cmdline, expected_rc=0)234235# Only 8 operations will be called as we are mocking236# check_if_role_exists and check_if_instance_profile_exists methods.237self.assertEqual(len(self.operations_called), 8)238239self.assertEqual(self.operations_called[0][0].name, 'CreateRole')240self.assertEqual(self.operations_called[0][1]['RoleName'],241EC2_ROLE_NAME)242self.assertEqual(243self.operations_called[0][1]['AssumeRolePolicyDocument'],244emrutils.dict_to_string(self.ec2_role_policy_document))245246self.assertEqual(self.operations_called[1][0].name,247'AttachRolePolicy')248self.assertEqual(self.operations_called[1][1]['PolicyArn'],249CN_EC2_ROLE_ARN)250self.assertEqual(self.operations_called[1][1]['RoleName'],251EC2_ROLE_NAME)252253self.assertEqual(self.operations_called[2][0].name,254'CreateInstanceProfile')255self.assertEqual(self.operations_called[2][1]['InstanceProfileName'],256EC2_ROLE_NAME)257258self.assertEqual(self.operations_called[3][0].name,259'AddRoleToInstanceProfile')260self.assertEqual(self.operations_called[3][1]['InstanceProfileName'],261EC2_ROLE_NAME)262self.assertEqual(self.operations_called[3][1]['RoleName'],263EC2_ROLE_NAME)264265self.assertEqual(self.operations_called[4][0].name, 'CreateRole')266self.assertEqual(self.operations_called[4][1]['RoleName'],267EMR_ROLE_NAME)268self.assertEqual(269self.operations_called[4][1]['AssumeRolePolicyDocument'],270emrutils.dict_to_string(self.emr_role_policy_document))271272self.assertEqual(self.operations_called[5][0].name, 'AttachRolePolicy')273self.assertEqual(self.operations_called[5][1]['PolicyArn'],274CN_EMR_ROLE_ARN)275self.assertEqual(self.operations_called[5][1]['RoleName'],276EMR_ROLE_NAME)277278self.assertEqual(self.operations_called[6][0].name, 'CreateRole')279self.assertEqual(self.operations_called[6][1]['RoleName'],280EMR_AUTOSCALING_ROLE_NAME)281self.assertEqual(282self.operations_called[6][1]['AssumeRolePolicyDocument'],283emrutils.dict_to_string(self.emr_autoscaling_role_policy_document_cn))284285self.assertEqual(self.operations_called[7][0].name, 'AttachRolePolicy')286self.assertEqual(self.operations_called[7][1]['PolicyArn'],287CN_EMR_AUTOSCALING_ROLE_ARN)288self.assertEqual(self.operations_called[7][1]['RoleName'],289EMR_AUTOSCALING_ROLE_NAME)290291@mock.patch('awscli.customizations.emr.emr.'292'CreateDefaultRoles._construct_result')293@mock.patch('awscli.customizations.emr.createdefaultroles'294'.get_service_principal')295@mock.patch('awscli.customizations.emr.emr.'296'CreateDefaultRoles.check_if_instance_profile_exists')297@mock.patch('awscli.customizations.emr.emr.'298'CreateDefaultRoles.check_if_role_exists')299@mock.patch('awscli.customizations.emr.emr.'300'CreateDefaultRoles._get_role_policy')301def test_get_service_principal_parameters(self, get_rp_patch,302role_exists_patch,303instance_profile_exists_patch,304get_sp_patch,305construct_result_patch):306get_rp_patch.return_value = "blah"307get_sp_patch.return_value = 'elasticmapreduce.amazonaws.abc'308role_exists_patch.return_value = False309instance_profile_exists_patch.return_value = False310construct_result_patch.return_value = []311312endpoint_url = 'https://elasticmapreduce.abc'313cmdline = self.prefix + ' --endpoint ' + endpoint_url314self.run_cmd(cmdline, expected_rc=0)315self.assertEqual(get_sp_patch.call_args[0][1], endpoint_url)316317@mock.patch('botocore.session.Session.create_client')318def test_call_parameters(self, call_patch):319cmdline = self.prefix + ' --region eu-west-1' + ' --no-verify-ssl'320self.run_cmd(cmdline, expected_rc=0)321self.assertEqual(call_patch.call_args[1]['region_name'], 'eu-west-1')322self.assertEqual(call_patch.call_args[1]['verify'], False)323324@mock.patch('botocore.session.Session.create_client')325def test_call_parameters_only_endpoint(self, call_patch):326endpoint_arg = 'https://elasticmapreduce.us-unknown-1.amazonaws.com'327cmdline = self.prefix + ' --endpoint ' + endpoint_arg328self.run_cmd(cmdline, expected_rc=0)329self.assertEqual(call_patch.call_args[1]['endpoint_url'], None)330331@mock.patch('botocore.session.Session.create_client')332def test_call_parameters_only_iam_endpoint(self, call_patch):333endpoint_arg = 'https://elasticmapreduce.us-unknown-1.amazonaws.com'334cmdline = self.prefix + ' --iam-endpoint ' + endpoint_arg335self.run_cmd(cmdline, expected_rc=0)336self.assertEqual(call_patch.call_args[1]['endpoint_url'],337endpoint_arg)338339@mock.patch('awscli.customizations.emr.emr.'340'CreateDefaultRoles._get_role_policy')341@mock.patch('awscli.customizations.emr.emr.'342'CreateDefaultRoles._create_role_with_role_policy')343@mock.patch('awscli.customizations.emr.emr.'344'CreateDefaultRoles.check_if_instance_profile_exists')345@mock.patch('awscli.customizations.emr.emr.'346'CreateDefaultRoles.check_if_role_exists')347def test_constructed_result(self, role_exists_patch,348instance_profile_exists_patch,349create_role_patch,350get_role_policy_patch):351role_exists_patch.side_effect = side_effect_ofcheck_if_role_exists352instance_profile_exists_patch.return_value = False353create_role_patch.return_value = CREATE_EC2_ROLE_RESULT354get_role_policy_patch.return_value = EC2_ROLE_POLICY355356cmdline = self.prefix + ' --region cn-north-1'357result = self.run_cmd(cmdline, 0)358expected_output = json.dumps(CONSTRUCTED_RESULT_OUTPUT, indent=4) +\359'\n'360self.assertEqual(result[0], expected_output)361362def test_policy_arn_construction(self):363self.assertEqual(364createdefaultroles.get_role_policy_arn("cn-north-1", createdefaultroles.EC2_ROLE_POLICY_NAME),365CN_EC2_ROLE_ARN)366self.assertEqual(367createdefaultroles.get_role_policy_arn("us-gov-west-1", createdefaultroles.EC2_ROLE_POLICY_NAME),368US_GOV_EC2_ROLE_ARN)369self.assertEqual(370createdefaultroles.get_role_policy_arn("eu-west-1", createdefaultroles.EC2_ROLE_POLICY_NAME),371EC2_ROLE_ARN)372self.assertEqual(373createdefaultroles.get_role_policy_arn("cn-north-1", createdefaultroles.EMR_ROLE_POLICY_NAME),374CN_EMR_ROLE_ARN)375self.assertEqual(376createdefaultroles.get_role_policy_arn("us-gov-west-1", createdefaultroles.EMR_ROLE_POLICY_NAME),377US_GOV_EMR_ROLE_ARN)378self.assertEqual(379createdefaultroles.get_role_policy_arn("eu-west-1", createdefaultroles.EMR_ROLE_POLICY_NAME),380EMR_ROLE_ARN)381self.assertEqual(382createdefaultroles.get_role_policy_arn("cn-north-1", createdefaultroles.EMR_AUTOSCALING_ROLE_POLICY_NAME),383CN_EMR_AUTOSCALING_ROLE_ARN)384self.assertEqual(385createdefaultroles.get_role_policy_arn("us-gov-west-1",386createdefaultroles.EMR_AUTOSCALING_ROLE_POLICY_NAME),387US_GOV_EMR_AUTOSCALING_ROLE_ARN)388self.assertEqual(389createdefaultroles.get_role_policy_arn("eu-west-1", createdefaultroles.EMR_AUTOSCALING_ROLE_POLICY_NAME),390EMR_AUTOSCALING_ROLE_ARN)391392393class TestCreateDefaultRoles(unittest.TestCase):394395def setUp(self):396self.session = mock.Mock()397self.client = mock.Mock()398self.session.create_client.return_value = self.client399self.command = createdefaultroles.CreateDefaultRoles(self.session)400setattr(self.command, 'iam_endpoint_url', 'https://www.amazonaws.com')401self.parsed_globals = mock.Mock()402self.parsed_globals.verify_ssl = True403404def testcheck_if_role_exists_raises_client_error(self):405error_response = {406'Error': {407'Code': 'foo'408}409}410error = ClientError(error_response, 'GetRole')411self.client.get_role.side_effect = error412413with self.assertRaises(ClientError):414self.command.check_if_role_exists('role', self.parsed_globals)415416def test_check_role_not_found(self):417error_response = {418'Error': {419'Code': 'NoSuchEntity'420}421}422error = ClientError(error_response, 'GetRole')423self.client.get_role.side_effect = error424self.assertFalse(self.command.check_if_role_exists('role', self.parsed_globals))425426def test_check_instance_profile_exists_raises_client_error(self):427error_response = {428'Error': {429'Code': 'foo'430}431}432error = ClientError(error_response, 'GetInstanceProfile')433self.client.get_instance_profile.side_effect = error434435with self.assertRaises(ClientError):436self.command.check_if_instance_profile_exists(437'role', self.parsed_globals)438439def test_check_instance_profile_not_found(self):440error_response = {441'Error': {442'Code': 'NoSuchEntity'443}444}445error = ClientError(error_response, 'GetInstanceProfile')446self.client.get_instance_profile.side_effect = error447self.assertFalse(self.command.check_if_instance_profile_exists('role', self.parsed_globals))448449def side_effect_ofcheck_if_role_exists(*args, **kwargs):450if args[0] == EC2_ROLE_NAME:451return False452else:453return True454455456if __name__ == "__main__":457unittest.main()458459460