Skip to content

Commit 95de737

Browse files
committed
Recreate introspector job when it is completed and outdated
1 parent 63bc7c2 commit 95de737

File tree

1 file changed

+123
-106
lines changed
  • operator/src/main/java/oracle/kubernetes/operator/helpers

1 file changed

+123
-106
lines changed

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

Lines changed: 123 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -308,150 +308,154 @@ public Result onSuccess(Packet packet, KubernetesApiResponse<T> callResponse) {
308308

309309
private boolean isInProgressJobOutdated(V1Job job) {
310310
return Optional.ofNullable(job)
311-
.map(j -> hasNotCompleted(j) && (hasAnyImageChanged(j) || hasIntrospectVersionChanged(j)))
311+
.map(j -> hasNotCompleted(j) && isOutdated(j))
312312
.orElse(false);
313313
}
314+
}
314315

315-
private boolean hasNotCompleted(V1Job job) {
316-
return job != null && !JobWatcher.isComplete(job);
317-
}
316+
private boolean hasNotCompleted(V1Job job) {
317+
return job != null && !JobWatcher.isComplete(job);
318+
}
318319

319-
private boolean hasAnyImageChanged(V1Job job) {
320-
return hasImageChanged(job) || hasAuxiliaryImageChanged(job);
321-
}
320+
private boolean isOutdated(V1Job job) {
321+
return job != null && (hasAnyImageChanged(job) || hasIntrospectVersionChanged(job));
322+
}
322323

323-
private boolean hasImageChanged(@Nonnull V1Job job) {
324-
return !Objects.equals(getImageFromJob(job), getJobModelPodSpecImage());
325-
}
324+
private boolean hasAnyImageChanged(V1Job job) {
325+
return hasImageChanged(job) || hasAuxiliaryImageChanged(job);
326+
}
326327

327-
private boolean hasAuxiliaryImageChanged(@Nonnull V1Job job) {
328-
return ! getSortedJobModelPodSpecAuxiliaryImages().equals(getSortedAuxiliaryImagesFromJob(job));
329-
}
328+
private boolean hasImageChanged(@Nonnull V1Job job) {
329+
return !Objects.equals(getImageFromJob(job), getJobModelPodSpecImage());
330+
}
330331

331-
private boolean hasIntrospectVersionChanged(@Nonnull V1Job job) {
332-
return !Objects.equals(getIntrospectVersionLabelFromJob(job),
333-
getIntrospectVersionLabelFromJob(getJobModel()));
334-
}
332+
private boolean hasAuxiliaryImageChanged(@Nonnull V1Job job) {
333+
return ! getSortedJobModelPodSpecAuxiliaryImages().equals(getSortedAuxiliaryImagesFromJob(job));
334+
}
335335

336-
String getImageFromJob(V1Job job) {
337-
return getPodSpecFromJob(job).map(this::getImageFromPodSpec).orElse(null);
338-
}
336+
private boolean hasIntrospectVersionChanged(@Nonnull V1Job job) {
337+
return !Objects.equals(getIntrospectVersionLabelFromJob(job),
338+
getIntrospectVersionLabelFromJob(getJobModel()));
339+
}
339340

340-
List<String> getSortedAuxiliaryImagesFromJob(V1Job job) {
341-
return getAuxiliaryImagesFromJob(job).sorted().toList();
342-
}
341+
String getImageFromJob(V1Job job) {
342+
return getPodSpecFromJob(job).map(this::getImageFromPodSpec).orElse(null);
343+
}
343344

344-
Stream<String> getAuxiliaryImagesFromJob(V1Job job) {
345-
return getPodSpecFromJob(job).map(this::getAuxiliaryImagesFromPodSpec).orElse(Stream.empty());
346-
}
345+
List<String> getSortedAuxiliaryImagesFromJob(V1Job job) {
346+
return getAuxiliaryImagesFromJob(job).sorted().toList();
347+
}
347348

348-
Optional<V1PodSpec> getPodSpecFromJob(V1Job job) {
349-
return Optional.ofNullable(job)
350-
.map(V1Job::getSpec)
351-
.map(V1JobSpec::getTemplate)
352-
.map(V1PodTemplateSpec::getSpec);
353-
}
349+
Stream<String> getAuxiliaryImagesFromJob(V1Job job) {
350+
return getPodSpecFromJob(job).map(this::getAuxiliaryImagesFromPodSpec).orElse(Stream.empty());
351+
}
354352

355-
@Nullable
356-
String getImageFromPodSpec(@Nonnull V1PodSpec pod) {
357-
return getContainer(pod)
358-
.map(V1Container::getImage)
359-
.orElse(null);
360-
}
353+
Optional<V1PodSpec> getPodSpecFromJob(V1Job job) {
354+
return Optional.ofNullable(job)
355+
.map(V1Job::getSpec)
356+
.map(V1JobSpec::getTemplate)
357+
.map(V1PodTemplateSpec::getSpec);
358+
}
361359

362-
Stream<String> getAuxiliaryImagesFromPodSpec(@Nonnull V1PodSpec pod) {
363-
return getAuxiliaryContainers(pod)
364-
.map(V1Container::getImage);
365-
}
360+
@Nullable
361+
String getImageFromPodSpec(@Nonnull V1PodSpec pod) {
362+
return getContainer(pod)
363+
.map(V1Container::getImage)
364+
.orElse(null);
365+
}
366366

367-
@Nullable
368-
String getJobModelPodSpecImage() {
369-
return Optional.ofNullable(getJobModelPodSpec()).map(this::getImageFromPodSpec).orElse(null);
370-
}
367+
Stream<String> getAuxiliaryImagesFromPodSpec(@Nonnull V1PodSpec pod) {
368+
return getAuxiliaryContainers(pod)
369+
.map(V1Container::getImage);
370+
}
371371

372-
List<String> getSortedJobModelPodSpecAuxiliaryImages() {
373-
return getJobModelPodSpecAuxiliaryImages().sorted().toList();
374-
}
372+
@Nullable
373+
String getJobModelPodSpecImage() {
374+
return Optional.ofNullable(getJobModelPodSpec()).map(this::getImageFromPodSpec).orElse(null);
375+
}
375376

376-
Stream<String> getJobModelPodSpecAuxiliaryImages() {
377-
return Optional.ofNullable(getJobModelPodSpec())
378-
.map(this::getAuxiliaryImagesFromPodSpec)
379-
.orElse(Stream.empty());
380-
}
377+
List<String> getSortedJobModelPodSpecAuxiliaryImages() {
378+
return getJobModelPodSpecAuxiliaryImages().sorted().toList();
379+
}
381380

382-
@Nullable
383-
String getIntrospectVersionLabelFromJob(V1Job job) {
384-
return Optional.ofNullable(job)
385-
.map(V1Job::getMetadata)
386-
.map(V1ObjectMeta::getLabels)
387-
.map(m -> m.get(INTROSPECTION_STATE_LABEL))
388-
.orElse(null);
389-
}
381+
Stream<String> getJobModelPodSpecAuxiliaryImages() {
382+
return Optional.ofNullable(getJobModelPodSpec())
383+
.map(this::getAuxiliaryImagesFromPodSpec)
384+
.orElse(Stream.empty());
385+
}
390386

391-
private boolean isIntrospectionNeeded(Packet packet) {
392-
return getDomainTopology() == null
387+
@Nullable
388+
String getIntrospectVersionLabelFromJob(V1Job job) {
389+
return Optional.ofNullable(job)
390+
.map(V1Job::getMetadata)
391+
.map(V1ObjectMeta::getLabels)
392+
.map(m -> m.get(INTROSPECTION_STATE_LABEL))
393+
.orElse(null);
394+
}
395+
396+
private boolean isIntrospectionNeeded(Packet packet) {
397+
return getDomainTopology() == null
393398
|| isBringingUpNewDomain(packet)
394399
|| isIntrospectionRequested(packet)
395400
|| isModelInImageUpdate(packet)
396401
|| isIntrospectVersionChanged(packet);
397-
}
402+
}
398403

399-
@Nonnull
400-
private Collection<String> getRunningServerNames() {
401-
return Optional.ofNullable(info).map(DomainPresenceInfo::getServerNames).orElse(Collections.emptyList());
402-
}
404+
@Nonnull
405+
private Collection<String> getRunningServerNames() {
406+
return Optional.ofNullable(info).map(DomainPresenceInfo::getServerNames).orElse(Collections.emptyList());
407+
}
403408

404-
private boolean isBringingUpNewDomain(Packet packet) {
405-
return getNumRunningServers() == 0 && creatingServers(info) && (isDomainGenerationChanged(packet));
406-
}
409+
private boolean isBringingUpNewDomain(Packet packet) {
410+
return getNumRunningServers() == 0 && creatingServers(info) && (isDomainGenerationChanged(packet));
411+
}
407412

408-
private int getNumRunningServers() {
409-
return info.getServerNames().size();
410-
}
413+
private int getNumRunningServers() {
414+
return info.getServerNames().size();
415+
}
411416

412-
private boolean isDomainGenerationChanged(Packet packet) {
413-
return Optional.ofNullable(packet.get(INTROSPECTION_DOMAIN_SPEC_GENERATION))
414-
.map(gen -> !gen.equals(getDomainGeneration())).orElse(true);
415-
}
417+
private boolean isDomainGenerationChanged(Packet packet) {
418+
return Optional.ofNullable(packet.get(INTROSPECTION_DOMAIN_SPEC_GENERATION))
419+
.map(gen -> !gen.equals(getDomainGeneration())).orElse(true);
420+
}
416421

417-
private String getDomainGeneration() {
418-
return Optional.ofNullable(getDomain())
422+
private String getDomainGeneration() {
423+
return Optional.ofNullable(getDomain())
419424
.map(DomainResource::getMetadata)
420425
.map(V1ObjectMeta::getGeneration)
421426
.map(Object::toString)
422427
.orElse("");
423-
}
428+
}
424429

425-
// Returns true if an introspection was requested. Clears the flag in any case.
426-
private boolean isIntrospectionRequested(Packet packet) {
427-
return packet.remove(DOMAIN_INTROSPECT_REQUESTED) != null;
428-
}
430+
// Returns true if an introspection was requested. Clears the flag in any case.
431+
private boolean isIntrospectionRequested(Packet packet) {
432+
return packet.remove(DOMAIN_INTROSPECT_REQUESTED) != null;
433+
}
429434

430-
private boolean isModelInImageUpdate(Packet packet) {
431-
return isModelInImage() && !getCurrentImageSpecHash().equals(getIntrospectionImageSpecHash(packet));
432-
}
435+
private boolean isModelInImageUpdate(Packet packet) {
436+
return isModelInImage() && !getCurrentImageSpecHash().equals(getIntrospectionImageSpecHash(packet));
437+
}
433438

434-
private boolean isModelInImage() {
435-
return getDomain().getDomainHomeSourceType() == FROM_MODEL;
436-
}
439+
private boolean isModelInImage() {
440+
return getDomain().getDomainHomeSourceType() == FROM_MODEL;
441+
}
437442

438-
private String getCurrentImageSpecHash() {
439-
return String.valueOf(ConfigMapHelper.getModelInImageSpecHash(getDomain().getSpec().getImage()));
440-
}
443+
private String getCurrentImageSpecHash() {
444+
return String.valueOf(ConfigMapHelper.getModelInImageSpecHash(getDomain().getSpec().getImage()));
445+
}
441446

442-
private String getIntrospectionImageSpecHash(Packet packet) {
443-
return (String) packet.get(IntrospectorConfigMapConstants.DOMAIN_INPUTS_HASH);
444-
}
447+
private String getIntrospectionImageSpecHash(Packet packet) {
448+
return (String) packet.get(IntrospectorConfigMapConstants.DOMAIN_INPUTS_HASH);
449+
}
445450

446-
private boolean isIntrospectVersionChanged(Packet packet) {
447-
return Optional.ofNullable(packet.get(INTROSPECTION_STATE_LABEL))
448-
.map(introspectVersionLabel -> !introspectVersionLabel.equals(getIntrospectVersion())).orElse(false);
449-
}
451+
private boolean isIntrospectVersionChanged(Packet packet) {
452+
return Optional.ofNullable(packet.get(INTROSPECTION_STATE_LABEL))
453+
.map(introspectVersionLabel -> !introspectVersionLabel.equals(getIntrospectVersion())).orElse(false);
454+
}
450455

451-
private String getIntrospectVersion() {
452-
return Optional.ofNullable(getDomain()).map(DomainResource::getSpec).map(DomainSpec::getIntrospectVersion)
453-
.orElse("");
454-
}
456+
private String getIntrospectVersion() {
457+
return Optional.ofNullable(getDomain()).map(DomainResource::getSpec).map(DomainSpec::getIntrospectVersion)
458+
.orElse("");
455459
}
456460

457461
private Step cleanUpAndReintrospect(Step next) {
@@ -485,7 +489,20 @@ private class CheckForFailedIntrospectorStep extends Step {
485489
Step.chain(createIntrospectionFailureSteps(getFailedReason(domainIntrospectorJob), domainIntrospectorJob),
486490
cleanUpAndReintrospect(getNext())), packet);
487491
}
492+
493+
// TEST
494+
LOGGER.severe("**** RJE: job complete, " + printJob(domainIntrospectorJob)
495+
+ ", domain " + print(getDomain()));
496+
488497
if (JobWatcher.isComplete(domainIntrospectorJob)) {
498+
if (isOutdated(domainIntrospectorJob)) {
499+
500+
// TEST
501+
LOGGER.severe("**** RJE: job outdated; replace, " + printJob(domainIntrospectorJob)
502+
+ ", domain " + print(getDomain()));
503+
504+
return doNext(cleanUpAndReintrospect(getNext()), packet);
505+
}
489506
return doNext(createRemoveFailuresStep(getNext()), packet);
490507
}
491508
return doNext(packet);

0 commit comments

Comments
 (0)