Skip to content

Commit

Permalink
feat: update to fabric8 client v6.0.0 (#1305)
Browse files Browse the repository at this point in the history
  • Loading branch information
csviri committed Jul 25, 2022
1 parent f766350 commit d74559a
Show file tree
Hide file tree
Showing 51 changed files with 172 additions and 169 deletions.
2 changes: 0 additions & 2 deletions operator-framework-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,10 @@


<dependencies>
<!-- We use the OpenShift client, because functionally it is a superset of the Kubernetes client -->
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>kubernetes-client</artifactId>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,9 @@
import io.javaoperatorsdk.operator.processing.event.ResourceID;
import io.javaoperatorsdk.operator.processing.event.source.Cache;
import io.javaoperatorsdk.operator.processing.event.source.IndexerResourceCache;
import io.javaoperatorsdk.operator.processing.event.source.UpdatableCache;

public class InformerManager<T extends HasMetadata, C extends ResourceConfiguration<T>>
implements LifecycleAware, IndexerResourceCache<T>, UpdatableCache<T> {
implements LifecycleAware, IndexerResourceCache<T> {

private static final String ALL_NAMESPACES_MAP_KEY = "allNamespaces";
private static final Logger log = LoggerFactory.getLogger(InformerManager.class);
Expand Down Expand Up @@ -95,7 +94,7 @@ public void changeNamespaces(Set<String> namespaces) {


private InformerWrapper<T> createEventSource(
FilterWatchListDeletable<T, KubernetesResourceList<T>> filteredBySelectorClient,
FilterWatchListDeletable<T, KubernetesResourceList<T>, Resource<T>> filteredBySelectorClient,
ResourceEventHandler<T> eventHandler, String key) {
var source = new InformerWrapper<>(filteredBySelectorClient.runnableInformer(0));
source.addEventHandler(eventHandler);
Expand Down Expand Up @@ -157,22 +156,6 @@ private Optional<InformerWrapper<T>> getSource(String namespace) {
return Optional.ofNullable(sources.get(namespace));
}

@Override
public T remove(ResourceID key) {
return getSource(key.getNamespace().orElse(ALL_NAMESPACES_MAP_KEY))
.map(c -> c.remove(key))
.orElse(null);
}

@Override
public void put(ResourceID key, T resource) {
getSource(key.getNamespace().orElse(ALL_NAMESPACES_MAP_KEY))
.ifPresentOrElse(c -> c.put(key, resource),
() -> log.warn(
"Cannot put resource in the cache. No related cache found: {}. Resource: {}",
key, resource));
}

@Override
public void addIndexers(Map<String, Function<T, List<String>>> indexers) {
this.indexers.putAll(indexers);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;
Expand All @@ -17,10 +16,9 @@
import io.javaoperatorsdk.operator.processing.LifecycleAware;
import io.javaoperatorsdk.operator.processing.event.ResourceID;
import io.javaoperatorsdk.operator.processing.event.source.IndexerResourceCache;
import io.javaoperatorsdk.operator.processing.event.source.UpdatableCache;

class InformerWrapper<T extends HasMetadata>
implements LifecycleAware, IndexerResourceCache<T>, UpdatableCache<T> {
implements LifecycleAware, IndexerResourceCache<T> {

private final SharedIndexInformer<T> informer;
private final Cache<T> cache;
Expand Down Expand Up @@ -72,22 +70,6 @@ public Stream<ResourceID> keys() {
return cache.listKeys().stream().map(Mappers::fromString);
}

@Override
public T remove(ResourceID key) {
return cache.remove(cache.getByKey(getKey(key)));
}

@Override
public void put(ResourceID key, T resource) {
// check that key matches the resource
final var fromResource = ResourceID.fromResource(resource);
if (!Objects.equals(key, fromResource)) {
throw new IllegalArgumentException(
"Key and resource don't match. Key: " + key + ", resource: " + fromResource);
}
cache.put(resource);
}

public void addEventHandler(ResourceEventHandler<T> eventHandler) {
informer.addEventHandler(eventHandler);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,7 @@
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.V1ApiextensionAPIGroupDSL;
import io.fabric8.kubernetes.client.dsl.ApiextensionsAPIGroupDSL;
import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable;
import io.fabric8.kubernetes.client.dsl.FilterWatchListMultiDeletable;
import io.fabric8.kubernetes.client.dsl.MixedOperation;
import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;
import io.fabric8.kubernetes.client.dsl.Resource;
import io.fabric8.kubernetes.client.dsl.*;
import io.fabric8.kubernetes.client.informers.SharedIndexInformer;
import io.fabric8.kubernetes.client.informers.cache.Indexer;

Expand All @@ -28,9 +23,9 @@ public static <T extends HasMetadata> KubernetesClient client(Class<T> clazz) {
mock(MixedOperation.class);
NonNamespaceOperation<T, KubernetesResourceList<T>, Resource<T>> nonNamespaceOperation =
mock(NonNamespaceOperation.class);
FilterWatchListMultiDeletable<T, KubernetesResourceList<T>> inAnyNamespace = mock(
FilterWatchListMultiDeletable.class);
FilterWatchListDeletable<T, KubernetesResourceList<T>> filterable =
AnyNamespaceOperation<T, KubernetesResourceList<T>, Resource<T>> inAnyNamespace = mock(
AnyNamespaceOperation.class);
FilterWatchListDeletable<T, KubernetesResourceList<T>, Resource<T>> filterable =
mock(FilterWatchListDeletable.class);
when(resources.inNamespace(anyString())).thenReturn(nonNamespaceOperation);
when(nonNamespaceOperation.withLabelSelector(nullable(String.class))).thenReturn(filterable);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import org.awaitility.core.ConditionTimeoutException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -36,6 +37,7 @@
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

@Disabled("issue with fabric8 v6")
@EnableKubernetesMockClient(crud = true, https = false)
class CustomResourceSelectorTest {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@
import io.fabric8.kubernetes.api.model.ObjectMeta;
import io.fabric8.kubernetes.api.model.apps.Deployment;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable;
import io.fabric8.kubernetes.client.dsl.FilterWatchListMultiDeletable;
import io.fabric8.kubernetes.client.dsl.AnyNamespaceOperation;
import io.fabric8.kubernetes.client.dsl.MixedOperation;
import io.fabric8.kubernetes.client.informers.SharedIndexInformer;
import io.fabric8.kubernetes.client.informers.cache.Indexer;
Expand All @@ -37,10 +36,10 @@ class InformerEventSourceTest {
mock(TemporaryResourceCache.class);
private final EventHandler eventHandlerMock = mock(EventHandler.class);
private final MixedOperation crClientMock = mock(MixedOperation.class);
private final FilterWatchListMultiDeletable specificResourceClientMock =
mock(FilterWatchListMultiDeletable.class);
private final FilterWatchListDeletable labeledResourceClientMock =
mock(FilterWatchListDeletable.class);
private final AnyNamespaceOperation specificResourceClientMock =
mock(AnyNamespaceOperation.class);
private final AnyNamespaceOperation labeledResourceClientMock =
mock(AnyNamespaceOperation.class);
private final SharedIndexInformer informer = mock(SharedIndexInformer.class);
private final InformerConfiguration<Deployment> informerConfiguration =
mock(InformerConfiguration.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@ public TestCustomReconciler(KubernetesClient kubernetesClient, boolean updateSta
@Override
public DeleteControl cleanup(
TestCustomResource resource, Context<TestCustomResource> context) {
Boolean delete =
var statusDetails =
kubernetesClient
.configMaps()
.inNamespace(resource.getMetadata().getNamespace())
.withName(resource.getSpec().getConfigMapName())
.delete();
if (delete) {
if (statusDetails.size() == 1 && statusDetails.get(0).getCauses().isEmpty()) {
log.info(
"Deleted ConfigMap {} for resource: {}",
resource.getSpec().getConfigMapName(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
import io.fabric8.kubernetes.api.model.HasMetadata;
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
import io.fabric8.kubernetes.api.model.NamespaceBuilder;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;
import io.fabric8.kubernetes.client.dsl.Resource;
import io.fabric8.kubernetes.client.utils.KubernetesResourceUtil;
Expand Down Expand Up @@ -52,7 +52,7 @@ protected AbstractOperatorExtension(
boolean preserveNamespaceOnError,
boolean waitForNamespaceDeletion) {

this.kubernetesClient = new DefaultKubernetesClient();
this.kubernetesClient = new KubernetesClientBuilder().build();
this.configurationService = configurationService;
this.infrastructure = infrastructure;
this.infrastructureTimeout = infrastructureTimeout;
Expand Down Expand Up @@ -100,17 +100,33 @@ public <T extends HasMetadata> T get(Class<T> type, String name) {
return kubernetesClient.resources(type).inNamespace(namespace).withName(name).get();
}

public <T extends HasMetadata> T create(T resource) {
return kubernetesClient.resource(resource).inNamespace(namespace).create();
}

@Deprecated(forRemoval = true)
public <T extends HasMetadata> T create(Class<T> type, T resource) {
return kubernetesClient.resources(type).inNamespace(namespace).create(resource);
return create(resource);
}

public <T extends HasMetadata> T replace(T resource) {
return kubernetesClient.resource(resource).inNamespace(namespace).replace();
}

@Deprecated(forRemoval = true)
public <T extends HasMetadata> T replace(Class<T> type, T resource) {
return kubernetesClient.resources(type).inNamespace(namespace).replace(resource);
return replace(resource);
}

public <T extends HasMetadata> boolean delete(T resource) {
var res = kubernetesClient.resource(resource).inNamespace(namespace).delete();
return res.size() == 1 && res.get(0).getCauses().isEmpty();
}

@Deprecated(forRemoval = true)
@SuppressWarnings("unchecked")
public <T extends HasMetadata> boolean delete(Class<T> type, T resource) {
return kubernetesClient.resources(type).inNamespace(namespace).delete(resource);
return delete(resource);
}

protected void beforeAllImpl(ExtensionContext context) {
Expand Down Expand Up @@ -144,7 +160,9 @@ protected void before(ExtensionContext context) {

kubernetesClient
.namespaces()
.create(new NamespaceBuilder().withNewMetadata().withName(namespace).endMetadata().build());
.resource(
new NamespaceBuilder().withNewMetadata().withName(namespace).endMetadata().build())
.create();

kubernetesClient
.resourceList(infrastructure)
Expand Down
5 changes: 5 additions & 0 deletions operator-framework/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@
<artifactId>crd-generator-apt</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>crd-generator-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package io.javaoperatorsdk.operator.config.runtime;

import java.util.*;

import io.fabric8.kubernetes.api.model.HasMetadata;
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,7 @@ class ChangeNamespaceIT {
void addNewAndRemoveOldNamespaceTest() {
try {
var reconciler = operator.getReconcilerOfType(ChangeNamespaceTestReconciler.class);
var defaultNamespaceResource = operator.create(ChangeNamespaceTestCustomResource.class,
customResource(TEST_RESOURCE_NAME_1));
var defaultNamespaceResource = operator.create(customResource(TEST_RESOURCE_NAME_1));

await().pollDelay(Duration.ofMillis(100)).untilAsserted(() -> assertThat(
reconciler.numberOfResourceReconciliations(defaultNamespaceResource)).isEqualTo(2));
Expand All @@ -63,16 +62,15 @@ void addNewAndRemoveOldNamespaceTest() {
// removing a namespace
registeredController.changeNamespaces(Set.of(ADDITIONAL_TEST_NAMESPACE));

var newResourceInDefaultNamespace = operator.create(ChangeNamespaceTestCustomResource.class,
customResource(TEST_RESOURCE_NAME_3));
var newResourceInDefaultNamespace = operator.create(customResource(TEST_RESOURCE_NAME_3));
await().pollDelay(Duration.ofMillis(200))
.untilAsserted(() -> assertThat(
reconciler.numberOfResourceReconciliations(newResourceInDefaultNamespace)).isZero());


ConfigMap firstMap = operator.get(ConfigMap.class, TEST_RESOURCE_NAME_1);
firstMap.setData(Map.of("data", "newdata"));
operator.replace(ConfigMap.class, firstMap);
operator.replace(firstMap);

await().untilAsserted(() -> assertThat(
reconciler.numberOfResourceReconciliations(defaultNamespaceResource)).isEqualTo(2));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@ class CleanerForReconcilerIT {
@Test
void addsFinalizerAndCallsCleanupIfCleanerImplemented() {
var testResource = createTestResource();
operator.create(CleanerForReconcilerCustomResource.class, testResource);
operator.create(testResource);

await().until(() -> !operator.get(CleanerForReconcilerCustomResource.class, TEST_RESOURCE_NAME)
.getMetadata().getFinalizers().isEmpty());

operator.delete(CleanerForReconcilerCustomResource.class, testResource);
operator.delete(testResource);

await().until(
() -> operator.get(CleanerForReconcilerCustomResource.class, TEST_RESOURCE_NAME) == null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,18 @@ class CleanupConflictIT {
void cleanupRemovesFinalizerWithoutConflict() throws InterruptedException {
var testResource = createTestResource();
testResource.addFinalizer(ADDITIONAL_FINALIZER);
testResource = operator.create(CleanupConflictCustomResource.class, testResource);
testResource = operator.create(testResource);

await().untilAsserted(
() -> assertThat(operator.getReconcilerOfType(CleanupConflictReconciler.class)
.getNumberReconcileExecutions()).isEqualTo(1));

operator.delete(CleanupConflictCustomResource.class, testResource);
operator.delete(testResource);
Thread.sleep(WAIT_TIME / 2);
testResource = operator.get(CleanupConflictCustomResource.class, TEST_RESOURCE_NAME);
testResource.getMetadata().getFinalizers().remove(ADDITIONAL_FINALIZER);
testResource.getMetadata().setResourceVersion(null);
operator.replace(CleanupConflictCustomResource.class, testResource);
operator.replace(testResource);

await().pollDelay(Duration.ofMillis(WAIT_TIME * 2)).untilAsserted(
() -> assertThat(operator.getReconcilerOfType(CleanupConflictReconciler.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ void configMapGetsCreatedForTestCustomResource() {
operator.getReconcilerOfType(TestReconciler.class).setUpdateStatus(true);

TestCustomResource resource = TestUtils.testCustomResource();
operator.create(TestCustomResource.class, resource);
operator.create(resource);

awaitResourcesCreatedOrUpdated();
awaitStatusUpdated();
Expand All @@ -39,7 +39,7 @@ void patchesStatusForTestCustomResource() {
operator.getReconcilerOfType(TestReconciler.class).setUpdateStatus(true);

TestCustomResource resource = TestUtils.testCustomResource();
operator.create(TestCustomResource.class, resource);
operator.create(resource);

awaitStatusUpdated();
}
Expand All @@ -49,7 +49,7 @@ void eventIsSkippedChangedOnMetadataOnlyUpdate() {
operator.getReconcilerOfType(TestReconciler.class).setUpdateStatus(false);

TestCustomResource resource = TestUtils.testCustomResource();
operator.create(TestCustomResource.class, resource);
operator.create(resource);

awaitResourcesCreatedOrUpdated();
assertThat(TestUtils.getNumberOfExecutions(operator)).isEqualTo(1);
Expand All @@ -60,11 +60,11 @@ void cleanupExecuted() {
operator.getReconcilerOfType(TestReconciler.class).setUpdateStatus(true);

TestCustomResource resource = TestUtils.testCustomResource();
resource = operator.create(TestCustomResource.class, resource);
resource = operator.create(resource);

awaitResourcesCreatedOrUpdated();
awaitStatusUpdated();
operator.delete(TestCustomResource.class, resource);
operator.delete(resource);

await().atMost(Duration.ofSeconds(1))
.until(() -> ((TestReconciler) operator.getFirstReconciler())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class CreateUpdateInformerEventSourceEventFilterIT {
void updateEventNotReceivedAfterCreateOrUpdate() {
CreateUpdateEventFilterTestCustomResource resource = prepareTestResource();
var createdResource =
operator.create(CreateUpdateEventFilterTestCustomResource.class, resource);
operator.create(resource);

await()
.atMost(Duration.ofSeconds(1))
Expand All @@ -53,7 +53,7 @@ void updateEventNotReceivedAfterCreateOrUpdate() {
operator.get(CreateUpdateEventFilterTestCustomResource.class,
resource.getMetadata().getName());
actualCreatedResource.getSpec().setValue("2");
operator.replace(CreateUpdateEventFilterTestCustomResource.class, actualCreatedResource);
operator.replace(actualCreatedResource);


await().atMost(Duration.ofSeconds(1))
Expand Down
Loading

0 comments on commit d74559a

Please sign in to comment.