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 }