Skip to content

Commit 0f1f395

Browse files
committed
Address comments.
1 parent 791ba1c commit 0f1f395

File tree

3 files changed

+173
-79
lines changed

3 files changed

+173
-79
lines changed

kubernetes/.swagger-codegen-ignore

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
.gitignore
22
git_push.sh
3-
# Remove this once https://github.com/swagger-api/swagger-codegen/pull/5629
4-
# is merged.
3+
# Remove this once swagger-codegen 2.2.3 is released and we update.
4+
# We want https://github.com/swagger-api/swagger-codegen/pull/5629
5+
# in the release.
56
src/main/java/io/kubernetes/client/ApiClient.java
67

Lines changed: 21 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
package io.kubernetes.client.util;
22

33
import io.kubernetes.client.ApiClient;
4-
import io.kubernetes.client.ApiException;
5-
import io.kubernetes.client.Configuration;
6-
import io.kubernetes.client.apis.CoreV1Api;
7-
import io.kubernetes.client.models.V1Pod;
8-
import io.kubernetes.client.models.V1PodList;
94

105
import java.io.BufferedReader;
116
import java.io.ByteArrayInputStream;
@@ -17,20 +12,11 @@
1712
import java.io.IOException;
1813
import java.io.Reader;
1914
import java.io.UnsupportedEncodingException;
20-
import java.security.KeyStoreException;
21-
import java.security.NoSuchAlgorithmException;
22-
import java.security.UnrecoverableKeyException;
23-
import java.security.cert.CertificateException;
24-
import java.util.ArrayList;
2515
import java.util.List;
26-
import java.util.Map;
2716

2817
import javax.net.ssl.KeyManager;
2918
import javax.net.ssl.KeyManagerFactory;
3019

31-
import org.yaml.snakeyaml.Yaml;
32-
import org.yaml.snakeyaml.constructor.SafeConstructor;
33-
3420
public class Config {
3521
private static final String SERVICEACCOUNT_ROOT =
3622
"/var/run/secrets/kubernetes.io/serviceaccount";
@@ -97,55 +83,16 @@ public static ApiClient fromConfig(InputStream stream) {
9783
}
9884

9985
public static ApiClient fromConfig(Reader input) {
100-
// Note to the reader: I considered creating a Config object
101-
// and parsing into that instead of using Maps, but honestly
102-
// this seemed cleaner than a bunch of boilerplate classes
103-
Yaml yaml = new Yaml(new SafeConstructor());
104-
Object config = yaml.load(input);
105-
Map<String, Object> configMap = (Map<String, Object>)config;
106-
107-
ArrayList<Object> clusters = (ArrayList<Object>)configMap.get("clusters");
108-
ArrayList<Object> contexts = (ArrayList<Object>)configMap.get("contexts");
109-
ArrayList<Object> users = (ArrayList<Object>)configMap.get("users");
110-
String currentContext = (String)configMap.get("current-context");
111-
112-
Map<String, Object> contextMap = findObject(contexts, currentContext);
113-
if (contextMap == null) {
114-
return null;
115-
}
116-
contextMap = (Map<String, Object>)contextMap.get("context");
117-
118-
String user = (String)contextMap.get("user");
119-
String cluster = (String)contextMap.get("cluster");
120-
121-
Map<String, Object> clusterMap = findObject(clusters, cluster);
122-
if (clusterMap == null) {
123-
return null;
124-
}
125-
clusterMap = (Map<String, Object>)clusterMap.get("cluster");
126-
127-
Map<String, Object> userMap = findObject(users, user);
128-
if (user == null) {
129-
return null;
130-
}
131-
userMap = (Map<String, Object>)userMap.get("user");
132-
133-
String server = (String) clusterMap.get("server");
134-
String caCert = (String) clusterMap.get("certificate-authority-data");
135-
String caCertFile = (String) clusterMap.get("certificate-authority");
136-
86+
KubeConfig config = KubeConfig.loadKubeConfig(input);
13787
ApiClient client = new ApiClient();
138-
client.setBasePath(server);
139-
140-
String clientCertificate = (String) userMap.get("client-certificate");
141-
String clientCertificateData = (String) userMap.get("client-certificate-data");
142-
String clientKey = (String) userMap.get("client-key");
143-
String clientKeyData = (String) userMap.get("client-key-data");
88+
client.setBasePath(config.getServer());
14489

14590
try {
14691
KeyManager[] mgrs = SSLUtils.keyManagers(
147-
clientCertificateData, clientCertificate,
148-
clientKeyData, clientKey,
92+
config.getClientCertificateData(),
93+
config.getClientCertificateFile(),
94+
config.getClientKeyData(),
95+
config.getClientKeyFile(),
14996
"RSA", "",
15097
null, null);
15198
client.setKeyManagers(mgrs);
@@ -157,6 +104,8 @@ public static ApiClient fromConfig(Reader input) {
157104
// consumes the CA cert, so if we do this before the client certs
158105
// are injected the cert input stream is exhausted and things get
159106
// grumpy'
107+
String caCert = config.getCertificateAuthorityData();
108+
String caCertFile = config.getCertificateAuthorityFile();
160109
if (caCert != null) {
161110
try {
162111
client.setSslCaCert(new ByteArrayInputStream(caCert.getBytes("UTF-8")));
@@ -171,26 +120,21 @@ public static ApiClient fromConfig(Reader input) {
171120
}
172121
}
173122

174-
Object authProvider = userMap.get("auth-provider");
175-
if (authProvider != null) {
176-
Map<String, Object> authProviderMap = (Map<String, Object>) authProvider;
177-
Map<String, Object> authConfig = (Map<String, Object>) authProviderMap.get("config");
178-
if (authConfig != null) {
179-
String token = (String) authConfig.get("access-token");
180-
client.setAccessToken(token);
181-
}
123+
String token = config.getAccessToken();
124+
if (token != null) {
125+
client.setAccessToken(token);
182126
}
183127

184-
return client;
185-
}
128+
String username = config.getUsername();
129+
if (username != null) {
130+
client.setUsername(username);
131+
}
186132

187-
private static Map<String, Object> findObject(ArrayList<Object> list, String name) {
188-
for (Object obj : list) {
189-
Map<String, Object> map = (Map<String, Object>)obj;
190-
if (name.equals((String)map.get("name"))) {
191-
return map;
192-
}
133+
String password = config.getPassword();
134+
if (password != null) {
135+
client.setPassword(password);
193136
}
194-
return null;
137+
138+
return client;
195139
}
196-
}
140+
}
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package io.kubernetes.client.util;
2+
3+
import java.io.File;
4+
import java.io.FileNotFoundException;
5+
import java.io.FileReader;
6+
import java.io.Reader;
7+
import java.util.ArrayList;
8+
import java.util.Map;
9+
10+
import org.yaml.snakeyaml.Yaml;
11+
import org.yaml.snakeyaml.constructor.SafeConstructor;
12+
13+
/**
14+
* KubeConfig represents a kubernetes client configuration
15+
*/
16+
public class KubeConfig {
17+
// Note to the reader: I considered creating a Config object
18+
// and parsing into that instead of using Maps, but honestly
19+
// this seemed cleaner than a bunch of boilerplate classes
20+
21+
private ArrayList<Object> clusters;
22+
private ArrayList<Object> contexts;
23+
private ArrayList<Object> users;
24+
Map<String, Object> currentContext;
25+
Map<String, Object> currentCluster;
26+
Map<String, Object> currentUser;
27+
28+
/**
29+
* Load a Kubernetes config from the default location
30+
*/
31+
public static KubeConfig loadDefaultKubeConfig() throws FileNotFoundException {
32+
File homeDir = new File(System.getenv("HOME"));
33+
File config = new File(new File(homeDir, ".kube"), "config");
34+
return loadKubeConfig(new FileReader(config));
35+
}
36+
37+
/**
38+
* Load a Kubernetes config from a Reader
39+
*/
40+
public static KubeConfig loadKubeConfig(Reader input) {
41+
Yaml yaml = new Yaml(new SafeConstructor());
42+
Object config = yaml.load(input);
43+
Map<String, Object> configMap = (Map<String, Object>)config;
44+
45+
String currentContext = (String)configMap.get("current-context");
46+
ArrayList<Object> contexts = (ArrayList<Object>)configMap.get("contexts");
47+
ArrayList<Object> clusters = (ArrayList<Object>)configMap.get("clusters");
48+
ArrayList<Object> users = (ArrayList<Object>)configMap.get("users");
49+
50+
KubeConfig kubeConfig = new KubeConfig(contexts, clusters, users);
51+
kubeConfig.setContext(currentContext);
52+
53+
return kubeConfig;
54+
}
55+
56+
public KubeConfig(ArrayList<Object> contexts,
57+
ArrayList<Object> clusters,
58+
ArrayList<Object> users) {
59+
this.contexts = contexts;
60+
this.clusters = clusters;
61+
this.users = users;
62+
}
63+
64+
public void setContext(String context) {
65+
currentCluster = null;
66+
currentUser = null;
67+
currentContext = (Map<String, Object>) findObject(contexts, context).get("context");
68+
if (currentContext == null) {
69+
return;
70+
}
71+
String cluster = (String) currentContext.get("cluster");
72+
String user = (String) currentContext.get("user");
73+
74+
if (cluster != null) {
75+
currentCluster = (Map<String, Object>) findObject(clusters, cluster).get("cluster");
76+
}
77+
if (user != null) {
78+
currentUser = (Map<String, Object>) findObject(users, user).get("user");
79+
}
80+
}
81+
82+
public String getServer() {
83+
return getData(currentCluster, "server");
84+
}
85+
86+
public String getCertificateAuthorityData() {
87+
return getData(currentCluster, "certificate-authority-data");
88+
}
89+
90+
public String getCertificateAuthorityFile() {
91+
return getData(currentCluster, "certificate-authority");
92+
}
93+
94+
public String getClientCertificateFile() {
95+
return getData(currentUser, "client-certificate");
96+
}
97+
98+
public String getClientCertificateData() {
99+
return getData(currentUser, "client-certificate-data");
100+
}
101+
102+
public String getClientKeyFile() {
103+
return getData(currentUser, "client-key");
104+
}
105+
106+
public String getClientKeyData() {
107+
return getData(currentUser, "client-key-data");
108+
}
109+
110+
public String getUsername() {
111+
return getData(currentUser, "username");
112+
}
113+
114+
public String getPassword() {
115+
return getData(currentUser, "password");
116+
}
117+
118+
public String getAccessToken() {
119+
if (currentUser == null) {
120+
return null;
121+
}
122+
Object authProvider = currentUser.get("auth-provider");
123+
if (authProvider != null) {
124+
Map<String, Object> authProviderMap = (Map<String, Object>) authProvider;
125+
Map<String, Object> authConfig = (Map<String, Object>) authProviderMap.get("config");
126+
if (authConfig != null) {
127+
return (String) authConfig.get("access-token");
128+
}
129+
}
130+
return null;
131+
}
132+
133+
private static String getData(Map<String, Object> obj, String key) {
134+
if (obj == null) {
135+
return null;
136+
}
137+
return (String) obj.get(key);
138+
}
139+
140+
private static Map<String, Object> findObject(ArrayList<Object> list, String name) {
141+
for (Object obj : list) {
142+
Map<String, Object> map = (Map<String, Object>)obj;
143+
if (name.equals((String)map.get("name"))) {
144+
return map;
145+
}
146+
}
147+
return null;
148+
}
149+
}

0 commit comments

Comments
 (0)