1// +build acceptance networking
2
3package mtu
4
5import (
6	"testing"
7
8	"github.com/gophercloud/gophercloud/acceptance/clients"
9	networking "github.com/gophercloud/gophercloud/acceptance/openstack/networking/v2"
10	"github.com/gophercloud/gophercloud/acceptance/tools"
11	"github.com/gophercloud/gophercloud/openstack/common/extensions"
12	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/mtu"
13	"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
14	"github.com/gophercloud/gophercloud/pagination"
15	th "github.com/gophercloud/gophercloud/testhelper"
16)
17
18func TestMTUNetworkCRUDL(t *testing.T) {
19	clients.RequireAdmin(t)
20	clients.SkipRelease(t, "stable/mitaka")
21	clients.SkipRelease(t, "stable/newton")
22	clients.SkipRelease(t, "stable/ocata")
23
24	client, err := clients.NewNetworkV2Client()
25	th.AssertNoErr(t, err)
26
27	extension, err := extensions.Get(client, "net-mtu").Extract()
28	if err != nil {
29		t.Skip("This test requires net-mtu Neutron extension")
30	}
31	tools.PrintResource(t, extension)
32
33	mtuWritable, _ := extensions.Get(client, "net-mtu-writable").Extract()
34	tools.PrintResource(t, mtuWritable)
35
36	// Create Network
37	var networkMTU int
38	if mtuWritable != nil {
39		networkMTU = 1449
40	}
41	network, err := CreateNetworkWithMTU(t, client, &networkMTU)
42	th.AssertNoErr(t, err)
43	defer networking.DeleteNetwork(t, client, network.ID)
44
45	// MTU filtering is supported only in read-only MTU extension
46	// https://bugs.launchpad.net/neutron/+bug/1818317
47	if mtuWritable == nil {
48		// List network successfully
49		var listOpts networks.ListOptsBuilder
50		listOpts = mtu.ListOptsExt{
51			ListOptsBuilder: networks.ListOpts{},
52			MTU:             networkMTU,
53		}
54		var listedNetworks []NetworkMTU
55		i := 0
56		err = networks.List(client, listOpts).EachPage(func(page pagination.Page) (bool, error) {
57			i++
58			err := networks.ExtractNetworksInto(page, &listedNetworks)
59			if err != nil {
60				t.Errorf("Failed to extract networks: %v", err)
61				return false, err
62			}
63
64			tools.PrintResource(t, listedNetworks)
65
66			th.AssertEquals(t, 1, len(listedNetworks))
67			th.CheckDeepEquals(t, *network, listedNetworks[0])
68
69			return true, nil
70		})
71		th.AssertNoErr(t, err)
72		th.AssertEquals(t, 1, i)
73
74		// List network unsuccessfully
75		listOpts = mtu.ListOptsExt{
76			ListOptsBuilder: networks.ListOpts{},
77			MTU:             1,
78		}
79		i = 0
80		err = networks.List(client, listOpts).EachPage(func(page pagination.Page) (bool, error) {
81			i++
82			err := networks.ExtractNetworksInto(page, &listedNetworks)
83			if err != nil {
84				t.Errorf("Failed to extract networks: %v", err)
85				return false, err
86			}
87
88			tools.PrintResource(t, listedNetworks)
89
90			th.AssertEquals(t, 1, len(listedNetworks))
91			th.CheckDeepEquals(t, *network, listedNetworks[0])
92
93			return true, nil
94		})
95		th.AssertNoErr(t, err)
96		th.AssertEquals(t, 0, i)
97	}
98
99	// Get network
100	var getNetwork NetworkMTU
101	err = networks.Get(client, network.ID).ExtractInto(&getNetwork)
102	th.AssertNoErr(t, err)
103
104	tools.PrintResource(t, getNetwork)
105	th.AssertDeepEquals(t, *network, getNetwork)
106
107	if mtuWritable != nil {
108		// Update network
109		newNetworkDescription := ""
110		newNetworkMTU := 1350
111		networkUpdateOpts := networks.UpdateOpts{
112			Description: &newNetworkDescription,
113		}
114		var updateOpts networks.UpdateOptsBuilder
115		updateOpts = mtu.UpdateOptsExt{
116			UpdateOptsBuilder: networkUpdateOpts,
117			MTU:               newNetworkMTU,
118		}
119
120		var newNetwork NetworkMTU
121		err = networks.Update(client, network.ID, updateOpts).ExtractInto(&newNetwork)
122		th.AssertNoErr(t, err)
123
124		tools.PrintResource(t, newNetwork)
125		th.AssertEquals(t, newNetwork.Description, newNetworkDescription)
126		th.AssertEquals(t, newNetwork.MTU, newNetworkMTU)
127
128		// Get updated network
129		var getNewNetwork NetworkMTU
130		err = networks.Get(client, network.ID).ExtractInto(&getNewNetwork)
131		th.AssertNoErr(t, err)
132
133		tools.PrintResource(t, getNewNetwork)
134		th.AssertDeepEquals(t, newNetwork, getNewNetwork)
135	}
136}
137