Browse Source

polish kubernetes provider v2 cleanup

Signed-off-by: Moritz Johner <beller.moritz@googlemail.com>
Moritz Johner 2 tháng trước cách đây
mục cha
commit
a5cc854c97

+ 0 - 1
pkg/controllers/clusterprovider/metrics.go

@@ -104,4 +104,3 @@ func UpdateStatusCondition(clusterProvider *esapi.ClusterProvider, condition esa
 		string(condition.Status),
 	).Set(1)
 }
-

+ 6 - 6
pkg/controllers/provider/metrics.go

@@ -17,6 +17,8 @@ limitations under the License.
 package provider
 
 import (
+	"maps"
+
 	"github.com/prometheus/client_golang/prometheus"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/controller-runtime/pkg/metrics"
@@ -79,12 +81,11 @@ func RemoveMetrics(namespace, name string) {
 
 // UpdateStatusCondition updates the condition metrics for a Provider.
 func UpdateStatusCondition(provider *esapi.Provider, condition esapi.ProviderCondition) {
-	providerInfo := make(map[string]string)
-	providerInfo["name"] = provider.GetName()
-	providerInfo["namespace"] = provider.GetNamespace()
-	for k, v := range provider.GetLabels() {
-		providerInfo[k] = v
+	providerInfo := map[string]string{
+		"name":      provider.GetName(),
+		"namespace": provider.GetNamespace(),
 	}
+	maps.Copy(providerInfo, provider.GetLabels())
 	conditionLabels := ctrlmetrics.RefineConditionMetricLabels(providerInfo)
 	providerConditionGauge := GetGaugeVec(StatusConditionKey)
 
@@ -113,4 +114,3 @@ func UpdateStatusCondition(provider *esapi.Provider, condition esapi.ProviderCon
 			"status":    string(condition.Status),
 		})).Set(1)
 }
-

+ 2 - 8
pkg/controllers/providercerts/certs.go

@@ -26,6 +26,7 @@ import (
 	"encoding/pem"
 	"fmt"
 	"math/big"
+	"slices"
 	"time"
 
 	corev1 "k8s.io/api/core/v1"
@@ -440,14 +441,7 @@ func (r *ProviderCertReconciler) validProviderCert(caCert, cert, key []byte, dns
 
 	// Check DNS names are present
 	for _, dnsName := range dnsNames {
-		found := false
-		for _, certDNS := range certParsed.DNSNames {
-			if certDNS == dnsName {
-				found = true
-				break
-			}
-		}
-		if !found {
+		if !slices.Contains(certParsed.DNSNames, dnsName) {
 			return false
 		}
 	}

+ 4 - 4
pkg/controllers/pushsecret/pushsecret_controller.go

@@ -184,7 +184,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
 	}
 
 	// Filter and prepare stores (this logic was moved from later)
-	activeSecretStores := make(map[esapi.PushSecretStoreRef]interface{}, len(secretStoresV2))
+	activeSecretStores := make(map[esapi.PushSecretStoreRef]any, len(secretStoresV2))
 	for ref, store := range secretStoresV2 {
 		if v1Store, ok := store.(esv1.GenericStore); ok {
 			if !v1Store.GetDeletionTimestamp().IsZero() {
@@ -208,7 +208,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
 		return ctrl.Result{}, err
 	}
 
-	finalStores := make(map[esapi.PushSecretStoreRef]interface{})
+	finalStores := make(map[esapi.PushSecretStoreRef]any)
 	for ref, store := range filteredV1Stores {
 		finalStores[ref] = store
 	}
@@ -1115,7 +1115,7 @@ func storeRefExistsInList(ref *esapi.PushSecretStoreRef, storeRefs []esapi.PushS
 	return false
 }
 
-func resolvedStoreInfo(ref esapi.PushSecretStoreRef, store interface{}) (storeInfo, bool) {
+func resolvedStoreInfo(ref esapi.PushSecretStoreRef, store any) (storeInfo, bool) {
 	if genericStore, ok := store.(esv1.GenericStore); ok {
 		kind := resolvedPushStoreKind(ref.Kind, genericStore)
 		return storeInfo{
@@ -1137,7 +1137,7 @@ func resolvedStoreInfo(ref esapi.PushSecretStoreRef, store interface{}) (storeIn
 	return storeInfo{}, false
 }
 
-func resolvedPushStoreKind(refKind string, store interface{}) string {
+func resolvedPushStoreKind(refKind string, store any) string {
 	if refKind != "" {
 		return refKind
 	}

+ 25 - 25
pkg/controllers/pushsecret/pushsecret_controller_v2.go

@@ -19,6 +19,7 @@ package pushsecret
 import (
 	"context"
 	"fmt"
+	"maps"
 	"strings"
 
 	corev1 "k8s.io/api/core/v1"
@@ -32,15 +33,9 @@ import (
 	"github.com/external-secrets/external-secrets/runtime/clientmanager"
 )
 
-// isV2SecretStore checks if the referenced SecretStore is a v2 API version.
-func (r *Reconciler) isV2SecretStore(ctx context.Context, storeRef esv1alpha1.PushSecretStoreRef, namespace string) bool {
-	_, ok, err := r.resolveV2Store(ctx, storeRef, namespace)
-	return err == nil && ok
-}
-
 // GetSecretStoresV2 retrieves both v1 and v2 Providers.
-func (r *Reconciler) GetSecretStoresV2(ctx context.Context, ps esv1alpha1.PushSecret) (map[esv1alpha1.PushSecretStoreRef]interface{}, error) {
-	stores := make(map[esv1alpha1.PushSecretStoreRef]interface{})
+func (r *Reconciler) GetSecretStoresV2(ctx context.Context, ps esv1alpha1.PushSecret) (map[esv1alpha1.PushSecretStoreRef]any, error) {
+	stores := make(map[esv1alpha1.PushSecretStoreRef]any)
 
 	for _, refStore := range ps.Spec.SecretStoreRefs {
 		if refStore.LabelSelector != nil {
@@ -48,38 +43,38 @@ func (r *Reconciler) GetSecretStoresV2(ctx context.Context, ps esv1alpha1.PushSe
 			if err != nil {
 				return nil, err
 			}
-			for resolvedRef, store := range resolvedStores {
-				stores[resolvedRef] = store
-			}
+			maps.Copy(stores, resolvedStores)
 			continue
 		}
 
-		if store, ok, err := r.resolveV2Store(ctx, refStore, ps.Namespace); err != nil {
+		store, ok, err := r.resolveV2Store(ctx, refStore, ps.Namespace)
+		if err != nil {
 			return nil, err
-		} else if ok {
+		}
+		if ok {
 			stores[refStore] = store
 			continue
-		} else {
-			// Get v1 SecretStore (existing implementation)
-			store, err := r.getSecretStoreFromName(ctx, refStore, ps.Namespace)
-			if err != nil {
-				return nil, err
-			}
-			stores[refStore] = store
 		}
+
+		// Get v1 SecretStore (existing implementation)
+		store, err = r.getSecretStoreFromName(ctx, refStore, ps.Namespace)
+		if err != nil {
+			return nil, err
+		}
+		stores[refStore] = store
 	}
 
 	return stores, nil
 }
 
-func (r *Reconciler) getSecretStoresFromSelectorV2(ctx context.Context, storeRef esv1alpha1.PushSecretStoreRef, namespace string) (map[esv1alpha1.PushSecretStoreRef]interface{}, error) {
+func (r *Reconciler) getSecretStoresFromSelectorV2(ctx context.Context, storeRef esv1alpha1.PushSecretStoreRef, namespace string) (map[esv1alpha1.PushSecretStoreRef]any, error) {
 	selector, err := metav1.LabelSelectorAsSelector(storeRef.LabelSelector)
 	if err != nil {
 		return nil, fmt.Errorf("could not convert labels: %w", err)
 	}
 
 	listOptions := &client.ListOptions{LabelSelector: selector}
-	stores := make(map[esv1alpha1.PushSecretStoreRef]interface{})
+	stores := make(map[esv1alpha1.PushSecretStoreRef]any)
 
 	switch storeRef.Kind {
 	case esapi.ProviderKindStr:
@@ -125,7 +120,7 @@ func (r *Reconciler) getSecretStoresFromSelectorV2(ctx context.Context, storeRef
 	return stores, nil
 }
 
-func (r *Reconciler) resolveV2Store(ctx context.Context, storeRef esv1alpha1.PushSecretStoreRef, namespace string) (interface{}, bool, error) {
+func (r *Reconciler) resolveV2Store(ctx context.Context, storeRef esv1alpha1.PushSecretStoreRef, namespace string) (any, bool, error) {
 	if storeRef.APIVersion != "" && storeRef.APIVersion != esapi.SchemeGroupVersion.String() {
 		return nil, false, nil
 	}
@@ -168,7 +163,7 @@ func (r *Reconciler) resolveV2Store(ctx context.Context, storeRef esv1alpha1.Pus
 // PushSecretToProvidersV2 pushes secret data to both v1 stores and v2 providers.
 func (r *Reconciler) PushSecretToProvidersV2(
 	ctx context.Context,
-	stores map[esv1alpha1.PushSecretStoreRef]interface{},
+	stores map[esv1alpha1.PushSecretStoreRef]any,
 	ps esv1alpha1.PushSecret,
 	secret *corev1.Secret,
 	mgr *clientmanager.Manager,
@@ -190,7 +185,12 @@ func (r *Reconciler) PushSecretToProvidersV2(
 }
 
 // DeleteSecretFromProvidersV2 removes secrets from v2 providers when they're no longer needed.
-func (r *Reconciler) DeleteSecretFromProvidersV2(ctx context.Context, ps *esv1alpha1.PushSecret, newMap esv1alpha1.SyncedPushSecretsMap, stores map[esv1alpha1.PushSecretStoreRef]interface{}) (esv1alpha1.SyncedPushSecretsMap, error) {
+func (r *Reconciler) DeleteSecretFromProvidersV2(
+	ctx context.Context,
+	ps *esv1alpha1.PushSecret,
+	newMap esv1alpha1.SyncedPushSecretsMap,
+	_ map[esv1alpha1.PushSecretStoreRef]any,
+) (esv1alpha1.SyncedPushSecretsMap, error) {
 	out := mergeSecretState(newMap, ps.Status.SyncedPushSecrets)
 	mgr := clientmanager.NewManager(r.Client, r.ControllerClass, false)
 	defer func() {

+ 28 - 21
pkg/controllers/pushsecret/pushsecret_controller_v2_test.go

@@ -52,6 +52,13 @@ type pushsecretRecordingProviderServer struct {
 	deleteRequest *pb.DeleteSecretRequest
 }
 
+const (
+	pushSecretManifestNamespace = "tenant-a"
+	pushSecretRemoteKey         = "remote/path"
+	pushSecretProperty          = "property"
+	pushSecretSecretKey         = "token"
+)
+
 func (s *pushsecretRecordingProviderServer) PushSecret(_ context.Context, req *pb.PushSecretRequest) (*pb.PushSecretResponse, error) {
 	s.pushRequest = req
 	return &pb.PushSecretResponse{}, nil
@@ -225,10 +232,10 @@ func TestPushSecretToProvidersV2UsesProviderPath(t *testing.T) {
 			}},
 			Data: []esapi.PushSecretData{{
 				Match: esapi.PushSecretMatch{
-					SecretKey: "token",
+					SecretKey: pushSecretSecretKey,
 					RemoteRef: esapi.PushSecretRemoteRef{
-						RemoteKey: "remote/path",
-						Property:  "property",
+						RemoteKey: pushSecretRemoteKey,
+						Property:  pushSecretProperty,
 					},
 				},
 				Metadata: &apiextensionsv1.JSON{Raw: []byte(`{"owner":"eso"}`)},
@@ -237,10 +244,10 @@ func TestPushSecretToProvidersV2UsesProviderPath(t *testing.T) {
 	}
 
 	secret := &corev1.Secret{
-		Data: map[string][]byte{"token": []byte("value")},
+		Data: map[string][]byte{pushSecretSecretKey: []byte("value")},
 	}
 
-	synced, err := r.PushSecretToProvidersV2(context.Background(), map[esapi.PushSecretStoreRef]interface{}{
+	synced, err := r.PushSecretToProvidersV2(context.Background(), map[esapi.PushSecretStoreRef]any{
 		{Name: "provider", Kind: esv1.ProviderKindStr}: provider,
 	}, ps, secret, mgr)
 	if err != nil {
@@ -250,22 +257,22 @@ func TestPushSecretToProvidersV2UsesProviderPath(t *testing.T) {
 	if server.pushRequest == nil {
 		t.Fatal("expected push request to be recorded")
 	}
-	if server.pushRequest.SourceNamespace != "tenant-a" {
+	if server.pushRequest.SourceNamespace != pushSecretManifestNamespace {
 		t.Fatalf("unexpected source namespace: %q", server.pushRequest.SourceNamespace)
 	}
 	if server.pushRequest.ProviderRef == nil || server.pushRequest.ProviderRef.Name != "backend" {
 		t.Fatalf("unexpected provider ref: %#v", server.pushRequest.ProviderRef)
 	}
-	if string(server.pushRequest.SecretData["token"]) != "value" {
+	if string(server.pushRequest.SecretData[pushSecretSecretKey]) != "value" {
 		t.Fatalf("unexpected secret data: %#v", server.pushRequest.SecretData)
 	}
-	if server.pushRequest.PushSecretData == nil || server.pushRequest.PushSecretData.RemoteKey != "remote/path" || server.pushRequest.PushSecretData.Property != "property" {
+	if server.pushRequest.PushSecretData == nil || server.pushRequest.PushSecretData.RemoteKey != pushSecretRemoteKey || server.pushRequest.PushSecretData.Property != pushSecretProperty {
 		t.Fatalf("unexpected push payload: %#v", server.pushRequest.PushSecretData)
 	}
 	if string(server.pushRequest.PushSecretData.Metadata) != `{"owner":"eso"}` {
 		t.Fatalf("unexpected metadata: %q", string(server.pushRequest.PushSecretData.Metadata))
 	}
-	if synced["Provider/provider"]["remote/path/property"].Match.SecretKey != "token" {
+	if synced["Provider/provider"]["remote/path/property"].Match.SecretKey != pushSecretSecretKey {
 		t.Fatalf("unexpected synced map: %#v", synced)
 	}
 }
@@ -283,7 +290,7 @@ func TestPushSecretToProvidersV2UsesProviderPathWhenKindOmitted(t *testing.T) {
 	provider := &esv1.Provider{
 		ObjectMeta: metav1.ObjectMeta{
 			Name:      "provider",
-			Namespace: "tenant-a",
+			Namespace: pushSecretManifestNamespace,
 			Labels:    map[string]string{"team": "a"},
 		},
 		Spec: esv1.ProviderSpec{
@@ -303,7 +310,7 @@ func TestPushSecretToProvidersV2UsesProviderPathWhenKindOmitted(t *testing.T) {
 		WithObjects(provider, &corev1.Secret{
 			ObjectMeta: metav1.ObjectMeta{
 				Name:      "external-secrets-provider-tls",
-				Namespace: "tenant-a",
+				Namespace: pushSecretManifestNamespace,
 			},
 			Data: tlsSecret,
 		}).
@@ -341,7 +348,7 @@ func TestPushSecretToProvidersV2UsesProviderPathWhenKindOmitted(t *testing.T) {
 		Data: map[string][]byte{"token": []byte("value")},
 	}
 
-	synced, err := r.PushSecretToProvidersV2(context.Background(), map[esapi.PushSecretStoreRef]interface{}{
+	synced, err := r.PushSecretToProvidersV2(context.Background(), map[esapi.PushSecretStoreRef]any{
 		{Name: "provider"}: provider,
 	}, ps, secret, mgr)
 	if err != nil {
@@ -444,7 +451,7 @@ func TestPushSecretToProvidersV2UsesProviderNamespaceAuthScope(t *testing.T) {
 		Data: map[string][]byte{"token": []byte("value")},
 	}
 
-	synced, err := r.PushSecretToProvidersV2(context.Background(), map[esapi.PushSecretStoreRef]interface{}{
+	synced, err := r.PushSecretToProvidersV2(context.Background(), map[esapi.PushSecretStoreRef]any{
 		{Name: "cluster-provider", Kind: esv1.ClusterProviderKindStr}: clusterProvider,
 	}, ps, secret, mgr)
 	if err != nil {
@@ -539,7 +546,7 @@ func TestDeleteSecretFromProvidersV2UsesClusterProviderPath(t *testing.T) {
 		},
 	}
 
-	result, err := r.DeleteSecretFromProvidersV2(context.Background(), ps, esapi.SyncedPushSecretsMap{}, map[esapi.PushSecretStoreRef]interface{}{
+	result, err := r.DeleteSecretFromProvidersV2(context.Background(), ps, esapi.SyncedPushSecretsMap{}, map[esapi.PushSecretStoreRef]any{
 		{Name: "cluster-provider", Kind: esv1.ClusterProviderKindStr}: clusterProvider,
 	})
 	if err != nil {
@@ -549,10 +556,10 @@ func TestDeleteSecretFromProvidersV2UsesClusterProviderPath(t *testing.T) {
 	if server.deleteRequest == nil {
 		t.Fatal("expected delete request to be recorded")
 	}
-	if server.deleteRequest.SourceNamespace != "tenant-a" {
+	if server.deleteRequest.SourceNamespace != pushSecretManifestNamespace {
 		t.Fatalf("unexpected source namespace: %q", server.deleteRequest.SourceNamespace)
 	}
-	if server.deleteRequest.RemoteRef == nil || server.deleteRequest.RemoteRef.RemoteKey != "remote/path" || server.deleteRequest.RemoteRef.Property != "property" {
+	if server.deleteRequest.RemoteRef == nil || server.deleteRequest.RemoteRef.RemoteKey != pushSecretRemoteKey || server.deleteRequest.RemoteRef.Property != pushSecretProperty {
 		t.Fatalf("unexpected delete ref: %#v", server.deleteRequest.RemoteRef)
 	}
 	if _, ok := result["ClusterProvider/cluster-provider"]; ok {
@@ -634,7 +641,7 @@ func TestDeleteSecretFromProvidersV2UsesClusterProviderPathWhenKindOmitted(t *te
 		},
 	}
 
-	result, err := r.DeleteSecretFromProvidersV2(context.Background(), ps, esapi.SyncedPushSecretsMap{}, map[esapi.PushSecretStoreRef]interface{}{
+	result, err := r.DeleteSecretFromProvidersV2(context.Background(), ps, esapi.SyncedPushSecretsMap{}, map[esapi.PushSecretStoreRef]any{
 		{Name: "cluster-provider"}: clusterProvider,
 	})
 	if err != nil {
@@ -824,7 +831,7 @@ func TestDeleteSecretFromProvidersV2DeletesRemovedStoreEvenWhenNoLongerReference
 		},
 	}
 
-	result, err := r.DeleteSecretFromProvidersV2(context.Background(), ps, esapi.SyncedPushSecretsMap{}, map[esapi.PushSecretStoreRef]interface{}{})
+	result, err := r.DeleteSecretFromProvidersV2(context.Background(), ps, esapi.SyncedPushSecretsMap{}, map[esapi.PushSecretStoreRef]any{})
 	if err != nil {
 		t.Fatalf("DeleteSecretFromProvidersV2() error = %v", err)
 	}
@@ -918,7 +925,7 @@ func TestDeleteSecretFromProvidersV2UsesProviderNamespaceAuthScope(t *testing.T)
 		},
 	}
 
-	result, err := r.DeleteSecretFromProvidersV2(context.Background(), ps, esapi.SyncedPushSecretsMap{}, map[esapi.PushSecretStoreRef]interface{}{
+	result, err := r.DeleteSecretFromProvidersV2(context.Background(), ps, esapi.SyncedPushSecretsMap{}, map[esapi.PushSecretStoreRef]any{
 		{Name: "cluster-provider", Kind: esv1.ClusterProviderKindStr}: clusterProvider,
 	})
 	if err != nil {
@@ -1027,7 +1034,7 @@ func TestDeleteSecretFromProvidersV2DeletesOnlyRemovedEntriesForManifestScope(t
 		},
 	}
 
-	result, err := r.DeleteSecretFromProvidersV2(context.Background(), ps, newMap, map[esapi.PushSecretStoreRef]interface{}{
+	result, err := r.DeleteSecretFromProvidersV2(context.Background(), ps, newMap, map[esapi.PushSecretStoreRef]any{
 		{Name: "cluster-provider", Kind: esv1.ClusterProviderKindStr}: clusterProvider,
 	})
 	if err != nil {
@@ -1151,7 +1158,7 @@ func TestDeleteSecretFromProvidersV2DeletesOnlyRemovedEntriesForProviderNamespac
 		},
 	}
 
-	result, err := r.DeleteSecretFromProvidersV2(context.Background(), ps, newMap, map[esapi.PushSecretStoreRef]interface{}{
+	result, err := r.DeleteSecretFromProvidersV2(context.Background(), ps, newMap, map[esapi.PushSecretStoreRef]any{
 		{Name: "cluster-provider", Kind: esv1.ClusterProviderKindStr}: clusterProvider,
 	})
 	if err != nil {

+ 6 - 0
providers/v2/hack/go.mod

@@ -8,6 +8,12 @@ require (
 )
 
 require (
+	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
+	github.com/kr/pretty v0.3.1 // indirect
+	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
+	github.com/rogpeppe/go-internal v1.14.1 // indirect
+	github.com/stretchr/testify v1.11.1 // indirect
 	github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
 	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
+	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
 )

+ 7 - 4
providers/v2/hack/go.sum

@@ -1,10 +1,13 @@
-github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 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/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
 github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
 github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
 github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
@@ -12,7 +15,7 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo
 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
 github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
 github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 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/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=