Skip to content

Commit 08df402

Browse files
committed
keep another cluster's old acl rule when a cks delete is retried
1 parent f38b135 commit 08df402

2 files changed

Lines changed: 65 additions & 5 deletions

File tree

‎plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java‎

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -681,13 +681,23 @@ protected void removeVpcTierAllowPortACLRule(final Network network, int startPor
681681
List<NetworkACLItemVO> clusterAclItems = aclItems.stream()
682682
.filter(networkACLItem -> getVpcTierAclRuleReason().equals(networkACLItem.getReason()))
683683
.collect(Collectors.toList());
684-
if (clusterAclItems.isEmpty()) {
685-
// Rules created before they were marked with the cluster, remove only one of them
686-
clusterAclItems = aclItems.stream()
684+
// Record the cleanup before revoking, so a retried deletion knows this cluster's rule is already gone
685+
String cleanupDetail = getVpcTierAclRuleCleanupDetail(startPort, endPort);
686+
if (clusterAclItems.isEmpty() && kubernetesClusterDetailsDao.findDetail(kubernetesCluster.getId(), cleanupDetail) == null) {
687+
// Rule created before rules were marked with the cluster, claim only one of them
688+
NetworkACLItemVO legacyAclItem = aclItems.stream()
687689
.filter(networkACLItem -> StringUtils.isEmpty(networkACLItem.getReason()))
688-
.limit(1)
689-
.collect(Collectors.toList());
690+
.findFirst().orElse(null);
691+
if (legacyAclItem != null) {
692+
legacyAclItem.setReason(getVpcTierAclRuleReason());
693+
networkACLItemDao.update(legacyAclItem.getId(), legacyAclItem);
694+
clusterAclItems = List.of(legacyAclItem);
695+
}
690696
}
697+
if (clusterAclItems.isEmpty()) {
698+
return;
699+
}
700+
kubernetesClusterDetailsDao.addDetail(kubernetesCluster.getId(), cleanupDetail, String.valueOf(true), false);
691701

692702
for (NetworkACLItemVO aclItem : clusterAclItems) {
693703
networkACLService.revokeNetworkACLItem(aclItem.getId());
@@ -698,6 +708,10 @@ protected String getVpcTierAclRuleReason() {
698708
return String.format("Kubernetes cluster %s", kubernetesCluster.getUuid());
699709
}
700710

711+
protected String getVpcTierAclRuleCleanupDetail(int startPort, int endPort) {
712+
return String.format("vpcTierAclRuleRemoved-%d-%d", startPort, endPort);
713+
}
714+
701715
protected void provisionLoadBalancerRule(final IpAddress publicIp, final Network network,
702716
final Account account, final List<Long> clusterVMIds, final int port) throws NetworkRuleConflictException,
703717
InsufficientAddressCapacityException {

‎plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorkerTest.java‎

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package com.cloud.kubernetes.cluster.actionworkers;
1919

2020
import com.cloud.kubernetes.cluster.KubernetesCluster;
21+
import com.cloud.kubernetes.cluster.KubernetesClusterDetailsVO;
2122
import com.cloud.kubernetes.cluster.KubernetesClusterManagerImpl;
2223
import com.cloud.kubernetes.cluster.dao.KubernetesClusterDao;
2324
import com.cloud.kubernetes.cluster.dao.KubernetesClusterDetailsDao;
@@ -118,10 +119,55 @@ public void removeVpcTierAllowPortACLRuleTestRemovesOneUnmarkedRuleForOlderClust
118119

119120
kubernetesClusterResourceModifierActionWorker.removeVpcTierAllowPortACLRule(networkMock, 22, 22);
120121

122+
Mockito.verify(oldRule1).setReason("Kubernetes cluster cluster-a");
123+
Mockito.verify(networkACLItemDaoMock).update(3L, oldRule1);
121124
Mockito.verify(networkACLServiceMock).revokeNetworkACLItem(3L);
122125
Mockito.verifyNoMoreInteractions(networkACLServiceMock);
123126
}
124127

128+
private void rememberCleanupDetails() {
129+
Mockito.doAnswer(invocation -> {
130+
Mockito.when(kubernetesClusterDetailsDaoMock.findDetail(1L, invocation.getArgument(1)))
131+
.thenReturn(Mockito.mock(KubernetesClusterDetailsVO.class));
132+
return null;
133+
}).when(kubernetesClusterDetailsDaoMock).addDetail(Mockito.eq(1L), Mockito.anyString(), Mockito.anyString(), Mockito.anyBoolean());
134+
}
135+
136+
@Test
137+
public void removeVpcTierAllowPortACLRuleTestRetryKeepsOtherClusterUnmarkedRule() throws Exception {
138+
Mockito.when(kubernetesClusterMock.getId()).thenReturn(1L);
139+
Mockito.when(kubernetesClusterMock.getUuid()).thenReturn("cluster-a");
140+
Mockito.when(networkMock.getNetworkACLId()).thenReturn(10L);
141+
rememberCleanupDetails();
142+
NetworkACLItemVO clusterARule = mockAclItem(1L, 6443, "Kubernetes cluster cluster-a");
143+
NetworkACLItemVO clusterBOldRule = mockAclItem(2L, 6443, null);
144+
Mockito.when(networkACLItemDaoMock.listByACL(10L)).thenReturn(List.of(clusterARule, clusterBOldRule), List.of(clusterBOldRule));
145+
146+
kubernetesClusterResourceModifierActionWorker.removeVpcTierAllowPortACLRule(networkMock, 6443, 6443);
147+
kubernetesClusterResourceModifierActionWorker.removeVpcTierAllowPortACLRule(networkMock, 6443, 6443);
148+
149+
Mockito.verify(networkACLServiceMock).revokeNetworkACLItem(1L);
150+
Mockito.verify(networkACLServiceMock, Mockito.never()).revokeNetworkACLItem(2L);
151+
Mockito.verify(networkACLItemDaoMock, Mockito.never()).update(Mockito.anyLong(), Mockito.any());
152+
}
153+
154+
@Test
155+
public void removeVpcTierAllowPortACLRuleTestRetryOfOlderClusterRemovesOnlyOneUnmarkedRule() throws Exception {
156+
Mockito.when(kubernetesClusterMock.getId()).thenReturn(1L);
157+
Mockito.when(kubernetesClusterMock.getUuid()).thenReturn("cluster-a");
158+
Mockito.when(networkMock.getNetworkACLId()).thenReturn(10L);
159+
rememberCleanupDetails();
160+
NetworkACLItemVO oldRule1 = mockAclItem(3L, 22, null);
161+
NetworkACLItemVO oldRule2 = mockAclItem(4L, 22, null);
162+
Mockito.when(networkACLItemDaoMock.listByACL(10L)).thenReturn(List.of(oldRule1, oldRule2), List.of(oldRule2));
163+
164+
kubernetesClusterResourceModifierActionWorker.removeVpcTierAllowPortACLRule(networkMock, 22, 22);
165+
kubernetesClusterResourceModifierActionWorker.removeVpcTierAllowPortACLRule(networkMock, 22, 22);
166+
167+
Mockito.verify(networkACLServiceMock).revokeNetworkACLItem(3L);
168+
Mockito.verify(networkACLServiceMock, Mockito.never()).revokeNetworkACLItem(4L);
169+
}
170+
125171
@Test
126172
public void getKubernetesClusterNodeNamePrefixTestReturnOriginalPrefixWhenNamingAllRequirementsAreMet() {
127173
String originalPrefix = "k8s-cluster-01";

0 commit comments

Comments
 (0)