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  }