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 }