1919
2020package com .cloud .kubernetes .cluster ;
2121
22+ import static org .mockito .Mockito .doNothing ;
23+ import static org .mockito .Mockito .doReturn ;
24+ import static org .mockito .Mockito .doThrow ;
25+ import static org .mockito .Mockito .verify ;
26+ import static org .mockito .Mockito .verifyNoMoreInteractions ;
27+ import static org .mockito .Mockito .when ;
28+
29+ import java .lang .reflect .Field ;
30+ import java .util .ArrayList ;
31+ import java .util .Arrays ;
32+ import java .util .Collections ;
33+ import java .util .List ;
34+
35+ import org .apache .cloudstack .api .BaseCmd ;
36+ import org .apache .cloudstack .api .command .user .kubernetes .cluster .AddVirtualMachinesToKubernetesClusterCmd ;
37+ import org .apache .cloudstack .api .command .user .kubernetes .cluster .RemoveVirtualMachinesFromKubernetesClusterCmd ;
38+ import org .apache .cloudstack .context .CallContext ;
39+ import org .apache .cloudstack .framework .config .ConfigKey ;
40+ import org .junit .After ;
41+ import org .junit .Assert ;
42+ import org .junit .Before ;
43+ import org .junit .Test ;
44+ import org .junit .runner .RunWith ;
45+ import org .mockito .InjectMocks ;
46+ import org .mockito .Mock ;
47+ import org .mockito .Mockito ;
48+ import org .mockito .Spy ;
49+ import org .mockito .junit .MockitoJUnitRunner ;
50+
2251import com .cloud .api .query .dao .TemplateJoinDao ;
2352import com .cloud .api .query .vo .TemplateJoinVO ;
2453import com .cloud .dc .DataCenter ;
3766import com .cloud .user .Account ;
3867import com .cloud .user .AccountManager ;
3968import com .cloud .user .User ;
69+ import com .cloud .utils .exception .CloudRuntimeException ;
4070import com .cloud .vm .VMInstanceVO ;
4171import com .cloud .vm .dao .VMInstanceDao ;
42- import org .apache .cloudstack .api .BaseCmd ;
43- import org .apache .cloudstack .api .command .user .kubernetes .cluster .AddVirtualMachinesToKubernetesClusterCmd ;
44- import org .apache .cloudstack .api .command .user .kubernetes .cluster .RemoveVirtualMachinesFromKubernetesClusterCmd ;
45- import org .apache .cloudstack .context .CallContext ;
46- import org .apache .cloudstack .framework .config .ConfigKey ;
47- import org .junit .After ;
48- import org .junit .Assert ;
49- import org .junit .Before ;
50- import org .junit .Test ;
51- import org .junit .runner .RunWith ;
52- import org .mockito .InjectMocks ;
53- import org .mockito .Mock ;
54- import org .mockito .Mockito ;
55- import org .mockito .Spy ;
56- import org .mockito .junit .MockitoJUnitRunner ;
57-
58- import java .lang .reflect .Field ;
59- import java .util .ArrayList ;
60- import java .util .Arrays ;
61- import java .util .Collections ;
62- import java .util .List ;
6372
6473@ RunWith (MockitoJUnitRunner .class )
6574public class KubernetesClusterManagerImplTest {
@@ -89,26 +98,30 @@ public class KubernetesClusterManagerImplTest {
8998 @ InjectMocks
9099 KubernetesClusterManagerImpl kubernetesClusterManager ;
91100
101+
102+ @ Mock
103+ private Account account ;
104+
92105 @ Test
93106 public void testValidateVpcTierAllocated () {
94107 Network network = Mockito .mock (Network .class );
95- Mockito . when (network .getState ()).thenReturn (Network .State .Allocated );
108+ when (network .getState ()).thenReturn (Network .State .Allocated );
96109 kubernetesClusterManager .validateVpcTier (network );
97110 }
98111
99112 @ Test (expected = InvalidParameterValueException .class )
100113 public void testValidateVpcTierDefaultDenyRule () {
101114 Network network = Mockito .mock (Network .class );
102- Mockito . when (network .getState ()).thenReturn (Network .State .Implemented );
103- Mockito . when (network .getNetworkACLId ()).thenReturn (NetworkACL .DEFAULT_DENY );
115+ when (network .getState ()).thenReturn (Network .State .Implemented );
116+ when (network .getNetworkACLId ()).thenReturn (NetworkACL .DEFAULT_DENY );
104117 kubernetesClusterManager .validateVpcTier (network );
105118 }
106119
107120 @ Test
108121 public void testValidateVpcTierValid () {
109122 Network network = Mockito .mock (Network .class );
110- Mockito . when (network .getState ()).thenReturn (Network .State .Implemented );
111- Mockito . when (network .getNetworkACLId ()).thenReturn (NetworkACL .DEFAULT_ALLOW );
123+ when (network .getState ()).thenReturn (Network .State .Implemented );
124+ when (network .getNetworkACLId ()).thenReturn (NetworkACL .DEFAULT_ALLOW );
112125 kubernetesClusterManager .validateVpcTier (network );
113126 }
114127
@@ -117,7 +130,7 @@ public void validateIsolatedNetworkIpRulesNoRules() {
117130 long ipId = 1L ;
118131 FirewallRule .Purpose purpose = FirewallRule .Purpose .Firewall ;
119132 Network network = Mockito .mock (Network .class );
120- Mockito . when (firewallRulesDao .listByIpAndPurposeAndNotRevoked (ipId , purpose )).thenReturn (new ArrayList <>());
133+ when (firewallRulesDao .listByIpAndPurposeAndNotRevoked (ipId , purpose )).thenReturn (new ArrayList <>());
121134 kubernetesClusterManager .validateIsolatedNetworkIpRules (ipId , FirewallRule .Purpose .Firewall , network , 3 );
122135 }
123136
@@ -131,7 +144,7 @@ public void validateIsolatedNetworkIpRulesNoConflictingRules() {
131144 long ipId = 1L ;
132145 FirewallRule .Purpose purpose = FirewallRule .Purpose .Firewall ;
133146 Network network = Mockito .mock (Network .class );
134- Mockito . when (firewallRulesDao .listByIpAndPurposeAndNotRevoked (ipId , purpose )).thenReturn (List .of (createRule (80 , 80 ), createRule (443 , 443 )));
147+ when (firewallRulesDao .listByIpAndPurposeAndNotRevoked (ipId , purpose )).thenReturn (List .of (createRule (80 , 80 ), createRule (443 , 443 )));
135148 kubernetesClusterManager .validateIsolatedNetworkIpRules (ipId , FirewallRule .Purpose .Firewall , network , 3 );
136149 }
137150
@@ -140,7 +153,7 @@ public void validateIsolatedNetworkIpRulesApiConflictingRules() {
140153 long ipId = 1L ;
141154 FirewallRule .Purpose purpose = FirewallRule .Purpose .Firewall ;
142155 Network network = Mockito .mock (Network .class );
143- Mockito . when (firewallRulesDao .listByIpAndPurposeAndNotRevoked (ipId , purpose )).thenReturn (List .of (createRule (6440 , 6445 ), createRule (443 , 443 )));
156+ when (firewallRulesDao .listByIpAndPurposeAndNotRevoked (ipId , purpose )).thenReturn (List .of (createRule (6440 , 6445 ), createRule (443 , 443 )));
144157 kubernetesClusterManager .validateIsolatedNetworkIpRules (ipId , FirewallRule .Purpose .Firewall , network , 3 );
145158 }
146159
@@ -149,7 +162,7 @@ public void validateIsolatedNetworkIpRulesSshConflictingRules() {
149162 long ipId = 1L ;
150163 FirewallRule .Purpose purpose = FirewallRule .Purpose .Firewall ;
151164 Network network = Mockito .mock (Network .class );
152- Mockito . when (firewallRulesDao .listByIpAndPurposeAndNotRevoked (ipId , purpose )).thenReturn (List .of (createRule (2200 , KubernetesClusterActionWorker .CLUSTER_NODES_DEFAULT_START_SSH_PORT ), createRule (443 , 443 )));
165+ when (firewallRulesDao .listByIpAndPurposeAndNotRevoked (ipId , purpose )).thenReturn (List .of (createRule (2200 , KubernetesClusterActionWorker .CLUSTER_NODES_DEFAULT_START_SSH_PORT ), createRule (443 , 443 )));
153166 kubernetesClusterManager .validateIsolatedNetworkIpRules (ipId , FirewallRule .Purpose .Firewall , network , 3 );
154167 }
155168
@@ -158,7 +171,7 @@ public void validateIsolatedNetworkIpRulesNearConflictingRules() {
158171 long ipId = 1L ;
159172 FirewallRule .Purpose purpose = FirewallRule .Purpose .Firewall ;
160173 Network network = Mockito .mock (Network .class );
161- Mockito . when (firewallRulesDao .listByIpAndPurposeAndNotRevoked (ipId , purpose )).thenReturn (List .of (createRule (2220 , 2221 ), createRule (2225 , 2227 ), createRule (6440 , 6442 ), createRule (6444 , 6446 )));
174+ when (firewallRulesDao .listByIpAndPurposeAndNotRevoked (ipId , purpose )).thenReturn (List .of (createRule (2220 , 2221 ), createRule (2225 , 2227 ), createRule (6440 , 6442 ), createRule (6444 , 6446 )));
162175 kubernetesClusterManager .validateIsolatedNetworkIpRules (ipId , FirewallRule .Purpose .Firewall , network , 3 );
163176 }
164177
@@ -171,74 +184,74 @@ public void testValidateKubernetesClusterScaleSizeNullNewSizeNoError() {
171184 public void testValidateKubernetesClusterScaleSizeSameNewSizeNoError () {
172185 Long size = 2L ;
173186 KubernetesClusterVO clusterVO = Mockito .mock (KubernetesClusterVO .class );
174- Mockito . when (clusterVO .getNodeCount ()).thenReturn (size );
187+ when (clusterVO .getNodeCount ()).thenReturn (size );
175188 kubernetesClusterManager .validateKubernetesClusterScaleSize (clusterVO , size , 100 , Mockito .mock (DataCenter .class ));
176189 }
177190
178191 @ Test (expected = PermissionDeniedException .class )
179192 public void testValidateKubernetesClusterScaleSizeStoppedCluster () {
180193 Long size = 2L ;
181194 KubernetesClusterVO clusterVO = Mockito .mock (KubernetesClusterVO .class );
182- Mockito . when (clusterVO .getNodeCount ()).thenReturn (size );
183- Mockito . when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Stopped );
195+ when (clusterVO .getNodeCount ()).thenReturn (size );
196+ when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Stopped );
184197 kubernetesClusterManager .validateKubernetesClusterScaleSize (clusterVO , 3L , 100 , Mockito .mock (DataCenter .class ));
185198 }
186199
187200 @ Test (expected = InvalidParameterValueException .class )
188201 public void testValidateKubernetesClusterScaleSizeZeroNewSize () {
189202 Long size = 2L ;
190203 KubernetesClusterVO clusterVO = Mockito .mock (KubernetesClusterVO .class );
191- Mockito . when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Running );
192- Mockito . when (clusterVO .getNodeCount ()).thenReturn (size );
204+ when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Running );
205+ when (clusterVO .getNodeCount ()).thenReturn (size );
193206 kubernetesClusterManager .validateKubernetesClusterScaleSize (clusterVO , 0L , 100 , Mockito .mock (DataCenter .class ));
194207 }
195208
196209 @ Test (expected = InvalidParameterValueException .class )
197210 public void testValidateKubernetesClusterScaleSizeOverMaxSize () {
198211 KubernetesClusterVO clusterVO = Mockito .mock (KubernetesClusterVO .class );
199- Mockito . when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Running );
200- Mockito . when (clusterVO .getControlNodeCount ()).thenReturn (1L );
212+ when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Running );
213+ when (clusterVO .getControlNodeCount ()).thenReturn (1L );
201214 kubernetesClusterManager .validateKubernetesClusterScaleSize (clusterVO , 4L , 4 , Mockito .mock (DataCenter .class ));
202215 }
203216
204217 @ Test
205218 public void testValidateKubernetesClusterScaleSizeDownscaleNoError () {
206219 KubernetesClusterVO clusterVO = Mockito .mock (KubernetesClusterVO .class );
207- Mockito . when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Running );
208- Mockito . when (clusterVO .getControlNodeCount ()).thenReturn (1L );
209- Mockito . when (clusterVO .getNodeCount ()).thenReturn (4L );
220+ when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Running );
221+ when (clusterVO .getControlNodeCount ()).thenReturn (1L );
222+ when (clusterVO .getNodeCount ()).thenReturn (4L );
210223 kubernetesClusterManager .validateKubernetesClusterScaleSize (clusterVO , 2L , 10 , Mockito .mock (DataCenter .class ));
211224 }
212225
213226 @ Test (expected = InvalidParameterValueException .class )
214227 public void testValidateKubernetesClusterScaleSizeUpscaleDeletedTemplate () {
215228 KubernetesClusterVO clusterVO = Mockito .mock (KubernetesClusterVO .class );
216- Mockito . when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Running );
217- Mockito . when (clusterVO .getControlNodeCount ()).thenReturn (1L );
218- Mockito . when (clusterVO .getNodeCount ()).thenReturn (2L );
219- Mockito . when (templateDao .findById (Mockito .anyLong ())).thenReturn (null );
229+ when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Running );
230+ when (clusterVO .getControlNodeCount ()).thenReturn (1L );
231+ when (clusterVO .getNodeCount ()).thenReturn (2L );
232+ when (templateDao .findById (Mockito .anyLong ())).thenReturn (null );
220233 kubernetesClusterManager .validateKubernetesClusterScaleSize (clusterVO , 4L , 10 , Mockito .mock (DataCenter .class ));
221234 }
222235
223236 @ Test (expected = InvalidParameterValueException .class )
224237 public void testValidateKubernetesClusterScaleSizeUpscaleNotInZoneTemplate () {
225238 KubernetesClusterVO clusterVO = Mockito .mock (KubernetesClusterVO .class );
226- Mockito . when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Running );
227- Mockito . when (clusterVO .getControlNodeCount ()).thenReturn (1L );
228- Mockito . when (clusterVO .getNodeCount ()).thenReturn (2L );
229- Mockito . when (templateDao .findById (Mockito .anyLong ())).thenReturn (Mockito .mock (VMTemplateVO .class ));
230- Mockito . when (templateJoinDao .newTemplateView (Mockito .any (VMTemplateVO .class ), Mockito .anyLong (), Mockito .anyBoolean ())).thenReturn (null );
239+ when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Running );
240+ when (clusterVO .getControlNodeCount ()).thenReturn (1L );
241+ when (clusterVO .getNodeCount ()).thenReturn (2L );
242+ when (templateDao .findById (Mockito .anyLong ())).thenReturn (Mockito .mock (VMTemplateVO .class ));
243+ when (templateJoinDao .newTemplateView (Mockito .any (VMTemplateVO .class ), Mockito .anyLong (), Mockito .anyBoolean ())).thenReturn (null );
231244 kubernetesClusterManager .validateKubernetesClusterScaleSize (clusterVO , 4L , 10 , Mockito .mock (DataCenter .class ));
232245 }
233246
234247 @ Test
235248 public void testValidateKubernetesClusterScaleSizeUpscaleNoError () {
236249 KubernetesClusterVO clusterVO = Mockito .mock (KubernetesClusterVO .class );
237- Mockito . when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Running );
238- Mockito . when (clusterVO .getControlNodeCount ()).thenReturn (1L );
239- Mockito . when (clusterVO .getNodeCount ()).thenReturn (2L );
240- Mockito . when (templateDao .findById (Mockito .anyLong ())).thenReturn (Mockito .mock (VMTemplateVO .class ));
241- Mockito . when (templateJoinDao .newTemplateView (Mockito .any (VMTemplateVO .class ), Mockito .anyLong (), Mockito .anyBoolean ())).thenReturn (List .of (Mockito .mock (TemplateJoinVO .class )));
250+ when (clusterVO .getState ()).thenReturn (KubernetesCluster .State .Running );
251+ when (clusterVO .getControlNodeCount ()).thenReturn (1L );
252+ when (clusterVO .getNodeCount ()).thenReturn (2L );
253+ when (templateDao .findById (Mockito .anyLong ())).thenReturn (Mockito .mock (VMTemplateVO .class ));
254+ when (templateJoinDao .newTemplateView (Mockito .any (VMTemplateVO .class ), Mockito .anyLong (), Mockito .anyBoolean ())).thenReturn (List .of (Mockito .mock (TemplateJoinVO .class )));
242255 kubernetesClusterManager .validateKubernetesClusterScaleSize (clusterVO , 4L , 10 , Mockito .mock (DataCenter .class ));
243256
244257 }
@@ -247,7 +260,7 @@ public void testValidateKubernetesClusterScaleSizeUpscaleNoError() {
247260 public void setUp () throws Exception {
248261 CallContext .register (Mockito .mock (User .class ), Mockito .mock (Account .class ));
249262 overrideDefaultConfigValue (KubernetesClusterService .KubernetesServiceEnabled , "_defaultValue" , "true" );
250- Mockito . doNothing ().when (accountManager ).checkAccess (
263+ doNothing ().when (accountManager ).checkAccess (
251264 Mockito .any (Account .class ), Mockito .any (), Mockito .anyBoolean (), Mockito .any ());
252265 }
253266
@@ -269,13 +282,13 @@ public void addVmsToCluster() {
269282 AddVirtualMachinesToKubernetesClusterCmd cmd = Mockito .mock (AddVirtualMachinesToKubernetesClusterCmd .class );
270283 List <Long > vmIds = Arrays .asList (1L , 2L , 3L );
271284
272- Mockito . when (cmd .getId ()).thenReturn (1L );
273- Mockito . when (cmd .getVmIds ()).thenReturn (vmIds );
274- Mockito . when (cmd .getActualCommandName ()).thenReturn (BaseCmd .getCommandNameByClass (RemoveVirtualMachinesFromKubernetesClusterCmd .class ));
275- Mockito . when (cluster .getClusterType ()).thenReturn (KubernetesCluster .ClusterType .ExternalManaged );
276- Mockito . when (vmInstanceDao .findById (Mockito .anyLong ())).thenReturn (vm );
277- Mockito . when (kubernetesClusterDao .findById (Mockito .anyLong ())).thenReturn (cluster );
278- Mockito . when (kubernetesClusterVmMapDao .listByClusterIdAndVmIdsIn (1L , vmIds )).thenReturn (Collections .emptyList ());
285+ when (cmd .getId ()).thenReturn (1L );
286+ when (cmd .getVmIds ()).thenReturn (vmIds );
287+ when (cmd .getActualCommandName ()).thenReturn (BaseCmd .getCommandNameByClass (RemoveVirtualMachinesFromKubernetesClusterCmd .class ));
288+ when (cluster .getClusterType ()).thenReturn (KubernetesCluster .ClusterType .ExternalManaged );
289+ when (vmInstanceDao .findById (Mockito .anyLong ())).thenReturn (vm );
290+ when (kubernetesClusterDao .findById (Mockito .anyLong ())).thenReturn (cluster );
291+ when (kubernetesClusterVmMapDao .listByClusterIdAndVmIdsIn (1L , vmIds )).thenReturn (Collections .emptyList ());
279292 Assert .assertTrue (kubernetesClusterManager .addVmsToCluster (cmd ));
280293 }
281294
@@ -285,11 +298,53 @@ public void removeVmsFromCluster() {
285298 RemoveVirtualMachinesFromKubernetesClusterCmd cmd = Mockito .mock (RemoveVirtualMachinesFromKubernetesClusterCmd .class );
286299 List <Long > vmIds = Arrays .asList (1L , 2L , 3L );
287300
288- Mockito . when (cmd .getId ()).thenReturn (1L );
289- Mockito . when (cmd .getVmIds ()).thenReturn (vmIds );
290- Mockito . when (cmd .getActualCommandName ()).thenReturn (BaseCmd .getCommandNameByClass (RemoveVirtualMachinesFromKubernetesClusterCmd .class ));
291- Mockito . when (cluster .getClusterType ()).thenReturn (KubernetesCluster .ClusterType .ExternalManaged );
292- Mockito . when (kubernetesClusterDao .findById (Mockito .anyLong ())).thenReturn (cluster );
301+ when (cmd .getId ()).thenReturn (1L );
302+ when (cmd .getVmIds ()).thenReturn (vmIds );
303+ when (cmd .getActualCommandName ()).thenReturn (BaseCmd .getCommandNameByClass (RemoveVirtualMachinesFromKubernetesClusterCmd .class ));
304+ when (cluster .getClusterType ()).thenReturn (KubernetesCluster .ClusterType .ExternalManaged );
305+ when (kubernetesClusterDao .findById (Mockito .anyLong ())).thenReturn (cluster );
293306 Assert .assertTrue (kubernetesClusterManager .removeVmsFromCluster (cmd ).size () > 0 );
294307 }
308+
309+ @ Test
310+ public void testCleanupForAccount_NoClusters () {
311+ when (account .getId ()).thenReturn (123L );
312+ when (kubernetesClusterDao .listForCleanupByAccount (123L )).thenReturn (Collections .emptyList ());
313+
314+ kubernetesClusterManager .cleanupForAccount (account );
315+
316+ verify (kubernetesClusterDao ).listForCleanupByAccount (123L );
317+ verifyNoMoreInteractions (kubernetesClusterDao );
318+ }
319+
320+ @ Test
321+ public void testCleanupForAccount_SuccessfulCleanup () {
322+ KubernetesClusterVO cluster = Mockito .mock (KubernetesClusterVO .class );
323+ when (account .getId ()).thenReturn (123L );
324+ when (kubernetesClusterDao .listForCleanupByAccount (123L )).thenReturn (List .of (cluster ));
325+
326+ doReturn (true ).when (kubernetesClusterManager ).destroyKubernetesCluster (cluster );
327+
328+ kubernetesClusterManager .cleanupForAccount (account );
329+
330+ verify (kubernetesClusterDao ).listForCleanupByAccount (123L );
331+ verify (kubernetesClusterManager ).destroyKubernetesCluster (cluster );
332+ }
333+
334+ @ Test
335+ public void testCleanupForAccount_ClusterCleanupFails () {
336+ KubernetesClusterVO cluster = Mockito .mock (KubernetesClusterVO .class );
337+ when (account .getId ()).thenReturn (123L );
338+ when (cluster .getName ()).thenReturn ("failed-cluster" );
339+ when (kubernetesClusterDao .listForCleanupByAccount (123L )).thenReturn (List .of (cluster ));
340+
341+ doThrow (new CloudRuntimeException ("Error destroying cluster" ))
342+ .when (kubernetesClusterManager )
343+ .destroyKubernetesCluster (cluster );
344+
345+ kubernetesClusterManager .cleanupForAccount (account );
346+
347+ verify (kubernetesClusterDao ).listForCleanupByAccount (123L );
348+ verify (kubernetesClusterManager ).destroyKubernetesCluster (cluster );
349+ }
295350}
0 commit comments