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  }