Skip to content

Commit 669a870

Browse files
committed
tests: Fix TestBGPAgentCRUD
Change our deployment so that we use the static scheduler, and rework the test to handle this. Instead of waiting for the speaker to be associated with an agent (which won't happen with the static scheduler) we now jump straight to assigning it. Signed-off-by: Stephen Finucane <stephenfin@redhat.com> Closes: gophercloud#3380
1 parent c295505 commit 669a870

2 files changed

Lines changed: 50 additions & 62 deletions

File tree

.github/workflows/functional-networking.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ jobs:
4646
enable_plugin neutron-vpnaas https://github.com/openstack/neutron-vpnaas ${{ matrix.openstack_version }}
4747
enable_plugin networking-bgpvpn https://github.com/openstack/networking-bgpvpn.git ${{ matrix.openstack_version }}
4848
Q_ML2_PLUGIN_EXT_DRIVERS=qos,port_security,dns_domain_keywords
49+
BGP_SCHEDULER_DRIVER=neutron_dynamic_routing.services.bgp.scheduler.bgp_dragent_scheduler.StaticScheduler
4950
5051
[[post-config|\$NEUTRON_CONF]]
5152
[oslo_policy]

internal/acceptance/openstack/networking/v2/extensions/agents/agents_test.go

Lines changed: 49 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)