Skip to content

Commit 52b65f8

Browse files
authored
Merge pull request #465 from brendandburns/auth_test
Improve auth tests, fix a bug in credential parsing
2 parents e750b98 + a5dd34a commit 52b65f8

File tree

3 files changed

+113
-2
lines changed

3 files changed

+113
-2
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
language: java
2+
script: mvn -q test -B
23
after_success:
34
- mvn deploy --settings settings.xml -DskipTests=true -B

util/src/main/java/io/kubernetes/client/util/authenticators/GCPAuthenticator.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313
package io.kubernetes.client.util.authenticators;
1414

1515
import io.kubernetes.client.util.KubeConfig;
16+
import java.time.Instant;
1617
import java.util.Date;
1718
import java.util.Map;
19+
import org.slf4j.Logger;
20+
import org.slf4j.LoggerFactory;
1821

1922
/**
2023
* The Authenticator interface represents a plugin that can handle a specific type of authentication
@@ -25,6 +28,8 @@ public class GCPAuthenticator implements Authenticator {
2528
KubeConfig.registerAuthenticator(new GCPAuthenticator());
2629
}
2730

31+
private static final Logger log = LoggerFactory.getLogger(GCPAuthenticator.class);
32+
2833
@Override
2934
public String getName() {
3035
return "gcp";
@@ -37,8 +42,18 @@ public String getToken(Map<String, Object> config) {
3742

3843
@Override
3944
public boolean isExpired(Map<String, Object> config) {
40-
Date expiry = (Date) config.get("expiry");
41-
return (expiry != null && expiry.compareTo(new Date()) <= 0);
45+
Object expiryObj = config.get("expiry");
46+
Instant expiry = null;
47+
if (expiryObj instanceof Date) {
48+
expiry = ((Date) expiryObj).toInstant();
49+
} else if (expiryObj instanceof Instant) {
50+
expiry = (Instant) expiryObj;
51+
} else if (expiryObj instanceof String) {
52+
expiry = Instant.parse((String) expiryObj);
53+
} else {
54+
throw new RuntimeException("Unexpected object type: " + expiryObj.getClass());
55+
}
56+
return (expiry != null && expiry.compareTo(Instant.now()) <= 0);
4257
}
4358

4459
@Override

util/src/test/java/io/kubernetes/client/util/KubeConfigTest.java

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import static org.junit.Assert.*;
1616

17+
import io.kubernetes.client.util.authenticators.Authenticator;
1718
import io.kubernetes.client.util.authenticators.AzureActiveDirectoryAuthenticator;
1819
import io.kubernetes.client.util.authenticators.GCPAuthenticator;
1920
import java.io.File;
@@ -22,6 +23,7 @@
2223
import java.io.IOException;
2324
import java.io.StringReader;
2425
import java.nio.file.Files;
26+
import java.util.Map;
2527
import org.junit.Rule;
2628
import org.junit.Test;
2729
import org.junit.rules.TemporaryFolder;
@@ -106,6 +108,45 @@ public void testGCPAuthProvider() {
106108
}
107109
}
108110

111+
private static String GCP_TEST_DATE_STRING =
112+
"apiVersion: v1\n"
113+
+ "contexts:\n"
114+
+ "- context:\n"
115+
+ " user: gke-cluster\n"
116+
+ " name: foo-context\n"
117+
+ "current-context: foo-context\n"
118+
+ "users:\n"
119+
+ "- name: gke-cluster\n"
120+
+ " user:\n"
121+
+ " auth-provider:\n"
122+
+ " config:\n"
123+
+ " access-token: fake-token\n"
124+
+ " cmd-args: config config-helper --format=json\n"
125+
+ " cmd-path: /usr/lib/google-cloud-sdk/bin/gcloud\n"
126+
+ " expiry: \"2117-06-22T18:27:02Z\"\n"
127+
+ " expiry-key: '{.credential.token_expiry}'\n"
128+
+ " token-key: '{.credential.access_token}'\n"
129+
+ " name: gcp\n";
130+
131+
@Test
132+
public void testGCPAuthProviderStringDate() {
133+
KubeConfig.registerAuthenticator(new GCPAuthenticator());
134+
135+
try {
136+
File config = folder.newFile("config");
137+
FileWriter writer = new FileWriter(config);
138+
writer.write(GCP_TEST_DATE_STRING);
139+
writer.flush();
140+
writer.close();
141+
142+
KubeConfig kc = KubeConfig.loadKubeConfig(new FileReader(config));
143+
assertEquals("fake-token", kc.getAccessToken());
144+
} catch (Exception ex) {
145+
ex.printStackTrace();
146+
fail("Unexpected exception: " + ex);
147+
}
148+
}
149+
109150
@Test
110151
public void testGCPAuthProviderExpiredToken() {
111152
String gcpConfigExpiredToken =
@@ -178,4 +219,58 @@ public void testNullNamespace() {
178219
KubeConfig config = KubeConfig.loadKubeConfig(new StringReader(GCP_CONFIG));
179220
assertNull(config.getNamespace());
180221
}
222+
223+
class FakeAuthenticator implements Authenticator {
224+
public String token;
225+
public String refresh;
226+
public boolean expired;
227+
228+
public String getName() {
229+
return "fake";
230+
}
231+
232+
public String getToken(Map<String, Object> config) {
233+
return (String) config.get("access-token");
234+
}
235+
236+
public boolean isExpired(Map<String, Object> config) {
237+
return expired;
238+
}
239+
240+
public Map<String, Object> refresh(Map<String, Object> config) {
241+
config.put("access-token", token);
242+
config.put("refresh-token", refresh);
243+
return config;
244+
}
245+
}
246+
247+
public static String KUBECONFIG_FAKE =
248+
"apiVersion: v1\n"
249+
+ "contexts:\n"
250+
+ "- context:\n"
251+
+ " user: fake-cluster\n"
252+
+ " name: foo-context\n"
253+
+ "current-context: foo-context\n"
254+
+ "users:\n"
255+
+ "- name: fake-cluster\n"
256+
+ " user:\n"
257+
+ " auth-provider:\n"
258+
+ " config:\n"
259+
+ " access-token: fake-token\n"
260+
+ " name: fake\n";
261+
262+
@Test
263+
public void testRefreshToken() {
264+
FakeAuthenticator fake = new FakeAuthenticator();
265+
KubeConfig.registerAuthenticator(fake);
266+
267+
KubeConfig config = KubeConfig.loadKubeConfig(new StringReader(KUBECONFIG_FAKE));
268+
269+
fake.expired = true;
270+
fake.token = "someNewToken";
271+
fake.refresh = "refreshToken";
272+
273+
String token = config.getAccessToken();
274+
assertEquals(token, fake.token);
275+
}
181276
}

0 commit comments

Comments
 (0)