|
25 | 25 | import io.strimzi.api.kafka.model.mirrormaker2.KafkaMirrorMaker2Resources;
|
26 | 26 | import io.strimzi.api.kafka.model.mirrormaker2.KafkaMirrorMaker2Status;
|
27 | 27 | import io.strimzi.api.kafka.model.podset.StrimziPodSet;
|
28 |
| -import io.strimzi.operator.cluster.ClusterOperatorConfig; |
29 | 28 | import io.strimzi.operator.cluster.KafkaVersionTestUtils;
|
30 | 29 | import io.strimzi.operator.cluster.PlatformFeaturesAvailability;
|
31 | 30 | import io.strimzi.operator.cluster.ResourceUtils;
|
|
83 | 82 | import static org.mockito.ArgumentMatchers.isNull;
|
84 | 83 | import static org.mockito.ArgumentMatchers.startsWith;
|
85 | 84 | import static org.mockito.Mockito.mock;
|
86 |
| -import static org.mockito.Mockito.never; |
87 | 85 | import static org.mockito.Mockito.times;
|
88 | 86 | import static org.mockito.Mockito.verify;
|
89 | 87 | import static org.mockito.Mockito.when;
|
@@ -1287,92 +1285,6 @@ public void testManualRollingUpdatePerPod(VertxTestContext context) {
|
1287 | 1285 | })));
|
1288 | 1286 | }
|
1289 | 1287 |
|
1290 |
| - @Test |
1291 |
| - public void testFailingManualRollingUpdate(VertxTestContext context) { |
1292 |
| - StrimziPodSet oldPodSet = CLUSTER.generatePodSet(3, null, null, false, null, null, null); |
1293 |
| - List<Pod> oldPods = PodSetUtils.podSetToPods(oldPodSet); |
1294 |
| - oldPods.get(1).getMetadata().getAnnotations().put(Annotations.ANNO_STRIMZI_IO_MANUAL_ROLLING_UPDATE, "true"); // We want the pod to roll manually |
1295 |
| - |
1296 |
| - ResourceOperatorSupplier supplier = ResourceUtils.supplierWithMocks(false); |
1297 |
| - |
1298 |
| - // Mock PodSets |
1299 |
| - StrimziPodSetOperator mockPodSetOps = supplier.strimziPodSetOperator; |
1300 |
| - when(mockPodSetOps.getAsync(eq(NAMESPACE), eq(COMPONENT_NAME))).thenReturn(Future.succeededFuture(oldPodSet)); |
1301 |
| - when(mockPodSetOps.readiness(any(), eq(NAMESPACE), eq(COMPONENT_NAME), anyLong(), anyLong())).thenReturn(Future.succeededFuture()); |
1302 |
| - ArgumentCaptor<StrimziPodSet> podSetCaptor = ArgumentCaptor.forClass(StrimziPodSet.class); |
1303 |
| - when(mockPodSetOps.reconcile(any(), eq(NAMESPACE), eq(COMPONENT_NAME), podSetCaptor.capture())).thenAnswer(i -> Future.succeededFuture(ReconcileResult.created(i.getArgument(3)))); |
1304 |
| - |
1305 |
| - // Mock PDBs |
1306 |
| - PodDisruptionBudgetOperator mockPdbOps = supplier.podDisruptionBudgetOperator; |
1307 |
| - ArgumentCaptor<PodDisruptionBudget> pdbCaptor = ArgumentCaptor.forClass(PodDisruptionBudget.class); |
1308 |
| - when(mockPdbOps.reconcile(any(), eq(NAMESPACE), eq(COMPONENT_NAME), pdbCaptor.capture())).thenReturn(Future.succeededFuture()); |
1309 |
| - |
1310 |
| - // Mock Config Maps |
1311 |
| - ConfigMapOperator mockCmOps = supplier.configMapOperations; |
1312 |
| - when(mockCmOps.reconcile(any(), eq(NAMESPACE), startsWith(COMPONENT_NAME), any())).thenReturn(Future.succeededFuture()); |
1313 |
| - |
1314 |
| - // Mock Services |
1315 |
| - ServiceOperator mockServiceOps = supplier.serviceOperations; |
1316 |
| - ArgumentCaptor<Service> serviceCaptor = ArgumentCaptor.forClass(Service.class); |
1317 |
| - when(mockServiceOps.reconcile(any(), eq(NAMESPACE), startsWith(COMPONENT_NAME), serviceCaptor.capture())).thenReturn(Future.succeededFuture()); |
1318 |
| - |
1319 |
| - // Mock Network Policies |
1320 |
| - NetworkPolicyOperator mockNetPolOps = supplier.networkPolicyOperator; |
1321 |
| - when(mockNetPolOps.reconcile(any(), eq(NAMESPACE), eq(COMPONENT_NAME), any())).thenReturn(Future.succeededFuture()); |
1322 |
| - |
1323 |
| - // Mock Pods |
1324 |
| - PodOperator mockPodOps = supplier.podOperations; |
1325 |
| - when(mockPodOps.listAsync(eq(NAMESPACE), any(Labels.class))).thenReturn(Future.succeededFuture(oldPods)); |
1326 |
| - when(mockPodOps.getAsync(eq(NAMESPACE), startsWith(COMPONENT_NAME))).thenAnswer(i -> { |
1327 |
| - Pod pod = oldPods.stream().filter(p -> i.getArgument(1).equals(p.getMetadata().getName())).findFirst().orElse(null); |
1328 |
| - return Future.succeededFuture(pod); |
1329 |
| - }); |
1330 |
| - when(mockPodOps.deleteAsync(any(), eq(NAMESPACE), startsWith(COMPONENT_NAME), eq(false))).thenReturn(Future.succeededFuture()); |
1331 |
| - when(mockPodOps.deleteAsync(any(), eq(NAMESPACE), eq(COMPONENT_NAME + "-1"), eq(false))).thenReturn(Future.failedFuture("Failed to delete pod")); |
1332 |
| - when(mockPodOps.reconcile(any(), eq(NAMESPACE), startsWith(COMPONENT_NAME), any())).thenReturn(Future.succeededFuture()); |
1333 |
| - when(mockPodOps.readiness(any(), eq(NAMESPACE), startsWith(COMPONENT_NAME), anyLong(), anyLong())).thenReturn(Future.succeededFuture()); |
1334 |
| - |
1335 |
| - // Mock Secrets |
1336 |
| - SecretOperator mockSecretOps = supplier.secretOperations; |
1337 |
| - when(mockSecretOps.getAsync(eq(NAMESPACE), eq(KafkaConnectResources.jmxSecretName(NAME)))).thenReturn(Future.succeededFuture()); |
1338 |
| - |
1339 |
| - // Mock KafkaMirrorMaker2 CRs |
1340 |
| - CrdOperator<KubernetesClient, KafkaMirrorMaker2, KafkaMirrorMaker2List> mockConnectOps = supplier.mirrorMaker2Operator; |
1341 |
| - when(mockConnectOps.get(eq(NAMESPACE), eq(NAME))).thenReturn(new KafkaMirrorMaker2Builder(MM2).build()); |
1342 |
| - when(mockConnectOps.getAsync(eq(NAMESPACE), eq(NAME))).thenReturn(Future.succeededFuture(new KafkaMirrorMaker2Builder(MM2).build())); |
1343 |
| - ArgumentCaptor<KafkaMirrorMaker2> mm2StatusCaptor = ArgumentCaptor.forClass(KafkaMirrorMaker2.class); |
1344 |
| - when(mockConnectOps.updateStatusAsync(any(), mm2StatusCaptor.capture())).thenReturn(Future.succeededFuture()); |
1345 |
| - |
1346 |
| - // Mock Connect API |
1347 |
| - KafkaConnectApi mockConnectClient = mock(KafkaConnectApi.class); |
1348 |
| - when(mockConnectClient.list(any(), anyString(), anyInt())).thenReturn(CompletableFuture.completedFuture(emptyList())); |
1349 |
| - when(mockConnectClient.updateConnectLoggers(any(), anyString(), anyInt(), anyString(), any(OrderedProperties.class))).thenReturn(CompletableFuture.completedFuture(null)); |
1350 |
| - |
1351 |
| - ClusterOperatorConfig coConfig = new ClusterOperatorConfig.ClusterOperatorConfigBuilder(ResourceUtils.dummyClusterOperatorConfig(), VERSIONS).with(ClusterOperatorConfig.FEATURE_GATES.key(), "").build(); |
1352 |
| - KafkaMirrorMaker2AssemblyOperator ops = new KafkaMirrorMaker2AssemblyOperator( |
1353 |
| - vertx, |
1354 |
| - new PlatformFeaturesAvailability(false, KUBERNETES_VERSION), |
1355 |
| - supplier, |
1356 |
| - coConfig, |
1357 |
| - x -> mockConnectClient |
1358 |
| - ); |
1359 |
| - |
1360 |
| - Checkpoint async = context.checkpoint(); |
1361 |
| - ops.reconcile(new Reconciliation("test-trigger", KafkaMirrorMaker2.RESOURCE_KIND, NAMESPACE, NAME)) |
1362 |
| - .onComplete(context.failing(v -> context.verify(() -> { |
1363 |
| - // Check rolling happened => Should happen once as a regular rolling update to all pods and once more for the annotated pod |
1364 |
| - verify(mockPodOps, never()).deleteAsync(any(), eq(NAMESPACE), eq(COMPONENT_NAME + "-0"), eq(false)); |
1365 |
| - verify(mockPodOps, times(1)).deleteAsync(any(), eq(NAMESPACE), eq(COMPONENT_NAME + "-1"), eq(false)); |
1366 |
| - verify(mockPodOps, never()).deleteAsync(any(), eq(NAMESPACE), eq(COMPONENT_NAME + "-2"), eq(false)); |
1367 |
| - |
1368 |
| - // Verify CR status |
1369 |
| - List<KafkaMirrorMaker2> capturedMm2Statuses = mm2StatusCaptor.getAllValues(); |
1370 |
| - assertThat(capturedMm2Statuses, hasSize(1)); |
1371 |
| - |
1372 |
| - async.flag(); |
1373 |
| - }))); |
1374 |
| - } |
1375 |
| - |
1376 | 1288 | @Test
|
1377 | 1289 | public void testManualRollingUpdateWithSuppressedFailure(VertxTestContext context) {
|
1378 | 1290 | StrimziPodSet oldPodSet = CLUSTER.generatePodSet(3, null, null, false, null, null, null);
|
|
0 commit comments