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  }