@@ -28,6 +28,8 @@ import (
28
28
"strings"
29
29
"time"
30
30
31
+ "github.com/gophercloud/gophercloud"
32
+ "github.com/gophercloud/gophercloud/openstack"
31
33
"github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
32
34
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
33
35
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
@@ -424,9 +426,10 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
424
426
425
427
// Note that as the bootstrap config does not have cloud.conf, the node will not be added to the cluster.
426
428
// We still expect the port for the machine to be created.
429
+ machineDeployment := makeMachineDeployment (namespace .Name , md3Name , clusterName , "" , 1 )
427
430
framework .CreateMachineDeployment (ctx , framework.CreateMachineDeploymentInput {
428
431
Creator : e2eCtx .Environment .BootstrapClusterProxy .GetClient (),
429
- MachineDeployment : makeMachineDeployment ( namespace . Name , md3Name , clusterName , "" , 1 ) ,
432
+ MachineDeployment : machineDeployment ,
430
433
BootstrapConfigTemplate : makeJoinBootstrapConfigTemplate (namespace .Name , md3Name ),
431
434
InfraMachineTemplate : makeOpenStackMachineTemplateWithPortOptions (namespace .Name , clusterName , md3Name , customPortOptions , machineTags ),
432
435
})
@@ -440,33 +443,134 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
440
443
return len (plist )
441
444
}, e2eCtx .E2EConfig .GetIntervals (specName , "wait-worker-nodes" )... ).Should (Equal (1 ))
442
445
443
- port := plist [0 ]
444
- Expect (port .Description ).To (Equal ("primary" ))
445
- Expect (port .Tags ).To (ContainElement (testTag ))
446
+ primaryPort := plist [0 ]
447
+ Expect (primaryPort .Description ).To (Equal ("primary" ))
448
+ Expect (primaryPort .Tags ).To (ContainElement (testTag ))
446
449
447
450
// assert trunked port is created.
448
451
Eventually (func () int {
449
452
plist , err = shared .DumpOpenStackPorts (e2eCtx , ports.ListOpts {Description : "trunked" , Tags : testTag })
450
453
Expect (err ).To (BeNil ())
451
454
return len (plist )
452
455
}, e2eCtx .E2EConfig .GetIntervals (specName , "wait-worker-nodes" )... ).Should (Equal (1 ))
453
- port = plist [0 ]
454
- Expect (port .Description ).To (Equal ("trunked" ))
455
- Expect (port .Tags ).To (ContainElement (testTag ))
456
+ trunkedPort : = plist [0 ]
457
+ Expect (trunkedPort .Description ).To (Equal ("trunked" ))
458
+ Expect (trunkedPort .Tags ).To (ContainElement (testTag ))
456
459
457
460
// assert trunk data.
458
461
var trunk * trunks.Trunk
459
462
Eventually (func () int {
460
- trunk , err = shared .DumpOpenStackTrunks (e2eCtx , port .ID )
463
+ trunk , err = shared .DumpOpenStackTrunks (e2eCtx , trunkedPort .ID )
461
464
Expect (err ).To (BeNil ())
462
465
Expect (trunk ).NotTo (BeNil ())
463
466
return 1
464
467
}, e2eCtx .E2EConfig .GetIntervals (specName , "wait-worker-nodes" )... ).Should (Equal (1 ))
465
- Expect (trunk .PortID ).To (Equal (port .ID ))
468
+ Expect (trunk .PortID ).To (Equal (trunkedPort .ID ))
469
+
466
470
// assert port level security group is created by name using SecurityGroupFilters
471
+
467
472
securityGroupsList , err := shared .DumpOpenStackSecurityGroups (e2eCtx , groups.ListOpts {Name : testSecurityGroupName })
468
473
Expect (err ).NotTo (HaveOccurred ())
469
474
Expect (securityGroupsList ).To (HaveLen (1 ))
475
+
476
+ // Testing subports
477
+ shared .Logf ("Create a new port and add it as a subport of the trunk" )
478
+
479
+ providerClient , clientOpts , _ , err := shared .GetTenantProviderClient (e2eCtx )
480
+ Expect (err ).To (BeNil (), "Cannot create providerClient" )
481
+
482
+ networkClient , err := openstack .NewNetworkV2 (providerClient , gophercloud.EndpointOpts {
483
+ Region : clientOpts .RegionName ,
484
+ })
485
+ Expect (err ).To (BeNil (), "Cannot create network client" )
486
+
487
+ networksList , err := shared .DumpOpenStackNetworks (
488
+ e2eCtx ,
489
+ networks.ListOpts {
490
+ TenantID : securityGroupsList [0 ].TenantID ,
491
+ },
492
+ )
493
+ Expect (err ).To (BeNil (), "Cannot get network List" )
494
+
495
+ createOpts := ports.CreateOpts {
496
+ Name : "subPort" ,
497
+ NetworkID : networksList [0 ].ID ,
498
+ }
499
+
500
+ subPort , err := ports .Create (networkClient , createOpts ).Extract ()
501
+ Expect (err ).To (BeNil (), "Cannot create subPort" )
502
+
503
+ addSubportsOpts := trunks.AddSubportsOpts {
504
+ Subports : []trunks.Subport {
505
+ {
506
+ SegmentationID : 1 ,
507
+ SegmentationType : "vlan" ,
508
+ PortID : subPort .ID ,
509
+ },
510
+ },
511
+ }
512
+ shared .Logf ("Add subport to trunk" )
513
+ _ , err = trunks .AddSubports (networkClient , trunk .ID , addSubportsOpts ).Extract ()
514
+ Expect (err ).To (BeNil (), "Cannot add subports" )
515
+
516
+ subports , err := trunks .GetSubports (networkClient , trunk .ID ).Extract ()
517
+ Expect (err ).To (BeNil ())
518
+ Expect (subports ).To (HaveLen (1 ))
519
+
520
+ shared .Logf ("Get machine object from MachineDeployments" )
521
+ c := e2eCtx .Environment .BootstrapClusterProxy .GetClient ()
522
+
523
+ machines := framework .GetMachinesByMachineDeployments (ctx , framework.GetMachinesByMachineDeploymentsInput {
524
+ Lister : c ,
525
+ ClusterName : clusterName ,
526
+ Namespace : namespace .Name ,
527
+ MachineDeployment : * machineDeployment ,
528
+ })
529
+
530
+ Expect (machines ).To (HaveLen (1 ))
531
+
532
+ machine := machines [0 ]
533
+
534
+ shared .Logf ("Fetching serverID" )
535
+ allServers , err := shared .DumpOpenStackServers (e2eCtx , servers.ListOpts {Name : machine .Spec .InfrastructureRef .Name })
536
+ Expect (err ).To (BeNil ())
537
+
538
+ Expect (allServers ).To (HaveLen (1 ))
539
+ serverID := allServers [0 ].ID
540
+ Expect (err ).To (BeNil ())
541
+
542
+ shared .Logf ("Deleting the machine deployment, which should trigger trunk deletion" )
543
+
544
+ err = c .Delete (ctx , machineDeployment )
545
+ Expect (err ).To (BeNil ())
546
+
547
+ shared .Logf ("Waiting for the server to be cleaned" )
548
+
549
+ computeClient , err := openstack .NewComputeV2 (providerClient , gophercloud.EndpointOpts {
550
+ Region : clientOpts .RegionName ,
551
+ })
552
+ Expect (err ).To (BeNil (), "Cannot create compute client" )
553
+
554
+ Eventually (
555
+ func () bool {
556
+ _ , err := servers .Get (computeClient , serverID ).Extract ()
557
+ _ , ok := err .(gophercloud.ErrDefault404 )
558
+ return ok
559
+ }, e2eCtx .E2EConfig .GetIntervals (specName , "wait-delete-cluster" )... ,
560
+ ).Should (BeTrue ())
561
+
562
+ // Wait here for some time, to make sure the reconciler fully cleans everything
563
+ time .Sleep (10 * time .Second )
564
+
565
+ // Verify that the trunk is deleted
566
+ _ , err = trunks .Get (networkClient , trunk .ID ).Extract ()
567
+ _ , ok := err .(gophercloud.ErrDefault404 )
568
+ Expect (ok ).To (BeTrue ())
569
+
570
+ // Verify that subPort is deleted
571
+ _ , err = ports .Get (networkClient , subPort .ID ).Extract ()
572
+ _ , ok = err .(gophercloud.ErrDefault404 )
573
+ Expect (ok ).To (BeTrue ())
470
574
})
471
575
})
472
576
0 commit comments