4141import com .cloud .network .dao .NetworkDao ;
4242import com .cloud .network .dao .NetworkVO ;
4343import com .cloud .network .ovs .dao .VpcDistributedRouterSeqNoDao ;
44+ import com .cloud .network .ovs .dao .VpcDistributedRouterSeqNoVO ;
4445import com .cloud .network .vpc .VpcManager ;
4546import com .cloud .network .vpc .VpcVO ;
4647import com .cloud .network .vpc .dao .VpcDao ;
@@ -61,6 +62,7 @@ public class OvsTunnelManagerImplTest {
6162 private VpcManager vpcManager ;
6263 private OvsNetworkTopologyGuru topologyGuru ;
6364 private NicDao nicDao ;
65+ private VpcDistributedRouterSeqNoVO sequenceNumber ;
6466
6567 @ Before
6668 public void setUp () {
@@ -167,6 +169,68 @@ public void testPostStateTransitionEventContinuesAfterNonOvsVpc() {
167169 verify (vpcDao ).findById (SECOND_VPC_ID );
168170 }
169171
172+ @ Test
173+ public void testPostStateTransitionEventContainsMalformedOvsTopologyAndContinues () {
174+ VpcVO firstVpc = mock (VpcVO .class );
175+ VpcVO secondVpc = mock (VpcVO .class );
176+ VMInstanceVO vm = mock (VMInstanceVO .class );
177+ @ SuppressWarnings ("unchecked" )
178+ StateMachine2 .Transition <VirtualMachine .State , VirtualMachine .Event > transition = mock (StateMachine2 .Transition .class );
179+ when (vm .getId ()).thenReturn (11L );
180+ when (topologyGuru .getVpcIdsVmIsPartOf (11L )).thenReturn (List .of (VPC_ID , SECOND_VPC_ID ));
181+ when (vpcDao .findById (VPC_ID )).thenReturn (firstVpc );
182+ when (vpcDao .findById (SECOND_VPC_ID )).thenReturn (secondVpc );
183+ when (firstVpc .usesDistributedRouter ()).thenReturn (true );
184+ when (secondVpc .usesDistributedRouter ()).thenReturn (true );
185+ when (vpcManager .isProviderSupportServiceInVpc (VPC_ID , Network .Service .Connectivity , Network .Provider .Ovs ))
186+ .thenReturn (true );
187+ when (vpcManager .isProviderSupportServiceInVpc (SECOND_VPC_ID , Network .Service .Connectivity , Network .Provider .Ovs ))
188+ .thenReturn (false );
189+ when (transition .getCurrentState ()).thenReturn (VirtualMachine .State .Starting );
190+ when (transition .getEvent ()).thenReturn (VirtualMachine .Event .OperationSucceeded );
191+ when (transition .getToState ()).thenReturn (VirtualMachine .State .Running );
192+ Network malformedNetwork = mock (Network .class );
193+ when (topologyGuru .getVpcSpannedHosts (VPC_ID )).thenReturn (Collections .emptyList ());
194+ when (topologyGuru .getAllActiveVmsInVpc (VPC_ID )).thenReturn (Collections .emptyList ());
195+ doReturn (List .of (malformedNetwork )).when (vpcManager ).getVpcNetworks (VPC_ID );
196+ when (firstVpc .getUuid ()).thenReturn ("vpc-uuid" );
197+ when (firstVpc .getCidr ()).thenReturn ("10.0.0.0/16" );
198+ when (malformedNetwork .getUuid ()).thenReturn ("network-uuid" );
199+ when (malformedNetwork .getBroadcastDomainType ()).thenReturn (BroadcastDomainType .NSX );
200+
201+ assertTrue (manager .postStateTransitionEvent (transition , vm , true , null ));
202+
203+ verify (vpcDao ).findById (SECOND_VPC_ID );
204+ }
205+
206+ @ Test
207+ public void testPostStateTransitionEventBuildsTopologyForOvsVpc () {
208+ VpcVO vpc = mock (VpcVO .class );
209+ VMInstanceVO vm = mock (VMInstanceVO .class );
210+ @ SuppressWarnings ("unchecked" )
211+ StateMachine2 .Transition <VirtualMachine .State , VirtualMachine .Event > transition = mock (StateMachine2 .Transition .class );
212+ when (vm .getId ()).thenReturn (11L );
213+ when (topologyGuru .getVpcIdsVmIsPartOf (11L )).thenReturn (List .of (VPC_ID ));
214+ when (vpcDao .findById (VPC_ID )).thenReturn (vpc );
215+ when (vpc .usesDistributedRouter ()).thenReturn (true );
216+ when (vpc .getUuid ()).thenReturn ("vpc-uuid" );
217+ when (vpc .getCidr ()).thenReturn ("10.0.0.0/16" );
218+ when (vpcManager .isProviderSupportServiceInVpc (VPC_ID , Network .Service .Connectivity , Network .Provider .Ovs ))
219+ .thenReturn (true );
220+ when (transition .getCurrentState ()).thenReturn (VirtualMachine .State .Starting );
221+ when (transition .getEvent ()).thenReturn (VirtualMachine .Event .OperationSucceeded );
222+ when (transition .getToState ()).thenReturn (VirtualMachine .State .Running );
223+ when (topologyGuru .getVpcSpannedHosts (VPC_ID )).thenReturn (Collections .emptyList ());
224+ when (topologyGuru .getAllActiveVmsInVpc (VPC_ID )).thenReturn (Collections .emptyList ());
225+ doReturn (Collections .emptyList ()).when (vpcManager ).getVpcNetworks (VPC_ID );
226+ prepareSequenceNumber (VPC_ID );
227+
228+ assertTrue (manager .postStateTransitionEvent (transition , vm , true , null ));
229+
230+ verify (vpcManager ).getVpcNetworks (VPC_ID );
231+ verify (manager ._vpcDrSeqNoDao ).update (1L , sequenceNumber );
232+ }
233+
170234 @ Test
171235 public void testNetworkAclSubscriberIgnoresNsxDistributedVpc () {
172236 VpcVO vpc = mock (VpcVO .class );
@@ -183,6 +247,28 @@ public void testNetworkAclSubscriberIgnoresNsxDistributedVpc() {
183247 verify (vpcManager , never ()).getVpcNetworks (anyLong ());
184248 }
185249
250+ @ Test
251+ public void testNetworkAclSubscriberBuildsPolicyForOvsVpc () {
252+ VpcVO vpc = mock (VpcVO .class );
253+ NetworkVO network = mock (NetworkVO .class );
254+ when (network .getVpcId ()).thenReturn (VPC_ID );
255+ when (vpcDao .findById (VPC_ID )).thenReturn (vpc );
256+ when (vpc .usesDistributedRouter ()).thenReturn (true );
257+ when (vpc .getUuid ()).thenReturn ("vpc-uuid" );
258+ when (vpc .getCidr ()).thenReturn ("10.0.0.0/16" );
259+ when (vpcManager .isProviderSupportServiceInVpc (VPC_ID , Network .Service .Connectivity , Network .Provider .Ovs ))
260+ .thenReturn (true );
261+ doReturn (List .of (network )).when (vpcManager ).getVpcNetworks (VPC_ID );
262+ when (network .getNetworkACLId ()).thenReturn (null );
263+ when (topologyGuru .getVpcSpannedHosts (VPC_ID )).thenReturn (Collections .emptyList ());
264+ prepareSequenceNumber (VPC_ID );
265+
266+ manager .new NetworkAclEventsSubscriber ().onPublishMessage ("sender" , "Network_ACL_Replaced" , network );
267+
268+ verify (vpcManager ).getVpcNetworks (VPC_ID );
269+ verify (manager ._vpcDrSeqNoDao ).update (1L , sequenceNumber );
270+ }
271+
186272 @ Test
187273 public void testPrepareVpcTopologyUpdateRejectsNonVswitchTier () {
188274 VpcVO vpc = mock (VpcVO .class );
@@ -214,6 +300,34 @@ public void testPrepareVpcTopologyUpdateRejectsNonNumericGreKey() {
214300 assertThrows (CloudRuntimeException .class , () -> manager .prepareVpcTopologyUpdate (VPC_ID ));
215301 }
216302
303+ @ Test
304+ public void testPrepareVpcTopologyUpdateRejectsRepeatedDelimiterInBroadcastKey () {
305+ prepareVswitchNetwork ("7..123" );
306+
307+ assertThrows (CloudRuntimeException .class , () -> manager .prepareVpcTopologyUpdate (VPC_ID ));
308+ }
309+
310+ @ Test
311+ public void testPrepareVpcTopologyUpdateRejectsLeadingDelimiterInBroadcastKey () {
312+ prepareVswitchNetwork (".7.123" );
313+
314+ assertThrows (CloudRuntimeException .class , () -> manager .prepareVpcTopologyUpdate (VPC_ID ));
315+ }
316+
317+ @ Test
318+ public void testPrepareVpcTopologyUpdateRejectsTrailingDelimiterInBroadcastKey () {
319+ prepareVswitchNetwork ("7.123." );
320+
321+ assertThrows (CloudRuntimeException .class , () -> manager .prepareVpcTopologyUpdate (VPC_ID ));
322+ }
323+
324+ @ Test
325+ public void testPrepareVpcTopologyUpdateRejectsGreKeyOutsideIntegerRange () {
326+ prepareVswitchNetwork ("7.2147483648" );
327+
328+ assertThrows (CloudRuntimeException .class , () -> manager .prepareVpcTopologyUpdate (VPC_ID ));
329+ }
330+
217331 @ Test
218332 public void testPrepareVpcTopologyUpdateRejectsMissingGatewayNic () {
219333 prepareVswitchNetwork ("7.123" );
@@ -253,4 +367,13 @@ private Network prepareVswitchNetwork(String broadcastKey) {
253367 when (network .getBroadcastUri ()).thenReturn (BroadcastDomainType .Vswitch .toUri (broadcastKey ));
254368 return network ;
255369 }
370+
371+ private void prepareSequenceNumber (long vpcId ) {
372+ sequenceNumber = mock (VpcDistributedRouterSeqNoVO .class );
373+ when (sequenceNumber .getId ()).thenReturn (1L );
374+ when (sequenceNumber .getTopologyUpdateSequenceNo ()).thenReturn (1L );
375+ when (sequenceNumber .getPolicyUpdateSequenceNo ()).thenReturn (1L );
376+ when (manager ._vpcDrSeqNoDao .findByVpcId (vpcId )).thenReturn (sequenceNumber );
377+ when (manager ._vpcDrSeqNoDao .lockRow (1L , true )).thenReturn (sequenceNumber );
378+ }
256379}
0 commit comments