From 869296530eda31aa9945b97cf0473f6620096e17 Mon Sep 17 00:00:00 2001 From: Fabian-K Date: Thu, 24 Jun 2021 17:49:12 +0200 Subject: [PATCH 1/3] [tekton] add support for ClusterInterceptor --- CHANGELOG.md | 2 + .../tekton/client/V1alpha1APIGroupClient.java | 18 +- .../client/dsl/V1alpha1APIGroupDSL.java | 7 + .../cmd/generate/generate.go | 1 + ...TektonTriggersResourceMappingProvider.java | 1 + .../schema/tekton-schema-triggers.json | 180 ++++++++++++++++++ 6 files changed, 197 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e34c3798b4f..63ca5b8c961 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,8 @@ * Add DSL support for OpenShift Whereabouts CNI Model `whereabouts.cni.cncf.io` to OpenShiftClient DSL * Add DSL support for OpenShift Kube Storage Version Migrator resources in OpenShiftClient DSL * Fix #3228: Add support for Dynamic informers for custom resources in KubernetesClient +* Add DSL support for ClusterInterceptors to TektonClient + #### _**Note**_: Breaking changes in the API ##### DSL Changes: diff --git a/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/V1alpha1APIGroupClient.java b/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/V1alpha1APIGroupClient.java index ec491bb9eb6..8de1fe93090 100644 --- a/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/V1alpha1APIGroupClient.java +++ b/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/V1alpha1APIGroupClient.java @@ -22,18 +22,7 @@ import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.tekton.client.dsl.V1alpha1APIGroupDSL; import io.fabric8.tekton.client.internal.v1alpha1.*; -import io.fabric8.tekton.pipeline.v1alpha1.ClusterTask; -import io.fabric8.tekton.pipeline.v1alpha1.ClusterTaskList; -import io.fabric8.tekton.pipeline.v1alpha1.Condition; -import io.fabric8.tekton.pipeline.v1alpha1.ConditionList; -import io.fabric8.tekton.pipeline.v1alpha1.Pipeline; -import io.fabric8.tekton.pipeline.v1alpha1.PipelineList; -import io.fabric8.tekton.pipeline.v1alpha1.PipelineRun; -import io.fabric8.tekton.pipeline.v1alpha1.PipelineRunList; -import io.fabric8.tekton.pipeline.v1alpha1.Task; -import io.fabric8.tekton.pipeline.v1alpha1.TaskList; -import io.fabric8.tekton.pipeline.v1alpha1.TaskRun; -import io.fabric8.tekton.pipeline.v1alpha1.TaskRunList; +import io.fabric8.tekton.pipeline.v1alpha1.*; import io.fabric8.tekton.resource.v1alpha1.PipelineResource; import io.fabric8.tekton.resource.v1alpha1.PipelineResourceList; import io.fabric8.tekton.triggers.v1alpha1.*; @@ -107,4 +96,9 @@ public NonNamespaceOperation public NonNamespaceOperation> clusterTriggerBindings() { return new ClusterTriggerBindingOperationsImpl(this.getHttpClient(),this.getConfiguration()); } + + @Override + public NonNamespaceOperation> clusterInterceptors() { + return new ClusterInterceptorOperationsImpl(this.getHttpClient(), this.getConfiguration()); + } } diff --git a/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/dsl/V1alpha1APIGroupDSL.java b/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/dsl/V1alpha1APIGroupDSL.java index b1ab4f80597..0d8504af569 100644 --- a/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/dsl/V1alpha1APIGroupDSL.java +++ b/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/dsl/V1alpha1APIGroupDSL.java @@ -119,4 +119,11 @@ public interface V1alpha1APIGroupDSL extends Client { * @return MixedOperation for ClusterTriggerBinding class */ NonNamespaceOperation> clusterTriggerBindings(); + + /** + * API entrypoint for ClusterInterceptor(triggers.tekton.dev/v1alpha1) + * + * @return MixedOperation for ClusterInterceptor class + */ + NonNamespaceOperation> clusterInterceptors(); } diff --git a/extensions/tekton/generator-triggers/cmd/generate/generate.go b/extensions/tekton/generator-triggers/cmd/generate/generate.go index 7703509a018..acf15117dfb 100644 --- a/extensions/tekton/generator-triggers/cmd/generate/generate.go +++ b/extensions/tekton/generator-triggers/cmd/generate/generate.go @@ -35,6 +35,7 @@ func main() { reflect.TypeOf(triggers.TriggerBindingList{}): schemagen.Namespaced, reflect.TypeOf(triggers.EventListenerList{}): schemagen.Namespaced, reflect.TypeOf(triggers.ClusterTriggerBindingList{}): schemagen.Cluster, + reflect.TypeOf(triggers.ClusterInterceptorList{}): schemagen.Cluster, } // constraints and patterns for fields diff --git a/extensions/tekton/model-triggers/src/main/java/io/fabric8/tekton/TektonTriggersResourceMappingProvider.java b/extensions/tekton/model-triggers/src/main/java/io/fabric8/tekton/TektonTriggersResourceMappingProvider.java index 9e1ddf10212..a9cafda2d73 100644 --- a/extensions/tekton/model-triggers/src/main/java/io/fabric8/tekton/TektonTriggersResourceMappingProvider.java +++ b/extensions/tekton/model-triggers/src/main/java/io/fabric8/tekton/TektonTriggersResourceMappingProvider.java @@ -31,6 +31,7 @@ public TektonTriggersResourceMappingProvider() { mappings.put("triggers.tekton.dev/v1alpha1#EventListener", io.fabric8.tekton.triggers.v1alpha1.EventListener.class); mappings.put("triggers.tekton.dev/v1alpha1#ClusterTriggerBinding", io.fabric8.tekton.triggers.v1alpha1.ClusterTriggerBinding.class); mappings.put("triggers.tekton.dev/v1alpha1#Trigger", io.fabric8.tekton.triggers.v1alpha1.Trigger.class); + mappings.put("triggers.tekton.dev/v1alpha1#ClusterInterceptor", io.fabric8.tekton.triggers.v1alpha1.ClusterInterceptor.class); } public Map> getMappings() { diff --git a/extensions/tekton/model-triggers/src/main/resources/schema/tekton-schema-triggers.json b/extensions/tekton/model-triggers/src/main/resources/schema/tekton-schema-triggers.json index 3b08dc6bd19..fdca495bf05 100644 --- a/extensions/tekton/model-triggers/src/main/resources/schema/tekton-schema-triggers.json +++ b/extensions/tekton/model-triggers/src/main/resources/schema/tekton-schema-triggers.json @@ -57,6 +57,124 @@ "io.fabric8.kubernetes.api.model.KubernetesResource" ] }, + "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClientConfig": { + "type": "object", + "properties": { + "service": { + "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ServiceReference", + "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.ServiceReference" + }, + "url": { + "existingJavaType": "java.lang.String" + } + }, + "javaType": "io.fabric8.tekton.triggers.v1alpha1.ClientConfig", + "javaInterfaces": [ + "io.fabric8.kubernetes.api.model.KubernetesResource" + ] + }, + "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptor": { + "type": "object", + "properties": { + "apiVersion": { + "type": "string", + "default": "triggers.tekton.dev/v1alpha1", + "required": true + }, + "kind": { + "type": "string", + "default": "ClusterInterceptor", + "required": true + }, + "metadata": { + "existingJavaType": "io.fabric8.kubernetes.api.model.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptorSpec", + "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.ClusterInterceptorSpec" + }, + "status": { + "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptorStatus", + "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.ClusterInterceptorStatus" + } + }, + "javaType": "io.fabric8.tekton.triggers.v1alpha1.ClusterInterceptor", + "javaInterfaces": [ + "io.fabric8.kubernetes.api.model.HasMetadata" + ] + }, + "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptorList": { + "type": "object", + "properties": { + "apiVersion": { + "type": "string", + "default": "triggers.tekton.dev/v1alpha1", + "required": true + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptor", + "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.ClusterInterceptor" + } + }, + "kind": { + "type": "string", + "default": "ClusterInterceptorList", + "required": true + }, + "metadata": { + "existingJavaType": "io.fabric8.kubernetes.api.model.ListMeta" + } + }, + "javaType": "io.fabric8.tekton.triggers.v1alpha1.ClusterInterceptorList", + "javaInterfaces": [ + "io.fabric8.kubernetes.api.model.KubernetesResource", + "io.fabric8.kubernetes.api.model.KubernetesResourceList\u003cio.fabric8.tekton.triggers.v1alpha1.ClusterInterceptor\u003e" + ] + }, + "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptorSpec": { + "type": "object", + "properties": { + "clientConfig": { + "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClientConfig", + "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.ClientConfig" + } + }, + "javaType": "io.fabric8.tekton.triggers.v1alpha1.ClusterInterceptorSpec", + "javaInterfaces": [ + "io.fabric8.kubernetes.api.model.KubernetesResource" + ] + }, + "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptorStatus": { + "type": "object", + "properties": { + "address": { + "$ref": "#/definitions/knative_dev_pkg_apis_duck_v1_Addressable", + "existingJavaType": "io.fabric8.tekton.triggers.internal.knative.pkg.apis.duck.v1.Addressable" + }, + "annotations": { + "type": "object", + "existingJavaType": "java.util.Map\u003cString,String\u003e" + }, + "conditions": { + "type": "array", + "javaOmitEmpty": true, + "items": { + "$ref": "#/definitions/knative_dev_pkg_apis_Condition", + "existingJavaType": "io.fabric8.tekton.triggers.internal.knative.pkg.apis.Condition" + } + }, + "observedGeneration": { + "type": "integer", + "existingJavaType": "Long" + } + }, + "javaType": "io.fabric8.tekton.triggers.v1alpha1.ClusterInterceptorStatus", + "javaInterfaces": [ + "io.fabric8.kubernetes.api.model.KubernetesResource" + ] + }, "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterTriggerBinding": { "type": "object", "properties": { @@ -496,6 +614,28 @@ "io.fabric8.kubernetes.api.model.KubernetesResource" ] }, + "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ServiceReference": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "namespace": { + "type": "string" + }, + "path": { + "type": "string" + }, + "port": { + "type": "integer", + "existingJavaType": "Integer" + } + }, + "javaType": "io.fabric8.tekton.triggers.v1alpha1.ServiceReference", + "javaInterfaces": [ + "io.fabric8.kubernetes.api.model.KubernetesResource" + ] + }, "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_Trigger": { "type": "object", "properties": { @@ -908,6 +1048,18 @@ "io.fabric8.kubernetes.api.model.KubernetesResource" ] }, + "knative_dev_pkg_apis_duck_v1_Addressable": { + "type": "object", + "properties": { + "url": { + "existingJavaType": "java.lang.String" + } + }, + "javaType": "io.fabric8.tekton.triggers.internal.knative.pkg.apis.duck.v1.Addressable", + "javaInterfaces": [ + "io.fabric8.kubernetes.api.model.KubernetesResource" + ] + }, "knative_dev_pkg_apis_duck_v1_PodSpecable": { "type": "object", "properties": { @@ -966,6 +1118,26 @@ "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_CELOverlay", "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.CELOverlay" }, + "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClientConfig": { + "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClientConfig", + "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.ClientConfig" + }, + "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptor": { + "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptor", + "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.ClusterInterceptor" + }, + "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptorList": { + "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptorList", + "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.ClusterInterceptorList" + }, + "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptorSpec": { + "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptorSpec", + "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.ClusterInterceptorSpec" + }, + "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptorStatus": { + "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterInterceptorStatus", + "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.ClusterInterceptorStatus" + }, "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterTriggerBinding": { "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ClusterTriggerBinding", "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.ClusterTriggerBinding" @@ -1042,6 +1214,10 @@ "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_SecretRef", "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.SecretRef" }, + "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ServiceReference": { + "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_ServiceReference", + "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.ServiceReference" + }, "github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_Trigger": { "$ref": "#/definitions/github_com_tektoncd_triggers_pkg_apis_triggers_v1alpha1_Trigger", "existingJavaType": "io.fabric8.tekton.triggers.v1alpha1.Trigger" @@ -1106,6 +1282,10 @@ "$ref": "#/definitions/knative_dev_pkg_apis_Condition", "existingJavaType": "io.fabric8.tekton.triggers.internal.knative.pkg.apis.Condition" }, + "knative_dev_pkg_apis_duck_v1_Addressable": { + "$ref": "#/definitions/knative_dev_pkg_apis_duck_v1_Addressable", + "existingJavaType": "io.fabric8.tekton.triggers.internal.knative.pkg.apis.duck.v1.Addressable" + }, "knative_dev_pkg_apis_duck_v1_PodSpecable": { "$ref": "#/definitions/knative_dev_pkg_apis_duck_v1_PodSpecable", "existingJavaType": "io.fabric8.tekton.triggers.internal.knative.pkg.apis.duck.v1.PodSpecable" From 0dd0ad12d0bc51a94c8fb34fcaf30af704340a19 Mon Sep 17 00:00:00 2001 From: shawkins Date: Fri, 25 Jun 2021 06:58:44 -0400 Subject: [PATCH 2/3] fix #3272: addressing npe and index logic in general --- CHANGELOG.md | 1 + .../client/informers/cache/Cache.java | 18 +++++++++--------- .../client/informers/cache/CacheTest.java | 5 +++++ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63ca5b8c961..d7da56761d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ * Fix #3216: made the mock server aware of apiVersions * Fix #3225: Pod metric does not have corresponding label selector variant * Fix #3243: pipes provided to exec command are no longer closed on connection close, so that client can fully read the buffer after the command finishes. +* Fix #3272: prevent index npe after informer sees an empty list #### Improvements * Fix #3078: adding javadocs to further clarify patch, edit, replace, etc. and note the possibility of items being modified. diff --git a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/informers/cache/Cache.java b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/informers/cache/Cache.java index 31f4fd99fb6..d08dbd17097 100644 --- a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/informers/cache/Cache.java +++ b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/informers/cache/Cache.java @@ -44,13 +44,13 @@ public class Cache implements Indexer { public static final String NAMESPACE_INDEX = "namespace"; // indexers stores index functions by their names - private Map>> indexers = new HashMap<>(); + private final Map>> indexers = new HashMap<>(); // items stores object instances private volatile ConcurrentHashMap items = new ConcurrentHashMap<>(); // indices stores objects' key by their indices - private Map>> indices = new HashMap<>(); + private final Map>> indices = new HashMap<>(); private BooleanSupplier isRunning = () -> false; @@ -74,12 +74,12 @@ public void setIsRunning(BooleanSupplier isRunning) { * @return registered indexers */ @Override - public Map>> getIndexers() { - return indexers; + public synchronized Map>> getIndexers() { + return Collections.unmodifiableMap(indexers); } @Override - public void addIndexers(Map>> indexersNew) { + public synchronized void addIndexers(Map>> indexersNew) { if (isRunning.getAsBoolean()) { throw new IllegalStateException("Cannot add indexers to a running informer."); } @@ -147,7 +147,7 @@ public synchronized Map replace(List list) { this.items = newItems; // rebuild any index - this.indices = new HashMap<>(); + this.indices.values().stream().forEach(Map::clear); for (Map.Entry itemEntry : items.entrySet()) { this.updateIndices(null, itemEntry.getValue(), itemEntry.getKey()); } @@ -294,7 +294,7 @@ public synchronized List byIndex(String indexName, String indexKey) { * @param newObj new object * @param key the key */ - public void updateIndices(T oldObj, T newObj, String key) { + void updateIndices(T oldObj, T newObj, String key) { if (oldObj != null) { deleteFromIndices(oldObj, key); } @@ -307,7 +307,7 @@ public void updateIndices(T oldObj, T newObj, String key) { continue; } - Map> index = this.indices.computeIfAbsent(indexName, k -> new HashMap<>()); + Map> index = this.indices.get(indexName); for (String indexValue : indexValues) { Set indexSet = index.computeIfAbsent(indexValue, k -> new HashSet<>()); indexSet.add(key); @@ -350,7 +350,7 @@ private void deleteFromIndices(T oldObj, String key) { * @param indexName the index name * @param indexFunc the index func */ - public void addIndexFunc(String indexName, Function> indexFunc) { + public synchronized void addIndexFunc(String indexName, Function> indexFunc) { this.indices.put(indexName, new HashMap<>()); this.indexers.put(indexName, indexFunc); } diff --git a/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/informers/cache/CacheTest.java b/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/informers/cache/CacheTest.java index 9c7df9c99b7..0810e03cc38 100644 --- a/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/informers/cache/CacheTest.java +++ b/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/informers/cache/CacheTest.java @@ -20,12 +20,14 @@ import org.junit.jupiter.api.Test; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Function; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; class CacheTest { private static Cache cache = new Cache("mock", CacheTest::mockIndexFunction, CacheTest::mockKeyFunction); @@ -49,6 +51,9 @@ void testCacheIndex() { List allExistingKeys = cache.listKeys(); assertEquals(1, allExistingKeys.size()); assertEquals(key, allExistingKeys.get(0)); + + cache.replace(Collections.emptyList()); + assertEquals(0, cache.byIndex("mock", "y").size()); } @Test From bde7b96fb445548fb3e47747b599b5500c9192d3 Mon Sep 17 00:00:00 2001 From: Priyansh Singh <63330165+ps-19@users.noreply.github.com> Date: Mon, 28 Jun 2021 20:13:01 +0530 Subject: [PATCH 3/3] Iss3242 (#3279) * Update README.md * Updated README.md issue-#3242 * Updated README.md --- README.md | 118 +++++++++++++++++++++++++++--------------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 176d75b6199..42cdad9f3a6 100644 --- a/README.md +++ b/README.md @@ -395,65 +395,65 @@ class ExampleTest { ### Kubernetes Compatibility Matrix: -| | K8s 1.20.2 |K8s 1.19.1 | K8s 1.18.0 | K8s 1.17.0 | K8s 1.16.0 | K8s 1.15.3 | K8s 1.14.2 | K8s 1.12.0 | K8s 1.11.0 | K8s 1.10.0 | K8s 1.9.0 | K8s 1.7.0 | K8s 1.6.0 | K8s 1.4.9 | -|---------------------------|------------|-----------|------------|------------|------------|------------|------------|------------|------------|------------|-----------|-----------|-----------|-----------| -| kubernetes-client 5.4.1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 5.4.0 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 5.3.1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 5.3.0 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 5.2.1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 5.2.0 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 5.1.1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 5.1.0 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 5.0.2 | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 5.0.1 | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 5.0.0 | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.13.3 | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.13.2 | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.13.1 | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.13.0 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.12.0 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.11.2 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.11.1 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.11.0 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.10.3 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.10.2 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.10.1 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.10.0 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.9.2 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.9.1 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.9.0 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.8.0 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.7.2 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.7.1 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.7.0 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.6.4 | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.6.3 | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.6.2 | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.6.1 | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.6.0 | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.5.2 | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.5.1 | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.5.0 | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.4.2 | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.4.1 | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.4.0 | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.3.1 | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.3.0 | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.2.2 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.2.1 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.2.0 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.1.3 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.1.2 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.1.1 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | - | - | - | -| kubernetes-client 4.1.0 | - | - | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | - | -| kubernetes-client 4.0.0 | - | - | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | - | -| kubernetes-client 3.2.0 | - | - | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | - | -| kubernetes-client 3.1.12 | - | - | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | - | -| kubernetes-client 3.0.11 | - | - | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | - | -| kubernetes-client 3.0.10 | - | - | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | - | -| kubernetes-client 3.0.3 | - | - | - | - | - | - | - | - | - | - | - | ✓ | - | - | -| kubernetes-client 1.3.92 | - | - | - | - | - | - | - | - | - | - | - | - | + | + | +| | K8s 1.21.1 | K8s 1.20.2 |K8s 1.19.1 | K8s 1.18.0 | K8s 1.17.0 | K8s 1.16.0 | K8s 1.15.3 | K8s 1.14.2 | K8s 1.12.0 | K8s 1.11.0 | K8s 1.10.0 | K8s 1.9.0 | K8s 1.7.0 | K8s 1.6.0 | K8s 1.4.9 | +|---------------------------|-----------|------------|-----------|------------|------------|------------|------------|------------|------------|------------|------------|-----------|-----------|-----------|-----------| +| kubernetes-client 5.4.1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 5.4.0 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 5.3.1 | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 5.3.0 | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 5.2.1 | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 5.2.0 | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 5.1.1 | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 5.1.0 | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 5.0.2 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 5.0.1 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 5.0.0 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.13.3 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.13.2 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.13.1 | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.13.0 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.12.0 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.11.2 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.11.1 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.11.0 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.10.3 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.10.2 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.10.1 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.10.0 | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.9.2 | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.9.1 | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.9.0 | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.8.0 | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.7.2 | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.7.1 | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.7.0 | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.6.4 | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.6.3 | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.6.2 | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.6.1 | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.6.0 | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.5.2 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.5.1 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.5.0 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.4.2 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.4.1 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.4.0 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.3.1 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.3.0 | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.2.2 | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.2.1 | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.2.0 | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.1.3 | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.1.2 | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.1.1 | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | ✓ | - | - | - | +| kubernetes-client 4.1.0 | - | - | - | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | - | +| kubernetes-client 4.0.0 | - | - | - | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | - | +| kubernetes-client 3.2.0 | - | - | - | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | - | +| kubernetes-client 3.1.12 | - | - | - | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | - | +| kubernetes-client 3.0.11 | - | - | - | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | - | +| kubernetes-client 3.0.10 | - | - | - | - | - | - | - | - | - | - | - | ✓ | ✓ | ✓ | - | +| kubernetes-client 3.0.3 | - | - | - | - | - | - | - | - | - | - | - | - | ✓ | - | - | +| kubernetes-client 1.3.92 | - | - | - | - | - | - | - | - | - | - | - | - | - | + | + | ### OpenShift Compatibility Matrix: