Skip to content
This repository was archived by the owner on Mar 13, 2022. It is now read-only.

Commit 7858fa8

Browse files
committed
remove required idp-certificate-authority-data in kubeconfig for oidc toke refresh, kubernetes-client/python#493
fix pep8 style add unit test
1 parent 5784a38 commit 7858fa8

File tree

2 files changed

+67
-14
lines changed

2 files changed

+67
-14
lines changed

config/kube_config.py

+19-14
Original file line numberDiff line numberDiff line change
@@ -255,22 +255,27 @@ def _load_oid_token(self):
255255
return self.token
256256

257257
def _refresh_oidc(self, provider):
258-
ca_cert = tempfile.NamedTemporaryFile(delete=True)
258+
config = Configuration()
259259

260-
if PY3:
261-
cert = base64.b64decode(
262-
provider['config']['idp-certificate-authority-data']
263-
).decode('utf-8')
264-
else:
265-
cert = base64.b64decode(
266-
provider['config']['idp-certificate-authority-data'] + "=="
267-
)
260+
if 'idp-certificate-authority-data' in provider['config']:
261+
ca_cert = tempfile.NamedTemporaryFile(delete=True)
268262

269-
with open(ca_cert.name, 'w') as fh:
270-
fh.write(cert)
263+
if PY3:
264+
cert = base64.b64decode(
265+
provider['config']['idp-certificate-authority-data']
266+
).decode('utf-8')
267+
else:
268+
cert = base64.b64decode(
269+
provider['config']['idp-certificate-authority-data'] + "=="
270+
)
271271

272-
config = Configuration()
273-
config.ssl_ca_cert = ca_cert.name
272+
with open(ca_cert.name, 'w') as fh:
273+
fh.write(cert)
274+
275+
config.ssl_ca_cert = ca_cert.name
276+
277+
else:
278+
config.verify_ssl = False
274279

275280
client = ApiClient(configuration=config)
276281

@@ -301,7 +306,7 @@ def _refresh_oidc(self, provider):
301306
refresh_token=provider['config']['refresh-token'],
302307
auth=(provider['config']['client-id'],
303308
provider['config']['client-secret']),
304-
verify=ca_cert.name
309+
verify=config.ssl_ca_cert if config.verify_ssl else None
305310
)
306311
except oauthlib.oauth2.rfc6749.errors.InvalidClientIdError:
307312
return

config/kube_config_test.py

+48
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,13 @@ class TestKubeConfigLoader(BaseTestCase):
373373
"user": "expired_oidc"
374374
}
375375
},
376+
{
377+
"name": "expired_oidc_nocert",
378+
"context": {
379+
"cluster": "default",
380+
"user": "expired_oidc_nocert"
381+
}
382+
},
376383
{
377384
"name": "user_pass",
378385
"context": {
@@ -519,6 +526,22 @@ class TestKubeConfigLoader(BaseTestCase):
519526
}
520527
}
521528
},
529+
{
530+
"name": "expired_oidc_nocert",
531+
"user": {
532+
"auth-provider": {
533+
"name": "oidc",
534+
"config": {
535+
"client-id": "tectonic-kubectl",
536+
"client-secret": "FAKE_SECRET",
537+
"id-token": TEST_OIDC_EXPIRED_LOGIN,
538+
"idp-issuer-url": "https://example.org/identity",
539+
"refresh-token":
540+
"lucWJjEhlxZW01cXI3YmVlcYnpxNGhzk"
541+
}
542+
}
543+
}
544+
},
522545
{
523546
"name": "user_pass",
524547
"user": {
@@ -649,6 +672,31 @@ def test_oidc_with_refresh(self, mock_ApiClient, mock_OAuth2Session):
649672
self.assertTrue(loader._load_oid_token())
650673
self.assertEqual("Bearer abc123", loader.token)
651674

675+
@mock.patch('kubernetes.config.kube_config.OAuth2Session.refresh_token')
676+
@mock.patch('kubernetes.config.kube_config.ApiClient.request')
677+
def test_oidc_with_refresh_nocert(self, mock_ApiClient, mock_OAuth2Session):
678+
mock_response = mock.MagicMock()
679+
type(mock_response).status = mock.PropertyMock(
680+
return_value=200
681+
)
682+
type(mock_response).data = mock.PropertyMock(
683+
return_value=json.dumps({
684+
"token_endpoint": "https://example.org/identity/token"
685+
})
686+
)
687+
688+
mock_ApiClient.return_value = mock_response
689+
690+
mock_OAuth2Session.return_value = {"id_token": "abc123",
691+
"refresh_token": "newtoken123"}
692+
693+
loader = KubeConfigLoader(
694+
config_dict=self.TEST_KUBE_CONFIG,
695+
active_context="expired_oidc_nocert",
696+
)
697+
self.assertTrue(loader._load_oid_token())
698+
self.assertEqual("Bearer abc123", loader.token)
699+
652700
def test_user_pass(self):
653701
expected = FakeConfig(host=TEST_HOST, token=TEST_BASIC_TOKEN)
654702
actual = FakeConfig()

0 commit comments

Comments
 (0)