@@ -336,15 +336,23 @@ def test__clean_ip_port_mappings_two_hm_pools_not_sharing_members(self):
336336 def test__update_ip_port_mappings_del_backend_member (self ):
337337 src_ip = '10.22.33.4'
338338 self .helper ._update_ip_port_mappings (
339- self .ovn_lb , self .member_address , 'a-logical-port' , src_ip ,
339+ self .ovn_lb ,
340+ self .member_address ,
341+ 'a-logical-port' ,
342+ src_ip ,
343+ 'test_pool_key' ,
340344 delete = True )
341345 self .helper .ovn_nbdb_api .lb_del_ip_port_mapping .\
342346 assert_called_once_with (self .ovn_lb .uuid , self .member_address )
343347
344348 def test__update_ip_port_mappings_add_backend_member (self ):
345349 src_ip = '10.22.33.4'
346350 self .helper ._update_ip_port_mappings (
347- self .ovn_lb , self .member_address , 'a-logical-port' , src_ip )
351+ self .ovn_lb ,
352+ self .member_address ,
353+ 'a-logical-port' ,
354+ src_ip ,
355+ 'test_pool_key' )
348356 self .helper .ovn_nbdb_api .lb_add_ip_port_mapping .\
349357 assert_called_once_with (self .ovn_lb .uuid , self .member_address ,
350358 'a-logical-port' , src_ip )
@@ -353,7 +361,11 @@ def test__update_ip_port_mappings_del_backend_member_ipv6(self):
353361 member_address = 'fda2:918e:5869:0:f816:3eff:feab:cdef'
354362 src_ip = 'fda2:918e:5869:0:f816:3eff:fecd:398a'
355363 self .helper ._update_ip_port_mappings (
356- self .ovn_lb , member_address , 'a-logical-port' , src_ip ,
364+ self .ovn_lb ,
365+ member_address ,
366+ 'a-logical-port' ,
367+ src_ip ,
368+ 'test_pool_key' ,
357369 delete = True )
358370 self .helper .ovn_nbdb_api .lb_del_ip_port_mapping .\
359371 assert_called_once_with (self .ovn_lb .uuid , member_address )
@@ -362,10 +374,17 @@ def test__update_ip_port_mappings_add_backend_member_ipv6(self):
362374 member_address = 'fda2:918e:5869:0:f816:3eff:feab:cdef'
363375 src_ip = 'fda2:918e:5869:0:f816:3eff:fecd:398a'
364376 self .helper ._update_ip_port_mappings (
365- self .ovn_lb , member_address , 'a-logical-port' , src_ip )
377+ self .ovn_lb ,
378+ member_address ,
379+ 'a-logical-port' ,
380+ src_ip ,
381+ 'test_pool_key' )
366382 self .helper .ovn_nbdb_api .lb_add_ip_port_mapping .\
367383 assert_called_once_with (
368- self .ovn_lb .uuid , member_address , 'a-logical-port' , src_ip )
384+ self .ovn_lb .uuid ,
385+ member_address ,
386+ 'a-logical-port' ,
387+ src_ip )
369388
370389 def test__update_external_ids_member_status (self ):
371390 self .helper ._update_external_ids_member_status (
@@ -374,7 +393,10 @@ def test__update_external_ids_member_status(self):
374393 ovn_const .OVN_MEMBER_STATUS_KEY : '{"%s": "%s"}'
375394 % (self .member_id , constants .NO_MONITOR )}
376395 self .helper .ovn_nbdb_api .db_set .assert_called_once_with (
377- 'Load_Balancer' , self .ovn_lb .uuid , ('external_ids' , member_status ))
396+ 'Load_Balancer' ,
397+ self .ovn_lb .uuid ,
398+ ('external_ids' ,
399+ member_status ))
378400
379401 def test__update_external_ids_member_status_delete (self ):
380402 self .helper ._update_external_ids_member_status (
@@ -390,7 +412,10 @@ def test__update_external_ids_member_status_delete_not_found(self):
390412 ovn_const .OVN_MEMBER_STATUS_KEY : '{"%s": "%s"}'
391413 % (self .member_id , constants .NO_MONITOR )}
392414 self .helper .ovn_nbdb_api .db_set .assert_called_once_with (
393- 'Load_Balancer' , self .ovn_lb .uuid , ('external_ids' , member_status ))
415+ 'Load_Balancer' ,
416+ self .ovn_lb .uuid ,
417+ ('external_ids' ,
418+ member_status ))
394419
395420 def test__find_member_status (self ):
396421 status = self .helper ._find_member_status (self .ovn_lb , self .member_id )
@@ -1506,29 +1531,27 @@ def test_lb_update_disabled(self, refresh_vips):
15061531 @mock .patch .object (ovn_helper .OvnProviderHelper , '_refresh_lb_vips' )
15071532 def test_lb_update_enabled (self , refresh_vips ):
15081533 # Change the mock, its enabled by default.
1509- self .ovn_lb .external_ids .update ({'enabled' : False })
1510- self .lb ['admin_state_up' ] = True
1534+ self .lb [constants .ADMIN_STATE_UP ] = False
15111535 status = self .helper .lb_update (self .lb )
15121536 self .assertEqual (status ['loadbalancers' ][0 ]['provisioning_status' ],
15131537 constants .ACTIVE )
15141538 self .assertEqual (status ['loadbalancers' ][0 ]['operating_status' ],
1515- constants .ONLINE )
1539+ constants .OFFLINE )
15161540 refresh_vips .assert_called_once_with (
15171541 self .ovn_lb , self .ovn_lb .external_ids )
15181542 self .helper .ovn_nbdb_api .db_set .assert_called_once_with (
15191543 'Load_Balancer' , self .ovn_lb .uuid ,
1520- ('external_ids' , {'enabled' : 'True ' }))
1544+ ('external_ids' , {'enabled' : 'False ' }))
15211545 # update to re-enable
1522- self .ovn_lb .external_ids .update ({'enabled' : True })
1523- self .lb ['admin_state_up' ] = True
1546+ self .lb [constants .ADMIN_STATE_UP ] = True
15241547 status = self .helper .lb_update (self .lb )
15251548 self .assertEqual (status ['loadbalancers' ][0 ]['provisioning_status' ],
15261549 constants .ACTIVE )
15271550 self .assertEqual (status ['loadbalancers' ][0 ]['operating_status' ],
15281551 constants .ONLINE )
1529- refresh_vips .assert_called_once_with (
1552+ refresh_vips .assert_called_with (
15301553 self .ovn_lb , self .ovn_lb .external_ids )
1531- self .helper .ovn_nbdb_api .db_set .assert_called_once_with (
1554+ self .helper .ovn_nbdb_api .db_set .assert_called_with (
15321555 'Load_Balancer' , self .ovn_lb .uuid ,
15331556 ('external_ids' , {'enabled' : 'True' }))
15341557
@@ -6746,3 +6769,73 @@ def test_refresh_lb_vips_returns_db_operations_when_is_sync_false(
67466769 self .ovn_lb .uuid ,
67476770 ('vips' , {'vip1:port1' : 'ip1:port1,ip2:port1' })
67486771 )
6772+
6773+ def test_update_ip_port_mappings_add (self ):
6774+ # Setup mock OVN load balancer
6775+ ovn_lb = mock .Mock ()
6776+ ovn_lb .uuid = 'test-lb-uuid'
6777+ ovn_lb .external_ids = {}
6778+
6779+ # Call the method with delete=False
6780+ self .helper ._update_ip_port_mappings (
6781+ ovn_lb , '10.0.0.1' , 'port1' , '192.168.0.1' , 'pool1' , delete = False
6782+ )
6783+
6784+ # Assert that lb_add_ip_port_mapping was called
6785+ self .helper .ovn_nbdb_api .lb_add_ip_port_mapping \
6786+ .assert_called_once_with (
6787+ 'test-lb-uuid' ,
6788+ '10.0.0.1' ,
6789+ 'port1' ,
6790+ '192.168.0.1' ,
6791+ )
6792+
6793+ def test_update_ip_port_mappings_delete_minimal (self ):
6794+ ovn_lb = mock .Mock ()
6795+ ovn_lb .uuid = 'test-lb-uuid'
6796+ ovn_lb .external_ids = {}
6797+ # Patch _extract_member_info to return no other members
6798+ self .helper ._extract_member_info = mock .Mock (return_value = [])
6799+ # Also patch ovn_nbdb_api call
6800+ self .helper .ovn_nbdb_api .lb_del_ip_port_mapping = mock .Mock ()
6801+ self .helper .ovn_nbdb_api .lb_add_ip_port_mapping = mock .Mock ()
6802+ self .helper ._update_ip_port_mappings (
6803+ ovn_lb ,
6804+ backend_ip = '10.0.0.1' ,
6805+ port_name = 'dummy-port' ,
6806+ src_ip = '192.168.0.1' ,
6807+ pool_key = 'pool-test' ,
6808+ delete = True
6809+ )
6810+ self .helper .ovn_nbdb_api .\
6811+ lb_del_ip_port_mapping .\
6812+ assert_called_once_with (
6813+ 'test-lb-uuid' ,
6814+ '10.0.0.1'
6815+ )
6816+
6817+ def test_update_ip_port_mappings_delete_with_other_members_present (self ):
6818+ ovn_lb = mock .Mock ()
6819+ ovn_lb .uuid = 'test-lb-uuid'
6820+ ovn_lb .external_ids = {
6821+ "pool_A" : "member_memberA_10.0.0.1:80_subnetA" ,
6822+ "pool_B" : "member_memberB_10.0.0.1:80_subnetA" ,
6823+ "neutron:member_statuses" : '{"memberB": "ONLINE"}'
6824+ }
6825+
6826+ self .helper .ovn_nbdb_api .lb_del_ip_port_mapping = mock .Mock ()
6827+ self .helper .ovn_nbdb_api .lb_add_ip_port_mapping = mock .Mock ()
6828+
6829+ # Call the method under test
6830+ self .helper ._update_ip_port_mappings (
6831+ ovn_lb ,
6832+ backend_ip = '10.0.0.1' ,
6833+ port_name = 'dummy-port' ,
6834+ src_ip = '192.168.0.1' ,
6835+ pool_key = 'pool_A' ,
6836+ delete = True
6837+ )
6838+
6839+ # Should not call delete because memberB is ONLINE and shares the IP
6840+ self .helper .ovn_nbdb_api .lb_del_ip_port_mapping .assert_not_called ()
6841+ self .helper .ovn_nbdb_api .lb_add_ip_port_mapping .assert_not_called ()
0 commit comments