sigs.k8s.io/cluster-api-provider-azure@v1.14.3/test/e2e/aks_fleets_member.go (about) 1 //go:build e2e 2 // +build e2e 3 4 /* 5 Copyright 2023 The Kubernetes Authors. 6 7 Licensed under the Apache License, Version 2.0 (the "License"); 8 you may not use this file except in compliance with the License. 9 You may obtain a copy of the License at 10 11 http://www.apache.org/licenses/LICENSE-2.0 12 13 Unless required by applicable law or agreed to in writing, software 14 distributed under the License is distributed on an "AS IS" BASIS, 15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 See the License for the specific language governing permissions and 17 limitations under the License. 18 */ 19 20 package e2e 21 22 import ( 23 "context" 24 "os" 25 26 "github.com/Azure/azure-sdk-for-go/sdk/azidentity" 27 "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v4" 28 "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet" 29 "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources" 30 . "github.com/onsi/ginkgo/v2" 31 . "github.com/onsi/gomega" 32 "k8s.io/apimachinery/pkg/types" 33 "k8s.io/utils/ptr" 34 infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1" 35 "sigs.k8s.io/cluster-api-provider-azure/azure" 36 clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" 37 "sigs.k8s.io/cluster-api/util/conditions" 38 "sigs.k8s.io/controller-runtime/pkg/client" 39 ) 40 41 type AKSFleetsMemberInput struct { 42 Cluster *clusterv1.Cluster 43 WaitIntervals []interface{} 44 } 45 46 const ( 47 fleetName = "capz-aks-fleets-manager" 48 updateGroupName = "capz-aks-fleets-member-update" 49 ) 50 51 func AKSFleetsMemberSpec(ctx context.Context, inputGetter func() AKSFleetsMemberInput) { 52 input := inputGetter() 53 54 cred, err := azidentity.NewDefaultAzureCredential(nil) 55 Expect(err).NotTo(HaveOccurred()) 56 57 mgmtClient := bootstrapClusterProxy.GetClient() 58 Expect(mgmtClient).NotTo(BeNil()) 59 60 containerserviceClient, err := armcontainerservice.NewManagedClustersClient(getSubscriptionID(Default), cred, nil) 61 Expect(err).NotTo(HaveOccurred()) 62 63 amcp := &infrav1.AzureManagedControlPlane{} 64 err = mgmtClient.Get(ctx, types.NamespacedName{ 65 Namespace: input.Cluster.Spec.ControlPlaneRef.Namespace, 66 Name: input.Cluster.Spec.ControlPlaneRef.Name, 67 }, amcp) 68 Expect(err).NotTo(HaveOccurred()) 69 70 groupClient, err := armresources.NewResourceGroupsClient(getSubscriptionID(Default), cred, nil) 71 Expect(err).NotTo(HaveOccurred()) 72 73 By("Creating a resource group") 74 groupName := "capz-aks-fleets-member-" + amcp.Spec.ResourceGroupName 75 _, err = groupClient.CreateOrUpdate(ctx, groupName, armresources.ResourceGroup{ 76 Location: ptr.To(os.Getenv(AzureLocation)), 77 Tags: map[string]*string{ 78 "jobName": ptr.To(os.Getenv(JobName)), 79 "creationTimestamp": ptr.To(os.Getenv(Timestamp)), 80 }, 81 }, nil) 82 Expect(err).NotTo(HaveOccurred()) 83 84 fleetClient, err := armcontainerservicefleet.NewFleetsClient(getSubscriptionID(Default), cred, nil) 85 Expect(err).NotTo(HaveOccurred()) 86 87 fleetsMemberClient, err := armcontainerservicefleet.NewFleetMembersClient(getSubscriptionID(Default), cred, nil) 88 Expect(err).NotTo(HaveOccurred()) 89 90 By("Creating a fleet manager") 91 poller, err := fleetClient.BeginCreateOrUpdate(ctx, groupName, fleetName, armcontainerservicefleet.Fleet{ 92 Location: ptr.To(os.Getenv(AzureLocation)), 93 }, nil) 94 Expect(err).NotTo(HaveOccurred()) 95 _, err = poller.PollUntilDone(ctx, nil) 96 Expect(err).NotTo(HaveOccurred()) 97 98 By("Joining the cluster to the fleet hub") 99 var infraControlPlane = &infrav1.AzureManagedControlPlane{} 100 Eventually(func(g Gomega) { 101 err = mgmtClient.Get(ctx, client.ObjectKey{Namespace: input.Cluster.Spec.ControlPlaneRef.Namespace, Name: input.Cluster.Spec.ControlPlaneRef.Name}, infraControlPlane) 102 g.Expect(err).NotTo(HaveOccurred()) 103 infraControlPlane.Spec.FleetsMember = &infrav1.FleetsMember{ 104 FleetsMemberClassSpec: infrav1.FleetsMemberClassSpec{ 105 ManagerName: fleetName, 106 ManagerResourceGroup: groupName, 107 Group: updateGroupName, 108 }, 109 } 110 g.Expect(mgmtClient.Update(ctx, infraControlPlane)).To(Succeed()) 111 g.Expect(conditions.IsTrue(infraControlPlane, infrav1.FleetReadyCondition)).To(BeTrue()) 112 }, input.WaitIntervals...).Should(Succeed()) 113 114 By("Ensuring the fleet member is created and attached to the managed cluster") 115 Eventually(func(g Gomega) { 116 resp, err := fleetsMemberClient.Get(ctx, groupName, fleetName, input.Cluster.Name, nil) 117 g.Expect(err).NotTo(HaveOccurred()) 118 g.Expect(resp.Properties.ProvisioningState).To(Equal(ptr.To(armcontainerservicefleet.FleetMemberProvisioningStateSucceeded))) 119 fleetsMember := resp.FleetMember 120 g.Expect(fleetsMember.Properties).NotTo(BeNil()) 121 expectedID := azure.ManagedClusterID(getSubscriptionID(Default), infraControlPlane.Spec.ResourceGroupName, input.Cluster.Name) 122 g.Expect(fleetsMember.Properties.ClusterResourceID).To(Equal(ptr.To(expectedID))) 123 g.Expect(fleetsMember.Properties.ProvisioningState).To(Equal(ptr.To(armcontainerservicefleet.FleetMemberProvisioningStateSucceeded))) 124 }, input.WaitIntervals...).Should(Succeed()) 125 126 By("Remove the FleetsMember spec from the AzureManagedControlPlane") 127 Eventually(func(g Gomega) { 128 err = mgmtClient.Get(ctx, client.ObjectKey{Namespace: input.Cluster.Spec.ControlPlaneRef.Namespace, Name: input.Cluster.Spec.ControlPlaneRef.Name}, infraControlPlane) 129 g.Expect(err).NotTo(HaveOccurred()) 130 infraControlPlane.Spec.FleetsMember = nil 131 g.Expect(mgmtClient.Update(ctx, infraControlPlane)).To(Succeed()) 132 }, input.WaitIntervals...).Should(Succeed()) 133 134 By("Waiting for the managed cluster to finish updating") 135 Eventually(func(g Gomega) { 136 aks, err := containerserviceClient.Get(ctx, amcp.Spec.ResourceGroupName, amcp.Name, nil) 137 g.Expect(err).NotTo(HaveOccurred()) 138 g.Expect(aks.ManagedCluster.Properties.ProvisioningState).NotTo(Equal(ptr.To("Updating"))) 139 }, input.WaitIntervals...).Should(Succeed()) 140 141 By("Waiting for the FleetsMember to be deleted") 142 Eventually(func(g Gomega) { 143 _, err := fleetsMemberClient.Get(ctx, groupName, fleetName, input.Cluster.Name, nil) 144 g.Expect(azure.ResourceNotFound(err)).To(BeTrue(), "expected err to be 'not found', got %v", err) 145 }, input.WaitIntervals...).Should(Succeed()) 146 147 Logf("Deleting the fleet manager resource group %q", groupName) 148 grpPoller, err := groupClient.BeginDelete(ctx, groupName, nil) 149 Expect(err).NotTo(HaveOccurred()) 150 _, err = grpPoller.PollUntilDone(ctx, nil) 151 Expect(err).NotTo(HaveOccurred()) 152 }