@@ -28,6 +28,8 @@ import (
2828 "strings"
2929 "time"
3030
31+ "github.com/gophercloud/gophercloud/v2"
32+ "github.com/gophercloud/gophercloud/v2/openstack"
3133 "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes"
3234 "github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
3335 "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/routers"
@@ -482,9 +484,10 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
482484
483485 // Note that as the bootstrap config does not have cloud.conf, the node will not be added to the cluster.
484486 // We still expect the port for the machine to be created.
487+ machineDeployment := makeMachineDeployment (namespace .Name , md3Name , clusterName , "" , 1 )
485488 framework .CreateMachineDeployment (ctx , framework.CreateMachineDeploymentInput {
486489 Creator : e2eCtx .Environment .BootstrapClusterProxy .GetClient (),
487- MachineDeployment : makeMachineDeployment ( namespace . Name , md3Name , clusterName , "" , 1 ) ,
490+ MachineDeployment : machineDeployment ,
488491 BootstrapConfigTemplate : makeJoinBootstrapConfigTemplate (namespace .Name , md3Name ),
489492 InfraMachineTemplate : makeOpenStackMachineTemplateWithPortOptions (namespace .Name , clusterName , md3Name , customPortOptions , machineTags ),
490493 })
@@ -498,33 +501,130 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
498501 return len (plist )
499502 }, e2eCtx .E2EConfig .GetIntervals (specName , "wait-worker-nodes" )... ).Should (Equal (1 ))
500503
501- port := plist [0 ]
502- Expect (port .Description ).To (Equal ("primary" ))
503- Expect (port .Tags ).To (ContainElement (testTag ))
504+ primaryPort := plist [0 ]
505+ Expect (primaryPort .Description ).To (Equal ("primary" ))
506+ Expect (primaryPort .Tags ).To (ContainElement (testTag ))
504507
505508 // assert trunked port is created.
506509 Eventually (func () int {
507510 plist , err = shared .DumpOpenStackPorts (e2eCtx , ports.ListOpts {Description : "trunked" , Tags : testTag })
508511 Expect (err ).To (BeNil ())
509512 return len (plist )
510513 }, e2eCtx .E2EConfig .GetIntervals (specName , "wait-worker-nodes" )... ).Should (Equal (1 ))
511- port = plist [0 ]
512- Expect (port .Description ).To (Equal ("trunked" ))
513- Expect (port .Tags ).To (ContainElement (testTag ))
514+ trunkedPort : = plist [0 ]
515+ Expect (trunkedPort .Description ).To (Equal ("trunked" ))
516+ Expect (trunkedPort .Tags ).To (ContainElement (testTag ))
514517
515518 // assert trunk data.
516519 var trunk * trunks.Trunk
517520 Eventually (func () int {
518- trunk , err = shared .DumpOpenStackTrunks (e2eCtx , port .ID )
521+ trunk , err = shared .DumpOpenStackTrunks (e2eCtx , trunkedPort .ID )
519522 Expect (err ).To (BeNil ())
520523 Expect (trunk ).NotTo (BeNil ())
521524 return 1
522525 }, e2eCtx .E2EConfig .GetIntervals (specName , "wait-worker-nodes" )... ).Should (Equal (1 ))
523- Expect (trunk .PortID ).To (Equal (port .ID ))
526+ Expect (trunk .PortID ).To (Equal (trunkedPort .ID ))
527+
524528 // assert port level security group is created by name using SecurityGroupFilters
529+
525530 securityGroupsList , err := shared .DumpOpenStackSecurityGroups (e2eCtx , groups.ListOpts {Name : testSecurityGroupName })
526531 Expect (err ).NotTo (HaveOccurred ())
527532 Expect (securityGroupsList ).To (HaveLen (1 ))
533+
534+ // Testing subports
535+ shared .Logf ("Create a new port and add it as a subport of the trunk" )
536+
537+ providerClient , clientOpts , _ , err := shared .GetTenantProviderClient (e2eCtx )
538+ Expect (err ).To (BeNil (), "Cannot create providerClient" )
539+
540+ networkClient , err := openstack .NewNetworkV2 (providerClient , gophercloud.EndpointOpts {
541+ Region : clientOpts .RegionName ,
542+ })
543+ Expect (err ).To (BeNil (), "Cannot create network client" )
544+
545+ networksList , err := shared .DumpOpenStackNetworks (
546+ e2eCtx ,
547+ networks.ListOpts {
548+ TenantID : securityGroupsList [0 ].TenantID ,
549+ },
550+ )
551+ Expect (err ).To (BeNil (), "Cannot get network List" )
552+
553+ createOpts := ports.CreateOpts {
554+ Name : "subPort" ,
555+ NetworkID : networksList [0 ].ID ,
556+ }
557+
558+ subPort , err := ports .Create (ctx , networkClient , createOpts ).Extract ()
559+ Expect (err ).To (BeNil (), "Cannot create subPort" )
560+
561+ addSubportsOpts := trunks.AddSubportsOpts {
562+ Subports : []trunks.Subport {
563+ {
564+ SegmentationID : 1 ,
565+ SegmentationType : "vlan" ,
566+ PortID : subPort .ID ,
567+ },
568+ },
569+ }
570+ shared .Logf ("Add subport to trunk" )
571+ _ , err = trunks .AddSubports (ctx , networkClient , trunk .ID , addSubportsOpts ).Extract ()
572+ Expect (err ).To (BeNil (), "Cannot add subports" )
573+
574+ subports , err := trunks .GetSubports (ctx , networkClient , trunk .ID ).Extract ()
575+ Expect (err ).To (BeNil ())
576+ Expect (subports ).To (HaveLen (1 ))
577+
578+ shared .Logf ("Get machine object from MachineDeployments" )
579+ c := e2eCtx .Environment .BootstrapClusterProxy .GetClient ()
580+
581+ machines := framework .GetMachinesByMachineDeployments (ctx , framework.GetMachinesByMachineDeploymentsInput {
582+ Lister : c ,
583+ ClusterName : clusterName ,
584+ Namespace : namespace .Name ,
585+ MachineDeployment : * machineDeployment ,
586+ })
587+
588+ Expect (machines ).To (HaveLen (1 ))
589+
590+ machine := machines [0 ]
591+
592+ shared .Logf ("Fetching serverID" )
593+ allServers , err := shared .DumpOpenStackServers (e2eCtx , servers.ListOpts {Name : machine .Name })
594+ Expect (err ).To (BeNil ())
595+ Expect (allServers ).To (HaveLen (1 ))
596+ serverID := allServers [0 ].ID
597+ Expect (err ).To (BeNil ())
598+
599+ shared .Logf ("Deleting the machine deployment, which should trigger trunk deletion" )
600+
601+ err = c .Delete (ctx , machineDeployment )
602+ Expect (err ).To (BeNil ())
603+
604+ shared .Logf ("Waiting for the server to be cleaned" )
605+
606+ computeClient , err := openstack .NewComputeV2 (providerClient , gophercloud.EndpointOpts {
607+ Region : clientOpts .RegionName ,
608+ })
609+ Expect (err ).To (BeNil (), "Cannot create compute client" )
610+
611+ Eventually (
612+ func () bool {
613+ _ , err := servers .Get (ctx , computeClient , serverID ).Extract ()
614+ return gophercloud .ResponseCodeIs (err , 404 )
615+ }, e2eCtx .E2EConfig .GetIntervals (specName , "wait-delete-cluster" )... ,
616+ ).Should (BeTrue ())
617+
618+ // Wait here for some time, to make sure the reconciler fully cleans everything
619+ time .Sleep (10 * time .Second )
620+
621+ // Verify that the trunk is deleted
622+ _ , err = trunks .Get (ctx , networkClient , trunk .ID ).Extract ()
623+ Expect (gophercloud .ResponseCodeIs (err , 404 )).To (BeTrue ())
624+
625+ // Verify that subPort is deleted
626+ _ , err = ports .Get (ctx , networkClient , subPort .ID ).Extract ()
627+ Expect (gophercloud .ResponseCodeIs (err , 404 )).To (BeTrue ())
528628 })
529629 })
530630
0 commit comments