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

     1  //go:build acceptance || networking
     2  // +build acceptance networking
     3  
     4  package v2
     5  
     6  import (
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/gophercloud/gophercloud/internal/acceptance/clients"
    11  	extensions "github.com/gophercloud/gophercloud/internal/acceptance/openstack/networking/v2/extensions"
    12  	"github.com/gophercloud/gophercloud/internal/acceptance/tools"
    13  	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/extradhcpopts"
    14  	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/portsecurity"
    15  	"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
    16  	th "github.com/gophercloud/gophercloud/testhelper"
    17  )
    18  
    19  func TestPortsCRUD(t *testing.T) {
    20  	client, err := clients.NewNetworkV2Client()
    21  	th.AssertNoErr(t, err)
    22  
    23  	// Create Network
    24  	network, err := CreateNetwork(t, client)
    25  	th.AssertNoErr(t, err)
    26  	defer DeleteNetwork(t, client, network.ID)
    27  
    28  	// Create Subnet
    29  	subnet, err := CreateSubnet(t, client, network.ID)
    30  	th.AssertNoErr(t, err)
    31  	defer DeleteSubnet(t, client, subnet.ID)
    32  
    33  	// Create port
    34  	port, err := CreatePort(t, client, network.ID, subnet.ID)
    35  	th.AssertNoErr(t, err)
    36  	defer DeletePort(t, client, port.ID)
    37  
    38  	if len(port.SecurityGroups) != 1 {
    39  		t.Logf("WARNING: Port did not have a default security group applied")
    40  	}
    41  
    42  	tools.PrintResource(t, port)
    43  
    44  	// Update port
    45  	newPortName := ""
    46  	newPortDescription := ""
    47  	updateOpts := ports.UpdateOpts{
    48  		Name:        &newPortName,
    49  		Description: &newPortDescription,
    50  	}
    51  	newPort, err := ports.Update(client, port.ID, updateOpts).Extract()
    52  	th.AssertNoErr(t, err)
    53  
    54  	tools.PrintResource(t, newPort)
    55  
    56  	th.AssertEquals(t, newPort.Name, newPortName)
    57  	th.AssertEquals(t, newPort.Description, newPortDescription)
    58  
    59  	allPages, err := ports.List(client, nil).AllPages()
    60  	th.AssertNoErr(t, err)
    61  
    62  	allPorts, err := ports.ExtractPorts(allPages)
    63  	th.AssertNoErr(t, err)
    64  
    65  	var found bool
    66  	for _, port := range allPorts {
    67  		if port.ID == newPort.ID {
    68  			found = true
    69  		}
    70  	}
    71  
    72  	th.AssertEquals(t, found, true)
    73  }
    74  
    75  func TestPortsRemoveSecurityGroups(t *testing.T) {
    76  	client, err := clients.NewNetworkV2Client()
    77  	th.AssertNoErr(t, err)
    78  
    79  	// Create Network
    80  	network, err := CreateNetwork(t, client)
    81  	th.AssertNoErr(t, err)
    82  	defer DeleteNetwork(t, client, network.ID)
    83  
    84  	// Create Subnet
    85  	subnet, err := CreateSubnet(t, client, network.ID)
    86  	th.AssertNoErr(t, err)
    87  	defer DeleteSubnet(t, client, subnet.ID)
    88  
    89  	// Create port
    90  	port, err := CreatePort(t, client, network.ID, subnet.ID)
    91  	th.AssertNoErr(t, err)
    92  	defer DeletePort(t, client, port.ID)
    93  
    94  	tools.PrintResource(t, port)
    95  
    96  	// Create a Security Group
    97  	group, err := extensions.CreateSecurityGroup(t, client)
    98  	th.AssertNoErr(t, err)
    99  	defer extensions.DeleteSecurityGroup(t, client, group.ID)
   100  
   101  	// Add the group to the port
   102  	updateOpts := ports.UpdateOpts{
   103  		SecurityGroups: &[]string{group.ID},
   104  	}
   105  	newPort, err := ports.Update(client, port.ID, updateOpts).Extract()
   106  	th.AssertNoErr(t, err)
   107  
   108  	// Remove the group
   109  	updateOpts = ports.UpdateOpts{
   110  		SecurityGroups: &[]string{},
   111  	}
   112  	newPort, err = ports.Update(client, port.ID, updateOpts).Extract()
   113  	th.AssertNoErr(t, err)
   114  
   115  	tools.PrintResource(t, newPort)
   116  
   117  	if len(newPort.SecurityGroups) > 0 {
   118  		t.Fatalf("Unable to remove security group from port")
   119  	}
   120  }
   121  
   122  func TestPortsDontAlterSecurityGroups(t *testing.T) {
   123  	client, err := clients.NewNetworkV2Client()
   124  	th.AssertNoErr(t, err)
   125  
   126  	// Create Network
   127  	network, err := CreateNetwork(t, client)
   128  	th.AssertNoErr(t, err)
   129  	defer DeleteNetwork(t, client, network.ID)
   130  
   131  	// Create Subnet
   132  	subnet, err := CreateSubnet(t, client, network.ID)
   133  	th.AssertNoErr(t, err)
   134  	defer DeleteSubnet(t, client, subnet.ID)
   135  
   136  	// Create a Security Group
   137  	group, err := extensions.CreateSecurityGroup(t, client)
   138  	th.AssertNoErr(t, err)
   139  	defer extensions.DeleteSecurityGroup(t, client, group.ID)
   140  
   141  	// Create port
   142  	port, err := CreatePort(t, client, network.ID, subnet.ID)
   143  	th.AssertNoErr(t, err)
   144  	defer DeletePort(t, client, port.ID)
   145  
   146  	tools.PrintResource(t, port)
   147  
   148  	// Add the group to the port
   149  	updateOpts := ports.UpdateOpts{
   150  		SecurityGroups: &[]string{group.ID},
   151  	}
   152  	newPort, err := ports.Update(client, port.ID, updateOpts).Extract()
   153  	th.AssertNoErr(t, err)
   154  
   155  	// Update the port again
   156  	var name = "some_port"
   157  	updateOpts = ports.UpdateOpts{
   158  		Name: &name,
   159  	}
   160  	newPort, err = ports.Update(client, port.ID, updateOpts).Extract()
   161  	th.AssertNoErr(t, err)
   162  
   163  	tools.PrintResource(t, newPort)
   164  
   165  	if len(newPort.SecurityGroups) == 0 {
   166  		t.Fatalf("Port had security group updated")
   167  	}
   168  }
   169  
   170  func TestPortsWithNoSecurityGroup(t *testing.T) {
   171  	client, err := clients.NewNetworkV2Client()
   172  	th.AssertNoErr(t, err)
   173  
   174  	// Create Network
   175  	network, err := CreateNetwork(t, client)
   176  	th.AssertNoErr(t, err)
   177  	defer DeleteNetwork(t, client, network.ID)
   178  
   179  	// Create Subnet
   180  	subnet, err := CreateSubnet(t, client, network.ID)
   181  	th.AssertNoErr(t, err)
   182  	defer DeleteSubnet(t, client, subnet.ID)
   183  
   184  	// Create port
   185  	port, err := CreatePortWithNoSecurityGroup(t, client, network.ID, subnet.ID)
   186  	th.AssertNoErr(t, err)
   187  	defer DeletePort(t, client, port.ID)
   188  
   189  	tools.PrintResource(t, port)
   190  
   191  	if len(port.SecurityGroups) != 0 {
   192  		t.Fatalf("Port was created with security groups")
   193  	}
   194  }
   195  
   196  func TestPortsRemoveAddressPair(t *testing.T) {
   197  	client, err := clients.NewNetworkV2Client()
   198  	th.AssertNoErr(t, err)
   199  
   200  	// Create Network
   201  	network, err := CreateNetwork(t, client)
   202  	th.AssertNoErr(t, err)
   203  	defer DeleteNetwork(t, client, network.ID)
   204  
   205  	// Create Subnet
   206  	subnet, err := CreateSubnet(t, client, network.ID)
   207  	th.AssertNoErr(t, err)
   208  	defer DeleteSubnet(t, client, subnet.ID)
   209  
   210  	// Create port
   211  	port, err := CreatePort(t, client, network.ID, subnet.ID)
   212  	th.AssertNoErr(t, err)
   213  	defer DeletePort(t, client, port.ID)
   214  
   215  	tools.PrintResource(t, port)
   216  
   217  	// Add an address pair to the port
   218  	updateOpts := ports.UpdateOpts{
   219  		AllowedAddressPairs: &[]ports.AddressPair{
   220  			{IPAddress: "192.168.255.10", MACAddress: "aa:bb:cc:dd:ee:ff"},
   221  		},
   222  	}
   223  	newPort, err := ports.Update(client, port.ID, updateOpts).Extract()
   224  	th.AssertNoErr(t, err)
   225  
   226  	// Remove the address pair
   227  	updateOpts = ports.UpdateOpts{
   228  		AllowedAddressPairs: &[]ports.AddressPair{},
   229  	}
   230  	newPort, err = ports.Update(client, port.ID, updateOpts).Extract()
   231  	th.AssertNoErr(t, err)
   232  
   233  	tools.PrintResource(t, newPort)
   234  
   235  	if len(newPort.AllowedAddressPairs) > 0 {
   236  		t.Fatalf("Unable to remove the address pair")
   237  	}
   238  }
   239  
   240  func TestPortsDontUpdateAllowedAddressPairs(t *testing.T) {
   241  	client, err := clients.NewNetworkV2Client()
   242  	th.AssertNoErr(t, err)
   243  
   244  	// Create Network
   245  	network, err := CreateNetwork(t, client)
   246  	th.AssertNoErr(t, err)
   247  	defer DeleteNetwork(t, client, network.ID)
   248  
   249  	// Create Subnet
   250  	subnet, err := CreateSubnet(t, client, network.ID)
   251  	th.AssertNoErr(t, err)
   252  	defer DeleteSubnet(t, client, subnet.ID)
   253  
   254  	// Create port
   255  	port, err := CreatePort(t, client, network.ID, subnet.ID)
   256  	th.AssertNoErr(t, err)
   257  	defer DeletePort(t, client, port.ID)
   258  
   259  	tools.PrintResource(t, port)
   260  
   261  	// Add an address pair to the port
   262  	updateOpts := ports.UpdateOpts{
   263  		AllowedAddressPairs: &[]ports.AddressPair{
   264  			{IPAddress: "192.168.255.10", MACAddress: "aa:bb:cc:dd:ee:ff"},
   265  		},
   266  	}
   267  	newPort, err := ports.Update(client, port.ID, updateOpts).Extract()
   268  	th.AssertNoErr(t, err)
   269  
   270  	tools.PrintResource(t, newPort)
   271  
   272  	// Remove the address pair
   273  	var name = "some_port"
   274  	updateOpts = ports.UpdateOpts{
   275  		Name: &name,
   276  	}
   277  	newPort, err = ports.Update(client, port.ID, updateOpts).Extract()
   278  	th.AssertNoErr(t, err)
   279  
   280  	tools.PrintResource(t, newPort)
   281  
   282  	if len(newPort.AllowedAddressPairs) == 0 {
   283  		t.Fatalf("Address Pairs were removed")
   284  	}
   285  }
   286  
   287  func TestPortsPortSecurityCRUD(t *testing.T) {
   288  	client, err := clients.NewNetworkV2Client()
   289  	th.AssertNoErr(t, err)
   290  
   291  	// Create Network
   292  	network, err := CreateNetwork(t, client)
   293  	th.AssertNoErr(t, err)
   294  	defer DeleteNetwork(t, client, network.ID)
   295  
   296  	// Create Subnet
   297  	subnet, err := CreateSubnet(t, client, network.ID)
   298  	th.AssertNoErr(t, err)
   299  	defer DeleteSubnet(t, client, subnet.ID)
   300  
   301  	// Create port
   302  	port, err := CreatePortWithoutPortSecurity(t, client, network.ID, subnet.ID)
   303  	th.AssertNoErr(t, err)
   304  	defer DeletePort(t, client, port.ID)
   305  
   306  	var portWithExt struct {
   307  		ports.Port
   308  		portsecurity.PortSecurityExt
   309  	}
   310  
   311  	err = ports.Get(client, port.ID).ExtractInto(&portWithExt)
   312  	th.AssertNoErr(t, err)
   313  
   314  	tools.PrintResource(t, portWithExt)
   315  
   316  	iTrue := true
   317  	portUpdateOpts := ports.UpdateOpts{}
   318  	updateOpts := portsecurity.PortUpdateOptsExt{
   319  		UpdateOptsBuilder:   portUpdateOpts,
   320  		PortSecurityEnabled: &iTrue,
   321  	}
   322  
   323  	err = ports.Update(client, port.ID, updateOpts).ExtractInto(&portWithExt)
   324  	th.AssertNoErr(t, err)
   325  
   326  	tools.PrintResource(t, portWithExt)
   327  }
   328  
   329  func TestPortsWithExtraDHCPOptsCRUD(t *testing.T) {
   330  	client, err := clients.NewNetworkV2Client()
   331  	th.AssertNoErr(t, err)
   332  
   333  	// Create a Network
   334  	network, err := CreateNetwork(t, client)
   335  	th.AssertNoErr(t, err)
   336  	defer DeleteNetwork(t, client, network.ID)
   337  
   338  	// Create a Subnet
   339  	subnet, err := CreateSubnet(t, client, network.ID)
   340  	th.AssertNoErr(t, err)
   341  	defer DeleteSubnet(t, client, subnet.ID)
   342  
   343  	// Create a port with extra DHCP options.
   344  	port, err := CreatePortWithExtraDHCPOpts(t, client, network.ID, subnet.ID)
   345  	th.AssertNoErr(t, err)
   346  	defer DeletePort(t, client, port.ID)
   347  
   348  	tools.PrintResource(t, port)
   349  
   350  	// Update the port with extra DHCP options.
   351  	newPortName := tools.RandomString("TESTACC-", 8)
   352  	portUpdateOpts := ports.UpdateOpts{
   353  		Name: &newPortName,
   354  	}
   355  
   356  	existingOpt := port.ExtraDHCPOpts[0]
   357  	newOptValue := "test_value_2"
   358  
   359  	updateOpts := extradhcpopts.UpdateOptsExt{
   360  		UpdateOptsBuilder: portUpdateOpts,
   361  		ExtraDHCPOpts: []extradhcpopts.UpdateExtraDHCPOpt{
   362  			{
   363  				OptName:  existingOpt.OptName,
   364  				OptValue: nil,
   365  			},
   366  			{
   367  				OptName:  "test_option_2",
   368  				OptValue: &newOptValue,
   369  			},
   370  		},
   371  	}
   372  
   373  	newPort := &PortWithExtraDHCPOpts{}
   374  	err = ports.Update(client, port.ID, updateOpts).ExtractInto(newPort)
   375  	th.AssertNoErr(t, err)
   376  
   377  	tools.PrintResource(t, newPort)
   378  }
   379  
   380  func TestPortsRevision(t *testing.T) {
   381  	client, err := clients.NewNetworkV2Client()
   382  	th.AssertNoErr(t, err)
   383  
   384  	// Create Network
   385  	network, err := CreateNetwork(t, client)
   386  	th.AssertNoErr(t, err)
   387  	defer DeleteNetwork(t, client, network.ID)
   388  
   389  	// Create Subnet
   390  	subnet, err := CreateSubnet(t, client, network.ID)
   391  	th.AssertNoErr(t, err)
   392  	defer DeleteSubnet(t, client, subnet.ID)
   393  
   394  	// Create port
   395  	port, err := CreatePort(t, client, network.ID, subnet.ID)
   396  	th.AssertNoErr(t, err)
   397  	defer DeletePort(t, client, port.ID)
   398  
   399  	tools.PrintResource(t, port)
   400  
   401  	// Add an address pair to the port
   402  	// Use the RevisionNumber to test the revision / If-Match logic.
   403  	updateOpts := ports.UpdateOpts{
   404  		AllowedAddressPairs: &[]ports.AddressPair{
   405  			{IPAddress: "192.168.255.10", MACAddress: "aa:bb:cc:dd:ee:ff"},
   406  		},
   407  		RevisionNumber: &port.RevisionNumber,
   408  	}
   409  	newPort, err := ports.Update(client, port.ID, updateOpts).Extract()
   410  	th.AssertNoErr(t, err)
   411  
   412  	tools.PrintResource(t, newPort)
   413  
   414  	// Remove the address pair - this should fail due to old revision number.
   415  	updateOpts = ports.UpdateOpts{
   416  		AllowedAddressPairs: &[]ports.AddressPair{},
   417  		RevisionNumber:      &port.RevisionNumber,
   418  	}
   419  	newPort, err = ports.Update(client, port.ID, updateOpts).Extract()
   420  	th.AssertErr(t, err)
   421  	if !strings.Contains(err.Error(), "RevisionNumberConstraintFailed") {
   422  		t.Fatalf("expected to see an error of type RevisionNumberConstraintFailed, but got the following error instead: %v", err)
   423  	}
   424  
   425  	// The previous ports.Update returns an empty object, so get the port again.
   426  	newPort, err = ports.Get(client, port.ID).Extract()
   427  	th.AssertNoErr(t, err)
   428  	tools.PrintResource(t, newPort)
   429  
   430  	// When not specifying  a RevisionNumber, then the If-Match mechanism
   431  	// should be bypassed.
   432  	updateOpts = ports.UpdateOpts{
   433  		AllowedAddressPairs: &[]ports.AddressPair{},
   434  	}
   435  	newPort, err = ports.Update(client, port.ID, updateOpts).Extract()
   436  	th.AssertNoErr(t, err)
   437  
   438  	tools.PrintResource(t, newPort)
   439  
   440  	if len(newPort.AllowedAddressPairs) > 0 {
   441  		t.Fatalf("Unable to remove the address pair")
   442  	}
   443  }