Skip to content

Commit 0470b61

Browse files
committed
Merge branch 'limit-introspection' into 'main'
Limit introspection to once per activity to make rolling and other use cases faster See merge request weblogic-cloud/weblogic-kubernetes-operator!4713
2 parents 11f5978 + 5205d8b commit 0470b61

File tree

6 files changed

+84
-5
lines changed

6 files changed

+84
-5
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,6 @@ private boolean isActive(DomainPresenceInfo dpi) {
289289
}
290290

291291
private void activateDomain(DomainProcessor dp, DomainPresenceInfo info) {
292-
info.setPopulated(true);
293292
EventItem eventItem = getEventItem(info);
294293
MakeRightDomainOperation makeRight = dp.createMakeRightOperation(info).withExplicitRecheck();
295294
if (eventItem != null) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ public interface LabelConstants {
2424
String INTROSPECTION_STATE_LABEL = "weblogic.introspectVersion";
2525
String MII_UPDATED_RESTART_REQUIRED_LABEL = "weblogic.configChangesPendingRestart";
2626
String INTROSPECTION_DOMAIN_SPEC_GENERATION = "weblogic.domainSpecGeneration";
27+
String INTROSPECTION_CLUSTER_SPEC_GENERATION = "weblogic.clusterSpecGeneration";
28+
String INTROSPECTION_TIME = "weblogic.introspectionTime";
2729
String TO_BE_ROLLED_LABEL = "weblogic.awaitingPodRoll";
2830
String TO_BE_SHUTDOWN_LABEL = "weblogic.awaitingShutdown";
2931
String DOMAIN_OBSERVED_GENERATION_LABEL = "weblogic.domainObservedGeneration";

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,29 @@
33

44
package oracle.kubernetes.operator;
55

6+
import java.time.OffsetDateTime;
7+
import java.util.Collections;
68
import java.util.Optional;
79
import javax.annotation.Nonnull;
810

911
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
1012
import oracle.kubernetes.operator.helpers.EventHelper.EventData;
1113
import oracle.kubernetes.operator.work.Packet;
1214
import oracle.kubernetes.operator.work.Step;
15+
import oracle.kubernetes.weblogic.domain.model.DomainCondition;
1316
import oracle.kubernetes.weblogic.domain.model.DomainResource;
17+
import oracle.kubernetes.weblogic.domain.model.DomainStatus;
1418

19+
import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_TIME;
20+
import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_PRESENCE_INFO;
1521
import static oracle.kubernetes.operator.ProcessingConstants.MAKE_RIGHT_DOMAIN_OPERATION;
22+
import static oracle.kubernetes.weblogic.domain.model.DomainCondition.FALSE;
23+
import static oracle.kubernetes.weblogic.domain.model.DomainConditionType.COMPLETED;
1624

1725
/**
1826
* Defines the operation to bring a running domain into compliance with its domain resource and introspection result.
1927
*/
2028
public interface MakeRightDomainOperation extends MakeRightOperation<DomainPresenceInfo> {
21-
2229
/**
2330
* Defines the operation as pertaining to the deletion of a domain.
2431
* @return The make right domain operation for deletion
@@ -64,6 +71,23 @@ public interface MakeRightDomainOperation extends MakeRightOperation<DomainPrese
6471
boolean wasInspectionRun();
6572

6673
private static boolean wasInspectionRun(Packet packet) {
74+
// check if introspection has run since Completed=False set
75+
OffsetDateTime lastTransitionTime = Optional.ofNullable((DomainPresenceInfo) packet.get(DOMAIN_PRESENCE_INFO))
76+
.map(DomainPresenceInfo::getDomain)
77+
.map(DomainResource::getStatus).map(DomainStatus::getConditions).orElse(Collections.emptyList()).stream()
78+
.filter(condition -> COMPLETED.equals(condition.getType()) && FALSE.equals(condition.getStatus())).findFirst()
79+
.map(DomainCondition::getLastTransitionTime).orElse(null);
80+
81+
if (lastTransitionTime != null) {
82+
String time = packet.getValue(INTROSPECTION_TIME);
83+
if (time != null) {
84+
OffsetDateTime lastIntrospectionTime = OffsetDateTime.parse(time.replace('_', ':'));
85+
if (lastIntrospectionTime.isAfter(lastTransitionTime)) {
86+
return true;
87+
}
88+
}
89+
}
90+
6791
return fromPacket(packet).map(MakeRightDomainOperation::wasInspectionRun).orElse(false);
6892
}
6993

operator/src/main/java/oracle/kubernetes/operator/calls/Client.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
package oracle.kubernetes.operator.calls;
55

66
import java.io.IOException;
7+
import java.net.InetSocketAddress;
8+
import java.net.Proxy;
79
import java.util.concurrent.atomic.AtomicReference;
810

911
import io.kubernetes.client.monitoring.Monitoring;
@@ -34,6 +36,13 @@ public static ApiClient getInstance() {
3436
try {
3537
LOGGER.fine(MessageKeys.CREATING_API_CLIENT);
3638
ApiClient client = factory.get();
39+
String proxy = System.getenv("HTTPS_PROXY");
40+
if (proxy != null) {
41+
String[] components = proxy.split(":");
42+
client.setHttpClient(client.getHttpClient().newBuilder()
43+
.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(components[0], Integer.valueOf(components[1]))))
44+
.build());
45+
}
3746
Monitoring.installMetrics(client);
3847
Configuration.setDefaultApiClient(client);
3948
return client;

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,10 @@
5959
import static oracle.kubernetes.operator.IntrospectorConfigMapConstants.SECRETS_MD_5;
6060
import static oracle.kubernetes.operator.IntrospectorConfigMapConstants.SIT_CONFIG_FILE_PREFIX;
6161
import static oracle.kubernetes.operator.KubernetesConstants.SCRIPT_CONFIG_MAP_NAME;
62+
import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_CLUSTER_SPEC_GENERATION;
6263
import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_DOMAIN_SPEC_GENERATION;
6364
import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_STATE_LABEL;
65+
import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_TIME;
6466
import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_VALIDATION_ERRORS;
6567
import static oracle.kubernetes.operator.helpers.NamespaceHelper.getOperatorNamespace;
6668
import static oracle.kubernetes.operator.helpers.StepContextConstants.FLUENTBIT_CONFIGMAP_NAME_SUFFIX;
@@ -327,9 +329,16 @@ class ReadResponseStep extends DefaultResponseStep<V1ConfigMap> {
327329
public Result onSuccess(Packet packet, KubernetesApiResponse<V1ConfigMap> callResponse) {
328330
DomainResource domain = DomainPresenceInfo.fromPacket(packet).map(DomainPresenceInfo::getDomain).orElse(null);
329331
Optional.ofNullable(domain).map(DomainResource::getIntrospectVersion)
330-
.ifPresent(value -> addLabel(INTROSPECTION_STATE_LABEL, value));
332+
.ifPresent(value -> addLabel(INTROSPECTION_STATE_LABEL, value));
331333
Optional.ofNullable(domain).map(DomainResource::getMetadata).map(V1ObjectMeta::getGeneration)
332-
.ifPresent(value -> addLabel(INTROSPECTION_DOMAIN_SPEC_GENERATION, value.toString()));
334+
.ifPresent(value -> addLabel(INTROSPECTION_DOMAIN_SPEC_GENERATION, value.toString()));
335+
DomainPresenceInfo.fromPacket(packet).map(DomainPresenceInfo::getReferencedClusters)
336+
.ifPresent(list -> list.forEach(cluster -> Optional.ofNullable(cluster.getMetadata())
337+
.map(V1ObjectMeta::getGeneration)
338+
.ifPresent(value -> addLabel(INTROSPECTION_CLUSTER_SPEC_GENERATION + "."
339+
+ cluster.getMetadata().getName(), value.toString()))));
340+
Optional.ofNullable((String) packet.get(INTROSPECTION_TIME))
341+
.ifPresent(value -> addLabel(INTROSPECTION_TIME, value));
333342
V1ConfigMap existingMap = withoutTransientData(callResponse.getObject());
334343
if (existingMap == null) {
335344
return doNext(createConfigMap(getNext()), packet);
@@ -918,6 +927,11 @@ private void recordIntrospectVersionAndGeneration(V1ConfigMap result, Packet pac
918927
() -> packet.remove(INTROSPECTION_STATE_LABEL));
919928
Optional.ofNullable(labels).map(l -> l.get(INTROSPECTION_DOMAIN_SPEC_GENERATION))
920929
.ifPresent(generation -> packet.put(INTROSPECTION_DOMAIN_SPEC_GENERATION, generation));
930+
Optional.ofNullable(labels).ifPresent(x -> x.entrySet().stream()
931+
.filter(entry -> entry.getKey().startsWith(INTROSPECTION_CLUSTER_SPEC_GENERATION))
932+
.forEach(entry -> packet.put(entry.getKey(), entry.getValue())));
933+
Optional.ofNullable(labels).map(l -> l.get(INTROSPECTION_TIME))
934+
.ifPresent(value -> packet.put(INTROSPECTION_TIME, value));
921935
}
922936

923937
private String getTopologyYaml(Map<String, String> data) {

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

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,10 @@
6464
import static oracle.kubernetes.operator.DomainStatusUpdater.createIntrospectionFailureSteps;
6565
import static oracle.kubernetes.operator.DomainStatusUpdater.createRemoveFailuresStep;
6666
import static oracle.kubernetes.operator.DomainStatusUpdater.createRemoveSelectedFailuresStep;
67+
import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_CLUSTER_SPEC_GENERATION;
6768
import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_DOMAIN_SPEC_GENERATION;
6869
import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_STATE_LABEL;
70+
import static oracle.kubernetes.operator.LabelConstants.INTROSPECTION_TIME;
6971
import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_INTROSPECTION_COMPLETE;
7072
import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_INTROSPECTOR_JOB;
7173
import static oracle.kubernetes.operator.ProcessingConstants.DOMAIN_INTROSPECT_REQUESTED;
@@ -359,7 +361,8 @@ private Collection<String> getRunningServerNames() {
359361
}
360362

361363
private boolean isBringingUpNewDomain(Packet packet) {
362-
return getNumRunningServers() == 0 && creatingServers(info) && isDomainGenerationChanged(packet);
364+
return getNumRunningServers() == 0 && creatingServers(info)
365+
&& (isDomainGenerationChanged(packet) || isAnyClusterGenerationChanged(packet));
363366
}
364367

365368
private int getNumRunningServers() {
@@ -379,6 +382,31 @@ private String getDomainGeneration() {
379382
.orElse("");
380383
}
381384

385+
private boolean isAnyClusterGenerationChanged(Packet packet) {
386+
List<ClusterResource> referencedClusters = info.getReferencedClusters();
387+
if (referencedClusters.size() != packet.entrySet().stream()
388+
.filter(entry -> entry.getKey().startsWith(INTROSPECTION_CLUSTER_SPEC_GENERATION)).count()) {
389+
return true;
390+
}
391+
392+
for (ClusterResource clusterResource : referencedClusters) {
393+
if (Optional.ofNullable(packet.get(INTROSPECTION_CLUSTER_SPEC_GENERATION
394+
+ "." + clusterResource.getMetadata().getName()))
395+
.map(gen -> !gen.equals(getClusterGeneration(clusterResource))).orElse(true)) {
396+
return true;
397+
}
398+
}
399+
400+
return false;
401+
}
402+
403+
private String getClusterGeneration(ClusterResource clusterResource) {
404+
return Optional.ofNullable(clusterResource.getMetadata())
405+
.map(V1ObjectMeta::getGeneration)
406+
.map(Object::toString)
407+
.orElse("");
408+
}
409+
382410
// Returns true if an introspection was requested. Clears the flag in any case.
383411
private boolean isIntrospectionRequested(Packet packet) {
384412
return packet.remove(DOMAIN_INTROSPECT_REQUESTED) != null;
@@ -509,6 +537,9 @@ private class ReadPodLogStep extends Step {
509537

510538
String jobPodName = JobHelper.getName(jobPod);
511539

540+
Optional.ofNullable(jobPod).map(V1Pod::getMetadata)
541+
.map(V1ObjectMeta::getCreationTimestamp).map(OffsetDateTime::toString)
542+
.ifPresent(creationTime -> packet.put(INTROSPECTION_TIME, creationTime.replace(':', '_')));
512543
return doNext(readDomainIntrospectorPodLog(jobPodName, containerName, getNext()), packet);
513544
}
514545

0 commit comments

Comments
 (0)