@@ -997,9 +997,9 @@ class AgentWaitEvent(event.WaitEvent):
997
997
998
998
ONETIME = False
999
999
1000
- def __init__ (self , driver , chassis_names ):
1000
+ def __init__ (self , driver , chassis_names , events = None ):
1001
1001
table = driver .agent_chassis_table
1002
- events = (self .ROW_CREATE ,)
1002
+ events = events or (self .ROW_CREATE ,)
1003
1003
self .chassis_names = chassis_names
1004
1004
super ().__init__ (events , table , None )
1005
1005
self .event_name = "AgentWaitEvent"
@@ -1059,11 +1059,41 @@ def test_agent_list(self):
1059
1059
self .context , filters = {'host' : self .host })]
1060
1060
self .assertCountEqual (list (self .agent_types .values ()), agent_ids )
1061
1061
1062
+ # "ovn-controller" ends without deleting "Chassis" and
1063
+ # "Chassis_Private" registers. If "Chassis" register is deleted,
1064
+ # then Chassis_Private.chassis = []; both metadata and controller
1065
+ # agents will still be present in the agent list.
1066
+ agent_event = AgentWaitEvent (self .mech_driver , [self .chassis ],
1067
+ events = (event .RowEvent .ROW_UPDATE ,))
1068
+ self .sb_api .idl .notify_handler .watch_event (agent_event )
1069
+ self .sb_api .chassis_del (self .chassis ).execute (check_error = True )
1070
+ self .assertTrue (agent_event .wait ())
1071
+ agent_ids = [a ['id' ] for a in self .plugin .get_agents (
1072
+ self .context , filters = {'host' : self .host })]
1073
+ self .assertCountEqual (list (self .agent_types .values ()), agent_ids )
1074
+
1062
1075
def test_agent_delete (self ):
1063
- for agent_id in self .agent_types .values ():
1064
- self .plugin .delete_agent (self .context , agent_id )
1065
- self .assertRaises (agent_exc .AgentNotFound , self .plugin .get_agent ,
1066
- self .context , agent_id )
1076
+ # Non OVN agent deletion.
1077
+ agent_id = self .agent_types [self .TEST_AGENT ]
1078
+ self .plugin .delete_agent (self .context , agent_id )
1079
+ self .assertRaises (agent_exc .AgentNotFound , self .plugin .get_agent ,
1080
+ self .context , agent_id )
1081
+
1082
+ # OVN controller agent deletion, that triggers the "Chassis" register
1083
+ # deletion. The "Chassis" register deletion triggers the host OVN
1084
+ # agents deletion, both controller and metadata if present.
1085
+ controller_id = self .agent_types [ovn_const .OVN_CONTROLLER_AGENT ]
1086
+ metadata_id = self .agent_types [ovn_const .OVN_METADATA_AGENT ]
1087
+ self .plugin .delete_agent (self .context , controller_id )
1088
+ self .assertRaises (agent_exc .AgentNotFound , self .plugin .get_agent ,
1089
+ self .context , controller_id )
1090
+ self .assertEqual (
1091
+ metadata_id ,
1092
+ self .plugin .get_agent (self .context , metadata_id )['id' ])
1093
+
1094
+ self .plugin .delete_agent (self .context , metadata_id )
1095
+ self .assertRaises (agent_exc .AgentNotFound , self .plugin .get_agent ,
1096
+ self .context , metadata_id )
1067
1097
1068
1098
1069
1099
class ConnectionInactivityProbeSetEvent (event .WaitEvent ):
0 commit comments