github.com/gophercloud/gophercloud@v1.11.0/internal/acceptance/openstack/networking/v2/extensions/agents/agents_test.go (about) 1 //go:build acceptance || networking || agents 2 // +build acceptance networking agents 3 4 package agents 5 6 import ( 7 "testing" 8 "time" 9 10 "github.com/gophercloud/gophercloud/internal/acceptance/clients" 11 networking "github.com/gophercloud/gophercloud/internal/acceptance/openstack/networking/v2" 12 spk "github.com/gophercloud/gophercloud/internal/acceptance/openstack/networking/v2/extensions/bgp/speakers" 13 "github.com/gophercloud/gophercloud/internal/acceptance/tools" 14 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/agents" 15 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/bgp/speakers" 16 th "github.com/gophercloud/gophercloud/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() 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() 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(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(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(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(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(client, allAgents[0].ID, opts).ExtractErr() 86 th.AssertNoErr(t, err) 87 88 err = agents.RemoveDHCPNetwork(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(client, allAgents[0].ID).ExtractErr() 96 th.AssertNoErr(t, err) 97 } 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 }