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

Commit b67735c

Browse files
committed
Mock out oidc refresh
1 parent e62a87a commit b67735c

File tree

2 files changed

+91
-1
lines changed

2 files changed

+91
-1
lines changed

config/kube_config.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ def _refresh_oidc(self, provider):
310310
except oauthlib.oauth2.rfc6749.errors.InvalidClientIdError:
311311
return
312312

313-
provider.value['id-token'] = refresh['id_token']
313+
provider['config'].value['id-token'] = refresh['id_token']
314314

315315
def _load_user_pass_token(self):
316316
if 'username' in self._user and 'password' in self._user:

config/kube_config_test.py

+90
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414

1515
import base64
1616
import datetime
17+
import json
1718
import os
1819
import shutil
1920
import tempfile
2021
import unittest
2122

23+
import mock
2224
import yaml
2325
from six import PY3
2426

@@ -74,6 +76,47 @@ def _raise_exception(st):
7476

7577
TEST_OIDC_TOKEN = "Bearer %s" % TEST_OIDC_LOGIN
7678

79+
TEST_OIDC_EXPIRED_LOGIN = (
80+
"eyJhbGciOiJSUzI1NiIsImtpZCI6ImVmM2Y0NjIxODhiNjhhMzY2YjQ1MWE0YjkwY2UxYjYyY"
81+
"mEyYzliNDkifQ.eyJpc3MiOiJodHRwczovL2V4YW1wbGUudXMtd2VzdC0xLmF3cy5uZXQvaWR"
82+
"lbnRpdHkiLCJzdWIiOiJBQUFBQUFBQUFBQUEiLCJhdWQiOiJ0ZWN0b25pYy1rdWJlY3RsIiwi"
83+
"ZXhwIjo1MzY0NTc2MDAsImlhdCI6NTM2NDU3NjAwLCJhdF9oYXNoIjoiWFhYWFhYX1hYWFhYW"
84+
"FgiLCJlbWFpbCI6ImRhbWlhbi5teWVyc2NvdWdoQGdtYWlsLmNvbSIsImVtYWlsX3ZlcmlmaW"
85+
"VkIjp0cnVlLCJncm91cHMiOlsidGVhbS1pbmZyYSJdLCJuYW1lIjoiRGFtaWFuIE15ZXJzY29"
86+
"1Z2gifQ==.BZwpd0_hKYMIaYRj88QjPTrg8JFtaiyVXOqLgKkJHBVzivdzs9JjM9jvV3qzj2D"
87+
"UwaeGeAZqxlbmwEXXePU-jFg70HGo7FDq4G29x516XNZWW2BaelcevFPspcIJTQ92VhYZvCiW"
88+
"p8r7SmhZ1TSss3nmuDHn3FTdasqUm22LJOqCfCDaOOf_Uq3uP0zHj4UHJAqvgMfw1j5tZXTYJ"
89+
"613vGGPkCz_K1Jnv6YIxVVnuZM3PyNNdSXQl5_GM01Zf5wJCgqMdRZ01ZrWhOda6wzlKrh7TC"
90+
"lbW12_vMo56aOj9HOAjhKyjcbLHjIWAWqmt3nmhwkzf8sYc9-WpscPTNalsQ"
91+
)
92+
93+
TEST_OIDC_CA = (
94+
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURoVENDQW0yZ0F3SUJBZ0lSQUt0elJOd"
95+
"2J0M3dyVWlobVROYklheU13RFFZSktvWklodmNOQVFFTEJRQXcKWERFSk1BY0dBMVVFQmhNQU"
96+
"1Ra3dCd1lEVlFRSUV3QXhDVEFIQmdOVkJBY1RBREVKTUFjR0ExVUVFUk1BTVJFdwpEd1lEVlF"
97+
"RS0V3aGliMjkwYTNWaVpURUpNQWNHQTFVRUN4TUFNUkF3RGdZRFZRUURFd2RyZFdKbExXTmhN"
98+
"QjRYCkRURTNNRGN4TWpJeE16TTBNVm9YRFRFNE1EY3hNakl4TXpNME1Wb3dYREVKTUFjR0ExV"
99+
"UVCaE1BTVFrd0J3WUQKVlFRSUV3QXhDVEFIQmdOVkJBY1RBREVKTUFjR0ExVUVFUk1BTVJFd0"
100+
"R3WURWUVFLRXdoaWIyOTBhM1ZpWlRFSgpNQWNHQTFVRUN4TUFNUkF3RGdZRFZRUURFd2RyZFd"
101+
"KbExXTmhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUF1KzJn"
102+
"VEtKc2NNKzgwdDlLNE9PTU1JSDhXeU1aLzZiUFBtbFU2WE0zVUhLa2tLVW0KbStkd3hraXI4e"
103+
"URRQ1pTNERWam9vUXVodzJTNWY0dk80ZENncGg3Rmt6LzBZcUVNcDRzblFwQmVUVGw3ZEJLSw"
104+
"pRNitFelVQdGZjaUZtemNBbUtXN292bUV5K2plSW1QQjYyMTY4WVJYcTFNaHFqZCtsVTJGaFB"
105+
"SVzNXZEtHRnp0Ck1Pa2o5amRqaGd4cTNDZmRTSGk3ejdidVVYbm5WQnNuaEFCamlvOGFuK3M1"
106+
"ZVBJOUVBNExJZk8zQldMZHdWejQKdThGQU91eExxSXBja2VKejNXSW5MUURXcWpFZkhUWVA2U"
107+
"TlaMzA3MGxhMnVGWkNuY3pkbFh6V0haQmNuSUlscwp0VXZnVmhxbUNQRzlGLzBrWFhpYWQwUG"
108+
"kvYUYzSXFOYUphOEViUUlEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFCkJBTUNBcVF3RHdZRFZ"
109+
"SMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVL1hCYlNUMWJ3VXczT1VpVHlmN2MKMzJR"
110+
"Q3B4c3dEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSGdqelpINkx3cGF3eXlMWmVKTUZOcFdMY"
111+
"Ws4RThHMApPcmlka3dESWhoWjVCQ0ZLSEdIZE82T1ZQTk1ZcWt6TzJpUzhyOFhNWjN3OExqMW"
112+
"M2UVF4VzhJNG8wdDhJWDNnCkNnRTNhOXR1bjNRNC96cnVlNU5EUWp2MVMrR1V5QW12c2p5Z1N"
113+
"FS3VFVXRHVkxwTlhYemlDN0lSMG41MHBpZnQKZ1JJVzFQOThUcTROYzVMaVluNTJXTnJwUnFo"
114+
"WllNays5SWJiSGZZN3Y3VkY3eEJVSDJlWGFiMGViM2lCR09OUgorVTc2ZG5NRDNrbUs2dGpnU"
115+
"UVCWnUwRTVVTnJZRlUvclZEYjVYb1dXYjEyMFhSYUZSWGRZV1ZreWFYQW0vc3EwCkRaUEZKTT"
116+
"dvU1JZcGNKSWlYZExPamYyT1VQNzI1LzVtRDJpd3FGbTJ0V3BjMkdTbjlvWGZseGs9Ci0tLS0"
117+
"tRU5EIENFUlRJRklDQVRFLS0tLS0K"
118+
)
119+
77120
TEST_SSL_HOST = "https://test-host"
78121
TEST_CERTIFICATE_AUTH = "cert-auth"
79122
TEST_CERTIFICATE_AUTH_BASE64 = _base64(TEST_CERTIFICATE_AUTH)
@@ -340,6 +383,13 @@ class TestKubeConfigLoader(BaseTestCase):
340383
"user": "oidc"
341384
}
342385
},
386+
{
387+
"name": "expired_oidc",
388+
"context": {
389+
"cluster": "default",
390+
"user": "expired_oidc"
391+
}
392+
},
343393
{
344394
"name": "user_pass",
345395
"context": {
@@ -468,6 +518,22 @@ class TestKubeConfigLoader(BaseTestCase):
468518
}
469519
}
470520
},
521+
{
522+
"name": "expired_oidc",
523+
"user": {
524+
"auth-provider": {
525+
"name": "oidc",
526+
"config": {
527+
"client-id": "tectonic-kubectl",
528+
"client-secret": "FAKE_SECRET",
529+
"id-token": TEST_OIDC_EXPIRED_LOGIN,
530+
"idp-certificate-authority-data": TEST_OIDC_CA,
531+
"idp-issuer-url": "https://example.org/identity",
532+
"refresh-token": "lucWJjEhlxZW01cXI3YmVlcYnpxNGhzk"
533+
}
534+
}
535+
}
536+
},
471537
{
472538
"name": "user_pass",
473539
"user": {
@@ -573,6 +639,30 @@ def test_oidc_no_refresh(self):
573639
self.assertTrue(loader._load_oid_token())
574640
self.assertEqual(TEST_OIDC_TOKEN, loader.token)
575641

642+
@mock.patch('config.kube_config.OAuth2Session.refresh_token')
643+
@mock.patch('config.kube_config.ApiClient.request')
644+
def test_oidc_with_refresh(self, mock_ApiClient, mock_OAuth2Session):
645+
mock_response = mock.MagicMock()
646+
type(mock_response).status = mock.PropertyMock(
647+
return_value=200
648+
)
649+
type(mock_response).data = mock.PropertyMock(
650+
return_value=json.dumps({
651+
"token_endpoint": "https://example.org/identity/token"
652+
})
653+
)
654+
655+
mock_ApiClient.return_value = mock_response
656+
657+
mock_OAuth2Session.return_value = {"id_token": "abc123"}
658+
659+
loader = KubeConfigLoader(
660+
config_dict=self.TEST_KUBE_CONFIG,
661+
active_context="expired_oidc",
662+
)
663+
self.assertTrue(loader._load_oid_token())
664+
self.assertEqual("Bearer abc123", loader.token)
665+
576666
def test_user_pass(self):
577667
expected = FakeConfig(host=TEST_HOST, token=TEST_BASIC_TOKEN)
578668
actual = FakeConfig()

0 commit comments

Comments
 (0)