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

     1  //go:build acceptance || trunks
     2  // +build acceptance trunks
     3  
     4  package trunks
     5  
     6  import (
     7  	"sort"
     8  	"testing"
     9  
    10  	"github.com/gophercloud/gophercloud/internal/acceptance/clients"
    11  	v2 "github.com/gophercloud/gophercloud/internal/acceptance/openstack/networking/v2"
    12  	"github.com/gophercloud/gophercloud/internal/acceptance/tools"
    13  	"github.com/gophercloud/gophercloud/openstack/common/extensions"
    14  	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/attributestags"
    15  	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/trunks"
    16  	th "github.com/gophercloud/gophercloud/testhelper"
    17  )
    18  
    19  func TestTrunkCRUD(t *testing.T) {
    20  	client, err := clients.NewNetworkV2Client()
    21  	if err != nil {
    22  		t.Fatalf("Unable to create a network client: %v", err)
    23  	}
    24  
    25  	extension, err := extensions.Get(client, "trunk").Extract()
    26  	if err != nil {
    27  		t.Skip("This test requires trunk Neutron extension")
    28  	}
    29  	tools.PrintResource(t, extension)
    30  
    31  	// Create Network
    32  	network, err := v2.CreateNetwork(t, client)
    33  	if err != nil {
    34  		t.Fatalf("Unable to create network: %v", err)
    35  	}
    36  	defer v2.DeleteNetwork(t, client, network.ID)
    37  
    38  	// Create Subnet
    39  	subnet, err := v2.CreateSubnet(t, client, network.ID)
    40  	if err != nil {
    41  		t.Fatalf("Unable to create subnet: %v", err)
    42  	}
    43  	defer v2.DeleteSubnet(t, client, subnet.ID)
    44  
    45  	// Create port
    46  	parentPort, err := v2.CreatePort(t, client, network.ID, subnet.ID)
    47  	if err != nil {
    48  		t.Fatalf("Unable to create port: %v", err)
    49  	}
    50  	defer v2.DeletePort(t, client, parentPort.ID)
    51  
    52  	subport1, err := v2.CreatePort(t, client, network.ID, subnet.ID)
    53  	if err != nil {
    54  		t.Fatalf("Unable to create port: %v", err)
    55  	}
    56  	defer v2.DeletePort(t, client, subport1.ID)
    57  
    58  	subport2, err := v2.CreatePort(t, client, network.ID, subnet.ID)
    59  	if err != nil {
    60  		t.Fatalf("Unable to create port: %v", err)
    61  	}
    62  	defer v2.DeletePort(t, client, subport2.ID)
    63  
    64  	trunk, err := CreateTrunk(t, client, parentPort.ID, subport1.ID, subport2.ID)
    65  	if err != nil {
    66  		t.Fatalf("Unable to create trunk: %v", err)
    67  	}
    68  	defer DeleteTrunk(t, client, trunk.ID)
    69  
    70  	_, err = trunks.Get(client, trunk.ID).Extract()
    71  	if err != nil {
    72  		t.Fatalf("Unable to get trunk: %v", err)
    73  	}
    74  
    75  	// Update Trunk
    76  	name := ""
    77  	description := ""
    78  	updateOpts := trunks.UpdateOpts{
    79  		Name:        &name,
    80  		Description: &description,
    81  	}
    82  	updatedTrunk, err := trunks.Update(client, trunk.ID, updateOpts).Extract()
    83  	if err != nil {
    84  		t.Fatalf("Unable to update trunk: %v", err)
    85  	}
    86  
    87  	if trunk.Name == updatedTrunk.Name {
    88  		t.Fatalf("Trunk name was not updated correctly")
    89  	}
    90  
    91  	if trunk.Description == updatedTrunk.Description {
    92  		t.Fatalf("Trunk description was not updated correctly")
    93  	}
    94  
    95  	th.AssertDeepEquals(t, updatedTrunk.Name, name)
    96  	th.AssertDeepEquals(t, updatedTrunk.Description, description)
    97  
    98  	// Get subports
    99  	subports, err := trunks.GetSubports(client, trunk.ID).Extract()
   100  	if err != nil {
   101  		t.Fatalf("Unable to get subports from the Trunk: %v", err)
   102  	}
   103  	th.AssertDeepEquals(t, trunk.Subports[0], subports[0])
   104  	th.AssertDeepEquals(t, trunk.Subports[1], subports[1])
   105  
   106  	tools.PrintResource(t, trunk)
   107  }
   108  
   109  func TestTrunkList(t *testing.T) {
   110  	client, err := clients.NewNetworkV2Client()
   111  	if err != nil {
   112  		t.Fatalf("Unable to create a network client: %v", err)
   113  	}
   114  
   115  	extension, err := extensions.Get(client, "trunk").Extract()
   116  	if err != nil {
   117  		t.Skip("This test requires trunk Neutron extension")
   118  	}
   119  	tools.PrintResource(t, extension)
   120  
   121  	allPages, err := trunks.List(client, nil).AllPages()
   122  	if err != nil {
   123  		t.Fatalf("Unable to list trunks: %v", err)
   124  	}
   125  
   126  	allTrunks, err := trunks.ExtractTrunks(allPages)
   127  	if err != nil {
   128  		t.Fatalf("Unable to extract trunks: %v", err)
   129  	}
   130  
   131  	for _, trunk := range allTrunks {
   132  		tools.PrintResource(t, trunk)
   133  	}
   134  }
   135  
   136  func TestTrunkSubportOperation(t *testing.T) {
   137  	client, err := clients.NewNetworkV2Client()
   138  	if err != nil {
   139  		t.Fatalf("Unable to create a network client: %v", err)
   140  	}
   141  
   142  	extension, err := extensions.Get(client, "trunk").Extract()
   143  	if err != nil {
   144  		t.Skip("This test requires trunk Neutron extension")
   145  	}
   146  	tools.PrintResource(t, extension)
   147  
   148  	// Create Network
   149  	network, err := v2.CreateNetwork(t, client)
   150  	if err != nil {
   151  		t.Fatalf("Unable to create network: %v", err)
   152  	}
   153  	defer v2.DeleteNetwork(t, client, network.ID)
   154  
   155  	// Create Subnet
   156  	subnet, err := v2.CreateSubnet(t, client, network.ID)
   157  	if err != nil {
   158  		t.Fatalf("Unable to create subnet: %v", err)
   159  	}
   160  	defer v2.DeleteSubnet(t, client, subnet.ID)
   161  
   162  	// Create port
   163  	parentPort, err := v2.CreatePort(t, client, network.ID, subnet.ID)
   164  	if err != nil {
   165  		t.Fatalf("Unable to create port: %v", err)
   166  	}
   167  	defer v2.DeletePort(t, client, parentPort.ID)
   168  
   169  	subport1, err := v2.CreatePort(t, client, network.ID, subnet.ID)
   170  	if err != nil {
   171  		t.Fatalf("Unable to create port: %v", err)
   172  	}
   173  	defer v2.DeletePort(t, client, subport1.ID)
   174  
   175  	subport2, err := v2.CreatePort(t, client, network.ID, subnet.ID)
   176  	if err != nil {
   177  		t.Fatalf("Unable to create port: %v", err)
   178  	}
   179  	defer v2.DeletePort(t, client, subport2.ID)
   180  
   181  	trunk, err := CreateTrunk(t, client, parentPort.ID)
   182  	if err != nil {
   183  		t.Fatalf("Unable to create trunk: %v", err)
   184  	}
   185  	defer DeleteTrunk(t, client, trunk.ID)
   186  
   187  	// Add subports to the trunk
   188  	addSubportsOpts := trunks.AddSubportsOpts{
   189  		Subports: []trunks.Subport{
   190  			{
   191  				SegmentationID:   1,
   192  				SegmentationType: "vlan",
   193  				PortID:           subport1.ID,
   194  			},
   195  			{
   196  				SegmentationID:   11,
   197  				SegmentationType: "vlan",
   198  				PortID:           subport2.ID,
   199  			},
   200  		},
   201  	}
   202  	updatedTrunk, err := trunks.AddSubports(client, trunk.ID, addSubportsOpts).Extract()
   203  	if err != nil {
   204  		t.Fatalf("Unable to add subports to the Trunk: %v", err)
   205  	}
   206  	th.AssertEquals(t, 2, len(updatedTrunk.Subports))
   207  	th.AssertDeepEquals(t, addSubportsOpts.Subports[0], updatedTrunk.Subports[0])
   208  	th.AssertDeepEquals(t, addSubportsOpts.Subports[1], updatedTrunk.Subports[1])
   209  
   210  	// Remove the Subports from the trunk
   211  	subRemoveOpts := trunks.RemoveSubportsOpts{
   212  		Subports: []trunks.RemoveSubport{
   213  			{PortID: subport1.ID},
   214  			{PortID: subport2.ID},
   215  		},
   216  	}
   217  	updatedAgainTrunk, err := trunks.RemoveSubports(client, trunk.ID, subRemoveOpts).Extract()
   218  	if err != nil {
   219  		t.Fatalf("Unable to remove subports from the Trunk: %v", err)
   220  	}
   221  	th.AssertDeepEquals(t, trunk.Subports, updatedAgainTrunk.Subports)
   222  }
   223  
   224  func TestTrunkTags(t *testing.T) {
   225  	client, err := clients.NewNetworkV2Client()
   226  	if err != nil {
   227  		t.Fatalf("Unable to create a network client: %v", err)
   228  	}
   229  
   230  	extension, err := extensions.Get(client, "trunk").Extract()
   231  	if err != nil {
   232  		t.Skip("This test requires trunk Neutron extension")
   233  	}
   234  	tools.PrintResource(t, extension)
   235  
   236  	// Create Network
   237  	network, err := v2.CreateNetwork(t, client)
   238  	if err != nil {
   239  		t.Fatalf("Unable to create network: %v", err)
   240  	}
   241  	defer v2.DeleteNetwork(t, client, network.ID)
   242  
   243  	// Create Subnet
   244  	subnet, err := v2.CreateSubnet(t, client, network.ID)
   245  	if err != nil {
   246  		t.Fatalf("Unable to create subnet: %v", err)
   247  	}
   248  	defer v2.DeleteSubnet(t, client, subnet.ID)
   249  
   250  	// Create port
   251  	parentPort, err := v2.CreatePort(t, client, network.ID, subnet.ID)
   252  	if err != nil {
   253  		t.Fatalf("Unable to create port: %v", err)
   254  	}
   255  	defer v2.DeletePort(t, client, parentPort.ID)
   256  
   257  	subport1, err := v2.CreatePort(t, client, network.ID, subnet.ID)
   258  	if err != nil {
   259  		t.Fatalf("Unable to create port: %v", err)
   260  	}
   261  	defer v2.DeletePort(t, client, subport1.ID)
   262  
   263  	subport2, err := v2.CreatePort(t, client, network.ID, subnet.ID)
   264  	if err != nil {
   265  		t.Fatalf("Unable to create port: %v", err)
   266  	}
   267  	defer v2.DeletePort(t, client, subport2.ID)
   268  
   269  	trunk, err := CreateTrunk(t, client, parentPort.ID, subport1.ID, subport2.ID)
   270  	if err != nil {
   271  		t.Fatalf("Unable to create trunk: %v", err)
   272  	}
   273  	defer DeleteTrunk(t, client, trunk.ID)
   274  
   275  	tagReplaceAllOpts := attributestags.ReplaceAllOpts{
   276  		// docs say list of tags, but it's a set e.g no duplicates
   277  		Tags: []string{"a", "b", "c"},
   278  	}
   279  	tags, err := attributestags.ReplaceAll(client, "trunks", trunk.ID, tagReplaceAllOpts).Extract()
   280  	if err != nil {
   281  		t.Fatalf("Unable to set trunk tags: %v", err)
   282  	}
   283  
   284  	gtrunk, err := trunks.Get(client, trunk.ID).Extract()
   285  	if err != nil {
   286  		t.Fatalf("Unable to get trunk: %v", err)
   287  	}
   288  	tags = gtrunk.Tags
   289  	sort.Strings(tags) // Ensure ordering, older OpenStack versions aren't sorted...
   290  	th.AssertDeepEquals(t, []string{"a", "b", "c"}, tags)
   291  
   292  	// Add a tag
   293  	err = attributestags.Add(client, "trunks", trunk.ID, "d").ExtractErr()
   294  	th.AssertNoErr(t, err)
   295  
   296  	// Delete a tag
   297  	err = attributestags.Delete(client, "trunks", trunk.ID, "a").ExtractErr()
   298  	th.AssertNoErr(t, err)
   299  
   300  	// Verify expected tags are set in the List response
   301  	tags, err = attributestags.List(client, "trunks", trunk.ID).Extract()
   302  	th.AssertNoErr(t, err)
   303  	sort.Strings(tags)
   304  	th.AssertDeepEquals(t, []string{"b", "c", "d"}, tags)
   305  
   306  	// Delete all tags
   307  	err = attributestags.DeleteAll(client, "trunks", trunk.ID).ExtractErr()
   308  	th.AssertNoErr(t, err)
   309  	tags, err = attributestags.List(client, "trunks", trunk.ID).Extract()
   310  	th.AssertNoErr(t, err)
   311  	th.AssertEquals(t, 0, len(tags))
   312  }