Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix #2418: CertificateSigningRequest doesn't implement Namespaced #2421

Merged
merged 1 commit into from Aug 24, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -8,6 +8,7 @@
* Fix #2354: Fix NullPointerException in ResourceCompare when no resource is returned from fromServer.get()
* Fix #2389: KubernetesServer does not use value from https in crud mode
* Fix #2306: Make KubernetesServer CRUD mode work with informers
* Fix #2418: CertificateSigningRequest doesn't implement Namespaced

#### Improvements
* Fix #2331: Fixed documentation for namespaced informer for all custom types implementing `Namespaced` interface
Expand Down
19 changes: 19 additions & 0 deletions doc/CHEATSHEET.md
Expand Up @@ -30,6 +30,7 @@ This document contains common usages of different resources using Fabric8 Kubern
* [CustomResourceDefinition](#customresourcedefinition)
* [CustomResource Typed API](#customresource-typed-api)
* [CustomResource Typeless API](#customresource-typeless-api)
* [CertificateSigningRequest](#certificatesigningrequest)
* [SharedInformers](#sharedinformers)
* [List Options](#list-options)
* [Delete Options](#delete-options)
Expand Down Expand Up @@ -1904,6 +1905,24 @@ Map<String, Object> result = client.customResource(customResourceDefinitionConte
closeLatch.await(10, TimeUnit.MINUTES);
```

### CertificateSigningRequest
Kubernetes Client provides using `CertificateSigningRequest` via the `client.certificateSigningRequests()` DSL interface. Here is an example of creating `CertificateSigningRequest` using Fabric8 Kubernetes Client:
```
try (KubernetesClient client = new DefaultKubernetesClient()) {
CertificateSigningRequest csr = new CertificateSigningRequestBuilder()
.withNewMetadata().withName("test-k8s-csr").endMetadata()
.withNewSpec()
.addNewGroup("system:authenticated")
.withRequest("LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJRWJqQ0NBbFlDQVFBd0tURVBNQTBHQTFVRUF3d0dhMmxrYjI1bk1SWXdGQVlEVlFRS0RBMWtZWFJoTFdWdQpaMmx1WldWeU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBc2dVZXl0S0F6ZDkyClN1S2pZL1RqbmRsZ0lkSFVVYWFxbHJIVW1nbTloKzY2RTJCNGs0TSt6Q0tOQmovemlMdWV6NFNUeHJ6SFk3RlUKNGUxWElBU3lMS0dmRGNPaks5NThURThwcXBRM21VdlpWMmxnK25BTVF5dlZUYWdZSmFId2JWUzVlNHgvRmpKcQoxTWpQZ1VoSGFXeEdIYTQrQnZYQU9Kdk5BdnV4alpZaVJET251dGxHVzloQkRKRlhoUk5jOGFKNnFiZWVBWnNiCmozWUFMaUcydWp1VmhoTUVRNEJxdFVHVGZCMzBQNGhRK2t2bWVKc2ZUU3Vsb2xiWFdIdVZGWnh1d0FJek5RbmQKMTd4VHd2cU04OGZFb3ZJazBJV0ZCWTk2aHRvaUVNdThZUms4SEZ6QkJralhsZGlkbVNNSHkwK0plcFRONmdQTQpEYVVsd1cxS0lCcW9TbnZNcjY4cFRVWEVhZVRjc040anMxTUIwK3FwR0JBS1puWWVxM0JmMkxVVFBNaG1VZ2VVCmFUTFlqODI2WVorZjJrOWJ1cngwK1NOSmVZbWoxVTl0N3A2YWM0dDIzZHVYQ1BzYkNrUFNKeGtrU3dudUlVVzkKdmJVVGtJNGtVMlFVMnE0NzRaMW1uMlkvejF2TEdQdEpsTDFYUVFVNEdsb2hrQkVkM1BsUTRtOGU1WGZSRkV6ZgpYZnhMRXFRczFTeEg1ekhjcnVaOWxJdnBkeEw5Tkc5WlR6M0tmT0tIbCtSUzdxMGdKaExac0RubUJKNXZab3p4CldXci9IRW9PamFYbGh0VitDN3M4TUg5Y0lKZENZNnpjcFVrZis1NmZ0Z1FuN0YrT1RYdDI0UVJQYWNFZnRFOTkKVERPb2luTGtOMm1kckxiMTgxQUZNUWJ0bTFLc1k2MENBd0VBQWFBQU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQwpBUUNQYU1WdDd4YWhkZlF1L1BySFVTTW5LK2I0SlJScEdEYlpWUXk4aUtkSmdHM0VrYnNBZ21qQmN4Q1IvL2t1CkVhU0plSGNWK20xVlFUTEp1ZFU3ZHFUeFBLOVFCNlB2aHlBbCttNnFaQkt1Q25VM1BKc2k5azBYSE5GWXBqRmYKVFNwTlpJSnRuanVEQWVtT05kcjJYMm1rODZmSmpWTEUvYnA1KzM5dFBkN0xjL3dZR2JoRU0xcExtUGpQK0Z6eQpzZnBiYW5PcmZFSG5NMmlsRFpGZURVSEpYL3F5Ykt1RC9BRmdoZk1Ua0x3ODNLNkNRdCtDQm05djRCeEtCS2xqCkdBWEQyUEhUTWlzektUbGpBM3czYUphanZzU0FwQXFCWnFocjB3QzdOb1dYM1h6S0p3ck9MaWVxemo3SXlpUGEKTEI5SmJveFpOQTdBSU5ucEdsa1hDZlRGT2RManZtQkVRQXV5Ym9wLzdqV2RiSzJHRkZKS2UwdlVlbWNUeGdHVwp5c0ZyV2pqMUlvdVBVNFZ6ck82QVBVQnZCZUFtdU1Bbm9yVng5emc4akhlT1pkd2RWdFRnOUwrK0VnWjlxK0htCjVtUlJGVHlZOWo4WVVvd2J6TzRlRUZnaVN0di84T1p0YmtOeDFROWFQWHJ3VUV1Q1I0SUthWG0wNlJUYXJOYXUKTWFsbk5oZm9WYi9Bc1R5d1ArNlc1dGErcTBpckR5cnVkZk5pRkFWbkRMZEU5a2hWZzVrU0lPRzhYbEZUMklwSQpkdVNpcUl0NlNUTlY3UmdaRzBGTFN5akxoc3laWnY2bitpUzl3Ky9OOFpoUzgvalViUUVidG1VTnNJU3Z5WS9JCmZqcHNZQUdleExvVW5mN2pDaUhkbTVhSnJ5SU1kdmZ2akJsMDhIVk5nWG1McVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K")
.addNewUsage("client auth")
.endSpec()
.build();

client.certificateSigningRequests().create(csr);
}
```


### SharedInformers
Kubernetes Client also provides `SharedInformer` support in order to stay updated to events happening to your resource inside Kubernetes. It's implementation is just list and watch operations after a certain interval of time. Here are some of the common usages:
- Get `SharedInformerFactory`:
Expand Down
Expand Up @@ -73,6 +73,9 @@
import io.fabric8.kubernetes.api.model.ServiceAccount;
import io.fabric8.kubernetes.api.model.ServiceAccountList;
import io.fabric8.kubernetes.api.model.DoneableServiceAccount;
import io.fabric8.kubernetes.api.model.certificates.CertificateSigningRequest;
import io.fabric8.kubernetes.api.model.certificates.CertificateSigningRequestList;
import io.fabric8.kubernetes.api.model.certificates.DoneableCertificateSigningRequest;
import io.fabric8.kubernetes.api.model.coordination.v1.DoneableLease;
import io.fabric8.kubernetes.api.model.coordination.v1.Lease;
import io.fabric8.kubernetes.api.model.coordination.v1.LeaseList;
Expand All @@ -83,6 +86,7 @@
import io.fabric8.kubernetes.client.dsl.internal.CustomResourceOperationContext;
import io.fabric8.kubernetes.client.dsl.internal.CustomResourceOperationsImpl;
import io.fabric8.kubernetes.client.dsl.internal.KubernetesListOperationsImpl;
import io.fabric8.kubernetes.client.dsl.internal.certificates.v1beta1.CertificateSigningRequestOperationsImpl;
import io.fabric8.kubernetes.client.dsl.internal.core.v1.APIServiceOperationsImpl;
import io.fabric8.kubernetes.client.dsl.internal.core.v1.ComponentStatusOperationsImpl;
import io.fabric8.kubernetes.client.dsl.internal.core.v1.NamespaceOperationsImpl;
Expand Down Expand Up @@ -293,6 +297,11 @@ public ApiextensionsAPIGroupDSL apiextensions() {
return adapt(ApiextensionsAPIGroupClient.class);
}

@Override
public NonNamespaceOperation<CertificateSigningRequest, CertificateSigningRequestList, DoneableCertificateSigningRequest, Resource<CertificateSigningRequest, DoneableCertificateSigningRequest>> certificateSigningRequests() {
return new CertificateSigningRequestOperationsImpl(httpClient, getConfiguration());
}

@Override
public <T extends HasMetadata, L extends KubernetesResourceList<T>, D extends Doneable<T>> MixedOperation<T, L, D, Resource<T, D>> customResources(CustomResourceDefinitionContext crdContext, Class<T> resourceType, Class<L> listClass, Class<D> doneClass) {
return new CustomResourceOperationsImpl<>(new CustomResourceOperationContext().withOkhttpClient(httpClient).withConfig(getConfiguration())
Expand Down
Expand Up @@ -69,6 +69,9 @@
import io.fabric8.kubernetes.api.model.ServiceAccount;
import io.fabric8.kubernetes.api.model.ServiceAccountList;
import io.fabric8.kubernetes.api.model.DoneableServiceAccount;
import io.fabric8.kubernetes.api.model.certificates.CertificateSigningRequest;
import io.fabric8.kubernetes.api.model.certificates.CertificateSigningRequestList;
import io.fabric8.kubernetes.api.model.certificates.DoneableCertificateSigningRequest;
import io.fabric8.kubernetes.api.model.coordination.v1.DoneableLease;
import io.fabric8.kubernetes.api.model.coordination.v1.Lease;
import io.fabric8.kubernetes.api.model.coordination.v1.LeaseList;
Expand Down Expand Up @@ -106,6 +109,13 @@ public interface KubernetesClient extends Client {
*/
ApiextensionsAPIGroupDSL apiextensions();

/**
* API entrypoint for using CertificateSigningRequest(certificates.k8s.io/v1beta1)
*
* @return {@link NonNamespaceOperation} for CertificateSigningRequest class
*/
NonNamespaceOperation<CertificateSigningRequest, CertificateSigningRequestList, DoneableCertificateSigningRequest, Resource<CertificateSigningRequest, DoneableCertificateSigningRequest>> certificateSigningRequests();

/**
* Typed API for managing CustomResources. You would need to provide POJOs for
* CustomResource into this and with it you would be able to instantiate a client
Expand Down
Expand Up @@ -72,6 +72,9 @@
import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition;
import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionList;
import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.DoneableCustomResourceDefinition;
import io.fabric8.kubernetes.api.model.certificates.CertificateSigningRequest;
import io.fabric8.kubernetes.api.model.certificates.CertificateSigningRequestList;
import io.fabric8.kubernetes.api.model.certificates.DoneableCertificateSigningRequest;
import io.fabric8.kubernetes.api.model.coordination.v1.DoneableLease;
import io.fabric8.kubernetes.api.model.coordination.v1.Lease;
import io.fabric8.kubernetes.api.model.coordination.v1.LeaseList;
Expand Down Expand Up @@ -431,6 +434,11 @@ public ApiextensionsAPIGroupDSL apiextensions() {
return delegate.apiextensions();
}

@Override
public NonNamespaceOperation<CertificateSigningRequest, CertificateSigningRequestList, DoneableCertificateSigningRequest, Resource<CertificateSigningRequest, DoneableCertificateSigningRequest>> certificateSigningRequests() {
return delegate.certificateSigningRequests();
}

@Override
public <T extends HasMetadata, L extends KubernetesResourceList<T>, D extends Doneable<T>> MixedOperation<T, L, D, Resource<T, D>> customResources(CustomResourceDefinitionContext crdContext, Class<T> resourceType, Class<L> listClass, Class<D> doneClass) {
return delegate.customResources(crdContext, resourceType, listClass, doneClass);
Expand Down
Expand Up @@ -254,15 +254,15 @@ void testWhetherNamespacedOrNot() {
assertTrue(Utils.isResourceNamespaced(Deployment.class));
assertTrue(Utils.isResourceNamespaced(ReplicaSet.class));
assertTrue(Utils.isResourceNamespaced(StatefulSet.class));
assertTrue(Utils.isResourceNamespaced(TokenReview.class));
assertFalse(Utils.isResourceNamespaced(TokenReview.class));
assertTrue(Utils.isResourceNamespaced(LocalSubjectAccessReview.class));
assertTrue(Utils.isResourceNamespaced(SelfSubjectAccessReview.class));
assertTrue(Utils.isResourceNamespaced(SelfSubjectRulesReview.class));
assertTrue(Utils.isResourceNamespaced(SubjectAccessReview.class));
assertFalse(Utils.isResourceNamespaced(SelfSubjectAccessReview.class));
assertFalse(Utils.isResourceNamespaced(SelfSubjectRulesReview.class));
assertFalse(Utils.isResourceNamespaced(SubjectAccessReview.class));
assertTrue(Utils.isResourceNamespaced(HorizontalPodAutoscaler.class));
assertTrue(Utils.isResourceNamespaced(CronJob.class));
assertTrue(Utils.isResourceNamespaced(Job.class));
assertTrue(Utils.isResourceNamespaced(CertificateSigningRequest.class));
assertFalse(Utils.isResourceNamespaced(CertificateSigningRequest.class));
assertTrue(Utils.isResourceNamespaced(Lease.class));
assertTrue(Utils.isResourceNamespaced(EndpointSlice.class));
assertTrue(Utils.isResourceNamespaced(Ingress.class));
Expand All @@ -274,8 +274,8 @@ void testWhetherNamespacedOrNot() {
assertTrue(Utils.isResourceNamespaced(RoleBinding.class));
assertTrue(Utils.isResourceNamespaced(Role.class));
assertFalse(Utils.isResourceNamespaced(PriorityClass.class));
assertTrue(Utils.isResourceNamespaced(CSIDriver.class));
assertTrue(Utils.isResourceNamespaced(CSINode.class));
assertFalse(Utils.isResourceNamespaced(CSIDriver.class));
assertFalse(Utils.isResourceNamespaced(CSINode.class));
assertFalse(Utils.isResourceNamespaced(StorageClass.class));
assertTrue(Utils.isResourceNamespaced(VolumeAttachment.class));
}
Expand Down
Expand Up @@ -1984,8 +1984,7 @@
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.authentication.TokenReview",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata",
"io.fabric8.kubernetes.api.model.Namespaced"
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_authentication_TokenReviewSpec": {
Expand Down Expand Up @@ -2285,8 +2284,7 @@
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.authorization.SelfSubjectAccessReview",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata",
"io.fabric8.kubernetes.api.model.Namespaced"
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_authorization_SelfSubjectAccessReviewSpec": {
Expand Down Expand Up @@ -2340,8 +2338,7 @@
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.authorization.SelfSubjectRulesReview",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata",
"io.fabric8.kubernetes.api.model.Namespaced"
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_authorization_SelfSubjectRulesReviewSpec": {
Expand Down Expand Up @@ -2391,8 +2388,7 @@
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.authorization.SubjectAccessReview",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata",
"io.fabric8.kubernetes.api.model.Namespaced"
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_authorization_SubjectAccessReviewSpec": {
Expand Down
Expand Up @@ -1984,8 +1984,7 @@
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.authentication.TokenReview",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata",
"io.fabric8.kubernetes.api.model.Namespaced"
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_authentication_TokenReviewSpec": {
Expand Down Expand Up @@ -2285,8 +2284,7 @@
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.authorization.SelfSubjectAccessReview",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata",
"io.fabric8.kubernetes.api.model.Namespaced"
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_authorization_SelfSubjectAccessReviewSpec": {
Expand Down Expand Up @@ -2340,8 +2338,7 @@
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.authorization.SelfSubjectRulesReview",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata",
"io.fabric8.kubernetes.api.model.Namespaced"
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_authorization_SelfSubjectRulesReviewSpec": {
Expand Down Expand Up @@ -2391,8 +2388,7 @@
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.authorization.SubjectAccessReview",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata",
"io.fabric8.kubernetes.api.model.Namespaced"
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_authorization_SubjectAccessReviewSpec": {
Expand Down Expand Up @@ -3323,7 +3319,7 @@
"apiVersion": {
"type": "string",
"description": "",
"default": "admissionregistration.k8s.io/v1",
"default": "admissionregistration.k8s.io/v1beta1",
"required": true
},
"kind": {
Expand All @@ -3341,8 +3337,8 @@
"description": "",
"javaOmitEmpty": true,
"items": {
"$ref": "#/definitions/kubernetes_admissionregistration_v1_MutatingWebhook",
"javaType": "io.fabric8.kubernetes.api.model.admissionregistration.v1.MutatingWebhook"
"$ref": "#/definitions/kubernetes_admissionregistration_v1beta1_MutatingWebhook",
"javaType": "io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.MutatingWebhook"
}
}
},
Expand All @@ -3353,15 +3349,15 @@
"apiVersion": {
"type": "string",
"description": "",
"default": "admissionregistration.k8s.io/v1",
"default": "admissionregistration.k8s.io/v1beta1",
"required": true
},
"items": {
"type": "array",
"description": "",
"items": {
"$ref": "#/definitions/kubernetes_admissionregistration_v1_MutatingWebhookConfiguration",
"javaType": "io.fabric8.kubernetes.api.model.admissionregistration.v1.MutatingWebhookConfiguration"
"$ref": "#/definitions/kubernetes_admissionregistration_v1beta1_MutatingWebhookConfiguration",
"javaType": "io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.MutatingWebhookConfiguration"
}
},
"kind": {
Expand Down Expand Up @@ -4261,14 +4257,15 @@
"admissionReviewVersions": {
"type": "array",
"description": "",
"javaOmitEmpty": true,
"items": {
"type": "string",
"description": ""
}
},
"clientConfig": {
"$ref": "#/definitions/kubernetes_admissionregistration_v1_WebhookClientConfig",
"javaType": "io.fabric8.kubernetes.api.model.admissionregistration.v1.WebhookClientConfig"
"$ref": "#/definitions/kubernetes_admissionregistration_v1beta1_WebhookClientConfig",
"javaType": "io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.WebhookClientConfig"
},
"failurePolicy": {
"type": "string",
Expand All @@ -4295,8 +4292,8 @@
"description": "",
"javaOmitEmpty": true,
"items": {
"$ref": "#/definitions/kubernetes_admissionregistration_v1_RuleWithOperations",
"javaType": "io.fabric8.kubernetes.api.model.admissionregistration.v1.RuleWithOperations"
"$ref": "#/definitions/kubernetes_admissionregistration_v1beta1_RuleWithOperations",
"javaType": "io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.RuleWithOperations"
}
},
"sideEffects": {
Expand All @@ -4315,7 +4312,7 @@
"apiVersion": {
"type": "string",
"description": "",
"default": "admissionregistration.k8s.io/v1beta1",
"default": "admissionregistration.k8s.io/v1",
"required": true
},
"kind": {
Expand All @@ -4333,8 +4330,8 @@
"description": "",
"javaOmitEmpty": true,
"items": {
"$ref": "#/definitions/kubernetes_admissionregistration_v1beta1_ValidatingWebhook",
"javaType": "io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingWebhook"
"$ref": "#/definitions/kubernetes_admissionregistration_v1_ValidatingWebhook",
"javaType": "io.fabric8.kubernetes.api.model.admissionregistration.v1.ValidatingWebhook"
}
}
},
Expand Down
Expand Up @@ -915,8 +915,7 @@
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.certificates.CertificateSigningRequest",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata",
"io.fabric8.kubernetes.api.model.Namespaced"
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_certificates_CertificateSigningRequestCondition": {
Expand Down
Expand Up @@ -915,8 +915,7 @@
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.certificates.CertificateSigningRequest",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata",
"io.fabric8.kubernetes.api.model.Namespaced"
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_certificates_CertificateSigningRequestCondition": {
Expand Down
Expand Up @@ -2330,8 +2330,7 @@
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.storage.v1beta1.CSIDriver",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata",
"io.fabric8.kubernetes.api.model.Namespaced"
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_storageclass_v1beta1_CSIDriverList": {
Expand Down Expand Up @@ -2426,8 +2425,7 @@
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.storage.v1beta1.CSINode",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata",
"io.fabric8.kubernetes.api.model.Namespaced"
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_storageclass_v1beta1_CSINodeDriver": {
Expand Down