@@ -22,14 +22,17 @@ import (
2222 "net/http"
2323 "net/http/httptest"
2424 "reflect"
25+ "slices"
2526 "sort"
2627 "testing"
2728
2829 "github.com/gophercloud/gophercloud/v2"
2930 "github.com/gophercloud/gophercloud/v2/openstack/compute/v2/servers"
3031 "github.com/gophercloud/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
3132 l3floatingips "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/layer3/floatingips"
33+ "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/ports"
3234 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
35+ "k8s.io/kops/cloudmock/openstack/mocknetworking"
3336 "k8s.io/kops/pkg/apis/kops"
3437 "k8s.io/kops/upup/pkg/fi"
3538 "k8s.io/kops/util/pkg/vfs"
@@ -662,3 +665,114 @@ func Test_BuildClients(t *testing.T) {
662665 })
663666 }
664667}
668+
669+ func setupMockCloudForDeletePortsTest (portDefinitions map [string ]map [string ]int ) (* MockCloud , error ) {
670+ cloud := InstallMockOpenstackCloud ("mock-central-1" )
671+ cloud .MockNeutronClient = mocknetworking .CreateClient ()
672+
673+ for clusterName , instanceGroups := range portDefinitions {
674+ for instanceGroup , n := range instanceGroups {
675+ for i := 0 ; i < n ; i ++ {
676+ port , err := cloud .CreatePort (ports.CreateOpts {
677+ Name : fmt .Sprintf ("port-%s-%d-%s" , instanceGroup , i + 1 , clusterName ),
678+ NetworkID : "mock-network-id" ,
679+ })
680+ if err != nil {
681+ return nil , fmt .Errorf ("error creating port: %v" , err )
682+ }
683+
684+ err = cloud .AppendTag (ResourceTypePort , port .ID , fmt .Sprintf ("%s=%s" , TagClusterName , clusterName ))
685+ if err != nil {
686+ return nil , fmt .Errorf ("error appending tag: %v" , err )
687+ }
688+ err = cloud .AppendTag (ResourceTypePort , port .ID , fmt .Sprintf ("%s=%s" , TagKopsInstanceGroup , instanceGroup ))
689+ if err != nil {
690+ return nil , fmt .Errorf ("error appending tag: %v" , err )
691+ }
692+ }
693+ }
694+ }
695+
696+ return cloud , nil
697+ }
698+
699+ func Test_deletePorts (t * testing.T ) {
700+ testCases := []struct {
701+ description string
702+ clusterName string
703+ instanceGroup string
704+ expectedPorts []string
705+ }{
706+ {
707+ description : "Only delete ports of worker IG of my-cluster" ,
708+ clusterName : "my-cluster" ,
709+ instanceGroup : "worker" ,
710+ expectedPorts : []string {
711+ "port-control-plane-0-1-my-cluster" ,
712+ "port-worker-2-1-my-cluster" ,
713+ "port-worker-2-2-my-cluster" ,
714+ "port-control-plane-0-1-my-cluster-2" ,
715+ "port-worker-1-my-cluster-2" ,
716+ "port-worker-2-my-cluster-2" ,
717+ "port-worker-2-1-my-cluster-2" ,
718+ "port-worker-2-2-my-cluster-2" ,
719+ },
720+ },
721+ {
722+ description : "Only delete ports of worker-2 IG of my-cluster" ,
723+ clusterName : "my-cluster" ,
724+ instanceGroup : "worker-2" ,
725+ expectedPorts : []string {
726+ "port-control-plane-0-1-my-cluster" ,
727+ "port-worker-1-my-cluster" ,
728+ "port-worker-2-my-cluster" ,
729+ "port-control-plane-0-1-my-cluster-2" ,
730+ "port-worker-1-my-cluster-2" ,
731+ "port-worker-2-my-cluster-2" ,
732+ "port-worker-2-1-my-cluster-2" ,
733+ "port-worker-2-2-my-cluster-2" ,
734+ },
735+ },
736+ }
737+
738+ portDefinitions := map [string ]map [string ]int {
739+ "my-cluster" : {
740+ "control-plane-0" : 1 ,
741+ "worker" : 2 ,
742+ "worker-2" : 2 ,
743+ },
744+ "my-cluster-2" : {
745+ "control-plane-0" : 1 ,
746+ "worker" : 2 ,
747+ "worker-2" : 2 ,
748+ },
749+ }
750+
751+ for _ , testCase := range testCases {
752+ t .Run (testCase .description , func (t * testing.T ) {
753+ cloud , err := setupMockCloudForDeletePortsTest (portDefinitions )
754+ if err != nil {
755+ t .Errorf ("error while setting up test: %v" , err )
756+ }
757+
758+ deletePorts (cloud , testCase .instanceGroup , testCase .clusterName )
759+
760+ allPorts , err := cloud .ListPorts (ports.ListOpts {})
761+ if err != nil {
762+ t .Errorf ("error while listing ports: %v" , err )
763+ }
764+
765+ actualPorts := []string {}
766+ for _ , port := range allPorts {
767+ actualPorts = append (actualPorts , port .Name )
768+ }
769+
770+ slices .Sort (actualPorts )
771+ slices .Sort (testCase .expectedPorts )
772+
773+ if ! reflect .DeepEqual (actualPorts , testCase .expectedPorts ) {
774+ t .Errorf ("ports differ: expected\n %+#v\n \t got:\n %+#v\n " , testCase .expectedPorts , actualPorts )
775+ }
776+ })
777+ }
778+ }
0 commit comments