/tests/unit/states/boto_iam_role_test.py

https://gitlab.com/ricardo.hernandez/salt · Python · 185 lines · 144 code · 23 blank · 18 comment · 5 complexity · 289c76b2f8bafa1fc2112d3a578d448c MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. '''
  3. :codeauthor: :email:`Jayesh Kariya <jayeshk@saltstack.com>`
  4. '''
  5. # Import Python libs
  6. from __future__ import absolute_import
  7. # Import Salt Testing Libs
  8. from salttesting import skipIf, TestCase
  9. from salttesting.mock import (
  10. NO_MOCK,
  11. NO_MOCK_REASON,
  12. MagicMock,
  13. patch)
  14. from salttesting.helpers import ensure_in_syspath
  15. ensure_in_syspath('../../')
  16. # Import Salt Libs
  17. from salt.states import boto_iam_role
  18. boto_iam_role.__salt__ = {}
  19. boto_iam_role.__opts__ = {}
  20. @skipIf(NO_MOCK, NO_MOCK_REASON)
  21. class BotoIAMRoleTestCase(TestCase):
  22. '''
  23. Test cases for salt.states.boto_iam_role
  24. '''
  25. # 'present' function tests: 1
  26. def test_present(self):
  27. '''
  28. Test to ensure the IAM role exists.
  29. '''
  30. name = 'myrole'
  31. ret = {'name': name,
  32. 'result': False,
  33. 'changes': {},
  34. 'comment': ''}
  35. _desc_role = {
  36. 'create_date': '2015-02-11T19:47:14Z',
  37. 'role_id': 'HIUHBIUBIBNKJNBKJ',
  38. 'assume_role_policy_document': {
  39. 'Version': '2008-10-17',
  40. 'Statement': [{
  41. 'Action': 'sts:AssumeRole',
  42. 'Principal': {'Service': 'ec2.amazonaws.com'},
  43. 'Effect': 'Allow'
  44. }]},
  45. 'role_name': 'myfakerole',
  46. 'path': '/',
  47. 'arn': 'arn:aws:iam::12345:role/myfakerole'
  48. }
  49. _desc_role2 = {
  50. 'create_date': '2015-02-11T19:47:14Z',
  51. 'role_id': 'HIUHBIUBIBNKJNBKJ',
  52. 'assume_role_policy_document': {
  53. 'Version': '2008-10-17',
  54. 'Statement': [{
  55. 'Action': 'sts:AssumeRole',
  56. 'Principal': {
  57. 'Service': [
  58. 'ec2.amazonaws.com',
  59. 'datapipeline.amazonaws.com'
  60. ]
  61. },
  62. 'Effect': 'Allow'
  63. }]},
  64. 'role_name': 'myfakerole',
  65. 'path': '/',
  66. 'arn': 'arn:aws:iam::12345:role/myfakerole'
  67. }
  68. mock_desc = MagicMock(side_effect=[
  69. False, _desc_role, _desc_role, _desc_role2, _desc_role
  70. ])
  71. _build_policy = {
  72. 'Version': '2008-10-17',
  73. 'Statement': [{
  74. 'Action': 'sts:AssumeRole',
  75. 'Effect': 'Allow',
  76. 'Principal': {'Service': 'ec2.amazonaws.com'}
  77. }]
  78. }
  79. mock_policy = MagicMock(return_value=_build_policy)
  80. mock_ipe = MagicMock(side_effect=[False, True, True, True])
  81. mock_pa = MagicMock(side_effect=[False, True, True, True])
  82. mock_bool = MagicMock(return_value=False)
  83. mock_lst = MagicMock(return_value=[])
  84. with patch.dict(boto_iam_role.__salt__,
  85. {'boto_iam.describe_role': mock_desc,
  86. 'boto_iam.create_role': mock_bool,
  87. 'boto_iam.build_policy': mock_policy,
  88. 'boto_iam.update_assume_role_policy': mock_bool,
  89. 'boto_iam.instance_profile_exists': mock_ipe,
  90. 'boto_iam.list_attached_role_policies': mock_lst,
  91. 'boto_iam.create_instance_profile': mock_bool,
  92. 'boto_iam.profile_associated': mock_pa,
  93. 'boto_iam.associate_profile_to_role': mock_bool,
  94. 'boto_iam.list_role_policies': mock_lst}):
  95. with patch.dict(boto_iam_role.__opts__, {'test': False}):
  96. comt = (' Failed to create {0} IAM role.'.format(name))
  97. ret.update({'comment': comt})
  98. self.assertDictEqual(boto_iam_role.present(name), ret)
  99. comt = (' myrole role present. '
  100. 'Failed to create myrole instance profile.')
  101. ret.update({'comment': comt})
  102. self.assertDictEqual(boto_iam_role.present(name), ret)
  103. comt = (' myrole role present. Failed to associate myrole'
  104. ' instance profile with myrole role.')
  105. ret.update({'comment': comt})
  106. self.assertDictEqual(boto_iam_role.present(name), ret)
  107. comt = (' myrole role present. Failed to update assume role'
  108. ' policy.')
  109. ret.update({'comment': comt})
  110. self.assertDictEqual(boto_iam_role.present(name), ret)
  111. comt = (' myrole role present. ')
  112. ret.update({'comment': comt, 'result': True})
  113. self.assertDictEqual(boto_iam_role.present(name), ret)
  114. # 'absent' function tests: 1
  115. def test_absent(self):
  116. '''
  117. Test to ensure the IAM role is deleted.
  118. '''
  119. name = 'myrole'
  120. ret = {'name': name,
  121. 'result': False,
  122. 'changes': {},
  123. 'comment': ''}
  124. mock = MagicMock(side_effect=[['mypolicy'], ['mypolicy'], False, True,
  125. False, False, True, False, False, False,
  126. True])
  127. mock_bool = MagicMock(return_value=False)
  128. mock_lst = MagicMock(return_value=[])
  129. with patch.dict(boto_iam_role.__salt__,
  130. {'boto_iam.list_role_policies': mock,
  131. 'boto_iam.delete_role_policy': mock_bool,
  132. 'boto_iam.profile_associated': mock,
  133. 'boto_iam.disassociate_profile_from_role': mock_bool,
  134. 'boto_iam.instance_profile_exists': mock,
  135. 'boto_iam.list_attached_role_policies': mock_lst,
  136. 'boto_iam.delete_instance_profile': mock_bool,
  137. 'boto_iam.role_exists': mock,
  138. 'boto_iam.delete_role': mock_bool}):
  139. with patch.dict(boto_iam_role.__opts__, {'test': False}):
  140. comt = (' Failed to add policy mypolicy to role myrole')
  141. ret.update({'comment': comt,
  142. 'changes': {'new': {'policies': ['mypolicy']},
  143. 'old': {'policies': ['mypolicy']}}})
  144. self.assertDictEqual(boto_iam_role.absent(name), ret)
  145. comt = (' No policies in role myrole.'
  146. ' No attached policies in role myrole. Failed to disassociate '
  147. 'myrole instance profile from myrole role.')
  148. ret.update({'comment': comt, 'changes': {}})
  149. self.assertDictEqual(boto_iam_role.absent(name), ret)
  150. comt = (' No policies in role myrole.'
  151. ' No attached policies in role myrole. '
  152. ' Failed to delete myrole instance profile.')
  153. ret.update({'comment': comt, 'changes': {}})
  154. self.assertDictEqual(boto_iam_role.absent(name), ret)
  155. comt = (' No policies in role myrole.'
  156. ' No attached policies in role myrole. myrole instance profile '
  157. 'does not exist. Failed to delete myrole iam role.')
  158. ret.update({'comment': comt, 'changes': {}})
  159. self.assertDictEqual(boto_iam_role.absent(name), ret)
  160. if __name__ == '__main__':
  161. from integration import run_tests
  162. run_tests(BotoIAMRoleTestCase, needs_daemon=False)