|
1 | 1 | package io.javaoperatorsdk.webhook.admission.mutation;
|
2 | 2 |
|
3 | 3 | import java.util.concurrent.CompletableFuture;
|
| 4 | +import java.util.concurrent.CompletionException; |
4 | 5 | import java.util.concurrent.CompletionStage;
|
5 | 6 |
|
6 | 7 | import io.fabric8.kubernetes.api.model.KubernetesResource;
|
7 | 8 | import io.fabric8.kubernetes.api.model.admission.v1.AdmissionRequest;
|
8 | 9 | import io.fabric8.kubernetes.api.model.admission.v1.AdmissionResponse;
|
9 |
| -import io.javaoperatorsdk.webhook.admission.AdmissionUtils; |
10 | 10 | import io.javaoperatorsdk.webhook.admission.AsyncAdmissionRequestHandler;
|
11 | 11 | import io.javaoperatorsdk.webhook.admission.NotAllowedException;
|
12 | 12 | import io.javaoperatorsdk.webhook.admission.Operation;
|
|
15 | 15 |
|
16 | 16 | import static io.javaoperatorsdk.webhook.admission.AdmissionUtils.admissionResponseFromMutation;
|
17 | 17 | import static io.javaoperatorsdk.webhook.admission.AdmissionUtils.getTargetResource;
|
| 18 | +import static io.javaoperatorsdk.webhook.admission.AdmissionUtils.notAllowedExceptionToAdmissionResponse; |
18 | 19 |
|
19 | 20 | public class AsyncDefaultAdmissionRequestMutator<T extends KubernetesResource>
|
20 | 21 | implements AsyncAdmissionRequestHandler {
|
21 | 22 |
|
22 |
| - private final AsyncMutator<T> mutator; |
| 23 | + private final AsyncMutator<T> asyncMutator; |
23 | 24 | private final Cloner<T> cloner;
|
24 | 25 |
|
25 |
| - public AsyncDefaultAdmissionRequestMutator(AsyncMutator<T> mutator) { |
| 26 | + public AsyncDefaultAdmissionRequestMutator(Mutator<T> mutator) { |
26 | 27 | this(mutator, new ObjectMapperCloner<>());
|
27 | 28 | }
|
28 | 29 |
|
29 |
| - public AsyncDefaultAdmissionRequestMutator(AsyncMutator<T> mutator, Cloner<T> cloner) { |
30 |
| - this.mutator = mutator; |
| 30 | + public AsyncDefaultAdmissionRequestMutator(Mutator<T> mutator, Cloner<T> cloner) { |
| 31 | + this((AsyncMutator<T>) (resource, operation) -> CompletableFuture.supplyAsync( |
| 32 | + () -> mutator.mutate(resource, operation)), cloner); |
| 33 | + } |
| 34 | + |
| 35 | + public AsyncDefaultAdmissionRequestMutator(AsyncMutator<T> asyncMutator) { |
| 36 | + this(asyncMutator, new ObjectMapperCloner<>()); |
| 37 | + } |
| 38 | + |
| 39 | + public AsyncDefaultAdmissionRequestMutator(AsyncMutator<T> asyncMutator, Cloner<T> cloner) { |
| 40 | + this.asyncMutator = asyncMutator; |
31 | 41 | this.cloner = cloner;
|
32 | 42 | }
|
33 | 43 |
|
34 | 44 | @Override
|
| 45 | + @SuppressWarnings("unchecked") |
35 | 46 | public CompletionStage<AdmissionResponse> handle(AdmissionRequest admissionRequest) {
|
36 |
| - Operation operation = Operation.valueOf(admissionRequest.getOperation()); |
| 47 | + var operation = Operation.valueOf(admissionRequest.getOperation()); |
37 | 48 | var originalResource = (T) getTargetResource(admissionRequest, operation);
|
38 | 49 | var clonedResource = cloner.clone(originalResource);
|
39 |
| - CompletionStage<AdmissionResponse> admissionResponse; |
40 |
| - try { |
41 |
| - var mutatedResource = mutator.mutate(clonedResource, operation); |
42 |
| - admissionResponse = |
43 |
| - mutatedResource.thenApply(mr -> admissionResponseFromMutation(originalResource, mr)); |
44 |
| - } catch (NotAllowedException e) { |
45 |
| - admissionResponse = CompletableFuture |
46 |
| - .supplyAsync(() -> AdmissionUtils.notAllowedExceptionToAdmissionResponse(e)); |
47 |
| - } |
48 |
| - return admissionResponse; |
| 50 | + return asyncMutator.mutate(clonedResource, operation) |
| 51 | + .thenApply(resource -> admissionResponseFromMutation(originalResource, resource)) |
| 52 | + .exceptionally(e -> { |
| 53 | + if (e instanceof CompletionException) { |
| 54 | + if (e.getCause() instanceof NotAllowedException) { |
| 55 | + return notAllowedExceptionToAdmissionResponse((NotAllowedException) e.getCause()); |
| 56 | + } |
| 57 | + throw new IllegalStateException(e.getCause()); |
| 58 | + } |
| 59 | + throw new IllegalStateException(e); |
| 60 | + }); |
49 | 61 | }
|
50 |
| - |
51 | 62 | }
|
0 commit comments