Skip to content

Commit 9559e32

Browse files
authored
Support for passing old resource to validator (#330)
* Support for passing old resource to validator * Pass directly the resource/oldResource for validator
1 parent 907f672 commit 9559e32

File tree

6 files changed

+39
-24
lines changed

6 files changed

+39
-24
lines changed

core/src/main/java/io/javaoperatorsdk/webhook/admission/validation/AsyncDefaultAdmissionRequestValidator.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import io.javaoperatorsdk.webhook.admission.Operation;
1313

1414
import static io.javaoperatorsdk.webhook.admission.AdmissionUtils.allowedAdmissionResponse;
15-
import static io.javaoperatorsdk.webhook.admission.AdmissionUtils.getTargetResource;
1615
import static io.javaoperatorsdk.webhook.admission.AdmissionUtils.notAllowedExceptionToAdmissionResponse;
1716

1817
public class AsyncDefaultAdmissionRequestValidator<T extends KubernetesResource>
@@ -28,9 +27,11 @@ public AsyncDefaultAdmissionRequestValidator(Validator<T> validator) {
2827
@SuppressWarnings("unchecked")
2928
public CompletionStage<AdmissionResponse> handle(AdmissionRequest admissionRequest) {
3029
var operation = Operation.valueOf(admissionRequest.getOperation());
31-
var originalResource = (T) getTargetResource(admissionRequest, operation);
30+
var originalResource = (T) admissionRequest.getObject();
31+
var oldResource = (T) admissionRequest.getOldObject();
3232
var asyncValidate =
33-
CompletableFuture.runAsync(() -> validator.validate(originalResource, operation));
33+
CompletableFuture
34+
.runAsync(() -> validator.validate(originalResource, oldResource, operation));
3435
return asyncValidate
3536
.thenApply(v -> allowedAdmissionResponse())
3637
.exceptionally(e -> {

core/src/main/java/io/javaoperatorsdk/webhook/admission/validation/DefaultAdmissionRequestValidator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import io.javaoperatorsdk.webhook.admission.Operation;
99

1010
import static io.javaoperatorsdk.webhook.admission.AdmissionUtils.allowedAdmissionResponse;
11-
import static io.javaoperatorsdk.webhook.admission.AdmissionUtils.getTargetResource;
1211
import static io.javaoperatorsdk.webhook.admission.AdmissionUtils.notAllowedExceptionToAdmissionResponse;
1312

1413
public class DefaultAdmissionRequestValidator<T extends KubernetesResource>
@@ -24,9 +23,10 @@ public DefaultAdmissionRequestValidator(Validator<T> validator) {
2423
@SuppressWarnings("unchecked")
2524
public AdmissionResponse handle(AdmissionRequest admissionRequest) {
2625
var operation = Operation.valueOf(admissionRequest.getOperation());
27-
var originalResource = (T) getTargetResource(admissionRequest, operation);
26+
var originalResource = (T) admissionRequest.getObject();
27+
var oldResource = (T) admissionRequest.getOldObject();
2828
try {
29-
validator.validate(originalResource, operation);
29+
validator.validate(originalResource, oldResource, operation);
3030
return allowedAdmissionResponse();
3131
} catch (NotAllowedException e) {
3232
return notAllowedExceptionToAdmissionResponse(e);

core/src/main/java/io/javaoperatorsdk/webhook/admission/validation/Validator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66

77
public interface Validator<T extends KubernetesResource> {
88

9-
void validate(T resource, Operation operation) throws NotAllowedException;
9+
void validate(T resource, T oldResource, Operation operation) throws NotAllowedException;
1010
}

core/src/test/java/io/javaoperatorsdk/webhook/admission/AdmissionControllerTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,16 @@ class AdmissionControllerTest {
1515

1616
@Test
1717
void validatesResource() {
18-
var admissionController = new AdmissionController<HasMetadata>((resource, operation) -> {
19-
});
18+
var admissionController =
19+
new AdmissionController<HasMetadata>((resource, oldResource, operation) -> {
20+
});
2021
admissionTestSupport.validatesResource(admissionController::handle);
2122
}
2223

2324
@Test
2425
void validatesResource_whenNotAllowedException() {
2526
var admissionController =
26-
new AdmissionController<>((Validator<HasMetadata>) (resource, operation) -> {
27+
new AdmissionController<>((Validator<HasMetadata>) (resource, oldResource, operation) -> {
2728
throw new NotAllowedException(MISSING_REQUIRED_LABEL);
2829
});
2930
admissionTestSupport.notAllowedException(admissionController::handle);
@@ -32,7 +33,7 @@ void validatesResource_whenNotAllowedException() {
3233
@Test
3334
void validatesResource_whenOtherException() {
3435
var admissionController =
35-
new AdmissionController<>((Validator<HasMetadata>) (resource, operation) -> {
36+
new AdmissionController<>((Validator<HasMetadata>) (resource, oldResource, operation) -> {
3637
throw new IllegalArgumentException("Invalid resource");
3738
});
3839

core/src/test/java/io/javaoperatorsdk/webhook/admission/AsyncAdmissionControllerTest.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ class AsyncAdmissionControllerTest {
2020

2121
@Test
2222
void validatesResource() {
23-
var admissionController = new AsyncAdmissionController<HasMetadata>((resource, operation) -> {
24-
});
23+
var admissionController =
24+
new AsyncAdmissionController<HasMetadata>((resource, oldResource, operation) -> {
25+
});
2526

2627
admissionTestSupport
2728
.validatesResource(res -> admissionController.handle(res).toCompletableFuture().join());
@@ -30,9 +31,10 @@ void validatesResource() {
3031
@Test
3132
void validatesResource_whenNotAllowedException() {
3233
var admissionController =
33-
new AsyncAdmissionController<>((Validator<HasMetadata>) (resource, operation) -> {
34-
throw new NotAllowedException(MISSING_REQUIRED_LABEL);
35-
});
34+
new AsyncAdmissionController<>(
35+
(Validator<HasMetadata>) (resource, oldResource, operation) -> {
36+
throw new NotAllowedException(MISSING_REQUIRED_LABEL);
37+
});
3638

3739
admissionTestSupport
3840
.notAllowedException(res -> admissionController.handle(res).toCompletableFuture().join());
@@ -41,9 +43,10 @@ void validatesResource_whenNotAllowedException() {
4143
@Test
4244
void validatesResource_whenOtherException() {
4345
var admissionController =
44-
new AsyncAdmissionController<>((Validator<HasMetadata>) (resource, operation) -> {
45-
throw new IllegalArgumentException("Invalid resource");
46-
});
46+
new AsyncAdmissionController<>(
47+
(Validator<HasMetadata>) (resource, oldResource, operation) -> {
48+
throw new IllegalArgumentException("Invalid resource");
49+
});
4750

4851
admissionTestSupport.assertThatThrownBy(
4952
res -> admissionController.handle(res).toCompletableFuture()

samples/commons/src/main/java/io/javaoperatorsdk/webhook/sample/commons/AdmissionControllers.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public static AsyncAdmissionController<Ingress> asyncValidatingController() {
3636
}
3737

3838
public static AdmissionController<Ingress> errorMutatingController() {
39-
return new AdmissionController<>((Validator<Ingress>) (resource, operation) -> {
39+
return new AdmissionController<>((Validator<Ingress>) (resource, oldResource, operation) -> {
4040
throw new IllegalStateException(ERROR_MESSAGE);
4141
});
4242
}
@@ -54,9 +54,10 @@ public static AsyncAdmissionController<Ingress> errorAsyncMutatingController() {
5454
}
5555

5656
public static AsyncAdmissionController<Ingress> errorAsyncValidatingController() {
57-
return new AsyncAdmissionController<>((Validator<Ingress>) (resource, operation) -> {
58-
throw new IllegalStateException(ERROR_MESSAGE);
59-
});
57+
return new AsyncAdmissionController<>(
58+
(Validator<Ingress>) (resource, oldResource, operation) -> {
59+
throw new IllegalStateException(ERROR_MESSAGE);
60+
});
6061
}
6162

6263
private static class IngressMutator implements Mutator<Ingress> {
@@ -72,11 +73,20 @@ public Ingress mutate(Ingress resource, Operation operation) throws NotAllowedEx
7273

7374
private static class IngressValidator implements Validator<Ingress> {
7475
@Override
75-
public void validate(Ingress resource, Operation operation) throws NotAllowedException {
76+
public void validate(Ingress resource, Ingress oldResource, Operation operation)
77+
throws NotAllowedException {
78+
if (operation.equals(Operation.DELETE)) {
79+
return;
80+
}
7681
if (resource.getMetadata().getLabels() == null
7782
|| resource.getMetadata().getLabels().get(VALIDATION_TARGET_LABEL) == null) {
7883
throw new NotAllowedException("Missing label: " + VALIDATION_TARGET_LABEL);
7984
}
85+
if (operation.equals(Operation.UPDATE)
86+
&& !resource.getSpec().getIngressClassName()
87+
.equals(oldResource.getSpec().getIngressClassName())) {
88+
throw new NotAllowedException("IngressClassName cannot be changed");
89+
}
8090
}
8191
}
8292
}

0 commit comments

Comments
 (0)