@@ -122,94 +122,81 @@ func TestBGPAgentCRUD(t *testing.T) {
122122 // Create a BGP Speaker
123123 bgpSpeaker , err := spk .CreateBGPSpeaker (t , client )
124124 th .AssertNoErr (t , err )
125+
126+ // List BGP Speaker-Agent associations
125127 pages , err := agents .ListDRAgentHostingBGPSpeakers (client , bgpSpeaker .ID ).AllPages (context .TODO ())
126128 th .AssertNoErr (t , err )
127- bgpAgents , err := agents .ExtractAgents (pages )
128- th .AssertNoErr (t , err )
129- th .AssertIntGreaterOrEqual (t , len (bgpAgents ), 1 )
130-
131- // List the BGP Agents that accommodate the BGP Speaker
132- err = tools .WaitForTimeout (
133- func (ctx context.Context ) (bool , error ) {
134- flag := true
135- for _ , agt := range bgpAgents {
136- t .Logf ("BGP Speaker %s has been scheduled to agent %s" , bgpSpeaker .ID , agt .ID )
137- bgpAgent , err := agents .Get (ctx , client , agt .ID ).Extract ()
138- th .AssertNoErr (t , err )
139- numOfSpeakers := int (bgpAgent .Configurations ["bgp_speakers" ].(float64 ))
140- flag = flag && (numOfSpeakers == 1 )
141- }
142- return flag , nil
143- }, timeout )
129+ bgpAgentsForSpeaker , err := agents .ExtractAgents (pages )
144130 th .AssertNoErr (t , err )
145131
146- // List the BGP speakers on the first agent
147- bgpAgent , err := agents .Get (context .TODO (), client , bgpAgents [0 ].ID ).Extract ()
148- th .AssertNoErr (t , err )
149- agentConf := bgpAgent .Configurations
150- numOfSpeakers := int (agentConf ["bgp_speakers" ].(float64 ))
151- t .Logf ("Agent %s has %d speaker(s)" , bgpAgents [0 ].ID , numOfSpeakers )
132+ // If there are no associations, we can assume the static scheduler is in
133+ // effect and we must manually associate/disassociate the speaker from the
134+ // agent.
135+ //
136+ // https://docs.openstack.org/neutron-dynamic-routing/latest/admin/agent-scheduler.html
137+ doManualAssignment := len (bgpAgentsForSpeaker ) == 0
138+ var agentID string
152139
153- pages , err = agents .ListBGPSpeakers (client , bgpAgents [0 ].ID ).AllPages (context .TODO ())
154- th .AssertNoErr (t , err )
155- allSpeakers , err := agents .ExtractBGPSpeakers (pages )
156- th .AssertNoErr (t , err )
157- out := "Speakers:"
158- for _ , speaker := range allSpeakers {
159- out += " " + speaker .ID
140+ if doManualAssignment {
141+ // If using manual assignment, schedule a BGP Speaker to an agent
142+ agentID = allAgents [0 ].ID
143+ opts := agents.ScheduleBGPSpeakerOpts {
144+ SpeakerID : bgpSpeaker .ID ,
145+ }
146+ err = agents .ScheduleBGPSpeaker (context .TODO (), client , agentID , opts ).ExtractErr ()
147+ th .AssertNoErr (t , err )
148+ t .Logf ("Successfully scheduled speaker %s to agent %s" , bgpSpeaker .ID , agentID )
149+ } else {
150+ // If using automatic assignment, pick the first agent that the speaker
151+ // was assigned to (it may be assigned to many, depending on how many
152+ // nodes there are)
153+ agentID = bgpAgentsForSpeaker [0 ].ID
160154 }
161- t .Log (out )
162155
163- // Remove the BGP Speaker from the first agent
164- err = agents .RemoveBGPSpeaker (context .TODO (), client , bgpAgents [0 ].ID , bgpSpeaker .ID ).ExtractErr ()
156+ // Wait for the association to complete.
157+ pages , err = agents .ListDRAgentHostingBGPSpeakers (client , bgpSpeaker .ID ).AllPages (context .TODO ())
158+ th .AssertNoErr (t , err )
159+ bgpAgentsForSpeaker , err = agents .ExtractAgents (pages )
165160 th .AssertNoErr (t , err )
166- t .Logf ("BGP Speaker %s has been removed from agent %s" , bgpSpeaker .ID , bgpAgents [0 ].ID )
167161 err = tools .WaitForTimeout (
168162 func (ctx context.Context ) (bool , error ) {
169- bgpAgent , err := agents .Get (ctx , client , bgpAgents [ 0 ]. ID ).Extract ()
163+ bgpAgent , err := agents .Get (ctx , client , agentID ).Extract ()
170164 th .AssertNoErr (t , err )
171165 agentConf := bgpAgent .Configurations
172166 numOfSpeakers := int (agentConf ["bgp_speakers" ].(float64 ))
173- t .Logf ("Agent %s has %d speaker(s)" , bgpAgent . ID , numOfSpeakers )
174- return numOfSpeakers == 0 , nil
167+ t .Logf ("Agent %s has %d speaker(s)" , agentID , numOfSpeakers )
168+ return 1 == numOfSpeakers , nil
175169 }, timeout )
176170 th .AssertNoErr (t , err )
177171
178- // Remove all BGP Speakers from the agent
179- pages , err = agents .ListBGPSpeakers ( client , bgpAgents [0 ].ID ). AllPages ( context . TODO () )
172+ // Disassociate the BGP Speaker from the agent.
173+ err = agents .RemoveBGPSpeaker ( context . TODO (), client , bgpAgentsForSpeaker [0 ].ID , bgpSpeaker . ID ). ExtractErr ( )
180174 th .AssertNoErr (t , err )
181- allSpeakers , err = agents .ExtractBGPSpeakers (pages )
182- th .AssertNoErr (t , err )
183- for _ , speaker := range allSpeakers {
184- th .AssertNoErr (t , agents .RemoveBGPSpeaker (context .TODO (), client , bgpAgents [0 ].ID , speaker .ID ).ExtractErr ())
185- }
175+ t .Logf ("BGP Speaker %s has been removed from agent %s" , bgpSpeaker .ID , bgpAgentsForSpeaker [0 ].ID )
186176
187- // Schedule a BGP Speaker to an agent
188- opts := agents.ScheduleBGPSpeakerOpts {
189- SpeakerID : bgpSpeaker .ID ,
177+ // Only validate the disassociation if we know the static scheduler is in
178+ // effect as it'll simply be recreated if we're using the chance scheduler
179+ // and running in a single node deployment.
180+ if doManualAssignment {
181+ err = tools .WaitForTimeout (
182+ func (ctx context.Context ) (bool , error ) {
183+ bgpAgent , err := agents .Get (ctx , client , bgpAgentsForSpeaker [0 ].ID ).Extract ()
184+ th .AssertNoErr (t , err )
185+ agentConf := bgpAgent .Configurations
186+ numOfSpeakers := int (agentConf ["bgp_speakers" ].(float64 ))
187+ t .Logf ("Agent %s has %d speaker(s)" , bgpAgent .ID , numOfSpeakers )
188+ return numOfSpeakers == 0 , nil
189+ }, timeout )
190+ th .AssertNoErr (t , err )
190191 }
191- err = agents .ScheduleBGPSpeaker (context .TODO (), client , bgpAgents [0 ].ID , opts ).ExtractErr ()
192- th .AssertNoErr (t , err )
193- t .Logf ("Successfully scheduled speaker %s to agent %s" , bgpSpeaker .ID , bgpAgents [0 ].ID )
194-
195- err = tools .WaitForTimeout (
196- func (ctx context.Context ) (bool , error ) {
197- bgpAgent , err := agents .Get (ctx , client , bgpAgents [0 ].ID ).Extract ()
198- th .AssertNoErr (t , err )
199- agentConf := bgpAgent .Configurations
200- numOfSpeakers := int (agentConf ["bgp_speakers" ].(float64 ))
201- t .Logf ("Agent %s has %d speaker(s)" , bgpAgent .ID , numOfSpeakers )
202- return 1 == numOfSpeakers , nil
203- }, timeout )
204- th .AssertNoErr (t , err )
205192
206193 // Delete the BGP Speaker
207194 err = speakers .Delete (context .TODO (), client , bgpSpeaker .ID ).ExtractErr ()
208195 th .AssertNoErr (t , err )
209196 t .Logf ("Successfully deleted the BGP Speaker, %s" , bgpSpeaker .ID )
210197 err = tools .WaitForTimeout (
211198 func (ctx context.Context ) (bool , error ) {
212- bgpAgent , err := agents .Get (ctx , client , bgpAgents [ 0 ]. ID ).Extract ()
199+ bgpAgent , err := agents .Get (ctx , client , agentID ).Extract ()
213200 th .AssertNoErr (t , err )
214201 agentConf := bgpAgent .Configurations
215202 numOfSpeakers := int (agentConf ["bgp_speakers" ].(float64 ))
0 commit comments