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

     1  //go:build acceptance || networking || layer3 || router
     2  // +build acceptance networking layer3 router
     3  
     4  package layer3
     5  
     6  import (
     7  	"fmt"
     8  	"net"
     9  	"testing"
    10  
    11  	"github.com/gophercloud/gophercloud/internal/acceptance/clients"
    12  	networking "github.com/gophercloud/gophercloud/internal/acceptance/openstack/networking/v2"
    13  	"github.com/gophercloud/gophercloud/internal/acceptance/tools"
    14  	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/extraroutes"
    15  	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
    16  	th "github.com/gophercloud/gophercloud/testhelper"
    17  )
    18  
    19  func TestLayer3ExtraRoutesAddRemove(t *testing.T) {
    20  	client, err := clients.NewNetworkV2Client()
    21  	th.AssertNoErr(t, err)
    22  
    23  	network, err := networking.CreateNetwork(t, client)
    24  	th.AssertNoErr(t, err)
    25  	defer networking.DeleteNetwork(t, client, network.ID)
    26  
    27  	subnet, err := networking.CreateSubnet(t, client, network.ID)
    28  	th.AssertNoErr(t, err)
    29  	defer networking.DeleteSubnet(t, client, subnet.ID)
    30  	tmp := net.ParseIP(subnet.GatewayIP).To4()
    31  	if tmp == nil {
    32  		th.AssertNoErr(t, fmt.Errorf("invalid subnet gateway IP: %s", subnet.GatewayIP))
    33  	}
    34  	tmp[3] = 251
    35  	gateway := tmp.String()
    36  
    37  	router, err := CreateRouter(t, client, network.ID)
    38  	th.AssertNoErr(t, err)
    39  	defer DeleteRouter(t, client, router.ID)
    40  
    41  	tools.PrintResource(t, router)
    42  
    43  	aiOpts := routers.AddInterfaceOpts{
    44  		SubnetID: subnet.ID,
    45  	}
    46  	iface, err := routers.AddInterface(client, router.ID, aiOpts).Extract()
    47  	th.AssertNoErr(t, err)
    48  
    49  	tools.PrintResource(t, iface)
    50  
    51  	// 2. delete router interface
    52  	defer func() {
    53  		riOpts := routers.RemoveInterfaceOpts{
    54  			SubnetID: subnet.ID,
    55  		}
    56  		_, err = routers.RemoveInterface(client, router.ID, riOpts).Extract()
    57  		th.AssertNoErr(t, err)
    58  	}()
    59  
    60  	// 1. delete routes first
    61  	defer func() {
    62  		routes := []routers.Route{}
    63  		opts := routers.UpdateOpts{
    64  			Routes: &routes,
    65  		}
    66  		_, err = routers.Update(client, router.ID, opts).Extract()
    67  		th.AssertNoErr(t, err)
    68  	}()
    69  
    70  	routes := []routers.Route{
    71  		{
    72  			DestinationCIDR: "192.168.11.0/30",
    73  			NextHop:         gateway,
    74  		},
    75  		{
    76  			DestinationCIDR: "192.168.12.0/30",
    77  			NextHop:         gateway,
    78  		},
    79  	}
    80  	updateOpts := routers.UpdateOpts{
    81  		Routes: &routes,
    82  	}
    83  	_, err = routers.Update(client, router.ID, updateOpts).Extract()
    84  	th.AssertNoErr(t, err)
    85  
    86  	newRoutes := []routers.Route{
    87  		{
    88  			DestinationCIDR: "192.168.13.0/30",
    89  			NextHop:         gateway,
    90  		},
    91  		{
    92  			DestinationCIDR: "192.168.14.0/30",
    93  			NextHop:         gateway,
    94  		},
    95  	}
    96  	opts := extraroutes.Opts{
    97  		Routes: &newRoutes,
    98  	}
    99  	// add new routes
   100  	rt, err := extraroutes.Add(client, router.ID, opts).Extract()
   101  	th.AssertNoErr(t, err)
   102  	th.AssertDeepEquals(t, append(routes, newRoutes...), rt.Routes)
   103  
   104  	// remove new routes
   105  	rt, err = extraroutes.Remove(client, router.ID, opts).Extract()
   106  	th.AssertNoErr(t, err)
   107  	th.AssertDeepEquals(t, routes, rt.Routes)
   108  }