Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aws
GitHub Repository: aws/aws-cli
Path: blob/develop/tests/unit/customizations/codedeploy/test_register.py
2637 views
1
# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
#
3
# Licensed under the Apache License, Version 2.0 (the "License"). You
4
# may not use this file except in compliance with the License. A copy of
5
# the License is located at
6
#
7
# http://aws.amazon.com/apache2.0/
8
#
9
# or in the "license" file accompanying this file. This file is
10
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
# ANY KIND, either express or implied. See the License for the specific
12
# language governing permissions and limitations under the License.
13
14
from argparse import Namespace
15
from awscli.customizations.codedeploy.register import Register
16
from awscli.customizations.codedeploy.utils import MAX_TAGS_PER_INSTANCE
17
from awscli.testutils import mock, unittest
18
19
20
class TestRegister(unittest.TestCase):
21
def setUp(self):
22
self.path = '/AWS/CodeDeploy/'
23
self.instance_name = 'instance-name'
24
self.tags = [{'Key': 'k1', 'Value': 'v1'}]
25
self.iam_user_arn = 'arn:aws:iam::012345678912:user/instance-name'
26
self.access_key_id = 'ACCESSKEYID'
27
self.secret_access_key = 'SECRETACCESSKEY'
28
self.region = 'us-east-1'
29
self.policy_name = 'codedeploy-agent'
30
self.policy_document = (
31
'{\n'
32
' "Version": "2012-10-17",\n'
33
' "Statement": [ {\n'
34
' "Action": [ "s3:Get*", "s3:List*" ],\n'
35
' "Effect": "Allow",\n'
36
' "Resource": "*"\n'
37
' } ]\n'
38
'}'
39
)
40
self.config_file = 'codedeploy.onpremises.yml'
41
self.endpoint_url = 'https://codedeploy.aws.amazon.com'
42
43
self.args = Namespace()
44
self.args.instance_name = self.instance_name
45
self.args.tags = None
46
self.args.iam_user_arn = None
47
48
self.globals = Namespace()
49
self.globals.region = self.region
50
self.globals.endpoint_url = self.endpoint_url
51
self.globals.verify_ssl = False
52
53
self.open_patcher = mock.patch(
54
'awscli.customizations.codedeploy.register.open',
55
mock.mock_open(), create=True
56
)
57
self.open = self.open_patcher.start()
58
59
self.codedeploy = mock.MagicMock()
60
61
self.iam = mock.MagicMock()
62
self.iam.create_user.return_value = {
63
'User': {'Arn': self.iam_user_arn}
64
}
65
self.iam.create_access_key.return_value = {
66
'AccessKey': {
67
'AccessKeyId': self.access_key_id,
68
'SecretAccessKey': self.secret_access_key
69
}
70
}
71
72
self.session = mock.MagicMock()
73
self.session.create_client.side_effect = [self.codedeploy, self.iam]
74
self.register = Register(self.session)
75
76
def tearDown(self):
77
self.open_patcher.stop()
78
79
def test_register_throws_on_invalid_region(self):
80
self.globals.region = None
81
self.session.get_config_variable.return_value = None
82
with self.assertRaisesRegex(RuntimeError, 'Region not specified.'):
83
self.register._run_main(self.args, self.globals)
84
85
def test_register_throws_on_invalid_instance_name(self):
86
self.args.instance_name = 'invalid%@^&%#&'
87
with self.assertRaisesRegex(
88
ValueError, 'Instance name contains invalid characters.'):
89
self.register._run_main(self.args, self.globals)
90
91
def test_register_throws_on_invalid_tags(self):
92
self.args.tags = [
93
{'Key': 'k' + str(x), 'Value': 'v' + str(x)} for x in range(11)
94
]
95
with self.assertRaisesRegex(
96
ValueError,
97
'Instances can only have a maximum of {0} tags.'.format(
98
MAX_TAGS_PER_INSTANCE)):
99
self.register._run_main(self.args, self.globals)
100
101
def test_register_throws_on_invalid_iam_user_arn(self):
102
self.args.iam_user_arn = 'invalid%@^&%#&'
103
with self.assertRaisesRegex(ValueError, 'Invalid IAM user ARN.'):
104
self.register._run_main(self.args, self.globals)
105
106
def test_register_creates_clients(self):
107
self.register._run_main(self.args, self.globals)
108
self.session.create_client.assert_has_calls([
109
mock.call(
110
'codedeploy',
111
region_name=self.region,
112
endpoint_url=self.endpoint_url,
113
verify=self.globals.verify_ssl
114
),
115
mock.call('iam', region_name=self.region)
116
])
117
118
def test_register_with_no_iam_user_arn(self):
119
self.args.iam_user_arn = None
120
self.register._run_main(self.args, self.globals)
121
self.register.iam.create_user.assert_called_with(
122
Path=self.path,
123
UserName=self.instance_name
124
)
125
self.assertIn('iam_user_arn', self.args)
126
self.assertEqual(self.iam_user_arn, self.args.iam_user_arn)
127
self.register.iam.create_access_key.assert_called_with(
128
UserName=self.instance_name
129
)
130
self.assertIn('access_key_id', self.args)
131
self.assertEqual(self.access_key_id, self.args.access_key_id)
132
self.assertIn('secret_access_key', self.args)
133
self.assertEqual(self.secret_access_key, self.args.secret_access_key)
134
self.register.iam.put_user_policy.assert_called_with(
135
UserName=self.instance_name,
136
PolicyName=self.policy_name,
137
PolicyDocument=self.policy_document
138
)
139
self.assertIn('policy_name', self.args)
140
self.assertEqual(self.policy_name, self.args.policy_name)
141
self.assertIn('policy_document', self.args)
142
self.assertEqual(self.policy_document, self.args.policy_document)
143
self.open.assert_called_with(self.config_file, 'w')
144
self.open().write.assert_called_with(
145
'---\n'
146
'region: {0}\n'
147
'iam_user_arn: {1}\n'
148
'aws_access_key_id: {2}\n'
149
'aws_secret_access_key: {3}\n'.format(
150
self.region,
151
self.iam_user_arn,
152
self.access_key_id,
153
self.secret_access_key
154
)
155
)
156
self.register.codedeploy.register_on_premises_instance.\
157
assert_called_with(
158
instanceName=self.instance_name,
159
iamUserArn=self.iam_user_arn
160
)
161
162
def test_register_with_iam_user_arn(self):
163
self.args.iam_user_arn = self.iam_user_arn
164
self.register._run_main(self.args, self.globals)
165
self.assertFalse(self.register.iam.create_user.called)
166
self.assertFalse(self.register.iam.create_access_key.called)
167
self.assertFalse(self.register.iam.put_user_policy.called)
168
self.assertFalse(self.open.called)
169
self.register.codedeploy.register_on_premises_instance.\
170
assert_called_with(
171
instanceName=self.instance_name,
172
iamUserArn=self.iam_user_arn
173
)
174
175
def test_register_with_no_tags(self):
176
self.args.tags = None
177
self.register._run_main(self.args, self.globals)
178
self.register.codedeploy.register_on_premises_instance.\
179
assert_called_with(
180
instanceName=self.instance_name,
181
iamUserArn=self.iam_user_arn
182
)
183
self.assertFalse(
184
self.register.codedeploy.add_tags_to_on_premises_instances.called
185
)
186
187
def test_register_with_tags(self):
188
self.args.tags = self.tags
189
self.register._run_main(self.args, self.globals)
190
self.register.codedeploy.register_on_premises_instance.\
191
assert_called_with(
192
instanceName=self.instance_name,
193
iamUserArn=self.iam_user_arn
194
)
195
self.register.codedeploy.add_tags_to_on_premises_instances.\
196
assert_called_with(
197
tags=self.tags,
198
instanceNames=[self.instance_name]
199
)
200
201
202
if __name__ == "__main__":
203
unittest.main()
204
205