Skip to content

Commit f06133a

Browse files
committed
feat (kubernetes-client) : Add DSL entrypoints for Kubernetes 1.28.2 resources (#5401)
Add KubernetesClient DSL entrypoints for these resources: - admissionregistration.k8s.io/v1beta1 ValidatingAdmissionPolicy `client.admissionRegistration().v1beta1().validatingAdmissionPolicies()` - admissionregistration.k8s.io/v1beta1 ValidatingAdmissionPolicyBinding `client.admissionRegistration().v1beta1().validatingAdmissionPolicyBindings()` - authentication.k8s.io/v1 SelfSubjectReview `client.authentication().v1().selfSubjectReviews()` Signed-off-by: Rohan Kumar <rohaan@redhat.com>
1 parent 49e2d19 commit f06133a

File tree

10 files changed

+635
-0
lines changed

10 files changed

+635
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
#### Dependency Upgrade
2525
* Fix #5373: Gradle base API based on v8.2.1
26+
* Fix #5401: Upgrade Fabric8 Kubernetes Model to Kubernetes v1.28.2
2627

2728
#### New Features
2829
* Fix #5430: Mock Web Server migrated to this repository

kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/V1AuthenticationAPIGroupDSL.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.fabric8.kubernetes.client;
1717

18+
import io.fabric8.kubernetes.api.model.authentication.SelfSubjectReview;
1819
import io.fabric8.kubernetes.api.model.authentication.TokenReview;
1920
import io.fabric8.kubernetes.client.dsl.InOutCreateable;
2021

@@ -25,4 +26,16 @@ public interface V1AuthenticationAPIGroupDSL extends Client {
2526
* @return InOutCreateable instance for creating TokenReview object
2627
*/
2728
InOutCreateable<TokenReview, TokenReview> tokenReviews();
29+
30+
/**
31+
* API for creating authentication.k8s.io/v1 SelfSubjectReview
32+
* <p>
33+
* SelfSubjectReview contains the user information that the kube-apiserver has about the user making this request.
34+
* When using impersonation, users will receive the user info of the user being impersonated. If impersonation or
35+
* request header authentication is used, any extra keys will have their case ignored and returned as lowercase.
36+
* </p>
37+
*
38+
* @return InOutCreateable instance for creating SelfSubjectReview object
39+
*/
40+
InOutCreateable<SelfSubjectReview, SelfSubjectReview> selfSubjectReviews();
2841
}

kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/V1beta1AdmissionRegistrationAPIGroupDSL.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717

1818
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.MutatingWebhookConfiguration;
1919
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.MutatingWebhookConfigurationList;
20+
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingAdmissionPolicy;
21+
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingAdmissionPolicyBinding;
22+
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingAdmissionPolicyBindingList;
23+
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingAdmissionPolicyList;
2024
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingWebhookConfiguration;
2125
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingWebhookConfigurationList;
2226
import io.fabric8.kubernetes.client.dsl.MixedOperation;
@@ -27,4 +31,26 @@ public interface V1beta1AdmissionRegistrationAPIGroupDSL extends Client {
2731
MixedOperation<ValidatingWebhookConfiguration, ValidatingWebhookConfigurationList, Resource<ValidatingWebhookConfiguration>> validatingWebhookConfigurations();
2832

2933
NonNamespaceOperation<MutatingWebhookConfiguration, MutatingWebhookConfigurationList, Resource<MutatingWebhookConfiguration>> mutatingWebhookConfigurations();
34+
35+
/**
36+
* API entrypoint for admissionregistration.k8s.io/v1beta1 ValidatingAdmissionPolicy
37+
* <p>
38+
* ValidatingAdmissionPolicy describes the definition of an admission validation policy that accepts or
39+
* rejects an object without changing it.
40+
* </p>
41+
*
42+
* @return NonNamespaceOperation for ValidatingAdmissionPolicy
43+
*/
44+
NonNamespaceOperation<ValidatingAdmissionPolicy, ValidatingAdmissionPolicyList, Resource<ValidatingAdmissionPolicy>> validatingAdmissionPolicies();
45+
46+
/**
47+
* API entrypoint for admissionregistration.k8s.io/v1beta1 ValidatingAdmissionPolicyBinding
48+
* <p>
49+
* ValidatingAdmissionPolicyBinding and parameter CRDs together define how cluster administrators configure policies for
50+
* clusters.
51+
* </p>
52+
*
53+
* @return NonNamespaceOperation for ValidatingAdmissionPolicyBinding
54+
*/
55+
NonNamespaceOperation<ValidatingAdmissionPolicyBinding, ValidatingAdmissionPolicyBindingList, Resource<ValidatingAdmissionPolicyBinding>> validatingAdmissionPolicyBindings();
3056
}

kubernetes-client/src/main/java/io/fabric8/kubernetes/client/impl/V1AuthenticationAPIGroupClient.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.fabric8.kubernetes.client.impl;
1717

18+
import io.fabric8.kubernetes.api.model.authentication.SelfSubjectReview;
1819
import io.fabric8.kubernetes.api.model.authentication.TokenReview;
1920
import io.fabric8.kubernetes.client.V1AuthenticationAPIGroupDSL;
2021
import io.fabric8.kubernetes.client.dsl.InOutCreateable;
@@ -27,6 +28,11 @@ public InOutCreateable<TokenReview, TokenReview> tokenReviews() {
2728
return getClient().adapt(BaseClient.class).getHandlers().getNonListingOperation(TokenReview.class, this);
2829
}
2930

31+
@Override
32+
public InOutCreateable<SelfSubjectReview, SelfSubjectReview> selfSubjectReviews() {
33+
return getClient().adapt(BaseClient.class).getHandlers().getNonListingOperation(SelfSubjectReview.class, this);
34+
}
35+
3036
@Override
3137
public V1AuthenticationAPIGroupClient newInstance() {
3238
return new V1AuthenticationAPIGroupClient();

kubernetes-client/src/main/java/io/fabric8/kubernetes/client/impl/V1beta1AdmissionRegistrationAPIGroupClient.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717

1818
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.MutatingWebhookConfiguration;
1919
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.MutatingWebhookConfigurationList;
20+
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingAdmissionPolicy;
21+
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingAdmissionPolicyBinding;
22+
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingAdmissionPolicyBindingList;
23+
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingAdmissionPolicyList;
2024
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingWebhookConfiguration;
2125
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingWebhookConfigurationList;
2226
import io.fabric8.kubernetes.client.V1beta1AdmissionRegistrationAPIGroupDSL;
@@ -38,6 +42,16 @@ public NonNamespaceOperation<MutatingWebhookConfiguration, MutatingWebhookConfig
3842
return resources(MutatingWebhookConfiguration.class, MutatingWebhookConfigurationList.class);
3943
}
4044

45+
@Override
46+
public NonNamespaceOperation<ValidatingAdmissionPolicy, ValidatingAdmissionPolicyList, Resource<io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingAdmissionPolicy>> validatingAdmissionPolicies() {
47+
return resources(ValidatingAdmissionPolicy.class, ValidatingAdmissionPolicyList.class);
48+
}
49+
50+
@Override
51+
public NonNamespaceOperation<ValidatingAdmissionPolicyBinding, ValidatingAdmissionPolicyBindingList, Resource<ValidatingAdmissionPolicyBinding>> validatingAdmissionPolicyBindings() {
52+
return resources(ValidatingAdmissionPolicyBinding.class, ValidatingAdmissionPolicyBindingList.class);
53+
}
54+
4155
@Override
4256
public V1beta1AdmissionRegistrationAPIGroupClient newInstance() {
4357
return new V1beta1AdmissionRegistrationAPIGroupClient();
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/**
2+
* Copyright (C) 2015 Red Hat, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.fabric8.kubernetes.client.mock;
17+
18+
import io.fabric8.kubernetes.api.model.authentication.SelfSubjectReview;
19+
import io.fabric8.kubernetes.api.model.authentication.SelfSubjectReviewBuilder;
20+
import io.fabric8.kubernetes.client.KubernetesClient;
21+
import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient;
22+
import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
23+
import org.junit.jupiter.api.Test;
24+
25+
import java.util.Arrays;
26+
import java.util.List;
27+
28+
import static java.net.HttpURLConnection.HTTP_CREATED;
29+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
30+
31+
@EnableKubernetesMockClient
32+
class V1SelfSubjectReviewTest {
33+
private KubernetesClient client;
34+
private KubernetesMockServer server;
35+
36+
@Test
37+
void create_whenInvoked_shouldReturnObjectWithUpdatedStatus() {
38+
// Given
39+
SelfSubjectReview ssr = new SelfSubjectReview();
40+
server.expect().post()
41+
.withPath("/apis/authentication.k8s.io/v1/selfsubjectreviews")
42+
.andReturn(HTTP_CREATED, createNewSelfSubjectReview(Arrays.asList("system:masters", "system:authenticated")))
43+
.once();
44+
45+
// When
46+
SelfSubjectReview result = client.authentication().v1().selfSubjectReviews().create(ssr);
47+
48+
// Then
49+
assertThat(result)
50+
.isNotNull()
51+
.hasFieldOrPropertyWithValue("status.userInfo.username", "kubernetes-admin")
52+
.hasFieldOrPropertyWithValue("status.userInfo.groups", Arrays.asList("system:masters", "system:authenticated"));
53+
}
54+
55+
private SelfSubjectReview createNewSelfSubjectReview(List<String> groups) {
56+
return new SelfSubjectReviewBuilder()
57+
.withNewStatus()
58+
.withNewUserInfo()
59+
.withUsername("kubernetes-admin")
60+
.withGroups(groups)
61+
.endUserInfo()
62+
.endStatus()
63+
.build();
64+
}
65+
}
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
/**
2+
* Copyright (C) 2015 Red Hat, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.fabric8.kubernetes.client.mock;
17+
18+
import io.fabric8.kubernetes.api.model.HasMetadata;
19+
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingAdmissionPolicyBinding;
20+
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingAdmissionPolicyBindingBuilder;
21+
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingAdmissionPolicyBindingList;
22+
import io.fabric8.kubernetes.api.model.admissionregistration.v1beta1.ValidatingAdmissionPolicyBindingListBuilder;
23+
import io.fabric8.kubernetes.client.KubernetesClient;
24+
import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient;
25+
import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
26+
import org.assertj.core.api.AssertionsForClassTypes;
27+
import org.junit.jupiter.api.Test;
28+
29+
import java.net.HttpURLConnection;
30+
import java.util.List;
31+
32+
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
33+
34+
@EnableKubernetesMockClient
35+
class V1beta1ValidatingAdmissionPolicyBindingTest {
36+
37+
private KubernetesMockServer server;
38+
private KubernetesClient client;
39+
40+
@Test
41+
void load() {
42+
List<HasMetadata> items = client.load(getClass().getResourceAsStream("/test-v1beta1-validatingadmissionpolicybinding.yml"))
43+
.items();
44+
assertThat(items).isNotNull().hasSize(1);
45+
AssertionsForClassTypes.assertThat(items.get(0))
46+
.isInstanceOf(ValidatingAdmissionPolicyBinding.class)
47+
.hasFieldOrPropertyWithValue("metadata.name", "demo-binding-test.example.com");
48+
}
49+
50+
@Test
51+
void get() {
52+
// Given
53+
server.expect().get()
54+
.withPath("/apis/admissionregistration.k8s.io/v1beta1/validatingadmissionpolicybindings/demo-binding-test.example.com")
55+
.andReturn(HttpURLConnection.HTTP_OK, createValidatingAdmissionPolicyBinding())
56+
.once();
57+
58+
// When
59+
ValidatingAdmissionPolicyBinding validatingAdmissionPolicyBinding = client.admissionRegistration().v1beta1()
60+
.validatingAdmissionPolicyBindings().withName("demo-binding-test.example.com").get();
61+
62+
// Then
63+
AssertionsForClassTypes.assertThat(validatingAdmissionPolicyBinding)
64+
.isNotNull()
65+
.hasFieldOrPropertyWithValue("metadata.name", "demo-binding-test.example.com");
66+
}
67+
68+
@Test
69+
void list() {
70+
// Given
71+
server.expect().get().withPath("/apis/admissionregistration.k8s.io/v1beta1/validatingadmissionpolicybindings")
72+
.andReturn(HttpURLConnection.HTTP_OK, new ValidatingAdmissionPolicyBindingListBuilder()
73+
.addToItems(createValidatingAdmissionPolicyBinding())
74+
.build())
75+
.once();
76+
77+
// When
78+
ValidatingAdmissionPolicyBindingList flowSchemas = client.admissionRegistration().v1beta1()
79+
.validatingAdmissionPolicyBindings().list();
80+
81+
// Then
82+
AssertionsForClassTypes.assertThat(flowSchemas).isNotNull();
83+
assertThat(flowSchemas.getItems()).hasSize(1);
84+
AssertionsForClassTypes.assertThat(flowSchemas.getItems().get(0))
85+
.hasFieldOrPropertyWithValue("metadata.name", "demo-binding-test.example.com");
86+
}
87+
88+
@Test
89+
void create() {
90+
// Given
91+
ValidatingAdmissionPolicyBinding validatingAdmissionPolicyBinding = createValidatingAdmissionPolicyBinding();
92+
server.expect().post().withPath("/apis/admissionregistration.k8s.io/v1beta1/validatingadmissionpolicybindings")
93+
.andReturn(HttpURLConnection.HTTP_OK, validatingAdmissionPolicyBinding)
94+
.once();
95+
96+
// When
97+
ValidatingAdmissionPolicyBinding createdValidatingAdmissionPolicyBinding = client.admissionRegistration().v1beta1()
98+
.validatingAdmissionPolicyBindings().resource(validatingAdmissionPolicyBinding).create();
99+
100+
// Then
101+
AssertionsForClassTypes.assertThat(createdValidatingAdmissionPolicyBinding).isNotNull();
102+
AssertionsForClassTypes.assertThat(createdValidatingAdmissionPolicyBinding)
103+
.hasFieldOrPropertyWithValue("metadata.name", "demo-binding-test.example.com");
104+
}
105+
106+
@Test
107+
void delete() {
108+
// Given
109+
ValidatingAdmissionPolicyBinding flowSchema = createValidatingAdmissionPolicyBinding();
110+
server.expect().delete()
111+
.withPath("/apis/admissionregistration.k8s.io/v1beta1/validatingadmissionpolicybindings/demo-binding-test.example.com")
112+
.andReturn(HttpURLConnection.HTTP_OK, flowSchema)
113+
.once();
114+
115+
// When
116+
boolean isDeleted = client.admissionRegistration().v1beta1().validatingAdmissionPolicyBindings()
117+
.withName("demo-binding-test.example.com").delete().size() == 1;
118+
119+
// Then
120+
AssertionsForClassTypes.assertThat(isDeleted).isTrue();
121+
}
122+
123+
private ValidatingAdmissionPolicyBinding createValidatingAdmissionPolicyBinding() {
124+
return new ValidatingAdmissionPolicyBindingBuilder()
125+
.withNewMetadata().withName("demo-binding-test.example.com").endMetadata()
126+
.withNewSpec()
127+
.withPolicyName("demo-policy.example.com")
128+
.withNewMatchResources()
129+
.withNewNamespaceSelector()
130+
.addNewMatchExpression()
131+
.withKey("environment")
132+
.withOperator("In")
133+
.withValues("test")
134+
.endMatchExpression()
135+
.endNamespaceSelector()
136+
.endMatchResources()
137+
.endSpec()
138+
.build();
139+
}
140+
}

0 commit comments

Comments
 (0)