@@ -5,11 +5,14 @@ package agents
55
66import (
77 "testing"
8+ "time"
89
910 "github.com/gophercloud/gophercloud/acceptance/clients"
1011 networking "github.com/gophercloud/gophercloud/acceptance/openstack/networking/v2"
12+ spk "github.com/gophercloud/gophercloud/acceptance/openstack/networking/v2/extensions/bgp/speakers"
1113 "github.com/gophercloud/gophercloud/acceptance/tools"
1214 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/agents"
15+ "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/bgp/speakers"
1316 th "github.com/gophercloud/gophercloud/testhelper"
1417)
1518
@@ -92,3 +95,106 @@ func TestAgentsRUD(t *testing.T) {
9295 err = agents .Delete (client , allAgents [0 ].ID ).ExtractErr ()
9396 th .AssertNoErr (t , err )
9497}
98+
99+ func TestBGPAgentRUD (t * testing.T ) {
100+ timeout := 120 * time .Second
101+ clients .RequireAdmin (t )
102+
103+ client , err := clients .NewNetworkV2Client ()
104+ th .AssertNoErr (t , err )
105+
106+ // List BGP Agents
107+ listOpts := & agents.ListOpts {
108+ AgentType : "BGP Dynamic Routing Agent" ,
109+ }
110+ allPages , err := agents .List (client , listOpts ).AllPages ()
111+ th .AssertNoErr (t , err )
112+
113+ allAgents , err := agents .ExtractAgents (allPages )
114+ th .AssertNoErr (t , err )
115+
116+ t .Logf ("Retrieved BGP agents" )
117+ tools .PrintResource (t , allAgents )
118+
119+ // Create a BGP Speaker
120+ bgpSpeaker , err := spk .CreateBGPSpeaker (t , client )
121+ th .AssertNoErr (t , err )
122+ pages , err := agents .ListDRAgentHostingBGPSpeakers (client , bgpSpeaker .ID ).AllPages ()
123+ th .AssertNoErr (t , err )
124+ bgpAgents , err := agents .ExtractAgents (pages )
125+ th .AssertNoErr (t , err )
126+ th .AssertIntGreaterOrEqual (t , len (bgpAgents ), 1 )
127+
128+ // List the BGP Agents that accommodate the BGP Speaker
129+ err = tools .WaitForTimeout (
130+ func () (bool , error ) {
131+ flag := true
132+ for _ , agt := range bgpAgents {
133+ t .Logf ("BGP Speaker %s has been scheduled to agent %s" , bgpSpeaker .ID , agt .ID )
134+ bgpAgent , err := agents .Get (client , agt .ID ).Extract ()
135+ th .AssertNoErr (t , err )
136+ numOfSpeakers := int (bgpAgent .Configurations ["bgp_speakers" ].(float64 ))
137+ flag = flag && (numOfSpeakers == 1 )
138+ }
139+ return flag , nil
140+ }, timeout )
141+ th .AssertNoErr (t , err )
142+
143+ // Remove the BGP Speaker from the first agent
144+ err = agents .RemoveBGPSpeaker (client , bgpAgents [0 ].ID , bgpSpeaker .ID ).ExtractErr ()
145+ th .AssertNoErr (t , err )
146+ t .Logf ("BGP Speaker %s has been removed from agent %s" , bgpSpeaker .ID , bgpAgents [0 ].ID )
147+ err = tools .WaitForTimeout (
148+ func () (bool , error ) {
149+ bgpAgent , err := agents .Get (client , bgpAgents [0 ].ID ).Extract ()
150+ th .AssertNoErr (t , err )
151+ agentConf := bgpAgent .Configurations
152+ numOfSpeakers := int (agentConf ["bgp_speakers" ].(float64 ))
153+ t .Logf ("Agent %s has %d speakers" , bgpAgent .ID , numOfSpeakers )
154+ return numOfSpeakers == 0 , nil
155+ }, timeout )
156+ th .AssertNoErr (t , err )
157+
158+ // Remove all BGP Speakers from the agent
159+ pages , err = agents .ListBGPSpeakers (client , bgpAgents [0 ].ID ).AllPages ()
160+ th .AssertNoErr (t , err )
161+ allSpeakers , err := agents .ExtractBGPSpeakers (pages )
162+ th .AssertNoErr (t , err )
163+ for _ , speaker := range allSpeakers {
164+ th .AssertNoErr (t , agents .RemoveBGPSpeaker (client , bgpAgents [0 ].ID , speaker .ID ).ExtractErr ())
165+ }
166+
167+ // Schedule a BGP Speaker to an agent
168+ opts := agents.ScheduleBGPSpeakerOpts {
169+ SpeakerID : bgpSpeaker .ID ,
170+ }
171+ err = agents .ScheduleBGPSpeaker (client , bgpAgents [0 ].ID , opts ).ExtractErr ()
172+ th .AssertNoErr (t , err )
173+ t .Logf ("Successfully scheduled speaker %s to agent %s" , bgpSpeaker .ID , bgpAgents [0 ].ID )
174+
175+ err = tools .WaitForTimeout (
176+ func () (bool , error ) {
177+ bgpAgent , err := agents .Get (client , bgpAgents [0 ].ID ).Extract ()
178+ th .AssertNoErr (t , err )
179+ agentConf := bgpAgent .Configurations
180+ numOfSpeakers := int (agentConf ["bgp_speakers" ].(float64 ))
181+ t .Logf ("Agent %s has %d speakers" , bgpAgent .ID , numOfSpeakers )
182+ return 1 == numOfSpeakers , nil
183+ }, timeout )
184+ th .AssertNoErr (t , err )
185+
186+ // Delete the BGP Speaker
187+ speakers .Delete (client , bgpSpeaker .ID ).ExtractErr ()
188+ th .AssertNoErr (t , err )
189+ t .Logf ("Successfully deleted the BGP Speaker, %s" , bgpSpeaker .ID )
190+ err = tools .WaitForTimeout (
191+ func () (bool , error ) {
192+ bgpAgent , err := agents .Get (client , bgpAgents [0 ].ID ).Extract ()
193+ th .AssertNoErr (t , err )
194+ agentConf := bgpAgent .Configurations
195+ numOfSpeakers := int (agentConf ["bgp_speakers" ].(float64 ))
196+ t .Logf ("Agent %s has %d speakers" , bgpAgent .ID , numOfSpeakers )
197+ return 0 == numOfSpeakers , nil
198+ }, timeout )
199+ th .AssertNoErr (t , err )
200+ }
0 commit comments