diff --git a/aeadutils.go b/aeadutils.go index ac7812e..ac702e2 100644 --- a/aeadutils.go +++ b/aeadutils.go @@ -2,18 +2,27 @@ package aeadplugin import ( "bytes" + "crypto/tls" "encoding/json" "fmt" + "io" + "math/rand" + "net/http" + "net/url" "strconv" "strings" + "time" + + lorem "github.com/bozaro/golorem" + backoff "github.com/cenkalti/backoff/v4" "github.com/google/tink/go/aead" "github.com/google/tink/go/daead" "github.com/google/tink/go/insecurecleartextkeyset" "github.com/google/tink/go/keyset" "github.com/google/tink/go/tink" - hclog "github.com/hashicorp/go-hclog" + "github.com/hashicorp/go-retryablehttp" ) func CreateInsecureHandleAndAead(rawKeyset string) (*keyset.Handle, tink.AEAD, error) { @@ -391,8 +400,8 @@ func isEncryptionJsonKey(keyStr string) bool { return strings.Contains(keyStr, "primaryKeyId") } -func isKeyJsonDeterministic(encryptionkey interface{}) (string, bool) { - encryptionKeyStr := fmt.Sprintf("%v", encryptionkey) +func isKeyJsonDeterministic(encryptionkeyIntf interface{}) (string, bool) { + encryptionKeyStr := fmt.Sprintf("%v", encryptionkeyIntf) deterministic := false if strings.Contains(encryptionKeyStr, "AesSivKey") { deterministic = true @@ -400,29 +409,8 @@ func isKeyJsonDeterministic(encryptionkey interface{}) (string, bool) { return encryptionKeyStr, deterministic } -func getEncryptionKey(fieldName string, setDepth ...int) (interface{}, bool) { - maxDepth := 5 - if len(setDepth) > 0 { - maxDepth = setDepth[0] - } - possiblyEncryptionKey, ok := AEAD_CONFIG.Get(fieldName) - if !ok { - return nil, ok - } - for i := 1; i < maxDepth; i++ { - possiblyEncryptionKeyStr := possiblyEncryptionKey.(string) - if !isEncryptionJsonKey(possiblyEncryptionKeyStr) { - possiblyEncryptionKey, ok = AEAD_CONFIG.Get(possiblyEncryptionKeyStr) - if !ok { - return nil, ok - } - } else { - return possiblyEncryptionKey, true - } - } - - isKeysetFound := false - return nil, isKeysetFound +func IsKeyJsonDeterministic(encryptionkeyIntf interface{}) (string, bool) { + return isKeyJsonDeterministic(encryptionkeyIntf) } func muteKeyMaterial(theKey string) string { @@ -444,3 +432,232 @@ func muteKeyMaterial(theKey string) string { } return mutedMaterial } + +func createHttpClient(httpProxy string) *retryablehttp.Client { + var tr *http.Transport + if httpProxy == "" { + tr = &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + } + } else { + proxyUrl, _ := url.Parse(httpProxy) + tr = &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + Proxy: http.ProxyURL(proxyUrl), + } + } + + httpClient := &http.Client{Transport: tr} + client := retryablehttp.NewClient() + client.HTTPClient = httpClient + client.RetryMax = 10 // max 10 retries + client.RetryWaitMax = 300 * time.Second // max 5 mins between retries + return client +} + +func goDoHttp(inputData map[string]interface{}, url string, bodyMap map[string]interface{}, httpProxy string, token string) error { + + client := createHttpClient(httpProxy) + payloadBytes, err := json.Marshal(inputData) + if err != nil { + fmt.Printf("goDoHttp json.Marshal Error=%v\n", err) + return err + } + inputBody := bytes.NewReader(payloadBytes) + + req, err := retryablehttp.NewRequest(http.MethodPost, url, inputBody) + + if err != nil { + fmt.Printf("goDoHttp http.NewRequest Error=%v\n", err) + return err + } + req.Header.Set("X-Vault-Token", token) + req.Header.Set("Content-Type", "application/json") + + resp, err := client.Do(req) + if err != nil { + fmt.Printf("goDoHttp client.Do Error=%v\n", err) + return err + } + + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Printf("goDoHttp io.ReadAll Error=%v\n", err) + return err + } + + err = json.Unmarshal([]byte(body), &bodyMap) + if err != nil { + fmt.Printf("goDoHttp Unmarshall Error=%v\n", err) + return err + } + return nil +} + +func EncryptOrDecryptDataChan(url string, inputMap map[string]interface{}, httpProxy string, token string, ch chan map[string]interface{}) { + dataMap, err := EncryptOrDecryptData(url, inputMap, httpProxy, token) + if err != nil { + // TODO - not sure on putting a panic here + panic(err) + } + ch <- dataMap +} + +func EncryptOrDecryptData(url string, inputMap map[string]interface{}, httpProxy string, token string) (map[string]interface{}, error) { + + response := make(map[string]interface{}) + emptyMap := make(map[string]interface{}) + data := make(map[string]interface{}) + ok := true + i := 0 + + // I absolutely hate that you can only wrap a function with no args that returns an error "func() error" here + // so I have to rely on variable scope, but life is too short + operation := func() error { + // if i > 0 { + // fmt.Printf("Retry=%v encryptOrDecryptData\n", i) + // } + i++ + err := goDoHttp(inputMap, url, response, httpProxy, token) + if err != nil { + fmt.Printf("encryptOrDecryptData Try=%v Error after goDoHttp=%v\n", i, err) + return err + } + data, ok = response["data"].(map[string]interface{}) + if !ok { + errors, ok := response["errors"].([]interface{}) + if ok { + // we have errors from vault + fmt.Printf("encryptOrDecryptData Try=%v Vault Response=%v\n", i, errors) + return fmt.Errorf("error response from vault %v", errors) + } else { + // we have errors but no idea why + fmt.Printf("encryptOrDecryptData Try=%v Vault Response - no idea\n", i) + return fmt.Errorf("error converting response to map[string]interface{}") + } + } + return nil // or an error + } + xbo := backoff.NewExponentialBackOff() + xbo.MaxElapsedTime = 15 * time.Minute + err := backoff.Retry(operation, xbo) + if err != nil { + // Handle error. + return emptyMap, err + } + + return data, nil +} + +func makeInputdata(inputMap map[string]map[string]interface{}, rows int, fields int, baseName string) { + for i := 0; i < rows; i++ { + s := fmt.Sprint(i) + inputMap[s] = map[string]interface{}{} + + for j := 0; j < fields; j++ { + randomStr := "" + randomInt := rand.Intn(6) + switch randomInt { + case 0: + randomStr = lorem.New().Email() + case 1: + randomStr = lorem.New().FirstName(lorem.Female) + case 2: + randomStr = lorem.New().FullName(lorem.Male) + case 3: + randomStr = lorem.New().Host() + case 4: + randomStr = lorem.New().Url() + case 5: + randomStr = lorem.New().Word(0, 10) + default: + randomStr = lorem.New().Word(0, 10) + } + + inputMap[s][baseName+fmt.Sprint(j)] = randomStr + + } + } +} + +func createSliceOfMapsFromMap(inputMap map[string]map[string]interface{}, maxSize int) []map[string]map[string]interface{} { + + // create a slice of maps with zero elements and max size + batchMaps := make([]map[string]map[string]interface{}, 0, maxSize) + // make the fist element of the slice and empty (but not nil) map + batchMaps = append(batchMaps, make(map[string]map[string]interface{})) + + i, n := 0, 0 + for k, v := range inputMap { + n++ + + batchMaps[i][k] = v + + if n%maxSize == 0 && n != len(inputMap) { + // create a new element of the slice if we are at max size but not at the last element + i++ + batchMaps = append(batchMaps, make(map[string]map[string]interface{})) + } + } + + return batchMaps +} + +func createMapFromSliceOfMaps(sliceMap []map[string]map[string]interface{}) map[string]map[string]interface{} { + + newMap := make(map[string]map[string]interface{}) + + for _, innerMap := range sliceMap { + for ki, vi := range innerMap { + newMap[ki] = vi + } + } + + return newMap +} + +func createSliceOfMapsFromMapStrInt(inputMap map[string]interface{}, maxSize int) []map[string]interface{} { + + // create a slice of maps with zero elements and max size + batchMaps := make([]map[string]interface{}, 0, maxSize) + // make the fist element of the slice and empty (but not nil) map + batchMaps = append(batchMaps, make(map[string]interface{})) + + // if the map is les than or equal to the maxSize, then the map is the first and opnly element + if len(inputMap) <= maxSize { + batchMaps[0] = inputMap + return batchMaps + } + + i, n := 0, 0 + l := len(inputMap) + + for k, v := range inputMap { + n++ + + batchMaps[i][k] = v + + if n%maxSize == 0 && n != l { + // create a new element of the slice if we are at max size but not at the last element + i++ + batchMaps = append(batchMaps, make(map[string]interface{})) + } + } + + return batchMaps +} + +func createMapFromSliceOfMapsStrInt(sliceMap []map[string]interface{}) map[string]interface{} { + + newMap := make(map[string]interface{}) + + for _, innerMap := range sliceMap { + for ki, vi := range innerMap { + newMap[ki] = vi + } + } + + return newMap +} diff --git a/aeadutils_test.go b/aeadutils_test.go index 276adef..f8822c9 100644 --- a/aeadutils_test.go +++ b/aeadutils_test.go @@ -668,4 +668,76 @@ func TestAeadUtils(t *testing.T) { } }) + + t.Run("test mapSlice", func(t *testing.T) { + + var inputMap = map[string]map[string]interface{}{} + + makeInputdata(inputMap, 10, 6, "field") + + // define the max number of items in each slice + // initialize an empty slice of the correct type, max capacity same as the chunksize + mapSlice := createSliceOfMapsFromMap(inputMap, 11) + + if len(mapSlice) != 1 { + t.Errorf("Expected Slice length of: %v got: %v", 1, len(mapSlice)) + } + + mapSlice = createSliceOfMapsFromMap(inputMap, 3) + + if len(mapSlice) != 4 { + t.Errorf("Expected Slice length of: %v got: %v", 4, len(mapSlice)) + } + + mapSlice = createSliceOfMapsFromMap(inputMap, 10) + + if len(mapSlice) != 1 { + t.Errorf("Expected Slice length of: %v got: %v", 1, len(mapSlice)) + } + + mapSlice = createSliceOfMapsFromMap(inputMap, 1) + + if len(mapSlice) != 10 { + t.Errorf("Expected Slice length of: %v got: %v", 10, len(mapSlice)) + } + + newMap := createMapFromSliceOfMaps(mapSlice) + + if !reflect.DeepEqual(newMap, inputMap) { + t.Errorf("Reassembled Map is not the same as original") + + } + + }) + + t.Run("test mapSliceNew", func(t *testing.T) { + + var inputMap = map[string]map[string]interface{}{} + + makeInputdata(inputMap, 10, 6, "field") + + //newMap, ok := inputMap.(map[string]interface{}) + + var inputMapNew = map[string]interface{}{} + for k, v := range inputMap { + inputMapNew[k] = v + } + + // define the max number of items in each slice + // initialize an empty slice of the correct type, max capacity same as the chunksize + mapSlice := createSliceOfMapsFromMapStrInt(inputMapNew, 3) + + if len(mapSlice) != 4 { + t.Errorf("Expected Slice length of: %v got: %v", 4, len(mapSlice)) + } + + newMap := createMapFromSliceOfMapsStrInt(mapSlice) + + if !reflect.DeepEqual(newMap, inputMapNew) { + t.Errorf("Reassembled Map is not the same as original") + + } + + }) + } diff --git a/backend.go b/backend.go index e5eac21..28c5860 100644 --- a/backend.go +++ b/backend.go @@ -337,6 +337,42 @@ func Backend(c *logical.BackendConfig) *backend { }, }, }, + // aead/encryptcolfarm + &framework.Path{ + Pattern: "encryptcolfarm", + HelpSynopsis: "Encrypt or decrypt data with the aead key held in config", + HelpDescription: "Encrypt or decrypt data with the aead key held in config", + Fields: map[string]*framework.FieldSchema{ + "aeadData": &framework.FieldSchema{ + Type: framework.TypeString, + Description: "Data to be (d)encrypted", + Default: "", + }, + }, + Operations: map[logical.Operation]framework.OperationHandler{ + logical.UpdateOperation: &framework.PathOperation{ + Callback: b.pathAeadEncryptBulkColFarm, + }, + }, + }, + // aead/decryptcolfarm + &framework.Path{ + Pattern: "decryptcolfarm", + HelpSynopsis: "Encrypt or decrypt data with the aead key held in config", + HelpDescription: "Encrypt or decrypt data with the aead key held in config", + Fields: map[string]*framework.FieldSchema{ + "aeadData": &framework.FieldSchema{ + Type: framework.TypeString, + Description: "Data to be (d)encrypted", + Default: "", + }, + }, + Operations: map[logical.Operation]framework.OperationHandler{ + logical.UpdateOperation: &framework.PathOperation{ + Callback: b.pathAeadDecryptBulkColFarm, + }, + }, + }, // aead/updateKeyStatus &framework.Path{ Pattern: "updateKeyStatus", diff --git a/cloudbuild_sub.yaml b/cloudbuild_sub.yaml index 12c6a08..ade5c3b 100644 --- a/cloudbuild_sub.yaml +++ b/cloudbuild_sub.yaml @@ -1,12 +1,12 @@ steps: - - name: 'gcr.io/cloud-builders/go:1.17' + - name: 'gcr.io/cloud-builders/go:1.18' id: 'go-test' args: - '-c' - | - go test -v -race + go test -v entrypoint: /bin/sh - - name: 'gcr.io/cloud-builders/go:1.17' + - name: 'gcr.io/cloud-builders/go:1.18' id: 'go-build' waitFor: ['go-test'] args: @@ -45,6 +45,6 @@ logsBucket: 'gs://${_BUILD_PROJECT}-logging' options: workerPool: projects/${_BUILD_PROJECT}/locations/europe-west1/workerPools/worker-pool2 env: - - 'GOPRIVATE=github.com/pierrec,google.golang.org' + - 'GOPRIVATE=github.com/pierrec,*.golang.org' - 'GOOS=linux' - 'GOARCH=amd64' diff --git a/cmd/performance/performance.go b/cmd/performance/performance.go index 1e52872..69fca22 100644 --- a/cmd/performance/performance.go +++ b/cmd/performance/performance.go @@ -17,7 +17,6 @@ import ( "math/rand" "net/http" "net/http/httputil" - "net/url" "path/filepath" "reflect" "strconv" @@ -26,9 +25,8 @@ import ( "cloud.google.com/go/bigquery" "cloud.google.com/go/civil" + aeadplugin "github.com/Vodafone/vault-plugin-aead" lorem "github.com/bozaro/golorem" - backoff "github.com/cenkalti/backoff/v4" - "github.com/hashicorp/go-retryablehttp" "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/host" "github.com/shirou/gopsutil/mem" @@ -62,6 +60,8 @@ type Options struct { waitUntil string columnBased bool kubeStats bool + farmBased bool + fixData string } type Results struct { @@ -142,6 +142,8 @@ func main() { waitUntil := flag.String("w", "", "UTC datetime in the format of 2022-03-28 11:05 YYYY-MM-DD HH24:MM to delay until") columnBased := flag.Bool("col", false, "column based ops (only if batchMode = true)") kubeStats := flag.Bool("k", false, "collect kube stat averages") + farmBased := flag.Bool("farm", false, "farm based column ops (only if batchMode = true)") + fixData := flag.String("fix", "", "fix the dta - no randomisation") flag.Parse() @@ -160,6 +162,8 @@ func main() { options.waitUntil = *waitUntil options.columnBased = *columnBased options.kubeStats = *kubeStats + options.farmBased = *farmBased + options.fixData = *fixData doWaitIfRequired(options) @@ -303,10 +307,14 @@ func gotestBulk(options *Options, ch chan bool) { if options.columnBased && options.batchMode { fmt.Println("COLUMN BASED BULK ENCRYPT") url = options.url + "/v1/" + options.path + "/encryptcol" + if options.farmBased { + url = options.url + "/v1/" + options.path + "/encryptcolfarm" + } } else { url = options.url + "/v1/" + options.path + "/encrypt" } - encryptedBulkMap, err := encryptOrDecryptData(url, bulkInputMap, options) + + encryptedBulkMap, err := aeadplugin.EncryptOrDecryptData(url, bulkInputMap, options.httpProxy, options.token) if err != nil { panic(err) } @@ -322,10 +330,13 @@ func gotestBulk(options *Options, ch chan bool) { if options.columnBased && options.batchMode { fmt.Println("COLUMN BASED BULK DECRYPT") url = options.url + "/v1/" + options.path + "/decryptcol" + if options.farmBased { + url = options.url + "/v1/" + options.path + "/decryptcolfarm" + } } else { url = options.url + "/v1/" + options.path + "/decrypt" } - decryptedBulkMap, err = encryptOrDecryptData(url, encryptedBulkMap, options) + decryptedBulkMap, err = aeadplugin.EncryptOrDecryptData(url, encryptedBulkMap, options.httpProxy, options.token) if err != nil { panic(err) } @@ -362,29 +373,6 @@ func gotestBulk(options *Options, ch chan bool) { ch <- success } -func createHttpClient(options *Options) *retryablehttp.Client { - var tr *http.Transport - if options.httpProxy == "" { - tr = &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, - } - } else { - proxyUrl, _ := url.Parse(options.httpProxy) - tr = &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, - Proxy: http.ProxyURL(proxyUrl), - } - } - - // Hmmm dodgy - httpClient := &http.Client{Transport: tr} - client := retryablehttp.NewClient() - client.HTTPClient = httpClient - client.RetryMax = 10 // max 10 retries - client.RetryWaitMax = 300 * time.Second // max 5 mins between retries - return client -} - func gotest(options *Options, ch chan bool) { // client := createHttpClient(options) @@ -419,11 +407,11 @@ func gotest(options *Options, ch chan bool) { fmt.Printf("%v START ENCRYPT\n", time.Since(t)) t = time.Now() - for k, v := range originalDataMap { + for k, inputRowAsMap := range originalDataMap { // send each row, one at a time as map[string]interface{} // fmt.Printf("Key=%v Value=%v", k, v) url := options.url + "/v1/" + options.path + "/encrypt" - encryptedRowMap, err = encryptOrDecryptData(url, v, options) + encryptedRowMap, err = aeadplugin.EncryptOrDecryptData(url, inputRowAsMap, options.httpProxy, options.token) if err != nil { panic(err) } @@ -436,10 +424,10 @@ func gotest(options *Options, ch chan bool) { } t = time.Now() - for k, v := range encryptedMap { + for k, inputRowAsMap := range encryptedMap { // fmt.Printf("Key=%v Value=%v", k, v) url := options.url + "/v1/" + options.path + "/decrypt" - decryptedRowMap, err = encryptOrDecryptData(url, v, options) + decryptedRowMap, err = aeadplugin.EncryptOrDecryptData(url, inputRowAsMap, options.httpProxy, options.token) if err != nil { panic(err) } @@ -480,124 +468,49 @@ func gotest(options *Options, ch chan bool) { // return dataDecrypted // } -func encryptOrDecryptData(url string, inputMap map[string]interface{}, options *Options) (map[string]interface{}, error) { - - response := make(map[string]interface{}) - emptyMap := make(map[string]interface{}) - data := make(map[string]interface{}) - ok := true - i := 0 - - // I absolutely hate that you can only wrap a function with no args that returns an error "func() error" here - // so I have to rely on variable scope, but life is too short - operation := func() error { - // if i > 0 { - // fmt.Printf("Retry=%v encryptOrDecryptData\n", i) - // } - i++ - err := goDoHttp(inputMap, url, response, options) - if err != nil { - fmt.Printf("encryptOrDecryptData Try=%v Error after goDoHttp=%v\n", i, err) - return err - } - data, ok = response["data"].(map[string]interface{}) - if !ok { - errors, ok := response["errors"].([]interface{}) - if ok { - // we have errors from vault - fmt.Printf("encryptOrDecryptData Try=%v Vault Response=%v\n", i, errors) - return fmt.Errorf("error response from vault %v", errors) - } else { - // we have errors but no idea why - fmt.Printf("encryptOrDecryptData Try=%v Vault Response - no idea\n", i) - return fmt.Errorf("error converting response to map[string]interface{}") - } - } - return nil // or an error - } - xbo := backoff.NewExponentialBackOff() - xbo.MaxElapsedTime = 15 * time.Minute - err := backoff.Retry(operation, xbo) - if err != nil { - // Handle error. - return emptyMap, err - } - - return data, nil -} - func makeRandomData(inputMap map[int]map[string]interface{}, options *Options) { // fmt.Println("Options:", options) - for i := 0; i < options.rowNumber; i++ { - inputMap[i] = map[string]interface{}{} - - for j := 0; j < options.fieldNumber; j++ { - randomStr := "" - randomInt := rand.Intn(6) - switch randomInt { - case 0: - randomStr = lorem.New().Email() - case 1: - randomStr = lorem.New().FirstName(lorem.Female) - case 2: - randomStr = lorem.New().FullName(lorem.Male) - case 3: - randomStr = lorem.New().Host() - case 4: - randomStr = lorem.New().Url() - case 5: - randomStr = lorem.New().Word(0, 10) - default: - randomStr = lorem.New().Word(0, 10) - } - - inputMap[i][options.baseFieldName+fmt.Sprint(j)] = randomStr + if options.fixData == "" { + for i := 0; i < options.rowNumber; i++ { + inputMap[i] = map[string]interface{}{} + + for j := 0; j < options.fieldNumber; j++ { + randomStr := "" + randomInt := rand.Intn(6) + switch randomInt { + case 0: + randomStr = lorem.New().Email() + case 1: + randomStr = lorem.New().FirstName(lorem.Female) + case 2: + randomStr = lorem.New().FullName(lorem.Male) + case 3: + randomStr = lorem.New().Host() + case 4: + randomStr = lorem.New().Url() + case 5: + randomStr = lorem.New().Word(0, 10) + default: + randomStr = lorem.New().Word(0, 10) + } + + inputMap[i][options.baseFieldName+fmt.Sprint(j)] = randomStr + } } - } -} - -func goDoHttp(inputData map[string]interface{}, url string, bodyMap map[string]interface{}, options *Options) error { - - client := createHttpClient(options) - payloadBytes, err := json.Marshal(inputData) - if err != nil { - fmt.Printf("goDoHttp json.Marshal Error=%v\n", err) - return err - } - inputBody := bytes.NewReader(payloadBytes) - - req, err := retryablehttp.NewRequest(http.MethodPost, url, inputBody) - - if err != nil { - fmt.Printf("goDoHttp http.NewRequest Error=%v\n", err) - return err - } - req.Header.Set("X-Vault-Token", options.token) - req.Header.Set("Content-Type", "application/json") + } else { + for i := 0; i < options.rowNumber; i++ { + inputMap[i] = map[string]interface{}{} - resp, err := client.Do(req) - if err != nil { - fmt.Printf("goDoHttp client.Do Error=%v\n", err) - return err - } + for j := 0; j < options.fieldNumber; j++ { - defer resp.Body.Close() + inputMap[i][options.baseFieldName+fmt.Sprint(j)] = options.fixData - body, err := io.ReadAll(resp.Body) - if err != nil { - fmt.Printf("goDoHttp io.ReadAll Error=%v\n", err) - return err - } - - err = json.Unmarshal([]byte(body), &bodyMap) - if err != nil { - fmt.Printf("goDoHttp Unmarshall Error=%v\n", err) - return err + } + } } - return nil } func goGetConfig(options *Options) { diff --git a/go.mod b/go.mod index d37a95d..8c6324c 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/Vodafone/vault-plugin-aead -go 1.17 +go 1.18 require ( cloud.google.com/go v0.104.0 @@ -21,7 +21,10 @@ require ( github.com/orcaman/concurrent-map v1.0.0 github.com/pkg/errors v0.9.1 github.com/shirou/gopsutil v3.21.11+incompatible - github.com/stretchr/testify v1.8.0 + github.com/stretchr/testify v1.8.1 + go.opentelemetry.io/otel v1.12.0 + go.opentelemetry.io/otel/exporters/jaeger v1.12.0 + go.opentelemetry.io/otel/sdk v1.12.0 golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55 k8s.io/apimachinery v0.25.3 @@ -32,8 +35,6 @@ require ( require ( cloud.google.com/go/compute v1.10.0 // indirect cloud.google.com/go/iam v0.5.0 // indirect - github.com/PuerkitoBio/purell v1.2.0 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/armon/go-radix v1.0.0 // indirect github.com/cenkalti/backoff/v3 v3.2.2 // indirect @@ -43,6 +44,7 @@ require ( github.com/fatih/color v1.13.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect @@ -61,11 +63,9 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect github.com/googleapis/gax-go/v2 v2.6.0 // indirect - github.com/googleapis/gnostic v0.5.5 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-kms-wrapping/entropy v0.1.0 // indirect github.com/hashicorp/go-kms-wrapping/entropy/v2 v2.0.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-plugin v1.4.5 // indirect @@ -82,7 +82,6 @@ require ( github.com/imdario/mergo v0.3.13 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/jstemmer/go-junit-report v1.0.0 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/matryer/is v1.4.0 // indirect @@ -102,23 +101,20 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/objx v0.4.0 // indirect github.com/tklauser/go-sysconf v0.3.10 // indirect github.com/tklauser/numcpus v0.5.0 // indirect github.com/ugorji/go/codec v1.2.7 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect go.opencensus.io v0.23.0 // indirect + go.opentelemetry.io/otel/trace v1.12.0 // indirect go.uber.org/atomic v1.10.0 // indirect golang.org/x/crypto v0.0.0-20221012134737-56aed061732a // indirect - golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/net v0.0.0-20221019024206-cb67ada4b0ad // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.1.0 // indirect golang.org/x/term v0.0.0-20221017184919-83659145692c // indirect golang.org/x/text v0.4.0 // indirect golang.org/x/time v0.1.0 // indirect - golang.org/x/tools v0.1.12 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.100.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/go.sum b/go.sum index ce41f98..2741e06 100644 --- a/go.sum +++ b/go.sum @@ -17,7 +17,6 @@ cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKP cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= @@ -36,7 +35,6 @@ cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNF cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigquery v1.42.0 h1:JuTk8po4bCKRwObdT0zLb1K0BGkGHJdtgs2GK3j2Gws= cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= @@ -44,6 +42,7 @@ cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTB cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.10.0 h1:aoLIYaA1fX3ywihqpBk2APQKOo20nXsp1GEZQbx5Jk4= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/datacatalog v1.6.0 h1:xzXGAE2fAuMh+ksODKr9nRv9ega1vHjFwRqMA8tRrVE= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= @@ -54,7 +53,6 @@ cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxs cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.25.1 h1:l0wCNZKuEp2Q54wAy8283EV9O57+7biWOXnnU2/Tq/A= cloud.google.com/go/pubsub v1.25.1/go.mod h1:bY6l7rF8kCcwz6V3RaQ6kK4p5g7qc7PqjRoE9wDOqOU= @@ -62,42 +60,23 @@ cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiy cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.23.0 h1:wWRIaDURQA8xxHguFCshYepGlrWIrbBnAmc7wfg07qY= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.2.0 h1:/Jdm5QfyM8zdlqT6WVZU4cfP23sot6CEHA4CS49Ezig= -github.com/PuerkitoBio/purell v1.2.0/go.mod h1:OhLRTaaIzhvIyofkJfB24gokC7tM42Px5UhoT32THBk= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.9 h1:O2sNqxBdvq8Eq5xmzljcYzAORli6RWCvEym4cJf9m18= -github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.36.29/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -105,12 +84,8 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bozaro/golorem v0.0.0-20170501165920-50e5b610280b h1:D3YtkBLwtjFPegR4lwiwoCiV+f7bOq/MDh6Xi+nEq3Q= github.com/bozaro/golorem v0.0.0-20170501165920-50e5b610280b/go.mod h1:gqvWc1EBvN2S3BBwczsP6n4MFQzpHRffNXxK2pebPPA= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3eG1c= -github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= -github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= -github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -135,9 +110,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs 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/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -149,61 +121,40 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.5.0 h1:bAmFiUJ+o0o2B4OiTFeE3MqCOtyo+jjPP9iZ0VRxYUc= -github.com/evanphx/json-patch/v5 v5.5.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= 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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= github.com/frankban/quicktest v1.13.0 h1:yNZif1OkDfNoDfb9zZa9aXIpejNR4F23Wely0c+Qdqk= -github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= -github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= -github.com/go-ldap/ldap/v3 v3.1.10/go.mod h1:5Zun81jBTabRaI8lzN7E1JjyEl1g6zI6u9pd8luAK4Q= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= 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.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= 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-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= @@ -212,16 +163,10 @@ github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0= -github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.2 h1:onZX1rnHT3Wv6cqNgYyFOOlgVKJrksuCMCRvJStbMYw= -github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= -github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -260,13 +205,11 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= 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= @@ -289,14 +232,11 @@ github.com/google/go-github/v47 v47.1.1-0.20220927202716-0c3cd12a1e6d/go.mod h1: github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= @@ -315,29 +255,20 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/tink/go v1.6.1 h1:t7JHqO8Ath2w2ig5vjwQYJzhGEZymedQc90lQXUBa4I= -github.com/google/tink/go v1.6.1/go.mod h1:IGW53kTgag+st5yPhKKwJ6u2l+SSp5/v9XF7spovjlY= github.com/google/tink/go v1.7.0 h1:6Eox8zONGebBFcCBqkVmt60LaWZa6xg1cl/DwAh/J1w= github.com/google/tink/go v1.7.0/go.mod h1:GAUOd+QE3pgj9q8VKIGTCP33c/B7eb4NhxLcgTJZStM= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gax-go/v2 v2.6.0 h1:SXk3ABtQYDT/OH8jAyvEOQ58mgawq5C4o/4/89qN2ZU= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= @@ -346,65 +277,36 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= -github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.1.0 h1:QsGcniKx5/LuX2eYoeL+Np3UKYPNaN7YKpTh29h8rbw= -github.com/hashicorp/go-hclog v1.1.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo= github.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-kms-wrapping/entropy v0.1.0 h1:xuTi5ZwjimfpvpL09jDE71smCBRpnF5xfo871BSX4gs= -github.com/hashicorp/go-kms-wrapping/entropy v0.1.0/go.mod h1:d1g9WGtAunDNpek8jUIEJnBlbgKS1N2Q61QkHiZyR1g= github.com/hashicorp/go-kms-wrapping/entropy/v2 v2.0.0 h1:pSjQfW3vPtrOTcasTUKgCTQT7OGPPTTMVRrOfU6FJD8= github.com/hashicorp/go-kms-wrapping/entropy/v2 v2.0.0/go.mod h1:xvb32K2keAc+R8DSFG2IwDcydK9DBQE+fGA5fsw6hSk= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= -github.com/hashicorp/go-plugin v1.4.3 h1:DXmvivbWD5qdiBts9TpBC7BYL1Aia5sxbRgQB+v6UZM= -github.com/hashicorp/go-plugin v1.4.3/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= github.com/hashicorp/go-plugin v1.4.5 h1:oTE/oQR4eghggRg8VY7PAz3dr++VwDNBGCcOfIvHpBo= github.com/hashicorp/go-plugin v1.4.5/go.mod h1:viDMjcLJuDui6pXb8U4HVfb8AamCWhHGUjr2IrTF67s= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.6.6 h1:HJunrbHTDDbBb/ay4kxa1n+dLmttUlnP3V9oNE4hmsM= -github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ= github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-secure-stdlib/base62 v0.1.1/go.mod h1:EdWO6czbmthiwZ3/PUsDV+UD1D5IRU4ActiaWGwt0Yw= -github.com/hashicorp/go-secure-stdlib/mlock v0.1.1 h1:cCRo8gK7oq6A2L6LICkUZ+/a5rLiRXFMf1Qd4xSwxTc= -github.com/hashicorp/go-secure-stdlib/mlock v0.1.1/go.mod h1:zq93CJChV6L9QTfGKtfBxKqD7BqqXx5O04A/ns2p5+I= github.com/hashicorp/go-secure-stdlib/mlock v0.1.2 h1:p4AKXPPS24tO8Wc8i1gLvSKdmkiSY5xuju57czJ/IJQ= github.com/hashicorp/go-secure-stdlib/mlock v0.1.2/go.mod h1:zq93CJChV6L9QTfGKtfBxKqD7BqqXx5O04A/ns2p5+I= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.1 h1:78ki3QBevHwYrVxnyVeaEz+7WtifHhauYF23es/0KlI= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.1/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 h1:UpiO20jno/eV1eVZcxqWnUohyKRe1g8FPV/xH1s/2qs= github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= -github.com/hashicorp/go-secure-stdlib/password v0.1.1/go.mod h1:9hH302QllNwu1o2TGYtSk8I8kTAN0ca1EHpwhm5Mmzo= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.1 h1:nd0HIW15E6FG1MsnArYaHfuw9C2zgzM8LxkG5Ty/788= github.com/hashicorp/go-secure-stdlib/strutil v0.1.1/go.mod h1:gKOamz3EwoIoJq7mlMIRBpVTAUn8qPCrEclOKKWhD3U= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= -github.com/hashicorp/go-secure-stdlib/tlsutil v0.1.1/go.mod h1:l8slYwnJA26yBz+ErHpp2IRCLr0vuOMGBORIz4rRiAs= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -413,33 +315,18 @@ github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+l github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= -github.com/hashicorp/vault/api v1.3.1 h1:pkDkcgTh47PRjY1NEFeofqR4W/HkNUi9qIakESO2aRM= -github.com/hashicorp/vault/api v1.3.1/go.mod h1:QeJoWxMFt+MsuWcYhmwRLwKEXrjwAFFywzhptMsTIUw= github.com/hashicorp/vault/api v1.8.1 h1:bMieWIe6dAlqAAPReZO/8zYtXaWUg/21umwqGZpEjCI= github.com/hashicorp/vault/api v1.8.1/go.mod h1:uJrw6D3y9Rv7hhmS17JQC50jbPDAZdjZoTtrCCxxs7E= -github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= -github.com/hashicorp/vault/sdk v0.3.0 h1:kR3dpxNkhh/wr6ycaJYqp6AFT/i2xaftbfnwZduTKEY= -github.com/hashicorp/vault/sdk v0.3.0/go.mod h1:aZ3fNuL5VNydQk8GcLJ2TV8YCRVvyaakYkhZRoVuhj0= github.com/hashicorp/vault/sdk v0.6.0 h1:6Z+In5DXHiUfZvIZdMx7e2loL1PPyDjA4bVh9ZTIAhs= github.com/hashicorp/vault/sdk v0.6.0/go.mod h1:+DRpzoXIdMvKc88R4qxr+edwy/RvH5QK8itmxLiDHLc= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= -github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= 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/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE= -github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= 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.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -447,10 +334,7 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u 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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jstemmer/go-junit-report v1.0.0 h1:8X1gzZpR+nVQLAht+L/foqOeX2l9DTZoaIPbEQHxsds= -github.com/jstemmer/go-junit-report v1.0.0/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 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= @@ -471,53 +355,34 @@ github.com/machinebox/graphql v0.2.2 h1:dWKpJligYKhYKO5A2gvNhkJdQMNZeChZYyBbrZkB github.com/machinebox/graphql v0.2.2/go.mod h1:F+kbVMHuwrQ5tYgU9JXlnskM8nOaFxCAEolaQybkjWA= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= 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= @@ -525,40 +390,19 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= github.com/orcaman/concurrent-map v1.0.0 h1:I/2A2XPCb4IuQWcQhBhSwGfiuybl/J0ev9HDbW65HOY= github.com/orcaman/concurrent-map v1.0.0/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.5.2+incompatible h1:WCjObylUIOlKy/+7Abdn34TLIkXiA4UWUMhxq9m9ZXI= -github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -594,38 +438,31 @@ github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMT github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 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.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 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 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo= -github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= -github.com/tklauser/numcpus v0.3.0 h1:ILuRUQBtssgnxw0XXIjKUC56fgnOrFoQQ/4+DeU2biQ= -github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/tklauser/numcpus v0.5.0 h1:ooe7gN0fg6myJ0EKoTAf5hebTZrH52px3New/D9iJ+A= github.com/tklauser/numcpus v0.5.0/go.mod h1:OGzpTxpcIMNGYQdit2BYL1pvk/dSOaJWjKoflh+RQjo= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= @@ -637,7 +474,6 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/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= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -648,9 +484,15 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/otel v1.12.0 h1:IgfC7kqQrRccIKuB7Cl+SRUmsKbEwSGPr0Eu+/ht1SQ= +go.opentelemetry.io/otel v1.12.0/go.mod h1:geaoz0L0r1BEOR81k7/n9W4TCXYCJ7bPO7K374jQHG0= +go.opentelemetry.io/otel/exporters/jaeger v1.12.0 h1:1Vy11S0iAD70EPfcP3N2f2IhLq/cIuTW+Zt010MswR8= +go.opentelemetry.io/otel/exporters/jaeger v1.12.0/go.mod h1:SCLbaspEoU9mGJZB6ksc2iSGU6CLWY5yefchDqOM0IM= +go.opentelemetry.io/otel/sdk v1.12.0 h1:8npliVYV7qc0t1FKdpU08eMnOjgPFMnriPhn0HH4q3o= +go.opentelemetry.io/otel/sdk v1.12.0/go.mod h1:WYcvtgquYvgODEvxOry5owO2y9MyciW7JqMz6cpXShE= +go.opentelemetry.io/otel/trace v1.12.0 h1:p28in++7Kd0r2d8gSt931O57fdjUyWxkVbESuILAeUc= +go.opentelemetry.io/otel/trace v1.12.0/go.mod h1:pHlgBynn6s25qJ2szD+Bv+iwKJttjHSI3lUAyf0GNuQ= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -659,10 +501,6 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 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.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20221012134737-56aed061732a h1:NmSIgad6KjE6VvHciPZuNRTKxGhlPfD6OA87W/PLkqg= golang.org/x/crypto v0.0.0-20221012134737-56aed061732a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -688,9 +526,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -702,13 +538,9 @@ 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.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/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= @@ -721,7 +553,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -732,7 +563,6 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -748,8 +578,6 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211209124913-491a49abca63 h1:iocB37TsdFuN6IBRZ+ry36wrkoV51/tl5vOWqkcPGvY= -golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20221019024206-cb67ada4b0ad h1:Zx6wVVDwwNJFWXNIvDi7o952w3/1ckSwYk/7eykRmjM= golang.org/x/net v0.0.0-20221019024206-cb67ada4b0ad/go.mod h1:RpDiru2p0u2F0lLpEoqnP2+7xs0ifAuOcJ442g6GU2s= @@ -767,7 +595,6 @@ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f h1:Qmd2pbz05z7z6lm0DrgQVVPuBm92jqujBKMHMOlOQEw= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk= @@ -782,20 +609,15 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/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-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -803,13 +625,8 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -824,7 +641,6 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -846,17 +662,12 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220111092808-5a964db01320 h1:0jf+tOCoZ3LyutmCOWpVni1chK4VfFLhRsDK7MhqGRY= -golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -864,30 +675,23 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20221017184919-83659145692c h1:dveknrit5futqEmXAvd2I1BbZIDhxRijsyWHM86NlcA= golang.org/x/term v0.0.0-20221017184919-83659145692c/go.mod h1:VTIZ7TEbF0BS9Sv9lPTvGbtW8i4z6GGbJBCM37uMCzY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 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.4/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.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -924,7 +728,6 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -944,14 +747,9 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff h1:VX/uD7MK0AHXGiScH3fsieUQUcpmRERPDYtqZdJnA+Q= -golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff/go.mod h1:YD9qOF0M9xpSpdWTBbzEl5e/RnCefISl8E5Noe10jFM= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= @@ -971,12 +769,10 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0 h1:4sAyIHT6ZohtAQDoxws+ez7bROYmUlOVvsUscYCDTqA= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= @@ -1000,10 +796,8 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 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-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1033,7 +827,6 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1042,7 +835,6 @@ google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1 h1:E7wSQBXkH3T3diucK+9Z1kjn4+/9tNG7lZLr75oOhh8= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -1071,12 +863,9 @@ google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55 h1:U1u4KB2kx6KR/aJDjQ97hZ15wQs8ZPvDcGcRynBhkvg= google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55/go.mod h1:45EK0dUbEZ2NHjCeAd2LXmyjAgGUGrpGROgjhC3ADck= -google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1100,8 +889,6 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= @@ -1119,41 +906,29 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba 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.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= 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-20200227125254-8fa46927fb4f/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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 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.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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 h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= 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= @@ -1165,52 +940,26 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.23.4 h1:85gnfXQOWbJa1SiWGpE9EEtHs0UVvDyIsSMpEtl2D4E= -k8s.io/api v0.23.4/go.mod h1:i77F4JfyNNrhOjZF7OwwNJS5Y1S9dpwvb9iYRYRczfI= k8s.io/api v0.25.3 h1:Q1v5UFfYe87vi5H7NU0p4RXC26PPMT8KOpr1TLQbCMQ= k8s.io/api v0.25.3/go.mod h1:o42gKscFrEVjHdQnyRenACrMtbuJsVdP+WVjqejfzmI= -k8s.io/apimachinery v0.23.4 h1:fhnuMd/xUL3Cjfl64j5ULKZ1/J9n8NuQEgNL+WXWfdM= -k8s.io/apimachinery v0.23.4/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= k8s.io/apimachinery v0.25.3 h1:7o9ium4uyUOM76t6aunP0nZuex7gDf8VGwkR5RcJnQc= k8s.io/apimachinery v0.25.3/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo= -k8s.io/client-go v0.23.4 h1:YVWvPeerA2gpUudLelvsolzH7c2sFoXXR5wM/sWqNFU= -k8s.io/client-go v0.23.4/go.mod h1:PKnIL4pqLuvYUK1WU7RLTMYKPiIh7MYShLshtRY9cj0= k8s.io/client-go v0.25.3 h1:oB4Dyl8d6UbfDHD8Bv8evKylzs3BXzzufLiO27xuPs0= k8s.io/client-go v0.25.3/go.mod h1:t39LPczAIMwycjcXkVc+CB+PZV69jQuNx4um5ORDjQA= -k8s.io/code-generator v0.23.4/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.30.0 h1:bUO6drIvCIsvZ/XFgfxoGFQU/a4Qkh0iAlvUR7vlHJw= -k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 h1:E3J9oCLlaobFUqsjG9DfKbP2BmgwBL2p7pn0A3dG9W4= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/metrics v0.23.4 h1:99+9V/J1PuCqwvYFiuiuZcDImTx4SfFFiwsIB0ZTqUQ= -k8s.io/metrics v0.23.4/go.mod h1:cl6sY9BdVT3DubbpqnkPIKi6mn/F2ltkU4yH1tEJ3Bo= k8s.io/metrics v0.25.3 h1:fp5RuALkbwI3UbKITdNYu6sa3LF4JPANR/ofq3oe+Fg= k8s.io/metrics v0.25.3/go.mod h1:5j5FKJb8RHsb3Q2PLsD/p1mLiA1fTrl+a62Les+KDhc= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20211116205334-6203023598ed h1:ck1fRPWPJWsMd8ZRFsWc6mh/zHp5fZ/shhbrgPUxDAE= -k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20221012122500-cfd413dd9e85 h1:cTdVh7LYu82xeClmfzGtgyspNh6UxpwLWGi8R4sspNo= k8s.io/utils v0.0.0-20221012122500-cfd413dd9e85/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= 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.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/opentelemetry.go b/opentelemetry.go new file mode 100644 index 0000000..5ec152d --- /dev/null +++ b/opentelemetry.go @@ -0,0 +1,121 @@ +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Command jaeger is an example program that creates spans +// and uploads to Jaeger. +package aeadplugin + +import ( + "log" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/exporters/jaeger" + "go.opentelemetry.io/otel/sdk/resource" + tracesdk "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.17.0" + oteltrace "go.opentelemetry.io/otel/trace" +) + +const ( + service = "aead-trace-service" + environment = "nonprod" + id = 1 +) + +var tp *tracesdk.TracerProvider +var tr oteltrace.Tracer + +// tracerProvider returns an OpenTelemetry TracerProvider configured to use +// the Jaeger exporter that will send spans to the provided url. The returned +// TracerProvider will also use a Resource configured with all the information +// about the application. +func tracerProvider(url string) (*tracesdk.TracerProvider, error) { + // Create the Jaeger exporter + exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url))) + if err != nil { + return nil, err + } + tp := tracesdk.NewTracerProvider( + // Always be sure to batch in production. + tracesdk.WithBatcher(exp), + // Record information about this application in a Resource. + tracesdk.WithResource(resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceNameKey.String(service), + attribute.String("environment", environment), + attribute.Int64("ID", id), + )), + ) + return tp, nil +} + +func initialiseOpenTel() { + var tperr error + tp, tperr = tracerProvider("http://jaeger-collector.jaeger.svc.cluster.local:14268/api/traces") + //tp, tperr = tracerProvider("http://localhost:14268/api/traces") + if tperr != nil { + log.Fatal(tperr) + } + + // Register our TracerProvider as the global so any imported + // instrumentation in the future will default to using it. + otel.SetTracerProvider(tp) +} + +// func main() { +// initialiseOpenTel() + +// // ctx, cancel := context.WithCancel(context.Background()) +// // defer cancel() + +// // // Cleanly shutdown and flush telemetry when the application exits. +// // defer func(ctx context.Context) { +// // // Do not make the application hang when it is shutdown. +// // ctx, cancel = context.WithTimeout(ctx, time.Second*5) +// // defer cancel() +// // if err := tp.Shutdown(ctx); err != nil { +// // log.Fatal(err) +// // } +// // }(ctx) + +// tr = tp.Tracer("component-main") + +// ctx, span := tr.Start(ctx, "foo") +// defer func(ctx) { +// span.End() +// if err := tp.Shutdown(ctx); err != nil { +// log.Fatal(err) +// } +// }(ctx) +// // bar(ctx) +// } + +// func bar(ctx context.Context) { +// // Use the global TracerProvider. +// // tr := otel.Tracer("component-bar") +// ctx, span := tr.Start(ctx, "bar") +// span.SetAttributes(attribute.Key("testset").String("value")) +// defer span.End() + +// for i := 0; i < 10; i++ { +// _, iSpan := tr.Start(ctx, fmt.Sprintf("Sample-%d", i)) +// log.Printf("Doing really hard jaeger work (%d / 10)\n", i+1) + +// <-time.After(time.Second) +// iSpan.End() +// } + +// log.Printf("Done!") +// } diff --git a/path_aead.go b/path_aead.go index e690034..52461ed 100644 --- a/path_aead.go +++ b/path_aead.go @@ -4,16 +4,21 @@ import ( "context" "fmt" "log" + "math" + "os" + "runtime" + "strconv" "sync" "time" "unsafe" - "cloud.google.com/go/pubsub" - hclog "github.com/hashicorp/go-hclog" - b64 "encoding/base64" "encoding/json" + "cloud.google.com/go/pubsub" + hclog "github.com/hashicorp/go-hclog" + "go.opentelemetry.io/otel/attribute" + "github.com/google/tink/go/tink" "github.com/google/uuid" "github.com/hashicorp/vault/sdk/framework" @@ -22,6 +27,18 @@ import ( func (b *backend) pathAeadEncrypt(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathAeadEncrypt-" + hostname) + + ctx, span := tr.Start(ctx, "pathAeadEncrypt-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() + /* what is data.Raw @@ -44,6 +61,13 @@ func (b *backend) pathAeadEncrypt(ctx context.Context, req *logical.Request, dat wg.Add(1) go b.publishTelemetry(&wg, ctx, req, "encrypt", data.Raw) + // retrive the config fro storage + // AS Optimisation + // err := b.getAeadConfig(ctx, req) + // if err != nil { + // return nil, err + // } + var respStruct = logical.Response{} var resp = &respStruct @@ -98,6 +122,10 @@ func (b *backend) pathAeadEncrypt(ctx context.Context, req *logical.Request, dat func (b *backend) encryptRowChan(ctx context.Context, req *logical.Request, data *framework.FieldData, row string, ch chan map[string]interface{}) { + // tr := otel.Tracer("component-encryptRowChan") + ctx, span := tr.Start(ctx, "encryptRowChan") + defer span.End() + // this is just a wrapper around the pathAeadEncryptRow methos so that it can be used concurrently in a channel resp, err := b.encryptRow(ctx, req, data) if err != nil { @@ -113,6 +141,10 @@ func (b *backend) encryptRowChan(ctx context.Context, req *logical.Request, data func (b *backend) decryptRowChan(ctx context.Context, req *logical.Request, data *framework.FieldData, fieldName string, ch chan map[string]interface{}) { + // tr := otel.Tracer("component-decryptRowChan") + ctx, span := tr.Start(ctx, "decryptRowChan") + defer span.End() + // this is just a wrapper around the pathAeadDecryptRow methos so that it can be used concurrently in a channel resp, err := b.pathAeadDecrypt(ctx, req, data) if err != nil { @@ -128,12 +160,16 @@ func (b *backend) decryptRowChan(ctx context.Context, req *logical.Request, data func (b *backend) encryptRow(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - // retrive the config fro storage + // tr := otel.Tracer("component-encryptRow") + ctx, span := tr.Start(ctx, "encryptRow") + defer span.End() - err := b.getAeadConfig(ctx, req) - if err != nil { - return nil, err - } + // retrive the config fro storage + // AS Optimisation + // err := b.getAeadConfig(ctx, req) + // if err != nil { + // return nil, err + // } // logical.Response{ // Secret: &logical.Secret{}, @@ -168,22 +204,25 @@ func (b *backend) encryptRow(ctx context.Context, req *logical.Request, data *fr } func (b *backend) doEncryptionChan(fieldName string, unencryptedData interface{}, data *framework.FieldData, ctx context.Context, req *logical.Request, ch chan map[string]interface{}) { + + // tr := otel.Tracer("component-doEncryptionChan") + ctx, span := tr.Start(ctx, "doEncryptionChan") + defer span.End() + resp := make(map[string]interface{}) - encryptionkey, ok := getEncryptionKey(fieldName) - // do we have a key already in config - if ok { - // is the key we have retrived deterministic? - encryptionKeyStr, deterministic := isKeyJsonDeterministic(encryptionkey) - // set additionalDataBytes as field name of the right type - additionalDataBytes := b.getAdditionalData(fieldName, AEAD_CONFIG) - - if deterministic { - // SUPPORT FOR DETERMINISTIC AEAD - // we don't need the key handle which is returned first - _, tinkDetAead, err := CreateInsecureHandleAndDeterministicAead(encryptionKeyStr) - if err != nil { - hclog.L().Error("Failed to create a keyhandle", err) - } + var tinkDetAead tink.DeterministicAEAD + var tinkAead tink.AEAD + var ok bool + + keySet, additionalDataBytes, err := b.getKeyAndAD(fieldName, ctx, req) + if err != nil { + // we didn't find a key - return original data + hclog.L().Info("did not find a key for field " + fieldName) + resp[fieldName] = fmt.Sprintf("%s", unencryptedData) + } else { + // we should have a valid keySet here, so just determine the type and use it + tinkDetAead, ok = keySet.(tink.DeterministicAEAD) + if ok { // set the unencrypted data to be the right type unencryptedDataBytes := []byte(fmt.Sprintf("%v", unencryptedData)) @@ -192,37 +231,98 @@ func (b *backend) doEncryptionChan(fieldName string, unencryptedData interface{} if err != nil { hclog.L().Error("Failed to encrypt", err) } - // set the response as the base64 encrypted data resp[fieldName] = b64.StdEncoding.EncodeToString(cypherText) } else { - // SUPPORT FOR NON DETERMINISTIC AEAD - _, tinkAead, err := CreateInsecureHandleAndAead(encryptionKeyStr) - if err != nil { - hclog.L().Error("Failed to create a keyhandle", err) - } - // set the unencrypted data to be the right type - unencryptedDataBytes := []byte(fmt.Sprintf("%v", unencryptedData)) + tinkAead, ok = keySet.(tink.AEAD) + if ok { + // set the unencrypted data to be the right type + unencryptedDataBytes := []byte(fmt.Sprintf("%v", unencryptedData)) - // encrypt it - cyphertext, err := tinkAead.Encrypt(unencryptedDataBytes, additionalDataBytes) - if err != nil { - hclog.L().Error("Failed to encrypt", err) - } + // encrypt it + cyphertext, err := tinkAead.Encrypt(unencryptedDataBytes, additionalDataBytes) + if err != nil { + hclog.L().Error("Failed to encrypt", err) + } - // set the response as the base64 encrypted data - resp[fieldName] = b64.StdEncoding.EncodeToString(cyphertext) + // set the response as the base64 encrypted data + resp[fieldName] = b64.StdEncoding.EncodeToString(cyphertext) + } else { + // we didn't find a key - return original data + hclog.L().Info("did not find a key for field " + fieldName) + resp[fieldName] = fmt.Sprintf("%s", unencryptedData) + } } - } else { - // we didn't find a key - return original data - hclog.L().Info("did not find a key for field " + fieldName) - resp[fieldName] = fmt.Sprintf("%s", unencryptedData) + } ch <- resp + + // encryptionkey, ok := getEncryptionKey(fieldName) + // // do we have a key already in config + // if ok { + // // is the key we have retrived deterministic? + // encryptionKeyStr, deterministic := isKeyJsonDeterministic(encryptionkey) + // // set additionalDataBytes as field name of the right type + // additionalDataBytes := getAdditionalData(fieldName, AEAD_CONFIG) + + // if deterministic { + // // SUPPORT FOR DETERMINISTIC AEAD + // // we don't need the key handle which is returned first + // _, tinkDetAead, err := CreateInsecureHandleAndDeterministicAead(encryptionKeyStr) + // if err != nil { + // hclog.L().Error("Failed to create a keyhandle", err) + // } + // // set the unencrypted data to be the right type + // unencryptedDataBytes := []byte(fmt.Sprintf("%v", unencryptedData)) + + // // encrypt it + // cypherText, err := tinkDetAead.EncryptDeterministically(unencryptedDataBytes, additionalDataBytes) + // if err != nil { + // hclog.L().Error("Failed to encrypt", err) + // } + + // // set the response as the base64 encrypted data + // resp[fieldName] = b64.StdEncoding.EncodeToString(cypherText) + // } else { + // // SUPPORT FOR NON DETERMINISTIC AEAD + // _, tinkAead, err := CreateInsecureHandleAndAead(encryptionKeyStr) + // if err != nil { + // hclog.L().Error("Failed to create a keyhandle", err) + // } + // // set the unencrypted data to be the right type + // unencryptedDataBytes := []byte(fmt.Sprintf("%v", unencryptedData)) + + // // encrypt it + // cyphertext, err := tinkAead.Encrypt(unencryptedDataBytes, additionalDataBytes) + // if err != nil { + // hclog.L().Error("Failed to encrypt", err) + // } + + // // set the response as the base64 encrypted data + // resp[fieldName] = b64.StdEncoding.EncodeToString(cyphertext) + // } + // } else { + // // we didn't find a key - return original data + // hclog.L().Info("did not find a key for field " + fieldName) + // resp[fieldName] = fmt.Sprintf("%s", unencryptedData) + // } + // ch <- resp } func (b *backend) pathAeadDecrypt(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathAeadDecrypt-" + hostname) + + ctx, span := tr.Start(ctx, "pathAeadDEcrypt-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() + // what is data.Raw // // is this a bulk file: ie a map of map[string]map[string]interface{} where the second map is the row to be decrypted @@ -236,6 +336,13 @@ func (b *backend) pathAeadDecrypt(ctx context.Context, req *logical.Request, dat wg.Add(1) go b.publishTelemetry(&wg, ctx, req, "decrypt", data.Raw) + // retrive the config fro storage + // AS Optimisation + // err := b.getAeadConfig(ctx, req) + // if err != nil { + // return nil, err + // } + var respStruct = logical.Response{} var resp = &respStruct @@ -284,11 +391,10 @@ func (b *backend) pathAeadDecrypt(ctx context.Context, req *logical.Request, dat } func (b *backend) decryptRow(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - // retrive the config from storage - err := b.getAeadConfig(ctx, req) - if err != nil { - return nil, err - } + + // tr := otel.Tracer("component-decryptRow") + ctx, span := tr.Start(ctx, "decryptRow") + defer span.End() resp := make(map[string]interface{}) channel := make(chan map[string]interface{}, len(data.Raw)) @@ -296,7 +402,7 @@ func (b *backend) decryptRow(ctx context.Context, req *logical.Request, data *fr // iterate through the key=value supplied (ie field1=sdfvbbvwrbwr field2=advwefvwfvbwrfvb) for field, encryptedDataBase64 := range data.Raw { // doDecryption(field, encryptedDataBase64, resp) - go b.doDecryptionChan(field, encryptedDataBase64, channel) + go b.doDecryptionChan(field, encryptedDataBase64, data, ctx, req, channel) } for i := 0; i < len(data.Raw); i++ { @@ -312,25 +418,26 @@ func (b *backend) decryptRow(ctx context.Context, req *logical.Request, data *fr }, nil } -func (b *backend) doDecryptionChan(fieldName string, encryptedDataBase64 interface{}, ch chan map[string]interface{}) { +func (b *backend) doDecryptionChan(fieldName string, encryptedDataBase64 interface{}, data *framework.FieldData, ctx context.Context, req *logical.Request, ch chan map[string]interface{}) { + + // tr := otel.Tracer("component-doDecryptionChan") + ctx, span := tr.Start(ctx, "doDecryptionChan") + defer span.End() + resp := make(map[string]interface{}) - encryptionkey, ok := getEncryptionKey(fieldName) - // do we have a key already in config - if ok { - // is the key deterministig or non deterministic - encryptionKeyStr, deterministic := isKeyJsonDeterministic(encryptionkey) - - // set additionalDataBytes as field name of the right type - additionalDataBytes := b.getAdditionalData(fieldName, AEAD_CONFIG) - - if deterministic { - // SUPPORT FOR DETERMINISTIC AEAD - // we don't need the key handle which is returned first - _, tinkDetAead, err := CreateInsecureHandleAndDeterministicAead(encryptionKeyStr) - if err != nil { - hclog.L().Error("Failed to create a key handle", err) - } + var tinkDetAead tink.DeterministicAEAD + var tinkAead tink.AEAD + var ok bool + keySet, additionalDataBytes, err := b.getKeyAndAD(fieldName, ctx, req) + if err != nil { + // we didn't find a key - return original data + hclog.L().Info("did not find a key for field " + fieldName) + resp[fieldName] = fmt.Sprintf("%s", encryptedDataBase64) + } else { + // we should have a valid keySet here, so just determine the type and use it + tinkDetAead, ok = keySet.(tink.DeterministicAEAD) + if ok { // set the unencrypted data to be the right type encryptedDataBytes, _ := b64.StdEncoding.DecodeString(fmt.Sprintf("%v", encryptedDataBase64)) @@ -342,34 +449,95 @@ func (b *backend) doDecryptionChan(fieldName string, encryptedDataBase64 interfa resp[fieldName] = string(plainText) } else { - // SUPPORT FOR NON DETERMINISTIC AEAD - _, tinkAead, err := CreateInsecureHandleAndAead(encryptionKeyStr) - if err != nil { - hclog.L().Error("Failed to create tinkAead", err) - } + tinkAead, ok = keySet.(tink.AEAD) + if ok { + // set the unencrypted data to be the right type - // set the unencrypted data to be the right type + encryptedDataBytes, _ := b64.StdEncoding.DecodeString(fmt.Sprintf("%v", encryptedDataBase64)) - encryptedDataBytes, _ := b64.StdEncoding.DecodeString(fmt.Sprintf("%v", encryptedDataBase64)) + // encrypt it + plainText, err := tinkAead.Decrypt(encryptedDataBytes, additionalDataBytes) + if err != nil { + hclog.L().Error("Failed to decrypt ", err) + } - // encrypt it - plainText, err := tinkAead.Decrypt(encryptedDataBytes, additionalDataBytes) - if err != nil { - hclog.L().Error("Failed to decrypt ", err) + resp[fieldName] = string(plainText) + } else { + // we didn't find a key - return original data + hclog.L().Info("did not find a key for field " + fieldName) + resp[fieldName] = fmt.Sprintf("%s", encryptedDataBase64) } - - resp[fieldName] = string(plainText) } - } else { - // we didn't find a key - return original data - hclog.L().Info("did not find a key for field " + fieldName) - resp[fieldName] = fmt.Sprintf("%s", encryptedDataBase64) + } ch <- resp + + // encryptionkey, ok := getEncryptionKey(fieldName) + // // do we have a key already in config + // if ok { + // // is the key deterministig or non deterministic + // encryptionKeyStr, deterministic := isKeyJsonDeterministic(encryptionkey) + + // // set additionalDataBytes as field name of the right type + // additionalDataBytes := getAdditionalData(fieldName, AEAD_CONFIG) + + // if deterministic { + // // SUPPORT FOR DETERMINISTIC AEAD + // // we don't need the key handle which is returned first + // _, tinkDetAead, err := CreateInsecureHandleAndDeterministicAead(encryptionKeyStr) + // if err != nil { + // hclog.L().Error("Failed to create a key handle", err) + // } + + // // set the unencrypted data to be the right type + // encryptedDataBytes, _ := b64.StdEncoding.DecodeString(fmt.Sprintf("%v", encryptedDataBase64)) + + // // decrypt it + // plainText, err := tinkDetAead.DecryptDeterministically(encryptedDataBytes, additionalDataBytes) + // if err != nil { + // hclog.L().Error("Failed to decrypt ", err) + // } + + // resp[fieldName] = string(plainText) + // } else { + // // SUPPORT FOR NON DETERMINISTIC AEAD + // _, tinkAead, err := CreateInsecureHandleAndAead(encryptionKeyStr) + // if err != nil { + // hclog.L().Error("Failed to create tinkAead", err) + // } + + // // set the unencrypted data to be the right type + + // encryptedDataBytes, _ := b64.StdEncoding.DecodeString(fmt.Sprintf("%v", encryptedDataBase64)) + + // // encrypt it + // plainText, err := tinkAead.Decrypt(encryptedDataBytes, additionalDataBytes) + // if err != nil { + // hclog.L().Error("Failed to decrypt ", err) + // } + + // resp[fieldName] = string(plainText) + // } + // } else { + // // we didn't find a key - return original data + // hclog.L().Info("did not find a key for field " + fieldName) + // resp[fieldName] = fmt.Sprintf("%s", encryptedDataBase64) + // } + // ch <- resp } func (b *backend) pathAeadEncryptBulkCol(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathAeadEncryptBulkCol-" + hostname) + + ctx, span := tr.Start(ctx, "pathAeadEncryptBulkCol-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() /* what is data.Raw @@ -392,6 +560,13 @@ func (b *backend) pathAeadEncryptBulkCol(ctx context.Context, req *logical.Reque wg.Add(1) go b.publishTelemetry(&wg, ctx, req, "encrypt", data.Raw) + // retrive the config fro storage + // AS Optimisation + // err := b.getAeadConfig(ctx, req) + // if err != nil { + // return nil, err + // } + var respStruct = logical.Response{} var resp = &respStruct @@ -401,7 +576,9 @@ func (b *backend) pathAeadEncryptBulkCol(ctx context.Context, req *logical.Reque // ok, 1st thing to do is to pivot the map pivotedMap := make(map[string]interface{}) + _, pivotSpan := tr.Start(ctx, fmt.Sprintf("PivotMap")) PivotMapInt(data.Raw, pivotedMap) + pivotSpan.End() channelCap := len(pivotedMap) channel := make(chan map[string]interface{}, channelCap) @@ -426,6 +603,7 @@ func (b *backend) pathAeadEncryptBulkCol(ctx context.Context, req *logical.Reque resp.Data = make(map[string]interface{}) resultsMap := make(map[string]interface{}) + _, waitResultsSpan := tr.Start(ctx, fmt.Sprintf("pathAeadDecryptBulkCol-wait")) for i := 0; i < channelCap; i++ { res := <-channel for k, v := range res { @@ -433,9 +611,12 @@ func (b *backend) pathAeadEncryptBulkCol(ctx context.Context, req *logical.Reque resultsMap[k] = v } } + waitResultsSpan.End() // unpivot the map + _, unpivotSpan := tr.Start(ctx, fmt.Sprintf("UnPivotMap")) PivotMapInt(resultsMap, resp.Data) + unpivotSpan.End() } else { @@ -449,6 +630,10 @@ func (b *backend) pathAeadEncryptBulkCol(ctx context.Context, req *logical.Reque func (b *backend) encryptColChan(ctx context.Context, req *logical.Request, data *framework.FieldData, fieldName string, ch chan map[string]interface{}) { + // tr := otel.Tracer("component-encryptColChan-" + fieldName) + ctx, span := tr.Start(ctx, "encryptColChan-"+fieldName) + defer span.End() + // this is just a wrapper around the pathAeadEncryptRow methos so that it can be used concurrently in a channel resp, err := b.encryptCol(ctx, req, data, fieldName) if err != nil { @@ -464,46 +649,114 @@ func (b *backend) encryptColChan(ctx context.Context, req *logical.Request, data func (b *backend) encryptCol(ctx context.Context, req *logical.Request, data *framework.FieldData, fieldName string) (*logical.Response, error) { - // retrive the config fro storage + // tr := otel.Tracer("component-encryptCol-" + fieldName) + ctx, span := tr.Start(ctx, "encryptCol-"+fieldName) + defer span.End() + + resp := make(map[string]interface{}) + var tinkDetAead tink.DeterministicAEAD + var tinkAead tink.AEAD + var ok bool + deterministic := false + keyFound := false - err := b.getAeadConfig(ctx, req) + keySet, additionalDataBytes, err := b.getKeyAndAD(fieldName, ctx, req) + + _, keySpan := tr.Start(ctx, "encryptCol-resolveKey"+fieldName) + + // we didn't find a key - return original data if err != nil { - return nil, err + hclog.L().Error("Failed to create a keyhandle", err) + return &logical.Response{ + Data: resp, + }, err + } else { + tinkDetAead, ok = keySet.(tink.DeterministicAEAD) + if ok { + deterministic = true + keyFound = true + } else { + tinkAead, ok = keySet.(tink.AEAD) + if ok { + deterministic = false + keyFound = true + } + } } - resp := make(map[string]interface{}) + keySpan.End() - encryptionkey, keyFound := getEncryptionKey(fieldName) - // is the key we have retrived deterministic? - encryptionKeyStr, deterministic := isKeyJsonDeterministic(encryptionkey) + _, encryptSpan := tr.Start(ctx, "encryptCol-doEncryption"+fieldName) - var tinkDetAead tink.DeterministicAEAD - var tinkAead tink.AEAD + maxbatchInt := 1000 //TODO + _, ok = AEAD_CONFIG.Get("MAX_BATCHCOLROWS") + if !ok { + hclog.L().Error("encryptCol: Could not find a MAX_BATCHCOLROWS in the config") + maxbatchInt = len(data.Raw) + } else { + fnum := float64(len(data.Raw)) / float64(runtime.NumCPU()) + maxbatchInt = int(math.Ceil(fnum)) + // this is an integer value, masquerading as a string, but of type interface{} - go figure + // maxbatchStr := maxbatch.(string) + // maxbatchInt, err = strconv.Atoi(maxbatchStr) + // if err != nil { + // hclog.L().Error("encryptCol: Could not convert MAX_BATCHCOLROWS to integer") + // } + } + _, makesliceSpan := tr.Start(ctx, fmt.Sprintf("encryptCol-makeslice")) + mapSlice := createSliceOfMapsFromMapStrInt(data.Raw, maxbatchInt) + makesliceSpan.End() - if keyFound && deterministic { - // SUPPORT FOR DETERMINISTIC AEAD - // we don't need the key handle which is returned first - _, tinkDetAead, err = CreateInsecureHandleAndDeterministicAead(encryptionKeyStr) - if err != nil { - hclog.L().Error("Failed to create a keyhandle", err) - return &logical.Response{ - Data: resp, - }, err - } - } else if keyFound && !deterministic { - // SUPPORT FOR NON DETERMINISTIC AEAD - _, tinkAead, err = CreateInsecureHandleAndAead(encryptionKeyStr) - if err != nil { - hclog.L().Error("Failed to create a key", err) - return &logical.Response{ - Data: resp, - }, err + // ok so now we have a slice of maps of data + + channelCap := len(mapSlice) + channel := make(chan map[string]interface{}, channelCap) + + // call the encrypt or decrypt per broken up map + for _, dataMap := range mapSlice { + go b.encryptColConcurrent(ctx, dataMap, keyFound, deterministic, tinkDetAead, tinkAead, additionalDataBytes, channel) + } + + // var respStruct = logical.Response{} + // var resp1 = &respStruct + // resp1.Data = make(map[string]interface{}) + resultsMap := make(map[string]interface{}) + + _, waitSpan := tr.Start(ctx, fmt.Sprintf("encryptCol-wait")) + + for i := 0; i < channelCap; i++ { + res := <-channel + for k, v := range res { + // this should be a map of 1 row of rownumber index as string and the map of values + resultsMap[k] = v } } - // set additionalDataBytes as field name of the right type - additionalDataBytes := b.getAdditionalData(fieldName, AEAD_CONFIG) + waitSpan.End() + + encryptSpan.End() + + return &logical.Response{ + Data: resultsMap, + }, nil +} + +func (b *backend) encryptColConcurrent(ctx context.Context, data map[string]interface{}, keyFound bool, deterministic bool, tinkDetAead tink.DeterministicAEAD, tinkAead tink.AEAD, additionalDataBytes []byte, ch chan map[string]interface{}) { + + ctx, span := tr.Start(ctx, "encryptColConcurrent") + rt_ngor := strconv.Itoa(runtime.NumGoroutine()) + rt_ngmp := strconv.Itoa(runtime.GOMAXPROCS(0)) + rt_ncpu := strconv.Itoa(runtime.NumCPU()) + lenData := strconv.Itoa(len(data)) + span.SetAttributes(attribute.Key("NumGoroutine").String(rt_ngor)) + span.SetAttributes(attribute.Key("GOMAXPROCS").String(rt_ngmp)) + span.SetAttributes(attribute.Key("NumCPU").String(rt_ncpu)) + span.SetAttributes(attribute.Key("DataLength").String(lenData)) + + defer span.End() + + resp := make(map[string]interface{}) // iterate through the key=value supplied (ie field1=myaddress field2=myphonenumber) - for rowNum, unencryptedData := range data.Raw { + for rowNum, unencryptedData := range data { // do we have a key already in config if keyFound { @@ -516,10 +769,9 @@ func (b *backend) encryptCol(ctx context.Context, req *logical.Request, data *fr // encrypt it cypherText, err := tinkDetAead.EncryptDeterministically(unencryptedDataBytes, additionalDataBytes) if err != nil { + resp[rowNum] = fmt.Sprintf("%s", unencryptedData) hclog.L().Error("Failed to encrypt", err) - return &logical.Response{ - Data: resp, - }, err + continue } // set the response as the base64 encrypted data @@ -532,10 +784,9 @@ func (b *backend) encryptCol(ctx context.Context, req *logical.Request, data *fr // encrypt it cyphertext, err := tinkAead.Encrypt(unencryptedDataBytes, additionalDataBytes) if err != nil { + resp[rowNum] = fmt.Sprintf("%s", unencryptedData) hclog.L().Error("Failed to encrypt", err) - return &logical.Response{ - Data: resp, - }, err + continue } // set the response as the base64 encrypted data @@ -544,16 +795,31 @@ func (b *backend) encryptCol(ctx context.Context, req *logical.Request, data *fr } else { // we didn't find a key - return original data resp[rowNum] = fmt.Sprintf("%s", unencryptedData) + continue } } - - return &logical.Response{ - Data: resp, - }, nil + ch <- resp } func (b *backend) pathAeadDecryptBulkCol(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathAeadDecryptBulkCol-" + hostname) + + ctx, span := tr.Start(ctx, "pathAeadDecryptBulkCol-"+hostname) + rt_ngor := strconv.Itoa(runtime.NumGoroutine()) + rt_ngmp := strconv.Itoa(runtime.GOMAXPROCS(0)) + rt_ncpu := strconv.Itoa(runtime.NumCPU()) + span.SetAttributes(attribute.Key("NumGoroutine").String(rt_ngor)) + span.SetAttributes(attribute.Key("GOMAXPROCS").String(rt_ngmp)) + span.SetAttributes(attribute.Key("NumCPU").String(rt_ncpu)) + + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() // what is data.Raw // // is this a bulk file: ie a map of map[string]map[string]interface{} where the second map is the row to be decrypted @@ -567,6 +833,13 @@ func (b *backend) pathAeadDecryptBulkCol(ctx context.Context, req *logical.Reque wg.Add(1) go b.publishTelemetry(&wg, ctx, req, "decrypt", data.Raw) + // retrive the config fro storage + // AS Optimisation + // err := b.getAeadConfig(ctx, req) + // if err != nil { + // return nil, err + // } + var respStruct = logical.Response{} var resp = &respStruct @@ -576,7 +849,9 @@ func (b *backend) pathAeadDecryptBulkCol(ctx context.Context, req *logical.Reque // ok, 1st thing to do is to pivot the map pivotedMap := make(map[string]interface{}) + _, pivotSpan := tr.Start(ctx, fmt.Sprintf("PivotMap")) PivotMapInt(data.Raw, pivotedMap) + pivotSpan.End() channelCap := len(pivotedMap) channel := make(chan map[string]interface{}, channelCap) @@ -604,6 +879,7 @@ func (b *backend) pathAeadDecryptBulkCol(ctx context.Context, req *logical.Reque resp.Data = make(map[string]interface{}) resultsMap := make(map[string]interface{}) + _, waitResultsSpan := tr.Start(ctx, fmt.Sprintf("pathAeadDecryptBulkCol-wait")) for i := 0; i < channelCap; i++ { res := <-channel for k, v := range res { @@ -611,9 +887,12 @@ func (b *backend) pathAeadDecryptBulkCol(ctx context.Context, req *logical.Reque resultsMap[k] = v } } + waitResultsSpan.End() // unpivot the map + _, unpivotSpan := tr.Start(ctx, fmt.Sprintf("UnPivotMap")) PivotMapInt(resultsMap, resp.Data) + unpivotSpan.End() } else { hclog.L().Info("can only do column ops on bulk data") @@ -625,6 +904,10 @@ func (b *backend) pathAeadDecryptBulkCol(ctx context.Context, req *logical.Reque func (b *backend) decryptColChan(ctx context.Context, req *logical.Request, data *framework.FieldData, fieldName string, ch chan map[string]interface{}) { + // tr := otel.Tracer("component-decryptColChan-" + fieldName) + ctx, span := tr.Start(ctx, "decryptColChan-"+fieldName) + defer span.End() + // this is just a wrapper around the pathAeadDecryptRow methos so that it can be used concurrently in a channel resp, err := b.decryptCol(ctx, req, data, fieldName) if err != nil { @@ -639,45 +922,110 @@ func (b *backend) decryptColChan(ctx context.Context, req *logical.Request, data } func (b *backend) decryptCol(ctx context.Context, req *logical.Request, data *framework.FieldData, fieldName string) (*logical.Response, error) { - // retrive the config from storage - err := b.getAeadConfig(ctx, req) - if err != nil { - return nil, err - } - resp := make(map[string]interface{}) - encryptionkey, keyFound := getEncryptionKey(fieldName) - // is the key we have retrived deterministic? - encryptionKeyStr, deterministic := isKeyJsonDeterministic(encryptionkey) + // tr := otel.Tracer("component-decryptCol-" + fieldName) + ctx, span := tr.Start(ctx, "decryptCol-"+fieldName) + defer span.End() + resp := make(map[string]interface{}) var tinkDetAead tink.DeterministicAEAD var tinkAead tink.AEAD + var ok bool + deterministic := false + keyFound := false - if keyFound && deterministic { - // SUPPORT FOR DETERMINISTIC AEAD - // we don't need the key handle which is returned first - _, tinkDetAead, err = CreateInsecureHandleAndDeterministicAead(encryptionKeyStr) - if err != nil { - hclog.L().Error("Failed to create a key handle", err) - return &logical.Response{ - Data: resp, - }, err - } - } else if keyFound && !deterministic { - // SUPPORT FOR NON DETERMINISTIC AEAD - _, tinkAead, err = CreateInsecureHandleAndAead(encryptionKeyStr) - if err != nil { - hclog.L().Error("Failed to create a key handle", err) - return &logical.Response{ - Data: resp, - }, err + _, keySpan := tr.Start(ctx, "decryptCol-resolveKey"+fieldName) + + keySet, additionalDataBytes, err := b.getKeyAndAD(fieldName, ctx, req) + // we didn't find a key - return original data + if err != nil { + hclog.L().Error("Failed to create a keyhandle", err) + return &logical.Response{ + Data: resp, + }, err + } else { + tinkDetAead, ok = keySet.(tink.DeterministicAEAD) + if ok { + deterministic = true + keyFound = true + } else { + tinkAead, ok = keySet.(tink.AEAD) + if ok { + deterministic = false + keyFound = true + } } } - // set additionalDataBytes as field name of the right type - additionalDataBytes := b.getAdditionalData(fieldName, AEAD_CONFIG) + keySpan.End() - // iterate through the key=value supplied (ie field1=sdfvbbvwrbwr field2=advwefvwfvbwrfvb) - for rowNumber, encryptedDataBase64 := range data.Raw { + _, decryptSpan := tr.Start(ctx, "decryptCol-doDecryption"+fieldName) + + maxbatchInt := 1000 //TODO + _, ok = AEAD_CONFIG.Get("MAX_BATCHCOLROWS") + if !ok { + hclog.L().Error("decryptCol: Could not find a MAX_BATCHCOLROWS in the config") + maxbatchInt = len(data.Raw) + } else { + fnum := float64(len(data.Raw)) / float64(runtime.NumCPU()) + maxbatchInt = int(math.Ceil(fnum)) + // this is an integer value, masquerading as a string, but of type interface{} - go figure + // maxbatchStr := maxbatch.(string) + // maxbatchInt, err = strconv.Atoi(maxbatchStr) + // if err != nil { + // hclog.L().Error("encryptCol: Could not convert MAX_BATCHCOLROWS to integer") + // } + } + _, makesliceSpan := tr.Start(ctx, fmt.Sprintf("encryptCol-makeslice")) + mapSlice := createSliceOfMapsFromMapStrInt(data.Raw, maxbatchInt) + makesliceSpan.End() + + // ok so now we have a slice of maps of data + + channelCap := len(mapSlice) + channel := make(chan map[string]interface{}, channelCap) + + // call the encrypt or decrypt per broken up map + for _, dataMap := range mapSlice { + go b.decryptColConcurrent(ctx, dataMap, keyFound, deterministic, tinkDetAead, tinkAead, additionalDataBytes, channel) + } + + resultsMap := make(map[string]interface{}) + _, waitSpan := tr.Start(ctx, fmt.Sprintf("encryptCol-wait")) + + for i := 0; i < channelCap; i++ { + res := <-channel + for k, v := range res { + // this should be a map of 1 row of rownumber index as string and the map of values + resultsMap[k] = v + } + } + waitSpan.End() + + decryptSpan.End() + + return &logical.Response{ + Data: resultsMap, + }, nil +} + +func (b *backend) decryptColConcurrent(ctx context.Context, data map[string]interface{}, keyFound bool, deterministic bool, tinkDetAead tink.DeterministicAEAD, tinkAead tink.AEAD, additionalDataBytes []byte, ch chan map[string]interface{}) { + + ctx, span := tr.Start(ctx, "decryptColConcurrent") + rt_ngor := strconv.Itoa(runtime.NumGoroutine()) + rt_ngmp := strconv.Itoa(runtime.GOMAXPROCS(0)) + rt_ncpu := strconv.Itoa(runtime.NumCPU()) + lenData := strconv.Itoa(len(data)) + span.SetAttributes(attribute.Key("NumGoroutine").String(rt_ngor)) + span.SetAttributes(attribute.Key("GOMAXPROCS").String(rt_ngmp)) + span.SetAttributes(attribute.Key("NumCPU").String(rt_ncpu)) + span.SetAttributes(attribute.Key("DataLength").String(lenData)) + + defer span.End() + + resp := make(map[string]interface{}) + + // iterate through the key=value supplied (ie field1=myaddress field2=myphonenumber) + for rowNum, encryptedDataBase64 := range data { if keyFound { if deterministic { @@ -688,13 +1036,11 @@ func (b *backend) decryptCol(ctx context.Context, req *logical.Request, data *fr // decrypt it plainText, err := tinkDetAead.DecryptDeterministically(encryptedDataBytes, additionalDataBytes) if err != nil { - hclog.L().Error("Failed to decrypt", err) - return &logical.Response{ - Data: resp, - }, err + resp[rowNum] = fmt.Sprintf("%s", encryptedDataBase64) + hclog.L().Error("Failed to deencrypt", err) + continue } - - resp[rowNumber] = string(plainText) + resp[rowNum] = string(plainText) } else { // SUPPORT FOR NON DETERMINISTIC AEAD // set the unencrypted data to be the right type @@ -704,24 +1050,19 @@ func (b *backend) decryptCol(ctx context.Context, req *logical.Request, data *fr // encrypt it plainText, err := tinkAead.Decrypt(encryptedDataBytes, additionalDataBytes) if err != nil { - hclog.L().Error("Failed to decrypt", err) - return &logical.Response{ - Data: resp, - }, err + resp[rowNum] = fmt.Sprintf("%s", encryptedDataBase64) + hclog.L().Error("Failed to deencrypt", err) + continue } - - resp[rowNumber] = string(plainText) + resp[rowNum] = string(plainText) } } else { // we didn't find a key - return original data - hclog.L().Info("did not find a key for field " + fieldName) - resp[rowNumber] = fmt.Sprintf("%s", encryptedDataBase64) + resp[rowNum] = fmt.Sprintf("%s", encryptedDataBase64) + continue } } - - return &logical.Response{ - Data: resp, - }, nil + ch <- resp } func isBulkData(data map[string]interface{}) (bool, error) { @@ -740,10 +1081,14 @@ func isBulkData(data map[string]interface{}) (bool, error) { func (b *backend) publishTelemetry(wg *sync.WaitGroup, ctx context.Context, req *logical.Request, encryptOrDecrypt string, data map[string]interface{}) { + // tr := otel.Tracer("component-publishTelemetry") + ctx, span := tr.Start(ctx, "publishTelemetry") + defer span.End() + defer wg.Done() // retrive the config from storage - err := b.getAeadConfig(ctx, req) + err := b.getAeadConfig(ctx, req, true) if err != nil { return } @@ -833,3 +1178,194 @@ func (b *backend) publishTelemetry(wg *sync.WaitGroup, ctx context.Context, req hclog.L().Error("pubsub: result.Get: %v", err) } } + +//*********************************************** +// TEMP SECTION +//*********************************************** + +func (b *backend) pathAeadEncryptBulkColFarm(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathAeadEncryptBulkColFarm-" + hostname) + + ctx, span := tr.Start(ctx, "pathAeadEncryptBulkColFarm-"+hostname) + rt_ngor := strconv.Itoa(runtime.NumGoroutine()) + rt_ngmp := strconv.Itoa(runtime.GOMAXPROCS(0)) + rt_ncpu := strconv.Itoa(runtime.NumCPU()) + span.SetAttributes(attribute.Key("NumGoroutine").String(rt_ngor)) + span.SetAttributes(attribute.Key("GOMAXPROCS").String(rt_ngmp)) + span.SetAttributes(attribute.Key("NumCPU").String(rt_ncpu)) + + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() + // fire and forget the telemetry + var wg sync.WaitGroup + wg.Add(1) + go b.publishTelemetry(&wg, ctx, req, "encryptFarm", data.Raw) + + // retrive the config fro storage + + err := b.getAeadConfig(ctx, req, true) + if err != nil { + return nil, err + } + + tokenStr := "" + token, ok := AEAD_CONFIG.Get("TOKEN") + if !ok { + hclog.L().Error("pathAeadEncryptBulkColFarm: Count not find a TOKEN in the config") + } else { + tokenStr = fmt.Sprintf("%s", token) + } + + serviceStr := "" + service, ok := AEAD_CONFIG.Get("INTERNAL_SERVICE") + if !ok { + hclog.L().Error("pathAeadEncryptBulkColFarm: Could not find a INTERNAL_SERVICE in the config") + } else { + serviceStr = fmt.Sprintf("%s", service) + } + + maxbatchInt := 0 + maxbatch, ok := AEAD_CONFIG.Get("MAX_BATCHROWS") + if !ok { + hclog.L().Error("pathAeadEncryptBulkColFarm: Could not find a MAX_BATCHROWS in the config") + } else { + // this is an integer value, masquerading as a string, but of type interface{} - go figure + maxbatchStr := maxbatch.(string) + maxbatchInt, err = strconv.Atoi(maxbatchStr) + if err != nil { + hclog.L().Error("pathAeadEncryptBulkColFarm: Could not convert MAX_BATCHROWS to integer") + } + } + + _, makesliceSpan := tr.Start(ctx, fmt.Sprintf("pathAeadEncryptBulkColFarm-makeslice")) + mapSlice := createSliceOfMapsFromMapStrInt(data.Raw, maxbatchInt) + makesliceSpan.End() + + // ok so now we have a slice of maps of data + + channelCap := len(mapSlice) + channel := make(chan map[string]interface{}, channelCap) + + // call the encrypt or decrypt per broken up map + for _, dataMap := range mapSlice { + go EncryptOrDecryptDataChan(serviceStr+"/v1/aead-secrets/encryptcol", dataMap, "", tokenStr, channel) + } + + var respStruct = logical.Response{} + var resp = &respStruct + resp.Data = make(map[string]interface{}) + resultsMap := make(map[string]interface{}) + + _, waitSpan := tr.Start(ctx, fmt.Sprintf("pathAeadEncryptBulkColFarm-wait")) + + for i := 0; i < channelCap; i++ { + res := <-channel + for k, v := range res { + // this should be a map of 1 row of rownumber index as string and the map of values + resultsMap[k] = v + } + } + waitSpan.End() + + resp.Data = resultsMap + + wg.Wait() + + return resp, nil +} + +func (b *backend) pathAeadDecryptBulkColFarm(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathAeadDecryptBulkColFarm-" + hostname) + + ctx, span := tr.Start(ctx, "pathAeadDecryptBulkColFarm-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() + // fire and forget the telemetry + var wg sync.WaitGroup + wg.Add(1) + go b.publishTelemetry(&wg, ctx, req, "decryptFarm", data.Raw) + + // retrive the config fro storage + err := b.getAeadConfig(ctx, req, true) + if err != nil { + return nil, err + } + + tokenStr := "" + token, ok := AEAD_CONFIG.Get("TOKEN") + if !ok { + hclog.L().Error("pathAeadDecryptBulkColFarm: Count not find a TOKEN in the config") + } else { + tokenStr = fmt.Sprintf("%s", token) + } + + serviceStr := "" + service, ok := AEAD_CONFIG.Get("INTERNAL_SERVICE") + if !ok { + hclog.L().Error("pathAeadDecryptBulkColFarm: Could not find a INTERNAL_SERVICE in the config") + } else { + serviceStr = fmt.Sprintf("%s", service) + } + + maxbatchInt := 0 + maxbatch, ok := AEAD_CONFIG.Get("MAX_BATCHROWS") + if !ok { + hclog.L().Error("pathAeadDecryptBulkColFarm: Could not find a MAX_BATCHROWS in the config") + } else { + // this is an integer value, masquerading as a string, but of type interface{} - go figure + maxbatchStr := maxbatch.(string) + maxbatchInt, err = strconv.Atoi(maxbatchStr) + if err != nil { + hclog.L().Error("pathAeadEncryptBulkColFarm: Could not convert MAX_BATCHROWS to integer") + } + } + + _, makesliceSpan := tr.Start(ctx, fmt.Sprintf("pathAeadDecryptBulkColFarm-makeslice")) + mapSlice := createSliceOfMapsFromMapStrInt(data.Raw, maxbatchInt) + makesliceSpan.End() + + // ok so now we have a slice of maps of data + + channelCap := len(mapSlice) + channel := make(chan map[string]interface{}, channelCap) + + // call the encrypt or decrypt per broken up map + for _, dataMap := range mapSlice { + go EncryptOrDecryptDataChan(serviceStr+"/v1/aead-secrets/decryptcol", dataMap, "", tokenStr, channel) + } + + var respStruct = logical.Response{} + var resp = &respStruct + resp.Data = make(map[string]interface{}) + resultsMap := make(map[string]interface{}) + + _, waitSpan := tr.Start(ctx, fmt.Sprintf("pathAeadDecryptBulkColFarm-wait")) + + for i := 0; i < channelCap; i++ { + res := <-channel + for k, v := range res { + // this should be a map of 1 row of rownumber index as string and the map of values + resultsMap[k] = v + } + } + + waitSpan.End() + + resp.Data = resultsMap + + wg.Wait() + + return resp, nil +} diff --git a/path_config.go b/path_config.go index 1487d8f..5171586 100644 --- a/path_config.go +++ b/path_config.go @@ -5,6 +5,9 @@ import ( "context" b64 "encoding/base64" "fmt" + "os" + "strconv" + "time" "github.com/google/tink/go/insecurecleartextkeyset" "github.com/google/tink/go/keyset" @@ -15,15 +18,41 @@ import ( ) var AEAD_CONFIG = cmap.New() +var AEAD_KEYS = cmap.New() func (b *backend) pathConfigWrite(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathAeadDecryptBulkColFarm-" + hostname) + + ctx, span := tr.Start(ctx, "pathConfigWrite-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() return b.configWriteOverwriteCheck(ctx, req, data, false) } func (b *backend) pathConfigOverwrite(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathConfigOverwrite-" + hostname) + + ctx, span := tr.Start(ctx, "pathConfigOverwrite-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() return b.configWriteOverwriteCheck(ctx, req, data, true) - } func (b *backend) configWriteOverwriteCheck(ctx context.Context, req *logical.Request, data *framework.FieldData, overwrite bool) (*logical.Response, error) { + // tr := otel.Tracer("component-configWriteOverwriteCheck") + ctx, span := tr.Start(ctx, "configWriteOverwriteCheck") + + defer span.End() // retrive the config from storage err := b.getAeadConfig(ctx, req) @@ -58,7 +87,17 @@ func (b *backend) configWriteOverwriteCheck(ctx context.Context, req *logical.Re } func (b *backend) pathConfigDelete(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathConfigDelete-" + hostname) + + ctx, span := tr.Start(ctx, "pathConfigDelete-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() // retrive the config from storage err := b.getAeadConfig(ctx, req) if err != nil { @@ -89,7 +128,18 @@ func (b *backend) pathConfigDelete(ctx context.Context, req *logical.Request, da } func (b *backend) pathConfigRead(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathConfigRead-" + hostname) + + ctx, span := tr.Start(ctx, "pathConfigRead-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() // retrive the config from storage err := b.getAeadConfig(ctx, req) if err != nil { @@ -108,7 +158,17 @@ func (b *backend) pathConfigRead(ctx context.Context, req *logical.Request, data } func (b *backend) pathReadKeyTypes(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathReadKeyTypes-" + hostname) + + ctx, span := tr.Start(ctx, "pathReadKeyTypes-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() // retrive the config from storage err := b.getAeadConfig(ctx, req) if err != nil { @@ -131,10 +191,26 @@ func (b *backend) pathReadKeyTypes(ctx context.Context, req *logical.Request, da }, nil } -func (b *backend) getAeadConfig(ctx context.Context, req *logical.Request) error { +func (b *backend) getAeadConfig(ctx context.Context, req *logical.Request, b_optionalDirtyRead ...bool) error { + // tr := otel.Tracer("component-getAeadConfig") + ctx, span := tr.Start(ctx, "getAeadConfig") + defer span.End() - consulConfig, err := b.readConsulConfig(ctx, req.Storage) + hclog.L().Info("getAeadConfig start AEAD_LENGTH=" + strconv.Itoa(len(AEAD_CONFIG.Items()))) + + dirtyRead := false + if len(b_optionalDirtyRead) > 0 { + dirtyRead = b_optionalDirtyRead[0] + } + + // if we are doing a dirty read and the config is not empty then return, don't bother re-reading + if dirtyRead && !AEAD_CONFIG.IsEmpty() { + return nil + } + t := time.Now() + consulConfig, err := b.readConsulConfig(ctx, req.Storage) + hclog.L().Info("getAeadConfig time to read Consul=" + time.Since(t).String()) if err != nil { return err } @@ -151,11 +227,15 @@ func (b *backend) getAeadConfig(ctx context.Context, req *logical.Request) error AEAD_CONFIG.Remove(k) } } + hclog.L().Info("getAeadConfig end AEAD_LENGTH=" + strconv.Itoa(len(AEAD_CONFIG.Items()))) return nil } func (b *backend) readConsulConfig(ctx context.Context, s logical.Storage) (map[string]interface{}, error) { + // tr := otel.Tracer("component-readConsulConfig") + ctx, span := tr.Start(ctx, "readConsulConfig") + defer span.End() consulConfig := make(map[string]interface{}) entry, err := s.Get(ctx, "config") @@ -174,7 +254,17 @@ func (b *backend) readConsulConfig(ctx context.Context, s logical.Storage) (map[ } func (b *backend) pathKeyRotate(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathKeyRotate-" + hostname) + + ctx, span := tr.Start(ctx, "pathKeyRotate-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() // retrive the config from storage err := b.getAeadConfig(ctx, req) if err != nil { @@ -226,7 +316,17 @@ func (b *backend) pathKeyRotate(ctx context.Context, req *logical.Request, data } func (b *backend) pathUpdateKeyStatus(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathUpdateKeyStatus-" + hostname) + + ctx, span := tr.Start(ctx, "pathUpdateKeyStatus") + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() // data.Raw is map[string]map[string]string // map['field0':map['key':'status']] // retrive the config from storage @@ -289,7 +389,17 @@ func (b *backend) pathUpdateKeyStatus(ctx context.Context, req *logical.Request, }, nil } func (b *backend) pathUpdateKeyMaterial(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathUpdateKeyMaterial-" + hostname) + + ctx, span := tr.Start(ctx, "pathUpdateKeyMaterial-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() // data.Raw is map[string]map[string]string // map['field0':map['key':'material']] // retrive the config from storage @@ -351,7 +461,17 @@ func (b *backend) pathUpdateKeyMaterial(ctx context.Context, req *logical.Reques }, nil } func (b *backend) pathUpdatePrimaryKeyID(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathUpdatePrimaryKeyID-" + hostname) + + ctx, span := tr.Start(ctx, "pathUpdatePrimaryKeyID-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() // data.Raw is map[string]string // map['field0':'primaryKey']] // retrive the config from storage @@ -411,7 +531,17 @@ func (b *backend) pathUpdatePrimaryKeyID(ctx context.Context, req *logical.Reque }, nil } func (b *backend) pathUpdateKeyID(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathUpdateKeyID-" + hostname) + + ctx, span := tr.Start(ctx, "pathUpdateKeyID-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() // data.Raw is map[string]map[string]string // map['field0':map['key':'newkey']] // retrive the config from storage @@ -473,7 +603,17 @@ func (b *backend) pathUpdateKeyID(ctx context.Context, req *logical.Request, dat }, nil } func (b *backend) pathImportKey(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathImportKey-" + hostname) + + ctx, span := tr.Start(ctx, "pathImportKey-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() // data.Raw should be map[string]interface{} for _, v := range data.Raw { // k is the field of the key @@ -503,14 +643,39 @@ func (b *backend) pathImportKey(ctx context.Context, req *logical.Request, data } func (b *backend) pathAeadCreateDeterministicKeys(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathAeadCreateDeterministicKeys-" + hostname) + + ctx, span := tr.Start(ctx, "pathAeadCreateDeterministicKeys-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() return b.createDeterministicKeysOverwriteCheck(ctx, req, data, false) } func (b *backend) pathAeadCreateDeterministicKeysOverwrite(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathAeadCreateDeterministicKeysOverwrite-" + hostname) + + ctx, span := tr.Start(ctx, "pathAeadCreateDeterministicKeysOverwrite-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() return b.createDeterministicKeysOverwriteCheck(ctx, req, data, true) } func (b *backend) createDeterministicKeysOverwriteCheck(ctx context.Context, req *logical.Request, data *framework.FieldData, overwrite bool) (*logical.Response, error) { + // tr := otel.Tracer("component-createDeterministicKeysOverwriteCheck") + ctx, span := tr.Start(ctx, "createDeterministicKeysOverwriteCheck") + defer span.End() // retrive the config from storage err := b.getAeadConfig(ctx, req) @@ -567,14 +732,40 @@ func (b *backend) createDeterministicKeysOverwriteCheck(ctx context.Context, req }, nil } func (b *backend) pathAeadCreateNonDeterministicKeys(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathAeadCreateNonDeterministicKeys-" + hostname) + + ctx, span := tr.Start(ctx, "pathAeadCreateNonDeterministicKeys-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() return b.createNonDeterministicKeysOverwriteCheck(ctx, req, data, false) } func (b *backend) pathAeadCreateNonDeterministicKeysOverwrite(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { + initialiseOpenTel() + hostname, _ := os.Hostname() + tr = tp.Tracer("pathAeadCreateNonDeterministicKeysOverwrite-" + hostname) + + ctx, span := tr.Start(ctx, "pathAeadCreateNonDeterministicKeysOverwrite-"+hostname) + defer func() { + span.End() + if err := tp.Shutdown(ctx); err != nil { + hclog.L().Error("Failed to shutdown tracerProvider", err) + } + }() return b.createNonDeterministicKeysOverwriteCheck(ctx, req, data, true) } -func (b *backend) createNonDeterministicKeysOverwriteCheck(ctx context.Context, req *logical.Request, data *framework.FieldData, overwrite bool) (*logical.Response, error) { +func (b *backend) createNonDeterministicKeysOverwriteCheck(ctx_in context.Context, req *logical.Request, data *framework.FieldData, overwrite bool) (*logical.Response, error) { + + // tr := otel.Tracer("component-createNonDeterministicKeysOverwriteCheck") + ctx, span := tr.Start(ctx_in, "createNonDeterministicKeysOverwriteCheck") + defer span.End() // retrive the config from storage err := b.getAeadConfig(ctx, req) @@ -633,6 +824,10 @@ func (b *backend) createNonDeterministicKeysOverwriteCheck(ctx context.Context, func (b *backend) saveKeyToConfig(keysetHandle *keyset.Handle, fieldName string, ctx context.Context, req *logical.Request, overwrite bool) { + // tr := otel.Tracer("component-saveKeyToConfig") + ctx, span := tr.Start(ctx, "saveKeyToConfig") + defer span.End() + // retrive the config from storage err := b.getAeadConfig(ctx, req) if err != nil { @@ -672,7 +867,11 @@ func (b *backend) saveKeyToConfig(keysetHandle *keyset.Handle, fieldName string, } } -func (b *backend) getAdditionalData(fieldName string, config cmap.ConcurrentMap) []byte { +func (b *backend) getAdditionalData(ctx context.Context, fieldName string, config cmap.ConcurrentMap) []byte { + + // tr := otel.Tracer("component-getAdditionalData-" + fieldName) + ctx, span := tr.Start(ctx, "getAdditionalData-"+fieldName) + defer span.End() // set additionalDataBytes as field name of the right type aad, ok := AEAD_CONFIG.Get("ADDITIONAL_DATA_" + fieldName) @@ -683,3 +882,115 @@ func (b *backend) getAdditionalData(fieldName string, config cmap.ConcurrentMap) return []byte(fieldName) } + +func getEncryptionKey(fieldName string, setDepth ...int) (interface{}, bool) { + maxDepth := 5 + if len(setDepth) > 0 { + maxDepth = setDepth[0] + } + possiblyEncryptionKey, ok := AEAD_CONFIG.Get(fieldName) + if !ok { + return nil, ok + } + for i := 1; i < maxDepth; i++ { + possiblyEncryptionKeyStr := possiblyEncryptionKey.(string) + if !isEncryptionJsonKey(possiblyEncryptionKeyStr) { + possiblyEncryptionKey, ok = AEAD_CONFIG.Get(possiblyEncryptionKeyStr) + if !ok { + return nil, ok + } + } else { + return possiblyEncryptionKey, true + } + } + + isKeysetFound := false + return nil, isKeysetFound +} + +func (b *backend) getKeyAndAD(fieldName string, ctx context.Context, req *logical.Request) (interface{}, []byte, error) { + + // tr := otel.Tracer("component-getKeyAndAD-" + fieldName) + ctx, span := tr.Start(ctx, "getKeyAndAD-"+fieldName) + defer span.End() + + t := time.Now() + hclog.L().Info("getKeyAndAD AEAD_LENGTH=" + strconv.Itoa(len(AEAD_CONFIG.Items()))) + + // retrive the config from storage with a dirty read + err := b.getAeadConfig(ctx, req, true) + if err != nil { + return nil, nil, err + } + span.AddEvent("read the config") + + hclog.L().Info("getKeyAndAD re-read config time to read =" + time.Since(t).String() + " AEAD_LENGTH=" + strconv.Itoa(len(AEAD_CONFIG.Items()))) + t = time.Now() + + // set additionalDataBytes as field name of the right type + additionalDataBytes := b.getAdditionalData(ctx, fieldName, AEAD_CONFIG) + span.AddEvent("read the ad") + + _, ok := AEAD_CONFIG.Get("DIRTY_READ_KEYS") + if ok { + tinkKeySet, ok := AEAD_KEYS.Get(fieldName) + if ok { + hclog.L().Info("getKeyAndAD FOUND KEY IN AEAD_KEYS for FIELD=" + fieldName + " time to read =" + time.Since(t).String()) + return tinkKeySet, additionalDataBytes, nil + } + hclog.L().Info("getKeyAndAD NOT FOUND KEY IN AEAD_KEYS for FIELD=" + fieldName + " time to read =" + time.Since(t).String()) + + } + t = time.Now() + + encryptionkeyIntf, ok := getEncryptionKey(fieldName) + span.AddEvent("got a key (or not)") + + // do we have a key already in config + if ok { + span.AddEvent("we do have a key") + + // is the key we have retrived deterministic? + encryptionKeyStr, deterministic := isKeyJsonDeterministic(encryptionkeyIntf) + if deterministic { + span.AddEvent("we do have a deterministic key") + + // SUPPORT FOR DETERMINISTIC AEAD + // we don't need the key handle which is returned first + _, tinkDetAead, err := CreateInsecureHandleAndDeterministicAead(encryptionKeyStr) + if err != nil { + hclog.L().Error("getKeyAndAD Failed to create a keyhandle time="+time.Since(t).String(), err) + return nil, nil, err + } else { + b.saveKeyObjectToConfig(fieldName, tinkDetAead, ctx, req) + hclog.L().Info("getKeyAndAD FOUND KEY IN CONFIG for FIELD=" + fieldName + " time to read Consul=" + time.Since(t).String()) + return tinkDetAead, additionalDataBytes, nil + } + } else { + span.AddEvent("we do have a non deterministic key") + + _, tinkAead, err := CreateInsecureHandleAndAead(encryptionKeyStr) + if err != nil { + hclog.L().Error("getKeyAndAD Failed to create a keyhandle time="+time.Since(t).String(), err) + return nil, nil, err + } else { + b.saveKeyObjectToConfig(fieldName, tinkAead, ctx, req) + hclog.L().Info("getKeyAndAD FOUND KEY IN CONFIG for FIELD=" + fieldName + " time to read Consul=" + time.Since(t).String()) + return tinkAead, additionalDataBytes, nil + } + } + } + span.AddEvent("we do not have a key") + + hclog.L().Error("getKeyAndAD Failed to find or create a key time=" + time.Since(t).String()) + return nil, nil, nil +} + +func (b *backend) saveKeyObjectToConfig(fieldName string, keyObj interface{}, ctx context.Context, req *logical.Request) { + + // tr := otel.Tracer("component-saveKeyObjectToConfig") + ctx, span := tr.Start(ctx, "saveKeyObjectToConfig") + defer span.End() + + AEAD_KEYS.Set(fieldName, keyObj) +} diff --git a/version/version.go b/version/version.go index 32d3e1b..2761f68 100644 --- a/version/version.go +++ b/version/version.go @@ -2,7 +2,7 @@ package version import "fmt" -const Version = "0.1.6" +const Version = "0.1.7" var ( Name string