@@ -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"
@@ -429,9 +431,10 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
429431
430432 // Note that as the bootstrap config does not have cloud.conf, the node will not be added to the cluster.
431433 // We still expect the port for the machine to be created.
434+ machineDeployment := makeMachineDeployment (namespace .Name , md3Name , clusterName , "" , 1 )
432435 framework .CreateMachineDeployment (ctx , framework.CreateMachineDeploymentInput {
433436 Creator : e2eCtx .Environment .BootstrapClusterProxy .GetClient (),
434- MachineDeployment : makeMachineDeployment ( namespace . Name , md3Name , clusterName , "" , 1 ) ,
437+ MachineDeployment : machineDeployment ,
435438 BootstrapConfigTemplate : makeJoinBootstrapConfigTemplate (namespace .Name , md3Name ),
436439 InfraMachineTemplate : makeOpenStackMachineTemplateWithPortOptions (namespace .Name , clusterName , md3Name , customPortOptions , machineTags ),
437440 })
@@ -445,33 +448,130 @@ var _ = Describe("e2e tests [PR-Blocking]", func() {
445448 return len (plist )
446449 }, e2eCtx .E2EConfig .GetIntervals (specName , "wait-worker-nodes" )... ).Should (Equal (1 ))
447450
448- port := plist [0 ]
449- Expect (port .Description ).To (Equal ("primary" ))
450- Expect (port .Tags ).To (ContainElement (testTag ))
451+ primaryPort := plist [0 ]
452+ Expect (primaryPort .Description ).To (Equal ("primary" ))
453+ Expect (primaryPort .Tags ).To (ContainElement (testTag ))
451454
452455 // assert trunked port is created.
453456 Eventually (func () int {
454457 plist , err = shared .DumpOpenStackPorts (e2eCtx , ports.ListOpts {Description : "trunked" , Tags : testTag })
455458 Expect (err ).To (BeNil ())
456459 return len (plist )
457460 }, e2eCtx .E2EConfig .GetIntervals (specName , "wait-worker-nodes" )... ).Should (Equal (1 ))
458- port = plist [0 ]
459- Expect (port .Description ).To (Equal ("trunked" ))
460- Expect (port .Tags ).To (ContainElement (testTag ))
461+ trunkedPort : = plist [0 ]
462+ Expect (trunkedPort .Description ).To (Equal ("trunked" ))
463+ Expect (trunkedPort .Tags ).To (ContainElement (testTag ))
461464
462465 // assert trunk data.
463466 var trunk * trunks.Trunk
464467 Eventually (func () int {
465- trunk , err = shared .DumpOpenStackTrunks (e2eCtx , port .ID )
468+ trunk , err = shared .DumpOpenStackTrunks (e2eCtx , trunkedPort .ID )
466469 Expect (err ).To (BeNil ())
467470 Expect (trunk ).NotTo (BeNil ())
468471 return 1
469472 }, e2eCtx .E2EConfig .GetIntervals (specName , "wait-worker-nodes" )... ).Should (Equal (1 ))
470- Expect (trunk .PortID ).To (Equal (port .ID ))
473+ Expect (trunk .PortID ).To (Equal (trunkedPort .ID ))
474+
471475 // assert port level security group is created by name using SecurityGroupFilters
476+
472477 securityGroupsList , err := shared .DumpOpenStackSecurityGroups (e2eCtx , groups.ListOpts {Name : testSecurityGroupName })
473478 Expect (err ).NotTo (HaveOccurred ())
474479 Expect (securityGroupsList ).To (HaveLen (1 ))
480+
481+ // Testing subports
482+ shared .Logf ("Create a new port and add it as a subport of the trunk" )
483+
484+ providerClient , clientOpts , _ , err := shared .GetTenantProviderClient (e2eCtx )
485+ Expect (err ).To (BeNil (), "Cannot create providerClient" )
486+
487+ networkClient , err := openstack .NewNetworkV2 (providerClient , gophercloud.EndpointOpts {
488+ Region : clientOpts .RegionName ,
489+ })
490+ Expect (err ).To (BeNil (), "Cannot create network client" )
491+
492+ networksList , err := shared .DumpOpenStackNetworks (
493+ e2eCtx ,
494+ networks.ListOpts {
495+ TenantID : securityGroupsList [0 ].TenantID ,
496+ },
497+ )
498+ Expect (err ).To (BeNil (), "Cannot get network List" )
499+
500+ createOpts := ports.CreateOpts {
501+ Name : "subPort" ,
502+ NetworkID : networksList [0 ].ID ,
503+ }
504+
505+ subPort , err := ports .Create (ctx , networkClient , createOpts ).Extract ()
506+ Expect (err ).To (BeNil (), "Cannot create subPort" )
507+
508+ addSubportsOpts := trunks.AddSubportsOpts {
509+ Subports : []trunks.Subport {
510+ {
511+ SegmentationID : 1 ,
512+ SegmentationType : "vlan" ,
513+ PortID : subPort .ID ,
514+ },
515+ },
516+ }
517+ shared .Logf ("Add subport to trunk" )
518+ _ , err = trunks .AddSubports (ctx , networkClient , trunk .ID , addSubportsOpts ).Extract ()
519+ Expect (err ).To (BeNil (), "Cannot add subports" )
520+
521+ subports , err := trunks .GetSubports (ctx , networkClient , trunk .ID ).Extract ()
522+ Expect (err ).To (BeNil ())
523+ Expect (subports ).To (HaveLen (1 ))
524+
525+ shared .Logf ("Get machine object from MachineDeployments" )
526+ c := e2eCtx .Environment .BootstrapClusterProxy .GetClient ()
527+
528+ machines := framework .GetMachinesByMachineDeployments (ctx , framework.GetMachinesByMachineDeploymentsInput {
529+ Lister : c ,
530+ ClusterName : clusterName ,
531+ Namespace : namespace .Name ,
532+ MachineDeployment : * machineDeployment ,
533+ })
534+
535+ Expect (machines ).To (HaveLen (1 ))
536+
537+ machine := machines [0 ]
538+
539+ shared .Logf ("Fetching serverID" )
540+ allServers , err := shared .DumpOpenStackServers (e2eCtx , servers.ListOpts {Name : machine .Name })
541+ Expect (err ).To (BeNil ())
542+ Expect (allServers ).To (HaveLen (1 ))
543+ serverID := allServers [0 ].ID
544+ Expect (err ).To (BeNil ())
545+
546+ shared .Logf ("Deleting the machine deployment, which should trigger trunk deletion" )
547+
548+ err = c .Delete (ctx , machineDeployment )
549+ Expect (err ).To (BeNil ())
550+
551+ shared .Logf ("Waiting for the server to be cleaned" )
552+
553+ computeClient , err := openstack .NewComputeV2 (providerClient , gophercloud.EndpointOpts {
554+ Region : clientOpts .RegionName ,
555+ })
556+ Expect (err ).To (BeNil (), "Cannot create compute client" )
557+
558+ Eventually (
559+ func () bool {
560+ _ , err := servers .Get (ctx , computeClient , serverID ).Extract ()
561+ return gophercloud .ResponseCodeIs (err , 404 )
562+ }, e2eCtx .E2EConfig .GetIntervals (specName , "wait-delete-cluster" )... ,
563+ ).Should (BeTrue ())
564+
565+ // Wait here for some time, to make sure the reconciler fully cleans everything
566+ time .Sleep (10 * time .Second )
567+
568+ // Verify that the trunk is deleted
569+ _ , err = trunks .Get (ctx , networkClient , trunk .ID ).Extract ()
570+ Expect (gophercloud .ResponseCodeIs (err , 404 )).To (BeTrue ())
571+
572+ // Verify that subPort is deleted
573+ _ , err = ports .Get (ctx , networkClient , subPort .ID ).Extract ()
574+ Expect (gophercloud .ResponseCodeIs (err , 404 )).To (BeTrue ())
475575 })
476576 })
477577
0 commit comments