Skip to content

Commit ac7c1b5

Browse files
committed
Add CredentialProvider concept
1 parent bf764a4 commit ac7c1b5

File tree

7 files changed

+121
-127
lines changed

7 files changed

+121
-127
lines changed

util/src/main/java/io/kubernetes/client/util/ConfigBuilder.java

Lines changed: 11 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
*/
1313
package io.kubernetes.client.util;
1414

15+
import io.kubernetes.client.util.credentials.CredentialProvider;
1516
import java.io.ByteArrayInputStream;
1617
import java.io.File;
1718
import java.io.FileInputStream;
@@ -40,42 +41,17 @@ public class ConfigBuilder {
4041
private boolean defaultClientMode = false;
4142
private boolean verifyingSsl = false;
4243
private String basePath = null;
43-
private File certificateAuthorityFile = null;
44-
private String certificateAuthorityData = null;
45-
private String apiKey = null;
46-
private String userName = null;
47-
private String password = null;
48-
private KeyManager[] keyMgrs = null;
49-
private String accessToken = null;
50-
private String apiKeyPrefix = null;
51-
private KubeConfig kubeConfig = null;
44+
private KubeConfig kubeConfig;
45+
private CredentialProvider credentialProvider;
5246

5347
private static final Logger log = Logger.getLogger(Config.class);
5448

55-
public String getUserName() {
56-
return userName;
49+
public CredentialProvider getCredentialProvider() {
50+
return credentialProvider;
5751
}
5852

59-
public ConfigBuilder setUserName(String userName) {
60-
this.userName = userName;
61-
return this;
62-
}
63-
64-
public String getPassword() {
65-
return password;
66-
}
67-
68-
public ConfigBuilder setPassword(String password) {
69-
this.password = password;
70-
return this;
71-
}
72-
73-
public String getApiKey() {
74-
return apiKey;
75-
}
76-
77-
public ConfigBuilder setApiKey(String apiKey) {
78-
this.apiKey = apiKey;
53+
public ConfigBuilder setCredentialProvider(final CredentialProvider credentialProvider) {
54+
this.credentialProvider = credentialProvider;
7955
return this;
8056
}
8157

@@ -88,26 +64,6 @@ public ConfigBuilder setBasePath(String basePath) {
8864
return this;
8965
}
9066

91-
public File getCertificateAuthorityFile() {
92-
return certificateAuthorityFile;
93-
}
94-
95-
public ConfigBuilder setCertificateAuthority(File certificateAuthorityFile) {
96-
this.certificateAuthorityFile = certificateAuthorityFile;
97-
this.verifyingSsl = true;
98-
return this;
99-
}
100-
101-
public String getCertificateAuthorityData() {
102-
return certificateAuthorityData;
103-
}
104-
105-
public ConfigBuilder setCertificateAuthority(String certificateAuthorityData) {
106-
this.certificateAuthorityData = certificateAuthorityData;
107-
this.verifyingSsl = true;
108-
return this;
109-
}
110-
11167
public ConfigBuilder setClusterMode() {
11268
this.clusterMode = true;
11369
return this;
@@ -138,15 +94,6 @@ public ConfigBuilder setKubeConfig(InputStream stream) {
13894
return this;
13995
}
14096

141-
public KeyManager[] getKeyMgrs() {
142-
return keyMgrs;
143-
}
144-
145-
public ConfigBuilder setKeyMgrs(KeyManager[] keyMgrs) {
146-
this.keyMgrs = keyMgrs;
147-
return this;
148-
}
149-
15097
public boolean isVerifyingSsl() {
15198
return verifyingSsl;
15299
}
@@ -165,15 +112,6 @@ public ConfigBuilder setDefaultClientMode() {
165112
return this;
166113
}
167114

168-
public String getApiKeyPrefix() {
169-
return apiKeyPrefix;
170-
}
171-
172-
public ConfigBuilder setApiKeyPrefix(String apiKeyPrefix) {
173-
this.apiKeyPrefix = apiKeyPrefix;
174-
return this;
175-
}
176-
177115
public ApiClient build() {
178116
ApiClient client = new ApiClient();
179117

@@ -197,7 +135,7 @@ public ApiClient build() {
197135
}
198136
}
199137

200-
if(defaultClientMode ==true ) {
138+
if(defaultClientMode ==true) {
201139
try {
202140
client = Config.defaultClient();
203141
} catch (IOException e) {
@@ -216,57 +154,13 @@ public ApiClient build() {
216154
}
217155
}
218156

219-
if(keyMgrs != null) {
220-
client.setKeyManagers(keyMgrs);
221-
}
222-
223-
if(userName != null){
224-
client.setUsername(userName);
225-
}
226-
227-
if(password != null){
228-
client.setPassword(password);
229-
}
230-
231-
if(( userName != null )&&(password != null)) {
232-
final String usernameAndPassword = userName + ":" + password;
233-
client.setApiKeyPrefix("Basic");
234-
client.setApiKey(ByteString.of(usernameAndPassword.getBytes(Charset.forName("ISO-8859-1"))).base64());
235-
}
236-
237-
if(accessToken != null) {
238-
if (apiKeyPrefix == null){
239-
client.setApiKeyPrefix("Bearer");
240-
}
241-
client.setAccessToken(accessToken);
242-
}
243-
244-
if(apiKeyPrefix != null) {
245-
client.setApiKeyPrefix(apiKeyPrefix);
246-
}
247-
248-
if(apiKey != null) {
249-
if (apiKeyPrefix == null){
250-
client.setApiKeyPrefix("Bearer");
251-
}
252-
client.setApiKey(apiKey);
253-
}
254-
255157
client.setVerifyingSsl(verifyingSsl);
256158

257-
if(certificateAuthorityFile != null) {
258-
try {
259-
client.setSslCaCert(new FileInputStream(certificateAuthorityFile));
260-
} catch (FileNotFoundException e) {
261-
log.error("Unable to find the file", e);
262-
}
263-
}
264-
265-
if(certificateAuthorityData != null) {
266-
byte[] bytes = Base64.decodeBase64(certificateAuthorityData);
267-
client.setSslCaCert(new ByteArrayInputStream(bytes));
159+
if (credentialProvider != null) {
160+
credentialProvider.provide(client);
268161
}
269162

270163
return client;
271164
}
165+
272166
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.kubernetes.client.util.credentials;
2+
3+
import io.kubernetes.client.ApiClient;
4+
5+
public class ApiKeyCredentialProvider implements CredentialProvider {
6+
7+
private String accessToken;
8+
9+
public ApiKeyCredentialProvider(final String accessToken) {
10+
this.accessToken = accessToken;
11+
}
12+
13+
@Override public void provide(ApiClient client) {
14+
client.setApiKeyPrefix("Bearer");
15+
client.setApiKey(accessToken);
16+
}
17+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package io.kubernetes.client.util.credentials;
2+
3+
import io.kubernetes.client.ApiClient;
4+
import java.io.ByteArrayInputStream;
5+
import java.io.File;
6+
import java.io.FileInputStream;
7+
import java.io.FileNotFoundException;
8+
import java.io.InputStream;
9+
import javax.net.ssl.KeyManager;
10+
import org.apache.commons.codec.binary.Base64;
11+
import org.apache.log4j.Logger;
12+
13+
public class CertificateAuthorityCredentialProvider implements CredentialProvider {
14+
private static final Logger log = Logger.getLogger(CertificateAuthorityCredentialProvider.class);
15+
16+
private KeyManager[] keyManagers;
17+
private InputStream inputStream;
18+
19+
public CertificateAuthorityCredentialProvider(final KeyManager[] keyManagers, final File caFile) {
20+
this.keyManagers = keyManagers;
21+
try {
22+
this.inputStream = new FileInputStream(caFile);
23+
} catch(final FileNotFoundException e) {
24+
log.error("Unable to find Certificate Authority file", e);
25+
}
26+
}
27+
28+
public CertificateAuthorityCredentialProvider(final KeyManager[] keyManagers, final String caData) {
29+
this.keyManagers = keyManagers;
30+
this.inputStream = new ByteArrayInputStream(Base64.decodeBase64(caData));
31+
}
32+
33+
@Override public void provide(ApiClient client) {
34+
client.setSslCaCert(inputStream);
35+
client.setKeyManagers(keyManagers);
36+
client.setVerifyingSsl(true);
37+
}
38+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.kubernetes.client.util.credentials;
2+
3+
import io.kubernetes.client.ApiClient;
4+
5+
public interface CredentialProvider {
6+
7+
void provide(final ApiClient client);
8+
9+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.kubernetes.client.util.credentials;
2+
3+
import io.kubernetes.client.ApiClient;
4+
import javax.net.ssl.KeyManager;
5+
6+
public class KeyManagerCredentialProvider implements CredentialProvider{
7+
8+
private KeyManager[] keyManagers;
9+
10+
public KeyManagerCredentialProvider(final KeyManager[] keyManagers) {
11+
this.keyManagers = keyManagers;
12+
}
13+
14+
@Override public void provide(ApiClient client) {
15+
client.setKeyManagers(keyManagers);
16+
}
17+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.kubernetes.client.util.credentials;
2+
3+
import io.kubernetes.client.ApiClient;
4+
import java.nio.charset.Charset;
5+
import okio.ByteString;
6+
7+
public class UsernamePasswordProvider implements CredentialProvider {
8+
private final String username;
9+
private final String password;
10+
11+
public UsernamePasswordProvider(final String username, final String password) {
12+
this.username = username;
13+
this.password = password;
14+
}
15+
16+
@Override public void provide(ApiClient client) {
17+
final String usernameAndPassword = username + ":" + password;
18+
client.setApiKeyPrefix("Basic");
19+
client.setApiKey(ByteString.of(usernameAndPassword.getBytes(Charset.forName("ISO-8859-1"))).base64());
20+
}
21+
}

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

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
import static org.junit.Assert.assertEquals;
1616
import static org.junit.Assert.fail;
1717

18+
import io.kubernetes.client.util.credentials.ApiKeyCredentialProvider;
19+
import io.kubernetes.client.util.credentials.CertificateAuthorityCredentialProvider;
20+
import io.kubernetes.client.util.credentials.UsernamePasswordProvider;
1821
import java.io.File;
19-
import java.io.FileNotFoundException;
2022
import java.io.FileWriter;
2123
import java.io.IOException;
2224
import java.nio.charset.Charset;
@@ -166,8 +168,7 @@ public void testUserNamePasswordConfigBuilder() {
166168
try {
167169
ApiClient client = (new ConfigBuilder())
168170
.setBasePath(basePath)
169-
.setUserName(userName)
170-
.setPassword(password)
171+
.setCredentialProvider(new UsernamePasswordProvider(userName, password))
171172
.build();
172173
assertEquals(userName, ((io.kubernetes.client.auth.HttpBasicAuth)client.getAuthentication("BasicAuth")).getUsername());
173174
assertEquals(password, ((io.kubernetes.client.auth.HttpBasicAuth)client.getAuthentication("BasicAuth")).getPassword());
@@ -187,8 +188,7 @@ public void testApiKeyConfigbuilder() {
187188
ApiClient client = null;
188189
client = (new ConfigBuilder())
189190
.setBasePath(basePath)
190-
.setApiKeyPrefix(apiKeyPrefix)
191-
.setApiKey(apiKey)
191+
.setCredentialProvider(new ApiKeyCredentialProvider(apiKey))
192192
.build();
193193
assertEquals(basePath, client.getBasePath());
194194
assertEquals(false, client.isVerifyingSsl());
@@ -205,9 +205,7 @@ public void testKeyMgrANDCertConfigBUilder() {
205205
//by default verify ssl is false
206206
ApiClient client = (new ConfigBuilder())
207207
.setBasePath(basePath)
208-
.setKeyMgrs(keyMgrs)
209-
.setCertificateAuthority(certificateAuthorityData)
210-
.setVerifyingSsl(true)
208+
.setCredentialProvider(new CertificateAuthorityCredentialProvider(keyMgrs, certificateAuthorityData))
211209
.build();
212210
assertEquals(basePath, client.getBasePath());
213211
assertEquals(true, client.isVerifyingSsl());
@@ -224,7 +222,7 @@ public void testBasePathIllegalArgumentException() throws IOException {
224222
ApiClient client = null ;
225223
try {
226224
client = (new ConfigBuilder())
227-
.setUserName("user")
225+
.setCredentialProvider(new UsernamePasswordProvider(userName, null))
228226
.build();
229227
}
230228
catch(IllegalArgumentException ie) {
@@ -233,7 +231,7 @@ public void testBasePathIllegalArgumentException() throws IOException {
233231
environmentVariables.set("HOME", "/non-existent");
234232
client = (new ConfigBuilder())
235233
.setDefaultClientMode()
236-
.setUserName("user")
234+
.setCredentialProvider(new UsernamePasswordProvider(userName, null))
237235
.build();
238236
assertEquals("http://localhost:8080", client.getBasePath());
239237
environmentVariables.set("KUBECONFIG", configFile.getCanonicalPath());

0 commit comments

Comments
 (0)