github.com/gophercloud/gophercloud@v1.11.0/internal/acceptance/openstack/networking/v2/extensions/layer3/l3_scheduling_test.go (about)

     1  //go:build acceptance || networking || layer3 || router
     2  // +build acceptance networking layer3 router
     3  
     4  package layer3
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/gophercloud/gophercloud/internal/acceptance/clients"
    10  	networking "github.com/gophercloud/gophercloud/internal/acceptance/openstack/networking/v2"
    11  	"github.com/gophercloud/gophercloud/internal/acceptance/tools"
    12  	"github.com/gophercloud/gophercloud/openstack/common/extensions"
    13  	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/agents"
    14  	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
    15  	th "github.com/gophercloud/gophercloud/testhelper"
    16  )
    17  
    18  func TestLayer3RouterScheduling(t *testing.T) {
    19  	client, err := clients.NewNetworkV2Client()
    20  	th.AssertNoErr(t, err)
    21  
    22  	_, err = extensions.Get(client, "l3_agent_scheduler").Extract()
    23  	if err != nil {
    24  		t.Skip("Extension l3_agent_scheduler not present")
    25  	}
    26  
    27  	network, err := networking.CreateNetwork(t, client)
    28  	th.AssertNoErr(t, err)
    29  	defer networking.DeleteNetwork(t, client, network.ID)
    30  
    31  	subnet, err := networking.CreateSubnet(t, client, network.ID)
    32  	th.AssertNoErr(t, err)
    33  	defer networking.DeleteSubnet(t, client, subnet.ID)
    34  
    35  	router, err := CreateRouter(t, client, network.ID)
    36  	th.AssertNoErr(t, err)
    37  	defer DeleteRouter(t, client, router.ID)
    38  	tools.PrintResource(t, router)
    39  
    40  	routerInterface, err := CreateRouterInterfaceOnSubnet(t, client, subnet.ID, router.ID)
    41  	tools.PrintResource(t, routerInterface)
    42  	th.AssertNoErr(t, err)
    43  	defer DeleteRouterInterface(t, client, routerInterface.PortID, router.ID)
    44  
    45  	// List hosting agent
    46  	allPages, err := routers.ListL3Agents(client, router.ID).AllPages()
    47  	th.AssertNoErr(t, err)
    48  	hostingAgents, err := routers.ExtractL3Agents(allPages)
    49  	th.AssertNoErr(t, err)
    50  	th.AssertIntGreaterOrEqual(t, len(hostingAgents), 1)
    51  	hostingAgent := hostingAgents[0]
    52  	t.Logf("Router %s is scheduled on %s", router.ID, hostingAgent.ID)
    53  
    54  	// remove from hosting agent
    55  	err = agents.RemoveL3Router(client, hostingAgent.ID, router.ID).ExtractErr()
    56  	th.AssertNoErr(t, err)
    57  
    58  	containsRouterFunc := func(rs []routers.Router, routerID string) bool {
    59  		for _, r := range rs {
    60  			if r.ID == router.ID {
    61  				return true
    62  			}
    63  		}
    64  		return false
    65  	}
    66  
    67  	// List routers on hosting agent
    68  	routersOnHostingAgent, err := agents.ListL3Routers(client, hostingAgent.ID).Extract()
    69  	th.AssertNoErr(t, err)
    70  	th.AssertEquals(t, containsRouterFunc(routersOnHostingAgent, router.ID), false)
    71  	t.Logf("Router %s is not scheduled on %s", router.ID, hostingAgent.ID)
    72  
    73  	// schedule back
    74  	err = agents.ScheduleL3Router(client, hostingAgents[0].ID, agents.ScheduleL3RouterOpts{RouterID: router.ID}).ExtractErr()
    75  	th.AssertNoErr(t, err)
    76  
    77  	// List hosting agent after readding
    78  	routersOnHostingAgent, err = agents.ListL3Routers(client, hostingAgent.ID).Extract()
    79  	th.AssertNoErr(t, err)
    80  	th.AssertEquals(t, containsRouterFunc(routersOnHostingAgent, router.ID), true)
    81  	t.Logf("Router %s is scheduled on %s", router.ID, hostingAgent.ID)
    82  }