sigs.k8s.io/cluster-api-provider-azure@v1.14.3/azure/services/managedclusters/managedclusters_test.go (about) 1 /* 2 Copyright 2020 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 managedclusters 18 19 import ( 20 "context" 21 "errors" 22 "testing" 23 24 asocontainerservicev1preview "github.com/Azure/azure-service-operator/v2/api/containerservice/v1api20230202preview" 25 asocontainerservicev1 "github.com/Azure/azure-service-operator/v2/api/containerservice/v1api20231001" 26 . "github.com/onsi/gomega" 27 "go.uber.org/mock/gomock" 28 corev1 "k8s.io/api/core/v1" 29 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 30 "k8s.io/utils/ptr" 31 infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1" 32 "sigs.k8s.io/cluster-api-provider-azure/azure/services/managedclusters/mock_managedclusters" 33 clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" 34 "sigs.k8s.io/cluster-api/util/secret" 35 fakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake" 36 ) 37 38 func TestPostCreateOrUpdateResourceHook(t *testing.T) { 39 t.Run("error creating or updating", func(t *testing.T) { 40 g := NewGomegaWithT(t) 41 mockCtrl := gomock.NewController(t) 42 scope := mock_managedclusters.NewMockManagedClusterScope(mockCtrl) 43 44 err := postCreateOrUpdateResourceHook(context.Background(), scope, nil, errors.New("an error")) 45 g.Expect(err).To(HaveOccurred()) 46 }) 47 48 t.Run("successful create or update", func(t *testing.T) { 49 g := NewGomegaWithT(t) 50 namespace := "default" 51 scope := setupMockScope(t) 52 scope.EXPECT().IsPreviewEnabled().Return(false) 53 54 managedCluster := &asocontainerservicev1.ManagedCluster{ 55 ObjectMeta: metav1.ObjectMeta{ 56 Namespace: namespace, 57 }, 58 Spec: asocontainerservicev1.ManagedCluster_Spec{ 59 KubernetesVersion: ptr.To("1.19.0"), 60 AutoUpgradeProfile: &asocontainerservicev1.ManagedClusterAutoUpgradeProfile{ 61 UpgradeChannel: ptr.To(asocontainerservicev1.ManagedClusterAutoUpgradeProfile_UpgradeChannel_Stable), 62 }, 63 }, 64 Status: asocontainerservicev1.ManagedCluster_STATUS{ 65 Fqdn: ptr.To("fdqn"), 66 PrivateFQDN: ptr.To("private fqdn"), 67 OidcIssuerProfile: &asocontainerservicev1.ManagedClusterOIDCIssuerProfile_STATUS{ 68 IssuerURL: ptr.To("oidc"), 69 }, 70 CurrentKubernetesVersion: ptr.To("1.19.0"), 71 }, 72 } 73 74 err := postCreateOrUpdateResourceHook(context.Background(), scope, managedCluster, nil) 75 g.Expect(err).NotTo(HaveOccurred()) 76 }) 77 78 t.Run("successful create or update, preview enabled", func(t *testing.T) { 79 g := NewGomegaWithT(t) 80 namespace := "default" 81 scope := setupMockScope(t) 82 83 scope.EXPECT().IsPreviewEnabled().Return(true) 84 85 managedCluster := &asocontainerservicev1preview.ManagedCluster{ 86 ObjectMeta: metav1.ObjectMeta{ 87 Namespace: namespace, 88 }, 89 Spec: asocontainerservicev1preview.ManagedCluster_Spec{ 90 KubernetesVersion: ptr.To("1.19.0"), 91 AutoUpgradeProfile: &asocontainerservicev1preview.ManagedClusterAutoUpgradeProfile{ 92 UpgradeChannel: ptr.To(asocontainerservicev1preview.ManagedClusterAutoUpgradeProfile_UpgradeChannel_Stable), 93 }, 94 }, 95 Status: asocontainerservicev1preview.ManagedCluster_STATUS{ 96 Fqdn: ptr.To("fdqn"), 97 PrivateFQDN: ptr.To("private fqdn"), 98 OidcIssuerProfile: &asocontainerservicev1preview.ManagedClusterOIDCIssuerProfile_STATUS{ 99 IssuerURL: ptr.To("oidc"), 100 }, 101 CurrentKubernetesVersion: ptr.To("1.19.0"), 102 }, 103 } 104 105 err := postCreateOrUpdateResourceHook(context.Background(), scope, managedCluster, nil) 106 g.Expect(err).NotTo(HaveOccurred()) 107 }) 108 109 t.Run("private cluster fqdn", func(t *testing.T) { 110 g := NewGomegaWithT(t) 111 mockCtrl := gomock.NewController(t) 112 scope := mock_managedclusters.NewMockManagedClusterScope(mockCtrl) 113 namespace := "default" 114 clusterName := "cluster" 115 116 kclient := fakeclient.NewClientBuilder(). 117 Build() 118 scope.EXPECT().GetClient().Return(kclient).AnyTimes() 119 120 scope.EXPECT().SetControlPlaneEndpoint(clusterv1.APIEndpoint{ 121 Host: "private fqdn", 122 Port: 443, 123 }) 124 scope.EXPECT().ClusterName().Return(clusterName).AnyTimes() 125 scope.EXPECT().IsAADEnabled().Return(true) 126 scope.EXPECT().IsPreviewEnabled().Return(false) 127 128 managedCluster := &asocontainerservicev1.ManagedCluster{ 129 ObjectMeta: metav1.ObjectMeta{ 130 Namespace: namespace, 131 }, 132 Status: asocontainerservicev1.ManagedCluster_STATUS{ 133 Fqdn: ptr.To("fdqn"), 134 PrivateFQDN: ptr.To("private fqdn"), 135 ApiServerAccessProfile: &asocontainerservicev1.ManagedClusterAPIServerAccessProfile_STATUS{ 136 EnablePrivateCluster: ptr.To(true), 137 EnablePrivateClusterPublicFQDN: ptr.To(false), 138 }, 139 }, 140 } 141 142 err := postCreateOrUpdateResourceHook(context.Background(), scope, managedCluster, nil) 143 g.Expect(err).To(HaveOccurred()) 144 }) 145 } 146 147 func setupMockScope(t *testing.T) *mock_managedclusters.MockManagedClusterScope { 148 t.Helper() 149 mockCtrl := gomock.NewController(t) 150 scope := mock_managedclusters.NewMockManagedClusterScope(mockCtrl) 151 namespace := "default" 152 clusterName := "cluster" 153 154 adminASOKubeconfig := &corev1.Secret{ 155 ObjectMeta: metav1.ObjectMeta{ 156 Namespace: namespace, 157 Name: adminKubeconfigSecretName(clusterName), 158 }, 159 Data: map[string][]byte{ 160 secret.KubeconfigDataName: []byte("admin credentials"), 161 }, 162 } 163 userASOKubeconfig := &corev1.Secret{ 164 ObjectMeta: metav1.ObjectMeta{ 165 Namespace: namespace, 166 Name: userKubeconfigSecretName(clusterName), 167 }, 168 Data: map[string][]byte{ 169 secret.KubeconfigDataName: []byte("user credentials"), 170 }, 171 } 172 kclient := fakeclient.NewClientBuilder(). 173 WithObjects(adminASOKubeconfig, userASOKubeconfig). 174 Build() 175 scope.EXPECT().GetClient().Return(kclient).AnyTimes() 176 177 scope.EXPECT().SetControlPlaneEndpoint(clusterv1.APIEndpoint{ 178 Host: "fdqn", 179 Port: 443, 180 }) 181 scope.EXPECT().ClusterName().Return(clusterName).AnyTimes() 182 scope.EXPECT().IsAADEnabled().Return(true) 183 scope.EXPECT().AreLocalAccountsDisabled().Return(false) 184 scope.EXPECT().SetAdminKubeconfigData([]byte("admin credentials")) 185 scope.EXPECT().SetUserKubeconfigData([]byte("user credentials")) 186 scope.EXPECT().SetOIDCIssuerProfileStatus(gomock.Nil()) 187 scope.EXPECT().SetOIDCIssuerProfileStatus(&infrav1.OIDCIssuerProfileStatus{ 188 IssuerURL: ptr.To("oidc"), 189 }) 190 scope.EXPECT().SetVersionStatus("v1.19.0") 191 scope.EXPECT().IsManagedVersionUpgrade().Return(true) 192 scope.EXPECT().SetAutoUpgradeVersionStatus("v1.19.0") 193 194 return scope 195 }