Skip to content

Commit fe8aa36

Browse files
authored
Ignore type returned from pod delete (#2040)
1 parent caa82c2 commit fe8aa36

File tree

6 files changed

+128
-41
lines changed

6 files changed

+128
-41
lines changed

operator/src/main/java/oracle/kubernetes/operator/StuckPodProcessing.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import io.kubernetes.client.openapi.models.V1ObjectMeta;
1414
import io.kubernetes.client.openapi.models.V1Pod;
1515
import io.kubernetes.client.openapi.models.V1PodList;
16-
import io.kubernetes.client.openapi.models.V1Status;
1716
import oracle.kubernetes.operator.calls.CallResponse;
1817
import oracle.kubernetes.operator.helpers.CallBuilder;
1918
import oracle.kubernetes.operator.helpers.PodHelper;
@@ -136,7 +135,7 @@ private String getDomainUid(V1Pod pod) {
136135
}
137136
}
138137

139-
static class ForcedDeleteResponseStep extends DefaultResponseStep<V1Status> {
138+
static class ForcedDeleteResponseStep extends DefaultResponseStep<Object> {
140139

141140
private final String name;
142141
private final String namespace;
@@ -147,7 +146,7 @@ public ForcedDeleteResponseStep(String name, String namespace) {
147146
}
148147

149148
@Override
150-
public NextAction onSuccess(Packet packet, CallResponse<V1Status> callResponse) {
149+
public NextAction onSuccess(Packet packet, CallResponse<Object> callResponse) {
151150
LOGGER.info(POD_FORCE_DELETED, name, namespace);
152151
return super.onSuccess(packet, callResponse);
153152
}

operator/src/main/java/oracle/kubernetes/operator/helpers/CallBuilder.java

Lines changed: 94 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,20 @@
33

44
package oracle.kubernetes.operator.helpers;
55

6+
import java.lang.reflect.Type;
7+
import java.util.ArrayList;
8+
import java.util.HashMap;
9+
import java.util.List;
10+
import java.util.Map;
611
import java.util.Optional;
712
import java.util.function.Consumer;
813

14+
import com.google.gson.reflect.TypeToken;
915
import io.kubernetes.client.custom.V1Patch;
1016
import io.kubernetes.client.openapi.ApiCallback;
1117
import io.kubernetes.client.openapi.ApiClient;
1218
import io.kubernetes.client.openapi.ApiException;
19+
import io.kubernetes.client.openapi.Pair;
1320
import io.kubernetes.client.openapi.apis.ApiextensionsV1Api;
1421
import io.kubernetes.client.openapi.apis.ApiextensionsV1beta1Api;
1522
import io.kubernetes.client.openapi.apis.AuthenticationV1Api;
@@ -303,7 +310,7 @@ public <T> T execute(
303310
requestParams.namespace,
304311
(V1DeleteOptions) requestParams.body,
305312
callback));
306-
private final CallFactory<V1Status> deletePod =
313+
private final CallFactory<Object> deletePod =
307314
(requestParams, usage, cont, callback) ->
308315
wrap(
309316
deletePodAsync(
@@ -1117,19 +1124,19 @@ private Call deletePodAsync(
11171124
String name,
11181125
String namespace,
11191126
V1DeleteOptions deleteOptions,
1120-
ApiCallback<V1Status> callback)
1127+
ApiCallback<Object> callback)
11211128
throws ApiException {
1122-
return new CoreV1Api(client)
1123-
.deleteNamespacedPodAsync(
1124-
name,
1125-
namespace,
1126-
pretty,
1127-
dryRun,
1128-
gracePeriodSeconds,
1129-
orphanDependents,
1130-
propagationPolicy,
1131-
deleteOptions,
1132-
callback);
1129+
return deleteNamespacedPodAsync(
1130+
client,
1131+
name,
1132+
namespace,
1133+
pretty,
1134+
dryRun,
1135+
gracePeriodSeconds,
1136+
orphanDependents,
1137+
propagationPolicy,
1138+
deleteOptions,
1139+
callback);
11331140
}
11341141

11351142
/**
@@ -1145,11 +1152,84 @@ public Step deletePodAsync(
11451152
String name,
11461153
String namespace,
11471154
V1DeleteOptions deleteOptions,
1148-
ResponseStep<V1Status> responseStep) {
1155+
ResponseStep<Object> responseStep) {
11491156
return createRequestAsync(
11501157
responseStep, new RequestParams("deletePod", namespace, name, deleteOptions), deletePod);
11511158
}
11521159

1160+
private Call deleteNamespacedPodAsync(ApiClient client, String name, String namespace, String pretty, String dryRun,
1161+
Integer gracePeriodSeconds, Boolean orphanDependents, String propagationPolicy,
1162+
V1DeleteOptions body, ApiCallback<Object> callback) throws ApiException {
1163+
Call localVarCall = this.deleteNamespacedPodValidateBeforeCall(client, name, namespace, pretty, dryRun,
1164+
gracePeriodSeconds, orphanDependents, propagationPolicy, body, callback);
1165+
Type localVarReturnType = (new TypeToken<Object>() {
1166+
}).getType();
1167+
client.executeAsync(localVarCall, localVarReturnType, callback);
1168+
return localVarCall;
1169+
}
1170+
1171+
private Call deleteNamespacedPodValidateBeforeCall(ApiClient client, String name, String namespace, String pretty,
1172+
String dryRun, Integer gracePeriodSeconds,
1173+
Boolean orphanDependents, String propagationPolicy,
1174+
V1DeleteOptions body, ApiCallback callback) throws ApiException {
1175+
if (name == null) {
1176+
throw new ApiException("Missing the required parameter 'name' when calling deleteNamespacedPod(Async)");
1177+
} else if (namespace == null) {
1178+
throw new ApiException("Missing the required parameter 'namespace' when calling deleteNamespacedPod(Async)");
1179+
} else {
1180+
Call localVarCall = this.deleteNamespacedPodCall(client, name, namespace, pretty, dryRun, gracePeriodSeconds,
1181+
orphanDependents, propagationPolicy, body, callback);
1182+
return localVarCall;
1183+
}
1184+
}
1185+
1186+
private Call deleteNamespacedPodCall(ApiClient client, String name, String namespace, String pretty, String dryRun,
1187+
Integer gracePeriodSeconds, Boolean orphanDependents, String propagationPolicy,
1188+
V1DeleteOptions body, ApiCallback callback) throws ApiException {
1189+
String localVarPath = "/api/v1/namespaces/{namespace}/pods/{name}".replaceAll("\\{name\\}",
1190+
client.escapeString(name.toString())).replaceAll("\\{namespace\\}",
1191+
client.escapeString(namespace.toString()));
1192+
List<Pair> localVarQueryParams = new ArrayList();
1193+
List<Pair> localVarCollectionQueryParams = new ArrayList();
1194+
if (pretty != null) {
1195+
localVarQueryParams.addAll(client.parameterToPair("pretty", pretty));
1196+
}
1197+
1198+
if (dryRun != null) {
1199+
localVarQueryParams.addAll(client.parameterToPair("dryRun", dryRun));
1200+
}
1201+
1202+
if (gracePeriodSeconds != null) {
1203+
localVarQueryParams.addAll(client.parameterToPair("gracePeriodSeconds", gracePeriodSeconds));
1204+
}
1205+
1206+
if (orphanDependents != null) {
1207+
localVarQueryParams.addAll(client.parameterToPair("orphanDependents", orphanDependents));
1208+
}
1209+
1210+
if (propagationPolicy != null) {
1211+
localVarQueryParams.addAll(client.parameterToPair("propagationPolicy", propagationPolicy));
1212+
}
1213+
1214+
Map<String, String> localVarHeaderParams = new HashMap();
1215+
Map<String, String> localVarCookieParams = new HashMap();
1216+
Map<String, Object> localVarFormParams = new HashMap();
1217+
String[] localVarAccepts = new String[]{
1218+
"application/json", "application/yaml", "application/vnd.kubernetes.protobuf"
1219+
};
1220+
String localVarAccept = client.selectHeaderAccept(localVarAccepts);
1221+
if (localVarAccept != null) {
1222+
localVarHeaderParams.put("Accept", localVarAccept);
1223+
}
1224+
1225+
String[] localVarContentTypes = new String[0];
1226+
String localVarContentType = client.selectHeaderContentType(localVarContentTypes);
1227+
localVarHeaderParams.put("Content-Type", localVarContentType);
1228+
String[] localVarAuthNames = new String[]{"BearerToken"};
1229+
return client.buildCall(localVarPath, "DELETE", localVarQueryParams, localVarCollectionQueryParams, body,
1230+
localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, callback);
1231+
}
1232+
11531233
private Call patchPodAsync(
11541234
ApiClient client, String name, String namespace, V1Patch patch, ApiCallback<V1Pod> callback)
11551235
throws ApiException {

operator/src/main/java/oracle/kubernetes/operator/helpers/PodHelper.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -322,11 +322,11 @@ Step createNewPod(Step next) {
322322
}
323323

324324
@Override
325-
Step replaceCurrentPod(Step next) {
325+
Step replaceCurrentPod(V1Pod pod, Step next) {
326326
if (MakeRightDomainOperation.isInspectionRequired(packet)) {
327327
return createProgressingStep(MakeRightDomainOperation.createStepsToRerunWithIntrospection(packet));
328328
} else {
329-
return createProgressingStep(createCyclePodStep(next));
329+
return createProgressingStep(createCyclePodStep(pod, next));
330330
}
331331
}
332332

@@ -454,8 +454,8 @@ String getServerName() {
454454

455455
@Override
456456
// let the pod rolling step update the pod
457-
Step replaceCurrentPod(Step next) {
458-
return deferProcessing(createCyclePodStep(next));
457+
Step replaceCurrentPod(V1Pod pod, Step next) {
458+
return deferProcessing(createCyclePodStep(pod, next));
459459
}
460460

461461
private Step deferProcessing(Step deferredStep) {

operator/src/main/java/oracle/kubernetes/operator/helpers/PodStepContext.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import io.kubernetes.client.openapi.models.V1PodSpec;
3131
import io.kubernetes.client.openapi.models.V1Probe;
3232
import io.kubernetes.client.openapi.models.V1SecretVolumeSource;
33-
import io.kubernetes.client.openapi.models.V1Status;
3433
import io.kubernetes.client.openapi.models.V1Volume;
3534
import io.kubernetes.client.openapi.models.V1VolumeMount;
3635
import oracle.kubernetes.operator.DomainSourceType;
@@ -273,12 +272,13 @@ Step verifyPod(Step next) {
273272
/**
274273
* Deletes the specified pod.
275274
*
275+
* @param pod the existing pod
276276
* @param next the next step to perform after the pod deletion is complete.
277277
* @return a step to be scheduled.
278278
*/
279-
private Step deletePod(Step next) {
279+
private Step deletePod(V1Pod pod, Step next) {
280280
return new CallBuilder()
281-
.deletePodAsync(getPodName(), getNamespace(), new V1DeleteOptions(), deleteResponse(next));
281+
.deletePodAsync(getPodName(), getNamespace(), new V1DeleteOptions(), deleteResponse(pod, next));
282282
}
283283

284284
/**
@@ -307,10 +307,11 @@ private Step createPodAsync(ResponseStep<V1Pod> response) {
307307
/**
308308
* Creates the specified replacement pod and performs any additional needed processing.
309309
*
310+
* @param pod the existing pod
310311
* @param next the next step to perform after the pod creation is complete.
311312
* @return a step to be scheduled.
312313
*/
313-
abstract Step replaceCurrentPod(Step next);
314+
abstract Step replaceCurrentPod(V1Pod pod, Step next);
314315

315316
/**
316317
* Creates the specified replacement pod and records it.
@@ -379,8 +380,8 @@ private void logPodReplaced() {
379380

380381
abstract String getPodReplacedMessageKey();
381382

382-
Step createCyclePodStep(Step next) {
383-
return new CyclePodStep(next);
383+
Step createCyclePodStep(V1Pod pod, Step next) {
384+
return new CyclePodStep(pod, next);
384385
}
385386

386387
private boolean mustPatchPod(V1Pod currentPod) {
@@ -410,8 +411,8 @@ private ResponseStep<V1Pod> createResponse(Step next) {
410411
return new CreateResponseStep(next);
411412
}
412413

413-
private ResponseStep<V1Status> deleteResponse(Step next) {
414-
return new DeleteResponseStep(next);
414+
private ResponseStep<Object> deleteResponse(V1Pod pod, Step next) {
415+
return new DeleteResponseStep(pod, next);
415416
}
416417

417418
private ResponseStep<V1Pod> replaceResponse(Step next) {
@@ -787,15 +788,17 @@ private Step getConflictStep() {
787788
}
788789

789790
private class CyclePodStep extends BaseStep {
791+
private final V1Pod pod;
790792

791-
CyclePodStep(Step next) {
793+
CyclePodStep(V1Pod pod, Step next) {
792794
super(next);
795+
this.pod = pod;
793796
}
794797

795798
@Override
796799
public NextAction apply(Packet packet) {
797800
markBeingDeleted();
798-
return doNext(deletePod(getNext()), packet);
801+
return doNext(deletePod(pod, getNext()), packet);
799802
}
800803
}
801804

@@ -815,7 +818,7 @@ public NextAction apply(Packet packet) {
815818
MessageKeys.CYCLING_POD,
816819
Objects.requireNonNull(currentPod.getMetadata()).getName(),
817820
getReasonToRecycle(currentPod));
818-
return doNext(replaceCurrentPod(getNext()), packet);
821+
return doNext(replaceCurrentPod(currentPod, getNext()), packet);
819822
} else if (mustPatchPod(currentPod)) {
820823
return doNext(patchCurrentPod(currentPod, getNext()), packet);
821824
} else {
@@ -873,25 +876,28 @@ public NextAction onSuccess(Packet packet, CallResponse<V1Pod> callResponse) {
873876
}
874877
}
875878

876-
private class DeleteResponseStep extends ResponseStep<V1Status> {
877-
DeleteResponseStep(Step next) {
879+
private class DeleteResponseStep extends ResponseStep<Object> {
880+
private final V1Pod pod;
881+
882+
DeleteResponseStep(V1Pod pod, Step next) {
878883
super(next);
884+
this.pod = pod;
879885
}
880886

881887
protected String getDetail() {
882888
return getServerName();
883889
}
884890

885891
@Override
886-
public NextAction onFailure(Packet packet, CallResponse<V1Status> callResponses) {
892+
public NextAction onFailure(Packet packet, CallResponse<Object> callResponses) {
887893
if (callResponses.getStatusCode() == CallBuilder.NOT_FOUND) {
888894
return onSuccess(packet, callResponses);
889895
}
890896
return super.onFailure(getConflictStep(), packet, callResponses);
891897
}
892898

893899
@Override
894-
public NextAction onSuccess(Packet packet, CallResponse<V1Status> callResponses) {
900+
public NextAction onSuccess(Packet packet, CallResponse<Object> callResponses) {
895901
return doNext(replacePod(getNext()), packet);
896902
}
897903
}

operator/src/test/java/oracle/kubernetes/operator/helpers/KubernetesTestSupportTest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import io.kubernetes.client.openapi.models.V1SecretList;
2626
import io.kubernetes.client.openapi.models.V1Service;
2727
import io.kubernetes.client.openapi.models.V1ServiceList;
28-
import io.kubernetes.client.openapi.models.V1Status;
2928
import io.kubernetes.client.openapi.models.V1SubjectAccessReview;
3029
import io.kubernetes.client.openapi.models.V1TokenReview;
3130
import oracle.kubernetes.operator.calls.CallResponse;
@@ -286,7 +285,7 @@ public void afterDeletePod_podsInDifferentNamespacesStillExist() {
286285
V1Pod pod3 = createPod("ns3", "another");
287286
testSupport.defineResources(pod1, pod2, pod3);
288287

289-
TestResponseStep<V1Status> responseStep = new TestResponseStep<>();
288+
TestResponseStep<Object> responseStep = new TestResponseStep<>();
290289
testSupport.runSteps(new CallBuilder().deletePodAsync("mycrd", "ns2", null, responseStep));
291290

292291
assertThat(testSupport.getResources(POD), containsInAnyOrder(pod1, pod3));
@@ -296,7 +295,7 @@ public void afterDeletePod_podsInDifferentNamespacesStillExist() {
296295
public void whenHttpErrorAssociatedWithResource_callResponseIsError() {
297296
testSupport.failOnResource(POD, "pod1", "ns2", HTTP_BAD_REQUEST);
298297

299-
TestResponseStep<V1Status> responseStep = new TestResponseStep<>();
298+
TestResponseStep<Object> responseStep = new TestResponseStep<>();
300299
testSupport.runSteps(new CallBuilder().deletePodAsync("pod1", "ns2", null, responseStep));
301300

302301
testSupport.verifyCompletionThrowable(FailureStatusSourceException.class);
@@ -307,7 +306,7 @@ public void whenHttpErrorAssociatedWithResource_callResponseIsError() {
307306
public void whenHttpErrorNotAssociatedWithResource_ignoreIt() {
308307
testSupport.failOnResource(POD, "pod1", "ns2", HTTP_BAD_REQUEST);
309308

310-
TestResponseStep<V1Status> responseStep = new TestResponseStep<>();
309+
TestResponseStep<Object> responseStep = new TestResponseStep<>();
311310
testSupport.runSteps(new CallBuilder().deletePodAsync("pod2", "ns2", null, responseStep));
312311
}
313312

operator/src/test/java/oracle/kubernetes/operator/helpers/RollingHelperTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,10 @@ private Step.StepAndPacket createRollingStepAndPacket(String serverName) {
154154
return new Step.StepAndPacket(DomainStatusUpdater.createProgressingStep(
155155
DomainStatusUpdater.MANAGED_SERVERS_STARTING_PROGRESS_REASON,
156156
false,
157-
new ManagedPodStepContext(terminalStep, packet).createCyclePodStep(null)), packet);
157+
new ManagedPodStepContext(terminalStep, packet).createCyclePodStep(
158+
testSupport.getResourceWithName(
159+
KubernetesTestSupport.POD,
160+
LegalNames.toPodName(UID, serverName)), null)), packet);
158161
}
159162

160163
private void initializeExistingPods() {

0 commit comments

Comments
 (0)