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

     1  //go:build acceptance || trunks
     2  // +build acceptance trunks
     3  
     4  package trunk_details
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/gophercloud/gophercloud/internal/acceptance/clients"
    10  	v2 "github.com/gophercloud/gophercloud/internal/acceptance/openstack/networking/v2"
    11  	v2Trunks "github.com/gophercloud/gophercloud/internal/acceptance/openstack/networking/v2/extensions/trunks"
    12  	"github.com/gophercloud/gophercloud/openstack/common/extensions"
    13  	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/trunk_details"
    14  	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/trunks"
    15  	"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
    16  	th "github.com/gophercloud/gophercloud/testhelper"
    17  )
    18  
    19  type portWithTrunkDetails struct {
    20  	ports.Port
    21  	trunk_details.TrunkDetailsExt
    22  }
    23  
    24  func TestListPortWithSubports(t *testing.T) {
    25  	client, err := clients.NewNetworkV2Client()
    26  	if err != nil {
    27  		t.Fatalf("Unable to create a network client: %v", err)
    28  	}
    29  
    30  	_, err = extensions.Get(client, "trunk-details").Extract()
    31  	if err != nil {
    32  		t.Skip("This test requires trunk-details Neutron extension")
    33  	}
    34  
    35  	// Create Network
    36  	network, err := v2.CreateNetwork(t, client)
    37  	if err != nil {
    38  		t.Fatalf("Unable to create network: %v", err)
    39  	}
    40  	defer v2.DeleteNetwork(t, client, network.ID)
    41  
    42  	// Create Subnet
    43  	subnet, err := v2.CreateSubnet(t, client, network.ID)
    44  	if err != nil {
    45  		t.Fatalf("Unable to create subnet: %v", err)
    46  	}
    47  	defer v2.DeleteSubnet(t, client, subnet.ID)
    48  
    49  	// Create port
    50  	parentPort, err := v2.CreatePort(t, client, network.ID, subnet.ID)
    51  	if err != nil {
    52  		t.Fatalf("Unable to create port: %v", err)
    53  	}
    54  	defer v2.DeletePort(t, client, parentPort.ID)
    55  
    56  	subport1, err := v2.CreatePort(t, client, network.ID, subnet.ID)
    57  	if err != nil {
    58  		t.Fatalf("Unable to create port: %v", err)
    59  	}
    60  	defer v2.DeletePort(t, client, subport1.ID)
    61  
    62  	subport2, err := v2.CreatePort(t, client, network.ID, subnet.ID)
    63  	if err != nil {
    64  		t.Fatalf("Unable to create port: %v", err)
    65  	}
    66  	defer v2.DeletePort(t, client, subport2.ID)
    67  
    68  	trunk, err := v2Trunks.CreateTrunk(t, client, parentPort.ID, subport1.ID, subport2.ID)
    69  	if err != nil {
    70  		t.Fatalf("Unable to create trunk: %v", err)
    71  	}
    72  	defer v2Trunks.DeleteTrunk(t, client, trunk.ID)
    73  
    74  	// Test LIST ports with trunk details
    75  	allPages, err := ports.List(client, ports.ListOpts{ID: parentPort.ID}).AllPages()
    76  	th.AssertNoErr(t, err)
    77  
    78  	var allPorts []portWithTrunkDetails
    79  	err = ports.ExtractPortsInto(allPages, &allPorts)
    80  	th.AssertNoErr(t, err)
    81  
    82  	th.AssertEquals(t, 1, len(allPorts))
    83  	port := allPorts[0]
    84  
    85  	th.AssertEquals(t, trunk.ID, port.TrunkDetails.TrunkID)
    86  	th.AssertEquals(t, 2, len(port.TrunkDetails.SubPorts))
    87  
    88  	// Note that MAC address is not (currently) returned in list queries. We
    89  	// exclude it from the comparison here in case it's ever added. MAC
    90  	// address is returned in GET queries, so we do assert that in the GET
    91  	// test below.
    92  	// Tracked in https://bugs.launchpad.net/neutron/+bug/2020552
    93  	// TODO: Remove this workaround when the bug is resolved
    94  	th.AssertDeepEquals(t, trunks.Subport{
    95  		SegmentationID:   1,
    96  		SegmentationType: "vlan",
    97  		PortID:           subport1.ID,
    98  	}, port.TrunkDetails.SubPorts[0].Subport)
    99  	th.AssertDeepEquals(t, trunks.Subport{
   100  		SegmentationID:   2,
   101  		SegmentationType: "vlan",
   102  		PortID:           subport2.ID,
   103  	}, port.TrunkDetails.SubPorts[1].Subport)
   104  
   105  	// Test GET port with trunk details
   106  	err = ports.Get(client, parentPort.ID).ExtractInto(&port)
   107  	th.AssertEquals(t, trunk.ID, port.TrunkDetails.TrunkID)
   108  	th.AssertEquals(t, 2, len(port.TrunkDetails.SubPorts))
   109  	th.AssertDeepEquals(t, trunk_details.Subport{
   110  		Subport: trunks.Subport{
   111  			SegmentationID:   1,
   112  			SegmentationType: "vlan",
   113  			PortID:           subport1.ID,
   114  		},
   115  		MACAddress: subport1.MACAddress,
   116  	}, port.TrunkDetails.SubPorts[0])
   117  	th.AssertDeepEquals(t, trunk_details.Subport{
   118  		Subport: trunks.Subport{
   119  			SegmentationID:   2,
   120  			SegmentationType: "vlan",
   121  			PortID:           subport2.ID,
   122  		},
   123  		MACAddress: subport2.MACAddress,
   124  	}, port.TrunkDetails.SubPorts[1])
   125  }