@@ -28,6 +28,8 @@ import (
2828 "strings"
2929 "time"
3030
31+ "github.com/gophercloud/gophercloud"
32+ "github.com/gophercloud/gophercloud/openstack"
3133 "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
3234 "github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
3335 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
@@ -424,9 +426,10 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
424426
425427 // Note that as the bootstrap config does not have cloud.conf, the node will not be added to the cluster.
426428 // We still expect the port for the machine to be created.
429+ machineDeployment := makeMachineDeployment (namespace .Name , md3Name , clusterName , "" , 1 )
427430 framework .CreateMachineDeployment (ctx , framework.CreateMachineDeploymentInput {
428431 Creator : e2eCtx .Environment .BootstrapClusterProxy .GetClient (),
429- MachineDeployment : makeMachineDeployment ( namespace . Name , md3Name , clusterName , "" , 1 ) ,
432+ MachineDeployment : machineDeployment ,
430433 BootstrapConfigTemplate : makeJoinBootstrapConfigTemplate (namespace .Name , md3Name ),
431434 InfraMachineTemplate : makeOpenStackMachineTemplateWithPortOptions (namespace .Name , clusterName , md3Name , customPortOptions , machineTags ),
432435 })
@@ -440,33 +443,134 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
440443 return len (plist )
441444 }, e2eCtx .E2EConfig .GetIntervals (specName , "wait-worker-nodes" )... ).Should (Equal (1 ))
442445
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 ))
446449
447450 // assert trunked port is created.
448451 Eventually (func () int {
449452 plist , err = shared .DumpOpenStackPorts (e2eCtx , ports.ListOpts {Description : "trunked" , Tags : testTag })
450453 Expect (err ).To (BeNil ())
451454 return len (plist )
452455 }, 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 ))
456459
457460 // assert trunk data.
458461 var trunk * trunks.Trunk
459462 Eventually (func () int {
460- trunk , err = shared .DumpOpenStackTrunks (e2eCtx , port .ID )
463+ trunk , err = shared .DumpOpenStackTrunks (e2eCtx , trunkedPort .ID )
461464 Expect (err ).To (BeNil ())
462465 Expect (trunk ).NotTo (BeNil ())
463466 return 1
464467 }, 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+
466470 // assert port level security group is created by name using SecurityGroupFilters
471+
467472 securityGroupsList , err := shared .DumpOpenStackSecurityGroups (e2eCtx , groups.ListOpts {Name : testSecurityGroupName })
468473 Expect (err ).NotTo (HaveOccurred ())
469474 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 ())
470574 })
471575 })
472576
0 commit comments