Skip to content

Commit ab0cc1e

Browse files
Merge pull request #24 from bdpiparva/help-text-update-and-ui-fix
Build kubernetes client config with namespace configured in plugin settings
2 parents 7ba091d + 26ff085 commit ab0cc1e

24 files changed

+205
-82
lines changed

src/main/java/cd/go/contrib/elasticagent/Constants.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ public interface Constants {
4848
String JOB_ID_LABEL_KEY = "Elastic-Agent-Job-Id";
4949
String JOB_IDENTIFIER_LABEL_KEY = "Elastic-Agent-Job-Identifier";
5050

51-
String KUBERNETES_NAMESPACE = "default";
5251
String KUBERNETES_POD_KIND_LABEL_KEY = "kind";
5352
String KUBERNETES_POD_KIND_LABEL_VALUE = "kubernetes-elastic-agent";
5453
String KUBERNETES_POD_NAME_PREFIX = "k8s-ea";

src/main/java/cd/go/contrib/elasticagent/KubernetesAgentInstances.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public Agents instancesCreatedAfterTimeout(PluginSettings settings, Agents agent
151151
public void refreshAll(PluginRequest pluginRequest) {
152152
LOG.debug("[Refresh Instances]. Syncing k8s elastic agent pod information.");
153153
KubernetesClient client = factory.client(pluginRequest.getPluginSettings());
154-
PodList list = client.pods().inNamespace(Constants.KUBERNETES_NAMESPACE).list();
154+
PodList list = client.pods().list();
155155

156156
for (Pod pod : list.getItems()) {
157157
Map<String, String> podLabels = pod.getMetadata().getLabels();
@@ -181,7 +181,7 @@ private KubernetesAgentInstances unregisteredAfterTimeout(PluginSettings setting
181181
if (knownAgents.containsAgentWithId(instanceName)) {
182182
continue;
183183
}
184-
Pod pod = client.pods().inNamespace(Constants.KUBERNETES_NAMESPACE).withName(instanceName).get();
184+
Pod pod = client.pods().withName(instanceName).get();
185185
Date createdAt = getSimpleDateFormat().parse(pod.getMetadata().getCreationTimestamp());
186186
DateTime dateTimeCreated = new DateTime(createdAt);
187187

src/main/java/cd/go/contrib/elasticagent/KubernetesClientFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ private KubernetesClient createClientFor(PluginSettings pluginSettings) {
4949
final ConfigBuilder configBuilder = new ConfigBuilder()
5050
.withOauthToken(pluginSettings.getOauthToken())
5151
.withMasterUrl(pluginSettings.getClusterUrl())
52-
.withCaCertData(pluginSettings.getCaCertData());
52+
.withCaCertData(pluginSettings.getCaCertData())
53+
.withNamespace(pluginSettings.getNamespace());
5354

54-
return new DefaultKubernetesClient(configBuilder.build())
55-
.inNamespace(pluginSettings.getNamespace());
55+
return new DefaultKubernetesClient(configBuilder.build());
5656
}
5757
}

src/main/java/cd/go/contrib/elasticagent/KubernetesInstance.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public KubernetesInstance(DateTime createdAt, String environment, String name, M
4040
}
4141

4242
public void terminate(KubernetesClient client) {
43-
client.pods().inNamespace(Constants.KUBERNETES_NAMESPACE).withName(name).delete();
43+
client.pods().withName(name).delete();
4444
}
4545

4646
public String name() {

src/main/java/cd/go/contrib/elasticagent/KubernetesInstanceFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ private static void setAnnotations(Pod pod, CreateAgentRequest request) {
131131

132132
private KubernetesInstance createKubernetesPod(KubernetesClient client, Pod elasticAgentPod) {
133133
LOG.info(format("[Create Agent] Creating K8s pod with spec: {0}.", elasticAgentPod.toString()));
134-
Pod pod = client.pods().inNamespace(KUBERNETES_NAMESPACE).create(elasticAgentPod);
134+
Pod pod = client.pods().create(elasticAgentPod);
135135
return fromKubernetesPod(pod);
136136
}
137137

src/main/java/cd/go/contrib/elasticagent/KubernetesPlugin.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public GoPluginApiResponse handle(GoPluginApiRequest request) throws UnhandledRe
5656
case PLUGIN_SETTINGS_GET_VIEW:
5757
return new GetViewRequestExecutor().execute();
5858
case PLUGIN_SETTINGS_VALIDATE_CONFIGURATION:
59-
return ValidatePluginSettings.fromJSON(request.requestBody()).executor(pluginRequest).execute();
59+
return ValidatePluginSettingsRequest.fromJSON(request.requestBody()).executor(pluginRequest).execute();
6060
case REQUEST_GET_PROFILE_METADATA:
6161
return new GetProfileMetadataExecutor().execute();
6262
case REQUEST_GET_PROFILE_VIEW:
@@ -67,13 +67,16 @@ public GoPluginApiResponse handle(GoPluginApiRequest request) throws UnhandledRe
6767
refreshInstances();
6868
return CreateAgentRequest.fromJSON(request.requestBody()).executor(agentInstances, pluginRequest).execute();
6969
case REQUEST_SHOULD_ASSIGN_WORK:
70+
refreshInstances();
7071
return ShouldAssignWorkRequest.fromJSON(request.requestBody()).executor(agentInstances).execute();
7172
case REQUEST_SERVER_PING:
7273
refreshInstances();
7374
return new ServerPingRequestExecutor(agentInstances, pluginRequest).execute();
7475
case REQUEST_STATUS_REPORT:
76+
refreshInstances();
7577
return new StatusReportExecutor(pluginRequest).execute();
7678
case REQUEST_ELASTIC_AGENT_STATUS_REPORT:
79+
refreshInstances();
7780
return AgentStatusReportRequest.fromJSON(request.requestBody()).executor(pluginRequest).execute();
7881
default:
7982
throw new UnhandledRequestTypeException(request.requestName());

src/main/java/cd/go/contrib/elasticagent/PluginSettings.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.google.gson.annotations.Expose;
2020
import com.google.gson.annotations.SerializedName;
21+
import org.apache.commons.lang3.StringUtils;
2122
import org.joda.time.Period;
2223

2324
import static cd.go.contrib.elasticagent.utils.Util.GSON;
@@ -29,11 +30,11 @@ public class PluginSettings {
2930

3031
@Expose
3132
@SerializedName("auto_register_timeout")
32-
private Integer autoRegisterTimeout = 10;
33+
private Integer autoRegisterTimeout;
3334

3435
@Expose
3536
@SerializedName("pending_pods_count")
36-
private Integer maxPendingPods = 10;
37+
private Integer maxPendingPods;
3738

3839
@Expose
3940
@SerializedName("kubernetes_cluster_url")
@@ -49,7 +50,7 @@ public class PluginSettings {
4950

5051
@Expose
5152
@SerializedName("namespace")
52-
private String namespace = "default";
53+
private String namespace;
5354

5455
private Period autoRegisterPeriod;
5556

@@ -74,11 +75,11 @@ public Period getAutoRegisterPeriod() {
7475
}
7576

7677
Integer getAutoRegisterTimeout() {
77-
return autoRegisterTimeout;
78+
return getOrDefault(autoRegisterTimeout, 10);
7879
}
7980

8081
public Integer getMaxPendingPods() {
81-
return Integer.valueOf(maxPendingPods);
82+
return getOrDefault(this.maxPendingPods, 10);
8283
}
8384

8485
public String getGoServerUrl() {
@@ -98,7 +99,19 @@ public String getCaCertData() {
9899
}
99100

100101
public String getNamespace() {
101-
return namespace;
102+
return getOrDefault(this.namespace, "default");
103+
}
104+
105+
private <T> T getOrDefault(T t, T defaultValue) {
106+
if (t instanceof String && StringUtils.isBlank(String.valueOf(t))) {
107+
return defaultValue;
108+
}
109+
110+
if (t == null) {
111+
return defaultValue;
112+
}
113+
114+
return t;
102115
}
103116

104117
@Override

src/main/java/cd/go/contrib/elasticagent/executors/AgentStatusReportExecutor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public GoPluginApiResponse execute() {
6767

6868
private Pod findPodUsingJobIdentifier(JobIdentifier jobIdentifier, KubernetesClient client) {
6969
try {
70-
return client.pods().inNamespace(Constants.KUBERNETES_NAMESPACE)
70+
return client.pods()
7171
.withLabel(Constants.JOB_ID_LABEL_KEY, String.valueOf(jobIdentifier.getJobId()))
7272
.list().getItems().get(0);
7373
} catch (Exception e) {
@@ -76,7 +76,7 @@ private Pod findPodUsingJobIdentifier(JobIdentifier jobIdentifier, KubernetesCli
7676
}
7777

7878
private Pod findPodUsingElasticAgentId(String elasticAgentId, KubernetesClient client) {
79-
List<Pod> pods = client.pods().inNamespace(Constants.KUBERNETES_NAMESPACE).list().getItems();
79+
List<Pod> pods = client.pods().list().getItems();
8080
for (Pod pod : pods) {
8181
if (pod.getMetadata().getName().equals(elasticAgentId)) {
8282
return pod;

src/main/java/cd/go/contrib/elasticagent/executors/GetPluginConfigurationExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class GetPluginConfigurationExecutor implements RequestExecutor {
3232
public static final Field AUTO_REGISTER_TIMEOUT = new PositiveNumberField("auto_register_timeout", "Agent auto-register timeout (in minutes)", "10", false, false, "1");
3333
public static final Field MAX_PENDING_PODS = new PositiveNumberField("pending_pods_count", "Maximum pending pods", "10", false, false, "2");
3434
public static final Field CLUSTER_URL = new HttpsURLField("kubernetes_cluster_url", "Cluster URL", true, "3");
35-
public static final Field NAMESPACE = new Field("namespace", "Namespace", null, false, false, "4");
35+
public static final Field NAMESPACE = new Field("namespace", "Namespace", "default", false, false, "4");
3636
public static final Field OAUTH_TOKEN = new NonBlankField("oauth_token", "Oauth token", true, "5");
3737
public static final Field CLUSTER_CA_CERT = new Field("kubernetes_cluster_ca_cert", "Cluster ca certificate", null, false, true, "6");
3838

src/main/java/cd/go/contrib/elasticagent/executors/ValidateConfigurationExecutor.java

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,55 +16,81 @@
1616

1717
package cd.go.contrib.elasticagent.executors;
1818

19+
import cd.go.contrib.elasticagent.KubernetesClientFactory;
1920
import cd.go.contrib.elasticagent.PluginRequest;
2021
import cd.go.contrib.elasticagent.RequestExecutor;
2122
import cd.go.contrib.elasticagent.ServerRequestFailedException;
2223
import cd.go.contrib.elasticagent.model.Field;
2324
import cd.go.contrib.elasticagent.model.ServerInfo;
24-
import cd.go.contrib.elasticagent.requests.ValidatePluginSettings;
25+
import cd.go.contrib.elasticagent.requests.ValidatePluginSettingsRequest;
2526
import com.thoughtworks.go.plugin.api.response.DefaultGoPluginApiResponse;
2627
import com.thoughtworks.go.plugin.api.response.GoPluginApiResponse;
28+
import io.fabric8.kubernetes.api.model.Namespace;
29+
import io.fabric8.kubernetes.client.KubernetesClient;
2730

2831
import java.util.ArrayList;
2932
import java.util.HashMap;
3033
import java.util.List;
3134
import java.util.Map;
3235

3336
import static cd.go.contrib.elasticagent.KubernetesPlugin.LOG;
34-
import static cd.go.contrib.elasticagent.executors.GetPluginConfigurationExecutor.FIELDS;
35-
import static cd.go.contrib.elasticagent.executors.GetPluginConfigurationExecutor.GO_SERVER_URL;
37+
import static cd.go.contrib.elasticagent.executors.GetPluginConfigurationExecutor.*;
3638
import static cd.go.contrib.elasticagent.utils.Util.GSON;
39+
import static java.text.MessageFormat.format;
3740
import static org.apache.commons.lang3.StringUtils.isBlank;
3841

3942
public class ValidateConfigurationExecutor implements RequestExecutor {
40-
private final ValidatePluginSettings settings;
43+
private final ValidatePluginSettingsRequest validatePluginSettingsRequest;
4144
private PluginRequest pluginRequest;
45+
private final KubernetesClientFactory factory;
4246
private List<Map<String, String>> result = new ArrayList<>();
4347

44-
public ValidateConfigurationExecutor(ValidatePluginSettings settings, PluginRequest pluginRequest) {
45-
this.settings = settings;
48+
public ValidateConfigurationExecutor(ValidatePluginSettingsRequest validatePluginSettingsRequest, PluginRequest pluginRequest) {
49+
this(validatePluginSettingsRequest, pluginRequest, KubernetesClientFactory.instance());
50+
}
51+
52+
ValidateConfigurationExecutor(ValidatePluginSettingsRequest validatePluginSettingsRequest, PluginRequest pluginRequest, KubernetesClientFactory factory) {
53+
this.validatePluginSettingsRequest = validatePluginSettingsRequest;
4654
this.pluginRequest = pluginRequest;
55+
this.factory = factory;
4756
}
4857

4958
public GoPluginApiResponse execute() throws ServerRequestFailedException {
5059
LOG.debug("Validating plugin settings.");
5160

5261
for (Map.Entry<String, Field> entry : FIELDS.entrySet()) {
5362
Field field = entry.getValue();
54-
Map<String, String> validationError = field.validate(settings.get(entry.getKey()));
63+
Map<String, String> validationError = field.validate(validatePluginSettingsRequest.get(entry.getKey()));
5564

5665
if (!validationError.isEmpty()) {
5766
result.add(validationError);
5867
}
5968
}
6069

6170
validateGoServerUrl();
71+
validateNamespaceExistence();
6272

6373
return DefaultGoPluginApiResponse.success(GSON.toJson(result));
6474
}
6575

76+
private void validateNamespaceExistence() {
77+
try {
78+
final String namespace = validatePluginSettingsRequest.getPluginSettingsMap().getNamespace();
79+
final KubernetesClient client = factory.client(validatePluginSettingsRequest.getPluginSettingsMap());
80+
final List<Namespace> namespaceList = client.namespaces().list().getItems();
81+
82+
if (namespaceList.stream().anyMatch(n -> n.getMetadata().getName().equals(namespace))) {
83+
return;
84+
}
85+
86+
result.add(error(NAMESPACE.key(), format("Namespace `{0}` does not exist in you cluster. Run \"kubectl create namespace {1}\" to create a namespace.", namespace, namespace)));
87+
} catch (Exception e) {
88+
result.add(error(NAMESPACE.key(), format("Failed to validate namespace existence: {0} Please check plugin log for more detail.", e.getMessage())));
89+
}
90+
}
91+
6692
private void validateGoServerUrl() {
67-
if (isBlank(settings.get(GO_SERVER_URL.key()))) {
93+
if (isBlank(validatePluginSettingsRequest.get(GO_SERVER_URL.key()))) {
6894
ServerInfo severInfo = pluginRequest.getSeverInfo();
6995
if (isBlank(severInfo.getSecureSiteUrl())) {
7096
Map<String, String> error = error(GO_SERVER_URL.key(), "Secure site url is not configured. Please specify Go Server Url.");

0 commit comments

Comments
 (0)