Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aws
GitHub Repository: aws/aws-cli
Path: blob/develop/tests/unit/customizations/eks/test_update_kubeconfig.py
1569 views
1
# Copyright 2018 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
import glob
15
import os
16
import shutil
17
import sys
18
import tempfile
19
from argparse import Namespace
20
21
import botocore
22
from botocore.compat import OrderedDict
23
24
import awscli.customizations.eks.kubeconfig as kubeconfig
25
from awscli.customizations.eks.exceptions import EKSClusterError, EKSError
26
from awscli.customizations.eks.ordered_yaml import ordered_yaml_load
27
from awscli.customizations.eks.update_kubeconfig import (API_VERSION,
28
EKSClient,
29
KubeconfigSelector)
30
from awscli.customizations.utils import uni_print
31
from awscli.testutils import mock, unittest
32
from tests.functional.eks.test_util import (
33
describe_cluster_creating_response, describe_cluster_deleting_response,
34
describe_cluster_no_status_response, describe_cluster_response,
35
describe_cluster_response_outpost_cluster, get_testdata)
36
37
38
def generate_env_variable(files):
39
"""
40
Generate a string which is an environment variable
41
containing the absolute paths for each file in files
42
43
:param files: The names of the files to put in the environment variable
44
:type files: list
45
"""
46
output = ""
47
for file in files:
48
if len(output) == 0:
49
output = file
50
else:
51
output += os.path.pathsep + file
52
return output
53
54
55
EXAMPLE_ARN = "arn:aws:eks:region:111222333444:cluster/ExampleCluster"
56
57
class TestKubeconfigSelector(unittest.TestCase):
58
def setUp(self):
59
self._validator = kubeconfig.KubeconfigValidator()
60
self._loader = kubeconfig.KubeconfigLoader(self._validator)
61
62
def assert_chosen_path(self,
63
env_variable,
64
path_in,
65
cluster_name,
66
chosen_path):
67
selector = KubeconfigSelector(env_variable, path_in,
68
self._validator,
69
self._loader)
70
self.assertEqual(selector.choose_kubeconfig(cluster_name).path,
71
chosen_path)
72
73
def test_parse_env_variable(self):
74
paths = [
75
"",
76
"",
77
get_testdata("valid_bad_cluster"),
78
get_testdata("valid_bad_cluster2"),
79
"",
80
get_testdata("valid_existing"),
81
""
82
]
83
84
env_variable = generate_env_variable(paths)
85
86
selector = KubeconfigSelector(env_variable, None, self._validator,
87
self._loader)
88
self.assertEqual(selector._paths, [path for path in paths
89
if len(path) > 0])
90
91
def test_choose_env_only(self):
92
paths = [
93
get_testdata("valid_simple"),
94
get_testdata("valid_existing")
95
] + glob.glob(get_testdata("invalid_*")) + [
96
get_testdata("valid_bad_context"),
97
get_testdata("valid_no_user")
98
]
99
env_variable = generate_env_variable(paths)
100
self.assert_chosen_path(env_variable,
101
None,
102
EXAMPLE_ARN,
103
get_testdata("valid_simple"))
104
105
def test_choose_existing(self):
106
paths = [
107
get_testdata("valid_simple"),
108
get_testdata("valid_existing")
109
] + glob.glob(get_testdata("invalid_*")) + [
110
get_testdata("valid_bad_context"),
111
get_testdata("valid_no_user"),
112
get_testdata("output_single"),
113
get_testdata("output_single_with_role")
114
]
115
env_variable = generate_env_variable(paths)
116
self.assert_chosen_path(env_variable,
117
None,
118
EXAMPLE_ARN,
119
get_testdata("output_single"))
120
121
def test_arg_override(self):
122
paths = [
123
get_testdata("valid_simple"),
124
get_testdata("valid_existing")
125
] + glob.glob(get_testdata("invalid_*")) + [
126
get_testdata("valid_bad_context"),
127
get_testdata("valid_no_user"),
128
get_testdata("output_single"),
129
get_testdata("output_single_with_role")
130
]
131
env_variable = generate_env_variable(paths)
132
self.assert_chosen_path(env_variable,
133
get_testdata("output_combined"),
134
EXAMPLE_ARN,
135
get_testdata("output_combined"))
136
137
def test_first_corrupted(self):
138
paths = glob.glob(get_testdata("invalid_*")) + [
139
get_testdata("valid_bad_context"),
140
get_testdata("valid_no_user")
141
]
142
env_variable = generate_env_variable(paths)
143
selector = KubeconfigSelector(env_variable, None, self._validator,
144
self._loader)
145
self.assertRaises(kubeconfig.KubeconfigCorruptedError,
146
selector.choose_kubeconfig,
147
EXAMPLE_ARN)
148
149
def test_arg_override_first_corrupted(self):
150
paths = glob.glob(get_testdata("invalid_*")) + [
151
get_testdata("valid_bad_context"),
152
get_testdata("valid_no_user")
153
]
154
env_variable = generate_env_variable(paths)
155
self.assert_chosen_path(env_variable,
156
get_testdata("output_combined"),
157
EXAMPLE_ARN,
158
get_testdata("output_combined"))
159
160
class TestEKSClient(unittest.TestCase):
161
def setUp(self):
162
self._correct_cluster_entry = OrderedDict([
163
("cluster", OrderedDict([
164
("certificate-authority-data", describe_cluster_response()\
165
["cluster"]["certificateAuthority"]["data"]),
166
("server", describe_cluster_response()["cluster"]["endpoint"])
167
])),
168
("name", describe_cluster_response()["cluster"]["arn"])
169
])
170
self._correct_user_entry = OrderedDict([
171
("name", describe_cluster_response()["cluster"]["arn"]),
172
("user", OrderedDict([
173
("exec", OrderedDict([
174
("apiVersion", API_VERSION),
175
("args",
176
[
177
"--region",
178
"region",
179
"eks",
180
"get-token",
181
"--cluster-name",
182
"ExampleCluster",
183
"--output",
184
"json",
185
]),
186
("command", "aws")
187
]))
188
]))
189
])
190
191
self._correct_user_entry_outpost_cluster = OrderedDict([
192
("name", describe_cluster_response()["cluster"]["arn"]),
193
("user", OrderedDict([
194
("exec", OrderedDict([
195
("apiVersion", API_VERSION),
196
("args",
197
[
198
"--region",
199
"region",
200
"eks",
201
"get-token",
202
"--cluster-id",
203
"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
204
"--output",
205
"json",
206
]),
207
("command", "aws")
208
]))
209
]))
210
])
211
212
self._mock_client = mock.Mock()
213
self._mock_client.describe_cluster.return_value =\
214
describe_cluster_response()
215
216
self._session = mock.Mock(spec=botocore.session.Session)
217
self._session.create_client.return_value = self._mock_client
218
self._session.profile = None
219
220
self._client = EKSClient(self._session, parsed_args=Namespace(cluster_name="ExampleCluster", role_arn=None))
221
222
def test_get_cluster_description(self):
223
self.assertEqual(self._client.cluster_description,
224
describe_cluster_response()["cluster"])
225
self._mock_client.describe_cluster.assert_called_once_with(
226
name="ExampleCluster"
227
)
228
self._session.create_client.assert_called_once_with("eks")
229
230
def test_get_cluster_description_no_status(self):
231
self._mock_client.describe_cluster.return_value = \
232
describe_cluster_no_status_response()
233
with self.assertRaises(EKSClusterError):
234
self._client.cluster_description
235
self._mock_client.describe_cluster.assert_called_once_with(
236
name="ExampleCluster"
237
)
238
self._session.create_client.assert_called_once_with("eks")
239
240
def test_get_cluster_entry(self):
241
self.assertEqual(self._client.get_cluster_entry(),
242
self._correct_cluster_entry)
243
self._mock_client.describe_cluster.assert_called_once_with(
244
name="ExampleCluster"
245
)
246
self._session.create_client.assert_called_once_with("eks")
247
248
def test_get_user_entry(self):
249
self.assertEqual(self._client.get_user_entry(),
250
self._correct_user_entry)
251
self._mock_client.describe_cluster.assert_called_once_with(
252
name="ExampleCluster"
253
)
254
self._session.create_client.assert_called_once_with("eks")
255
256
def test_get_user_entry_outpost_cluster(self):
257
self._mock_client.describe_cluster.return_value =\
258
describe_cluster_response_outpost_cluster()
259
self.assertEqual(self._client.get_user_entry(),
260
self._correct_user_entry_outpost_cluster)
261
self._mock_client.describe_cluster.assert_called_once_with(
262
name="ExampleCluster"
263
)
264
self._session.create_client.assert_called_once_with("eks")
265
266
def test_get_both(self):
267
self.assertEqual(self._client.get_cluster_entry(),
268
self._correct_cluster_entry)
269
self.assertEqual(self._client.get_user_entry(),
270
self._correct_user_entry)
271
self._mock_client.describe_cluster.assert_called_once_with(
272
name="ExampleCluster"
273
)
274
self._session.create_client.assert_called_once_with("eks")
275
276
def test_cluster_creating(self):
277
self._mock_client.describe_cluster.return_value =\
278
describe_cluster_creating_response()
279
with self.assertRaises(EKSClusterError):
280
self._client.cluster_description
281
self._mock_client.describe_cluster.assert_called_once_with(
282
name="ExampleCluster"
283
)
284
self._session.create_client.assert_called_once_with("eks")
285
286
def test_cluster_deleting(self):
287
self._mock_client.describe_cluster.return_value =\
288
describe_cluster_deleting_response()
289
with self.assertRaises(EKSClusterError):
290
self._client.cluster_description
291
self._mock_client.describe_cluster.assert_called_once_with(
292
name="ExampleCluster"
293
)
294
self._session.create_client.assert_called_once_with("eks")
295
296
def test_profile(self):
297
self._session.profile = "profile"
298
self._correct_user_entry["user"]["exec"]["env"] = [
299
OrderedDict([
300
("name", "AWS_PROFILE"),
301
("value", "profile")
302
])
303
]
304
self.assertEqual(self._client.get_user_entry(),
305
self._correct_user_entry)
306
self._mock_client.describe_cluster.assert_called_once_with(
307
name="ExampleCluster"
308
)
309
self._session.create_client.assert_called_once_with("eks")
310
311
def test_create_user_with_alias(self):
312
self._correct_user_entry["name"] = "alias"
313
self.assertEqual(self._client.get_user_entry(user_alias="alias"),
314
self._correct_user_entry)
315
self._mock_client.describe_cluster.assert_called_once_with(
316
name="ExampleCluster"
317
)
318
self._session.create_client.assert_called_once_with("eks")
319
320
def test_create_user_without_alias(self):
321
self.assertEqual(self._client.get_user_entry(),
322
self._correct_user_entry)
323
self._mock_client.describe_cluster.assert_called_once_with(
324
name="ExampleCluster"
325
)
326
self._session.create_client.assert_called_once_with("eks")
327
328