github.com/vnpaycloud-console/gophercloud/v2@v2.0.5/internal/acceptance/openstack/networking/v2/extensions/agents/agents_test.go (about) 1 //go:build acceptance || networking || agents 2 3 package agents 4 5 import ( 6 "context" 7 "testing" 8 "time" 9 10 "github.com/vnpaycloud-console/gophercloud/v2/internal/acceptance/clients" 11 networking "github.com/vnpaycloud-console/gophercloud/v2/internal/acceptance/openstack/networking/v2" 12 spk "github.com/vnpaycloud-console/gophercloud/v2/internal/acceptance/openstack/networking/v2/extensions/bgp/speakers" 13 "github.com/vnpaycloud-console/gophercloud/v2/internal/acceptance/tools" 14 "github.com/vnpaycloud-console/gophercloud/v2/openstack/networking/v2/extensions/agents" 15 "github.com/vnpaycloud-console/gophercloud/v2/openstack/networking/v2/extensions/bgp/speakers" 16 th "github.com/vnpaycloud-console/gophercloud/v2/testhelper" 17 ) 18 19 func TestAgentsRUD(t *testing.T) { 20 t.Skip("TestAgentsRUD needs to be re-worked to work with both ML2/OVS and OVN") 21 clients.RequireAdmin(t) 22 23 client, err := clients.NewNetworkV2Client() 24 th.AssertNoErr(t, err) 25 26 allPages, err := agents.List(client, agents.ListOpts{}).AllPages(context.TODO()) 27 th.AssertNoErr(t, err) 28 29 allAgents, err := agents.ExtractAgents(allPages) 30 th.AssertNoErr(t, err) 31 32 t.Logf("Retrieved Networking V2 agents") 33 tools.PrintResource(t, allAgents) 34 35 // List DHCP agents 36 listOpts := &agents.ListOpts{ 37 AgentType: "DHCP agent", 38 } 39 allPages, err = agents.List(client, listOpts).AllPages(context.TODO()) 40 th.AssertNoErr(t, err) 41 42 allAgents, err = agents.ExtractAgents(allPages) 43 th.AssertNoErr(t, err) 44 45 t.Logf("Retrieved Networking V2 DHCP agents") 46 tools.PrintResource(t, allAgents) 47 48 // List DHCP agent networks 49 for _, agent := range allAgents { 50 t.Logf("Retrieving DHCP networks from the agent: %s", agent.ID) 51 networks, err := agents.ListDHCPNetworks(context.TODO(), client, agent.ID).Extract() 52 th.AssertNoErr(t, err) 53 for _, network := range networks { 54 t.Logf("Retrieved %q network, assigned to a %q DHCP agent", network.ID, agent.ID) 55 } 56 } 57 58 // Get a single agent 59 agent, err := agents.Get(context.TODO(), client, allAgents[0].ID).Extract() 60 th.AssertNoErr(t, err) 61 tools.PrintResource(t, agent) 62 63 // Update an agent 64 description := "updated agent" 65 updateOpts := &agents.UpdateOpts{ 66 Description: &description, 67 } 68 agent, err = agents.Update(context.TODO(), client, allAgents[0].ID, updateOpts).Extract() 69 th.AssertNoErr(t, err) 70 th.AssertEquals(t, agent.Description, description) 71 72 // Restore original description 73 agent, err = agents.Update(context.TODO(), client, allAgents[0].ID, &agents.UpdateOpts{Description: &allAgents[0].Description}).Extract() 74 th.AssertNoErr(t, err) 75 th.AssertEquals(t, agent.Description, allAgents[0].Description) 76 77 // Assign a new network to a DHCP agent 78 network, err := networking.CreateNetwork(t, client) 79 th.AssertNoErr(t, err) 80 defer networking.DeleteNetwork(t, client, network.ID) 81 82 opts := &agents.ScheduleDHCPNetworkOpts{ 83 NetworkID: network.ID, 84 } 85 err = agents.ScheduleDHCPNetwork(context.TODO(), client, allAgents[0].ID, opts).ExtractErr() 86 th.AssertNoErr(t, err) 87 88 err = agents.RemoveDHCPNetwork(context.TODO(), client, allAgents[0].ID, network.ID).ExtractErr() 89 th.AssertNoErr(t, err) 90 91 // skip this part 92 t.Skip("Skip DHCP agent deletion") 93 94 // Delete a DHCP agent 95 err = agents.Delete(context.TODO(), client, allAgents[0].ID).ExtractErr() 96 th.AssertNoErr(t, err) 97 } 98 99 func TestBGPAgentRUD(t *testing.T) { 100 timeout := 15 * time.Minute 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(context.TODO()) 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(context.TODO()) 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(ctx context.Context) (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(ctx, 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 // List the BGP speakers on the first agent 144 bgpAgent, err := agents.Get(context.TODO(), client, bgpAgents[0].ID).Extract() 145 th.AssertNoErr(t, err) 146 agentConf := bgpAgent.Configurations 147 numOfSpeakers := int(agentConf["bgp_speakers"].(float64)) 148 t.Logf("Agent %s has %d speaker(s)", bgpAgents[0].ID, numOfSpeakers) 149 150 pages, err = agents.ListBGPSpeakers(client, bgpAgents[0].ID).AllPages(context.TODO()) 151 th.AssertNoErr(t, err) 152 allSpeakers, err := agents.ExtractBGPSpeakers(pages) 153 th.AssertNoErr(t, err) 154 out := "Speakers:" 155 for _, speaker := range allSpeakers { 156 out += " " + speaker.ID 157 } 158 t.Log(out) 159 160 // Remove the BGP Speaker from the first agent 161 err = agents.RemoveBGPSpeaker(context.TODO(), client, bgpAgents[0].ID, bgpSpeaker.ID).ExtractErr() 162 th.AssertNoErr(t, err) 163 t.Logf("BGP Speaker %s has been removed from agent %s", bgpSpeaker.ID, bgpAgents[0].ID) 164 err = tools.WaitForTimeout( 165 func(ctx context.Context) (bool, error) { 166 bgpAgent, err := agents.Get(ctx, client, bgpAgents[0].ID).Extract() 167 th.AssertNoErr(t, err) 168 agentConf := bgpAgent.Configurations 169 numOfSpeakers := int(agentConf["bgp_speakers"].(float64)) 170 t.Logf("Agent %s has %d speaker(s)", bgpAgent.ID, numOfSpeakers) 171 return numOfSpeakers == 0, nil 172 }, timeout) 173 th.AssertNoErr(t, err) 174 175 // Remove all BGP Speakers from the agent 176 pages, err = agents.ListBGPSpeakers(client, bgpAgents[0].ID).AllPages(context.TODO()) 177 th.AssertNoErr(t, err) 178 allSpeakers, err = agents.ExtractBGPSpeakers(pages) 179 th.AssertNoErr(t, err) 180 for _, speaker := range allSpeakers { 181 th.AssertNoErr(t, agents.RemoveBGPSpeaker(context.TODO(), client, bgpAgents[0].ID, speaker.ID).ExtractErr()) 182 } 183 184 // Schedule a BGP Speaker to an agent 185 opts := agents.ScheduleBGPSpeakerOpts{ 186 SpeakerID: bgpSpeaker.ID, 187 } 188 err = agents.ScheduleBGPSpeaker(context.TODO(), client, bgpAgents[0].ID, opts).ExtractErr() 189 th.AssertNoErr(t, err) 190 t.Logf("Successfully scheduled speaker %s to agent %s", bgpSpeaker.ID, bgpAgents[0].ID) 191 192 err = tools.WaitForTimeout( 193 func(ctx context.Context) (bool, error) { 194 bgpAgent, err := agents.Get(ctx, client, bgpAgents[0].ID).Extract() 195 th.AssertNoErr(t, err) 196 agentConf := bgpAgent.Configurations 197 numOfSpeakers := int(agentConf["bgp_speakers"].(float64)) 198 t.Logf("Agent %s has %d speaker(s)", bgpAgent.ID, numOfSpeakers) 199 return 1 == numOfSpeakers, nil 200 }, timeout) 201 th.AssertNoErr(t, err) 202 203 // Delete the BGP Speaker 204 err = speakers.Delete(context.TODO(), client, bgpSpeaker.ID).ExtractErr() 205 th.AssertNoErr(t, err) 206 t.Logf("Successfully deleted the BGP Speaker, %s", bgpSpeaker.ID) 207 err = tools.WaitForTimeout( 208 func(ctx context.Context) (bool, error) { 209 bgpAgent, err := agents.Get(ctx, client, bgpAgents[0].ID).Extract() 210 th.AssertNoErr(t, err) 211 agentConf := bgpAgent.Configurations 212 numOfSpeakers := int(agentConf["bgp_speakers"].(float64)) 213 t.Logf("Agent %s has %d speaker(s)", bgpAgent.ID, numOfSpeakers) 214 return 0 == numOfSpeakers, nil 215 }, timeout) 216 th.AssertNoErr(t, err) 217 }