sigs.k8s.io/cluster-api-provider-azure@v1.14.3/azure/services/fleetsmembers/spec_test.go (about)

     1  /*
     2  Copyright 2023 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package fleetsmembers
    18  
    19  import (
    20  	"context"
    21  	"testing"
    22  
    23  	asocontainerservicev1 "github.com/Azure/azure-service-operator/v2/api/containerservice/v1api20230315preview"
    24  	"github.com/Azure/azure-service-operator/v2/pkg/genruntime"
    25  	. "github.com/onsi/gomega"
    26  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    27  	"k8s.io/utils/ptr"
    28  	"sigs.k8s.io/cluster-api-provider-azure/azure"
    29  )
    30  
    31  var (
    32  	fakeAzureFleetsMember = asocontainerservicev1.FleetsMember{
    33  		Spec: asocontainerservicev1.Fleets_Member_Spec{
    34  			AzureName: fakeAzureFleetsMemberSpec.Name,
    35  			Owner: &genruntime.KnownResourceReference{
    36  				ARMID: azure.FleetID(fakeAzureFleetsMemberSpec.SubscriptionID, fakeAzureFleetsMemberSpec.ManagerResourceGroup, fakeAzureFleetsMemberSpec.ManagerName),
    37  			},
    38  			Group: ptr.To(fakeAzureFleetsMemberSpec.Group),
    39  			ClusterResourceReference: &genruntime.ResourceReference{
    40  				ARMID: azure.ManagedClusterID(fakeAzureFleetsMemberSpec.SubscriptionID, fakeAzureFleetsMemberSpec.ClusterResourceGroup, fakeAzureFleetsMemberSpec.ClusterName),
    41  			},
    42  		},
    43  	}
    44  	fakeAzureFleetsMemberSpec = AzureFleetsMemberSpec{
    45  		Name:                 "fake-name",
    46  		ClusterName:          "fake-cluster-name",
    47  		ClusterResourceGroup: "fake-cluster-resource-group",
    48  		Group:                "fake-group",
    49  		SubscriptionID:       "fake-subscription-id",
    50  		ManagerName:          "fake-manager-name",
    51  		ManagerResourceGroup: "fake-manager-resource-group",
    52  	}
    53  	fakeFleetsMemberStatus = asocontainerservicev1.Fleets_Member_STATUS{
    54  		Name:              ptr.To(fakeAzureFleetsMemberSpec.Name),
    55  		ProvisioningState: ptr.To(asocontainerservicev1.FleetMemberProvisioningState_STATUS_Succeeded),
    56  	}
    57  )
    58  
    59  func getASOFleetsMember(changes ...func(*asocontainerservicev1.FleetsMember)) *asocontainerservicev1.FleetsMember {
    60  	fleetsMember := fakeAzureFleetsMember.DeepCopy()
    61  	for _, change := range changes {
    62  		change(fleetsMember)
    63  	}
    64  	return fleetsMember
    65  }
    66  
    67  func TestAzureFleetsMemberSpec_Parameters(t *testing.T) {
    68  	testcases := []struct {
    69  		name          string
    70  		spec          *AzureFleetsMemberSpec
    71  		existing      *asocontainerservicev1.FleetsMember
    72  		expect        func(g *WithT, result asocontainerservicev1.FleetsMember)
    73  		expectedError string
    74  	}{
    75  		{
    76  			name:     "Creating a new FleetsMember",
    77  			spec:     &fakeAzureFleetsMemberSpec,
    78  			existing: nil,
    79  			expect: func(g *WithT, result asocontainerservicev1.FleetsMember) {
    80  				g.Expect(result).To(Not(BeNil()))
    81  
    82  				// ObjectMeta is populated later in the codeflow
    83  				g.Expect(result.ObjectMeta).To(Equal(metav1.ObjectMeta{}))
    84  
    85  				// Spec is populated from the spec passed in
    86  				g.Expect(result.Spec).To(Equal(getASOFleetsMember().Spec))
    87  			},
    88  		},
    89  		{
    90  			name: "User updates to a FleetsMember group should be overwritten",
    91  			spec: &fakeAzureFleetsMemberSpec,
    92  			existing: getASOFleetsMember(
    93  				// user added group which should be overwritten by capz
    94  				func(fleetsMember *asocontainerservicev1.FleetsMember) {
    95  					fleetsMember.Spec.Group = ptr.To("fake-group-2")
    96  				},
    97  				// user added Status
    98  				func(fleetsMember *asocontainerservicev1.FleetsMember) {
    99  					fleetsMember.Status = fakeFleetsMemberStatus
   100  				},
   101  			),
   102  			expect: func(g *WithT, result asocontainerservicev1.FleetsMember) {
   103  				g.Expect(result).To(Not(BeNil()))
   104  				resultantASOFleetsMember := getASOFleetsMember()
   105  
   106  				// ObjectMeta should be carried over from existing fleets member.
   107  				g.Expect(result.ObjectMeta).To(Equal(resultantASOFleetsMember.ObjectMeta))
   108  
   109  				// Group addition is accepted.
   110  				g.Expect(result.Spec).To(Equal(resultantASOFleetsMember.Spec))
   111  
   112  				// Status should be carried over.
   113  				g.Expect(result.Status).To(Equal(fakeFleetsMemberStatus))
   114  			},
   115  		},
   116  	}
   117  	for _, tc := range testcases {
   118  		tc := tc
   119  		t.Run(tc.name, func(t *testing.T) {
   120  			g := NewWithT(t)
   121  			t.Parallel()
   122  
   123  			result, err := tc.spec.Parameters(context.TODO(), tc.existing)
   124  			if tc.expectedError != "" {
   125  				g.Expect(err).To(HaveOccurred())
   126  				g.Expect(err).To(MatchError(tc.expectedError))
   127  			} else {
   128  				g.Expect(err).NotTo(HaveOccurred())
   129  			}
   130  			tc.expect(g, *result)
   131  		})
   132  	}
   133  }