From 1d33dd31e04361e3cb38ed0113b1d469d3527992 Mon Sep 17 00:00:00 2001 From: Jarek Gawor Date: Thu, 18 Apr 2024 12:10:52 -0400 Subject: [PATCH 1/4] service_credential secret type Signed-off-by: Jarek Gawor --- go.mod | 2 +- go.sum | 5 +++++ pkg/backends/ibmsecretsmanager.go | 27 ++++++++++++++++++++++++-- pkg/backends/ibmsecretsmanager_test.go | 2 +- pkg/config/config.go | 2 +- 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 426c3dab..459e1a6d 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.0.1 github.com/DelineaXPM/tss-sdk-go/v2 v2.0.0 github.com/IBM/go-sdk-core/v5 v5.14.1 - github.com/IBM/secrets-manager-go-sdk v1.2.0 + github.com/IBM/secrets-manager-go-sdk/v2 v2.0.4 github.com/aws/aws-sdk-go-v2 v1.23.4 github.com/aws/aws-sdk-go-v2/config v1.18.45 github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.5 diff --git a/go.sum b/go.sum index 06d52b0a..478dd162 100644 --- a/go.sum +++ b/go.sum @@ -152,6 +152,8 @@ github.com/IBM/go-sdk-core/v5 v5.14.1 h1:WR1r0zz+gDW++xzZjF41r9ueY4JyjS2vgZjiYs8 github.com/IBM/go-sdk-core/v5 v5.14.1/go.mod h1:MUvIr/1mgGh198ZXL+ByKz9Qs1JoEh80v/96x8jPXNY= github.com/IBM/secrets-manager-go-sdk v1.2.0 h1:bgFfBF+LjHLtUfV3hTLkfgE8EjFsJaeU2icA2Hg+M50= github.com/IBM/secrets-manager-go-sdk v1.2.0/go.mod h1:qv+tQg8Z3Vb11DQYxDjEGeROHDtTLQxUWuOIrIdWg6E= +github.com/IBM/secrets-manager-go-sdk/v2 v2.0.4 h1:xa9e+POVqaXxXHXkSMCOVAbKdUNEu86jQmo5hcpd+L4= +github.com/IBM/secrets-manager-go-sdk/v2 v2.0.4/go.mod h1:5gq8D8uWOIbqOm1uztay6lpOysgJaxxEsaVZLWGWb40= github.com/Jeffail/gabs v1.1.1 h1:V0uzR08Hj22EX8+8QMhyI9sX2hwRu+/RJhJUmnwda/E= github.com/Jeffail/gabs v1.1.1/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= @@ -523,6 +525,7 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= @@ -640,6 +643,7 @@ github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qK github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gophercloud/gophercloud v0.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -945,6 +949,7 @@ github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= github.com/jarcoal/httpmock v1.0.7 h1:d1a2VFpSdm5gtjhCPWsQHSnx8+5V3ms5431YwvmkuNk= github.com/jarcoal/httpmock v1.0.7/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= diff --git a/pkg/backends/ibmsecretsmanager.go b/pkg/backends/ibmsecretsmanager.go index c6d34f8c..fef645b7 100644 --- a/pkg/backends/ibmsecretsmanager.go +++ b/pkg/backends/ibmsecretsmanager.go @@ -1,12 +1,13 @@ package backends import ( + "encoding/json" "fmt" "regexp" "sync" "github.com/IBM/go-sdk-core/v5/core" - ibmsm "github.com/IBM/secrets-manager-go-sdk/secretsmanagerv2" + ibmsm "github.com/IBM/secrets-manager-go-sdk/v2/secretsmanagerv2" "github.com/argoproj-labs/argocd-vault-plugin/pkg/types" "github.com/argoproj-labs/argocd-vault-plugin/pkg/utils" ) @@ -86,6 +87,15 @@ func (m IBMSecretMetadata) GetMetadata() (map[string]string, error) { "type": *v.SecretType, }, nil } + case *ibmsm.ServiceCredentialsSecretMetadata: + { + return map[string]string{ + "name": *v.Name, + "id": *v.ID, + "groupId": *v.SecretGroupID, + "type": *v.SecretType, + }, nil + } default: return nil, fmt.Errorf("Unknown secret type %T encountered", v) } @@ -165,6 +175,13 @@ func (d IBMSecretData) GetSecret() (map[string]interface{}, error) { result[k] = v } } + case *ibmsm.ServiceCredentialsSecret: + { + if v.Credentials != nil { + data, _ := json.Marshal(*&v.Credentials) + result["credentials"] = string(data) + } + } default: { return nil, fmt.Errorf("Unsupported secret type %T encountered. This should be impossible", v) @@ -252,7 +269,6 @@ func (d IBMVersionedSecretData) GetSecret() (map[string]interface{}, error) { if *v.PayloadAvailable { result["api_key"] = *v.ApiKey } - return nil, fmt.Errorf("Payload unavailable for secret %s", *v.ID) } case *ibmsm.KVSecretVersion: { @@ -262,6 +278,13 @@ func (d IBMVersionedSecretData) GetSecret() (map[string]interface{}, error) { } } } + case *ibmsm.ServiceCredentialsSecretVersion: + { + if *v.PayloadAvailable { + data, _ := json.Marshal(*&v.Credentials) + result["credentials"] = string(data) + } + } default: { return nil, fmt.Errorf("Unsupported secret type %T encountered. This should be impossible", v) diff --git a/pkg/backends/ibmsecretsmanager_test.go b/pkg/backends/ibmsecretsmanager_test.go index 613f3352..2e67538f 100644 --- a/pkg/backends/ibmsecretsmanager_test.go +++ b/pkg/backends/ibmsecretsmanager_test.go @@ -8,7 +8,7 @@ import ( "testing" "github.com/IBM/go-sdk-core/v5/core" - ibmsm "github.com/IBM/secrets-manager-go-sdk/secretsmanagerv2" + ibmsm "github.com/IBM/secrets-manager-go-sdk/v2/secretsmanagerv2" "github.com/argoproj-labs/argocd-vault-plugin/pkg/backends" "github.com/argoproj-labs/argocd-vault-plugin/pkg/types" ) diff --git a/pkg/config/config.go b/pkg/config/config.go index bc896701..42f1cb66 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -15,7 +15,7 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azidentity" delineasecretserver "github.com/DelineaXPM/tss-sdk-go/v2/server" "github.com/IBM/go-sdk-core/v5/core" - ibmsm "github.com/IBM/secrets-manager-go-sdk/secretsmanagerv2" + ibmsm "github.com/IBM/secrets-manager-go-sdk/v2/secretsmanagerv2" "github.com/argoproj-labs/argocd-vault-plugin/pkg/auth/vault" "github.com/argoproj-labs/argocd-vault-plugin/pkg/backends" "github.com/argoproj-labs/argocd-vault-plugin/pkg/kube" From c8d7c361e7672cb45f7aee126703bbe6d16790d2 Mon Sep 17 00:00:00 2001 From: Jarek Gawor Date: Thu, 18 Apr 2024 12:15:25 -0400 Subject: [PATCH 2/4] add tests Signed-off-by: Jarek Gawor --- pkg/backends/ibmsecretsmanager_test.go | 101 ++++++++++++++++++++++--- 1 file changed, 89 insertions(+), 12 deletions(-) diff --git a/pkg/backends/ibmsecretsmanager_test.go b/pkg/backends/ibmsecretsmanager_test.go index 2e67538f..c8221e0f 100644 --- a/pkg/backends/ibmsecretsmanager_test.go +++ b/pkg/backends/ibmsecretsmanager_test.go @@ -1,6 +1,7 @@ package backends_test import ( + "encoding/json" "fmt" "reflect" "strings" @@ -108,6 +109,7 @@ func (m *MockIBMSMClient) ListSecrets(listAllSecretsOptions *ibmsm.ListSecretsOp ctype := "public_cert" itype := "iam_credentials" ktype := "kv" + sctype := "service_credentials" smallGroupSecrets := []ibmsm.SecretMetadataIntf{ &ibmsm.ArbitrarySecretMetadata{ Name: &name, @@ -139,6 +141,12 @@ func (m *MockIBMSMClient) ListSecrets(listAllSecretsOptions *ibmsm.ListSecretsOp SecretGroupID: &smallGroup, ID: &ktype, }, + &ibmsm.ServiceCredentialsSecretMetadata{ + Name: &name, + SecretType: &sctype, + SecretGroupID: &smallGroup, + ID: &sctype, + }, } defaultGroup := "default" @@ -231,6 +239,22 @@ func (m *MockIBMSMClient) GetSecret(getSecretOptions *ibmsm.GetSecretOptions) (r ID: &id, Data: payload, }, nil, nil + } else if *getSecretOptions.ID == "service_credentials" { + name := "my-secret" + id := "service_credentials" + api_key := "123456" + credentials := &ibmsm.ServiceCredentialsSecretCredentials{ + Apikey: &api_key, + } + credentials.SetProperty("authentication", map[string]interface{}{ + "username": "user", + "password": "pass", + }) + return &ibmsm.ServiceCredentialsSecret{ + Name: &name, + ID: &id, + Credentials: credentials, + }, nil, nil } else { name := "my-secret" id := "username_password" @@ -250,18 +274,37 @@ func (m *MockIBMSMClient) GetSecretVersion(getSecretOptions *ibmsm.GetSecretVers m.GetSecretVersionCalledWith = getSecretOptions m.GetSecretVersionCallCount += 1 m.GetSecretLock.Unlock() - cert1 := "dummy certificate" - key := "dummy private key" - cert2 := "dummy intermediate certificate" - id := "public_cert" - yes := true - return &ibmsm.PublicCertificateVersion{ - ID: &id, - PayloadAvailable: &yes, - Certificate: &cert1, - PrivateKey: &key, - Intermediate: &cert2, - }, nil, nil + if *getSecretOptions.SecretID == "service_credentials" { + id := "service_credentials" + payload := true + api_key := "old-123456" + credentials := &ibmsm.ServiceCredentialsSecretCredentials{ + Apikey: &api_key, + } + credentials.SetProperty("authentication", map[string]interface{}{ + "username": "old-user", + "password": "old-pass", + }) + return &ibmsm.ServiceCredentialsSecretVersion{ + ID: &id, + Credentials: credentials, + PayloadAvailable: &payload, + }, nil, nil + } else { + cert1 := "dummy certificate" + key := "dummy private key" + cert2 := "dummy intermediate certificate" + id := "public_cert" + yes := true + return &ibmsm.PublicCertificateVersion{ + ID: &id, + PayloadAvailable: &yes, + Certificate: &cert1, + PrivateKey: &key, + Intermediate: &cert2, + }, nil, nil + } + } func TestIBMSecretsManagerGetSecrets(t *testing.T) { @@ -741,6 +784,40 @@ func TestIBMSecretsManagerSecretLookup(t *testing.T) { GetIndividualSecretTest(t, "ibmcloud/iam_credentials/secrets/groups/small-group/my-secret", "doesnotexist", "", nil) }) + t.Run("Retrieves payload of service credentials secret", func(t *testing.T) { + contents := map[string]interface{}{ + "apikey": "123456", + "authentication": map[string]interface{}{ + "username": "user", + "password": "pass", + }, + } + jsonContents, _ := json.Marshal(contents) + expected := map[string]interface{}{ + "credentials": string(jsonContents), + } + GetSecretsTest(t, "ibmcloud/service_credentials/secrets/groups/small-group/my-secret", "", expected) + GetIndividualSecretTest(t, "ibmcloud/service_credentials/secrets/groups/small-group/my-secret", "credentials", "", expected["credentials"]) + GetIndividualSecretTest(t, "ibmcloud/service_credentials/secrets/groups/small-group/my-secret", "doesnotexist", "", nil) + }) + + t.Run("Retrieves payload of service credentials secret (versioned)", func(t *testing.T) { + contents := map[string]interface{}{ + "apikey": "old-123456", + "authentication": map[string]interface{}{ + "username": "old-user", + "password": "old-pass", + }, + } + jsonContents, _ := json.Marshal(contents) + expected := map[string]interface{}{ + "credentials": string(jsonContents), + } + GetSecretsTest(t, "ibmcloud/service_credentials/secrets/groups/small-group/my-secret", "123", expected) + GetIndividualSecretTest(t, "ibmcloud/service_credentials/secrets/groups/small-group/my-secret", "credentials", "123", expected["credentials"]) + GetIndividualSecretTest(t, "ibmcloud/service_credentials/secrets/groups/small-group/my-secret", "doesnotexist", "123", nil) + }) + t.Run("Retrieves payload of arbitrary secret", func(t *testing.T) { mock := MockIBMSMClient{} sm := backends.NewIBMSecretsManagerBackend(&mock) From ae73502b48221f34a287fe8f3bdddc05ff28d668 Mon Sep 17 00:00:00 2001 From: Jarek Gawor Date: Thu, 18 Apr 2024 23:44:21 -0400 Subject: [PATCH 3/4] handle in consistent way Signed-off-by: Jarek Gawor --- docs/backends.md | 3 ++- pkg/backends/ibmsecretsmanager.go | 17 ++++++++++++----- pkg/backends/ibmsecretsmanager_test.go | 13 ++----------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/docs/backends.md b/docs/backends.md index d59e1d63..903590ee 100644 --- a/docs/backends.md +++ b/docs/backends.md @@ -176,7 +176,7 @@ The path for IBM Cloud Secret Manager secrets can be specified in two ways: 2. `ibmcloud//secrets/groups//#` Where: -* `` can be one of the following: `arbitrary`, `iam_credentials`, `imported_cert`, `kv`, `private_cert`, `public_cert`, or `username_password`. +* `` can be one of the following: `arbitrary`, `iam_credentials`, `imported_cert`, `kv`, `private_cert`, `public_cert`, `username_password`, or `service_credentials`. * `` can be a secret group ID or name. * `` is the name of the secret. * `` is the key name within the secret. Specifically, the following keys are available for extraction: @@ -184,6 +184,7 @@ Where: * `username` and `password` for the `username_password` secret type * `certificate`, `private_key`, `intermediate` for the `imported_cert` or `public_cert` secret types * `certificate`, `private_key`, `issuing_ca`, `ca_chain` for the `private_cert` secret type + * `apikey` or/and any top-level key of the actual credential object for the `service_credentials` secret type * any key of the `kv` secret type `` is not supported for the `arbitrary` secret type. diff --git a/pkg/backends/ibmsecretsmanager.go b/pkg/backends/ibmsecretsmanager.go index fef645b7..41bd5775 100644 --- a/pkg/backends/ibmsecretsmanager.go +++ b/pkg/backends/ibmsecretsmanager.go @@ -1,7 +1,6 @@ package backends import ( - "encoding/json" "fmt" "regexp" "sync" @@ -178,8 +177,12 @@ func (d IBMSecretData) GetSecret() (map[string]interface{}, error) { case *ibmsm.ServiceCredentialsSecret: { if v.Credentials != nil { - data, _ := json.Marshal(*&v.Credentials) - result["credentials"] = string(data) + if v.Credentials.Apikey != nil { + result["apikey"] = *v.Credentials.Apikey + } + for k, v := range v.Credentials.GetProperties() { + result[k] = v + } } } default: @@ -281,8 +284,12 @@ func (d IBMVersionedSecretData) GetSecret() (map[string]interface{}, error) { case *ibmsm.ServiceCredentialsSecretVersion: { if *v.PayloadAvailable { - data, _ := json.Marshal(*&v.Credentials) - result["credentials"] = string(data) + if v.Credentials.Apikey != nil { + result["apikey"] = *v.Credentials.Apikey + } + for k, v := range v.Credentials.GetProperties() { + result[k] = v + } } } default: diff --git a/pkg/backends/ibmsecretsmanager_test.go b/pkg/backends/ibmsecretsmanager_test.go index c8221e0f..1472823a 100644 --- a/pkg/backends/ibmsecretsmanager_test.go +++ b/pkg/backends/ibmsecretsmanager_test.go @@ -1,7 +1,6 @@ package backends_test import ( - "encoding/json" "fmt" "reflect" "strings" @@ -785,34 +784,26 @@ func TestIBMSecretsManagerSecretLookup(t *testing.T) { }) t.Run("Retrieves payload of service credentials secret", func(t *testing.T) { - contents := map[string]interface{}{ + expected := map[string]interface{}{ "apikey": "123456", "authentication": map[string]interface{}{ "username": "user", "password": "pass", }, } - jsonContents, _ := json.Marshal(contents) - expected := map[string]interface{}{ - "credentials": string(jsonContents), - } GetSecretsTest(t, "ibmcloud/service_credentials/secrets/groups/small-group/my-secret", "", expected) GetIndividualSecretTest(t, "ibmcloud/service_credentials/secrets/groups/small-group/my-secret", "credentials", "", expected["credentials"]) GetIndividualSecretTest(t, "ibmcloud/service_credentials/secrets/groups/small-group/my-secret", "doesnotexist", "", nil) }) t.Run("Retrieves payload of service credentials secret (versioned)", func(t *testing.T) { - contents := map[string]interface{}{ + expected := map[string]interface{}{ "apikey": "old-123456", "authentication": map[string]interface{}{ "username": "old-user", "password": "old-pass", }, } - jsonContents, _ := json.Marshal(contents) - expected := map[string]interface{}{ - "credentials": string(jsonContents), - } GetSecretsTest(t, "ibmcloud/service_credentials/secrets/groups/small-group/my-secret", "123", expected) GetIndividualSecretTest(t, "ibmcloud/service_credentials/secrets/groups/small-group/my-secret", "credentials", "123", expected["credentials"]) GetIndividualSecretTest(t, "ibmcloud/service_credentials/secrets/groups/small-group/my-secret", "doesnotexist", "123", nil) From 0f41f6ff4239ad431652ac8ff71e7d4397ea73ab Mon Sep 17 00:00:00 2001 From: Jarek Gawor Date: Thu, 18 Apr 2024 23:56:15 -0400 Subject: [PATCH 4/4] go mod tidy Signed-off-by: Jarek Gawor --- go.sum | 5 ----- 1 file changed, 5 deletions(-) diff --git a/go.sum b/go.sum index 478dd162..cc280517 100644 --- a/go.sum +++ b/go.sum @@ -150,8 +150,6 @@ github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/IBM/go-sdk-core/v5 v5.14.1 h1:WR1r0zz+gDW++xzZjF41r9ueY4JyjS2vgZjiYs8lO3c= github.com/IBM/go-sdk-core/v5 v5.14.1/go.mod h1:MUvIr/1mgGh198ZXL+ByKz9Qs1JoEh80v/96x8jPXNY= -github.com/IBM/secrets-manager-go-sdk v1.2.0 h1:bgFfBF+LjHLtUfV3hTLkfgE8EjFsJaeU2icA2Hg+M50= -github.com/IBM/secrets-manager-go-sdk v1.2.0/go.mod h1:qv+tQg8Z3Vb11DQYxDjEGeROHDtTLQxUWuOIrIdWg6E= github.com/IBM/secrets-manager-go-sdk/v2 v2.0.4 h1:xa9e+POVqaXxXHXkSMCOVAbKdUNEu86jQmo5hcpd+L4= github.com/IBM/secrets-manager-go-sdk/v2 v2.0.4/go.mod h1:5gq8D8uWOIbqOm1uztay6lpOysgJaxxEsaVZLWGWb40= github.com/Jeffail/gabs v1.1.1 h1:V0uzR08Hj22EX8+8QMhyI9sX2hwRu+/RJhJUmnwda/E= @@ -525,7 +523,6 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= @@ -643,7 +640,6 @@ github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qK github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gophercloud/gophercloud v0.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -949,7 +945,6 @@ github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= github.com/jarcoal/httpmock v1.0.7 h1:d1a2VFpSdm5gtjhCPWsQHSnx8+5V3ms5431YwvmkuNk= github.com/jarcoal/httpmock v1.0.7/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=