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 }