From 06ccda650522fbf1b3f1ef0ae8f84175f8af8ff8 Mon Sep 17 00:00:00 2001 From: Richard chen <99175581+RichardChen820@users.noreply.github.com> Date: Sun, 12 May 2024 20:02:32 -0700 Subject: [PATCH 01/17] Not running on windows node (#30) --- deploy/parameter/helm-values.yaml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/deploy/parameter/helm-values.yaml b/deploy/parameter/helm-values.yaml index 30bdb21..9eff39a 100644 --- a/deploy/parameter/helm-values.yaml +++ b/deploy/parameter/helm-values.yaml @@ -60,7 +60,15 @@ env: # Pod scheduling preferences # ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity -affinity: {} +affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/os + operator: NotIn + values: + - windows # Node labels for pod assignment # ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector From 7ef7f1681104d765da2b15cfdc50caaee9383a31 Mon Sep 17 00:00:00 2001 From: Richard chen <99175581+RichardChen820@users.noreply.github.com> Date: Tue, 14 May 2024 22:20:49 -0700 Subject: [PATCH 02/17] Bump up version to 2.0.0-preview (#42) --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index a28a365..31d467c 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version":"1.3.1" + "version":"2.0.0-preview" } \ No newline at end of file From 74da055dc822bb93c80681777a8ebf64c969731a Mon Sep 17 00:00:00 2001 From: Richard chen <99175581+RichardChen820@users.noreply.github.com> Date: Mon, 3 Jun 2024 23:12:56 -0700 Subject: [PATCH 03/17] Workload identity support namespaced service account (#39) * Workload identity support namespaced service account * feedback * Feedback --- api/v1/azureappconfigurationprovider_types.go | 1 + api/v1/zz_generated.deepcopy.go | 5 ++ ...fig.io_azureappconfigurationproviders.yaml | 6 ++ deploy/parameter/helm-values.yaml | 1 + deploy/templates/_helpers.tpl | 2 +- deploy/templates/clusterrole.yaml | 14 +++ deploy/templates/deployment.yaml | 4 + deploy/templates/serviceaccount.yaml | 2 +- ...ppconfigurationprovider_controller_test.go | 22 +++-- internal/controller/utils.go | 43 +++++++-- .../loader/configuration_client_manager.go | 90 ++++++++++++++++++- 11 files changed, 170 insertions(+), 20 deletions(-) diff --git a/api/v1/azureappconfigurationprovider_types.go b/api/v1/azureappconfigurationprovider_types.go index e5e1f42..c2b6fae 100644 --- a/api/v1/azureappconfigurationprovider_types.go +++ b/api/v1/azureappconfigurationprovider_types.go @@ -134,6 +134,7 @@ type AzureAppConfigurationProviderAuth struct { type WorkloadIdentityParameters struct { ManagedIdentityClientId *string `json:"managedIdentityClientId,omitempty"` ManagedIdentityClientIdReference *ManagedIdentityReferenceParameters `json:"managedIdentityClientIdReference,omitempty"` + ServiceAccountName *string `json:"serviceAccountName,omitempty"` } // ManagedIdentityReferenceParameters defines the parameters for configmap reference diff --git a/api/v1/zz_generated.deepcopy.go b/api/v1/zz_generated.deepcopy.go index 9ef0ba7..6e8d3ff 100644 --- a/api/v1/zz_generated.deepcopy.go +++ b/api/v1/zz_generated.deepcopy.go @@ -506,6 +506,11 @@ func (in *WorkloadIdentityParameters) DeepCopyInto(out *WorkloadIdentityParamete *out = new(ManagedIdentityReferenceParameters) **out = **in } + if in.ServiceAccountName != nil { + in, out := &in.ServiceAccountName, &out.ServiceAccountName + *out = new(string) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkloadIdentityParameters. diff --git a/config/crd/bases/azconfig.io_azureappconfigurationproviders.yaml b/config/crd/bases/azconfig.io_azureappconfigurationproviders.yaml index 3611000..6d67916 100644 --- a/config/crd/bases/azconfig.io_azureappconfigurationproviders.yaml +++ b/config/crd/bases/azconfig.io_azureappconfigurationproviders.yaml @@ -67,6 +67,8 @@ spec: - configMap - key type: object + serviceAccountName: + type: string type: object type: object configuration: @@ -208,6 +210,8 @@ spec: - configMap - key type: object + serviceAccountName: + type: string type: object required: - uri @@ -239,6 +243,8 @@ spec: - configMap - key type: object + serviceAccountName: + type: string type: object type: object refresh: diff --git a/deploy/parameter/helm-values.yaml b/deploy/parameter/helm-values.yaml index 9eff39a..8983e41 100644 --- a/deploy/parameter/helm-values.yaml +++ b/deploy/parameter/helm-values.yaml @@ -17,6 +17,7 @@ fullnameOverride: "az-appconfig-k8s-provider" workloadIdentity: enabled: true + disableGlobalServiceAccount: false serviceAccount: # Specifies whether a service account should be created diff --git a/deploy/templates/_helpers.tpl b/deploy/templates/_helpers.tpl index 0f40c4e..088d547 100644 --- a/deploy/templates/_helpers.tpl +++ b/deploy/templates/_helpers.tpl @@ -49,7 +49,7 @@ Selector labels app.kubernetes.io/name: {{ include "az-appconfig-k8s-provider.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} control-plane: controller-manager -{{- if eq .Values.workloadIdentity.enabled true }} +{{- if and (.Values.workloadIdentity.enabled) (not .Values.workloadIdentity.disableGlobalServiceAccount) }} azure.workload.identity/use: "true" {{- end }} {{- end }} diff --git a/deploy/templates/clusterrole.yaml b/deploy/templates/clusterrole.yaml index 8b9697c..64bffcb 100644 --- a/deploy/templates/clusterrole.yaml +++ b/deploy/templates/clusterrole.yaml @@ -53,6 +53,20 @@ rules: - patch - update - watch +{{- if .Values.workloadIdentity.enabled }} +- apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - get +- apiGroups: + - "" + resources: + - serviceaccounts/token + verbs: + - create +{{- end }} --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding diff --git a/deploy/templates/deployment.yaml b/deploy/templates/deployment.yaml index a5754a6..c2ba28a 100644 --- a/deploy/templates/deployment.yaml +++ b/deploy/templates/deployment.yaml @@ -51,6 +51,10 @@ spec: - name: AZURE_TENANT_ID value: {{ .Values.env.azureTenantId }} {{- end }} + - name: WORKLOAD_IDENTITY_ENABLED + value: "{{ .Values.workloadIdentity.enabled }}" + - name: WORKLOAD_IDENTITY_DISABLE_GLOBAL_SERVICE_ACCOUNT + value: "{{ .Values.workloadIdentity.disableGlobalServiceAccount }}" livenessProbe: httpGet: path: /healthz diff --git a/deploy/templates/serviceaccount.yaml b/deploy/templates/serviceaccount.yaml index cf835e9..c036964 100644 --- a/deploy/templates/serviceaccount.yaml +++ b/deploy/templates/serviceaccount.yaml @@ -9,7 +9,7 @@ metadata: {{- if .Values.serviceAccount.annotations }} {{ toYaml .Values.serviceAccount.annotations . | nindent 4 }} {{- end }} - {{- if eq .Values.workloadIdentity.enabled true }} + {{- if and (.Values.workloadIdentity.enabled) (not .Values.workloadIdentity.disableGlobalServiceAccount) }} azure.workload.identity/client-id: "" {{- end }} {{- end }} \ No newline at end of file diff --git a/internal/controller/appconfigurationprovider_controller_test.go b/internal/controller/appconfigurationprovider_controller_test.go index 48262fd..e49d61a 100644 --- a/internal/controller/appconfigurationprovider_controller_test.go +++ b/internal/controller/appconfigurationprovider_controller_test.go @@ -7,6 +7,7 @@ import ( "azappconfig/provider/internal/loader" "context" "fmt" + "os" "time" acpv1 "azappconfig/provider/api/v1" @@ -1059,9 +1060,12 @@ var _ = Describe("AppConfiguationProvider controller", func() { Context("Verify auth object", func() { It("Should return no error if auth object is valid", func() { + os.Setenv("WORKLOAD_IDENTITY_ENABLED", "true") + uuid1 := "86c613ca-b977-11ed-afa1-0242ac120002" secretName := "fakeName1" configMapName := "fakeName2" + serviceAccountName := "fakeName3" key := "fakeKey" authObj := &acpv1.AzureAppConfigurationProviderAuth{} authObj2 := &acpv1.AzureAppConfigurationProviderAuth{ @@ -1070,7 +1074,7 @@ var _ = Describe("AppConfiguationProvider controller", func() { authObj3 := &acpv1.AzureAppConfigurationProviderAuth{ ServicePrincipalReference: &secretName, } - autoObj4 := &acpv1.AzureAppConfigurationProviderAuth{ + authObj4 := &acpv1.AzureAppConfigurationProviderAuth{ WorkloadIdentity: &acpv1.WorkloadIdentityParameters{ ManagedIdentityClientId: &uuid1, }, @@ -1083,12 +1087,18 @@ var _ = Describe("AppConfiguationProvider controller", func() { }, }, } + authObj6 := &acpv1.AzureAppConfigurationProviderAuth{ + WorkloadIdentity: &acpv1.WorkloadIdentityParameters{ + ServiceAccountName: &serviceAccountName, + }, + } Expect(verifyAuthObject(nil)).Should(BeNil()) Expect(verifyAuthObject(authObj)).Should(BeNil()) Expect(verifyAuthObject(authObj2)).Should(BeNil()) Expect(verifyAuthObject(authObj3)).Should(BeNil()) - Expect(verifyAuthObject(autoObj4)).Should(BeNil()) + Expect(verifyAuthObject(authObj4)).Should(BeNil()) Expect(verifyAuthObject(authObj5)).Should(BeNil()) + Expect(verifyAuthObject(authObj6)).Should(BeNil()) }) It("Should return error if auth object is not valid", func() { @@ -1123,9 +1133,9 @@ var _ = Describe("AppConfiguationProvider controller", func() { } Expect(verifyAuthObject(authObj).Error()).Should(Equal("auth: ManagedIdentityClientId \"not-a-uuid\" in auth field is not a valid uuid")) Expect(verifyAuthObject(authObj2).Error()).Should(Equal("auth: more than one authentication methods are specified in 'auth' field")) - Expect(verifyAuthObject(authObj3).Error()).Should(Equal("auth.workloadIdentity: only one of managedIdentityClientId and managedIdentityClientIdReference is allowed")) + Expect(verifyAuthObject(authObj3).Error()).Should(Equal("auth.workloadIdentity: setting only one of 'managedIdentityClientId', 'managedIdentityClientIdReference' or 'serviceAccountName' field is allowed")) Expect(verifyAuthObject(authObj4).Error()).Should(Equal("auth.workloadIdentity.managedIdentityClientId: managedIdentityClientId \"not-a-uuid\" in auth.workloadIdentity is not a valid uuid")) - Expect(verifyAuthObject(authObj5).Error()).Should(Equal("auth.workloadIdentity: one of managedIdentityClientId and managedIdentityClientIdReference is required")) + Expect(verifyAuthObject(authObj5).Error()).Should(Equal("auth.workloadIdentity: setting one of 'managedIdentityClientId', 'managedIdentityClientIdReference' or 'serviceAccountName' field is required")) }) }) @@ -1214,8 +1224,8 @@ var _ = Describe("AppConfiguationProvider controller", func() { }, }, } - Expect(verifyExistingTargetObject(configMap1, configProvider.Spec.Target.ConfigMapName, configProvider.Name)).Should(MatchError("A ConfigMap with name 'configMapName' already exists in namespace 'default'")) - Expect(verifyExistingTargetObject(configMap2, configProvider.Spec.Target.ConfigMapName, configProvider.Name)).Should(MatchError("A ConfigMap with name 'configMapName' already exists in namespace 'default'")) + Expect(verifyExistingTargetObject(configMap1, configProvider.Spec.Target.ConfigMapName, configProvider.Name)).Should(MatchError("a ConfigMap with name 'configMapName' already exists in namespace 'default'")) + Expect(verifyExistingTargetObject(configMap2, configProvider.Spec.Target.ConfigMapName, configProvider.Name)).Should(MatchError("a ConfigMap with name 'configMapName' already exists in namespace 'default'")) }) }) }) diff --git a/internal/controller/utils.go b/internal/controller/utils.go index bb7c713..104f774 100644 --- a/internal/controller/utils.go +++ b/internal/controller/utils.go @@ -8,6 +8,7 @@ import ( "azappconfig/provider/internal/loader" "fmt" "net/url" + "os" "strings" "time" @@ -16,9 +17,11 @@ import ( ) const ( - MinimalSentinelBasedRefreshInterval time.Duration = time.Second - MinimalSecretRefreshInterval time.Duration = time.Minute - MinimalFeatureFlagRefreshInterval time.Duration = time.Second + MinimalSentinelBasedRefreshInterval time.Duration = time.Second + MinimalSecretRefreshInterval time.Duration = time.Minute + MinimalFeatureFlagRefreshInterval time.Duration = time.Second + WorkloadIdentityEnabled string = "WORKLOAD_IDENTITY_ENABLED" + WorkloadIdentityDisableGlobalServiceAccount string = "WORKLOAD_IDENTITY_DISABLE_GLOBAL_SERVICE_ACCOUNT" ) func verifyObject(spec acpv1.AzureAppConfigurationProviderSpec) error { @@ -204,7 +207,7 @@ func verifyExistingTargetObject[T client.Object](targetObj T, targetName string, } } - return fmt.Errorf("A %s with name '%s' already exists in namespace '%s'", objectKind, targetName, targetObj.GetNamespace()) + return fmt.Errorf("a %s with name '%s' already exists in namespace '%s'", objectKind, targetName, targetObj.GetNamespace()) } func hasNonEscapedValueInLabel(label string) bool { @@ -237,12 +240,36 @@ func verifyRefreshInterval(interval string, allowedMinimalRefreshInterval time.D } func verifyWorkloadIdentityParameters(workloadIdentity *acpv1.WorkloadIdentityParameters) error { - if workloadIdentity.ManagedIdentityClientId == nil && workloadIdentity.ManagedIdentityClientIdReference == nil { - return loader.NewArgumentError("auth.workloadIdentity", fmt.Errorf("one of managedIdentityClientId and managedIdentityClientIdReference is required")) + if !strings.EqualFold(os.Getenv(WorkloadIdentityEnabled), "true") { + return loader.NewArgumentError("auth.workloadIdentity", fmt.Errorf("workloadIdentity is not enabled")) } - if workloadIdentity.ManagedIdentityClientId != nil && workloadIdentity.ManagedIdentityClientIdReference != nil { - return loader.NewArgumentError("auth.workloadIdentity", fmt.Errorf("only one of managedIdentityClientId and managedIdentityClientIdReference is allowed")) + var authCount int = 0 + + if workloadIdentity.ManagedIdentityClientId != nil { + if strings.EqualFold(os.Getenv(WorkloadIdentityDisableGlobalServiceAccount), "true") { + return loader.NewArgumentError("auth.workloadIdentity.managedIdentityClientId", fmt.Errorf("'managedIdentityClientId' is not allowed since global service account is disabled")) + } + authCount++ + } + + if workloadIdentity.ManagedIdentityClientIdReference != nil { + if strings.EqualFold(os.Getenv(WorkloadIdentityDisableGlobalServiceAccount), "true") { + return loader.NewArgumentError("auth.workloadIdentity.managedIdentityClientIdReference", fmt.Errorf("'managedIdentityClientIdReference' is not allowed since global service account is disabled")) + } + authCount++ + } + + if workloadIdentity.ServiceAccountName != nil { + authCount++ + } + + if authCount == 0 { + return loader.NewArgumentError("auth.workloadIdentity", fmt.Errorf("setting one of 'managedIdentityClientId', 'managedIdentityClientIdReference' or 'serviceAccountName' field is required")) + } + + if authCount > 1 { + return loader.NewArgumentError("auth.workloadIdentity", fmt.Errorf("setting only one of 'managedIdentityClientId', 'managedIdentityClientIdReference' or 'serviceAccountName' field is allowed")) } if workloadIdentity.ManagedIdentityClientId != nil { diff --git a/internal/loader/configuration_client_manager.go b/internal/loader/configuration_client_manager.go index 9ac741d..dadc7a1 100644 --- a/internal/loader/configuration_client_manager.go +++ b/internal/loader/configuration_client_manager.go @@ -8,24 +8,29 @@ import ( "context" "fmt" "math" + "math/rand" "net" "net/url" + "os" "strconv" "strings" "time" acpv1 "azappconfig/provider/api/v1" - "math/rand" - "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig" "github.com/google/uuid" + authv1 "k8s.io/api/authentication/v1" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes" "k8s.io/klog/v2" + "sigs.k8s.io/controller-runtime/pkg/client" + ctrlcfg "sigs.k8s.io/controller-runtime/pkg/client/config" ) //go:generate mockgen -destination=mocks/mock_configuration_client_manager.go -package mocks . ClientManager @@ -70,6 +75,9 @@ const ( MinBackoffDuration time.Duration = time.Second * 30 JitterRatio float64 = 0.25 SafeShiftLimit int = 63 + ApiTokenExchangeAudience string = "api://AzureADTokenExchange" + AnnotationClientID string = "azure.workload.identity/client-id" + AnnotationTenantID string = "azure.workload.identity/tenant-id" ) var ( @@ -191,10 +199,10 @@ func (manager *ConfigurationClientManager) DiscoverFallbackClients(ctx context.C select { case <-newCtx.Done(): - klog.Warningf("fail to build fall back clients, SRV DNS lookup is timeout") + klog.Warningf("fail to build fallback clients, SRV DNS lookup is timeout") break case err := <-errChan: - klog.Warningf("fail to build fall back clients %s", err.Error()) + klog.Warningf("fail to build fallback clients %s", err.Error()) break case srvTargetHosts := <-resultChan: // Shuffle the list of SRV target hosts @@ -362,10 +370,15 @@ func CreateTokenCredential(ctx context.Context, acpAuth *acpv1.AzureAppConfigura // If User explicitly specify the authentication method if acpAuth != nil { if acpAuth.WorkloadIdentity != nil { + if acpAuth.WorkloadIdentity.ServiceAccountName != nil { + return newClientAssertionCredential(ctx, *acpAuth.WorkloadIdentity.ServiceAccountName, namespace) + } + workloadIdentityClientId, err := getWorkloadIdentityClientId(ctx, acpAuth.WorkloadIdentity, namespace) if err != nil { return nil, fmt.Errorf("fail to retrieve workload identity client ID from configMap '%s' : %s", acpAuth.WorkloadIdentity.ManagedIdentityClientIdReference.ConfigMap, err.Error()) } + return azidentity.NewWorkloadIdentityCredential(&azidentity.WorkloadIdentityCredentialOptions{ ClientID: workloadIdentityClientId, }) @@ -375,6 +388,7 @@ func CreateTokenCredential(ctx context.Context, acpAuth *acpv1.AzureAppConfigura if err != nil { return nil, fmt.Errorf("fail to retrieve service principal secret from '%s': %s", *acpAuth.ServicePrincipalReference, err.Error()) } + return azidentity.NewClientSecretCredential(parameter.TenantId, parameter.ClientId, parameter.ClientSecret, nil) } if acpAuth.ManagedIdentityClientId != nil { @@ -461,3 +475,71 @@ func Jitter(duration time.Duration) time.Duration { // Apply the random jitter to the original duration return duration + time.Duration(randomJitter) } + +func newClientAssertionCredential(ctx context.Context, serviceAccountName string, serviceAccountNamespace string) (azcore.TokenCredential, error) { + cfg, err := ctrlcfg.GetConfig() + if err != nil { + return nil, err + } + + client, err := client.New(cfg, client.Options{}) + if err != nil { + return nil, err + } + + serviceAccountObj := &corev1.ServiceAccount{} + err = client.Get(ctx, types.NamespacedName{Namespace: serviceAccountNamespace, Name: serviceAccountName}, serviceAccountObj) + if err != nil { + return nil, err + } + + if _, ok := serviceAccountObj.Annotations[AnnotationClientID]; !ok { + return nil, fmt.Errorf("annotation '%s' of service account %s/%s is required", AnnotationClientID, serviceAccountNamespace, serviceAccountName) + } + + tenantId := "" + + if _, ok := serviceAccountObj.Annotations[AnnotationTenantID]; ok { + tenantId = serviceAccountObj.Annotations[AnnotationTenantID] + } else if _, ok := os.LookupEnv(strings.ToUpper(AzureTenantId)); ok { + tenantId = os.Getenv(strings.ToUpper(AzureTenantId)) + } else { + return nil, fmt.Errorf("annotation '%s' of service account %s/%s is required since using global service account for workload identity is disabled", AnnotationTenantID, serviceAccountNamespace, serviceAccountName) + } + + getAssertionFunc := newGetAssertionFunc(serviceAccountNamespace, serviceAccountName) + + clientAssertionCredential, err := azidentity.NewClientAssertionCredential(tenantId, serviceAccountObj.Annotations[AnnotationClientID], getAssertionFunc, nil) + if err != nil { + return nil, err + } + + return clientAssertionCredential, nil +} + +func newGetAssertionFunc(serviceAccountNamespace string, serviceAccountName string) func(ctx context.Context) (string, error) { + audiences := []string{ApiTokenExchangeAudience} + + return func(ctx context.Context) (string, error) { + cfg, err := ctrlcfg.GetConfig() + if err != nil { + return "", err + } + + kubeClient, err := kubernetes.NewForConfig(cfg) + if err != nil { + return "", err + } + + token, err := kubeClient.CoreV1().ServiceAccounts(serviceAccountNamespace).CreateToken(ctx, serviceAccountName, &authv1.TokenRequest{ + Spec: authv1.TokenRequestSpec{ + Audiences: audiences, + }, + }, metav1.CreateOptions{}) + if err != nil { + return "", err + } + + return token.Status.Token, nil + } +} From 36c6dbe9dbefcb67cd86e530a745d050494993ed Mon Sep 17 00:00:00 2001 From: linglingye001 <143174321+linglingye001@users.noreply.github.com> Date: Fri, 14 Jun 2024 13:25:44 +0800 Subject: [PATCH 04/17] Upgrade package (#44) * fix vulnerability * fix go version * update * update * update * update * update * update controller runtime * upgrade azsecrets package * update ci * update patched version * update * revert version * upgrade packages * update ci * revert --- .github/workflows/ci.yaml | 3 +- cmd/main.go | 8 +- go.mod | 122 +++--- go.sum | 394 ++++++------------ .../appconfigurationprovider_controller.go | 7 +- internal/controller/event_handler.go | 9 +- .../configuraiton_setting_loader_test.go | 44 +- .../loader/configuration_setting_loader.go | 4 +- .../loader/keyvault_reference_resolver.go | 2 +- 9 files changed, 216 insertions(+), 377 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e9c67b4..f910b68 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -25,6 +25,7 @@ jobs: - name: Run Test run: | echo 'Install evntest tool' - GOBIN=$GITHUB_WORKSPACE go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest + ENVTEST_VERSION=release-0.16 + GOBIN=$GITHUB_WORKSPACE go install sigs.k8s.io/controller-runtime/tools/setup-envtest@$ENVTEST_VERSION echo 'Run tests' KUBEBUILDER_ASSETS=$($GITHUB_WORKSPACE/setup-envtest use 1.19 -p path) CGO_ENABLED=0 go test ./... -coverprofile cover.out \ No newline at end of file diff --git a/cmd/main.go b/cmd/main.go index fe41486..55e47d0 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -34,6 +34,7 @@ import ( "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/healthz" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" configproviderv1 "azappconfig/provider/api/v1" "azappconfig/provider/internal/controller" @@ -67,9 +68,10 @@ func main() { ctrl.SetLogger(klog.NewKlogr()) mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, + Scheme: scheme, + Metrics: metricsserver.Options{ + BindAddress: metricsAddr, + }, HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "leader.elect.locker.azappconfig.io", diff --git a/go.mod b/go.mod index 87169e9..6de6872 100644 --- a/go.mod +++ b/go.mod @@ -1,96 +1,92 @@ module azappconfig/provider -go 1.22 +go 1.22.0 + +toolchain go1.22.1 require ( - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 - github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets v0.11.0 + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 + github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.1.0 github.com/golang/mock v1.6.0 - github.com/onsi/gomega v1.27.8 - golang.org/x/crypto v0.21.0 - golang.org/x/sync v0.6.0 - k8s.io/apimachinery v0.26.2 - k8s.io/client-go v0.26.2 - sigs.k8s.io/controller-runtime v0.14.5 + github.com/onsi/gomega v1.33.1 + golang.org/x/crypto v0.24.0 + golang.org/x/sync v0.7.0 + k8s.io/apimachinery v0.30.1 + k8s.io/client-go v0.30.1 + sigs.k8s.io/controller-runtime v0.18.4 ) require ( - github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect - github.com/emicklei/go-restful/v3 v3.10.1 // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/golang-jwt/jwt/v5 v5.0.0 // indirect - github.com/google/gnostic v0.6.9 // indirect - github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect + github.com/emicklei/go-restful/v3 v3.12.1 // indirect + github.com/evanphx/json-patch/v5 v5.9.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect github.com/josharian/intern v1.0.0 // indirect - github.com/kr/pretty v0.3.1 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - golang.org/x/tools v0.19.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect ) require ( - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig v1.1.0 github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-logr/zapr v1.2.3 // indirect + github.com/evanphx/json-patch v5.9.0+incompatible // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/zapr v1.3.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.1 - github.com/imdario/mergo v0.3.13 // indirect + github.com/google/uuid v1.6.0 + github.com/imdario/mergo v0.3.16 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/onsi/ginkgo/v2 v2.11.0 + github.com/onsi/ginkgo/v2 v2.17.2 github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.41.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.53.0 // indirect + github.com/prometheus/procfs v0.15.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.8.4 - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 - golang.org/x/net v0.23.0 // indirect - golang.org/x/oauth2 v0.5.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.33.0 // indirect + github.com/stretchr/testify v1.9.0 + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/exp v0.0.0-20240529005216-23cca8864a10 + golang.org/x/net v0.26.0 // indirect + golang.org/x/oauth2 v0.20.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + golang.org/x/time v0.5.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.26.2 - k8s.io/apiextensions-apiserver v0.26.2 // indirect - k8s.io/component-base v0.26.2 // indirect - k8s.io/klog/v2 v2.90.1 - k8s.io/kube-openapi v0.0.0-20230303024457-afdc3dddf62d // indirect - k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 // indirect + k8s.io/api v0.30.1 + k8s.io/apiextensions-apiserver v0.30.1 // indirect + k8s.io/klog/v2 v2.120.1 + k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a // indirect + k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect software.sslmate.com/src/go-pkcs12 v0.4.0 ) diff --git a/go.sum b/go.sum index b75f946..1ca3e7f 100644 --- a/go.sum +++ b/go.sum @@ -1,147 +1,82 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig v1.1.0 h1:AdaGDU3FgoUC2tsd3vsd9JblRrpFLUsS38yh1eLYfwM= github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig v1.1.0/go.mod h1:6tpINME7dnF7bLlb8Ubj6FtM9CFZrCn7aT02pcYrklM= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= -github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets v0.11.0 h1:82w8tzLcOwDP/Q35j/wEBPt0n0kVC3cjtPdD62G8UAk= -github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets v0.11.0/go.mod h1:S78i9yTr4o/nXlH76bKjGUye9Z2wSxO5Tz7GoDr4vfI= -github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 h1:FbH3BbSb4bvGluTesZZ+ttN/MDsnMmQP36OSnDuSXqw= -github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1/go.mod h1:9V2j0jn9jDEkCkv8w/bKTNppX/d0FVA1ud77xCIP4KA= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 h1:hVeq+yCyUi+MsoO/CU95yqCIcdzra5ovzk8Q2BBpV2M= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.1.0 h1:h4Zxgmi9oyZL2l8jeg1iRTqPloHktywWcu0nlJmo1tA= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.1.0/go.mod h1:LgLGXawqSreJz135Elog0ywTJDsm0Hz2k+N+6ZK35u8= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= +github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= +github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= -github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= +github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -149,225 +84,130 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= -github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= -github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/onsi/ginkgo/v2 v2.17.2 h1:7eMhcy3GimbsA3hEnVKdw/PQM9XN9krpKVXsZdph0/g= +github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= +github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= +github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.41.0 h1:npo01n6vUlRViIj5fgwiK8vlNIh8bnoxqh3gypKsyAw= -github.com/prometheus/common v0.41.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= +github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= +github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= +github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= +github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= -go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/exp v0.0.0-20240529005216-23cca8864a10 h1:vpzMC/iZhYFAjJzHU0Cfuq+w1vLLsF2vLkDrPjzKYck= +golang.org/x/exp v0.0.0-20240529005216-23cca8864a10/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= -golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.26.2 h1:dM3cinp3PGB6asOySalOZxEG4CZ0IAdJsrYZXE/ovGQ= -k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU= -k8s.io/apiextensions-apiserver v0.26.2 h1:/yTG2B9jGY2Q70iGskMf41qTLhL9XeNN2KhI0uDgwko= -k8s.io/apiextensions-apiserver v0.26.2/go.mod h1:Y7UPgch8nph8mGCuVk0SK83LnS8Esf3n6fUBgew8SH8= -k8s.io/apimachinery v0.26.2 h1:da1u3D5wfR5u2RpLhE/ZtZS2P7QvDgLZTi9wrNZl/tQ= -k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= -k8s.io/client-go v0.26.2 h1:s1WkVujHX3kTp4Zn4yGNFK+dlDXy1bAAkIl+cFAiuYI= -k8s.io/client-go v0.26.2/go.mod h1:u5EjOuSyBa09yqqyY7m3abZeovO/7D/WehVVlZ2qcqU= -k8s.io/component-base v0.26.2 h1:IfWgCGUDzrD6wLLgXEstJKYZKAFS2kO+rBRi0p3LqcI= -k8s.io/component-base v0.26.2/go.mod h1:DxbuIe9M3IZPRxPIzhch2m1eT7uFrSBJUBuVCQEBivs= -k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= -k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230303024457-afdc3dddf62d h1:VcFq5n7wCJB2FQMCIHfC+f+jNcGgNMar1uKd6rVlifU= -k8s.io/kube-openapi v0.0.0-20230303024457-afdc3dddf62d/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY= -k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 h1:kmDqav+P+/5e1i9tFfHq1qcF3sOrDp+YEkVDAHu7Jwk= -k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.14.5 h1:6xaWFqzT5KuAQ9ufgUaj1G/+C4Y1GRkhrxl+BJ9i+5s= -sigs.k8s.io/controller-runtime v0.14.5/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= +k8s.io/api v0.30.1 h1:kCm/6mADMdbAxmIh0LBjS54nQBE+U4KmbCfIkF5CpJY= +k8s.io/api v0.30.1/go.mod h1:ddbN2C0+0DIiPntan/bye3SW3PdwLa11/0yqwvuRrJM= +k8s.io/apiextensions-apiserver v0.30.1 h1:4fAJZ9985BmpJG6PkoxVRpXv9vmPUOVzl614xarePws= +k8s.io/apiextensions-apiserver v0.30.1/go.mod h1:R4GuSrlhgq43oRY9sF2IToFh7PVlF1JjfWdoG3pixk4= +k8s.io/apimachinery v0.30.1 h1:ZQStsEfo4n65yAdlGTfP/uSHMQSoYzU/oeEbkmF7P2U= +k8s.io/apimachinery v0.30.1/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= +k8s.io/client-go v0.30.1 h1:uC/Ir6A3R46wdkgCV3vbLyNOYyCJ8oZnjtJGKfytl/Q= +k8s.io/client-go v0.30.1/go.mod h1:wrAqLNs2trwiCH/wxxmT/x3hKVH9PuV0GGW0oDoHVqc= +k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= +k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a h1:zD1uj3Jf+mD4zmA7W+goE5TxDkI7OGJjBNBzq5fJtLA= +k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc= +k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 h1:jgGTlFYnhF1PM1Ax/lAlxUPE+KfCIXHaathvJg1C3ak= +k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.18.4 h1:87+guW1zhvuPLh1PHybKdYFLU0YJp4FhJRmiHvm5BZw= +sigs.k8s.io/controller-runtime v0.18.4/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k= software.sslmate.com/src/go-pkcs12 v0.4.0/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI= diff --git a/internal/controller/appconfigurationprovider_controller.go b/internal/controller/appconfigurationprovider_controller.go index 800301e..c66dcae 100644 --- a/internal/controller/appconfigurationprovider_controller.go +++ b/internal/controller/appconfigurationprovider_controller.go @@ -38,7 +38,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" ) // AzureAppConfigurationProviderReconciler reconciles a AzureAppConfigurationProvider object @@ -354,7 +353,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) requeueWhenGetSetting retryAfter, err := strconv.Atoi(respErr.RawResponse.Header.Get(HeaderRetryAfter)) if err == nil { requeueAfter = time.Duration(retryAfter) * time.Second - klog.Error("Too many requests to the Azure App Configuration endpoint %q, retry the reconciliation after %d seconds", provider.Spec.Endpoint, retryAfter) + klog.Errorf("Too many requests to the Azure App Configuration endpoint %s, retry the reconciliation after %d seconds", *provider.Spec.Endpoint, retryAfter) } else { klog.ErrorS(err, "Fail to parse the response header 'Retry-After'") } @@ -500,10 +499,10 @@ func newProviderStatus( func (r *AzureAppConfigurationProviderReconciler) SetupWithManager(mgr ctrl.Manager) error { return ctrl.NewControllerManagedBy(mgr). For(&acpv1.AzureAppConfigurationProvider{}, builder.WithPredicates(newEventFilter())). - Watches(&source.Kind{Type: &corev1.ConfigMap{}}, + Watches(&corev1.ConfigMap{}, &EnqueueRequestsFromWatchedObject{}, builder.WithPredicates(WatchedObjectPredicate{})). - Watches(&source.Kind{Type: &corev1.Secret{}}, + Watches(&corev1.Secret{}, &EnqueueRequestsFromWatchedObject{}, builder.WithPredicates(WatchedObjectPredicate{})). Complete(r) diff --git a/internal/controller/event_handler.go b/internal/controller/event_handler.go index 40998e0..9faba5a 100644 --- a/internal/controller/event_handler.go +++ b/internal/controller/event_handler.go @@ -4,6 +4,7 @@ package controller import ( + "context" "reflect" "k8s.io/apimachinery/pkg/types" @@ -20,7 +21,7 @@ type EnqueueRequestsFromWatchedObject struct { } // Update implements EventHandler. -func (e *EnqueueRequestsFromWatchedObject) Update(evt event.UpdateEvent, q workqueue.RateLimitingInterface) { +func (e *EnqueueRequestsFromWatchedObject) Update(ctx context.Context, evt event.UpdateEvent, q workqueue.RateLimitingInterface) { ownerRefs := evt.ObjectNew.GetOwnerReferences() ownedByProvider := false ownerProvider := "" @@ -49,7 +50,7 @@ func (e *EnqueueRequestsFromWatchedObject) Update(evt event.UpdateEvent, q workq } // Delete implements EventHandler. -func (e *EnqueueRequestsFromWatchedObject) Delete(evt event.DeleteEvent, q workqueue.RateLimitingInterface) { +func (e *EnqueueRequestsFromWatchedObject) Delete(ctx context.Context, evt event.DeleteEvent, q workqueue.RateLimitingInterface) { ownerRefs := evt.Object.GetOwnerReferences() ownedByProvider := false ownerProvider := "" @@ -75,12 +76,12 @@ func (e *EnqueueRequestsFromWatchedObject) Delete(evt event.DeleteEvent, q workq } // Create implements EventHandler. -func (e *EnqueueRequestsFromWatchedObject) Create(evt event.CreateEvent, q workqueue.RateLimitingInterface) { +func (e *EnqueueRequestsFromWatchedObject) Create(ctx context.Context, evt event.CreateEvent, q workqueue.RateLimitingInterface) { // Do nothing } // Generic implements EventHandler. -func (e *EnqueueRequestsFromWatchedObject) Generic(evt event.GenericEvent, q workqueue.RateLimitingInterface) { +func (e *EnqueueRequestsFromWatchedObject) Generic(ctx context.Context, evt event.GenericEvent, q workqueue.RateLimitingInterface) { // Do nothing } diff --git a/internal/loader/configuraiton_setting_loader_test.go b/internal/loader/configuraiton_setting_loader_test.go index ad4f06c..3d17480 100644 --- a/internal/loader/configuraiton_setting_loader_test.go +++ b/internal/loader/configuraiton_setting_loader_test.go @@ -21,7 +21,7 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig" - "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets" + "github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets" "github.com/golang/mock/gomock" "github.com/google/uuid" . "github.com/onsi/ginkgo/v2" @@ -288,7 +288,7 @@ var _ = Describe("AppConfiguationProvider Get All Settings", func() { configurationProvider, _ := NewConfigurationSettingLoader(testProvider, mockCongiurationClientManager, mockSettingsClient) secretValue := "fakeSecretValue" secret1 := azsecrets.GetSecretResponse{ - SecretBundle: azsecrets.SecretBundle{ + Secret: azsecrets.Secret{ Value: &secretValue, }, } @@ -368,11 +368,11 @@ var _ = Describe("AppConfiguationProvider Get All Settings", func() { secretValue := "fakeSecretValue" secretName := "targetSecret" contentType := "fake-content-type" - kidStr := "fakeKid" + var kidStr azsecrets.ID = "fakeKid" secret1 := azsecrets.GetSecretResponse{ - SecretBundle: azsecrets.SecretBundle{ + Secret: azsecrets.Secret{ Value: &secretValue, - Kid: &kidStr, + KID: &kidStr, ContentType: &contentType, }, } @@ -420,11 +420,11 @@ var _ = Describe("AppConfiguationProvider Get All Settings", func() { secretValue := "fakeSecretValue" secretName := "targetSecret" contentType := "fake-content-type" - kidStr := "fakeKid" + var kidStr azsecrets.ID = "fakeKid" secret1 := azsecrets.GetSecretResponse{ - SecretBundle: azsecrets.SecretBundle{ + Secret: azsecrets.Secret{ Value: &secretValue, - Kid: &kidStr, + KID: &kidStr, ContentType: &contentType, }, } @@ -476,11 +476,11 @@ var _ = Describe("AppConfiguationProvider Get All Settings", func() { secretValue := "fakeSecretValue" secretName := "targetSecret" contentType := CertTypePem - kidStr := "fakeKid" + var kidStr azsecrets.ID = "fakeKid" secret1 := azsecrets.GetSecretResponse{ - SecretBundle: azsecrets.SecretBundle{ + Secret: azsecrets.Secret{ Value: &secretValue, - Kid: &kidStr, + KID: &kidStr, ContentType: &contentType, }, } @@ -532,11 +532,11 @@ var _ = Describe("AppConfiguationProvider Get All Settings", func() { secretValue := "fakeSecretValue" secretName := "targetSecret" contentType := CertTypePfx - kidStr := "fakeKid" + var kidStr azsecrets.ID = "fakeKid" secret1 := azsecrets.GetSecretResponse{ - SecretBundle: azsecrets.SecretBundle{ + Secret: azsecrets.Secret{ Value: &secretValue, - Kid: &kidStr, + KID: &kidStr, ContentType: &contentType, }, } @@ -588,11 +588,11 @@ var _ = Describe("AppConfiguationProvider Get All Settings", func() { secretValue, _ := createFakePfx() secretName := "targetSecret" contentType := CertTypePfx - kidStr := "fakeKid" + var kidStr azsecrets.ID = "fakeKid" secret1 := azsecrets.GetSecretResponse{ - SecretBundle: azsecrets.SecretBundle{ + Secret: azsecrets.Secret{ Value: &secretValue, - Kid: &kidStr, + KID: &kidStr, ContentType: &contentType, }, } @@ -647,11 +647,11 @@ var _ = Describe("AppConfiguationProvider Get All Settings", func() { secretValue, _ := createFakePem() secretName := "targetSecret" contentType := CertTypePem - kidStr := "fakeKid" + var kidStr azsecrets.ID = "fakeKid" secret1 := azsecrets.GetSecretResponse{ - SecretBundle: azsecrets.SecretBundle{ + Secret: azsecrets.Secret{ Value: &secretValue, - Kid: &kidStr, + KID: &kidStr, ContentType: &contentType, }, } @@ -707,7 +707,7 @@ var _ = Describe("AppConfiguationProvider Get All Settings", func() { secretName := "targetSecret" ct := CertTypePfx secret1 := azsecrets.GetSecretResponse{ - SecretBundle: azsecrets.SecretBundle{ + Secret: azsecrets.Secret{ Value: &secretValue, ContentType: &ct, }, @@ -764,7 +764,7 @@ var _ = Describe("AppConfiguationProvider Get All Settings", func() { secretName := "targetSecret" ct := CertTypePem secret1 := azsecrets.GetSecretResponse{ - SecretBundle: azsecrets.SecretBundle{ + Secret: azsecrets.Secret{ Value: &secretValue, ContentType: &ct, }, diff --git a/internal/loader/configuration_setting_loader.go b/internal/loader/configuration_setting_loader.go index 063a2bc..dc7c1ca 100644 --- a/internal/loader/configuration_setting_loader.go +++ b/internal/loader/configuration_setting_loader.go @@ -17,7 +17,7 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig" - "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets" + "github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets" "golang.org/x/crypto/pkcs12" "golang.org/x/exp/maps" "golang.org/x/sync/errgroup" @@ -463,7 +463,7 @@ func (csl *ConfigurationSettingLoader) ExecuteFailoverPolicy(ctx context.Context successful = false updateClientBackoffStatus(clientWrapper, successful) if IsFailoverable(err) { - klog.V(3).Info("current client of '%s' failed to get settings: %s", clientWrapper.Endpoint, err.Error()) + klog.V(3).Infof("current client of '%s' failed to get settings: %s", clientWrapper.Endpoint, err.Error()) errors = append(errors, err) continue } diff --git a/internal/loader/keyvault_reference_resolver.go b/internal/loader/keyvault_reference_resolver.go index 8ad9ddf..42c04fb 100644 --- a/internal/loader/keyvault_reference_resolver.go +++ b/internal/loader/keyvault_reference_resolver.go @@ -11,7 +11,7 @@ import ( "strings" "github.com/Azure/azure-sdk-for-go/sdk/azcore" - "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets" + "github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets" "golang.org/x/sync/syncmap" ) From 5303170211380850fa7fab35b3d5291e516cbfc3 Mon Sep 17 00:00:00 2001 From: linglingye001 <143174321+linglingye001@users.noreply.github.com> Date: Fri, 14 Jun 2024 13:27:23 +0800 Subject: [PATCH 05/17] deduplicate feature flags (#50) --- .../configuraiton_setting_loader_test.go | 73 +++++++++++++++++++ .../loader/configuration_setting_loader.go | 7 +- 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/internal/loader/configuraiton_setting_loader_test.go b/internal/loader/configuraiton_setting_loader_test.go index 3d17480..754a51f 100644 --- a/internal/loader/configuraiton_setting_loader_test.go +++ b/internal/loader/configuraiton_setting_loader_test.go @@ -17,6 +17,7 @@ import ( "math/big" "net" "reflect" + "strings" "testing" "time" @@ -68,6 +69,14 @@ func mockConfigurationSettingsWithKV() []azappconfig.Setting { return settingsToReturn } +func mockFeatureFlagSettings() []azappconfig.Setting { + settingsToReturn := make([]azappconfig.Setting, 2) + settingsToReturn[0] = newFeatureFlagSettings(".appconfig.featureflag/Beta", "label1") + settingsToReturn[1] = newFeatureFlagSettings(".appconfig.featureflag/Beta", "label1") + + return settingsToReturn +} + func newCommonKeyValueSettings(key string, value string, label string) azappconfig.Setting { return azappconfig.Setting{ Key: &key, @@ -88,6 +97,26 @@ func newKeyVaultSettings(key string, label string) azappconfig.Setting { } } +func newFeatureFlagSettings(key string, label string) azappconfig.Setting { + featureFlagContentType := FeatureFlagContentType + featureFlagId := strings.TrimPrefix(key, ".appconfig.featureflag/") + featureFlagValue := fmt.Sprintf(`{ + "id": "%s", + "description": "", + "enabled": false, + "conditions": { + "client_filters": [] + } + }`, featureFlagId) + + return azappconfig.Setting{ + Key: &key, + Value: &featureFlagValue, + Label: &label, + ContentType: &featureFlagContentType, + } +} + type MockResolveSecretReference struct { ctrl *gomock.Controller recorder *MockResolveSecretReferenceMockRecorder @@ -945,6 +974,50 @@ var _ = Describe("AppConfiguationProvider Get All Settings", func() { Expect(allSettings.ConfigMapSettings["test:"]).Should(Equal("value6")) }) + It("Succeed to get all configuration settings", func() { + By("By loading and deduplicating feature flags") + featureFlagKeyFilter := "*" + testSpec := acpv1.AzureAppConfigurationProviderSpec{ + Endpoint: &EndpointName, + ReplicaDiscoveryEnabled: false, + Target: acpv1.ConfigurationGenerationParameters{ + ConfigMapName: ConfigMapName, + ConfigMapData: &acpv1.ConfigMapDataOptions{ + Type: acpv1.Json, + Key: "settings.json", + }, + }, + FeatureFlag: &acpv1.AzureAppConfigurationFeatureFlagOptions{ + Selectors: []acpv1.Selector{ + { + KeyFilter: &featureFlagKeyFilter, + }, + }, + }, + } + testProvider := acpv1.AzureAppConfigurationProvider{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "azconfig.io/v1", + Kind: "AppConfigurationProvider", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "testName", + Namespace: "testNamespace", + }, + Spec: testSpec, + } + + featureFlagsToReturn := mockFeatureFlagSettings() + mockSettingsClient.EXPECT().GetSettings(gomock.Any(), gomock.Any()).Return(featureFlagsToReturn, nil).Times(2) + mockCongiurationClientManager.EXPECT().GetClients(gomock.Any()).Return([]*ConfigurationClientWrapper{&fakeClientWrapper}, nil).Times(2) + configurationProvider, _ := NewConfigurationSettingLoader(testProvider, mockCongiurationClientManager, mockSettingsClient) + allSettings, err := configurationProvider.CreateTargetSettings(context.Background(), mockResolveSecretReference) + + Expect(err).Should(BeNil()) + Expect(len(allSettings.ConfigMapSettings)).Should(Equal(1)) + Expect(allSettings.ConfigMapSettings["settings.json"]).Should(Equal("{\"feature_management\":{\"feature_flags\":[{\"conditions\":{\"client_filters\":[]},\"description\":\"\",\"enabled\":false,\"id\":\"Beta\"}]}}")) + }) + It("Fail to get all configuration settings", func() { By("By getting error from Azure App Configuration") testSpec := acpv1.AzureAppConfigurationProviderSpec{ diff --git a/internal/loader/configuration_setting_loader.go b/internal/loader/configuration_setting_loader.go index dc7c1ca..e09443a 100644 --- a/internal/loader/configuration_setting_loader.go +++ b/internal/loader/configuration_setting_loader.go @@ -291,11 +291,16 @@ func (csl *ConfigurationSettingLoader) getFeatureFlagSettings(ctx context.Contex return nil, err } + deduplicateFeatureFlags := make(map[string]azappconfig.Setting, len(featureFlagSettings)) + for _, setting := range featureFlagSettings { + deduplicateFeatureFlags[*setting.Key] = setting + } + // featureFlagSection = {"featureFlags": [{...}, {...}]} var featureFlagSection = map[string]interface{}{ FeatureFlagSectionName: make([]interface{}, 0), } - for _, setting := range featureFlagSettings { + for _, setting := range deduplicateFeatureFlags { var out interface{} err := json.Unmarshal([]byte(*setting.Value), &out) if err != nil { From c31ef110113d2f2e482d7b9cb4ffff442f9c1ceb Mon Sep 17 00:00:00 2001 From: Richard chen <99175581+RichardChen820@users.noreply.github.com> Date: Tue, 18 Jun 2024 00:47:04 -0700 Subject: [PATCH 06/17] Treat get settings from one client failure as warning (#48) --- internal/loader/configuration_setting_loader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/loader/configuration_setting_loader.go b/internal/loader/configuration_setting_loader.go index e09443a..dbb7f7f 100644 --- a/internal/loader/configuration_setting_loader.go +++ b/internal/loader/configuration_setting_loader.go @@ -468,7 +468,7 @@ func (csl *ConfigurationSettingLoader) ExecuteFailoverPolicy(ctx context.Context successful = false updateClientBackoffStatus(clientWrapper, successful) if IsFailoverable(err) { - klog.V(3).Infof("current client of '%s' failed to get settings: %s", clientWrapper.Endpoint, err.Error()) + klog.Warningf("current client of '%s' failed to get settings: %s", clientWrapper.Endpoint, err.Error()) errors = append(errors, err) continue } From c8e115deb5fb011c061eb4a8f6497ddbae096b76 Mon Sep 17 00:00:00 2001 From: Richard chen <99175581+RichardChen820@users.noreply.github.com> Date: Tue, 25 Jun 2024 01:55:57 -0700 Subject: [PATCH 07/17] Add node affinity and toleration configuration (#46) --- deploy/parameter/helm-values.yaml | 10 +--------- deploy/templates/deployment.yaml | 32 +++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/deploy/parameter/helm-values.yaml b/deploy/parameter/helm-values.yaml index 8983e41..1bc7291 100644 --- a/deploy/parameter/helm-values.yaml +++ b/deploy/parameter/helm-values.yaml @@ -61,15 +61,7 @@ env: # Pod scheduling preferences # ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity -affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/os - operator: NotIn - values: - - windows +affinity: {} # Node labels for pod assignment # ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector diff --git a/deploy/templates/deployment.yaml b/deploy/templates/deployment.yaml index c2ba28a..2e0ed8d 100644 --- a/deploy/templates/deployment.yaml +++ b/deploy/templates/deployment.yaml @@ -24,13 +24,37 @@ spec: nodeSelector: {{- toYaml .Values.nodeSelector | nindent 8 }} {{- end }} - {{- if .Values.affinity }} affinity: + {{- if .Values.affinity }} {{- toYaml .Values.affinity | nindent 8 }} + {{- else }} + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + preference: + matchExpressions: + - key: kubernetes.azure.com/mode + operator: In + values: + - system + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/os + operator: NotIn + values: + - windows + - key: type + operator: NotIn + values: + - virtual-kubelet {{- end }} - {{- if .Values.tolerations }} tolerations: - {{- toYaml .Values.tolerations | nindent 8 }} + {{- if .Values.tolerations }} + {{- toYaml .Values.tolerations | nindent 6 }} + {{- else }} + - key: "CriticalAddonsOnly" + operator: "Exists" {{- end }} containers: - args: @@ -87,4 +111,4 @@ spec: volumes: - configMap: name: {{ .Values.configMap.name }} - name: manager-config + name: manager-config \ No newline at end of file From 0921cf40452ee2391ccf1df9686de7f9bcf212c2 Mon Sep 17 00:00:00 2001 From: linglingye001 <143174321+linglingye001@users.noreply.github.com> Date: Thu, 27 Jun 2024 15:51:37 +0800 Subject: [PATCH 08/17] K8s provider conformance test plugin (#43) * k8s provider conformance test plugin * rename * remove docker hub dependency * replace curl with wget * add version file --- arc/conformance/plugin/Dockerfile | 12 ++ arc/conformance/plugin/arc_conformance.sh | 166 ++++++++++++++++++ arc/conformance/plugin/conformance.yaml | 15 ++ .../plugin/setup_failure_handler.py | 18 ++ arc/conformance/plugin/version.json | 3 + 5 files changed, 214 insertions(+) create mode 100644 arc/conformance/plugin/Dockerfile create mode 100644 arc/conformance/plugin/arc_conformance.sh create mode 100644 arc/conformance/plugin/conformance.yaml create mode 100644 arc/conformance/plugin/setup_failure_handler.py create mode 100644 arc/conformance/plugin/version.json diff --git a/arc/conformance/plugin/Dockerfile b/arc/conformance/plugin/Dockerfile new file mode 100644 index 0000000..9350aa0 --- /dev/null +++ b/arc/conformance/plugin/Dockerfile @@ -0,0 +1,12 @@ +FROM mcr.microsoft.com/azure-cli:latest + +RUN pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org pytest pytest-xdist filelock junit_xml kubernetes==24.2.0 azure.identity msrestazure azure-mgmt-hybridkubernetes azure-mgmt-kubernetesconfiguration==2.0.0 +RUN wget https://storage.googleapis.com/kubernetes-release/release/$(wget -qO- https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl +RUN chmod +x ./kubectl +RUN mv ./kubectl /usr/local/bin + +COPY arc/conformance/plugin/arc_conformance.sh /arc/arc_conformance.sh +COPY arc/conformance/plugin/setup_failure_handler.py /arc/setup_failure_handler.py + +RUN ["chmod", "+x", "/arc/arc_conformance.sh"] +ENTRYPOINT ["/arc/arc_conformance.sh"] \ No newline at end of file diff --git a/arc/conformance/plugin/arc_conformance.sh b/arc/conformance/plugin/arc_conformance.sh new file mode 100644 index 0000000..e49648f --- /dev/null +++ b/arc/conformance/plugin/arc_conformance.sh @@ -0,0 +1,166 @@ +#!/usr/bin/env bash + +set -e + +results_dir="${RESULTS_DIR:-/tmp/results}" + +waitForArc() { + ready=false + max_retries=60 + sleep_seconds=20 + + for i in $(seq 1 $max_retries) + do + status=$(helm ls -a -A -o json | jq '.[]|select(.name=="azure-arc").status' -r) + if [ "$status" == "deployed" ]; then + echo "helm release successful" + ready=true + break + elif [ "$status" == "failed" ]; then + echo "helm release failed" + break + else + echo "waiting for helm release to be successful. Status - ${status}. Attempt# $i of $max_retries" + sleep ${sleep_seconds} + fi + done + + echo "$ready" +} + +saveResult() { + # prepare the results for handoff to the Sonobuoy worker. + cd "${results_dir}" + # Sonobuoy worker expects a tar file. + tar czf results.tar.gz ./* + # Signal the worker by writing out the name of the results file into a "done" file. + printf "%s/results.tar.gz" "${results_dir}" > "${results_dir}"/done +} + +# Ensure that we tell the Sonobuoy worker we are done regardless of results. +trap saveResult EXIT + +# initial environment variables for the plugin +setEnviornmentVariables() { + export JUNIT_OUTPUT_FILEPATH=/tmp/results/ + export IS_ARC_TEST=true + export CI_KIND_CLUSTER=true +} + +# setup kubeconfig for conformance test +setupKubeConfig() { + KUBECTL_CONTEXT=azure-arc-appconfig-test + APISERVER=https://kubernetes.default.svc/ + TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) + cat /var/run/secrets/kubernetes.io/serviceaccount/ca.crt > ca.crt + + kubectl config set-cluster ${KUBECTL_CONTEXT} \ + --embed-certs=true \ + --server=${APISERVER} \ + --certificate-authority=./ca.crt 2> "${results_dir}"/error || python3 /arc/setup_failure_handler.py + + kubectl config set-credentials ${KUBECTL_CONTEXT} --token="${TOKEN}" 2> "${results_dir}"/error || python3 /arc/setup_failure_handler.py + + # Delete previous rolebinding if exists. And ignore the error if not found. + kubectl delete clusterrolebinding clusterconnect-binding --ignore-not-found + kubectl create clusterrolebinding clusterconnect-binding --clusterrole=cluster-admin --user="${OBJECT_ID}" 2> "${results_dir}"/error || python3 /arc/setup_failure_handler.py + + kubectl config set-context ${KUBECTL_CONTEXT} \ + --cluster=${KUBECTL_CONTEXT} \ + --user=${KUBECTL_CONTEXT} \ + --namespace=default 2> "${results_dir}"/error || python3 /arc/setup_failure_handler.py + + kubectl config use-context ${KUBECTL_CONTEXT} 2> "${results_dir}"/error || python3 /arc/setup_failure_handler.py + echo "INFO: KubeConfig setup complete" +} + +# validate enviorment variables +if [ -z "${TENANT_ID}" ]; then + echo "ERROR: parameter TENANT_ID is required." > "${results_dir}"/error + python3 /arc/setup_failure_handler.py +fi + +if [ -z "${SUBSCRIPTION_ID}" ]; then + echo "ERROR: parameter SUBSCRIPTION_ID is required." > "${results_dir}"/error + python3 /arc/setup_failure_handler.py +fi + +if [ -z "${AZURE_CLIENT_ID}" ]; then + echo "ERROR: parameter AZURE_CLIENT_ID is required." > "${results_dir}"/error + python3 /arc/setup_failure_handler.py +fi + +if [ -z "${AZURE_CLIENT_SECRET}" ]; then + echo "ERROR: parameter AZURE_CLIENT_SECRET is required." > "${results_dir}"/error + python3 /arc/setup_failure_handler.py +fi + +if [ -z "${CLUSTER_NAME}" ]; then + echo "ERROR: parameter CLUSTER_NAME is required." > "${results_dir}"/error + python3 /arc/setup_failure_handler.py +fi + +if [ -z "${CLUSTER_RG}" ]; then + echo "ERROR: parameter CLUSTER_RG is required." > "${results_dir}"/error + python3 /arc/setup_failure_handler.py +fi + +# OBJECT_ID is an id of the Service Principal created in conformance test subscription. +if [ -z "${OBJECT_ID}" ]; then + echo "ERROR: parameter OBJECT_ID is required." > "${results_dir}"/error + python3 /arc/setup_failure_handler.py +fi + +# add az cli extensions +az extension add --name k8s-extension + +# login with service principal +az login --service-principal \ + -u "${AZURE_CLIENT_ID}" \ + -p "${AZURE_CLIENT_SECRET}" \ + --tenant "${TENANT_ID}" 2> "${results_dir}"/error || python3 /arc/setup_failure_handler.py + +az account set --subscription "${SUBSCRIPTION_ID}" 2> "${results_dir}"/error || python3 /arc/setup_failure_handler.py + +# set environment variables +setEnviornmentVariables + +# setup Kubeconfig +setupKubeConfig + +# Wait for resources in ARC agents to come up +echo "INFO: Waiting for ConnectedCluster to come up" +waitSuccessArc="$(waitForArc)" +if [ "${waitSuccessArc}" == false ]; then + echo "helm release azure-arc failed" > "${results_dir}"/error + python3 /arc/setup_failure_handler.py + exit 1 +else + echo "INFO: ConnectedCluster is available" +fi + +# register the KubernetesConfiguration resource provider +az provider register --namespace Microsoft.KubernetesConfiguration + +echo "INFO: Creating extension" +az k8s-extension create \ + --name appconfigurationkubernetesprovider \ + --extension-type Microsoft.AppConfiguration \ + --cluster-name "${CLUSTER_NAME}" \ + --resource-group "${CLUSTER_RG}" \ + --cluster-type managedClusters \ + --release-train preview 2> "${results_dir}"/error || python3 /arc/setup_failure_handler.py + +# wait for provider pods +kubectl wait pod -n azappconfig-system --for=condition=Ready -l app.kubernetes.io/instance=azureappconfiguration.kubernetesprovider --timeout=5m + +# clean up test resources +echo "INFO: cleaning up test resources" +az k8s-extension delete \ + --name appconfigurationkubernetesprovider \ + --resource-group "${CLUSTER_RG}" \ + --cluster-type managedClusters \ + --cluster-name "${CLUSTER_NAME}" \ + --force \ + --yes \ + --no-wait \ No newline at end of file diff --git a/arc/conformance/plugin/conformance.yaml b/arc/conformance/plugin/conformance.yaml new file mode 100644 index 0000000..28ffe9a --- /dev/null +++ b/arc/conformance/plugin/conformance.yaml @@ -0,0 +1,15 @@ +sonobuoy-config: + driver: Job + plugin-name: azure-arc-app-config-provider + result-format: junit +spec: + image: mcr.microsoft.com/azure-app-configuration/extension-test-plugin:2.0.0-preview # Currently, the image is not available + imagePullPolicy: IfNotPresent + name: plugin + resources: {} + volumes: + - name: results + emptyDir: {} + volumeMounts: + - mountPath: /tmp/results + name: results \ No newline at end of file diff --git a/arc/conformance/plugin/setup_failure_handler.py b/arc/conformance/plugin/setup_failure_handler.py new file mode 100644 index 0000000..e48adf5 --- /dev/null +++ b/arc/conformance/plugin/setup_failure_handler.py @@ -0,0 +1,18 @@ +import sys +from junit_xml import TestSuite, TestCase + +# Reading error message from error file +with open('/tmp/results/error', 'r') as f: + error_message = f.read() + +# Creating a junit report for setup failure +test_case = TestCase('azure_app_configuration_provider_conformance_setup', 'azure_app_configuration_provider_conformance_setup') +test_case.add_failure_info(error_message) +test_cases = [test_case] +test_suite = TestSuite("azure_app_configuration_provider_conformance", test_cases) + +with open('/tmp/results/results.xml', 'w') as f: + TestSuite.to_file(f, [test_suite], prettyprint=False) + +# Exit with non-zero return code +sys.exit(1) \ No newline at end of file diff --git a/arc/conformance/plugin/version.json b/arc/conformance/plugin/version.json new file mode 100644 index 0000000..801e419 --- /dev/null +++ b/arc/conformance/plugin/version.json @@ -0,0 +1,3 @@ +{ + "version":"0.1.0" +} \ No newline at end of file From 6458b0fe44f0eb609a4048b79e134e774329e463 Mon Sep 17 00:00:00 2001 From: linglingye001 <143174321+linglingye001@users.noreply.github.com> Date: Fri, 28 Jun 2024 16:01:52 +0800 Subject: [PATCH 09/17] Setup golangci lint action (#51) * setup golangci lint action * fix linting error * update ci * update * add lint in makefile --- .github/workflows/ci.yaml | 4 +-- .github/workflows/golangci-lint.yml | 29 +++++++++++++++++++ Makefile | 4 +++ ...ppconfigurationprovider_controller_test.go | 4 +-- internal/controller/utils.go | 2 +- .../configuraiton_setting_loader_test.go | 6 ++-- .../loader/configuration_client_manager.go | 6 ++-- internal/loader/tree.go | 2 -- 8 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/golangci-lint.yml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f910b68..000d840 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -4,11 +4,11 @@ on: push: branches: - main - - 'release/*' + - 'release/**' pull_request: branches: - main - - 'release/*' + - 'release/**' jobs: build: diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml new file mode 100644 index 0000000..1ed3878 --- /dev/null +++ b/.github/workflows/golangci-lint.yml @@ -0,0 +1,29 @@ +name: golangci-lint +on: + push: + branches: + - main + - 'release/**' + pull_request: + branches: + - main + - 'release/**' + +permissions: + contents: read + # Optional: allow read access to pull request. Use with `only-new-issues` option. + # pull-requests: read + +jobs: + golangci: + name: lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: stable + - name: golangci-lint + uses: golangci/golangci-lint-action@v6 + with: + version: v1.59 \ No newline at end of file diff --git a/Makefile b/Makefile index b657a24..38660c9 100644 --- a/Makefile +++ b/Makefile @@ -142,3 +142,7 @@ $(CONTROLLER_GEN): $(LOCALBIN) envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. $(ENVTEST): $(LOCALBIN) GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest + +.PHONY: lint +lint: ## Run linting tools. + golangci-lint run ./... \ No newline at end of file diff --git a/internal/controller/appconfigurationprovider_controller_test.go b/internal/controller/appconfigurationprovider_controller_test.go index e49d61a..5afe796 100644 --- a/internal/controller/appconfigurationprovider_controller_test.go +++ b/internal/controller/appconfigurationprovider_controller_test.go @@ -505,7 +505,7 @@ var _ = Describe("AppConfiguationProvider controller", func() { mockConfigurationSettings.EXPECT().CreateTargetSettings(gomock.Any(), gomock.Any()).Return(allSettings2, nil) - k8sClient.Get(ctx, types.NamespacedName{Name: providerName, Namespace: ProviderNamespace}, configProvider) + _ = k8sClient.Get(ctx, types.NamespacedName{Name: providerName, Namespace: ProviderNamespace}, configProvider) configProvider.Spec.Endpoint = &newEndpoint Expect(k8sClient.Update(ctx, configProvider)).Should(Succeed()) @@ -606,7 +606,7 @@ var _ = Describe("AppConfiguationProvider controller", func() { Expect(configmap.Data["testKey2"]).Should(Equal("newtestValue2")) Expect(configmap.Data["testKey3"]).Should(Equal("newtestValue3")) - k8sClient.Delete(ctx, configProvider) + _ = k8sClient.Delete(ctx, configProvider) }) It("Should refresh secret", func() { diff --git a/internal/controller/utils.go b/internal/controller/utils.go index 104f774..6060026 100644 --- a/internal/controller/utils.go +++ b/internal/controller/utils.go @@ -25,7 +25,7 @@ const ( ) func verifyObject(spec acpv1.AzureAppConfigurationProviderSpec) error { - var err error = nil + var err error if spec.Endpoint == nil && spec.ConnectionStringReference == nil { return loader.NewArgumentError("spec", fmt.Errorf("one of endpoint and connectionStringReference field must be set")) } diff --git a/internal/loader/configuraiton_setting_loader_test.go b/internal/loader/configuraiton_setting_loader_test.go index 754a51f..869e461 100644 --- a/internal/loader/configuraiton_setting_loader_test.go +++ b/internal/loader/configuraiton_setting_loader_test.go @@ -193,11 +193,9 @@ func (mr *MockClientManagerMockRecorder) GetClients(arg0 interface{}) *gomock.Ca } // RefreshClients mocks base method. -func (m *MockClientManager) RefreshClients(arg0 context.Context) error { +func (m *MockClientManager) RefreshClients(arg0 context.Context) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "RefreshClients", arg0) - ret0, _ := ret[0].(error) - return ret0 + m.ctrl.Call(m, "RefreshClients", arg0) } // RefreshClients indicates an expected call of RefreshClients. diff --git a/internal/loader/configuration_client_manager.go b/internal/loader/configuration_client_manager.go index dadc7a1..8405efb 100644 --- a/internal/loader/configuration_client_manager.go +++ b/internal/loader/configuration_client_manager.go @@ -57,7 +57,7 @@ type ConfigurationClientWrapper struct { type ClientManager interface { GetClients(ctx context.Context) ([]*ConfigurationClientWrapper, error) - RefreshClients(ctx context.Context) error + RefreshClients(ctx context.Context) } const ( @@ -168,7 +168,7 @@ func (manager *ConfigurationClientManager) GetClients(ctx context.Context) ([]*C return clients, nil } -func (manager *ConfigurationClientManager) RefreshClients(ctx context.Context) error { +func (manager *ConfigurationClientManager) RefreshClients(ctx context.Context) { currentTime := metav1.Now() if manager.ReplicaDiscoveryEnabled && currentTime.After(manager.lastFallbackClientAttempt.Time.Add(MinimalClientRefreshInterval)) { @@ -176,8 +176,6 @@ func (manager *ConfigurationClientManager) RefreshClients(ctx context.Context) e url, _ := url.Parse(manager.endpoint) manager.DiscoverFallbackClients(ctx, url.Host) } - - return nil } func (manager *ConfigurationClientManager) DiscoverFallbackClients(ctx context.Context, host string) { diff --git a/internal/loader/tree.go b/internal/loader/tree.go index 6625e3a..fb94e89 100644 --- a/internal/loader/tree.go +++ b/internal/loader/tree.go @@ -32,12 +32,10 @@ func (t *Tree) insert(parts []string, value interface{}) { for k, v := range obj { tree.insert([]string{k}, v) } - break case []interface{}: for k, v := range obj { tree.insert([]string{strconv.Itoa(k)}, v) } - break default: tree.value = value } From 68759629144fa281863ee3c5bb3ec935ab6428fc Mon Sep 17 00:00:00 2001 From: Richard chen <99175581+RichardChen820@users.noreply.github.com> Date: Wed, 3 Jul 2024 20:30:28 -0700 Subject: [PATCH 10/17] Add Correlation Context header for extension (#47) * Add Correlation Context header for extension * Add more context * Add Host and RequestType in correlation context * Remove the kv refresh --- deploy/parameter/helm-values.yaml | 3 + deploy/templates/deployment.yaml | 9 +++ .../appconfigurationprovider_controller.go | 38 +++++----- .../loader/configuration_setting_loader.go | 10 +++ internal/loader/request_tracing.go | 73 +++++++++++++++++++ 5 files changed, 115 insertions(+), 18 deletions(-) create mode 100644 internal/loader/request_tracing.go diff --git a/deploy/parameter/helm-values.yaml b/deploy/parameter/helm-values.yaml index 1bc7291..51ba339 100644 --- a/deploy/parameter/helm-values.yaml +++ b/deploy/parameter/helm-values.yaml @@ -15,6 +15,9 @@ imagePullSecrets: [] nameOverride: "appconfig-provider" fullnameOverride: "az-appconfig-k8s-provider" +requestTracing: + enabled: true + workloadIdentity: enabled: true disableGlobalServiceAccount: false diff --git a/deploy/templates/deployment.yaml b/deploy/templates/deployment.yaml index 2e0ed8d..4329d34 100644 --- a/deploy/templates/deployment.yaml +++ b/deploy/templates/deployment.yaml @@ -79,6 +79,15 @@ spec: value: "{{ .Values.workloadIdentity.enabled }}" - name: WORKLOAD_IDENTITY_DISABLE_GLOBAL_SERVICE_ACCOUNT value: "{{ .Values.workloadIdentity.disableGlobalServiceAccount }}" + {{- if and (hasKey .Values "global") + (hasKey .Values.global "azure") + (hasKey .Values.global.azure "extension") + (hasKey .Values.global.azure.extension "name") }} + - name: AZURE_EXTENSION_CONTEXT + value: UseExtension + {{- end }} + - name: REQUEST_TRACING_ENABLED + value: "{{ .Values.requestTracing.enabled }}" livenessProbe: httpGet: path: /healthz diff --git a/internal/controller/appconfigurationprovider_controller.go b/internal/controller/appconfigurationprovider_controller.go index c66dcae..832c7cc 100644 --- a/internal/controller/appconfigurationprovider_controller.go +++ b/internal/controller/appconfigurationprovider_controller.go @@ -125,7 +125,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) Reconcile(ctx context err = verifyObject(provider.Spec) if err != nil { - reconciler.logAndSetFailStatus(ctx, err, provider) + reconciler.logAndSetFailStatus(provider, err) return reconcile.Result{Requeue: false}, nil } @@ -133,7 +133,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) Reconcile(ctx context isExisting := false _, err = reconciler.verifyTargetObjectExistence(ctx, provider, &existingConfigMap) if err != nil { - reconciler.logAndSetFailStatus(ctx, err, provider) + reconciler.logAndSetFailStatus(provider, err) return reconcile.Result{Requeue: true, RequeueAfter: RequeueReconcileAfter}, nil } @@ -147,7 +147,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) Reconcile(ctx context } isExisting, err = reconciler.verifyTargetObjectExistence(ctx, provider, &existingSecret) if err != nil { - reconciler.logAndSetFailStatus(ctx, err, provider) + reconciler.logAndSetFailStatus(provider, err) return reconcile.Result{Requeue: true, RequeueAfter: RequeueReconcileAfter}, nil } if isExisting { @@ -165,7 +165,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) Reconcile(ctx context } isExisting, err = reconciler.verifyTargetObjectExistence(ctx, provider, &existingSecret) if err != nil { - reconciler.logAndSetFailStatus(ctx, err, provider) + reconciler.logAndSetFailStatus(provider, err) return reconcile.Result{Requeue: true, RequeueAfter: RequeueReconcileAfter}, nil } if isExisting { @@ -203,7 +203,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) Reconcile(ctx context reconciler.ProvidersReconcileState[req.NamespacedName].Generation != provider.Generation { clientManager, err := loader.NewConfigurationClientManager(ctx, *provider) if err != nil { - reconciler.logAndSetFailStatus(ctx, err, provider) + reconciler.logAndSetFailStatus(provider, err) return reconcile.Result{Requeue: true, RequeueAfter: RequeueReconcileAfter}, nil } reconciler.ProvidersReconcileState[req.NamespacedName].ClientManager = clientManager @@ -213,7 +213,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) Reconcile(ctx context clientManager := reconciler.ProvidersReconcileState[req.NamespacedName].ClientManager configLoader, err := loader.NewConfigurationSettingLoader(*provider, clientManager, nil) if err != nil { - reconciler.logAndSetFailStatus(ctx, err, provider) + reconciler.logAndSetFailStatus(provider, err) return reconcile.Result{Requeue: true, RequeueAfter: RequeueReconcileAfter}, nil } var retriever loader.ConfigurationSettingsRetriever @@ -223,6 +223,10 @@ func (reconciler *AzureAppConfigurationProviderReconciler) Reconcile(ctx context retriever = reconciler.Retriever } + ctx = context.WithValue(ctx, loader.RequestTracingKey, loader.RequestTracing{ + IsStartUp: reconciler.ProvidersReconcileState[req.NamespacedName].ConfigMapResourceVersion == nil, + }) + // Initialize the processor setting in this reconcile processor := &AppConfigurationProviderProcessor{ Context: ctx, @@ -236,7 +240,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) Reconcile(ctx context } if err := processor.PopulateSettings(&existingConfigMap, existingSecrets); err != nil { - return reconciler.requeueWhenGetSettingsFailed(ctx, provider, err) + return reconciler.requeueWhenGetSettingsFailed(provider, err) } /* Create ConfigMap from key-value settings */ @@ -259,7 +263,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) Reconcile(ctx context }) if err != nil { - reconciler.logAndSetFailStatus(ctx, err, provider) + reconciler.logAndSetFailStatus(provider, err) return reconcile.Result{Requeue: true, RequeueAfter: RequeueReconcileAfter}, nil } } @@ -310,9 +314,8 @@ func (reconciler *AzureAppConfigurationProviderReconciler) verifyTargetObjectExi } func (reconciler *AzureAppConfigurationProviderReconciler) logAndSetFailStatus( - ctx context.Context, - err error, - provider *acpv1.AzureAppConfigurationProvider) { + provider *acpv1.AzureAppConfigurationProvider, + err error) { var showErrorAsWarning bool = false namespacedName := types.NamespacedName{ Name: provider.Name, @@ -340,11 +343,10 @@ func (reconciler *AzureAppConfigurationProviderReconciler) logAndSetFailStatus( } func (reconciler *AzureAppConfigurationProviderReconciler) requeueWhenGetSettingsFailed( - ctx context.Context, provider *acpv1.AzureAppConfigurationProvider, err error) (ctrl.Result, error) { requeueAfter := RequeueReconcileAfter - reconciler.logAndSetFailStatus(ctx, err, provider) + reconciler.logAndSetFailStatus(provider, err) if errors.Is(err, &loader.ArgumentError{}) { return reconcile.Result{Requeue: false}, nil } @@ -373,7 +375,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) createOrUpdateConfigM } // Important: set the ownership of configMap if err := controllerutil.SetControllerReference(provider, configMapObj, reconciler.Scheme); err != nil { - reconciler.logAndSetFailStatus(ctx, err, provider) + reconciler.logAndSetFailStatus(provider, err) return reconcile.Result{Requeue: true, RequeueAfter: RequeueReconcileAfter}, err } @@ -392,7 +394,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) createOrUpdateConfigM return nil }) if err != nil { - reconciler.logAndSetFailStatus(ctx, err, provider) + reconciler.logAndSetFailStatus(provider, err) return reconcile.Result{Requeue: true, RequeueAfter: RequeueReconcileAfter}, err } @@ -434,7 +436,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) createOrUpdateSecrets // Important: set the ownership of secret if err := controllerutil.SetControllerReference(provider, secretObj, reconciler.Scheme); err != nil { - reconciler.logAndSetFailStatus(ctx, err, provider) + reconciler.logAndSetFailStatus(provider, err) return reconcile.Result{Requeue: true, RequeueAfter: RequeueReconcileAfter}, err } @@ -447,7 +449,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) createOrUpdateSecrets return nil }) if err != nil { - reconciler.logAndSetFailStatus(ctx, err, provider) + reconciler.logAndSetFailStatus(provider, err) return reconcile.Result{Requeue: true, RequeueAfter: RequeueReconcileAfter}, err } @@ -472,7 +474,7 @@ func (reconciler *AzureAppConfigurationProviderReconciler) expelRemovedSecrets( }, }) if err != nil { - reconciler.logAndSetFailStatus(ctx, err, provider) + reconciler.logAndSetFailStatus(provider, err) return reconcile.Result{Requeue: true, RequeueAfter: RequeueReconcileAfter}, err } } diff --git a/internal/loader/configuration_setting_loader.go b/internal/loader/configuration_setting_loader.go index dbb7f7f..5fc0391 100644 --- a/internal/loader/configuration_setting_loader.go +++ b/internal/loader/configuration_setting_loader.go @@ -12,10 +12,13 @@ import ( "encoding/pem" "fmt" "net/url" + "os" + "strconv" "strings" "sync" "github.com/Azure/azure-sdk-for-go/sdk/azcore" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig" "github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets" "golang.org/x/crypto/pkcs12" @@ -88,6 +91,7 @@ const ( CertTypePfx string = "application/x-pkcs12" TlsKey string = "tls.key" TlsCrt string = "tls.crt" + RequestTracingEnabled string = "REQUEST_TRACING_ENABLED" ) func NewConfigurationSettingLoader(provider acpv1.AzureAppConfigurationProvider, clientManager ClientManager, settingsClient SettingsClient) (*ConfigurationSettingLoader, error) { @@ -460,6 +464,12 @@ func (csl *ConfigurationSettingLoader) ExecuteFailoverPolicy(ctx context.Context return nil, fmt.Errorf("no client is available to connect to the target App Configuration store") } + if value, ok := os.LookupEnv(RequestTracingEnabled); ok { + if enabled, _ := strconv.ParseBool(value); enabled { + ctx = policy.WithHTTPHeader(ctx, createCorrelationContextHeader(ctx, csl.AzureAppConfigurationProvider, csl.ClientManager)) + } + } + errors := make([]error, 0) for _, clientWrapper := range clients { successful := true diff --git a/internal/loader/request_tracing.go b/internal/loader/request_tracing.go new file mode 100644 index 0000000..9996c1d --- /dev/null +++ b/internal/loader/request_tracing.go @@ -0,0 +1,73 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +package loader + +import ( + acpv1 "azappconfig/provider/api/v1" + "context" + "fmt" + "net/http" + "os" + "strings" +) + +type TracingKey string + +type RequestTracing struct { + IsStartUp bool +} + +const ( + RequestTracingKey TracingKey = TracingKey("tracing") + AzureExtensionContext string = "AZURE_EXTENSION_CONTEXT" +) + +func createCorrelationContextHeader(ctx context.Context, provider acpv1.AzureAppConfigurationProvider, clientManager ClientManager) http.Header { + header := http.Header{} + output := make([]string, 0) + + output = append(output, "Host=Kubernetes") + + if tracing := ctx.Value(RequestTracingKey); tracing != nil { + if tracing.(RequestTracing).IsStartUp { + output = append(output, "RequestType=StartUp") + } else { + output = append(output, "RequestType=Watch") + } + } + + if provider.Spec.Secret != nil { + output = append(output, "UsesKeyVault") + + if provider.Spec.Secret.Refresh != nil && + provider.Spec.Secret.Refresh.Enabled { + output = append(output, "RefreshesKeyVault") + } + } + + if provider.Spec.FeatureFlag != nil { + output = append(output, "UsesFeatureFlag") + } + + if provider.Spec.ReplicaDiscoveryEnabled { + if manager, ok := clientManager.(*ConfigurationClientManager); ok { + replicaCount := 0 + if manager.DynamicClientWrappers != nil { + replicaCount = len(manager.DynamicClientWrappers) + } + + output = append(output, fmt.Sprintf("ReplicaCount=%d", replicaCount)) + } + } + + if _, ok := os.LookupEnv(AzureExtensionContext); ok { + output = append(output, "InstalledBy=Extension") + } else { + output = append(output, "InstalledBy=Helm") + } + + header.Add("Correlation-Context", strings.Join(output, ",")) + + return header +} From dd3ff9dc913e9be01c5228071f6d36b2d0c8ad6f Mon Sep 17 00:00:00 2001 From: linglingye001 <143174321+linglingye001@users.noreply.github.com> Date: Fri, 5 Jul 2024 10:31:13 +0800 Subject: [PATCH 11/17] update extension test plugin conformance file (#52) --- arc/conformance/plugin/conformance.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arc/conformance/plugin/conformance.yaml b/arc/conformance/plugin/conformance.yaml index 28ffe9a..8805f3c 100644 --- a/arc/conformance/plugin/conformance.yaml +++ b/arc/conformance/plugin/conformance.yaml @@ -3,8 +3,8 @@ sonobuoy-config: plugin-name: azure-arc-app-config-provider result-format: junit spec: - image: mcr.microsoft.com/azure-app-configuration/extension-test-plugin:2.0.0-preview # Currently, the image is not available - imagePullPolicy: IfNotPresent + image: mcr.microsoft.com/azure-app-configuration/extension-test-plugin:0.1.0 + imagePullPolicy: Always name: plugin resources: {} volumes: From 4ac752e99fad005bf17ec924725d9d924b4b88c6 Mon Sep 17 00:00:00 2001 From: linglingye001 <143174321+linglingye001@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:44:10 +0800 Subject: [PATCH 12/17] added timeout parameter in golintCI (#54) --- .github/workflows/golangci-lint.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 1ed3878..d6f8ae7 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -26,4 +26,5 @@ jobs: - name: golangci-lint uses: golangci/golangci-lint-action@v6 with: - version: v1.59 \ No newline at end of file + version: v1.59 + args: --timeout 10m \ No newline at end of file From eff5fea9b9877b7f1d3a6dda7e2b6eabe6ffefdd Mon Sep 17 00:00:00 2001 From: Richard chen <99175581+RichardChen820@users.noreply.github.com> Date: Wed, 10 Jul 2024 23:59:13 -0700 Subject: [PATCH 13/17] Revise the error message for selector object verification (#56) --- .../controller/appconfigurationprovider_controller_test.go | 6 +++--- internal/controller/utils.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/controller/appconfigurationprovider_controller_test.go b/internal/controller/appconfigurationprovider_controller_test.go index 5afe796..bc25d01 100644 --- a/internal/controller/appconfigurationprovider_controller_test.go +++ b/internal/controller/appconfigurationprovider_controller_test.go @@ -1021,7 +1021,7 @@ var _ = Describe("AppConfiguationProvider controller", func() { }, } - Expect(verifyObject(configProviderSpec).Error()).Should(Equal("spec.configuration.selectors: set both keyFilter and snapshotName in one selector causes ambiguity, only one of them should be set")) + Expect(verifyObject(configProviderSpec).Error()).Should(Equal("spec.configuration.selectors: set both 'keyFilter' and 'snapshotName' in one selector causes ambiguity, only one of them should be set")) configProviderSpec2 := acpv1.AzureAppConfigurationProviderSpec{ ConnectionStringReference: &connectionStringReference, @@ -1038,7 +1038,7 @@ var _ = Describe("AppConfiguationProvider controller", func() { }, } - Expect(verifyObject(configProviderSpec2).Error()).Should(Equal("spec.configuration.selectors: labelFilter is not allowed when snapshotName is set")) + Expect(verifyObject(configProviderSpec2).Error()).Should(Equal("spec.configuration.selectors: 'labelFilter' is not allowed when 'snapshotName' is set")) configProviderSpec3 := acpv1.AzureAppConfigurationProviderSpec{ ConnectionStringReference: &connectionStringReference, @@ -1054,7 +1054,7 @@ var _ = Describe("AppConfiguationProvider controller", func() { }, } - Expect(verifyObject(configProviderSpec3).Error()).Should(Equal("spec.configuration.selectors: one of keyFilter and snapshotName field must be set")) + Expect(verifyObject(configProviderSpec3).Error()).Should(Equal("spec.configuration.selectors: a selector uses 'labelFilter' but misses the 'keyFilter', 'keyFilter' is required for key-label pair filtering")) }) }) diff --git a/internal/controller/utils.go b/internal/controller/utils.go index 6060026..9d7a9f8 100644 --- a/internal/controller/utils.go +++ b/internal/controller/utils.go @@ -284,15 +284,15 @@ func verifyWorkloadIdentityParameters(workloadIdentity *acpv1.WorkloadIdentityPa func verifySelectorObject(selector acpv1.Selector) error { if selector.KeyFilter == nil && selector.SnapshotName == nil { - return fmt.Errorf("one of keyFilter and snapshotName field must be set") + return fmt.Errorf("a selector uses 'labelFilter' but misses the 'keyFilter', 'keyFilter' is required for key-label pair filtering") } if selector.SnapshotName != nil { if selector.KeyFilter != nil { - return fmt.Errorf("set both keyFilter and snapshotName in one selector causes ambiguity, only one of them should be set") + return fmt.Errorf("set both 'keyFilter' and 'snapshotName' in one selector causes ambiguity, only one of them should be set") } if selector.LabelFilter != nil { - return fmt.Errorf("labelFilter is not allowed when snapshotName is set") + return fmt.Errorf("'labelFilter' is not allowed when 'snapshotName' is set") } } From 9a93d6a0db30353de2fa1b638c29a805c0c2c6a4 Mon Sep 17 00:00:00 2001 From: Richard chen <99175581+RichardChen820@users.noreply.github.com> Date: Fri, 12 Jul 2024 03:10:32 -0700 Subject: [PATCH 14/17] Bump up version to 2.0.0 (#58) --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 31d467c..362c35b 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version":"2.0.0-preview" + "version":"2.0.0" } \ No newline at end of file From 257ccae954a4fb59e0873521a67139151e1cf817 Mon Sep 17 00:00:00 2001 From: Richard chen <99175581+RichardChen820@users.noreply.github.com> Date: Mon, 15 Jul 2024 19:35:31 -0700 Subject: [PATCH 15/17] Add data collection section in readme (#57) --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 85495bc..4f24904 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,10 @@ Documentation on how to use the Azure App Configuration Kubernetes Provider is a + [Use dynamic configuration in Azure Kubernetes Service](https://learn.microsoft.com/azure/azure-app-configuration/enable-dynamic-configuration-azure-kubernetes-service) + See [Kubernetes Provider Reference](https://learn.microsoft.com/azure/azure-app-configuration/reference-kubernetes-provider) for a complete list of features. +## Data collection + +The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry by setting the `requestTracing.enabled=false` while installing the Azure App Configuration Kubernetes Provider. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. + ## Contributing This project welcomes contributions and suggestions. Most contributions require you to agree to a From 9049e02a46b4f3c771eb9d2c0e3cd209262535d5 Mon Sep 17 00:00:00 2001 From: Richard chen <99175581+RichardChen820@users.noreply.github.com> Date: Mon, 29 Jul 2024 00:44:07 -0700 Subject: [PATCH 16/17] Require to opt-in for the global service account (#60) * Require to opt in the global service account * Rename --- Dockerfile | 2 +- deploy/parameter/helm-values.yaml | 2 +- deploy/templates/_helpers.tpl | 2 +- deploy/templates/deployment.yaml | 4 ++-- deploy/templates/serviceaccount.yaml | 2 +- internal/controller/utils.go | 10 +++++----- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3cd12f4..3851ed0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build the manager binary -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/oss/go/microsoft/golang:1.22-cbl-mariner2.0 as builder +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/oss/go/microsoft/golang:1.22-cbl-mariner2.0 AS builder ARG MODULE_VERSION WORKDIR /workspace diff --git a/deploy/parameter/helm-values.yaml b/deploy/parameter/helm-values.yaml index 51ba339..1b19c54 100644 --- a/deploy/parameter/helm-values.yaml +++ b/deploy/parameter/helm-values.yaml @@ -20,7 +20,7 @@ requestTracing: workloadIdentity: enabled: true - disableGlobalServiceAccount: false + globalServiceAccountEnabled: false serviceAccount: # Specifies whether a service account should be created diff --git a/deploy/templates/_helpers.tpl b/deploy/templates/_helpers.tpl index 088d547..ffa200f 100644 --- a/deploy/templates/_helpers.tpl +++ b/deploy/templates/_helpers.tpl @@ -49,7 +49,7 @@ Selector labels app.kubernetes.io/name: {{ include "az-appconfig-k8s-provider.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} control-plane: controller-manager -{{- if and (.Values.workloadIdentity.enabled) (not .Values.workloadIdentity.disableGlobalServiceAccount) }} +{{- if and (.Values.workloadIdentity.enabled) }} azure.workload.identity/use: "true" {{- end }} {{- end }} diff --git a/deploy/templates/deployment.yaml b/deploy/templates/deployment.yaml index 4329d34..ae79d3f 100644 --- a/deploy/templates/deployment.yaml +++ b/deploy/templates/deployment.yaml @@ -77,8 +77,8 @@ spec: {{- end }} - name: WORKLOAD_IDENTITY_ENABLED value: "{{ .Values.workloadIdentity.enabled }}" - - name: WORKLOAD_IDENTITY_DISABLE_GLOBAL_SERVICE_ACCOUNT - value: "{{ .Values.workloadIdentity.disableGlobalServiceAccount }}" + - name: WORKLOAD_IDENTITY_GLOBAL_SERVICE_ACCOUNT_ENABLED + value: "{{ .Values.workloadIdentity.globalServiceAccountEnabled }}" {{- if and (hasKey .Values "global") (hasKey .Values.global "azure") (hasKey .Values.global.azure "extension") diff --git a/deploy/templates/serviceaccount.yaml b/deploy/templates/serviceaccount.yaml index c036964..7509359 100644 --- a/deploy/templates/serviceaccount.yaml +++ b/deploy/templates/serviceaccount.yaml @@ -9,7 +9,7 @@ metadata: {{- if .Values.serviceAccount.annotations }} {{ toYaml .Values.serviceAccount.annotations . | nindent 4 }} {{- end }} - {{- if and (.Values.workloadIdentity.enabled) (not .Values.workloadIdentity.disableGlobalServiceAccount) }} + {{- if and (.Values.workloadIdentity.enabled) (.Values.workloadIdentity.globalServiceAccountEnabled) }} azure.workload.identity/client-id: "" {{- end }} {{- end }} \ No newline at end of file diff --git a/internal/controller/utils.go b/internal/controller/utils.go index 9d7a9f8..986fb81 100644 --- a/internal/controller/utils.go +++ b/internal/controller/utils.go @@ -21,7 +21,7 @@ const ( MinimalSecretRefreshInterval time.Duration = time.Minute MinimalFeatureFlagRefreshInterval time.Duration = time.Second WorkloadIdentityEnabled string = "WORKLOAD_IDENTITY_ENABLED" - WorkloadIdentityDisableGlobalServiceAccount string = "WORKLOAD_IDENTITY_DISABLE_GLOBAL_SERVICE_ACCOUNT" + WorkloadIdentityGlobalServiceAccountEnabled string = "WORKLOAD_IDENTITY_GLOBAL_SERVICE_ACCOUNT_ENABLED" ) func verifyObject(spec acpv1.AzureAppConfigurationProviderSpec) error { @@ -247,15 +247,15 @@ func verifyWorkloadIdentityParameters(workloadIdentity *acpv1.WorkloadIdentityPa var authCount int = 0 if workloadIdentity.ManagedIdentityClientId != nil { - if strings.EqualFold(os.Getenv(WorkloadIdentityDisableGlobalServiceAccount), "true") { - return loader.NewArgumentError("auth.workloadIdentity.managedIdentityClientId", fmt.Errorf("'managedIdentityClientId' is not allowed since global service account is disabled")) + if strings.EqualFold(os.Getenv(WorkloadIdentityGlobalServiceAccountEnabled), "false") { + return loader.NewArgumentError("auth.workloadIdentity.managedIdentityClientId", fmt.Errorf("using a global service account is no longer permitted with workload identity. See https://aka.ms/appconfig/k8sglobalserviceaccount for more information")) } authCount++ } if workloadIdentity.ManagedIdentityClientIdReference != nil { - if strings.EqualFold(os.Getenv(WorkloadIdentityDisableGlobalServiceAccount), "true") { - return loader.NewArgumentError("auth.workloadIdentity.managedIdentityClientIdReference", fmt.Errorf("'managedIdentityClientIdReference' is not allowed since global service account is disabled")) + if strings.EqualFold(os.Getenv(WorkloadIdentityGlobalServiceAccountEnabled), "false") { + return loader.NewArgumentError("auth.workloadIdentity.managedIdentityClientIdReference", fmt.Errorf("using a global service account is no longer permitted with workload identity. See https://aka.ms/appconfig/k8sglobalserviceaccount for more information")) } authCount++ } From bf55b1dcc761ae6699b86703638677f46a30d8de Mon Sep 17 00:00:00 2001 From: linglingye001 <143174321+linglingye001@users.noreply.github.com> Date: Wed, 28 Aug 2024 15:39:41 +0800 Subject: [PATCH 17/17] Fix vulnerability (#68) * fix vulnerability * specify go version in golang lint ci --- .github/workflows/golangci-lint.yml | 2 +- go.mod | 32 +++++++------- go.sum | 64 ++++++++++++++++------------ internal/controller/event_handler.go | 8 ++-- 4 files changed, 58 insertions(+), 48 deletions(-) diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index d6f8ae7..8c9c9f5 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -22,7 +22,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: stable + go-version: 1.22.6 - name: golangci-lint uses: golangci/golangci-lint-action@v6 with: diff --git a/go.mod b/go.mod index 6de6872..ffbfb05 100644 --- a/go.mod +++ b/go.mod @@ -11,9 +11,9 @@ require ( github.com/onsi/gomega v1.33.1 golang.org/x/crypto v0.24.0 golang.org/x/sync v0.7.0 - k8s.io/apimachinery v0.30.1 - k8s.io/client-go v0.30.1 - sigs.k8s.io/controller-runtime v0.18.4 + k8s.io/apimachinery v0.31.0 + k8s.io/client-go v0.31.0 + sigs.k8s.io/controller-runtime v0.19.0 ) require ( @@ -22,19 +22,21 @@ require ( github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect github.com/emicklei/go-restful/v3 v3.12.1 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect + github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af // indirect github.com/josharian/intern v1.0.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/x448/float16 v0.8.4 // indirect golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect ) @@ -43,7 +45,7 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig v1.1.0 github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/evanphx/json-patch v5.9.0+incompatible // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect @@ -58,33 +60,33 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/onsi/ginkgo/v2 v2.17.2 + github.com/onsi/ginkgo/v2 v2.19.0 github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.19.1 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.15.0 // indirect + github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.9.0 go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/exp v0.0.0-20240529005216-23cca8864a10 golang.org/x/net v0.26.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect + golang.org/x/oauth2 v0.21.0 // indirect golang.org/x/sys v0.21.0 // indirect golang.org/x/term v0.21.0 // indirect golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.5.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.30.1 - k8s.io/apiextensions-apiserver v0.30.1 // indirect - k8s.io/klog/v2 v2.120.1 + k8s.io/api v0.31.0 + k8s.io/apiextensions-apiserver v0.31.0 // indirect + k8s.io/klog/v2 v2.130.1 k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a // indirect - k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect sigs.k8s.io/yaml v1.4.0 // indirect diff --git a/go.sum b/go.sum index 1ca3e7f..06c2879 100644 --- a/go.sum +++ b/go.sum @@ -17,8 +17,9 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= @@ -27,6 +28,8 @@ github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0 github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= @@ -57,8 +60,8 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= +github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= @@ -84,24 +87,25 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.17.2 h1:7eMhcy3GimbsA3hEnVKdw/PQM9XN9krpKVXsZdph0/g= -github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek= -github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -110,6 +114,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -136,8 +142,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -175,11 +181,13 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -187,22 +195,22 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.30.1 h1:kCm/6mADMdbAxmIh0LBjS54nQBE+U4KmbCfIkF5CpJY= -k8s.io/api v0.30.1/go.mod h1:ddbN2C0+0DIiPntan/bye3SW3PdwLa11/0yqwvuRrJM= -k8s.io/apiextensions-apiserver v0.30.1 h1:4fAJZ9985BmpJG6PkoxVRpXv9vmPUOVzl614xarePws= -k8s.io/apiextensions-apiserver v0.30.1/go.mod h1:R4GuSrlhgq43oRY9sF2IToFh7PVlF1JjfWdoG3pixk4= -k8s.io/apimachinery v0.30.1 h1:ZQStsEfo4n65yAdlGTfP/uSHMQSoYzU/oeEbkmF7P2U= -k8s.io/apimachinery v0.30.1/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= -k8s.io/client-go v0.30.1 h1:uC/Ir6A3R46wdkgCV3vbLyNOYyCJ8oZnjtJGKfytl/Q= -k8s.io/client-go v0.30.1/go.mod h1:wrAqLNs2trwiCH/wxxmT/x3hKVH9PuV0GGW0oDoHVqc= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/api v0.31.0 h1:b9LiSjR2ym/SzTOlfMHm1tr7/21aD7fSkqgD/CVJBCo= +k8s.io/api v0.31.0/go.mod h1:0YiFF+JfFxMM6+1hQei8FY8M7s1Mth+z/q7eF1aJkTE= +k8s.io/apiextensions-apiserver v0.31.0 h1:fZgCVhGwsclj3qCw1buVXCV6khjRzKC5eCFt24kyLSk= +k8s.io/apiextensions-apiserver v0.31.0/go.mod h1:b9aMDEYaEe5sdK+1T0KU78ApR/5ZVp4i56VacZYEHxk= +k8s.io/apimachinery v0.31.0 h1:m9jOiSr3FoSSL5WO9bjm1n6B9KROYYgNZOb4tyZ1lBc= +k8s.io/apimachinery v0.31.0/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/client-go v0.31.0 h1:QqEJzNjbN2Yv1H79SsS+SWnXkBgVu4Pj3CJQgbx0gI8= +k8s.io/client-go v0.31.0/go.mod h1:Y9wvC76g4fLjmU0BA+rV+h2cncoadjvjjkkIGoTLcGU= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a h1:zD1uj3Jf+mD4zmA7W+goE5TxDkI7OGJjBNBzq5fJtLA= k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 h1:jgGTlFYnhF1PM1Ax/lAlxUPE+KfCIXHaathvJg1C3ak= -k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.18.4 h1:87+guW1zhvuPLh1PHybKdYFLU0YJp4FhJRmiHvm5BZw= -sigs.k8s.io/controller-runtime v0.18.4/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.19.0 h1:nWVM7aq+Il2ABxwiCizrVDSlmDcshi9llbaFbC0ji/Q= +sigs.k8s.io/controller-runtime v0.19.0/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= diff --git a/internal/controller/event_handler.go b/internal/controller/event_handler.go index 9faba5a..a69e96d 100644 --- a/internal/controller/event_handler.go +++ b/internal/controller/event_handler.go @@ -21,7 +21,7 @@ type EnqueueRequestsFromWatchedObject struct { } // Update implements EventHandler. -func (e *EnqueueRequestsFromWatchedObject) Update(ctx context.Context, evt event.UpdateEvent, q workqueue.RateLimitingInterface) { +func (e *EnqueueRequestsFromWatchedObject) Update(ctx context.Context, evt event.UpdateEvent, q workqueue.TypedRateLimitingInterface[reconcile.Request]) { ownerRefs := evt.ObjectNew.GetOwnerReferences() ownedByProvider := false ownerProvider := "" @@ -50,7 +50,7 @@ func (e *EnqueueRequestsFromWatchedObject) Update(ctx context.Context, evt event } // Delete implements EventHandler. -func (e *EnqueueRequestsFromWatchedObject) Delete(ctx context.Context, evt event.DeleteEvent, q workqueue.RateLimitingInterface) { +func (e *EnqueueRequestsFromWatchedObject) Delete(ctx context.Context, evt event.DeleteEvent, q workqueue.TypedRateLimitingInterface[reconcile.Request]) { ownerRefs := evt.Object.GetOwnerReferences() ownedByProvider := false ownerProvider := "" @@ -76,12 +76,12 @@ func (e *EnqueueRequestsFromWatchedObject) Delete(ctx context.Context, evt event } // Create implements EventHandler. -func (e *EnqueueRequestsFromWatchedObject) Create(ctx context.Context, evt event.CreateEvent, q workqueue.RateLimitingInterface) { +func (e *EnqueueRequestsFromWatchedObject) Create(ctx context.Context, evt event.CreateEvent, q workqueue.TypedRateLimitingInterface[reconcile.Request]) { // Do nothing } // Generic implements EventHandler. -func (e *EnqueueRequestsFromWatchedObject) Generic(ctx context.Context, evt event.GenericEvent, q workqueue.RateLimitingInterface) { +func (e *EnqueueRequestsFromWatchedObject) Generic(ctx context.Context, evt event.GenericEvent, q workqueue.TypedRateLimitingInterface[reconcile.Request]) { // Do nothing }