@@ -1794,6 +1794,22 @@ def setUp(self):
1794
1794
def _sync_resources (self ):
1795
1795
self .sb_synchronizer .sync_hostname_and_physical_networks (self .ctx )
1796
1796
1797
+ def create_agent (self , host , bridge_mappings = None , agent_type = None ):
1798
+ if agent_type is None :
1799
+ agent_type = ovn_const .OVN_CONTROLLER_AGENT
1800
+ if bridge_mappings is None :
1801
+ bridge_mappings = {}
1802
+ agent = {
1803
+ 'host' : host ,
1804
+ 'agent_type' : agent_type ,
1805
+ 'binary' : '/bin/test' ,
1806
+ 'topic' : 'test_topic' ,
1807
+ 'configurations' : {'bridge_mappings' : bridge_mappings }
1808
+ }
1809
+ _ , status = self .plugin .create_or_update_agent (self .context , agent )
1810
+
1811
+ return status ['id' ]
1812
+
1797
1813
def create_segment (self , network_id , physical_network , segmentation_id ):
1798
1814
segment_data = {'network_id' : network_id ,
1799
1815
'physical_network' : physical_network ,
@@ -1834,6 +1850,7 @@ def test_ovn_sb_sync_delete_stale_host(self):
1834
1850
segment = self .create_segment (network_id , 'physnet1' , 50 )
1835
1851
segments_db .update_segment_host_mapping (
1836
1852
self .ctx , 'host1' , {segment ['id' ]})
1853
+ _ = self .create_agent ('host1' , bridge_mappings = {'physnet1' : 'eth0' })
1837
1854
segment_hosts = segments_db .get_hosts_mapped_with_segments (self .ctx )
1838
1855
self .assertEqual ({'host1' }, segment_hosts )
1839
1856
# Since there is no chassis in the sb DB, host1 is the stale host
@@ -1842,6 +1859,36 @@ def test_ovn_sb_sync_delete_stale_host(self):
1842
1859
segment_hosts = segments_db .get_hosts_mapped_with_segments (self .ctx )
1843
1860
self .assertFalse (segment_hosts )
1844
1861
1862
+ def test_ovn_sb_sync_host_with_no_agent_not_deleted (self ):
1863
+ with self .network () as network :
1864
+ network_id = network ['network' ]['id' ]
1865
+ segment = self .create_segment (network_id , 'physnet1' , 50 )
1866
+ segments_db .update_segment_host_mapping (
1867
+ self .ctx , 'host1' , {segment ['id' ]})
1868
+ _ = self .create_agent ('host1' , bridge_mappings = {'physnet1' : 'eth0' },
1869
+ agent_type = "Not OVN Agent" )
1870
+ segment_hosts = segments_db .get_hosts_mapped_with_segments (self .ctx )
1871
+ self .assertEqual ({'host1' }, segment_hosts )
1872
+ # There is no chassis in the sb DB, host1 does not have an agent
1873
+ # so it is not deleted.
1874
+ self ._sync_resources ()
1875
+ segment_hosts = segments_db .get_hosts_mapped_with_segments (self .ctx )
1876
+ self .assertEqual ({'host1' }, segment_hosts )
1877
+
1878
+ def test_ovn_sb_sync_host_with_other_agent_type_not_deleted (self ):
1879
+ with self .network () as network :
1880
+ network_id = network ['network' ]['id' ]
1881
+ segment = self .create_segment (network_id , 'physnet1' , 50 )
1882
+ segments_db .update_segment_host_mapping (
1883
+ self .ctx , 'host1' , {segment ['id' ]})
1884
+ segment_hosts = segments_db .get_hosts_mapped_with_segments (self .ctx )
1885
+ self .assertEqual ({'host1' }, segment_hosts )
1886
+ # There is no chassis in the sb DB, host1 does not have an agent
1887
+ # so it is not deleted.
1888
+ self ._sync_resources ()
1889
+ segment_hosts = segments_db .get_hosts_mapped_with_segments (self .ctx )
1890
+ self .assertEqual ({'host1' }, segment_hosts )
1891
+
1845
1892
def test_ovn_sb_sync (self ):
1846
1893
with self .network () as network :
1847
1894
network_id = network ['network' ]['id' ]
@@ -1854,6 +1901,9 @@ def test_ovn_sb_sync(self):
1854
1901
segments_db .update_segment_host_mapping (
1855
1902
self .ctx , 'host3' , {seg1 ['id' ]})
1856
1903
segment_hosts = segments_db .get_hosts_mapped_with_segments (self .ctx )
1904
+ _ = self .create_agent ('host1' )
1905
+ _ = self .create_agent ('host2' , bridge_mappings = {'physnet2' : 'eth0' })
1906
+ _ = self .create_agent ('host3' , bridge_mappings = {'physnet3' : 'eth0' })
1857
1907
self .assertEqual ({'host1' , 'host2' , 'host3' }, segment_hosts )
1858
1908
self .add_fake_chassis ('host2' , ['physnet2' ])
1859
1909
self .add_fake_chassis ('host3' , ['physnet3' ])
0 commit comments