diff --git a/.github/workflows/stale-issues-and-prs.yml b/.github/workflows/stale-issues-and-prs.yml deleted file mode 100644 index db295a49b6..0000000000 --- a/.github/workflows/stale-issues-and-prs.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: 'Close stale issues and PRs' -on: - workflow_dispatch: - schedule: - - cron: '30 1 * * *' - -jobs: - stale: - runs-on: ubuntu-latest - steps: - - uses: actions/stale@v9 - with: - days-before-issue-stale: 60 - days-before-pr-stale: 60 - days-before-issue-close: 14 - days-before-pr-close: 14 - stale-issue-message: > - This issue is stale because it has been open 60 days with no activity. - Remove stale label or comment or this will be closed in 14 days. - close-issue-message: > - This issue was closed because it has been stalled for 14 days with no activity. - stale-pr-message: > - This PR is stale because it has been open 60 days with no activity. - Remove stale label or comment or this will be closed in 14 days. - close-pr-message: > - This PR was closed because it has been stalled for 10 days with no activity. - stale-issue-label: 'stale' - exempt-issue-labels: 'needs-discussion,help wanted,never stale,feature' - stale-pr-label: 'stale' - exempt-pr-labels: 'never stale' - operations-per-run: 500 - ascending: true \ No newline at end of file diff --git a/bootstrapper-maven-plugin/pom.xml b/bootstrapper-maven-plugin/pom.xml index 54eff9484f..203232a79f 100644 --- a/bootstrapper-maven-plugin/pom.xml +++ b/bootstrapper-maven-plugin/pom.xml @@ -5,7 +5,7 @@ java-operator-sdk io.javaoperatorsdk - 4.8.1-SNAPSHOT + 4.8.2-SNAPSHOT bootstrapper diff --git a/caffeine-bounded-cache-support/pom.xml b/caffeine-bounded-cache-support/pom.xml index dcb293e86d..b3b15ef3c0 100644 --- a/caffeine-bounded-cache-support/pom.xml +++ b/caffeine-bounded-cache-support/pom.xml @@ -5,7 +5,7 @@ java-operator-sdk io.javaoperatorsdk - 4.8.1-SNAPSHOT + 4.8.2-SNAPSHOT 4.0.0 diff --git a/micrometer-support/pom.xml b/micrometer-support/pom.xml index 0ecfd38d9c..9448f4fb34 100644 --- a/micrometer-support/pom.xml +++ b/micrometer-support/pom.xml @@ -5,7 +5,7 @@ java-operator-sdk io.javaoperatorsdk - 4.8.1-SNAPSHOT + 4.8.2-SNAPSHOT 4.0.0 diff --git a/operator-framework-bom/pom.xml b/operator-framework-bom/pom.xml index 4367d104d2..64d4e47183 100644 --- a/operator-framework-bom/pom.xml +++ b/operator-framework-bom/pom.xml @@ -5,7 +5,7 @@ io.javaoperatorsdk operator-framework-bom - 4.8.1-SNAPSHOT + 4.8.2-SNAPSHOT Operator SDK - Bill of Materials pom Java SDK for implementing Kubernetes operators @@ -61,7 +61,7 @@ 1.6.13 - 3.1.0 + 3.2.1 3.3.0 3.6.3 diff --git a/operator-framework-core/pom.xml b/operator-framework-core/pom.xml index 9f29d69e28..2f57cdfc88 100644 --- a/operator-framework-core/pom.xml +++ b/operator-framework-core/pom.xml @@ -6,7 +6,7 @@ io.javaoperatorsdk java-operator-sdk - 4.8.1-SNAPSHOT + 4.8.2-SNAPSHOT ../pom.xml diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java index 53bfc75df9..92859421eb 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java @@ -4,6 +4,7 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.function.Consumer; import org.slf4j.Logger; @@ -24,8 +25,6 @@ import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent; import io.javaoperatorsdk.operator.processing.dependent.workflow.ManagedWorkflowFactory; -import static io.javaoperatorsdk.operator.api.config.ExecutorServiceManager.newThreadPoolExecutor; - /** An interface from which to retrieve configuration information. */ public interface ConfigurationService { @@ -127,14 +126,18 @@ default boolean checkCRDAndValidateLocalModel() { return false; } - int DEFAULT_RECONCILIATION_THREADS_NUMBER = 200; + int DEFAULT_RECONCILIATION_THREADS_NUMBER = 50; + /** + * @deprecated Not used anymore in the default implementation + */ + @Deprecated(forRemoval = true) int MIN_DEFAULT_RECONCILIATION_THREADS_NUMBER = 10; /** - * The maximum number of threads the operator can spin out to dispatch reconciliation requests to - * reconcilers + * The number of threads the operator can spin out to dispatch reconciliation requests to + * reconcilers with the default executors * - * @return the maximum number of concurrent reconciliation threads + * @return the number of concurrent reconciliation threads */ default int concurrentReconciliationThreads() { return DEFAULT_RECONCILIATION_THREADS_NUMBER; @@ -143,17 +146,24 @@ default int concurrentReconciliationThreads() { /** * The minimum number of threads the operator starts in the thread pool for reconciliations. * + * @deprecated not used anymore by default executor implementation * @return the minimum number of concurrent reconciliation threads */ + @Deprecated(forRemoval = true) default int minConcurrentReconciliationThreads() { return MIN_DEFAULT_RECONCILIATION_THREADS_NUMBER; } int DEFAULT_WORKFLOW_EXECUTOR_THREAD_NUMBER = DEFAULT_RECONCILIATION_THREADS_NUMBER; + /** + * @deprecated Not used anymore in the default implementation + */ + @Deprecated(forRemoval = true) int MIN_DEFAULT_WORKFLOW_EXECUTOR_THREAD_NUMBER = MIN_DEFAULT_RECONCILIATION_THREADS_NUMBER; /** - * Retrieves the maximum number of threads the operator can spin out to be used in the workflows. + * Number of threads the operator can spin out to be used in the workflows with the default + * executor. * * @return the maximum number of concurrent workflow threads */ @@ -164,8 +174,10 @@ default int concurrentWorkflowExecutorThreads() { /** * The minimum number of threads the operator starts in the thread pool for workflows. * + * @deprecated not used anymore by default executor implementation * @return the minimum number of concurrent workflow threads */ + @Deprecated(forRemoval = true) default int minConcurrentWorkflowExecutorThreads() { return MIN_DEFAULT_WORKFLOW_EXECUTOR_THREAD_NUMBER; } @@ -191,13 +203,11 @@ default Metrics getMetrics() { } default ExecutorService getExecutorService() { - return newThreadPoolExecutor(minConcurrentReconciliationThreads(), - concurrentReconciliationThreads()); + return Executors.newFixedThreadPool(concurrentReconciliationThreads()); } default ExecutorService getWorkflowExecutorService() { - return newThreadPoolExecutor(minConcurrentWorkflowExecutorThreads(), - concurrentWorkflowExecutorThreads()); + return Executors.newFixedThreadPool(concurrentWorkflowExecutorThreads()); } default boolean closeClientOnStop() { diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java index 5879383464..12a8a5c699 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java @@ -218,13 +218,21 @@ public int concurrentWorkflowExecutorThreads() { original.concurrentWorkflowExecutorThreads()); } + /** + * @deprecated Not used anymore in the default implementation + */ + @Deprecated(forRemoval = true) @Override public int minConcurrentReconciliationThreads() { return minConcurrentReconciliationThreads != null ? minConcurrentReconciliationThreads : original.minConcurrentReconciliationThreads(); } + /** + * @deprecated Not used anymore in the default implementation + */ @Override + @Deprecated(forRemoval = true) public int minConcurrentWorkflowExecutorThreads() { return minConcurrentWorkflowExecutorThreads != null ? minConcurrentWorkflowExecutorThreads : original.minConcurrentWorkflowExecutorThreads(); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ExecutorServiceManager.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ExecutorServiceManager.java index 3ea05e7e0d..112ab7188a 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ExecutorServiceManager.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ExecutorServiceManager.java @@ -8,8 +8,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Function; @@ -35,14 +33,6 @@ public class ExecutorServiceManager { start(configurationService); } - public static ExecutorService newThreadPoolExecutor(int minThreads, int maxThreads) { - minThreads = Utils.ensureValid(minThreads, "minimum number of threads", MIN_THREAD_NUMBER); - maxThreads = Utils.ensureValid(maxThreads, "maximum number of threads", minThreads + 1); - - return new ThreadPoolExecutor(minThreads, maxThreads, 1, TimeUnit.MINUTES, - new LinkedBlockingDeque<>()); - } - /** * Uses cachingExecutorService from this manager. Use this only for tasks, that don't have dynamic * nature, in sense that won't grow with the number of inputs (thus kubernetes resources) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/Utils.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/Utils.java index 19d8a73689..84f76d9883 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/Utils.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/Utils.java @@ -6,7 +6,6 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.text.SimpleDateFormat; import java.time.Instant; import java.util.Arrays; import java.util.Date; @@ -57,9 +56,7 @@ public static Version loadFromProperties() { try { String time = properties.getProperty("git.build.time"); if (time != null) { - builtTime = - // RFC 822 date is the default format used by git-commit-id-plugin - new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(time); + builtTime = Date.from(Instant.parse(time)); } else { builtTime = Date.from(Instant.EPOCH); } @@ -122,9 +119,13 @@ static boolean getBooleanFromSystemPropsOrDefault(String propertyName, boolean d } public static Class getFirstTypeArgumentFromExtendedClass(Class clazz) { + return getTypeArgumentFromExtendedClassByIndex(clazz, 0); + } + + public static Class getTypeArgumentFromExtendedClassByIndex(Class clazz, int index) { try { Type type = clazz.getGenericSuperclass(); - return (Class) ((ParameterizedType) type).getActualTypeArguments()[0]; + return (Class) ((ParameterizedType) type).getActualTypeArguments()[index]; } catch (Exception e) { throw new RuntimeException(GENERIC_PARAMETER_TYPE_ERROR_PREFIX + clazz.getSimpleName() @@ -193,27 +194,31 @@ private static Optional> extractType(Class clazz, public static Class getFirstTypeArgumentFromSuperClassOrInterface(Class clazz, Class expectedImplementedInterface) { + return getTypeArgumentFromSuperClassOrInterfaceByIndex(clazz, expectedImplementedInterface, 0); + } + + public static Class getTypeArgumentFromSuperClassOrInterfaceByIndex(Class clazz, + Class expectedImplementedInterface, int index) { // first check super class if it exists try { final Class superclass = clazz.getSuperclass(); if (!superclass.equals(Object.class)) { try { - return getFirstTypeArgumentFromExtendedClass(clazz); + return getTypeArgumentFromExtendedClassByIndex(clazz, index); } catch (Exception e) { // try interfaces try { - return getFirstTypeArgumentFromInterface(clazz, expectedImplementedInterface); + return getTypeArgumentFromInterfaceByIndex(clazz, expectedImplementedInterface, index); } catch (Exception ex) { // try on the parent - return getFirstTypeArgumentFromSuperClassOrInterface(superclass, - expectedImplementedInterface); + return getTypeArgumentFromSuperClassOrInterfaceByIndex(superclass, + expectedImplementedInterface, index); } } } - return getFirstTypeArgumentFromInterface(clazz, expectedImplementedInterface); + return getTypeArgumentFromInterfaceByIndex(clazz, expectedImplementedInterface, index); } catch (Exception e) { - throw new OperatorException( - GENERIC_PARAMETER_TYPE_ERROR_PREFIX + clazz.getSimpleName(), e); + throw new OperatorException(GENERIC_PARAMETER_TYPE_ERROR_PREFIX + clazz.getSimpleName(), e); } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesDependentResource.java index 98f2346577..9897ee71e2 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesDependentResource.java @@ -2,13 +2,14 @@ import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.api.config.Utils; import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; import io.javaoperatorsdk.operator.processing.GroupVersionKind; public class GenericKubernetesDependentResource

extends KubernetesDependentResource { - private GroupVersionKind groupVersionKind; + private final GroupVersionKind groupVersionKind; public GenericKubernetesDependentResource(GroupVersionKind groupVersionKind) { super(GenericKubernetesResource.class); @@ -19,6 +20,13 @@ protected InformerConfiguration.InformerConfigurationBuilder getPrimaryResourceType() { + return (Class

) Utils.getFirstTypeArgumentFromExtendedClass(getClass()); + } + + @SuppressWarnings("unused") public GroupVersionKind getGroupVersionKind() { return groupVersionKind; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java index b804b88a30..80ed55a5ed 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java @@ -8,15 +8,18 @@ import org.slf4j.LoggerFactory; import io.fabric8.kubernetes.api.model.HasMetadata; +import io.fabric8.kubernetes.api.model.Namespaced; import io.fabric8.kubernetes.client.dsl.Resource; import io.javaoperatorsdk.operator.OperatorException; import io.javaoperatorsdk.operator.ReconcilerUtils; +import io.javaoperatorsdk.operator.api.config.Utils; import io.javaoperatorsdk.operator.api.config.dependent.Configured; import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; import io.javaoperatorsdk.operator.api.reconciler.Constants; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; import io.javaoperatorsdk.operator.api.reconciler.Ignore; +import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected; import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DependentResourceConfigurator; import io.javaoperatorsdk.operator.processing.dependent.AbstractEventSourceHolderDependentResource; @@ -32,23 +35,32 @@ converter = KubernetesDependentConverter.class) public abstract class KubernetesDependentResource extends AbstractEventSourceHolderDependentResource> - implements DependentResourceConfigurator> { - + implements DependentResourceConfigurator>, + DependentResource { private static final Logger log = LoggerFactory.getLogger(KubernetesDependentResource.class); - private final ResourceUpdaterMatcher updaterMatcher; private final boolean garbageCollected = this instanceof GarbageCollected; + private final boolean usingCustomResourceUpdateMatcher = this instanceof ResourceUpdaterMatcher; + @SuppressWarnings("unchecked") + private final ResourceUpdaterMatcher updaterMatcher = usingCustomResourceUpdateMatcher + ? (ResourceUpdaterMatcher) this + : GenericResourceUpdaterMatcher.updaterMatcherFor(resourceType()); + private final boolean clustered; private KubernetesDependentResourceConfig kubernetesDependentResourceConfig; - private final boolean usingCustomResourceUpdateMatcher; - - @SuppressWarnings("unchecked") public KubernetesDependentResource(Class resourceType) { super(resourceType); + final var primaryResourceType = getPrimaryResourceType(); + clustered = !Namespaced.class.isAssignableFrom(primaryResourceType); + } - usingCustomResourceUpdateMatcher = this instanceof ResourceUpdaterMatcher; - updaterMatcher = usingCustomResourceUpdateMatcher - ? (ResourceUpdaterMatcher) this - : GenericResourceUpdaterMatcher.updaterMatcherFor(resourceType); + protected KubernetesDependentResource(Class resourceType, boolean primaryIsClustered) { + super(resourceType); + clustered = primaryIsClustered; + } + + @SuppressWarnings("unchecked") + protected Class

getPrimaryResourceType() { + return (Class

) Utils.getTypeArgumentFromExtendedClassByIndex(getClass(), 1); } @SuppressWarnings("unchecked") @@ -87,7 +99,7 @@ private SecondaryToPrimaryMapper getSecondaryToPrimaryMapper() { if (this instanceof SecondaryToPrimaryMapper) { return (SecondaryToPrimaryMapper) this; } else if (garbageCollected) { - return Mappers.fromOwnerReferences(false); + return Mappers.fromOwnerReferences(clustered); } else if (useNonOwnerRefBasedSecondaryToPrimaryMapping()) { return Mappers.fromDefaultAnnotations(); } else { diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/SSABasedGenericKubernetesResourceMatcher.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/SSABasedGenericKubernetesResourceMatcher.java index d699ff2822..bcfaa52d1a 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/SSABasedGenericKubernetesResourceMatcher.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/SSABasedGenericKubernetesResourceMatcher.java @@ -41,6 +41,10 @@ public class SSABasedGenericKubernetesResourceMatcher { public static final String APPLY_OPERATION = "Apply"; public static final String DOT_KEY = "."; + private static final List IGNORED_METADATA = + Arrays.asList("creationTimestamp", "deletionTimestamp", + "generation", "selfLink", "uid"); + @SuppressWarnings("unchecked") public static SSABasedGenericKubernetesResourceMatcher getInstance() { return INSTANCE; @@ -58,11 +62,10 @@ public static SSABasedGenericKubernetesResourceMatcher context) { - var optionalManagedFieldsEntry = - checkIfFieldManagerExists(actual, context.getControllerConfiguration().fieldManager()); + var optionalManagedFieldsEntry = checkIfFieldManagerExists(actual, + context.getControllerConfiguration().fieldManager()); // If no field is managed by our controller, that means the controller hasn't touched the // resource yet and the resource probably doesn't match the desired state. Not matching here // means that the resource will need to be updated and since this will be done using SSA, the @@ -86,7 +89,8 @@ public boolean matches(R actual, R desired, Context context) { var prunedActual = new HashMap(actualMap.size()); keepOnlyManagedFields(prunedActual, actualMap, - managedFieldsEntry.getFieldsV1().getAdditionalProperties(), objectMapper); + managedFieldsEntry.getFieldsV1().getAdditionalProperties(), + objectMapper); removeIrrelevantValues(desiredMap); @@ -110,9 +114,8 @@ private void sanitizeState(R actual, R desired, Map actualMap) { for (int i = 0; i < claims; i++) { if (desiredStatefulSet.getSpec().getVolumeClaimTemplates().get(i).getSpec() .getVolumeMode() == null) { - Optional - .ofNullable(GenericKubernetesResource.get(actualMap, "spec", "volumeClaimTemplates", - i, "spec")) + Optional.ofNullable( + GenericKubernetesResource.get(actualMap, "spec", "volumeClaimTemplates", i, "spec")) .map(Map.class::cast).ifPresent(m -> m.remove("volumeMode")); } if (desiredStatefulSet.getSpec().getVolumeClaimTemplates().get(i).getStatus() == null) { @@ -131,6 +134,7 @@ private static void removeIrrelevantValues(Map desiredMap) { var metadata = (Map) desiredMap.get(METADATA_KEY); metadata.remove(NAME_KEY); metadata.remove(NAMESPACE_KEY); + IGNORED_METADATA.forEach(metadata::remove); if (metadata.isEmpty()) { desiredMap.remove(METADATA_KEY); } @@ -163,7 +167,8 @@ private static void keepOnlyManagedFields(Map result, } else { // basically if we should traverse further fillResultsAndTraverseFurther(result, actualMap, managedFields, objectMapper, key, - keyInActual, managedFieldValue); + keyInActual, + managedFieldValue); } } else { // this should handle the case when the value is complex in the actual map (not just a @@ -181,8 +186,9 @@ private static void keepOnlyManagedFields(Map result, @SuppressWarnings("unchecked") private static void fillResultsAndTraverseFurther(Map result, - Map actualMap, Map managedFields, - KubernetesSerialization objectMapper, String key, String keyInActual, + Map actualMap, + Map managedFields, KubernetesSerialization objectMapper, String key, + String keyInActual, Object managedFieldValue) { var emptyMapValue = new HashMap(); result.put(keyInActual, emptyMapValue); @@ -223,8 +229,9 @@ private static void handleListKeyEntrySet(Map result, if (DOT_KEY.equals(listEntry.getKey())) { continue; } - var actualListEntry = selectListEntryBasedOnKey(keyWithoutPrefix(listEntry.getKey()), - actualValueList, objectMapper); + var actualListEntry = + selectListEntryBasedOnKey(keyWithoutPrefix(listEntry.getKey()), actualValueList, + objectMapper); targetValuesByIndex.put(actualListEntry.getKey(), actualListEntry.getValue()); managedEntryByIndex.put(actualListEntry.getKey(), (Map) listEntry.getValue()); } @@ -301,8 +308,7 @@ private static boolean isKeyPrefixedSkippingDotKey(Set @SuppressWarnings("unchecked") private static java.util.Map.Entry> selectListEntryBasedOnKey( String key, - List> values, - KubernetesSerialization objectMapper) { + List> values, KubernetesSerialization objectMapper) { Map ids = objectMapper.unmarshal(key, Map.class); List> possibleTargets = new ArrayList<>(1); int index = -1; @@ -314,9 +320,8 @@ private static java.util.Map.Entry> selectListEntry } } if (possibleTargets.isEmpty()) { - throw new IllegalStateException( - "Cannot find list element for key:" + key + ", in map: " - + values.stream().map(Map::keySet).collect(Collectors.toList())); + throw new IllegalStateException("Cannot find list element for key:" + key + ", in map: " + + values.stream().map(Map::keySet).collect(Collectors.toList())); } if (possibleTargets.size() > 1) { throw new IllegalStateException( @@ -327,7 +332,6 @@ private static java.util.Map.Entry> selectListEntry return new AbstractMap.SimpleEntry<>(finalIndex, possibleTargets.get(0)); } - private Optional checkIfFieldManagerExists(R actual, String fieldManager) { var targetManagedFields = actual.getMetadata().getManagedFields().stream() // Only the apply operations are interesting for us since those were created properly be SSA @@ -338,14 +342,14 @@ private Optional checkIfFieldManagerExists(R actual, String .collect(Collectors.toList()); if (targetManagedFields.isEmpty()) { log.debug("No field manager exists for resource {} with name: {} and operation Apply ", - actual.getKind(), actual.getMetadata().getName()); + actual.getKind(), + actual.getMetadata().getName()); return Optional.empty(); } // this should not happen in theory if (targetManagedFields.size() > 1) { - throw new OperatorException( - "More than one field manager exists with name: " + fieldManager + "in resource: " + - actual.getKind() + " with name: " + actual.getMetadata().getName()); + throw new OperatorException("More than one field manager exists with name: " + fieldManager + + "in resource: " + actual.getKind() + " with name: " + actual.getMetadata().getName()); } return Optional.of(targetManagedFields.get(0)); } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutorTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutorTest.java index 941c3fa434..0bde1620d8 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutorTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutorTest.java @@ -42,6 +42,11 @@ public TestDependent(String name) { this.name = name; } + @Override + protected Class getPrimaryResourceType() { + return TestCustomResource.class; + } + @Override public ReconcileResult reconcile(TestCustomResource primary, Context context) { diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventProcessorTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventProcessorTest.java index 9d538713c1..93e58a55c6 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventProcessorTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventProcessorTest.java @@ -434,7 +434,6 @@ void executionOfReconciliationShouldNotStartIfProcessorStopped() throws Interrup new BaseConfigurationService(), o -> { o.withConcurrentReconciliationThreads(1); - o.withMinConcurrentReconciliationThreads(1); }); eventProcessor = spy(new EventProcessor(controllerConfiguration(null, rateLimiterMock, configurationService), diff --git a/operator-framework-core/src/test/resources/io/javaoperatorsdk/operator/processing/dependent/kubernetes/deployment-with-managed-fields-additional-controller.yaml b/operator-framework-core/src/test/resources/io/javaoperatorsdk/operator/processing/dependent/kubernetes/deployment-with-managed-fields-additional-controller.yaml index 5e0be88433..d82b5c8933 100644 --- a/operator-framework-core/src/test/resources/io/javaoperatorsdk/operator/processing/dependent/kubernetes/deployment-with-managed-fields-additional-controller.yaml +++ b/operator-framework-core/src/test/resources/io/javaoperatorsdk/operator/processing/dependent/kubernetes/deployment-with-managed-fields-additional-controller.yaml @@ -4,7 +4,7 @@ metadata: annotations: deployment.kubernetes.io/revision: "1" creationTimestamp: "2023-06-01T08:43:47Z" - generation: 1 + generation: 2 managedFields: - apiVersion: apps/v1 fieldsType: FieldsV1 diff --git a/operator-framework-core/src/test/resources/io/javaoperatorsdk/operator/processing/dependent/kubernetes/nginx-deployment.yaml b/operator-framework-core/src/test/resources/io/javaoperatorsdk/operator/processing/dependent/kubernetes/nginx-deployment.yaml index dcf90a8fc7..5478ac1747 100644 --- a/operator-framework-core/src/test/resources/io/javaoperatorsdk/operator/processing/dependent/kubernetes/nginx-deployment.yaml +++ b/operator-framework-core/src/test/resources/io/javaoperatorsdk/operator/processing/dependent/kubernetes/nginx-deployment.yaml @@ -2,6 +2,7 @@ apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: "test" + generation: 1 spec: progressDeadlineSeconds: 600 revisionHistoryLimit: 10 diff --git a/operator-framework-junit5/pom.xml b/operator-framework-junit5/pom.xml index d7ca656556..8e3baddfb9 100644 --- a/operator-framework-junit5/pom.xml +++ b/operator-framework-junit5/pom.xml @@ -5,7 +5,7 @@ java-operator-sdk io.javaoperatorsdk - 4.8.1-SNAPSHOT + 4.8.2-SNAPSHOT 4.0.0 diff --git a/operator-framework/pom.xml b/operator-framework/pom.xml index e1cad88810..beabd00dce 100644 --- a/operator-framework/pom.xml +++ b/operator-framework/pom.xml @@ -5,7 +5,7 @@ java-operator-sdk io.javaoperatorsdk - 4.8.1-SNAPSHOT + 4.8.2-SNAPSHOT 4.0.0 diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterBulkDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterBulkDependentResource.java index 29a9af89e7..cc3b150104 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterBulkDependentResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterBulkDependentResource.java @@ -34,6 +34,11 @@ public ConfigMapDeleterBulkDependentResource() { super(ConfigMap.class); } + @Override + protected Class getPrimaryResourceType() { + return BulkDependentTestCustomResource.class; + } + @Override public Map desiredResources(BulkDependentTestCustomResource primary, Context context) { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseDependentResource.java index 08e7e5fe2e..eee439cbfe 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseDependentResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/dependent/BaseDependentResource.java @@ -16,6 +16,11 @@ public BaseDependentResource(Class resourceType, String component) { this.component = component; } + @Override + protected Class getPrimaryResourceType() { + return ComplexDependentCustomResource.class; + } + protected String name(ComplexDependentCustomResource primary) { return String.format("%s-%s", component, primary.getSpec().getProjectId()); } diff --git a/pom.xml b/pom.xml index c23fb0b3c6..7f72c869a0 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ io.javaoperatorsdk java-operator-sdk - 4.8.1-SNAPSHOT + 4.8.2-SNAPSHOT Operator SDK for Java Java SDK for implementing Kubernetes operators pom @@ -46,7 +46,7 @@ 5.10.1 6.10.0 1.7.36 - 2.23.0 + 2.23.1 5.11.0 3.14.0 0.21.0 @@ -54,7 +54,7 @@ 3.25.3 4.2.0 2.7.3 - 1.12.3 + 1.12.4 4.12.0 3.1.8 0.9.6 @@ -69,11 +69,11 @@ 3.3.0 3.3.0 3.3.2 - 3.1.0 + 3.2.1 1.6.13 3.0.0 3.1.1 - 8.0.0 + 8.0.2 2.23.0 1.0 1.9.0 diff --git a/sample-operators/leader-election/pom.xml b/sample-operators/leader-election/pom.xml index 648417c8fb..351d31a00c 100644 --- a/sample-operators/leader-election/pom.xml +++ b/sample-operators/leader-election/pom.xml @@ -7,7 +7,7 @@ io.javaoperatorsdk sample-operators - 4.8.1-SNAPSHOT + 4.8.2-SNAPSHOT sample-leader-election diff --git a/sample-operators/mysql-schema/pom.xml b/sample-operators/mysql-schema/pom.xml index a9b43df1e1..aa27625bd2 100644 --- a/sample-operators/mysql-schema/pom.xml +++ b/sample-operators/mysql-schema/pom.xml @@ -7,7 +7,7 @@ io.javaoperatorsdk sample-operators - 4.8.1-SNAPSHOT + 4.8.2-SNAPSHOT sample-mysql-schema-operator diff --git a/sample-operators/pom.xml b/sample-operators/pom.xml index e383d1e038..62b8b6f8ed 100644 --- a/sample-operators/pom.xml +++ b/sample-operators/pom.xml @@ -7,7 +7,7 @@ io.javaoperatorsdk java-operator-sdk - 4.8.1-SNAPSHOT + 4.8.2-SNAPSHOT sample-operators diff --git a/sample-operators/tomcat-operator/pom.xml b/sample-operators/tomcat-operator/pom.xml index 2311d22d57..904d030974 100644 --- a/sample-operators/tomcat-operator/pom.xml +++ b/sample-operators/tomcat-operator/pom.xml @@ -7,7 +7,7 @@ io.javaoperatorsdk sample-operators - 4.8.1-SNAPSHOT + 4.8.2-SNAPSHOT sample-tomcat-operator diff --git a/sample-operators/webpage/pom.xml b/sample-operators/webpage/pom.xml index 4ba8eb8991..0dca7ed97e 100644 --- a/sample-operators/webpage/pom.xml +++ b/sample-operators/webpage/pom.xml @@ -7,7 +7,7 @@ io.javaoperatorsdk sample-operators - 4.8.1-SNAPSHOT + 4.8.2-SNAPSHOT sample-webpage-operator