Skip to content

Commit 11e7b52

Browse files
committed
Merge remote-tracking branch 'origin/develop' into graceful-shutdown
2 parents 8f11e5a + 1ca0766 commit 11e7b52

29 files changed

+839
-131
lines changed

docs-source/content/reference/domain-resource.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ weight: 3
66
description: "Use this document to set up and configure your own domain resource."
77
---
88

9-
View a domain resource reference document [here](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md).
9+
View the domain resource reference document [here](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/docs/domains/Domain.md).

docs-source/content/userguide/introduction/introduction.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Detailed instructions are available [here]({{< relref "/userguide/managing-opera
1616

1717
### Prerequisites
1818

19-
* Kubernetes 1.10.11+, 1.11.5+, 1.12.3+, and 1.13.0+ (check with `kubectl version`).
19+
* Kubernetes 1.11.5+, 1.12.3+, and 1.13.0+ (check with `kubectl version`).
2020
* Flannel networking v0.9.1-amd64 (check with `docker images | grep flannel`).
2121
* Docker 18.03.1.ce (check with `docker version`).
2222
* Helm 2.8.2+ (check with `helm version`).

operator/src/main/java/oracle/kubernetes/operator/DomainProcessorImpl.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
import oracle.kubernetes.operator.helpers.ServiceHelper;
3535
import oracle.kubernetes.operator.logging.LoggingFacade;
3636
import oracle.kubernetes.operator.logging.LoggingFactory;
37+
import oracle.kubernetes.operator.logging.LoggingFilter;
3738
import oracle.kubernetes.operator.logging.MessageKeys;
39+
import oracle.kubernetes.operator.logging.OncePerMessageLoggingFilter;
3840
import oracle.kubernetes.operator.steps.BeforeAdminServiceStep;
3941
import oracle.kubernetes.operator.steps.DeleteDomainStep;
4042
import oracle.kubernetes.operator.steps.DomainPresenceStep;
@@ -288,6 +290,7 @@ public void dispatchDomainWatch(Watch.Response<Domain> item) {
288290
*/
289291

290292
private void scheduleDomainStatusUpdating(DomainPresenceInfo info) {
293+
final OncePerMessageLoggingFilter loggingFilter = new OncePerMessageLoggingFilter();
291294
Runnable command =
292295
new Runnable() {
293296
public void run() {
@@ -299,6 +302,7 @@ public void run() {
299302
.put(
300303
ProcessingConstants.DOMAIN_COMPONENT_NAME,
301304
Component.createFor(info, delegate.getVersion()));
305+
packet.put(LoggingFilter.LOGGING_FILTER_PACKET_KEY, loggingFilter);
302306
MainTuning main = TuningParameters.getInstance().getMainTuning();
303307
Step strategy =
304308
DomainStatusUpdater.createStatusStep(main.statusUpdateTimeoutSeconds, null);
@@ -309,11 +313,18 @@ public void run() {
309313
packet,
310314
new CompletionCallback() {
311315
@Override
312-
public void onCompletion(Packet packet) {}
316+
public void onCompletion(Packet packet) {
317+
if (Boolean.TRUE.equals(packet.get(ProcessingConstants.SERVER_HEALTH_READ))) {
318+
loggingFilter.setFiltering(false).resetLogHistory();
319+
} else {
320+
loggingFilter.setFiltering(true);
321+
}
322+
}
313323

314324
@Override
315325
public void onThrowable(Packet packet, Throwable throwable) {
316326
LOGGER.severe(MessageKeys.EXCEPTION, throwable);
327+
loggingFilter.setFiltering(true);
317328
}
318329
});
319330
} catch (Throwable t) {

operator/src/main/java/oracle/kubernetes/operator/ProcessingConstants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,6 @@ public interface ProcessingConstants {
3131
public static final String DOMAIN_INTROSPECTOR_JOB = "domainIntrospectorJob";
3232
public static final String DOMAIN_INTROSPECTOR_LOG_RESULT = "domainIntrospectorLogResult";
3333
public static final String SIT_CONFIG_MAP = "sitConfigMap";
34+
35+
public static final String SERVER_HEALTH_READ = "serverHealthRead";
3436
}

operator/src/main/java/oracle/kubernetes/operator/helpers/AnnotationHelper.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import io.kubernetes.client.models.V1Pod;
99
import io.kubernetes.client.models.V1Service;
1010
import io.kubernetes.client.util.Yaml;
11+
import java.util.Map;
12+
import java.util.Optional;
1113
import java.util.function.Function;
1214
import org.apache.commons.codec.digest.DigestUtils;
1315

@@ -58,15 +60,31 @@ private static V1Service addHash(V1Service service) {
5860
return service;
5961
}
6062

63+
static String getHash(V1Pod pod) {
64+
return getAnnotation(pod.getMetadata(), AnnotationHelper::getSha256Annotation);
65+
}
66+
67+
static String getHash(V1Service service) {
68+
return getAnnotation(service.getMetadata(), AnnotationHelper::getSha256Annotation);
69+
}
70+
6171
static String getDebugString(V1Pod pod) {
62-
return pod.getMetadata().getAnnotations().get(HASHED_STRING);
72+
return getAnnotation(pod.getMetadata(), AnnotationHelper::getDebugHashAnnotation);
6373
}
6474

65-
static String getHash(V1Pod pod) {
66-
return pod.getMetadata().getAnnotations().get(SHA256_ANNOTATION);
75+
private static String getAnnotation(
76+
V1ObjectMeta metadata, Function<Map<String, String>, String> annotationGetter) {
77+
return Optional.ofNullable(metadata)
78+
.map(V1ObjectMeta::getAnnotations)
79+
.map(annotationGetter)
80+
.orElse("");
6781
}
6882

69-
static String getHash(V1Service service) {
70-
return service.getMetadata().getAnnotations().get(SHA256_ANNOTATION);
83+
private static String getDebugHashAnnotation(Map<String, String> annotations) {
84+
return annotations.get(HASHED_STRING);
85+
}
86+
87+
private static String getSha256Annotation(Map<String, String> annotations) {
88+
return annotations.get(SHA256_ANNOTATION);
7189
}
7290
}

operator/src/main/java/oracle/kubernetes/operator/helpers/DomainPresenceInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ private V1ObjectMeta getMetadata(V1Service service) {
316316
return service == null ? null : service.getMetadata();
317317
}
318318

319-
V1Service getExternalService(String serverName) {
319+
public V1Service getExternalService(String serverName) {
320320
return getSko(serverName).getExternalService().get();
321321
}
322322

operator/src/main/java/oracle/kubernetes/operator/helpers/LegalNames.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public static String toJobIntrospectorName(String domainUID) {
3636
return toDNS1123LegalName(String.format(DOMAIN_INTROSPECTOR_JOB_PATTERN, domainUID));
3737
}
3838

39-
static String toExternalServiceName(String domainUID, String serverName) {
39+
public static String toExternalServiceName(String domainUID, String serverName) {
4040
return toDNS1123LegalName(String.format(EXTERNAL_SERVICE_PATTERN, domainUID, serverName));
4141
}
4242

operator/src/main/java/oracle/kubernetes/operator/helpers/KubernetesServiceType.java renamed to operator/src/main/java/oracle/kubernetes/operator/helpers/OperatorServiceType.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
import io.kubernetes.client.models.V1Service;
88
import java.util.Optional;
99

10-
public enum KubernetesServiceType {
10+
/** Describes the service types supported by the operator. */
11+
public enum OperatorServiceType {
1112
SERVER {
1213
@Override
1314
void addToPresence(DomainPresenceInfo presenceInfo, V1Service service) {
@@ -21,7 +22,7 @@ void updateFromEvent(DomainPresenceInfo presenceInfo, V1Service event) {
2122

2223
@Override
2324
boolean matches(V1Service service) {
24-
return ServiceHelper.getServerName(service) != null;
25+
return ServiceHelper.getServerName(service) != null && !ServiceHelper.isNodePortType(service);
2526
}
2627

2728
@Override
@@ -35,6 +36,11 @@ V1Service[] getServices(DomainPresenceInfo presenceInfo) {
3536
}
3637
},
3738
EXTERNAL {
39+
@Override
40+
boolean matches(V1Service service) {
41+
return ServiceHelper.getServerName(service) != null && ServiceHelper.isNodePortType(service);
42+
}
43+
3844
@Override
3945
void addToPresence(DomainPresenceInfo presenceInfo, V1Service service) {
4046
presenceInfo.setExternalService(ServiceHelper.getServerName(service), service);
@@ -80,12 +86,12 @@ boolean matches(V1Service service) {
8086

8187
private static final String SERVICE_TYPE = "serviceType";
8288

83-
static KubernetesServiceType getType(V1Service service) {
84-
if (!KubernetesUtils.isOperatorCreated(service.getMetadata())) return EXTERNAL;
89+
static OperatorServiceType getType(V1Service service) {
90+
if (!KubernetesUtils.isOperatorCreated(service.getMetadata())) return UNKNOWN;
8591
String type = ServiceHelper.getLabelValue(service, SERVICE_TYPE);
86-
if (type != null) return KubernetesServiceType.valueOf(type);
92+
if (type != null) return OperatorServiceType.valueOf(type);
8793

88-
for (KubernetesServiceType serviceType : KubernetesServiceType.values())
94+
for (OperatorServiceType serviceType : OperatorServiceType.values())
8995
if (serviceType.matches(service)) return serviceType;
9096

9197
return UNKNOWN;

operator/src/main/java/oracle/kubernetes/operator/helpers/SecretHelper.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.Map;
1212
import oracle.kubernetes.operator.logging.LoggingFacade;
1313
import oracle.kubernetes.operator.logging.LoggingFactory;
14+
import oracle.kubernetes.operator.logging.LoggingFilter;
1415
import oracle.kubernetes.operator.logging.MessageKeys;
1516
import oracle.kubernetes.operator.work.ContainerResolver;
1617
import oracle.kubernetes.operator.work.NextAction;
@@ -72,7 +73,7 @@ public Map<String, byte[]> getSecretData(SecretType secretType, String secretNam
7273
return null;
7374
}
7475

75-
return harvestAdminSecretData(secret);
76+
return harvestAdminSecretData(secret, null);
7677
} catch (Throwable e) {
7778
LOGGER.severe(MessageKeys.EXCEPTION, e);
7879
return null;
@@ -116,6 +117,7 @@ public NextAction apply(Packet packet) {
116117
}
117118

118119
LOGGER.fine(MessageKeys.RETRIEVING_SECRET, secretName);
120+
final LoggingFilter loggingFilter = packet.getValue(LoggingFilter.LOGGING_FILTER_PACKET_KEY);
119121
CallBuilderFactory factory =
120122
ContainerResolver.getInstance().getContainer().getSPI(CallBuilderFactory.class);
121123
Step read =
@@ -132,7 +134,7 @@ public NextAction onFailure(
132134
int statusCode,
133135
Map<String, List<String>> responseHeaders) {
134136
if (statusCode == CallBuilder.NOT_FOUND) {
135-
LOGGER.warning(MessageKeys.SECRET_NOT_FOUND, secretName);
137+
LOGGER.warning(loggingFilter, MessageKeys.SECRET_NOT_FOUND, secretName);
136138
return doNext(packet);
137139
}
138140
return super.onFailure(packet, e, statusCode, responseHeaders);
@@ -144,7 +146,7 @@ public NextAction onSuccess(
144146
V1Secret result,
145147
int statusCode,
146148
Map<String, List<String>> responseHeaders) {
147-
packet.put(SECRET_DATA_KEY, harvestAdminSecretData(result));
149+
packet.put(SECRET_DATA_KEY, harvestAdminSecretData(result, loggingFilter));
148150
return doNext(packet);
149151
}
150152
});
@@ -153,21 +155,24 @@ public NextAction onSuccess(
153155
}
154156
}
155157

156-
private static Map<String, byte[]> harvestAdminSecretData(V1Secret secret) {
158+
private static Map<String, byte[]> harvestAdminSecretData(
159+
V1Secret secret, LoggingFilter loggingFilter) {
157160
Map<String, byte[]> secretData = new HashMap<>();
158161
byte[] usernameBytes = secret.getData().get(ADMIN_SERVER_CREDENTIALS_USERNAME);
159162
byte[] passwordBytes = secret.getData().get(ADMIN_SERVER_CREDENTIALS_PASSWORD);
160163

161164
if (usernameBytes != null) {
162165
secretData.put(ADMIN_SERVER_CREDENTIALS_USERNAME, usernameBytes);
163166
} else {
164-
LOGGER.warning(MessageKeys.SECRET_DATA_NOT_FOUND, ADMIN_SERVER_CREDENTIALS_USERNAME);
167+
LOGGER.warning(
168+
loggingFilter, MessageKeys.SECRET_DATA_NOT_FOUND, ADMIN_SERVER_CREDENTIALS_USERNAME);
165169
}
166170

167171
if (passwordBytes != null) {
168172
secretData.put(ADMIN_SERVER_CREDENTIALS_PASSWORD, passwordBytes);
169173
} else {
170-
LOGGER.warning(MessageKeys.SECRET_DATA_NOT_FOUND, ADMIN_SERVER_CREDENTIALS_PASSWORD);
174+
LOGGER.warning(
175+
loggingFilter, MessageKeys.SECRET_DATA_NOT_FOUND, ADMIN_SERVER_CREDENTIALS_PASSWORD);
171176
}
172177
return secretData;
173178
}

operator/src/main/java/oracle/kubernetes/operator/helpers/ServiceHelper.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@
5353
import org.apache.commons.lang3.builder.EqualsBuilder;
5454

5555
public class ServiceHelper {
56+
public static final String CLUSTER_IP_TYPE = "ClusterIP";
57+
public static final String NODE_PORT_TYPE = "NodePort";
5658
private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
5759

5860
private ServiceHelper() {}
@@ -72,23 +74,23 @@ static V1Service createServerServiceModel(Packet packet) {
7274
}
7375

7476
public static void addToPresence(DomainPresenceInfo info, V1Service service) {
75-
KubernetesServiceType.getType(service).addToPresence(info, service);
77+
OperatorServiceType.getType(service).addToPresence(info, service);
7678
}
7779

7880
public static void updatePresenceFromEvent(DomainPresenceInfo info, V1Service service) {
79-
KubernetesServiceType.getType(service).updateFromEvent(info, service);
81+
OperatorServiceType.getType(service).updateFromEvent(info, service);
8082
}
8183

8284
public static V1Service[] getServerServices(DomainPresenceInfo info) {
83-
return KubernetesServiceType.SERVER.getServices(info);
85+
return OperatorServiceType.SERVER.getServices(info);
8486
}
8587

8688
public static boolean isServerService(V1Service service) {
87-
return KubernetesServiceType.getType(service) == KubernetesServiceType.SERVER;
89+
return OperatorServiceType.getType(service) == OperatorServiceType.SERVER;
8890
}
8991

9092
public static boolean deleteFromEvent(DomainPresenceInfo info, V1Service service) {
91-
return KubernetesServiceType.getType(service).deleteFromEvent(info, service);
93+
return OperatorServiceType.getType(service).deleteFromEvent(info, service);
9294
}
9395

9496
public static String getServiceDomainUID(V1Service service) {
@@ -114,6 +116,14 @@ public static String getClusterName(V1Service service) {
114116
return getLabelValue(service, LabelConstants.CLUSTERNAME_LABEL);
115117
}
116118

119+
static boolean isNodePortType(V1Service service) {
120+
return NODE_PORT_TYPE.equals(getSpecType(service));
121+
}
122+
123+
private static String getSpecType(V1Service service) {
124+
return Optional.ofNullable(service.getSpec()).map(V1ServiceSpec::getType).orElse("");
125+
}
126+
117127
private static class ForServerStep extends ServiceHelperStep {
118128
ForServerStep(Step next) {
119129
super(next);
@@ -149,7 +159,7 @@ private static class ServerServiceStepContext extends ServiceStepContext {
149159
final WlsServerConfig scan;
150160

151161
ServerServiceStepContext(Step conflictStep, Packet packet) {
152-
super(conflictStep, packet, KubernetesServiceType.SERVER);
162+
super(conflictStep, packet, OperatorServiceType.SERVER);
153163
serverName = (String) packet.get(ProcessingConstants.SERVER_NAME);
154164
clusterName = (String) packet.get(ProcessingConstants.CLUSTER_NAME);
155165
scan = (WlsServerConfig) packet.get(ProcessingConstants.SERVER_SCAN);
@@ -252,7 +262,7 @@ void addServicePortIfNeeded(String portName, Integer port) {
252262

253263
@Override
254264
protected String getSpecType() {
255-
return "ClusterIP";
265+
return CLUSTER_IP_TYPE;
256266
}
257267

258268
@Override
@@ -281,9 +291,9 @@ private abstract static class ServiceStepContext {
281291
protected List<V1ServicePort> ports;
282292
DomainPresenceInfo info;
283293
WlsDomainConfig domainTopology;
284-
private KubernetesServiceType serviceType;
294+
private OperatorServiceType serviceType;
285295

286-
ServiceStepContext(Step conflictStep, Packet packet, KubernetesServiceType serviceType) {
296+
ServiceStepContext(Step conflictStep, Packet packet, OperatorServiceType serviceType) {
287297
this.conflictStep = conflictStep;
288298
info = packet.getSPI(DomainPresenceInfo.class);
289299
domainTopology = (WlsDomainConfig) packet.get(ProcessingConstants.DOMAIN_TOPOLOGY);
@@ -591,7 +601,7 @@ private static class ClusterStepContext extends ServiceStepContext {
591601
private final WlsDomainConfig config;
592602

593603
ClusterStepContext(Step conflictStep, Packet packet) {
594-
super(conflictStep, packet, KubernetesServiceType.CLUSTER);
604+
super(conflictStep, packet, OperatorServiceType.CLUSTER);
595605
clusterName = (String) packet.get(ProcessingConstants.CLUSTER_NAME);
596606
config = (WlsDomainConfig) packet.get(ProcessingConstants.DOMAIN_TOPOLOGY);
597607
}
@@ -624,7 +634,7 @@ void addServicePortIfNeeded(String portName, Integer port) {
624634

625635
@Override
626636
protected String getSpecType() {
627-
return "ClusterIP";
637+
return CLUSTER_IP_TYPE;
628638
}
629639

630640
protected V1ObjectMeta createMetadata() {
@@ -719,7 +729,7 @@ private static class ExternalServiceStepContext extends ServiceStepContext {
719729
private final String adminServerName;
720730

721731
ExternalServiceStepContext(Step conflictStep, Packet packet) {
722-
super(conflictStep, packet, KubernetesServiceType.EXTERNAL);
732+
super(conflictStep, packet, OperatorServiceType.EXTERNAL);
723733
adminServerName = (String) packet.get(ProcessingConstants.SERVER_NAME);
724734
}
725735

@@ -741,7 +751,7 @@ protected String createServiceName() {
741751

742752
@Override
743753
protected String getSpecType() {
744-
return "NodePort";
754+
return NODE_PORT_TYPE;
745755
}
746756

747757
@Override

0 commit comments

Comments
 (0)