github.com/vnpaycloud-console/gophercloud/v2@v2.0.5/internal/acceptance/openstack/networking/v2/extensions/trunks/trunks_test.go (about)

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