Skip to content

Commit 2fba439

Browse files
committed
configure debug suspend on startup
1 parent 1a399ce commit 2fba439

12 files changed

+195
-105
lines changed

kubernetes/charts/weblogic-operator/templates/_operator-dep.tpl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ spec:
3939
{{- if .remoteDebugNodePortEnabled }}
4040
- name: "REMOTE_DEBUG_PORT"
4141
value: {{ .internalDebugHttpPort | quote }}
42+
- name: "DEBUG_SUSPEND"
43+
{{- if .suspendOnDebugStartup }}
44+
value: "y"
45+
{{- else }}
46+
value: "n"
47+
{{- end }}
4248
{{- end }}
4349
{{- if .mockWLS }}
4450
- name: "MOCK_WLS"
@@ -61,6 +67,7 @@ spec:
6167
name: "log-dir"
6268
readOnly: false
6369
{{- end }}
70+
{{- if not .remoteDebugNodePortEnabled }}
6471
livenessProbe:
6572
exec:
6673
command:
@@ -75,6 +82,7 @@ spec:
7582
- "/operator/readinessProbe.sh"
7683
initialDelaySeconds: 2
7784
periodSeconds: 10
85+
{{- end }}
7886
{{- if .elkIntegrationEnabled }}
7987
- name: "logstash"
8088
image: {{ .logStashImage | quote }}

kubernetes/charts/weblogic-operator/templates/_validate-inputs.tpl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
{{- end -}}
2727
{{- if include "utils.verifyBoolean" (list $scope "remoteDebugNodePortEnabled") -}}
2828
{{- if $scope.remoteDebugNodePortEnabled -}}
29+
{{- $ignore := include "utils.verifyBoolean" (list $scope "suspendOnDebugStartup") -}}
2930
{{- $ignore := include "utils.verifyInteger" (list $scope "internalDebugHttpPort") -}}
3031
{{- $ignore := include "utils.verifyInteger" (list $scope "externalDebugHttpPort") -}}
3132
{{- end -}}

kubernetes/charts/weblogic-operator/values.yaml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,18 @@ externalRestHttpsPort: 31001
5959
# kubernetes/samples/scripts/rest/generate-external-rest-identity.sh
6060
#externalRestIdentitySecret:
6161

62-
# remoteDebugNodePortEnabled specifies whether or not the operator will start a Java remote debug server
63-
# on the provided port and suspend execution until a remote debugger has attached.
62+
# remoteDebugNodePortEnabled specifies whether or not the operator will start a Java remote debug server on the
63+
# provided port. If the 'suspendOnDebugStartup' property is specified, the operator will suspend execution
64+
# until a remote debugger has attached.
6465
# The 'internalDebugHttpPort' property controls the port number inside the Kubernetes
6566
# cluster and the 'externalDebugHttpPort' property controls the port number outside
6667
# the Kubernetes cluster.
6768
remoteDebugNodePortEnabled: false
6869

69-
# internalDebugHttpPort specifes the port number inside the Kubernetes cluster for the operator's Java
70+
#suspendOnDebugStartup specifies whether the operator will suspend on startup when a Java remote debug server is started.
71+
suspendOnDebugStartup: false
72+
73+
# internalDebugHttpPort specifies the port number inside the Kubernetes cluster for the operator's Java
7074
# remote debug server.
7175
# This parameter is required if 'remoteDebugNodePortEnabled' is true.
7276
# Otherwise, it is ignored.

kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesDebugEnabledTestBase.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,9 @@
55
package oracle.kubernetes.operator.create;
66

77
import io.kubernetes.client.models.ExtensionsV1beta1Deployment;
8-
import io.kubernetes.client.models.V1Container;
98
import io.kubernetes.client.models.V1Service;
109
import oracle.kubernetes.operator.utils.OperatorYamlFactory;
1110

12-
import static oracle.kubernetes.operator.utils.KubernetesArtifactUtils.newEnvVar;
13-
1411
public abstract class CreateOperatorGeneratedFilesDebugEnabledTestBase
1512
extends CreateOperatorGeneratedFilesTestBase {
1613

@@ -36,10 +33,7 @@ protected V1Service getExpectedExternalWeblogicOperatorService() {
3633
@Override
3734
public ExtensionsV1beta1Deployment getExpectedWeblogicOperatorDeployment() {
3835
ExtensionsV1beta1Deployment expected = super.getExpectedWeblogicOperatorDeployment();
39-
V1Container operatorContainer =
40-
expected.getSpec().getTemplate().getSpec().getContainers().get(0);
41-
operatorContainer.addEnvItem(
42-
newEnvVar().name("REMOTE_DEBUG_PORT").value(getInputs().getInternalDebugHttpPort()));
36+
expectRemoteDebug(expected.getSpec().getTemplate().getSpec().getContainers().get(0), "n");
4337
return expected;
4438
}
4539
}

kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesOptionalFeaturesDisabledTestBase.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package oracle.kubernetes.operator.create;
66

7+
import io.kubernetes.client.models.ExtensionsV1beta1Deployment;
78
import io.kubernetes.client.models.V1Service;
89
import oracle.kubernetes.operator.utils.OperatorYamlFactory;
910

@@ -19,6 +20,13 @@ protected static void defineOperatorYamlFactory(OperatorYamlFactory factory) thr
1920
setup(factory, factory.newOperatorValues());
2021
}
2122

23+
@Override
24+
protected ExtensionsV1beta1Deployment getExpectedWeblogicOperatorDeployment() {
25+
ExtensionsV1beta1Deployment expected = super.getExpectedWeblogicOperatorDeployment();
26+
expectProbes(expected.getSpec().getTemplate().getSpec().getContainers().get(0));
27+
return expected;
28+
}
29+
2230
@Override
2331
protected String getExpectedExternalWeblogicOperatorCert() {
2432
return ""; // no cert

kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesOptionalFeaturesEnabledTestBase.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,18 @@
44

55
package oracle.kubernetes.operator.create;
66

7-
import io.kubernetes.client.models.ExtensionsV1beta1Deployment;
8-
import io.kubernetes.client.models.V1Container;
9-
import io.kubernetes.client.models.V1Service;
10-
import oracle.kubernetes.operator.utils.OperatorYamlFactory;
11-
127
import static oracle.kubernetes.operator.utils.KubernetesArtifactUtils.newContainer;
138
import static oracle.kubernetes.operator.utils.KubernetesArtifactUtils.newEmptyDirVolumeSource;
149
import static oracle.kubernetes.operator.utils.KubernetesArtifactUtils.newEnvVar;
1510
import static oracle.kubernetes.operator.utils.KubernetesArtifactUtils.newLocalObjectReference;
1611
import static oracle.kubernetes.operator.utils.KubernetesArtifactUtils.newVolume;
1712
import static oracle.kubernetes.operator.utils.KubernetesArtifactUtils.newVolumeMount;
1813

14+
import io.kubernetes.client.models.ExtensionsV1beta1Deployment;
15+
import io.kubernetes.client.models.V1Container;
16+
import io.kubernetes.client.models.V1Service;
17+
import oracle.kubernetes.operator.utils.OperatorYamlFactory;
18+
1919
/**
2020
* Tests that the artifacts in the yaml files that create-weblogic-operator.sh creates are correct
2121
* when all optional features are enabled: external rest self signed cert remote debug port enabled
@@ -31,6 +31,7 @@ protected static void defineOperatorYamlFactory(OperatorYamlFactory factory) thr
3131
.newOperatorValues()
3232
.setupExternalRestEnabled()
3333
.enableDebugging()
34+
.suspendOnDebugStartup("true")
3435
.elkIntegrationEnabled("true")
3536
.weblogicOperatorImagePullSecretName("test-operator-image-pull-secret-name"));
3637
}
@@ -55,10 +56,9 @@ public ExtensionsV1beta1Deployment getExpectedWeblogicOperatorDeployment() {
5556
ExtensionsV1beta1Deployment expected = super.getExpectedWeblogicOperatorDeployment();
5657
V1Container operatorContainer =
5758
expected.getSpec().getTemplate().getSpec().getContainers().get(0);
58-
operatorContainer
59-
.addVolumeMountsItem(newVolumeMount().name("log-dir").mountPath("/logs").readOnly(false))
60-
.addEnvItem(
61-
newEnvVar().name("REMOTE_DEBUG_PORT").value(getInputs().getInternalDebugHttpPort()));
59+
operatorContainer.addVolumeMountsItem(
60+
newVolumeMount().name("log-dir").mountPath("/logs").readOnly(false));
61+
expectRemoteDebug(operatorContainer, "y");
6262
expected
6363
.getSpec()
6464
.getTemplate()

kubernetes/src/test/java/oracle/kubernetes/operator/create/CreateOperatorGeneratedFilesTestBase.java

Lines changed: 43 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,6 @@
44

55
package oracle.kubernetes.operator.create;
66

7-
import io.kubernetes.client.custom.Quantity;
8-
import io.kubernetes.client.models.ExtensionsV1beta1Deployment;
9-
import io.kubernetes.client.models.V1ClusterRole;
10-
import io.kubernetes.client.models.V1ClusterRoleBinding;
11-
import io.kubernetes.client.models.V1ConfigMap;
12-
import io.kubernetes.client.models.V1Namespace;
13-
import io.kubernetes.client.models.V1ResourceRequirements;
14-
import io.kubernetes.client.models.V1Role;
15-
import io.kubernetes.client.models.V1RoleBinding;
16-
import io.kubernetes.client.models.V1Secret;
17-
import io.kubernetes.client.models.V1Service;
18-
import io.kubernetes.client.models.V1ServiceAccount;
19-
import io.kubernetes.client.models.V1ServiceSpec;
20-
import oracle.kubernetes.operator.utils.GeneratedOperatorObjects;
21-
import oracle.kubernetes.operator.utils.KubernetesArtifactUtils;
22-
import oracle.kubernetes.operator.utils.OperatorValues;
23-
import oracle.kubernetes.operator.utils.OperatorYamlFactory;
24-
import org.apache.commons.codec.binary.Base64;
25-
import org.junit.Test;
26-
277
import static java.util.Arrays.asList;
288
import static java.util.Collections.singletonList;
299
import static oracle.kubernetes.operator.LabelConstants.APP_LABEL;
@@ -64,17 +44,36 @@
6444
import static org.hamcrest.MatcherAssert.assertThat;
6545
import static org.junit.Assert.fail;
6646

47+
import io.kubernetes.client.custom.Quantity;
48+
import io.kubernetes.client.models.ExtensionsV1beta1Deployment;
49+
import io.kubernetes.client.models.V1ClusterRole;
50+
import io.kubernetes.client.models.V1ClusterRoleBinding;
51+
import io.kubernetes.client.models.V1ConfigMap;
52+
import io.kubernetes.client.models.V1Container;
53+
import io.kubernetes.client.models.V1Namespace;
54+
import io.kubernetes.client.models.V1Probe;
55+
import io.kubernetes.client.models.V1ResourceRequirements;
56+
import io.kubernetes.client.models.V1Role;
57+
import io.kubernetes.client.models.V1RoleBinding;
58+
import io.kubernetes.client.models.V1Secret;
59+
import io.kubernetes.client.models.V1Service;
60+
import io.kubernetes.client.models.V1ServiceAccount;
61+
import io.kubernetes.client.models.V1ServiceSpec;
62+
import oracle.kubernetes.operator.utils.GeneratedOperatorObjects;
63+
import oracle.kubernetes.operator.utils.KubernetesArtifactUtils;
64+
import oracle.kubernetes.operator.utils.OperatorValues;
65+
import oracle.kubernetes.operator.utils.OperatorYamlFactory;
66+
import org.apache.commons.codec.binary.Base64;
67+
import org.junit.Test;
68+
6769
/**
6870
* Base class for testing that the all artifacts in the yaml files that create-weblogic-operator.sh
6971
* generates
7072
*/
7173
public abstract class CreateOperatorGeneratedFilesTestBase {
7274

73-
private static String OPERATOR_RELEASE = "weblogic-operator";
74-
7575
private static OperatorValues inputs;
7676
private static GeneratedOperatorObjects generatedFiles;
77-
private static OperatorYamlFactory factory;
7877

7978
protected static OperatorValues getInputs() {
8079
return inputs;
@@ -84,8 +83,7 @@ private static GeneratedOperatorObjects getGeneratedFiles() {
8483
return generatedFiles;
8584
}
8685

87-
protected static void setup(OperatorYamlFactory factory, OperatorValues val) throws Exception {
88-
CreateOperatorGeneratedFilesTestBase.factory = factory;
86+
static void setup(OperatorYamlFactory factory, OperatorValues val) throws Exception {
8987
inputs = val;
9088
generatedFiles = factory.generate(val);
9189
}
@@ -229,25 +227,7 @@ protected ExtensionsV1beta1Deployment getExpectedWeblogicOperatorDeployment() {
229227
newVolumeMount()
230228
.name("weblogic-operator-secrets-volume")
231229
.mountPath("/operator/secrets")
232-
.readOnly(true))
233-
.livenessProbe(
234-
newProbe()
235-
.initialDelaySeconds(20)
236-
.periodSeconds(5)
237-
.exec(
238-
newExecAction()
239-
.addCommandItem("bash")
240-
.addCommandItem(
241-
"/operator/livenessProbe.sh")))
242-
.readinessProbe(
243-
newProbe()
244-
.initialDelaySeconds(2)
245-
.periodSeconds(10)
246-
.exec(
247-
newExecAction()
248-
.addCommandItem("bash")
249-
.addCommandItem(
250-
"/operator/readinessProbe.sh"))))
230+
.readOnly(true)))
251231
.addVolumesItem(
252232
newVolume()
253233
.name("weblogic-operator-cm-volume")
@@ -269,6 +249,19 @@ protected ExtensionsV1beta1Deployment getExpectedWeblogicOperatorDeployment() {
269249
.secretName("weblogic-operator-secrets"))))));
270250
}
271251

252+
void expectProbes(V1Container container) {
253+
container
254+
.livenessProbe(createProbe(20, 5, "/operator/livenessProbe.sh"))
255+
.readinessProbe(createProbe(2, 10, "/operator/readinessProbe.sh"));
256+
}
257+
258+
private V1Probe createProbe(int initialDelaySeconds, int periodSeconds, String shellScript) {
259+
return newProbe()
260+
.initialDelaySeconds(initialDelaySeconds)
261+
.periodSeconds(periodSeconds)
262+
.exec(newExecAction().addCommandItem("bash").addCommandItem(shellScript));
263+
}
264+
272265
@Test
273266
public void generatesCorrect_externalWeblogicOperatorService() {
274267
V1Service expected = getExpectedExternalWeblogicOperatorService();
@@ -815,4 +808,10 @@ protected V1Service getExpectedExternalOperatorService(
815808
.putLabelsItem(OPERATORNAME_LABEL, getInputs().getNamespace()))
816809
.spec(spec);
817810
}
811+
812+
protected void expectRemoteDebug(V1Container operatorContainer, String debugSuspend) {
813+
operatorContainer.addEnvItem(
814+
newEnvVar().name("REMOTE_DEBUG_PORT").value(getInputs().getInternalDebugHttpPort()));
815+
operatorContainer.addEnvItem(newEnvVar().name("DEBUG_SUSPEND").value(debugSuspend));
816+
}
818817
}

kubernetes/src/test/java/oracle/kubernetes/operator/helm/HelmOperatorValues.java

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,6 @@
44

55
package oracle.kubernetes.operator.helm;
66

7-
import java.util.ArrayList;
8-
import java.util.Arrays;
9-
import java.util.HashMap;
10-
import java.util.List;
11-
import java.util.Map;
12-
13-
import oracle.kubernetes.operator.utils.OperatorValues;
14-
157
import static com.google.common.base.Strings.isNullOrEmpty;
168
import static java.util.Collections.singletonList;
179
import static java.util.Collections.singletonMap;
@@ -21,9 +13,14 @@
2113
import static oracle.kubernetes.operator.helm.MapUtils.loadFromMap;
2214
import static oracle.kubernetes.operator.helm.MapUtils.loadIntegerFromMap;
2315

16+
import java.util.Arrays;
17+
import java.util.HashMap;
18+
import java.util.List;
19+
import java.util.Map;
20+
import oracle.kubernetes.operator.utils.OperatorValues;
21+
2422
class HelmOperatorValues extends OperatorValues {
25-
HelmOperatorValues() {
26-
}
23+
HelmOperatorValues() {}
2724

2825
HelmOperatorValues(Map<String, Object> map) {
2926
loadFromMap(map, this::setServiceAccount, "serviceAccount");
@@ -39,6 +36,7 @@ class HelmOperatorValues extends OperatorValues {
3936

4037
loadBooleanFromMap(map, this::setExternalRestEnabled, "externalRestEnabled");
4138
loadBooleanFromMap(map, this::setRemoteDebugNodePortEnabled, "remoteDebugNodePortEnabled");
39+
loadBooleanFromMap(map, this::setSuspendOnDebugStartup, "suspendOnDebugStartup");
4240
loadBooleanFromMap(map, this::setElkIntegrationEnabled, "elkIntegrationEnabled");
4341

4442
loadIntegerFromMap(map, this::setExternalRestHttpsPort, "externalRestHttpsPort");
@@ -62,6 +60,12 @@ private void setRemoteDebugNodePortEnabled(Boolean enabled) {
6260
}
6361
}
6462

63+
private void setSuspendOnDebugStartup(Boolean enabled) {
64+
if (enabled != null) {
65+
setSuspendOnDebugStartup(enabled.toString());
66+
}
67+
}
68+
6569
private void setElkIntegrationEnabled(Boolean enabled) {
6670
if (enabled != null) {
6771
setElkIntegrationEnabled(enabled.toString());
@@ -84,7 +88,7 @@ private void loadImagePullSecretsFromMap(Map<String, Object> map) {
8488
(List<Map<String, String>>) map.get("imagePullSecrets");
8589
if (imagePullSecrets != null) {
8690
// TBD - enhance OperatorValues to have an array of image pull secrets, instead of just one
87-
String secretName = (String) imagePullSecrets.get(0).get("name");
91+
String secretName = imagePullSecrets.get(0).get("name");
8892
if (secretName != null) {
8993
setWeblogicOperatorImagePullSecretName(secretName);
9094
}
@@ -106,7 +110,8 @@ Map<String, Object> createMap() {
106110
addStringMapEntry(map, this::getElasticSearchHost, "elasticSearchHost");
107111

108112
addMapEntry(map, this::isExternalRestEnabled, "externalRestEnabled");
109-
addMapEntry(map, this::isRemoteDebugNotPortEnabled, "remoteDebugNodePortEnabled");
113+
addMapEntry(map, this::isRemoteDebugNodePortEnabled, "remoteDebugNodePortEnabled");
114+
addMapEntry(map, this::isSuspendOnDebugStartup, "suspendOnDebugStartup");
110115
addMapEntry(map, this::isElkIntegrationEnabled, "elkIntegrationEnabled");
111116

112117
addMapEntry(map, this::getExternalRestHttpsPortNum, "externalRestHttpsPort");
@@ -122,11 +127,7 @@ Map<String, Object> createMap() {
122127
private void addDomainNamespaces(HashMap<String, Object> map) {
123128
String targetNamespaces = getTargetNamespaces();
124129
if (targetNamespaces.length() > 0) {
125-
List<String> namespaces = new ArrayList<>();
126-
for (String namespace : targetNamespaces.split(",")) {
127-
namespaces.add(namespace);
128-
}
129-
map.put("domainNamespaces", namespaces);
130+
map.put("domainNamespaces", Arrays.asList(targetNamespaces.split(",")));
130131
}
131132
}
132133

@@ -141,10 +142,14 @@ private Boolean isExternalRestEnabled() {
141142
return MapUtils.valueOf(getExternalRestEnabled());
142143
}
143144

144-
private Boolean isRemoteDebugNotPortEnabled() {
145+
private Boolean isRemoteDebugNodePortEnabled() {
145146
return MapUtils.valueOf(getRemoteDebugNodePortEnabled());
146147
}
147148

149+
private Boolean isSuspendOnDebugStartup() {
150+
return MapUtils.valueOf(getSuspendOnDebugStartup());
151+
}
152+
148153
private Boolean isElkIntegrationEnabled() {
149154
return MapUtils.valueOf(getElkIntegrationEnabled());
150155
}

0 commit comments

Comments
 (0)