diff --git a/.github/actions/go-lint/Dockerfile b/.github/actions/go-lint/Dockerfile index aed96deaf..dfcb253ea 100644 --- a/.github/actions/go-lint/Dockerfile +++ b/.github/actions/go-lint/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21-buster +FROM golang:1.22-alpine LABEL author="Everton Haise Taques" LABEL maintainer="netboxlabs" diff --git a/.github/actions/go-report/Dockerfile b/.github/actions/go-report/Dockerfile index 40e0b4657..c8c970a4c 100644 --- a/.github/actions/go-report/Dockerfile +++ b/.github/actions/go-report/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21-alpine +FROM golang:1.22-alpine LABEL author="Everton Haise Taques" LABEL maintainer="netboxlabs" diff --git a/.github/workflows/agent.yml b/.github/workflows/agent.yml index 4ff3756c9..ef674fb21 100644 --- a/.github/workflows/agent.yml +++ b/.github/workflows/agent.yml @@ -6,9 +6,6 @@ on: pktvisor_tag: description: 'pktvisor agent docker tag to package' default: "develop" - diode_tag: - description: 'diode agent docker tag to package' - default: "develop" orb_tag: description: 'orb agent docker tag to package' default: "develop" @@ -26,7 +23,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Get branch name shell: bash @@ -203,9 +200,9 @@ jobs: shell: bash run: | if [ "${{ github.event.inputs.pktvisor_tag }}" == "" ]; then - DIODE_TAG=${{ env.REF_TAG }} PKTVISOR_TAG=${{ env.REF_TAG }} ORB_TAG=${{ env.REF_TAG }} make agent_full + PKTVISOR_TAG=${{ env.REF_TAG }} ORB_TAG=${{ env.REF_TAG }} make agent_full else - DIODE_TAG=${{ github.event.inputs.diode_tag }} PKTVISOR_TAG=${{ github.event.inputs.pktvisor_tag }} ORB_TAG=${{ github.event.inputs.orb_tag }} make agent_full + PKTVISOR_TAG=${{ github.event.inputs.pktvisor_tag }} ORB_TAG=${{ github.event.inputs.orb_tag }} make agent_full fi - name: Login to Docker Hub orbcommunity diff --git a/.github/workflows/go-develop.yml b/.github/workflows/go-develop.yml index 6bea4bd22..acef49f8a 100644 --- a/.github/workflows/go-develop.yml +++ b/.github/workflows/go-develop.yml @@ -22,7 +22,7 @@ jobs: VERSION: ${{ env.VERSION }} steps: - uses: actions/checkout@v4 - - uses: dorny/paths-filter@v2 + - uses: dorny/paths-filter@v3 id: filter with: filters: | @@ -100,7 +100,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Repository Dispatch - uses: peter-evans/repository-dispatch@v2 + uses: peter-evans/repository-dispatch@v3 if: ${{ needs.prebuild.outputs.docs == 'true' && github.event_name != 'pull_request' }} with: token: ${{ secrets.GH_ORB_ACCESS_TOKEN }} @@ -116,7 +116,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.agent == 'true' || github.event_name != 'pull_request' }} @@ -140,7 +140,7 @@ jobs: - name: Upload coverage to Codecov if: ${{ needs.prebuild.outputs.agent == 'true' || github.event_name != 'pull_request' }} - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: version: "v0.1.15" files: coverage.xml @@ -155,7 +155,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.orb == 'true' || github.event_name != 'pull_request' }} @@ -179,7 +179,7 @@ jobs: - name: Upload coverage to Codecov if: ${{ needs.prebuild.outputs.orb == 'true' || github.event_name != 'pull_request' }} - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: version: "v0.1.15" files: coverage.xml @@ -194,7 +194,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.orb == 'true' || github.event_name != 'pull_request' }} @@ -218,7 +218,7 @@ jobs: - name: Upload coverage to Codecov if: ${{ needs.prebuild.outputs.orb == 'true' || github.event_name != 'pull_request' }} - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: version: "v0.1.15" files: coverage.xml @@ -233,7 +233,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.orb == 'true' || github.event_name != 'pull_request' }} @@ -257,7 +257,7 @@ jobs: - name: Upload coverage to Codecov if: ${{ needs.prebuild.outputs.orb == 'true' || github.event_name != 'pull_request' }} - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: version: "v0.1.15" files: coverage.xml @@ -272,7 +272,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.orb == 'true' || github.event_name != 'pull_request' }} @@ -296,7 +296,7 @@ jobs: - name: Upload coverage to Codecov if: ${{ needs.prebuild.outputs.orb == 'true' || github.event_name != 'pull_request' }} - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: version: "v0.1.15" files: coverage.xml @@ -311,7 +311,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.orb == 'true' || github.event_name != 'pull_request' }} @@ -335,7 +335,7 @@ jobs: - name: Upload coverage to Codecov if: ${{ needs.prebuild.outputs.orb == 'true' || github.event_name != 'pull_request' }} - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: version: "v0.1.15" files: coverage.xml @@ -539,7 +539,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dorny/paths-filter@v2 + - uses: dorny/paths-filter@v3 id: filter with: filters: | @@ -612,8 +612,7 @@ jobs: package-migrate: needs: - - package-ui-dependencies - - package-ui + - prebuild runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/go-main.yml b/.github/workflows/go-main.yml index 9fe90359d..374a3eaff 100644 --- a/.github/workflows/go-main.yml +++ b/.github/workflows/go-main.yml @@ -21,7 +21,7 @@ jobs: VERSION: ${{ env.VERSION }} steps: - uses: actions/checkout@v4 - - uses: dorny/paths-filter@v2 + - uses: dorny/paths-filter@v3 id: filter with: filters: | @@ -37,6 +37,11 @@ jobs: - 'cmd/sinks/**' - 'sinker/**' - 'cmd/sinker/**' + - 'maestro/**' + - 'cmd/maestro/**' + migrate: + - 'migrate/**' + - 'cmd/migrate/**' ui: - 'ui/**' - name: Set branch name @@ -65,7 +70,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests run: SERVICE=agent make test_service @@ -78,7 +83,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.orb == 'true' }} @@ -92,7 +97,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.orb == 'true' }} @@ -106,7 +111,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.orb == 'true' }} @@ -120,7 +125,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.orb == 'true' }} @@ -134,7 +139,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.orb == 'true' }} @@ -332,7 +337,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dorny/paths-filter@v2 + - uses: dorny/paths-filter@v3 id: filter with: filters: | @@ -384,6 +389,30 @@ jobs: run: | docker push -a orbcommunity/orb-ui + package-migrate: + needs: + - prebuild + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Build orb migrate service image + if: ${{ needs.prebuild.outputs.migrate == 'true' }} + run: | + SERVICE=migrate make build_docker + + - name: Login to Docker Hub orbcommunity + if: ${{ needs.prebuild.outputs.migrate == 'true' }} + uses: docker/login-action@v3 + with: + username: ${{ secrets.ORB_DOCKERHUB_USERNAME }} + password: ${{ secrets.ORB_DOCKERHUB_TOKEN }} + + - name: Push orb migrate service image orbcommunity + if: ${{ needs.prebuild.outputs.migrate == 'true' }} + run: | + docker push -a orbcommunity/orb-migrate + release: needs: - prebuild @@ -392,6 +421,7 @@ jobs: - package-sinker - package-sinks - package-ui + - package-migrate runs-on: ubuntu-latest # if this is a push into one of our main branches (rather than just a pull request), we will also package if: github.event_name != 'pull_request' diff --git a/.github/workflows/go-production.yml b/.github/workflows/go-production.yml index f61383eb0..13c20e10f 100644 --- a/.github/workflows/go-production.yml +++ b/.github/workflows/go-production.yml @@ -21,7 +21,7 @@ jobs: VERSION: ${{ env.VERSION }} steps: - uses: actions/checkout@v4 - - uses: dorny/paths-filter@v2 + - uses: dorny/paths-filter@v3 id: filter with: filters: | @@ -70,7 +70,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.agent == 'true' }} @@ -84,7 +84,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests run: | @@ -100,7 +100,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.orb == 'true' }} @@ -114,7 +114,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.orb == 'true' }} @@ -128,7 +128,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests if: ${{ needs.prebuild.outputs.orb == 'true' }} @@ -142,7 +142,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21.x + go-version: '1.22' - name: Go unit tests run: | @@ -353,7 +353,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dorny/paths-filter@v2 + - uses: dorny/paths-filter@v3 id: filter with: filters: | @@ -559,7 +559,7 @@ jobs: IMAGE_NAME: orbcommunity/orb-agent:latest IMAGE_NAME_2: orbcommunity/orb-agent:${{ env.VERSION }}-${{ steps.commit_hash.outputs.sha_short }} - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: builder: ${{ steps.buildx.outputs.name }} context: . diff --git a/.gitignore b/.gitignore index 7c7bff44b..8f1d3807d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ build/* localconfig/ .vscode/ +python-test/.idea **/.env diff --git a/Makefile b/Makefile index f07c3ef7c..1aad0df9b 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,6 @@ DOCKERS_DEV = $(addprefix docker_dev_,$(SERVICES)) CGO_ENABLED ?= 0 GOARCH ?= $(shell dpkg-architecture -q DEB_BUILD_ARCH) GOOS ?= $(shell dpkg-architecture -q DEB_TARGET_ARCH_OS) -DIODE_TAG ?= develop ORB_VERSION = $(shell cat VERSION) COMMIT_HASH = $(shell git rev-parse --short HEAD) OTEL_COLLECTOR_CONTRIB_VERSION ?= 0.91.0 @@ -243,7 +242,6 @@ agent_full: docker build --no-cache \ --build-arg GOARCH=$(GOARCH) \ --build-arg PKTVISOR_TAG=$(PKTVISOR_TAG) \ - --build-arg DIODE_TAG=$(DIODE_TAG) \ --build-arg ORB_TAG=${REF_TAG} \ --build-arg OTEL_TAG=${OTEL_COLLECTOR_CONTRIB_VERSION} \ --tag=$(ORB_DOCKERHUB_REPO)/$(DOCKER_IMAGE_NAME_PREFIX)-agent-full:$(REF_TAG) \ diff --git a/VERSION b/VERSION index ae6dd4e20..c25c8e5b7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.29.0 +0.30.0 diff --git a/agent/agent.go b/agent/agent.go index 2e4cf4b80..821b06669 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -21,7 +21,6 @@ import ( "github.com/orb-community/orb/agent/config" manager "github.com/orb-community/orb/agent/policyMgr" "github.com/orb-community/orb/buildinfo" - "github.com/orb-community/orb/fleet" "go.uber.org/zap" ) @@ -49,8 +48,9 @@ type orbAgent struct { asyncContext context.Context - hbTicker *time.Ticker - hbDone chan bool + hbTicker *time.Ticker + heartbeatCtx context.Context + heartbeatCancel context.CancelFunc // Agent RPC channel, configured from command line baseTopic string @@ -189,38 +189,29 @@ func (a *orbAgent) Start(ctx context.Context, cancelFunc context.CancelFunc) err return err } - a.logonWithHearbeat() + a.logonWithHeartbeat() return nil } -func (a *orbAgent) logonWithHearbeat() { +func (a *orbAgent) logonWithHeartbeat() { a.hbTicker = time.NewTicker(HeartbeatFreq) - a.hbDone = make(chan bool) - heartbeatCtx, hbcancelFunc := a.extendContext("heartbeat") - go a.sendHeartbeats(heartbeatCtx, hbcancelFunc) + a.heartbeatCtx, a.heartbeatCancel = a.extendContext("heartbeat") + go a.sendHeartbeats(a.heartbeatCtx, a.heartbeatCancel) + a.logger.Info("heartbeat routine started") } func (a *orbAgent) logoffWithHeartbeat(ctx context.Context) { a.logger.Debug("stopping heartbeat, going offline status", zap.Any("routine", ctx.Value("routine"))) - if a.hbTicker != nil { - a.hbTicker.Stop() - } - if a.rpcFromCancelFunc != nil { - a.rpcFromCancelFunc() + if a.heartbeatCtx != nil { + a.heartbeatCancel() } if a.client != nil && a.client.IsConnected() { a.unsubscribeGroupChannels() - a.sendSingleHeartbeat(ctx, time.Now(), fleet.Offline) if token := a.client.Unsubscribe(a.rpcFromCoreTopic); token.Wait() && token.Error() != nil { a.logger.Warn("failed to unsubscribe to RPC channel", zap.Error(token.Error())) } } - defer func() { - if a.hbDone != nil { - close(a.hbDone) - } - }() } func (a *orbAgent) Stop(ctx context.Context) { a.logger.Info("routine call for stop agent", zap.Any("routine", ctx.Value("routine"))) @@ -237,7 +228,7 @@ func (a *orbAgent) Stop(ctx context.Context) { } a.logoffWithHeartbeat(ctx) if a.client != nil && a.client.IsConnected() { - a.client.Disconnect(250) + a.client.Disconnect(0) } a.logger.Debug("stopping agent with number of go routines and go calls", zap.Int("goroutines", runtime.NumGoroutine()), zap.Int64("gocalls", runtime.NumCgoCall())) if a.policyRequestSucceeded != nil { @@ -285,8 +276,6 @@ func (a *orbAgent) RestartBackend(ctx context.Context, name string, reason strin func (a *orbAgent) restartComms(ctx context.Context) error { if a.client != nil && a.client.IsConnected() { a.unsubscribeGroupChannels() - a.client.Disconnect(250) - a.client = nil } ccm, err := cloud_config.New(a.logger, a.config, a.db) if err != nil { @@ -321,7 +310,6 @@ func (a *orbAgent) RestartAll(ctx context.Context, reason string) error { a.logger.Error("failed to restart backend", zap.Error(err)) } } - a.logonWithHearbeat() a.logger.Info("all backends and comms were restarted") return nil diff --git a/agent/backend/diode/diode.go b/agent/backend/diode/diode.go deleted file mode 100644 index 7cbbc6fe8..000000000 --- a/agent/backend/diode/diode.go +++ /dev/null @@ -1,309 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -package diode - -import ( - "context" - "errors" - "fmt" - "net" - "net/http" - "os/exec" - "strconv" - "strings" - "time" - - mqtt "github.com/eclipse/paho.mqtt.golang" - "github.com/go-cmd/cmd" - dconf "github.com/orb-community/diode/agent/config" - "github.com/orb-community/orb/agent/backend" - "github.com/orb-community/orb/agent/config" - "github.com/orb-community/orb/agent/policies" - "go.opentelemetry.io/collector/exporter" - "go.opentelemetry.io/collector/receiver" - "go.uber.org/zap" -) - -var _ backend.Backend = (*diodeBackend)(nil) - -const ( - DefaultBinary = "/usr/local/bin/diode-agent" - DefaultHost = "localhost" - DefaultPort = "10911" - ReadinessBackoff = 10 - ReadinessTimeout = 10 - ApplyPolicyTimeout = 10 - RemovePolicyTimeout = 20 - VersionTimeout = 2 - ScrapeTimeout = 5 - TapsTimeout = 5 -) - -type diodeBackend struct { - logger *zap.Logger - binary string - configFile string - version string - proc *cmd.Cmd - statusChan <-chan cmd.Status - startTime time.Time - cancelFunc context.CancelFunc - ctx context.Context - - // MQTT Config for OTEL MQTT Exporter - mqttConfig config.MQTTConfig - - mqttClient *mqtt.Client - logTopic string - policyRepo policies.PolicyRepo - - adminAPIHost string - adminAPIPort string - adminAPIProtocol string - - // added for Strings - agentTags map[string]string - - // OpenTelemetry management - otelReceiverHost string - otelReceiverPort int - receiver receiver.Logs - exporter exporter.Logs -} - -func Register() bool { - backend.Register("diode", &diodeBackend{ - adminAPIProtocol: "http", - }) - return true -} - -func (d *diodeBackend) getFreePort() (int, error) { - addr, err := net.ResolveTCPAddr("tcp", "localhost:0") - if err != nil { - return 0, err - } - l, err := net.ListenTCP("tcp", addr) - if err != nil { - return 0, err - } - defer l.Close() - return l.Addr().(*net.TCPAddr).Port, nil -} - -func (d *diodeBackend) GetStartTime() time.Time { - return d.startTime -} - -func (d *diodeBackend) GetInitialState() backend.RunningStatus { - return backend.Unknown -} - -func (d *diodeBackend) GetCapabilities() (map[string]interface{}, error) { - return make(map[string]interface{}), nil -} - -func (d *diodeBackend) GetRunningStatus() (backend.RunningStatus, string, error) { - // first check process status - runningStatus, errMsg, err := d.getProcRunningStatus() - // if it's not running, we're done - if runningStatus != backend.Running { - return runningStatus, errMsg, err - } - // if it's running, check REST API availability too - var dConf dconf.Status - if err := d.request("status", &dConf, http.MethodGet, http.NoBody, "application/json", VersionTimeout); err != nil { - return backend.BackendError, "process running, REST API unavailable", err - } - return runningStatus, "", nil -} - -func (d *diodeBackend) Version() (string, error) { - var dConf dconf.Status - if err := d.request("status", &dConf, http.MethodGet, http.NoBody, "application/json", VersionTimeout); err != nil { - return "", err - } - return dConf.Version, nil -} - -func (d *diodeBackend) SetCommsClient(agentID string, client *mqtt.Client, baseTopic string) { - d.mqttClient = client - logTopic := strings.Replace(baseTopic, "?", "otlp", 1) - d.logTopic = fmt.Sprintf("%s/l/%c", logTopic, agentID[0]) -} - -func (d *diodeBackend) Configure(logger *zap.Logger, repo policies.PolicyRepo, config map[string]string, otelConfig map[string]interface{}) error { - d.logger = logger - d.policyRepo = repo - - var err bool - if d.binary, err = config["binary"]; !err { - d.binary = DefaultBinary - } - if d.configFile, err = config["config_file"]; !err { - d.configFile = "" - } - if d.adminAPIHost, err = config["api_host"]; !err { - d.adminAPIHost = DefaultHost - } - if d.adminAPIPort, err = config["api_port"]; !err { - d.adminAPIPort = DefaultPort - } - if agentTags, ok := otelConfig["agent_tags"]; ok { - d.agentTags = agentTags.(map[string]string) - } - return nil -} - -func (d *diodeBackend) Start(ctx context.Context, cancelFunc context.CancelFunc) error { - - // this should record the start time whether it's successful or not - // because it is used by the automatic restart system for last attempt - d.startTime = time.Now() - d.cancelFunc = cancelFunc - d.ctx = ctx - - _, err := exec.LookPath(d.binary) - if err != nil { - d.logger.Error("diode-agent startup error: binary not found", zap.Error(err)) - return err - } - - pvOptions := []string{ - "run", - "-i", - d.adminAPIHost, - "-p", - d.adminAPIPort, - "-t", - "otlp", - } - if len(d.configFile) > 0 { - pvOptions = append(pvOptions, "--config", d.configFile) - } - - if d.otelReceiverPort == 0 { - d.otelReceiverPort, err = d.getFreePort() - if err != nil { - d.logger.Error("diode-agent otlp startup error", zap.Error(err)) - return err - } - } - - if len(d.otelReceiverHost) == 0 { - d.otelReceiverHost = DefaultHost - } - - pvOptions = append(pvOptions, "-o", d.otelReceiverHost+":"+strconv.Itoa(d.otelReceiverPort)) - - d.logger.Info("diode-agent startup", zap.Strings("arguments", pvOptions)) - - d.proc = cmd.NewCmdOptions(cmd.Options{ - Buffered: false, - Streaming: true, - }, d.binary, pvOptions...) - d.statusChan = d.proc.Start() - - // log STDOUT and STDERR lines streaming from Cmd - doneChan := make(chan struct{}) - go func() { - defer func() { - if doneChan != nil { - close(doneChan) - } - }() - for d.proc.Stdout != nil || d.proc.Stderr != nil { - select { - case line, open := <-d.proc.Stdout: - if !open { - d.proc.Stdout = nil - continue - } - d.logger.Info("diode-agent stdout", zap.String("log", line)) - case line, open := <-d.proc.Stderr: - if !open { - d.proc.Stderr = nil - continue - } - d.logger.Info("diode-agent stderr", zap.String("log", line)) - } - } - }() - - // wait for simple startup errors - time.Sleep(time.Second) - - status := d.proc.Status() - - if status.Error != nil { - d.logger.Error("diode-agent startup error", zap.Error(status.Error)) - return status.Error - } - - if status.Complete { - err = d.proc.Stop() - if err != nil { - d.logger.Error("proc.Stop error", zap.Error(err)) - } - return errors.New("diode-agent startup error, check log") - } - - d.logger.Info("diode-agent process started", zap.Int("pid", status.PID)) - - var readinessError error - for backoff := 0; backoff < ReadinessBackoff; backoff++ { - var dConf dconf.Status - readinessError = d.request("status", &dConf, http.MethodGet, http.NoBody, "application/json", ReadinessTimeout) - if readinessError == nil { - d.logger.Info("diode-agent readiness ok, got version ", zap.String("diode_agent_version", dConf.Version)) - break - } - backoffDuration := time.Duration(backoff) * time.Second - d.logger.Info("diode-agent is not ready, trying again with backoff", zap.String("backoff backoffDuration", backoffDuration.String())) - time.Sleep(backoffDuration) - } - - if readinessError != nil { - d.logger.Error("diode-agent error on readiness", zap.Error(readinessError)) - err = d.proc.Stop() - if err != nil { - d.logger.Error("proc.Stop error", zap.Error(err)) - } - return readinessError - } - - d.receiveOtlp() - - return nil -} - -func (d *diodeBackend) Stop(ctx context.Context) error { - d.logger.Info("routine call to stop diode-agent", zap.Any("routine", ctx.Value("routine"))) - defer d.cancelFunc() - err := d.proc.Stop() - finalStatus := <-d.statusChan - if err != nil { - d.logger.Error("diode-agent shutdown error", zap.Error(err)) - } - d.logger.Info("diode-agent process stopped", zap.Int("pid", finalStatus.PID), zap.Int("exit_code", finalStatus.Exit)) - return nil -} - -func (d *diodeBackend) FullReset(ctx context.Context) error { - // force a stop, which stops scrape as well. if proc is dead, it no ops. - if state, _, _ := d.getProcRunningStatus(); state == backend.Running { - if err := d.Stop(ctx); err != nil { - d.logger.Error("failed to stop backend on restart procedure", zap.Error(err)) - return err - } - } - backendCtx, cancelFunc := context.WithCancel(context.WithValue(ctx, "routine", "diode-agent")) - // start it - if err := d.Start(backendCtx, cancelFunc); err != nil { - d.logger.Error("failed to start backend on restart procedure", zap.Error(err)) - return err - } - return nil -} diff --git a/agent/backend/diode/policy.go b/agent/backend/diode/policy.go deleted file mode 100644 index f1dc7a4e0..000000000 --- a/agent/backend/diode/policy.go +++ /dev/null @@ -1,58 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -package diode - -import ( - "bytes" - "fmt" - "net/http" - - "github.com/orb-community/orb/agent/policies" - "go.uber.org/zap" - "gopkg.in/yaml.v3" -) - -func (d *diodeBackend) ApplyPolicy(data policies.PolicyData, updatePolicy bool) error { - if updatePolicy { - // To update a policy it's necessary first remove it and then apply a new version - err := d.RemovePolicy(data) - if err != nil { - d.logger.Warn("policy failed to remove", zap.String("policy_id", data.ID), zap.String("policy_name", data.Name), zap.Error(err)) - } - } - d.logger.Debug("diode-agent policy apply", zap.String("policy_id", data.ID), zap.Any("data", data.Data)) - pol := map[string]interface{}{ - data.Name: data.Data, - } - policyYaml, err := yaml.Marshal(pol) - if err != nil { - d.logger.Warn("yaml policy marshal failure", zap.String("policy_id", data.ID), zap.Any("policy", pol)) - return err - } - var resp map[string]interface{} - err = d.request("policies", &resp, http.MethodPost, bytes.NewBuffer(policyYaml), "application/x-yaml", ApplyPolicyTimeout) - if err != nil { - d.logger.Warn("yaml policy application failure", zap.String("policy_id", data.ID), zap.ByteString("policy", policyYaml)) - return err - } - return nil -} - -func (d *diodeBackend) RemovePolicy(data policies.PolicyData) error { - d.logger.Debug("diode-agent policy remove", zap.String("policy_id", data.ID)) - var resp interface{} - var name string - // Since we use Name for removing policies not IDs, if there is a change, we need to remove the previous name of the policy - if data.PreviousPolicyData != nil && data.PreviousPolicyData.Name != data.Name { - name = data.PreviousPolicyData.Name - } else { - name = data.Name - } - err := d.request(fmt.Sprintf("policies/%s", name), &resp, http.MethodDelete, http.NoBody, "application/json", RemovePolicyTimeout) - if err != nil { - return err - } - return nil -} diff --git a/agent/backend/diode/scrape.go b/agent/backend/diode/scrape.go deleted file mode 100644 index eb6fd95de..000000000 --- a/agent/backend/diode/scrape.go +++ /dev/null @@ -1,131 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -package diode - -import ( - "context" - "go.opentelemetry.io/otel/sdk/metric" - "strconv" - "time" - - "github.com/orb-community/orb/agent/otel" - "github.com/orb-community/orb/agent/otel/otlpmqttexporter" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/exporter" - "go.opentelemetry.io/collector/receiver" - "go.opentelemetry.io/collector/receiver/otlpreceiver" - "go.opentelemetry.io/otel/trace" - "go.uber.org/zap" -) - -const ( - otlpProtocol = "tcp" -) - -func (d *diodeBackend) createOtlpMqttExporter(ctx context.Context, cancelFunc context.CancelFunc) (exporter.Logs, error) { - - bridgeService := otel.NewBridgeService(ctx, cancelFunc, &d.policyRepo, d.agentTags) - if d.mqttClient != nil { - cfg := otlpmqttexporter.CreateConfigClient(d.mqttClient, d.logTopic, d.version, bridgeService) - set := otlpmqttexporter.CreateDefaultSettings(d.logger) - // Create the OTLP logs exporter that'll receive and verify the logs produced. - exporter, err := otlpmqttexporter.CreateLogsExporter(ctx, set, cfg) - if err != nil { - return nil, err - } - return exporter, nil - } else { - cfg := otlpmqttexporter.CreateConfig(d.mqttConfig.Address, d.mqttConfig.Id, d.mqttConfig.Key, - d.mqttConfig.ChannelID, d.version, d.logTopic, bridgeService) - set := otlpmqttexporter.CreateDefaultSettings(d.logger) - // Create the OTLP logs exporter that'll receive and verify the logs produced. - exporter, err := otlpmqttexporter.CreateLogsExporter(ctx, set, cfg) - if err != nil { - return nil, err - } - return exporter, nil - } - -} - -func (d *diodeBackend) receiveOtlp() { - exeCtx, execCancelF := context.WithCancel(d.ctx) - go func() { - defer execCancelF() - var err error - count := 0 - for { - if d.mqttClient != nil { - d.exporter, err = d.createOtlpMqttExporter(exeCtx, execCancelF) - if err != nil { - d.logger.Error("failed to create a exporter", zap.Error(err)) - return - } - pFactory := otlpreceiver.NewFactory() - cfg := pFactory.CreateDefaultConfig().(*otlpreceiver.Config) - cfg.HTTP = nil - cfg.GRPC.NetAddr.Endpoint = d.otelReceiverHost + ":" + strconv.Itoa(d.otelReceiverPort) - cfg.GRPC.NetAddr.Transport = otlpProtocol - - set := receiver.CreateSettings{ - TelemetrySettings: component.TelemetrySettings{ - Logger: d.logger, - TracerProvider: trace.NewNoopTracerProvider(), - MeterProvider: metric.NewMeterProvider(), - ReportComponentStatus: func(*component.StatusEvent) error { - return nil - }, - }, - BuildInfo: component.NewDefaultBuildInfo(), - } - d.receiver, err = pFactory.CreateLogsReceiver(exeCtx, set, cfg, d.exporter) - if err != nil { - d.logger.Error("failed to create a receiver", zap.Error(err)) - return - } - - err = d.exporter.Start(exeCtx, nil) - if err != nil { - d.logger.Error("otel mqtt exporter startup error", zap.Error(err)) - return - } - - err = d.receiver.Start(exeCtx, nil) - if err != nil { - d.logger.Error("otel receiver startup error", zap.Error(err)) - return - } - break - } else { - count++ - d.logger.Info("waiting until mqtt client is connected try " + strconv.Itoa(count) + " from 10") - time.Sleep(time.Second * 3) - if count >= 10 { - execCancelF() - _ = d.Stop(exeCtx) - break - } - } - } - for { - select { - case <-exeCtx.Done(): - d.ctx.Done() - d.cancelFunc() - case <-d.ctx.Done(): - err := d.exporter.Shutdown(exeCtx) - if err != nil { - return - } - err = d.receiver.Shutdown(exeCtx) - if err != nil { - return - } - d.logger.Info("stopped diode agent OpenTelemetry collector") - return - } - } - }() -} diff --git a/agent/backend/diode/utils.go b/agent/backend/diode/utils.go deleted file mode 100644 index 7180f4087..000000000 --- a/agent/backend/diode/utils.go +++ /dev/null @@ -1,92 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -package diode - -import ( - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "time" - - "github.com/orb-community/orb/agent/backend" - "go.uber.org/zap" - "gopkg.in/yaml.v2" -) - -// note this needs to be stateless because it is called for multiple go routines -func (d *diodeBackend) request(url string, payload interface{}, method string, body io.Reader, contentType string, timeout int32) error { - client := http.Client{ - Timeout: time.Second * time.Duration(timeout), - } - - status, _, err := d.getProcRunningStatus() - if status != backend.Running { - d.logger.Warn("skipping diode REST API request because process is not running or is unresponsive", zap.String("url", url), zap.String("method", method), zap.Error(err)) - return err - } - - URL := fmt.Sprintf("%s://%s:%s/api/v1/%s", d.adminAPIProtocol, d.adminAPIHost, d.adminAPIPort, url) - - req, err := http.NewRequest(method, URL, body) - if err != nil { - d.logger.Error("received error from payload", zap.Error(err)) - return err - } - - req.Header.Add("Content-Type", contentType) - res, getErr := client.Do(req) - - if getErr != nil { - d.logger.Error("received error from payload", zap.Error(getErr)) - return getErr - } - - if (res.StatusCode < 200) || (res.StatusCode > 299) { - body, err := io.ReadAll(res.Body) - if err != nil { - return errors.New(fmt.Sprintf("non 2xx HTTP error code from diode, no or invalid body: %d", res.StatusCode)) - } - if len(body) == 0 { - return errors.New(fmt.Sprintf("%d empty body", res.StatusCode)) - } else if body[0] == '{' { - var jsonBody map[string]interface{} - err := json.Unmarshal(body, &jsonBody) - if err == nil { - if errMsg, ok := jsonBody["error"]; ok { - return errors.New(fmt.Sprintf("%d %s", res.StatusCode, errMsg)) - } - } - } - } - - if res.Body != nil { - err = json.NewDecoder(res.Body).Decode(&payload) - if err != nil { - err = yaml.NewDecoder(res.Body).Decode(&payload) - if err != nil { - return err - } - } - } - return nil -} - -func (d *diodeBackend) getProcRunningStatus() (backend.RunningStatus, string, error) { - status := d.proc.Status() - if status.Error != nil { - errMsg := fmt.Sprintf("diode process error: %v", status.Error) - return backend.BackendError, errMsg, status.Error - } - if status.Complete { - err := d.proc.Stop() - return backend.Offline, "diode process ended", err - } - if status.StopTs > 0 { - return backend.Offline, "diode process ended", nil - } - return backend.Running, "", nil -} diff --git a/agent/backend/otel/otel.go b/agent/backend/otel/otel.go index 68dff2454..425c5dbd2 100644 --- a/agent/backend/otel/otel.go +++ b/agent/backend/otel/otel.go @@ -180,15 +180,7 @@ func (o *openTelemetryBackend) Stop(_ context.Context) error { } func (o *openTelemetryBackend) FullReset(ctx context.Context) error { - o.logger.Info("resetting all policies and restarting, skipping if already killed", zap.Int("policies", len(o.runningCollectors))) - for policyID, policyEntry := range o.runningCollectors { - o.logger.Debug("stopping policy context", zap.String("policy_id", policyID)) - policyEntry.ctx.Done() - if err := o.ApplyPolicy(policyEntry.policyData, true); err != nil { - o.logger.Error("failed to apply policy", zap.Error(err)) - return err - } - } + o.logger.Info("restarting otel backend", zap.Int("running policies", len(o.runningCollectors))) backendCtx, cancelFunc := context.WithCancel(context.WithValue(ctx, "routine", "otel")) if err := o.Start(backendCtx, cancelFunc); err != nil { return err @@ -221,7 +213,7 @@ func (o *openTelemetryBackend) GetRunningStatus() (backend.RunningStatus, string return backend.Waiting, "opentelemetry backend is waiting for policy to come to start running", nil } -func (o *openTelemetryBackend) createOtlpMetricMqttExporter(ctx context.Context, cancelFunc context.CancelFunc) (exporter.Metrics, error) { +func (o *openTelemetryBackend) createOtlpMetricMqttExporter(ctx context.Context, cancelFunc context.CancelCauseFunc) (exporter.Metrics, error) { bridgeService := otel.NewBridgeService(ctx, cancelFunc, &o.policyRepo, o.agentTags) var cfg component.Config if o.mqttClient != nil { @@ -237,7 +229,7 @@ func (o *openTelemetryBackend) createOtlpMetricMqttExporter(ctx context.Context, } -func (o *openTelemetryBackend) createOtlpTraceMqttExporter(ctx context.Context, cancelFunc context.CancelFunc) (exporter.Traces, error) { +func (o *openTelemetryBackend) createOtlpTraceMqttExporter(ctx context.Context, cancelFunc context.CancelCauseFunc) (exporter.Traces, error) { bridgeService := otel.NewBridgeService(ctx, cancelFunc, &o.policyRepo, o.agentTags) if o.mqttClient != nil { cfg := otlpmqttexporter.CreateConfigClient(o.mqttClient, o.otlpTracesTopic, "", bridgeService) @@ -262,7 +254,7 @@ func (o *openTelemetryBackend) createOtlpTraceMqttExporter(ctx context.Context, } -func (o *openTelemetryBackend) createOtlpLogsMqttExporter(ctx context.Context, cancelFunc context.CancelFunc) (exporter.Logs, error) { +func (o *openTelemetryBackend) createOtlpLogsMqttExporter(ctx context.Context, cancelFunc context.CancelCauseFunc) (exporter.Logs, error) { bridgeService := otel.NewBridgeService(ctx, cancelFunc, &o.policyRepo, o.agentTags) if o.mqttClient != nil { cfg := otlpmqttexporter.CreateConfigClient(o.mqttClient, o.otlpLogsTopic, "", bridgeService) diff --git a/agent/backend/otel/policy.go b/agent/backend/otel/policy.go index 0a2df10a0..21b5ccdaa 100644 --- a/agent/backend/otel/policy.go +++ b/agent/backend/otel/policy.go @@ -82,8 +82,6 @@ func (o *openTelemetryBackend) ApplyPolicy(newPolicyData policies.PolicyData, up if err := o.policyRepo.Update(newPolicyData); err != nil { return err } - - o.otelReceiverTaps = append(o.otelReceiverTaps, newPolicyData.ID) } else { o.logger.Info("current policy version is newer than the one being applied, skipping", zap.String("policy_id", newPolicyData.ID), @@ -159,7 +157,9 @@ func (o *openTelemetryBackend) RemovePolicy(data policies.PolicyData) error { if err := os.Remove(policyPath); err != nil { o.logger.Warn("failed to remove policy file, this won't fail policy removal", zap.String("policy_id", data.ID), zap.Error(err)) } + return nil } + o.logger.Warn("no policy was removed, policy not found", zap.String("policy_id", data.ID)) return nil } diff --git a/agent/backend/otel/scrape.go b/agent/backend/otel/scrape.go index 7af68401e..2b4ab8000 100644 --- a/agent/backend/otel/scrape.go +++ b/agent/backend/otel/scrape.go @@ -2,22 +2,22 @@ package otel import ( "context" + "errors" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configgrpc" "go.opentelemetry.io/collector/config/confignet" "go.opentelemetry.io/collector/receiver" "go.opentelemetry.io/collector/receiver/otlpreceiver" "go.opentelemetry.io/otel/sdk/metric" - "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/noop" "go.uber.org/zap" "strconv" "time" ) func (o *openTelemetryBackend) receiveOtlp() { - exeCtx, execCancelF := context.WithCancel(o.mainContext) + exeCtx, execCancelF := context.WithCancelCause(o.mainContext) go func() { - defer execCancelF() count := 0 maxRetries := 20 for { @@ -32,13 +32,14 @@ func (o *openTelemetryBackend) receiveOtlp() { //if ok := o.startOtelLogs(exeCtx, execCancelF); !ok { // return //} + o.logger.Info("started otel receiver for opentelemetry") break } else { count++ o.logger.Info("waiting until mqtt client is connected try " + strconv.Itoa(count) + " from " + strconv.Itoa(maxRetries)) time.Sleep(time.Second * time.Duration(count)) if count >= maxRetries { - execCancelF() + execCancelF(errors.New("mqtt client is not connected")) o.mainCancelFunction() break } @@ -47,6 +48,7 @@ func (o *openTelemetryBackend) receiveOtlp() { for { select { case <-exeCtx.Done(): + o.logger.Info("stopped receiver context, pktvisor will not scrape metrics", zap.Error(context.Cause(exeCtx))) o.mainContext.Done() o.mainCancelFunction() case <-o.mainContext.Done(): @@ -58,10 +60,7 @@ func (o *openTelemetryBackend) receiveOtlp() { }() } -func (o *openTelemetryBackend) startOtelMetric(exeCtx context.Context, execCancelF context.CancelFunc) bool { - if o.metricsExporter != nil { - return true - } +func (o *openTelemetryBackend) startOtelMetric(exeCtx context.Context, execCancelF context.CancelCauseFunc) bool { var err error o.metricsExporter, err = o.createOtlpMetricMqttExporter(exeCtx, execCancelF) if err != nil { @@ -81,7 +80,7 @@ func (o *openTelemetryBackend) startOtelMetric(exeCtx context.Context, execCance set := receiver.CreateSettings{ TelemetrySettings: component.TelemetrySettings{ Logger: o.logger, - TracerProvider: trace.NewNoopTracerProvider(), + TracerProvider: noop.NewTracerProvider(), MeterProvider: metric.NewMeterProvider(), ReportComponentStatus: func(*component.StatusEvent) error { return nil diff --git a/agent/backend/pktvisor/pktvisor.go b/agent/backend/pktvisor/pktvisor.go index 478cc8bbe..de8f49cb1 100644 --- a/agent/backend/pktvisor/pktvisor.go +++ b/agent/backend/pktvisor/pktvisor.go @@ -17,7 +17,6 @@ import ( mqtt "github.com/eclipse/paho.mqtt.golang" "github.com/go-cmd/cmd" - "github.com/go-co-op/gocron" "github.com/orb-community/orb/agent/backend" "github.com/orb-community/orb/agent/config" "github.com/orb-community/orb/agent/policies" @@ -67,7 +66,6 @@ type pktvisorBackend struct { mqttClient *mqtt.Client metricsTopic string otlpMetricsTopic string - scraper *gocron.Scheduler policyRepo policies.PolicyRepo adminAPIHost string @@ -78,7 +76,6 @@ type pktvisorBackend struct { agentTags map[string]string // OpenTelemetry management - scrapeOtel bool otelReceiverHost string otelReceiverPort int receiver receiver.Metrics @@ -164,18 +161,16 @@ func (p *pktvisorBackend) Start(ctx context.Context, cancelFunc context.CancelFu pvOptions = append(pvOptions, "--config", p.configFile) } - if p.scrapeOtel { - pvOptions = append(pvOptions, "--otel") - pvOptions = append(pvOptions, "--otel-host", p.otelReceiverHost) - if p.otelReceiverPort == 0 { - p.otelReceiverPort, err = p.getFreePort() - if err != nil { - p.logger.Error("pktvisor otlp startup error", zap.Error(err)) - return err - } + pvOptions = append(pvOptions, "--otel") + pvOptions = append(pvOptions, "--otel-host", p.otelReceiverHost) + if p.otelReceiverPort == 0 { + p.otelReceiverPort, err = p.getFreePort() + if err != nil { + p.logger.Error("pktvisor otlp startup error", zap.Error(err)) + return err } - pvOptions = append(pvOptions, "--otel-port", strconv.Itoa(p.otelReceiverPort)) } + pvOptions = append(pvOptions, "--otel-port", strconv.Itoa(p.otelReceiverPort)) // the macros should be properly configured to enable crashpad // pvOptions = append(pvOptions, "--cp-token", PKTVISOR_CP_TOKEN) @@ -239,6 +234,7 @@ func (p *pktvisorBackend) Start(ctx context.Context, cancelFunc context.CancelFu } p.logger.Info("pktvisor process started", zap.Int("pid", status.PID)) + p.receiveOtlp() var readinessError error for backoff := 0; backoff < ReadinessBackoff; backoff++ { @@ -262,16 +258,6 @@ func (p *pktvisorBackend) Start(ctx context.Context, cancelFunc context.CancelFu return readinessError } - p.scraper = gocron.NewScheduler(time.UTC) - if !p.scrapeOtel { - p.scraper.StartAsync() - if err := p.scrapeDefault(); err != nil { - return err - } - } else { - p.receiveOtlp() - } - return nil } @@ -283,7 +269,6 @@ func (p *pktvisorBackend) Stop(ctx context.Context) error { if err != nil { p.logger.Error("pktvisor shutdown error", zap.Error(err)) } - p.scraper.Stop() p.logger.Info("pktvisor process stopped", zap.Int("pid", finalStatus.PID), zap.Int("exit_code", finalStatus.Exit)) return nil @@ -313,11 +298,6 @@ func (p *pktvisorBackend) Configure(logger *zap.Logger, repo policies.PolicyRepo for k, v := range otelConfig { switch k { - case "Enable": - p.scrapeOtel = v.(bool) - if v.(bool) { - p.logger.Info("OpenTelemetry enabled") - } case "Host": p.otelReceiverHost = v.(string) case "Port": diff --git a/agent/backend/pktvisor/scrape.go b/agent/backend/pktvisor/scrape.go index 9fc825e91..8c2795390 100644 --- a/agent/backend/pktvisor/scrape.go +++ b/agent/backend/pktvisor/scrape.go @@ -6,22 +6,21 @@ package pktvisor import ( "context" - "encoding/json" + "errors" "fmt" + "go.opentelemetry.io/otel/trace/noop" "net/http" "strconv" "time" "github.com/orb-community/orb/agent/otel" "github.com/orb-community/orb/agent/otel/otlpmqttexporter" - "github.com/orb-community/orb/fleet" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/confighttp" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/receiver" "go.opentelemetry.io/collector/receiver/otlpreceiver" "go.opentelemetry.io/otel/sdk/metric" - "go.opentelemetry.io/otel/trace" "go.uber.org/zap" ) @@ -34,7 +33,7 @@ func (p *pktvisorBackend) scrapeMetrics(period uint) (map[string]interface{}, er return metrics, nil } -func (p *pktvisorBackend) createOtlpMqttExporter(ctx context.Context, cancelFunc context.CancelFunc) (exporter.Metrics, error) { +func (p *pktvisorBackend) createOtlpMqttExporter(ctx context.Context, cancelFunc context.CancelCauseFunc) (exporter.Metrics, error) { bridgeService := otel.NewBridgeService(ctx, cancelFunc, &p.policyRepo, p.agentTags) var cfg component.Config if p.mqttClient != nil { @@ -49,10 +48,7 @@ func (p *pktvisorBackend) createOtlpMqttExporter(ctx context.Context, cancelFunc return otlpmqttexporter.CreateMetricsExporter(ctx, set, cfg) } -func (p *pktvisorBackend) startOtelMetric(exeCtx context.Context, execCancelF context.CancelFunc) bool { - if p.exporter != nil { - return true - } +func (p *pktvisorBackend) startOtelMetric(exeCtx context.Context, execCancelF context.CancelCauseFunc) bool { var err error p.exporter, err = p.createOtlpMqttExporter(exeCtx, execCancelF) if err != nil { @@ -72,7 +68,7 @@ func (p *pktvisorBackend) startOtelMetric(exeCtx context.Context, execCancelF co set := receiver.CreateSettings{ TelemetrySettings: component.TelemetrySettings{ Logger: p.logger, - TracerProvider: trace.NewNoopTracerProvider(), + TracerProvider: noop.NewTracerProvider(), MeterProvider: metric.NewMeterProvider(), ReportComponentStatus: func(*component.StatusEvent) error { return nil @@ -101,85 +97,9 @@ func (p *pktvisorBackend) startOtelMetric(exeCtx context.Context, execCancelF co return true } -func (p *pktvisorBackend) scrapeDefault() error { - // scrape all policy json output with one call every minute. - // TODO support policies with custom bucket times - job, err := p.scraper.Every(1).Minute().WaitForSchedule().Do(func() { - metrics, err := p.scrapeMetrics(1) - if err != nil { - p.logger.Error("scrape failed", zap.Error(err)) - return - } - if len(metrics) == 0 { - p.logger.Warn("scrape: no policies found, skipping") - return - } - - var batchPayload []fleet.AgentMetricsRPCPayload - totalSize := 0 - for pName, pMetrics := range metrics { - policyData, err := p.policyRepo.GetByName(pName) - if err != nil { - p.logger.Warn("skipping pktvisor policy not managed by orb", zap.String("policy", pName), zap.Error(err)) - continue - } - payloadData, err := json.Marshal(pMetrics) - if err != nil { - p.logger.Error("error marshalling scraped metric json", zap.String("policy", pName), zap.Error(err)) - continue - } - metricPayload := fleet.AgentMetricsRPCPayload{ - PolicyID: policyData.ID, - PolicyName: policyData.Name, - Datasets: policyData.GetDatasetIDs(), - Format: "json", - BEVersion: p.pktvisorVersion, - Data: payloadData, - } - batchPayload = append(batchPayload, metricPayload) - totalSize += len(payloadData) - policyData.LastScrapeBytes = int64(totalSize) - policyData.LastScrapeTS = time.Now() - err = p.policyRepo.Update(policyData) - if err != nil { - p.logger.Error("unable to update policy repo during scrape", zap.Error(err)) - } - p.logger.Info("scraped metrics for policy", zap.String("policy", pName), zap.String("policy_id", policyData.ID), zap.Int("payload_size_b", len(payloadData))) - } - - rpc := fleet.AgentMetricsRPC{ - SchemaVersion: fleet.CurrentRPCSchemaVersion, - Func: fleet.AgentMetricsRPCFunc, - Payload: batchPayload, - } - - body, err := json.Marshal(rpc) - if err != nil { - p.logger.Error("error marshalling metric rpc payload", zap.Error(err)) - return - } - c := *p.mqttClient - if token := c.Publish(p.metricsTopic, 1, false, body); token.Wait() && token.Error() != nil { - p.logger.Error("error sending metrics RPC", zap.String("topic", p.metricsTopic), zap.Error(token.Error())) - return - } - - p.logger.Info("scraped and published metrics", zap.String("topic", p.metricsTopic), zap.Int("payload_size_b", totalSize), zap.Int("batch_count", len(batchPayload))) - - }) - - if err != nil { - return err - } - - job.SingletonMode() - return nil -} - func (p *pktvisorBackend) receiveOtlp() { - exeCtx, execCancelF := context.WithCancel(p.ctx) + exeCtx, execCancelF := context.WithCancelCause(p.ctx) go func() { - defer execCancelF() count := 0 for { if p.mqttClient != nil { @@ -187,13 +107,14 @@ func (p *pktvisorBackend) receiveOtlp() { p.logger.Error("failed to start otel metric") return } + p.logger.Info("started otel receiver for pktvisor") break } else { count++ p.logger.Info("waiting until mqtt client is connected try " + strconv.Itoa(count) + " from 10") time.Sleep(time.Second * time.Duration(count)) if count >= 10 { - execCancelF() + execCancelF(errors.New("mqtt client is not connected")) _ = p.Stop(exeCtx) break } @@ -202,11 +123,15 @@ func (p *pktvisorBackend) receiveOtlp() { for { select { case <-exeCtx.Done(): - p.ctx.Done() + p.logger.Info("stopped receiver context, pktvisor will not scrape metrics", zap.Error(context.Cause(exeCtx))) p.cancelFunc() + _ = p.exporter.Shutdown(exeCtx) + _ = p.receiver.Shutdown(exeCtx) case <-p.ctx.Done(): - p.logger.Info("stopped Orb OpenTelemetry agent collector") - p.cancelFunc() + p.logger.Info("stopped pktvisor main context, stopping receiver") + execCancelF(errors.New("stopped pktvisor main context")) + _ = p.exporter.Shutdown(exeCtx) + _ = p.receiver.Shutdown(exeCtx) return } } diff --git a/agent/comms.go b/agent/comms.go index c7a634478..448c19527 100644 --- a/agent/comms.go +++ b/agent/comms.go @@ -208,6 +208,8 @@ func (a *orbAgent) startComms(ctx context.Context, config config.MQTTConfig) err a.config.OrbAgent.Cloud.MQTT.Key = config.Key a.config.OrbAgent.Cloud.MQTT.Address = config.Address a.config.OrbAgent.Cloud.MQTT.ChannelID = config.ChannelID + } else { + a.requestReconnection(ctx, a.client, config) } return nil diff --git a/agent/config/types.go b/agent/config/types.go index 4dd3a31bb..962dbd04e 100644 --- a/agent/config/types.go +++ b/agent/config/types.go @@ -36,9 +36,8 @@ type Cloud struct { } type Opentelemetry struct { - Enable bool `mapstructure:"enable"` - Host string `mapstructure:"host"` - Port int `mapstructure:"port"` + Host string `mapstructure:"host"` + Port int `mapstructure:"port"` } type Debug struct { diff --git a/agent/docker/Dockerfile b/agent/docker/Dockerfile index 6ce10d025..c445b9c42 100644 --- a/agent/docker/Dockerfile +++ b/agent/docker/Dockerfile @@ -1,5 +1,5 @@ ARG PKTVISOR_TAG=latest-develop -FROM golang:1.21-alpine AS builder +FROM golang:1.22-alpine AS builder WORKDIR /go/src/github.com/orbcommunity/orb COPY go.mod . diff --git a/agent/docker/Dockerfile.full b/agent/docker/Dockerfile.full index a23fc2a92..74bfff51b 100644 --- a/agent/docker/Dockerfile.full +++ b/agent/docker/Dockerfile.full @@ -1,12 +1,9 @@ ARG ORB_TAG=develop ARG PKTVISOR_TAG=develop -ARG DIODE_TAG=develop ARG OTEL_TAG=0.91.0 FROM orbcommunity/orb-agent:${ORB_TAG} AS orb -FROM orbcommunity/diode-agent:${DIODE_TAG} AS diode - FROM otel/opentelemetry-collector-contrib:${OTEL_TAG} AS otelcol-contrib FROM orbcommunity/pktvisor:${PKTVISOR_TAG} @@ -18,12 +15,6 @@ COPY ./agent/docker/agent_default_full.yaml /opt/orb/agent_default.yaml COPY --from=orb /usr/local/bin/orb-agent-entry.sh /usr/local/bin/orb-agent-entry.sh COPY --from=orb /run-agent.sh /run-agent.sh -# adding diode-agent -COPY --from=diode /usr/local/bin/diode-agent /usr/local/bin/diode-agent - -# adding suzieq patched -COPY --from=diode /root/.suzieq /root/.suzieq - COPY --from=otelcol-contrib /otelcol-contrib /usr/local/bin/otelcol-contrib RUN chmod a+x /run-agent.sh diff --git a/agent/docker/agent_default_full.yaml b/agent/docker/agent_default_full.yaml index 2b8e9d0b4..fbdd8c448 100644 --- a/agent/docker/agent_default_full.yaml +++ b/agent/docker/agent_default_full.yaml @@ -8,9 +8,6 @@ orb: pktvisor: binary: /usr/local/sbin/pktvisord config_file: /opt/orb/agent_default.yaml - diode: - binary: /usr/local/bin/diode-agent - config_file: /opt/orb/agent_default.yaml otel: binary: /usr/local/bin/otelcol-contrib config_file: /opt/orb/agent_default.yaml diff --git a/agent/heartbeats.go b/agent/heartbeats.go index 237f0af88..44086f078 100644 --- a/agent/heartbeats.go +++ b/agent/heartbeats.go @@ -28,7 +28,7 @@ func (a *orbAgent) sendSingleHeartbeat(ctx context.Context, t time.Time, agentsS return } - a.logger.Debug("heartbeat") + a.logger.Debug("heartbeat", zap.String("state", agentsState.String())) bes := make(map[string]fleet.BackendStateInfo) for name, be := range a.backends { @@ -145,18 +145,17 @@ func (a *orbAgent) sendSingleHeartbeat(ctx context.Context, t time.Time, agentsS } func (a *orbAgent) sendHeartbeats(ctx context.Context, cancelFunc context.CancelFunc) { - a.logger.Debug("start heartbeats routine", zap.Any("routine", ctx.Value("#routine"))) + a.logger.Debug("start heartbeats routine", zap.Any("routine", ctx.Value("routine"))) a.sendSingleHeartbeat(ctx, time.Now(), fleet.Online) defer func() { cancelFunc() - a.logger.Debug("stopping heartbeats routine") }() for { select { case <-ctx.Done(): - return - case <-a.hbDone: - ctx.Done() + a.logger.Debug("context done, stopping heartbeats routine") + a.sendSingleHeartbeat(ctx, time.Now(), fleet.Offline) + a.heartbeatCtx = nil return case t := <-a.hbTicker.C: a.sendSingleHeartbeat(ctx, t, fleet.Online) diff --git a/agent/otel/bridgeservice.go b/agent/otel/bridgeservice.go index b933a344f..4185c0c69 100644 --- a/agent/otel/bridgeservice.go +++ b/agent/otel/bridgeservice.go @@ -22,12 +22,12 @@ var _ AgentBridgeService = (*BridgeService)(nil) type BridgeService struct { bridgeContext context.Context - cancelFunc context.CancelFunc + cancelFunc context.CancelCauseFunc policyRepo policies.PolicyRepo AgentTags map[string]string } -func NewBridgeService(ctx context.Context, cancelFunc context.CancelFunc, policyRepo *policies.PolicyRepo, agentTags map[string]string) *BridgeService { +func NewBridgeService(ctx context.Context, cancelFunc context.CancelCauseFunc, policyRepo *policies.PolicyRepo, agentTags map[string]string) *BridgeService { return &BridgeService{ bridgeContext: ctx, cancelFunc: cancelFunc, @@ -49,6 +49,6 @@ func (b *BridgeService) RetrieveAgentInfoByPolicyName(policyName string) (*Agent } func (b *BridgeService) NotifyAgentDisconnection(ctx context.Context, err error) { + b.cancelFunc(err) ctx.Done() - b.cancelFunc() } diff --git a/agent/rpc_from.go b/agent/rpc_from.go index e72c312a8..ed2176e75 100644 --- a/agent/rpc_from.go +++ b/agent/rpc_from.go @@ -11,7 +11,6 @@ import ( "github.com/eclipse/paho.mqtt.golang" "github.com/orb-community/orb/fleet" "go.uber.org/zap" - "time" ) func (a *orbAgent) handleGroupMembership(rpc fleet.GroupMembershipRPCPayload) { @@ -72,12 +71,13 @@ func (a *orbAgent) handleAgentPolicies(ctx context.Context, rpc []fleet.AgentPol } // heart beat with new policy status after application - a.sendSingleHeartbeat(ctx, time.Now(), fleet.Online) + if a.heartbeatCtx == nil { + a.logonWithHeartbeat() + } } -func (a *orbAgent) handleGroupRPCFromCore(client mqtt.Client, message mqtt.Message) { +func (a *orbAgent) handleGroupRPCFromCore(_ mqtt.Client, message mqtt.Message) { handleMsgCtx, handleMsgCtxCancelFunc := a.extendContext("handleGroupRPCFromCore") - a.rpcFromCancelFunc = handleMsgCtxCancelFunc go func(ctx context.Context, cancelFunc context.CancelFunc) { defer cancelFunc() a.logger.Debug("Group RPC message from core", zap.String("topic", message.Topic()), zap.ByteString("payload", message.Payload())) diff --git a/cmd/agent/main.go b/cmd/agent/main.go index 3a153123f..ff0425b41 100644 --- a/cmd/agent/main.go +++ b/cmd/agent/main.go @@ -14,7 +14,6 @@ import ( "syscall" "github.com/orb-community/orb/agent" - "github.com/orb-community/orb/agent/backend/diode" "github.com/orb-community/orb/agent/backend/pktvisor" "github.com/orb-community/orb/agent/config" "github.com/orb-community/orb/buildinfo" @@ -36,7 +35,6 @@ var ( func init() { pktvisor.Register() otel.Register() - diode.Register() } func Version(_ *cobra.Command, _ []string) { @@ -152,7 +150,6 @@ func mergeOrError(path string) { v.SetDefault("orb.cloud.mqtt.channel_id", "") v.SetDefault("orb.db.file", "./orb-agent.db") v.SetDefault("orb.tls.verify", true) - v.SetDefault("orb.otel.enable", true) v.SetDefault("orb.otel.host", "localhost") v.SetDefault("orb.otel.port", 0) v.SetDefault("orb.debug.enable", Debug) diff --git a/cmd/fleet/main.go b/cmd/fleet/main.go index b491c8dde..9cec1d2a0 100644 --- a/cmd/fleet/main.go +++ b/cmd/fleet/main.go @@ -30,7 +30,6 @@ import ( "github.com/orb-community/orb/fleet" fleetgrpc "github.com/orb-community/orb/fleet/api/grpc" fleethttp "github.com/orb-community/orb/fleet/api/http" - "github.com/orb-community/orb/fleet/backend/diode" "github.com/orb-community/orb/fleet/backend/pktvisor" "github.com/orb-community/orb/fleet/pb" "github.com/orb-community/orb/fleet/postgres" @@ -241,7 +240,6 @@ func newFleetService(auth mainflux.AuthServiceClient, db *sqlx.DB, logger *zap.L mfsdk := mfsdk.NewSDK(config) pktvisor.Register(auth, agentRepo) - diode.Register(auth, agentRepo) otel.Register(auth, agentRepo) svc := fleet.NewFleetService(logger, auth, agentRepo, agentGroupRepo, agentComms, mfsdk, aDone) diff --git a/cmd/migrate/main.go b/cmd/migrate/main.go index 87d31c481..5e1cc1128 100644 --- a/cmd/migrate/main.go +++ b/cmd/migrate/main.go @@ -54,7 +54,7 @@ func main() { usersDbCfg := config.LoadPostgresConfig(fmt.Sprintf("%s_%s", envPrefix, postgres.DbUsers), postgres.DbUsers) thingsDbCfg := config.LoadPostgresConfig(fmt.Sprintf("%s_%s", envPrefix, postgres.DbThings), postgres.DbThings) sinksDbCfg := config.LoadPostgresConfig(fmt.Sprintf("%s_%s", envPrefix, postgres.DBSinks), postgres.DBSinks) - //sinksEncryptionKey := config.LoadEncryptionKey(fmt.Sprintf("%s_%s", envPrefix, postgres.DBSinks)) + sinksEncryptionKey := config.LoadEncryptionKey(fmt.Sprintf("%s_%s", envPrefix, postgres.DBSinks)) dbs := make(map[string]postgres.Database) @@ -69,8 +69,8 @@ func main() { dbs, // When generating a new migration image // Comment the previous and keep only the necessary steps to migrate up/down - //migration.NewM1KetoPolicies(log, dbs), - //migration.NewM2SinksCredentials(log, sinksDB, sinksEncryptionKey), + migration.NewM1KetoPolicies(log, dbs), + migration.NewM2SinksCredentials(log, sinksDB, sinksEncryptionKey), migration.NewM3SinksOpenTelemetry(log, sinksDB), ) diff --git a/docker/Dockerfile b/docker/Dockerfile index 2a59fa816..905d9f6bc 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21-alpine AS builder +FROM golang:1.22-alpine AS builder ARG SVC ARG GOARCH ARG GOARM diff --git a/docker/Dockerfile.debug b/docker/Dockerfile.debug index 04a498ac0..29b2a68a7 100644 --- a/docker/Dockerfile.debug +++ b/docker/Dockerfile.debug @@ -1,4 +1,4 @@ -FROM golang:1.21-alpine AS builder +FROM golang:1.22-alpine AS builder ARG SVC ARG GOARCH ARG GOARM diff --git a/fleet/api/http/transport.go b/fleet/api/http/transport.go index 265f680bb..f71f7244a 100644 --- a/fleet/api/http/transport.go +++ b/fleet/api/http/transport.go @@ -283,7 +283,6 @@ func encodeError(_ context.Context, err error, w http.ResponseWriter) { case errors.Contains(errorVal, errors.ErrUnsupportedContentType): w.WriteHeader(http.StatusUnsupportedMediaType) - case errors.Contains(errorVal, errors.ErrMalformedEntity): w.WriteHeader(http.StatusBadRequest) case errors.Contains(errorVal, errors.ErrNotFound): diff --git a/fleet/backend/diode/diode.go b/fleet/backend/diode/diode.go deleted file mode 100644 index 440f0594d..000000000 --- a/fleet/backend/diode/diode.go +++ /dev/null @@ -1,95 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -package diode - -import ( - "context" - "encoding/json" - - kithttp "github.com/go-kit/kit/transport/http" - "github.com/go-zoo/bone" - "github.com/mainflux/mainflux" - "github.com/opentracing/opentracing-go" - "github.com/orb-community/orb/fleet" - "github.com/orb-community/orb/fleet/backend" - "github.com/orb-community/orb/pkg/types" -) - -var _ backend.Backend = (*diodeBackend)(nil) - -const ( - inputsJson = `{"pcap":{"1.0":{"filter":{"bpf":{"type":"string","input":"text","label":"Filter Expression","description":"tcpdump compatible filter expression for limiting the traffic examined (with BPF). See https://www.tcpdump.org/manpages/tcpdump.1.html","props":{"example":"udp port 53 and host 127.0.0.1"}}},"config":{"iface":{"type":"string","input":"text","label":"Network Interface","description":"The network interface to capture traffic from","props":{"required":true,"example":"eth0"}},"host_spec":{"type":"string","input":"text","label":"Host Specification","description":"Subnets (comma separated) which should be considered belonging to this host, in CIDR form. Used for ingress/egress determination, defaults to host attached to the network interface.","props":{"advanced":true,"example":"10.0.1.0/24,10.0.2.1/32,2001:db8::/64"}},"pcap_source":{"type":"string","input":"select","label":"Packet Capture Engine","description":"Packet capture engine to use. Defaults to best for platform.","props":{"advanced":true,"example":"libpcap","options":{"libpcap":"libpcap","af_packet (linux only)":"af_packet"}}}}}},"dnstap":{"1.0":{"filter":{},"config":{"socket":{"type":"string","input":"text","label":"Unix domain socket path","description":"Full path on local file system to unix domain socket used by the DNS server for dnstap stream","props":{"example":"/var/dns/dnstap.sock"}},"tcp":{"type":"string","input":"text","label":"IP:port","description":"IP address and port to listen on for dnstap over TCP","props":{"example":"127.0.0.1:1234"}}}}}}` - handlersJson = `{"dns":{"1.0":{"filter":{"exclude_noerror":{"label":"Exclude NOERROR","type":"bool","input":"checkbox","description":"Filter out all NOERROR responses"},"only_rcode":{"label":"Include Only RCODE","type":"number","input":"select","description":"Filter out any queries which are not the given RCODE","props":{"allow_custom_options":true,"options":{"NOERROR":0,"SERVFAIL":2,"NXDOMAIN":3,"REFUSED":5}}},"only_qname_suffix":{"label":"Include Only QName With Suffix","type":"string[]","input":"text","description":"Filter out any queries whose QName does not end in a suffix on the list","props":{"example":".foo.com,.example.com"}}},"config":{},"metrics":{},"metric_groups":{"cardinality":{"label":"Cardinality","description":"Metrics counting the unique number of items in the stream","metrics":[]},"dns_transactions":{"label":"DNS Transactions (Query\/Reply pairs)","description":"Metrics based on tracking queries and their associated replies","metrics":[]},"top_dns_wire":{"label":"Top N Metrics (Various)","description":"Top N metrics across various details from the DNS wire packets","metrics":[]},"top_qnames":{"label":"Top N QNames (All)","description":"Top QNames across all DNS queries in stream","metrics":[]},"top_qnames_by_rcode":{"label":"Top N QNames (Failing RCodes) ","description":"Top QNames across failing result codes","metrics":[]}}}},"net":{"1.0":{"filter":{},"config":{},"metrics":{},"metric_groups":{"ip_cardinality":{"label":"IP Address Cardinality","description":"Unique IP addresses seen in the stream","metrics":[]},"top_geo":{"label":"Top Geo","description":"Top Geo IP and ASN in the stream","metrics":[]},"top_ips":{"label":"Top IPs","description":"Top IP addresses in the stream","metrics":[]}}}},"dhcp":{"1.0":{"filter":{},"config":{},"metrics":{},"metric_groups":{}}}}` -) - -type diodeBackend struct { - auth mainflux.AuthServiceClient - agentRepo fleet.AgentRepository - Backend string - Description string -} - -type BackendTaps struct { - Name string - InputType string - ConfigPredefined []string - TotalAgents uint64 -} - -func (p diodeBackend) Metadata() interface{} { - return struct { - Backend string `json:"backend"` - Description string `json:"description"` - SchemaVersion string `json:"schema_version"` - }{ - Backend: p.Backend, - Description: p.Description, - SchemaVersion: CurrentSchemaVersion, - } -} - -func (p diodeBackend) MakeHandler(tracer opentracing.Tracer, opts []kithttp.ServerOption, r *bone.Mux) { - MakeDiodeHandler(tracer, p, opts, r) -} - -// TODO remove handlers -func (p diodeBackend) handlers() (_ types.Metadata, err error) { - var handlers types.Metadata - err = json.Unmarshal([]byte(handlersJson), &handlers) - if err != nil { - return nil, err - } - return handlers, nil -} - -// TODO remove inputs -func (p diodeBackend) inputs() (_ types.Metadata, err error) { - var handlers types.Metadata - err = json.Unmarshal([]byte(inputsJson), &handlers) - if err != nil { - return nil, err - } - return handlers, nil -} - -// TODO remove taps -func (p diodeBackend) taps(ctx context.Context, ownerID string) ([]types.Metadata, error) { - - taps, err := p.agentRepo.RetrieveAgentMetadataByOwner(ctx, ownerID) - if err != nil { - return nil, err - } - return taps, nil -} - -func Register(auth mainflux.AuthServiceClient, agentRepo fleet.AgentRepository) bool { - backend.Register("diode", &diodeBackend{ - Backend: "diode", - Description: "diode network automation agent from netboxlabs.com", - auth: auth, - agentRepo: agentRepo, - }) - return true -} diff --git a/fleet/backend/diode/endpoint.go b/fleet/backend/diode/endpoint.go deleted file mode 100644 index 4ace39c05..000000000 --- a/fleet/backend/diode/endpoint.go +++ /dev/null @@ -1,175 +0,0 @@ -package diode - -import ( - "context" - "fmt" - - "github.com/go-kit/kit/endpoint" - "github.com/mainflux/mainflux" - "github.com/orb-community/orb/pkg/errors" - "github.com/orb-community/orb/pkg/types" -) - -func viewAgentBackendHandlerEndpoint(dio diodeBackend) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(viewResourceReq) - if err := req.validate(); err != nil { - return nil, err - } - _, err = dio.auth.Identify(ctx, &mainflux.Token{Value: req.token}) - if err != nil { - return "", errors.Wrap(errors.ErrUnauthorizedAccess, err) - } - - bk, err := dio.handlers() - if err != nil { - return nil, err - } - return bk, nil - } -} - -func viewAgentBackendInputEndpoint(dio diodeBackend) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(viewResourceReq) - if err := req.validate(); err != nil { - return nil, err - } - - _, err = dio.auth.Identify(ctx, &mainflux.Token{Value: req.token}) - if err != nil { - return "", errors.Wrap(errors.ErrUnauthorizedAccess, err) - } - - bk, err := dio.inputs() - if err != nil { - return nil, err - } - return bk, nil - } -} - -func viewAgentBackendTapsEndpoint(dio diodeBackend) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(viewResourceReq) - if err := req.validate(); err != nil { - return nil, err - } - r, err := dio.auth.Identify(ctx, &mainflux.Token{Value: req.token}) - if err != nil { - return "", errors.Wrap(errors.ErrUnauthorizedAccess, err) - } - - metadataList, err := dio.taps(ctx, r.Id) - if err != nil { - return nil, err - } - - var list []types.Metadata - for _, mt := range metadataList { - extractTaps(mt, &list) - } - - res, err := toBackendTaps(list) - if err != nil { - return nil, err - } - tapsGroup := groupTaps(res) - - var tpRes []agentBackendTapsRes - for _, v := range tapsGroup { - tpRes = append(tpRes, agentBackendTapsRes{ - Name: v.Name, - InputType: v.InputType, - ConfigPredefined: v.ConfigPredefined, - TotalAgents: totalAgents{Total: v.TotalAgents}, - }) - } - return tpRes, nil - } -} - -// Used to get the taps from policy json - CHECK IF STILL NEEDED -func extractTaps(mt map[string]interface{}, list *[]types.Metadata) { - for k, v := range mt { - if k == "taps" { - m, _ := v.(map[string]interface{}) - *list = append(*list, m) - } else { - m, _ := v.(map[string]interface{}) - extractTaps(m, list) - } - } -} - -// Used to cast the map[string]interface for a concrete struct - CHECK IF STILL NEEDED -func toBackendTaps(list []types.Metadata) ([]BackendTaps, error) { - var bkTaps []BackendTaps - for _, tc := range list { - bkTap := BackendTaps{} - var idx int - for k, v := range tc { - bkTap.Name = k - m, ok := v.(map[string]interface{}) - if !ok { - return nil, errors.New("Error to group taps") - } - for k, v := range m { - switch k { - case "config": - m, ok := v.(map[string]interface{}) - if !ok { - return nil, errors.New("Error to group taps") - } - for k, _ := range m { - bkTap.ConfigPredefined = append(bkTap.ConfigPredefined, []string{k}...) - } - case "input_type": - bkTap.InputType = fmt.Sprintf("%v", v) - } - } - idx++ - bkTap.TotalAgents += uint64(idx) - bkTaps = append(bkTaps, bkTap) - } - } - return bkTaps, nil -} - -// Used to aggregate and summarize the taps and return a slice of BackendTaps - CHECK IF STILL NEEDED -func groupTaps(taps []BackendTaps) []BackendTaps { - tapsMap := make(map[string]BackendTaps) - for _, tap := range taps { - key := key(tap.Name, tap.InputType) - if v, ok := tapsMap[key]; ok { - v.ConfigPredefined = append(v.ConfigPredefined, tap.ConfigPredefined...) - v.TotalAgents += 1 - tapsMap[key] = v - } else { - tapsMap[key] = BackendTaps{ - Name: tap.Name, - InputType: tap.InputType, - ConfigPredefined: tap.ConfigPredefined, - TotalAgents: tap.TotalAgents, - } - } - } - var bkTaps []BackendTaps - keys := make(map[string]bool) - for _, v := range tapsMap { - list := []string{} - for _, config := range v.ConfigPredefined { - if _, ok := keys[config]; !ok { - keys[config] = true - list = append(list, config) - } - } - v.ConfigPredefined = list - bkTaps = append(bkTaps, v) - } - return bkTaps -} - -func key(name string, inputType string) string { - return fmt.Sprintf("%s-%s", name, inputType) -} diff --git a/fleet/backend/diode/requests.go b/fleet/backend/diode/requests.go deleted file mode 100644 index 1082eec0f..000000000 --- a/fleet/backend/diode/requests.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Mainflux -// SPDX-License-Identifier: Apache-2.0 - -// Adapted for Orb project, modifications licensed under MPL v. 2.0: -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -package diode - -import ( - "github.com/orb-community/orb/pkg/errors" -) - -type viewResourceReq struct { - token string -} - -func (req viewResourceReq) validate() error { - if req.token == "" { - return errors.ErrUnauthorizedAccess - } - return nil -} diff --git a/fleet/backend/diode/responses.go b/fleet/backend/diode/responses.go deleted file mode 100644 index d7a4cff15..000000000 --- a/fleet/backend/diode/responses.go +++ /dev/null @@ -1,32 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -package diode - -import ( - "net/http" -) - -type totalAgents struct { - Total uint64 `json:"total"` -} - -type agentBackendTapsRes struct { - Name string `json:"name"` - InputType string `json:"input_type"` - ConfigPredefined []string `json:"config_predefined"` - TotalAgents totalAgents `json:"agents"` -} - -func (res agentBackendTapsRes) Code() int { - return http.StatusOK -} - -func (res agentBackendTapsRes) Headers() map[string]string { - return map[string]string{} -} - -func (res agentBackendTapsRes) Empty() bool { - return true -} diff --git a/fleet/backend/diode/transport.go b/fleet/backend/diode/transport.go deleted file mode 100644 index b304fb95c..000000000 --- a/fleet/backend/diode/transport.go +++ /dev/null @@ -1,47 +0,0 @@ -package diode - -import ( - "context" - "net/http" - "strings" - - "github.com/go-zoo/bone" - "github.com/opentracing/opentracing-go" - "github.com/orb-community/orb/pkg/types" - - kitot "github.com/go-kit/kit/tracing/opentracing" - kithttp "github.com/go-kit/kit/transport/http" -) - -func MakeDiodeHandler(tracer opentracing.Tracer, dio diodeBackend, opts []kithttp.ServerOption, r *bone.Mux) { - - r.Get("/agents/backends/diode/handlers", kithttp.NewServer( - kitot.TraceServer(tracer, "view_agent_backend_handler")(viewAgentBackendHandlerEndpoint(dio)), - decodeBackendView, - types.EncodeResponse, - opts...)) - r.Get("/agents/backends/diode/inputs", kithttp.NewServer( - kitot.TraceServer(tracer, "view_agent_backend_input")(viewAgentBackendInputEndpoint(dio)), - decodeBackendView, - types.EncodeResponse, - opts...)) - r.Get("/agents/backends/diode/taps", kithttp.NewServer( - kitot.TraceServer(tracer, "view_agent_backend_taps")(viewAgentBackendTapsEndpoint(dio)), - decodeBackendView, - types.EncodeResponse, - opts...)) -} - -func decodeBackendView(_ context.Context, r *http.Request) (interface{}, error) { - req := viewResourceReq{ - token: parseJwt(r), - } - return req, nil -} - -func parseJwt(r *http.Request) (token string) { - if strings.HasPrefix(r.Header.Get("Authorization"), "Bearer ") { - token = r.Header.Get("Authorization")[7:] - } - return -} diff --git a/fleet/backend/diode/types.go b/fleet/backend/diode/types.go deleted file mode 100644 index 7cbcc30ca..000000000 --- a/fleet/backend/diode/types.go +++ /dev/null @@ -1,3 +0,0 @@ -package diode - -const CurrentSchemaVersion = "1.0" diff --git a/go.mod b/go.mod index a76d79c88..bd4cfcacb 100644 --- a/go.mod +++ b/go.mod @@ -1,34 +1,34 @@ module github.com/orb-community/orb -go 1.21 +go 1.22 require ( - github.com/andybalholm/brotli v1.0.5 - github.com/aws/aws-sdk-go v1.45.26 + github.com/andybalholm/brotli v1.0.6 + github.com/aws/aws-sdk-go v1.49.17 github.com/benbjohnson/immutable v0.4.3 - github.com/eclipse/paho.mqtt.golang v1.4.2 + github.com/eclipse/paho.mqtt.golang v1.4.3 github.com/fatih/structs v1.1.0 github.com/ghodss/yaml v1.0.0 - github.com/go-cmd/cmd v1.4.1 - github.com/go-co-op/gocron v1.9.0 + github.com/go-cmd/cmd v1.4.2 github.com/go-kit/kit v0.13.0 - github.com/go-redis/redis/v8 v8.11.4 + github.com/go-redis/redis/v8 v8.11.5 github.com/go-zoo/bone v1.3.0 - github.com/gofrs/uuid v4.2.0+incompatible + github.com/gofrs/uuid v4.4.0+incompatible github.com/golang/protobuf v1.5.3 github.com/hashicorp/go-version v1.6.0 github.com/jmoiron/sqlx v1.3.4 - github.com/lib/pq v1.10.7 + github.com/lib/pq v1.10.9 github.com/mainflux/mainflux v0.0.0-20220415135135-92d8fb99bf82 + github.com/mattn/go-sqlite3 v1.14.19 github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.91.0 github.com/opentracing/opentracing-go v1.2.0 github.com/ory/dockertest/v3 v3.10.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pkg/profile v1.7.0 - github.com/prometheus/client_golang v1.17.0 - github.com/rubenv/sql-migrate v1.1.1 - github.com/spf13/cobra v1.7.0 - github.com/spf13/viper v1.18.1 + github.com/prometheus/client_golang v1.18.0 + github.com/rubenv/sql-migrate v1.6.1 + github.com/spf13/cobra v1.8.0 + github.com/spf13/viper v1.18.2 github.com/stretchr/testify v1.8.4 github.com/uber/jaeger-client-go v2.30.0+incompatible go.opentelemetry.io/collector/component v0.91.0 @@ -47,29 +47,29 @@ require ( go.uber.org/zap v1.26.0 golang.org/x/exp v0.0.0-20231127185646-65229373498e google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 - google.golang.org/grpc v1.59.0 - google.golang.org/protobuf v1.31.0 + google.golang.org/grpc v1.60.1 + google.golang.org/protobuf v1.32.0 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.26.3 - k8s.io/apimachinery v0.26.3 - modernc.org/sqlite v1.28.0 + k8s.io/api v0.29.1 + k8s.io/apimachinery v0.29.1 ) //These libs are used to allow orb extend opentelemetry features require ( github.com/gogo/protobuf v1.3.2 github.com/google/uuid v1.4.0 - github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/common v0.46.0 // indirect go.opentelemetry.io/collector v0.91.0 // indirect go.opentelemetry.io/collector/pdata v1.0.0 go.opentelemetry.io/otel/metric v1.21.0 // indirect go.opentelemetry.io/otel/trace v1.21.0 google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f // indirect - k8s.io/client-go v0.26.3 + k8s.io/client-go v0.29.0 ) require ( + dario.cat/mergo v1.0.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect @@ -77,17 +77,16 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/containerd/continuity v0.3.0 // indirect + github.com/containerd/continuity v0.4.3 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/docker/cli v24.0.2+incompatible // indirect - github.com/docker/docker v24.0.7+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/cli v25.0.1+incompatible // indirect + github.com/docker/docker v27.1.2+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect github.com/felixge/fgprof v0.9.3 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/fxamacker/cbor/v2 v2.4.0 // indirect + github.com/fxamacker/cbor/v2 v2.5.0 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect @@ -96,49 +95,42 @@ require ( github.com/gobwas/glob v0.2.3 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gnostic-models v0.6.8 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/gorilla/websocket v1.5.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect - github.com/imdario/mergo v0.3.15 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/klauspost/compress v1.17.4 // indirect github.com/knadh/koanf v1.5.0 // indirect github.com/knadh/koanf/v2 v2.0.1 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mainflux/senml v1.5.0 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mattn/go-sqlite3 v1.14.19 // indirect - github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mostynb/go-grpc-compression v1.2.2 // indirect - github.com/nats-io/nats.go v1.31.0 // indirect - github.com/nats-io/nkeys v0.4.6 // indirect + github.com/nats-io/nats.go v1.32.0 // indirect + github.com/nats-io/nkeys v0.4.7 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/oklog/ulid/v2 v2.0.2 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.91.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc5 // indirect - github.com/opencontainers/runc v1.1.5 // indirect + github.com/opencontainers/runc v1.1.12 // indirect github.com/ory/keto/proto/ory/keto/acl/v1alpha1 v0.0.0-20210616104402-80e043246cf9 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/procfs v0.11.1 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/robfig/cron/v3 v3.0.1 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect @@ -164,50 +156,41 @@ require ( go.opentelemetry.io/otel v1.21.0 // indirect go.opentelemetry.io/otel/sdk v1.21.0 // indirect go.uber.org/atomic v1.11.0 // indirect - golang.org/x/crypto v0.16.0 // indirect + golang.org/x/crypto v0.18.0 // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/oauth2 v0.15.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.16.0 // indirect - google.golang.org/appengine v1.6.7 // indirect + golang.org/x/tools v0.17.0 // indirect + google.golang.org/appengine v1.6.8 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - k8s.io/klog/v2 v2.100.1 // indirect - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect - lukechampine.com/uint128 v1.2.0 // indirect - modernc.org/cc/v3 v3.40.0 // indirect - modernc.org/ccgo/v3 v3.16.13 // indirect - modernc.org/libc v1.29.0 // indirect - modernc.org/mathutil v1.6.0 // indirect - modernc.org/memory v1.7.2 // indirect - modernc.org/opt v0.1.3 // indirect - modernc.org/strutil v1.1.3 // indirect - modernc.org/token v1.0.1 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) //These libs are used to allow orb extend opentelemetry features require ( github.com/Shopify/sarama v1.37.2 github.com/apache/thrift v0.19.0 // indirect - github.com/eapache/go-resiliency v1.4.0 // indirect + github.com/eapache/go-resiliency v1.5.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect github.com/eapache/queue v1.1.0 // indirect - github.com/emicklei/go-restful/v3 v3.10.1 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/jsonpointer v0.20.2 // indirect + github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/swag v0.22.6 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect - github.com/jaegertracing/jaeger v1.51.0 + github.com/jaegertracing/jaeger v1.53.0 github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect @@ -218,9 +201,8 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.91.0 - github.com/orb-community/diode v0.0.0-20230419222319-4ec19ba89e9f - github.com/pelletier/go-toml/v2 v2.1.0 // indirect - github.com/pierrec/lz4/v4 v4.1.18 // indirect + github.com/pelletier/go-toml/v2 v2.1.1 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rs/cors v1.10.1 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect @@ -229,6 +211,6 @@ require ( go.opentelemetry.io/collector/receiver/otlpreceiver v0.91.0 go.opentelemetry.io/collector/semconv v0.91.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect - k8s.io/kube-openapi v0.0.0-20230303024457-afdc3dddf62d // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect ) diff --git a/go.sum b/go.sum index 7aa4276c9..e8c274bf4 100644 --- a/go.sum +++ b/go.sum @@ -1,58 +1,19 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -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/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -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/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68 h1:aRVqY1p2IJaBGStWMsQMpkAa83cPkCDLl80eOj0Rbz4= cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68/go.mod h1:1a3eRNYX12fs5UABBIXS8HXVvQbX9hRB/RkEBPORpe8= -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/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -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/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -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/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= 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/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= @@ -74,8 +35,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy 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/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= +github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.19.0 h1:sOqkWPzMj7w6XaYbJQG7m4sGqVolaW/0D28Ln7yPzMk= github.com/apache/thrift v0.19.0/go.mod h1:SUALL216IiaOw2Oy+5Vs9lboJ/t9g40C+G07Dc0QC1I= @@ -83,8 +44,8 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aws/aws-sdk-go v1.45.26 h1:PJ2NJNY5N/yeobLYe1Y+xLdavBi67ZI8gvph6ftwVCg= -github.com/aws/aws-sdk-go v1.45.26/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.49.17 h1:Cc+7LgPjKeJkF2SdNo1IkpQ5Dfl9HCZEVw9OP3CPuEI= +github.com/aws/aws-sdk-go v1.49.17/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2/config v1.8.3/go.mod h1:4AEiLtAb8kLs7vgw2ZV3p2VZ1+hBavOc84hqxVNpCyw= github.com/aws/aws-sdk-go-v2/credentials v1.4.3/go.mod h1:FNNC6nQZQUuyhq5aE5c7ata8o9e4ECGmS4lAXC7o1mQ= @@ -102,71 +63,55 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/docker/cli v24.0.2+incompatible h1:QdqR7znue1mtkXIJ+ruQMGQhpw2JzMJLRXp6zpzF6tM= -github.com/docker/cli v24.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbTO1lpcGSkU= +github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/docker v27.1.2+incompatible h1:AhGzR1xaQIy53qCkxARaFluI00WPGtXn0AJuoQsVYTY= +github.com/docker/docker v27.1.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eapache/go-resiliency v1.4.0 h1:3OK9bWpPk5q6pbFAaYSEwD9CLUSHG8bnZuqX2yMt3B0= -github.com/eapache/go-resiliency v1.4.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-resiliency v1.5.0 h1:dRsaR00whmQD+SgVKlq/vCRFNgtEb5yppyeVos3Yce0= +github.com/eapache/go-resiliency v1.5.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4= -github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/eclipse/paho.mqtt.golang v1.4.3 h1:2kwcUGn8seMUfWndX0hGbvH8r7crgcJguQNCyp70xik= +github.com/eclipse/paho.mqtt.golang v1.4.3/go.mod h1:CSYvoAlsMkhYOXh/oKyxa8EcBci6dVkLCbo5tTC1RIE= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -182,26 +127,18 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fxamacker/cbor/v2 v2.2.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= -github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= -github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= +github.com/fxamacker/cbor/v2 v2.5.0 h1:oHsG0V/Q6E/wqTS2O1Cozzsy69nqCiguo5Q1a1ADivE= +github.com/fxamacker/cbor/v2 v2.5.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-cmd/cmd v1.4.1 h1:JUcEIE84v8DSy02XTZpUDeGKExk2oW3DA10hTjbQwmc= -github.com/go-cmd/cmd v1.4.1/go.mod h1:tbBenttXtZU4c5djS1o7PWL5pd2xAr5sIqH1kGdNiRc= -github.com/go-co-op/gocron v1.9.0 h1:+V+DDenw3ryB7B+tK1bAIC5p0ruw4oX9IqAsdRnGIf0= -github.com/go-co-op/gocron v1.9.0/go.mod h1:DbJm9kdgr1sEvWpHCA7dFFs/PGHPMil9/97EXCRPr4k= -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-gorp/gorp/v3 v3.0.2/go.mod h1:BJ3q1ejpV8cVALtcXvXaXyTOlMmJhWDxTmncaR6rwBY= +github.com/go-cmd/cmd v1.4.2 h1:pnX38iIJHh4huzBSqfkAZkfXrVwM/5EccAJmrVqMnbg= +github.com/go-cmd/cmd v1.4.2/go.mod h1:u3hxg/ry+D5kwh8WvUkHLAMe2zQCaXd00t35WfQaOFk= github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -217,70 +154,49 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -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.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 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-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg= -github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= +github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= +github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= +github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/swag v0.22.6 h1:dnqg1XfHXL9aBxSbktBqFR5CxVyVI+7fYWhAf1JOeTw= +github.com/go-openapi/swag v0.22.6/go.mod h1:Gl91UqO+btAM0plGGxHqJcQZ1ZTy6jbmridBTsDy8A0= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= -github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= +github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= +github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/go-zoo/bone v1.3.0 h1:PY6sHq37FnQhj+4ZyqFIzJQHvrrGx0GEc3vTZZC/OsI= github.com/go-zoo/bone v1.3.0/go.mod h1:HI3Lhb7G3UQcAwEhOJ2WyNcsFtQX1WYHa0Hl4OBbhW8= -github.com/gobuffalo/logger v1.0.6 h1:nnZNpxYo0zx+Aj9RfMPBm+x9zAU2OayFh/xrAWi34HU= -github.com/gobuffalo/logger v1.0.6/go.mod h1:J31TBEHR1QLV2683OXTAItYIg8pv2JMHnF/quuAbMjs= -github.com/gobuffalo/packd v1.0.1 h1:U2wXfRr4E9DH8IdsDLlRFwTZTK7hLfq9qT/QHXGVe/0= -github.com/gobuffalo/packd v1.0.1/go.mod h1:PP2POP3p3RXGz7Jh6eYEf93S7vA2za6xM7QT85L4+VY= -github.com/gobuffalo/packr/v2 v2.8.3 h1:xE1yzvnO56cUC0sTpKR3DIbxZgB54AftTFMhB2XEWlY= -github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXsOdiU5KwbKc= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= -github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -290,7 +206,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -298,63 +213,39 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW 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/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/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/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 h1:CqYfpuYIjnlNxM3msdyPRKabhXZWbKjf3Q8BWROFBso= github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.13.0/go.mod h1:ZlVrynguJKcYr54zGaDbaL3fOvKC9m72FhPvA8T35KQ= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= @@ -372,7 +263,6 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l 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-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= @@ -386,17 +276,13 @@ github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-version v1.1.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/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 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/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= @@ -405,21 +291,13 @@ github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKe github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hjson/hjson-go/v4 v4.0.0/go.mod h1:KaYt3bTw3zhBjYqnXkYywcYctk0A2nxeEFTse3rH13E= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -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/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= -github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jaegertracing/jaeger v1.51.0 h1:wS1vW+fG91JGgpX193nLdLOrU9QZRvpEGPm9UuMgL2U= -github.com/jaegertracing/jaeger v1.51.0/go.mod h1:tEPEgDuAks6rbFURoZAoIrPJmUz/6TSvnh/0lkH8uRs= +github.com/jaegertracing/jaeger v1.53.0 h1:C/7UgUTBpQFRS5+cOb6kYIHVqjWNw8p5PAiSKfZbP2I= +github.com/jaegertracing/jaeger v1.53.0/go.mod h1:bs6/Yr0miegvoyKhWdCzFmMnAcER6Ih6IkZ65AzVYfk= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -447,15 +325,8 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 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/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= -github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= @@ -466,12 +337,9 @@ github.com/knadh/koanf/v2 v2.0.1 h1:1dYGITt1I23x8cfx8ZnldtezdyaZtfAuRtIFOiRzK7g= github.com/knadh/koanf/v2 v2.0.1/go.mod h1:ZeiIlIDXTE7w1lMT6UVcNiRAS2/rCeLn/GdLNvY1Dus= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kortschak/utter v1.0.1/go.mod h1:vSmSjbyrlKjjsL71193LmzBOKgwePk9DH6uFaWHIInc= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -479,10 +347,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= @@ -491,12 +357,6 @@ github.com/mainflux/mainflux v0.0.0-20220415135135-92d8fb99bf82 h1:UWQLBZ7ychamG github.com/mainflux/mainflux v0.0.0-20220415135135-92d8fb99bf82/go.mod h1:YPGCoouBMT7gP6u4Hnj7vafJqRzT5yiuKtBNMC/DUIE= github.com/mainflux/senml v1.5.0 h1:GAd1y1eMohfa6sVYcr2iQfVfkkh9l/q7B1TWF5L68xs= github.com/mainflux/senml v1.5.0/go.mod h1:SMX76mM5yenjLVjZOM27+njCGkP+AA64O46nRQiBRlE= -github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= -github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= -github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY= -github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI= -github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= 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/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -505,45 +365,31 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd 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.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI= github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4= 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.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 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/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 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.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 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/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -555,37 +401,28 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= 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/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E= -github.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8= -github.com/nats-io/nkeys v0.4.6 h1:IzVe95ru2CT6ta874rt9saQRkWfe2nFj1NtvYSLqMzY= -github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= +github.com/nats-io/nats.go v1.32.0 h1:Bx9BZS+aXYlxW08k8Gd3yR2s73pV5XSoAQUyp1Kwvp0= +github.com/nats-io/nats.go v1.32.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= +github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= +github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/npillmayer/nestext v0.1.3/go.mod h1:h2lrijH8jpicr25dFY+oAJLyzlya6jhnuG+zWp9L0Uk= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid/v2 v2.0.2 h1:r4fFzBm+bv0wNKNh5eXTwU7i85y5x+uwkxCUTNVQqLc= github.com/oklog/ulid/v2 v2.0.2/go.mod h1:mtBL0Qe/0HAx6/a4Z30qxVIAL1eQDweXq5lxOEiwQ68= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -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.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.4.0 h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs= -github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys= -github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= +github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.91.0 h1:8nzprvG2+4BK6C5wFSgZruZpoPiGKc1kRO2rp33tpTo= github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.91.0/go.mod h1:Kw1ZyEtVfeOTaBeNnJ4tWFw3E5TtqGwwpNDjMqT4Zp4= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0 h1:I3MFZXcQdnATObbeKseHLEWOWMFt1jHhHCbeunBw3mE= @@ -600,14 +437,10 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= -github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= -github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= +github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/orb-community/diode v0.0.0-20230419222319-4ec19ba89e9f h1:69y3FTEsmMS5EUUzkDIp/atM3AEZpQwRz4dUif/4Gbk= -github.com/orb-community/diode v0.0.0-20230419222319-4ec19ba89e9f/go.mod h1:QrGOf+olmuV2fkA2zB8xU62b8xd7F+9lonHZo0B+Eak= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= github.com/ory/keto/proto/ory/keto/acl/v1alpha1 v0.0.0-20210616104402-80e043246cf9 h1:gP86NkMkUlqMOTjFQ8lt8T1HbHtCJGGeeeh/6c+nla0= @@ -618,34 +451,30 @@ github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaR github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= +github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/poy/onpar v0.0.0-20190519213022-ee068f8ea4d1/go.mod h1:nSbFQvMj97ZyhFRSJYtut+msi4sOY6zJDGCdSc+/rZU= github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY= github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= -github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -655,33 +484,26 @@ github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= -github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= +github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= -github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rhnvrm/simples3 v0.6.1/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA= -github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= -github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rubenv/sql-migrate v1.1.1 h1:haR5Hn8hbW9/SpAICrXoZqXnywS7Q5WijwkQENPeNWY= -github.com/rubenv/sql-migrate v1.1.1/go.mod h1:/7TZymwxN8VWumcIxw1jjHEcR1djpdkMHQPT4FWdnbQ= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rubenv/sql-migrate v1.6.1 h1:bo6/sjsan9HaXAsNxYP/jCEDUGibHp8JmOBw7NTGRos= +github.com/rubenv/sql-migrate v1.6.1/go.mod h1:tPzespupJS0jacLfhbwto/UjSX+8h2FdWB7ar+QlHa0= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -691,34 +513,23 @@ github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgY github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 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/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= 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/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.18.1 h1:rmuU42rScKWlhhJDyXZRKJQHXFX02chSVW1IvkPGiVM= -github.com/spf13/viper v1.18.1/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= 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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -728,24 +539,18 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= @@ -761,27 +566,13 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -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/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -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/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/collector v0.91.0 h1:C7sGUJDJ5nwm+CkWpAaVP3lNsuYpwSRbkmLncFjkmO8= @@ -849,8 +640,8 @@ go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= @@ -858,380 +649,160 @@ go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= 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-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -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/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 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= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 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/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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-20181023162649-9b4f9f5ad519/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-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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-20190923162816-aa69164e4478/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= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -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= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= -golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-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-20181026203630-95b1ffbd15a5/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= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/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-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/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-20191115151921-52ab43148777/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-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/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= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/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-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= 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/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.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.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -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-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= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= -golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -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.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/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -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/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= 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= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -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= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -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/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210503173045-b96a97608f20/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f h1:Vn+VyHU5guc9KjB5KrjI2q0wCOWEOIh0OEsleqakHJg= @@ -1240,29 +811,17 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1: google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= 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= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= +google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1271,25 +830,19 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 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-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/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -1305,66 +858,29 @@ 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/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -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.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU= -k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE= -k8s.io/apimachinery v0.26.3 h1:dQx6PNETJ7nODU3XPtrwkfuubs6w7sX0M8n61zHIV/k= -k8s.io/apimachinery v0.26.3/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= -k8s.io/client-go v0.26.3 h1:k1UY+KXfkxV2ScEL3gilKcF7761xkYsSD6BC9szIu8s= -k8s.io/client-go v0.26.3/go.mod h1:ZPNu9lm8/dbRIPAgteN30RSXea6vrCpFvq+MateTUuQ= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230303024457-afdc3dddf62d h1:VcFq5n7wCJB2FQMCIHfC+f+jNcGgNMar1uKd6rVlifU= -k8s.io/kube-openapi v0.0.0-20230303024457-afdc3dddf62d/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= -modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v1.29.0 h1:tTFRFq69YKCF2QyGNuRUQxKBm1uZZLubf6Cjh/pVHXs= -modernc.org/libc v1.29.0/go.mod h1:DaG/4Q3LRRdqpiLyP0C2m1B8ZMGkQ+cCgOIjEtQlYhQ= -modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= -modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= -modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= -modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= -modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= -modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= -modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= -modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c= -modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= -modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= -modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= -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= +k8s.io/api v0.29.1 h1:DAjwWX/9YT7NQD4INu49ROJuZAAAP/Ijki48GUPzxqw= +k8s.io/api v0.29.1/go.mod h1:7Kl10vBRUXhnQQI8YR/R327zXC8eJ7887/+Ybta+RoQ= +k8s.io/apimachinery v0.29.1 h1:KY4/E6km/wLBguvCZv8cKTeOwwOBqFNjwJIdMkMbbRc= +k8s.io/apimachinery v0.29.1/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= +k8s.io/client-go v0.29.0 h1:KmlDtFcrdUzOYrBhXHgKw5ycWzc3ryPX5mQe0SkG3y8= +k8s.io/client-go v0.29.0/go.mod h1:yLkXH4HKMAywcrD82KMSmfYg2DlE8mepPR4JGSo5n38= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.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= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/maestro/config/authentication_builder.go b/maestro/config/authentication_builder.go index 6555193a1..bbef54884 100644 --- a/maestro/config/authentication_builder.go +++ b/maestro/config/authentication_builder.go @@ -4,6 +4,7 @@ import ( "github.com/orb-community/orb/maestro/password" "github.com/orb-community/orb/pkg/types" "github.com/orb-community/orb/sinks/authentication_type/basicauth" + "github.com/orb-community/orb/sinks/authentication_type/bearertokenauth" ) const AuthenticationKey = "authentication" @@ -20,7 +21,12 @@ func GetAuthService(authType string, service password.EncryptionService) AuthBui return &BasicAuthBuilder{ encryptionService: service, } + case bearertokenauth.AuthType: + return &BearerTokenAuthBuilder{ + encryptionService: service, + } } + return nil } @@ -65,3 +71,50 @@ func (b *BasicAuthBuilder) EncodeAuth(config types.Metadata) (types.Metadata, er config[AuthenticationKey] = authcfg return config, nil } + +type BearerTokenAuthBuilder struct { + encryptionService password.EncryptionService +} + +func (b *BearerTokenAuthBuilder) GetExtensionsFromMetadata(c types.Metadata) (Extensions, string) { + authcfg := c.GetSubMetadata(AuthenticationKey) + scheme := authcfg["scheme"].(string) + token := authcfg["token"].(string) + + return Extensions{ + BearerAuth: &BearerTokenAuthExtension{ + Scheme: scheme, + Token: token, + }, + }, "bearertokenauth/withscheme" +} + +func (b *BearerTokenAuthBuilder) DecodeAuth(config types.Metadata) (types.Metadata, error) { + authCfg := config.GetSubMetadata(AuthenticationKey) + token := authCfg["token"].(string) + + decodedToken, err := b.encryptionService.DecodePassword(token) + if err != nil { + return nil, err + } + + authCfg["token"] = decodedToken + config[AuthenticationKey] = authCfg + + return config, nil +} + +func (b *BearerTokenAuthBuilder) EncodeAuth(config types.Metadata) (types.Metadata, error) { + authcfg := config.GetSubMetadata(AuthenticationKey) + token := authcfg["token"].(string) + + encodedToken, err := b.encryptionService.EncodePassword(token) + if err != nil { + return nil, err + } + + authcfg["token"] = encodedToken + config[AuthenticationKey] = authcfg + + return config, nil +} diff --git a/maestro/config/config_builder_test.go b/maestro/config/config_builder_test.go index 8981220a6..0c33732a0 100644 --- a/maestro/config/config_builder_test.go +++ b/maestro/config/config_builder_test.go @@ -3,10 +3,12 @@ package config import ( "context" "fmt" + "testing" + + "go.uber.org/zap" + "github.com/orb-community/orb/maestro/password" "github.com/orb-community/orb/pkg/types" - "go.uber.org/zap" - "testing" ) func TestReturnConfigYamlFromSink(t *testing.T) { @@ -97,6 +99,30 @@ func TestReturnConfigYamlFromSink(t *testing.T) { want: `---\nreceivers:\n kafka:\n brokers:\n - kafka:9092\n topic: otlp_metrics-sink-id-22\n protocol_version: 2.0.0\nextensions:\n pprof:\n endpoint: 0.0.0.0:1888\n basicauth/exporter:\n client_auth:\n username: otlp-user\n password: dbpass\nexporters:\n otlphttp:\n endpoint: https://acme.com/otlphttp/push\n auth:\n authenticator: basicauth/exporter\nservice:\n extensions:\n - pprof\n - basicauth/exporter\n pipelines:\n metrics:\n receivers:\n - kafka\n exporters:\n - otlphttp\n`, wantErr: false, }, + { + name: "otlp, token auth", + args: args{ + in0: context.Background(), + kafkaUrlConfig: "kafka:9092", + sink: &DeploymentRequest{ + SinkID: "sink-id-22", + OwnerID: "22", + Backend: "otlphttp", + Config: types.Metadata{ + "exporter": types.Metadata{ + "endpoint": "https://acme.com/otlphttp/push", + }, + "authentication": types.Metadata{ + "type": "bearertokenauth", + "scheme": "Api-Token", + "token": "abcdefg", + }, + }, + }, + }, + want: `---\nreceivers:\n kafka:\n brokers:\n - kafka:9092\n topic: otlp_metrics-sink-id-22\n protocol_version: 2.0.0\nextensions:\n pprof:\n endpoint: 0.0.0.0:1888\n bearertokenauth/withscheme:\n scheme: Api-Token\n token: abcdefg\nexporters:\n otlphttp:\n endpoint: https://acme.com/otlphttp/push\n auth:\n authenticator: bearertokenauth/withscheme\nservice:\n extensions:\n - pprof\n - bearertokenauth/withscheme\n pipelines:\n metrics:\n receivers:\n - kafka\n exporters:\n - otlphttp\n`, + wantErr: false, + }, } for _, tt := range tests { logger := zap.NewNop() diff --git a/maestro/config/types.go b/maestro/config/types.go index 637abb2c2..118098bf6 100644 --- a/maestro/config/types.go +++ b/maestro/config/types.go @@ -2,8 +2,9 @@ package config import ( "database/sql/driver" - "github.com/orb-community/orb/pkg/types" "time" + + "github.com/orb-community/orb/pkg/types" ) type SinkData struct { @@ -82,8 +83,8 @@ type Extensions struct { PProf *PProfExtension `json:"pprof,omitempty" yaml:"pprof,omitempty" :"p_prof"` ZPages *ZPagesExtension `json:"zpages,omitempty" yaml:"zpages,omitempty" :"z_pages"` // Exporters Authentication - BasicAuth *BasicAuthenticationExtension `json:"basicauth/exporter,omitempty" yaml:"basicauth/exporter,omitempty" :"basic_auth"` - //BearerAuth *BearerAuthExtension `json:"bearerauth/exporter,omitempty" yaml:"bearerauth/exporter,omitempty" :"bearer_auth"` + BasicAuth *BasicAuthenticationExtension `json:"basicauth/exporter,omitempty" yaml:"basicauth/exporter,omitempty" :"basic_auth"` + BearerAuth *BearerTokenAuthExtension `json:"bearertokenauth/withscheme,omitempty" yaml:"bearertokenauth/withscheme,omitempty"` } type HealthCheckExtension struct { @@ -115,10 +116,9 @@ type BasicAuthenticationExtension struct { ClientAuth *ClientAuth `json:"client_auth" yaml:"client_auth"` } -type BearerAuthExtension struct { - BearerAuth *struct { - Token string `json:"token" yaml:"token"` - } `json:"client_auth" yaml:"client_auth"` +type BearerTokenAuthExtension struct { + Scheme string `json:"scheme" yaml:"scheme"` + Token string `json:"token" yaml:"token"` } type Exporters struct { diff --git a/maestro/kubecontrol/kubecontrol.go b/maestro/kubecontrol/kubecontrol.go index 0aa7004ad..3db5751c9 100644 --- a/maestro/kubecontrol/kubecontrol.go +++ b/maestro/kubecontrol/kubecontrol.go @@ -96,7 +96,7 @@ func (svc *deployService) collectorDeploy(ctx context.Context, operation, ownerI } // delete temporary file - os.Remove("/tmp/otel-collector-"+sinkId+".json") + os.Remove("/tmp/otel-collector-" + sinkId + ".json") // TODO this will be retrieved once we move to K8s SDK collectorName := fmt.Sprintf("otel-%s", sinkId) diff --git a/maestro/postgres/init.go b/maestro/postgres/init.go index 83077a742..527d1acf0 100644 --- a/maestro/postgres/init.go +++ b/maestro/postgres/init.go @@ -32,7 +32,7 @@ func migrateDB(db *sqlx.DB) error { Migrations: []*migrate.Migration{ { Id: "1", - Up: []string{ + Up: []string{ `CREATE TABLE IF NOT EXISTS deployments ( id UUID NOT NULL DEFAULT gen_random_uuid(), owner_id VARCHAR(255) NOT NULL, diff --git a/maestro/redis/consumer/sinker.go b/maestro/redis/consumer/sinker.go index de431d1d0..d4533d8e2 100644 --- a/maestro/redis/consumer/sinker.go +++ b/maestro/redis/consumer/sinker.go @@ -24,7 +24,7 @@ type sinkerActivityListenerService struct { } const ( - idleStream = "orb.sink_idle" + idleStream = "orb.sink_idle" activityStream = "orb.sink_activity" ) diff --git a/pkg/errors/types.go b/pkg/errors/types.go index f09a283c4..d9c214d27 100644 --- a/pkg/errors/types.go +++ b/pkg/errors/types.go @@ -36,29 +36,44 @@ var ( // ErrExporterFieldNotFound indicates that exporter field was not found ErrExporterFieldNotFound = New("malformed entity specification. exporter field is expected on configuration field") + // ErrEndpointNotFound indicates that endpoint field was not found on exporter field for otlp backend + ErrEndpointNotFound = New("malformed entity specification. endpoint field is expected on exporter field") + + // ErrInvalidEndpoint indicates that endpoint field is not valid + ErrInvalidEndpoint = New("malformed entity specification. endpoint field is invalid") + // ErrAuthFieldNotFound indicates that authentication field was not found on configuration field ErrAuthFieldNotFound = New("malformed entity specification. authentication fields are expected on configuration field") // ErrAuthTypeNotFound indicates that authentication type field was not found on the authentication field ErrAuthTypeNotFound = New("malformed entity specification: authentication type field is expected on configuration field") - - // ErrInvalidAuthType indicates invalid authentication type - ErrInvalidAuthType = New("malformed entity specification. type key on authentication field is invalid") - // ErrPasswordNotFound indicates that password key was not found - ErrPasswordNotFound = New("malformed entity specification. password key is expected on authentication field") + // ErrAuthInvalidType indicates invalid authentication type + ErrAuthInvalidType = New("malformed entity specification. type key on authentication field is invalid") - // ErrEndPointNotFound indicates that endpoint field was not found on exporter field for otlp backend - ErrEndpointNotFound = New("malformed entity specification. endpoint field is expected on exporter field") + // ErrAuthUsernameNotFound indicates that username key was not found + ErrAuthUsernameNotFound = New("malformed entity specification. username key is expected on authentication field") - // ErrInvalidEndpoint indicates that endpoint field is not valid - ErrInvalidEndpoint = New("malformed entity specification. endpoint field is invalid") + // ErrAuthPasswordNotFound indicates that password key was not found + ErrAuthPasswordNotFound = New("malformed entity specification. password key is expected on authentication field") + + // ErrAuthSchemeNotFound indicates that scheme key was not found + ErrAuthSchemeNotFound = New("malformed entity specification. scheme key is expected on authentication field") + + // ErrAuthTokenNotFound indicates that token key was not found + ErrAuthTokenNotFound = New("malformed entity specification. token key is expected on authentication field") + + // ErrAuthInvalidPasswordType indicates invalid password key on authentication field + ErrAuthInvalidPasswordType = New("malformed entity specification. password key on authentication field is invalid") + + // ErrAuthInvalidSchemeType indicates invalid scheme key on authentication field + ErrAuthInvalidSchemeType = New("malformed entity specification. scheme key on authentication field is invalid") - // ErrInvalidPasswordType indicates invalid password key on authentication field - ErrInvalidPasswordType = New("malformed entity specification. password key on authentication field is invalid") + // ErrAuthInvalidTokenType indicates invalid token key on authentication field + ErrAuthInvalidTokenType = New("malformed entity specification. token key on authentication field is invalid") - // ErrInvalidUsernameType indicates invalid username key on authentication field - ErrInvalidUsernameType = New("malformed entity specification. username key on authentication field is invalid") + // ErrAuthInvalidUsernameType indicates invalid username key on authentication field + ErrAuthInvalidUsernameType = New("malformed entity specification. username key on authentication field is invalid") // ErrRemoteHostNotFound indicates that remote host field was not found ErrRemoteHostNotFound = New("malformed entity specification. remote host is expected on exporter field") diff --git a/policies/backend/diode/diode.go b/policies/backend/diode/diode.go deleted file mode 100644 index ec4b5d8d0..000000000 --- a/policies/backend/diode/diode.go +++ /dev/null @@ -1,65 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -package diode - -import ( - "errors" - - "github.com/ghodss/yaml" - "github.com/orb-community/orb/pkg/types" - "github.com/orb-community/orb/policies/backend" -) - -var _ backend.Backend = (*diodeBackend)(nil) - -type diodeBackend struct { -} - -func (p diodeBackend) Validate(policy types.Metadata) error { - // todo finish validation - return nil -} - -func (p diodeBackend) convertFromYAML(policy string) (types.Metadata, error) { - j := collectionPolicy{} - err := yaml.Unmarshal([]byte(policy), &j) - if err != nil { - return types.Metadata{}, err - } - - if j.Backend == "" || j.Data == nil || j.Kind == "" { - return types.Metadata{}, errors.New("malformed yaml policy") - } - - ret := types.Metadata{} - - ret["kind"] = j.Kind - ret["backend"] = j.Backend - ret["data"] = j.Data - - return ret, nil -} - -func (p diodeBackend) ConvertFromFormat(format string, policy string) (types.Metadata, error) { - switch format { - case "yaml": - return p.convertFromYAML(policy) - default: - return nil, errors.New("unsupported format") - } -} - -func (p diodeBackend) SupportsFormat(format string) bool { - switch format { - case "yaml": - return true - } - return false -} - -func Register() bool { - backend.Register("diode", &diodeBackend{}) - return true -} diff --git a/policies/backend/diode/types.go b/policies/backend/diode/types.go deleted file mode 100644 index e05eff193..000000000 --- a/policies/backend/diode/types.go +++ /dev/null @@ -1,42 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -package diode - -import "github.com/orb-community/orb/pkg/types" - -const CurrentSchemaVersion = "1.0" - -// policy for suzieq -type collectionPolicy struct { - Backend string `json:"backend"` - Data types.Metadata `json:"data"` - Kind string `json:"kind"` -} - -/* - -kind: discovery -backend: suzieq -config: - netbox: - site: New York NY -data: - inventory: - sources: - - name: default_inventory - hosts: - - url: ssh://1.2.3.4:2021 username=user password=password - - url: ssh://resolvable.host.name username=user password=password - devices: - - name: default_devices - transport: ssh - ignore-known-hosts: true - slow-host: true - namespaces: - - name: default_namespace - source: default_inventory - device: default_devices - -*/ diff --git a/policies/service.go b/policies/service.go index a9ace77a3..2f3671db0 100644 --- a/policies/service.go +++ b/policies/service.go @@ -9,7 +9,6 @@ import ( fleetpb "github.com/orb-community/orb/fleet/pb" "github.com/orb-community/orb/pkg/errors" "github.com/orb-community/orb/pkg/types" - "github.com/orb-community/orb/policies/backend/diode" "github.com/orb-community/orb/policies/backend/orb" "github.com/orb-community/orb/policies/backend/pktvisor" sinkpb "github.com/orb-community/orb/sinks/pb" @@ -55,7 +54,6 @@ func New(logger *zap.Logger, auth mainflux.AuthServiceClient, repo Repository, f //TODO it might not need the logger here, just added for debugging for now otel.Register(logger) pktvisor.Register() - diode.Register() return &policiesService{ logger: logger, diff --git a/python-test/features/steps/agent_groups.py b/python-test/features/steps/agent_groups.py index cd50b3e04..f85e8ae6d 100644 --- a/python-test/features/steps/agent_groups.py +++ b/python-test/features/steps/agent_groups.py @@ -12,6 +12,8 @@ import json import random from logger import Logger +from concurrent.futures import ThreadPoolExecutor + log = Logger().logger_instance() configs = TestConfig.configs() @@ -402,8 +404,13 @@ def delete_agent_groups(token, list_of_agent_groups): :param (list) list_of_agent_groups: that will be deleted """ - for agent_Groups in list_of_agent_groups: - delete_agent_group(token, agent_Groups['id']) + log.debug(f"Deleting {len(list_of_agent_groups)} agent groups") + with ThreadPoolExecutor() as executor: + futures = [executor.submit(delete_agent_group, token, agent_groups.get('id')) for agent_groups in + list_of_agent_groups] + results = [future.result() for future in futures] + log.debug(f"Finishing deleting agent groups") + return results def delete_agent_group(token, agent_group_id): diff --git a/python-test/features/steps/agents.py b/python-test/features/steps/agents.py index d6e66454c..8e7a6886f 100644 --- a/python-test/features/steps/agents.py +++ b/python-test/features/steps/agents.py @@ -14,6 +14,8 @@ import os import signal from deepdiff import DeepDiff +from concurrent.futures import ThreadPoolExecutor + configs = TestConfig.configs() agent_name_prefix = "test_agent_name_" @@ -93,7 +95,7 @@ def check_agent_status_after_seconds(context, status, seconds): @step('the agent status is {status}') def check_agent_status(context, status): - timeout = 30 + timeout = 60 token = context.token agent_status, context.agent = wait_until_expected_agent_status(token, context.agent['id'], status, timeout=timeout) logs = get_orb_agent_logs(context.container_id) @@ -699,9 +701,12 @@ def delete_agents(token, list_of_agents): :param (str) token: used for API authentication :param (list) list_of_agents: that will be deleted """ - - for agent in list_of_agents: - delete_agent(token, agent['id']) + log.debug(f"Deleting {len(list_of_agents)} agents") + with ThreadPoolExecutor() as executor: + futures = [executor.submit(delete_agent, token, agent.get('id')) for agent in list_of_agents] + results = [future.result() for future in futures] + log.debug(f"Finishing deleting agents") + return results def delete_agent(token, agent_id): diff --git a/python-test/features/steps/local_agent.py b/python-test/features/steps/local_agent.py index fff33ea4c..61160bcf9 100644 --- a/python-test/features/steps/local_agent.py +++ b/python-test/features/steps/local_agent.py @@ -11,6 +11,7 @@ from datetime import datetime import ciso8601 from metrics import expected_metrics_by_handlers_and_groups, wait_until_metrics_scraped +from concurrent.futures import ThreadPoolExecutor from logger import Logger log = Logger().logger_instance() @@ -197,10 +198,11 @@ def remove_orb_agent_container(context): def remove_all_orb_agent_test_containers(context): docker_client = docker.from_env() containers = docker_client.containers.list(all=True) - for container in containers: - test_container = container.name.startswith(LOCAL_AGENT_CONTAINER_NAME) - if test_container is True: - container.remove(force=True) + target_containers = [container for container in containers if container.name.startswith(LOCAL_AGENT_CONTAINER_NAME)] + log.debug(f"Removing {len(target_containers)} agent containers") + with ThreadPoolExecutor() as executor: + [executor.submit(remove_container, container.id, True) for container in target_containers] + log.debug(f"Finishing removing agent containers.") def create_agent_env_vars_set(agent_id, agent_channel_id, agent_mqtt_key, verify_ssl, diff --git a/python-test/features/steps/policies.py b/python-test/features/steps/policies.py index 51f0b817d..0b3797a35 100644 --- a/python-test/features/steps/policies.py +++ b/python-test/features/steps/policies.py @@ -14,6 +14,7 @@ import ciso8601 import yaml from logger import Logger +from concurrent.futures import ThreadPoolExecutor log = Logger().logger_instance() policy_name_prefix = "test_policy_name_" @@ -874,9 +875,12 @@ def delete_policies(token, list_of_policies): :param (str) token: used for API authentication :param (list) list_of_policies: that will be deleted """ - - for policy in list_of_policies: - delete_policy(token, policy['id']) + log.debug(f"Deleting {len(list_of_policies)} policies") + with ThreadPoolExecutor() as executor: + futures = [executor.submit(delete_policy, token, policy.get('id')) for policy in list_of_policies] + results = [future.result() for future in futures] + log.debug(f"Finishing deleting policies") + return results def delete_policy(token, policy_id): diff --git a/python-test/features/steps/sink.py b/python-test/features/steps/sink.py index ba2c1b21d..eb331173f 100644 --- a/python-test/features/steps/sink.py +++ b/python-test/features/steps/sink.py @@ -2,10 +2,11 @@ from configs import TestConfig from utils import (random_string, filter_list_by_parameter_start_with, threading_wait_until, validate_json, \ remove_empty_from_json, return_api_get_response, return_api_put_response, return_api_post_response, - return_api_delete_response) + return_api_delete_response, log) from hamcrest import * import threading import yaml +from concurrent.futures import ThreadPoolExecutor configs = TestConfig.configs() sink_name_prefix = "test_sink_label_name_" @@ -383,8 +384,12 @@ def delete_sinks(token, list_of_sinks): :param (list) list_of_sinks: that will be deleted """ - for sink in list_of_sinks: - delete_sink(token, sink['id']) + log.debug(f"Deleting {len(list_of_sinks)} sinks") + with ThreadPoolExecutor() as executor: + futures = [executor.submit(delete_sink, token, sink.get('id')) for sink in list_of_sinks] + results = [future.result() for future in futures] + log.debug(f"Finishing deleting sinks") + return results def delete_sink(token, sink_id): diff --git a/python-test/requirements.txt b/python-test/requirements.txt index 62cee8a0a..2f443d1c1 100644 --- a/python-test/requirements.txt +++ b/python-test/requirements.txt @@ -1,16 +1,16 @@ behave==1.2.6 ciso8601==2.3.1 -colorlog==6.8.0 -docker==7.0.0 +colorlog==6.8.2 +docker==7.1.0 PyHamcrest==2.1.0 -PyYAML==6.0.1 +PyYAML==6.0.2 retry==0.9.2 -selenium==4.16.0 +selenium==4.23.1 behavex==3.2.0 -deepdiff==6.7.1 -jsonschema==4.20.0 -mkdocs==1.5.3 -mkdocs-material==9.5.2 -prometheus-client==0.19.0 -psutil==5.9.7 -webdriver-manager==4.0.1 +deepdiff==7.0.1 +jsonschema==4.23.0 +mkdocs==1.6.0 +mkdocs-material==9.5.31 +prometheus-client==0.20.0 +psutil==6.0.0 +webdriver-manager==4.0.2 diff --git a/sinker/redis/consumer/sink_key_expire.go b/sinker/redis/consumer/sink_key_expire.go index 8e2318c27..1f3a6785e 100644 --- a/sinker/redis/consumer/sink_key_expire.go +++ b/sinker/redis/consumer/sink_key_expire.go @@ -34,7 +34,7 @@ func (s *sinkerKeyExpirationListener) SubscribeToKeyExpiration(ctx context.Conte pubsub := s.cacheRedisClient.PSubscribe(ctx, "__keyevent@"+redisDB+"__:expired") defer func(pubsub *redis.PubSub) { _ = pubsub.Close() - }(pubsub) + }(pubsub) for { select { case <-ctx.Done(): @@ -57,7 +57,7 @@ func (s *sinkerKeyExpirationListener) SubscribeToKeyExpiration(ctx context.Conte // ReceiveMessage to be used to receive the message from the sinker key expiration func (s *sinkerKeyExpirationListener) ReceiveMessage(ctx context.Context, message string) error { // goroutine - go func(msg string) { + go func(msg string) { ownerID := message[15:51] sinkID := message[52:] event := producer.SinkIdleEvent{ diff --git a/sinks/api/grpc/endpoint.go b/sinks/api/grpc/endpoint.go index f8214b000..efe845793 100644 --- a/sinks/api/grpc/endpoint.go +++ b/sinks/api/grpc/endpoint.go @@ -49,15 +49,14 @@ func retrieveSinksEndpoint(svc sinks.SinkService) endpoint.Endpoint { return func(ctx context.Context, request interface{}) (response interface{}, err error) { req := request.(sinksFilter) filter := sinks.Filter{ - OpenTelemetry: req.isOtel, - StateFilter: req.state, + StateFilter: req.state, } sinksInternal, err := svc.ListSinksInternal(ctx, filter) if err != nil { return sinksInternal, err } responseStr := sinksRes{} - for _, sink := range sinksInternal { + for _, sink := range sinksInternal.Sinks { sinkResponse, err := buildSinkResponse(sink) if err != nil { diff --git a/sinks/api/http/endpoint.go b/sinks/api/http/endpoint.go index f3b59496f..92031b491 100644 --- a/sinks/api/http/endpoint.go +++ b/sinks/api/http/endpoint.go @@ -10,6 +10,8 @@ package http import ( "context" + "encoding/json" + "gopkg.in/yaml.v3" "time" "github.com/go-kit/kit/endpoint" @@ -26,6 +28,8 @@ func omitSecretInformation(configSvc *sinks.Configuration, inputSink sinks.Sink) if err != nil { return sinks.Sink{}, err } + // Remove opentelemetry flag from config + inputSink.Config.RemoveKeys([]string{"opentelemetry"}) returnSink = inputSink authMeta := a.(types.Metadata) returnSink.Config = authMeta @@ -37,9 +41,40 @@ func omitSecretInformation(configSvc *sinks.Configuration, inputSink sinks.Sink) } returnSink.ConfigData = configData.(string) } + return } +func removeConfigDataKey(configData string, format string, keys []string) (string, error) { + if configData == "" { + return "", nil + } + var data types.Metadata + switch format { + case "json": + if err := json.Unmarshal([]byte(configData), &keys); err != nil { + return "", err + } + data.RemoveKeys(keys) + if newData, err := json.Marshal(data); err != nil { + return "", err + } else { + return string(newData), nil + } + case "yaml": + if err := yaml.Unmarshal([]byte(configData), &keys); err != nil { + return "", err + } + data.RemoveKeys(keys) + if newData, err := yaml.Marshal(data); err != nil { + return "", err + } else { + return string(newData), nil + } + } + return "", errors.New("unrecognized format") +} + func addEndpoint(svc sinks.SinkService) endpoint.Endpoint { return func(ctx context.Context, request interface{}) (interface{}, error) { req := request.(addReq) diff --git a/sinks/api/http/endpoint_test.go b/sinks/api/http/endpoint_test.go index 74fad1e81..d45c606f3 100644 --- a/sinks/api/http/endpoint_test.go +++ b/sinks/api/http/endpoint_test.go @@ -857,7 +857,7 @@ func TestAuthenticationTypesEndpoints(t *testing.T) { err = json.Unmarshal(body, &authResponse) require.NoError(t, err, "must not error") require.NotNil(t, authResponse, "response must not be nil") - require.Equal(t, 1, len(authResponse.AuthenticationTypes), "must contain basicauth for now") + require.Equal(t, 2, len(authResponse.AuthenticationTypes), "must contain basicauth and bearertokenauth") }, }, "view authentication type basicauth": { @@ -1085,6 +1085,7 @@ func TestViewSink(t *testing.T) { Backend: sk.Backend, Config: omittedSink.Config, ConfigData: omittedSink.ConfigData, + Format: "json", Tags: sk.Tags, State: sk.State.String(), Error: sk.Error, diff --git a/sinks/api/http/logging.go b/sinks/api/http/logging.go index 2bde997f0..b9cc798f9 100644 --- a/sinks/api/http/logging.go +++ b/sinks/api/http/logging.go @@ -21,7 +21,7 @@ type loggingMiddleware struct { svc sinks.SinkService } -func (l loggingMiddleware) ListSinksInternal(ctx context.Context, filter sinks.Filter) (sinks []sinks.Sink, err error) { +func (l loggingMiddleware) ListSinksInternal(ctx context.Context, filter sinks.Filter) (sinks sinks.Page, err error) { defer func(begin time.Time) { if err != nil { l.logger.Warn("method call: list_sinks_internal", diff --git a/sinks/api/http/metrics.go b/sinks/api/http/metrics.go index 7ef0edcfb..89a35e640 100644 --- a/sinks/api/http/metrics.go +++ b/sinks/api/http/metrics.go @@ -27,7 +27,7 @@ type metricsMiddleware struct { } // ListSinksInternal Will not count metrics since it is internal-service only rpc -func (m metricsMiddleware) ListSinksInternal(ctx context.Context, filter sinks.Filter) (sinks []sinks.Sink, err error) { +func (m metricsMiddleware) ListSinksInternal(ctx context.Context, filter sinks.Filter) (sinks sinks.Page, err error) { return m.svc.ListSinksInternal(ctx, filter) } diff --git a/sinks/api/http/openapi.yaml b/sinks/api/http/openapi.yaml index b3f627f8e..efd198e4d 100644 --- a/sinks/api/http/openapi.yaml +++ b/sinks/api/http/openapi.yaml @@ -537,8 +537,22 @@ components: remote_host: my.prometheus-host.com authentication: username: dbuser - opentelemetry: enabled description: Object representing backend specific configuration information + config_data: + type: string + example: + exporter: + remote_host: my.prometheus-host.com + authentication: + username: dbuser + opentelemetry: enabled + description: YAML representing backend specific configuration information + format: + type: string + enum: + - yaml + - json + description: Format that the config will be passed on ts_created: type: string format: date-time diff --git a/sinks/api/http/requests.go b/sinks/api/http/requests.go index df5f336a0..02994fa41 100644 --- a/sinks/api/http/requests.go +++ b/sinks/api/http/requests.go @@ -76,7 +76,7 @@ func GetConfigurationAndMetadataFromMeta(backendName string, config types.Metada } authTypeSvc, ok := authentication_type.GetAuthType(authtype.(string)) if !ok { - err = errors.Wrap(errors.ErrInvalidAuthType, errors.New("invalid required field authentication type")) + err = errors.Wrap(errors.ErrAuthInvalidType, errors.New("invalid required field authentication type")) return } configSvc.Authentication = authTypeSvc @@ -85,7 +85,7 @@ func GetConfigurationAndMetadataFromMeta(backendName string, config types.Metada } func GetConfigurationAndMetadataFromYaml(backendName string, config string) (configSvc *sinks.Configuration, exporter types.Metadata, authentication types.Metadata, err error) { - + if !backend.HaveBackend(backendName) { return nil, nil, nil, errors.Wrap(errors.ErrInvalidBackend, errors.New("invalid backend")) } @@ -119,12 +119,12 @@ func GetConfigurationAndMetadataFromYaml(backendName string, config string) (con case string: break default: - err = errors.ErrInvalidAuthType + err = errors.ErrAuthInvalidType return } authTypeSvc, ok := authentication_type.GetAuthType(authtype.(string)) if !ok { - err = errors.Wrap(errors.ErrInvalidAuthType, errors.New("invalid required field authentication type")) + err = errors.Wrap(errors.ErrAuthInvalidType, errors.New("invalid required field authentication type")) return } configSvc.Authentication = authTypeSvc diff --git a/sinks/api/http/transport.go b/sinks/api/http/transport.go index 8f0277f76..a03370740 100644 --- a/sinks/api/http/transport.go +++ b/sinks/api/http/transport.go @@ -236,23 +236,32 @@ func encodeError(_ context.Context, err error, w http.ResponseWriter) { case errors.Contains(errorVal, errors.ErrUnsupportedContentType): w.WriteHeader(http.StatusUnsupportedMediaType) - case errors.Contains(errorVal, errors.ErrInvalidEndpoint): w.WriteHeader(http.StatusBadRequest) case errors.Contains(errorVal, errors.ErrEndpointNotFound): w.WriteHeader(http.StatusBadRequest) case errors.Contains(errorVal, errors.ErrBackendNotFound): w.WriteHeader(http.StatusBadRequest) - case errors.Contains(errorVal, errors.ErrPasswordNotFound): + case errors.Contains(errorVal, errors.ErrAuthUsernameNotFound): + w.WriteHeader(http.StatusBadRequest) + case errors.Contains(errorVal, errors.ErrAuthPasswordNotFound): w.WriteHeader(http.StatusBadRequest) case errors.Contains(errorVal, errors.ErrAuthTypeNotFound): w.WriteHeader(http.StatusBadRequest) - case errors.Contains(errorVal, errors.ErrInvalidUsernameType): + case errors.Contains(errorVal, errors.ErrAuthInvalidUsernameType): + w.WriteHeader(http.StatusBadRequest) + case errors.Contains(errorVal, errors.ErrAuthInvalidPasswordType): + w.WriteHeader(http.StatusBadRequest) + case errors.Contains(errorVal, errors.ErrAuthInvalidTokenType): + w.WriteHeader(http.StatusBadRequest) + case errors.Contains(errorVal, errors.ErrAuthTokenNotFound): w.WriteHeader(http.StatusBadRequest) - case errors.Contains(errorVal, errors.ErrInvalidPasswordType): + case errors.Contains(errorVal, errors.ErrAuthInvalidSchemeType): + w.WriteHeader(http.StatusBadRequest) + case errors.Contains(errorVal, errors.ErrAuthSchemeNotFound): + w.WriteHeader(http.StatusBadRequest) + case errors.Contains(errorVal, errors.ErrAuthInvalidType): w.WriteHeader(http.StatusBadRequest) - case errors.Contains(errorVal, errors.ErrInvalidAuthType): - w.WriteHeader(http.StatusBadRequest) case errors.Contains(errorVal, errors.ErrRemoteHostNotFound): w.WriteHeader(http.StatusBadRequest) case errors.Contains(errorVal, errors.ErrAuthFieldNotFound): @@ -262,7 +271,7 @@ func encodeError(_ context.Context, err error, w http.ResponseWriter) { case errors.Contains(errorVal, errors.ErrExporterFieldNotFound): w.WriteHeader(http.StatusBadRequest) case errors.Contains(errorVal, errors.ErrInvalidBackend): - w.WriteHeader(http.StatusBadRequest) + w.WriteHeader(http.StatusBadRequest) case errors.Contains(errorVal, errors.ErrEntityNameNotFound): w.WriteHeader(http.StatusBadRequest) case errors.Contains(errorVal, errors.ErrMalformedEntity): diff --git a/sinks/authentication_type/basicauth/authentication.go b/sinks/authentication_type/basicauth/authentication.go index 71de2fa66..cf0e1e7d2 100644 --- a/sinks/authentication_type/basicauth/authentication.go +++ b/sinks/authentication_type/basicauth/authentication.go @@ -1,14 +1,18 @@ package basicauth import ( + "strings" + + "gopkg.in/yaml.v3" + "github.com/orb-community/orb/pkg/errors" "github.com/orb-community/orb/pkg/types" "github.com/orb-community/orb/sinks/authentication_type" "github.com/orb-community/orb/sinks/backend" - "gopkg.in/yaml.v3" ) const ( + AuthType = "basicauth" UsernameConfigFeature = "username" PasswordConfigFeature = "password" ) @@ -32,11 +36,9 @@ var ( } ) -const AuthType = "basicauth" - type AuthConfig struct { - Username string `json:"username" ,yaml:"username"` - Password string `json:"password" ,yaml:"password"` + Username *string `json:"username" yaml:"username"` + Password *string `json:"password" yaml:"password"` encryptionService authentication_type.PasswordService } @@ -56,27 +58,32 @@ func (a *AuthConfig) GetFeatureConfig() []authentication_type.ConfigFeature { func (a *AuthConfig) ValidateConfiguration(inputFormat string, input interface{}) error { switch inputFormat { case "object": + if _, ok := input.(types.Metadata)[UsernameConfigFeature]; !ok { + return errors.Wrap(errors.ErrAuthUsernameNotFound, errors.New("username field was not found")) + } + + if _, ok := input.(types.Metadata)[PasswordConfigFeature]; !ok { + return errors.Wrap(errors.ErrAuthPasswordNotFound, errors.New("password field was not found")) + } + for key, value := range input.(types.Metadata) { - if _, ok := value.(string); !ok { - if key == "password" { - return errors.Wrap(errors.ErrInvalidPasswordType, errors.New("invalid auth type for field: " + key)) - } - if key == "type" { - return errors.Wrap(errors.ErrInvalidAuthType, errors.New("invalid auth type for field: " + key)) - } - if key == "username" { - return errors.Wrap(errors.ErrInvalidUsernameType, errors.New("invalid auth type for field: " + key)) - } - } - vs := value.(string) if key == UsernameConfigFeature { - if len(vs) == 0 { - return errors.New("username cannot be empty") + if _, ok := value.(string); !ok { + return errors.Wrap(errors.ErrAuthInvalidUsernameType, errors.New("invalid auth type for field: "+key)) + } + + if len(strings.Fields(value.(string))) == 0 { + return errors.Wrap(errors.ErrAuthInvalidUsernameType, errors.New("invalid authentication username")) } } + if key == PasswordConfigFeature { - if len(vs) == 0 { - return errors.New("password cannot be empty") + if _, ok := value.(string); !ok { + return errors.Wrap(errors.ErrAuthInvalidPasswordType, errors.New("invalid auth type for field: "+key)) + } + + if len(strings.Fields(value.(string))) == 0 { + return errors.Wrap(errors.ErrAuthInvalidPasswordType, errors.New("invalid authentication password")) } } } @@ -85,12 +92,24 @@ func (a *AuthConfig) ValidateConfiguration(inputFormat string, input interface{} if err != nil { return err } - if len(a.Username) == 0 { - return errors.New("username cannot be empty") - } else if len(a.Password) == 0 { - return errors.New("password cannot be empty") + + if a.Username == nil { + return errors.Wrap(errors.ErrAuthUsernameNotFound, errors.New("username field was not found")) + } + + if len(strings.Fields(*a.Username)) == 0 { + return errors.Wrap(errors.ErrAuthInvalidUsernameType, errors.New("invalid authentication username")) + } + + if a.Password == nil { + return errors.Wrap(errors.ErrAuthPasswordNotFound, errors.New("password field was not found")) + } + + if len(strings.Fields(*a.Password)) == 0 { + return errors.Wrap(errors.ErrAuthInvalidPasswordType, errors.New("invalid authentication password")) } } + return nil } @@ -156,7 +175,7 @@ func (a *AuthConfig) EncodeInformation(outputFormat string, input interface{}) ( inputMeta := input.(types.Metadata) authMeta := inputMeta.GetSubMetadata(authentication_type.AuthenticationKey) if _, ok := authMeta[PasswordConfigFeature].(string); !ok { - return nil, errors.Wrap(errors.ErrPasswordNotFound, errors.New("password field was not found")) + return nil, errors.Wrap(errors.ErrAuthPasswordNotFound, errors.New("password field was not found")) } encoded, err := a.encryptionService.EncodePassword(authMeta[PasswordConfigFeature].(string)) if err != nil { diff --git a/sinks/authentication_type/basicauth/authentication_test.go b/sinks/authentication_type/basicauth/authentication_test.go new file mode 100644 index 000000000..c0c950154 --- /dev/null +++ b/sinks/authentication_type/basicauth/authentication_test.go @@ -0,0 +1,132 @@ +package basicauth + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/orb-community/orb/pkg/errors" + "github.com/orb-community/orb/pkg/types" +) + +func TestAuthConfig_ValidateConfiguration(t *testing.T) { + type args struct { + inputFormat string + input types.Metadata + } + tests := []struct { + name string + args args + wantErr error + }{ + { + name: "missing_username", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "password": "test-password", + }, + }, + wantErr: errors.ErrAuthUsernameNotFound, + }, + { + name: "empty_username", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "username": "", + "password": "test-password", + }, + }, + wantErr: errors.ErrAuthInvalidUsernameType, + }, + { + name: "invalid_username_type", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "username": 1234, + "password": "test-password", + }, + }, + wantErr: errors.ErrAuthInvalidUsernameType, + }, + { + name: "invalid_username", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "username": " ", + "password": "test-password", + }, + }, + wantErr: errors.ErrAuthInvalidUsernameType, + }, + { + name: "missing_password", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "username": "test-user", + }, + }, + wantErr: errors.ErrAuthPasswordNotFound, + }, + { + name: "empty_password", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "username": "test-user", + "password": "", + }, + }, + wantErr: errors.ErrAuthInvalidPasswordType, + }, + { + name: "invalid_password_type", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "username": "test-user", + "password": 1234, + }, + }, + wantErr: errors.ErrAuthInvalidPasswordType, + }, + { + name: "invalid_password", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "username": "test-user", + "password": " ", + }, + }, + wantErr: errors.ErrAuthInvalidPasswordType, + }, + { + name: "valid", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "username": "test-user", + "password": "test-password", + }, + }, + wantErr: nil, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var a AuthConfig + err := a.ValidateConfiguration(tt.args.inputFormat, tt.args.input) + if tt.wantErr != nil { + assert.ErrorContains(t, err, tt.wantErr.Error()) + } else { + assert.NoError(t, err) + } + }) + } +} diff --git a/sinks/authentication_type/bearertokenauth/authentication.go b/sinks/authentication_type/bearertokenauth/authentication.go new file mode 100644 index 000000000..fdc01c47a --- /dev/null +++ b/sinks/authentication_type/bearertokenauth/authentication.go @@ -0,0 +1,291 @@ +package bearertokenauth + +import ( + "strings" + + "gopkg.in/yaml.v2" + + "github.com/orb-community/orb/pkg/errors" + "github.com/orb-community/orb/pkg/types" + "github.com/orb-community/orb/sinks/authentication_type" + "github.com/orb-community/orb/sinks/backend" +) + +const ( + AuthType = "bearertokenauth" + SchemeConfigFeature = "scheme" + TokenConfigFeature = "token" +) + +var features = []authentication_type.ConfigFeature{ + { + Type: backend.ConfigFeatureTypeText, + Input: "text", + Title: "Scheme", + Name: SchemeConfigFeature, + Required: true, + }, + { + Type: backend.ConfigFeatureTypeText, + Input: "text", + Title: "Token", + Name: TokenConfigFeature, + Required: true, + }, +} + +type AuthConfig struct { + encryptionService authentication_type.PasswordService + + Scheme *string `json:"scheme" yaml:"scheme"` + Token *string `json:"token" yaml:"token"` +} + +func (a *AuthConfig) GetFeatureConfig() []authentication_type.ConfigFeature { + return features +} + +func (a *AuthConfig) ValidateConfiguration(inputFormat string, input any) error { + switch inputFormat { + case "object": + if _, ok := input.(types.Metadata)[SchemeConfigFeature]; !ok { + return errors.Wrap(errors.ErrAuthSchemeNotFound, errors.New("scheme field was not found")) + } + + if _, ok := input.(types.Metadata)[TokenConfigFeature]; !ok { + return errors.Wrap(errors.ErrAuthTokenNotFound, errors.New("token field was not found")) + } + + for key, value := range input.(types.Metadata) { + if key == SchemeConfigFeature { + if _, ok := value.(string); !ok { + return errors.Wrap(errors.ErrAuthInvalidSchemeType, errors.New("invalid auth type for field: "+key)) + } + + if len(strings.Fields(value.(string))) != 1 { + return errors.Wrap(errors.ErrAuthInvalidSchemeType, errors.New("invalid authentication scheme")) + } + } + + if key == TokenConfigFeature { + if _, ok := value.(string); !ok { + return errors.Wrap(errors.ErrAuthInvalidTokenType, errors.New("invalid auth type for field: "+key)) + } + if len(strings.Fields(value.(string))) != 1 { + return errors.Wrap(errors.ErrAuthInvalidTokenType, errors.New("invalid authentication token")) + } + } + } + case "yaml": + err := yaml.Unmarshal([]byte(input.(string)), &a) + if err != nil { + return err + } + + if a.Scheme == nil { + return errors.Wrap(errors.ErrAuthSchemeNotFound, errors.New("scheme field was not found")) + } + + if len(strings.Fields(*a.Scheme)) != 1 { + return errors.Wrap(errors.ErrAuthInvalidSchemeType, errors.New("invalid authentication scheme")) + } + + if a.Token == nil { + return errors.Wrap(errors.ErrAuthTokenNotFound, errors.New("token field was not found")) + } + + if len(strings.Fields(*a.Token)) != 1 { + return errors.Wrap(errors.ErrAuthInvalidTokenType, errors.New("invalid authentication token")) + } + } + + return nil +} + +func (a *AuthConfig) ConfigToFormat(outputFormat string, input any) (any, error) { + switch input.(type) { + case types.Metadata: + if outputFormat == "yaml" { + retVal, err := yaml.Marshal(input) + + return string(retVal), err + } + case string: + if outputFormat == "object" { + retVal := make(types.Metadata) + val := input.(string) + err := yaml.Unmarshal([]byte(val), &retVal) + + return retVal, err + } + } + + return nil, errors.New("unsupported format") +} + +func (a *AuthConfig) OmitInformation(outputFormat string, input any) (any, error) { + switch input.(type) { + case types.Metadata: + inputMeta := input.(types.Metadata) + authMeta := inputMeta.GetSubMetadata(authentication_type.AuthenticationKey) + authMeta[TokenConfigFeature] = "" + inputMeta[authentication_type.AuthenticationKey] = authMeta + + if outputFormat == "yaml" { + return a.ConfigToFormat("yaml", inputMeta) + } + + if outputFormat == "object" { + return inputMeta, nil + } + + return nil, errors.New("unsupported format") + case string: + iia, err := a.ConfigToFormat("object", input) + if err != nil { + return nil, err + } + inputMeta := iia.(types.Metadata) + authMeta := inputMeta.GetSubMetadata(authentication_type.AuthenticationKey) + authMeta[TokenConfigFeature] = "" + inputMeta[authentication_type.AuthenticationKey] = authMeta + + if outputFormat == "yaml" { + return a.ConfigToFormat("yaml", inputMeta) + } + + if outputFormat == "object" { + return inputMeta, nil + } + + return nil, errors.New("unsupported format") + } + + return nil, errors.New("unsupported format") +} + +func (a *AuthConfig) EncodeInformation(outputFormat string, input interface{}) (interface{}, error) { + switch input.(type) { + case types.Metadata: + inputMeta := input.(types.Metadata) + authMeta := inputMeta.GetSubMetadata(authentication_type.AuthenticationKey) + + if _, ok := authMeta[TokenConfigFeature].(string); !ok { + return nil, errors.Wrap(errors.ErrAuthTokenNotFound, errors.New("token field was not found")) + } + + encoded, err := a.encryptionService.EncodePassword(authMeta[TokenConfigFeature].(string)) + if err != nil { + return nil, err + } + + authMeta[TokenConfigFeature] = encoded + inputMeta[authentication_type.AuthenticationKey] = authMeta + + if outputFormat == "yaml" { + return a.ConfigToFormat("yaml", inputMeta) + } + + if outputFormat == "object" { + return inputMeta, nil + } + + return nil, errors.New("unsupported format") + case string: + iia, err := a.ConfigToFormat("object", input) + if err != nil { + return nil, err + } + inputMeta := iia.(types.Metadata) + authMeta := inputMeta.GetSubMetadata(authentication_type.AuthenticationKey) + + encoded, err := a.encryptionService.EncodePassword(authMeta[TokenConfigFeature].(string)) + if err != nil { + return nil, err + } + + authMeta[TokenConfigFeature] = encoded + inputMeta[authentication_type.AuthenticationKey] = authMeta + + if outputFormat == "yaml" { + return a.ConfigToFormat("yaml", inputMeta) + } + + if outputFormat == "object" { + return inputMeta, nil + } + + return nil, errors.New("unsupported format") + } + + return nil, errors.New("unsupported format") +} + +func (a *AuthConfig) DecodeInformation(outputFormat string, input any) (any, error) { + switch input.(type) { + case types.Metadata: + inputMeta := input.(types.Metadata) + authMeta := inputMeta.GetSubMetadata(authentication_type.AuthenticationKey) + + decoded, err := a.encryptionService.DecodePassword(authMeta[TokenConfigFeature].(string)) + if err != nil { + return nil, err + } + + authMeta[TokenConfigFeature] = decoded + inputMeta[authentication_type.AuthenticationKey] = authMeta + + if outputFormat == "yaml" { + return a.ConfigToFormat("yaml", inputMeta) + } + + if outputFormat == "object" { + return inputMeta, nil + } + + return nil, errors.New("unsupported format") + case string: + iia, err := a.ConfigToFormat("object", input) + if err != nil { + return nil, err + } + + inputMeta := iia.(types.Metadata) + authMeta := inputMeta.GetSubMetadata(authentication_type.AuthenticationKey) + + decoded, err := a.encryptionService.DecodePassword(authMeta[TokenConfigFeature].(string)) + if err != nil { + return nil, err + } + + authMeta[TokenConfigFeature] = decoded + inputMeta[authentication_type.AuthenticationKey] = authMeta + + if outputFormat == "yaml" { + return a.ConfigToFormat("yaml", inputMeta) + } + + if outputFormat == "object" { + return inputMeta, nil + } + + return nil, errors.New("unsupported format") + } + + return nil, errors.New("unsupported format") +} + +func (a *AuthConfig) Metadata() authentication_type.AuthenticationTypeConfig { + return authentication_type.AuthenticationTypeConfig{ + Type: AuthType, + Description: "Token authentication", + Config: features, + } +} + +func Register(encryptionService authentication_type.PasswordService) { + bearerTokenAuth := AuthConfig{ + encryptionService: encryptionService, + } + authentication_type.Register(AuthType, &bearerTokenAuth) +} diff --git a/sinks/authentication_type/bearertokenauth/authentication_test.go b/sinks/authentication_type/bearertokenauth/authentication_test.go new file mode 100644 index 000000000..f62cb073d --- /dev/null +++ b/sinks/authentication_type/bearertokenauth/authentication_test.go @@ -0,0 +1,247 @@ +package bearertokenauth + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/orb-community/orb/pkg/errors" + "github.com/orb-community/orb/pkg/types" + "github.com/orb-community/orb/sinks/authentication_type" +) + +func TestAuthConfig_ValidateConfiguration(t *testing.T) { + type args struct { + inputFormat string + input types.Metadata + } + tests := []struct { + name string + args args + wantErr error + }{ + { + name: "missing_schema", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "token": "test_api_key", + }, + }, + wantErr: errors.ErrAuthSchemeNotFound, + }, + { + name: "empty_schema", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "scheme": "", + "token": "test_api_key", + }, + }, + wantErr: errors.ErrAuthInvalidSchemeType, + }, + { + name: "invalid_schema_type", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "scheme": 1234, + "token": "test_api_key", + }, + }, + wantErr: errors.ErrAuthInvalidSchemeType, + }, + { + name: "invalid_schema", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "scheme": "fake schema", + "token": "test_api_key", + }, + }, + wantErr: errors.ErrAuthInvalidSchemeType, + }, + { + name: "missing_token", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "scheme": "Bearer", + }, + }, + wantErr: errors.ErrAuthTokenNotFound, + }, + { + name: "empty_token", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "scheme": "Bearer", + "token": "", + }, + }, + wantErr: errors.ErrAuthInvalidTokenType, + }, + { + name: "invalid_token_type", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "scheme": "Bearer", + "token": 1234, + }, + }, + wantErr: errors.ErrAuthInvalidTokenType, + }, + { + name: "invalid_token_value", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "scheme": "Bearer", + "token": "invalid api key", + }, + }, + wantErr: errors.ErrAuthInvalidTokenType, + }, + { + name: "valid", + args: args{ + inputFormat: "object", + input: types.Metadata{ + "scheme": "Bearer", + "token": "abcdefg", + }, + }, + wantErr: nil, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var a AuthConfig + err := a.ValidateConfiguration(tt.args.inputFormat, tt.args.input) + if tt.wantErr != nil { + assert.ErrorContains(t, err, tt.wantErr.Error()) + } else { + assert.NoError(t, err) + } + }) + } +} + +func TestAuthConfig_OmitInformation(t *testing.T) { + t.Run("invalid output format", func(t *testing.T) { + input := types.Metadata{ + "authentication": types.Metadata{ + "scheme": "Bearer", + "token": "abcdefg", + }, + } + + var a AuthConfig + + _, err := a.OmitInformation("blah", input) + assert.Error(t, err) + }) + t.Run("successfully stripped the secret token", func(t *testing.T) { + input := types.Metadata{ + "authentication": types.Metadata{ + "scheme": "Bearer", + "token": "abcdefg", + }, + } + + want := types.Metadata{ + "authentication": types.Metadata{ + "scheme": "Bearer", + "token": "", + }, + } + + var a AuthConfig + + got, err := a.OmitInformation("object", input) + require.NoError(t, err) + assert.Equal(t, want, got) + }) +} + +func TestAuthConfig_EncodeInformation(t *testing.T) { + t.Run("invalid output format", func(t *testing.T) { + input := types.Metadata{ + "authentication": types.Metadata{ + "scheme": "Bearer", + "token": "abcdefg", + }, + } + + a := AuthConfig{ + encryptionService: authentication_type.NewPasswordService(nil, "test"), + } + + _, err := a.EncodeInformation("blah", input) + assert.Error(t, err) + }) + + t.Run("successfully encrypted token", func(t *testing.T) { + input := types.Metadata{ + "authentication": types.Metadata{ + "scheme": "Bearer", + "token": "abcdefg", + }, + } + + a := AuthConfig{ + encryptionService: authentication_type.NewPasswordService(nil, "test"), + } + + _, err := a.EncodeInformation("object", input) + require.NoError(t, err) + }) +} + +func TestAuthConfig_DecodeInformation(t *testing.T) { + t.Run("invalid output format", func(t *testing.T) { + input := types.Metadata{ + "authentication": types.Metadata{ + "scheme": "Bearer", + "token": "dca8757dee5dfcc592c97355396dc2bdb95c6a3f58d4acb4453717c960827602acaf49", + }, + } + + a := AuthConfig{ + encryptionService: authentication_type.NewPasswordService(nil, "test"), + } + + _, err := a.DecodeInformation("blah", input) + assert.Error(t, err) + }) + + t.Run("successfully decrypted token", func(t *testing.T) { + input := types.Metadata{ + "authentication": types.Metadata{ + "scheme": "Bearer", + "token": "dca8757dee5dfcc592c97355396dc2bdb95c6a3f58d4acb4453717c960827602acaf49", + }, + } + + want := types.Metadata{ + "authentication": types.Metadata{ + "scheme": "Bearer", + "token": "abcdefg", + }, + } + + a := AuthConfig{ + encryptionService: authentication_type.NewPasswordService(nil, "test"), + } + + got, err := a.DecodeInformation("object", input) + require.NoError(t, err) + assert.Equal(t, want, got) + }) +} diff --git a/sinks/migrate/m1_upgrade_config.go b/sinks/migrate/m1_upgrade_config.go index be7f9bd2f..1920e8533 100644 --- a/sinks/migrate/m1_upgrade_config.go +++ b/sinks/migrate/m1_upgrade_config.go @@ -31,7 +31,7 @@ func (p *Plan1UpdateConfiguration) Version() string { } func (p *Plan1UpdateConfiguration) Up(ctx context.Context) (mainErr error) { - allSinks, mainErr := p.sinkRepo.SearchAllSinks(ctx, sinks.Filter{StateFilter: "", OpenTelemetry: "enabled"}) + allSinks, mainErr := p.sinkRepo.SearchAllSinks(ctx, sinks.Filter{}) if mainErr != nil { p.logger.Error("could not list sinks", zap.Error(mainErr)) return diff --git a/sinks/postgres/sinks.go b/sinks/postgres/sinks.go index 786dd0c79..a915d13b4 100644 --- a/sinks/postgres/sinks.go +++ b/sinks/postgres/sinks.go @@ -106,23 +106,11 @@ func (s sinksRepository) SearchAllSinks(ctx context.Context, filter sinks.Filter if err := rows.StructScan(&dbSink); err != nil { return nil, errors.Wrap(errors.ErrSelectEntity, err) } - sink, err := toSink(dbSink) if err != nil { return nil, errors.Wrap(errors.ErrSelectEntity, err) } - // metadataFilters will apply only after Fetching in metadata, due to struct - filterFunc := func(key string, value interface{}) bool { - if key == sinks.MetadataLabelOtel { - if value.(string) == filter.OpenTelemetry { - return true - } - } - return false - } - if sink.Config.IsApplicable(filterFunc) { - items = append(items, sink) - } + items = append(items, sink) } return items, err @@ -219,7 +207,7 @@ func (s sinksRepository) RetrieveAllByOwnerID(ctx context.Context, owner string, return sinks.Page{}, errors.Wrap(errors.ErrSelectEntity, err) } - q := fmt.Sprintf(`SELECT id, name, mf_owner_id, description, tags, state, coalesce(error, '') as error, backend, metadata, ts_created + q := fmt.Sprintf(`SELECT id, name, mf_owner_id, description, tags, state, coalesce(error, '') as error, backend, metadata, config_data, format, ts_created FROM sinks WHERE mf_owner_id = :mf_owner_id %s%s%s ORDER BY %s %s LIMIT :limit OFFSET :offset;`, @@ -403,6 +391,16 @@ func toDBSink(sink sinks.Sink) (dbSink, error) { } func toSink(dba dbSink) (sinks.Sink, error) { + var configData string + if dba.ConfigData != nil { + configData = *dba.ConfigData + } + + format := "json" + if dba.Format != nil && *dba.Format != "" { + format = *dba.Format + } + sink := sinks.Sink{ ID: dba.ID, Name: dba.Name, @@ -412,6 +410,8 @@ func toSink(dba dbSink) (sinks.Sink, error) { State: dba.State, Error: dba.Error, Config: types.Metadata(dba.Metadata), + ConfigData: configData, + Format: format, Created: dba.Created, Tags: types.Tags(dba.Tags), } diff --git a/sinks/redis/producer/streams.go b/sinks/redis/producer/streams.go index 01b68dff4..f6fa93579 100644 --- a/sinks/redis/producer/streams.go +++ b/sinks/redis/producer/streams.go @@ -33,7 +33,7 @@ type sinksStreamProducer struct { } // ListSinksInternal will only call following service -func (es sinksStreamProducer) ListSinksInternal(ctx context.Context, filter sinks.Filter) ([]sinks.Sink, error) { +func (es sinksStreamProducer) ListSinksInternal(ctx context.Context, filter sinks.Filter) (sinks.Page, error) { return es.svc.ListSinksInternal(ctx, filter) } diff --git a/sinks/service.go b/sinks/service.go index 24c73a174..31a5e9b6a 100644 --- a/sinks/service.go +++ b/sinks/service.go @@ -10,16 +10,19 @@ package sinks import ( "context" + "time" + "github.com/mainflux/mainflux" mfsdk "github.com/mainflux/mainflux/pkg/sdk/go" + "go.uber.org/zap" + "github.com/orb-community/orb/pkg/errors" "github.com/orb-community/orb/pkg/types" "github.com/orb-community/orb/sinks/authentication_type" "github.com/orb-community/orb/sinks/authentication_type/basicauth" + "github.com/orb-community/orb/sinks/authentication_type/bearertokenauth" "github.com/orb-community/orb/sinks/backend/otlphttpexporter" "github.com/orb-community/orb/sinks/backend/prometheus" - "go.uber.org/zap" - "time" ) // PageMetadata contains page metadata that helps navigation @@ -67,7 +70,7 @@ func NewSinkService(logger *zap.Logger, auth mainflux.AuthServiceClient, sinkRep otlphttpexporter.Register() prometheus.Register() basicauth.Register(passwordService) - // bearerauth.Register(passwordService) + bearertokenauth.Register(passwordService) return &sinkService{ logger: logger, auth: auth, diff --git a/sinks/sinks.go b/sinks/sinks.go index a5e8bf29e..7d20e3822 100644 --- a/sinks/sinks.go +++ b/sinks/sinks.go @@ -72,8 +72,7 @@ var stateMap = [...]string{ const MetadataLabelOtel = "opentelemetry" type Filter struct { - StateFilter string - OpenTelemetry string + StateFilter string } var stateRevMap = map[string]State{ @@ -162,7 +161,7 @@ type SinkService interface { // ListSinks retrieves data about sinks ListSinks(ctx context.Context, token string, pm PageMetadata) (Page, error) // ListSinksInternal retrieves data from sinks filtered by SinksFilter for Services like Maestro, to build DeploymentEntries - ListSinksInternal(ctx context.Context, filter Filter) ([]Sink, error) + ListSinksInternal(ctx context.Context, filter Filter) (Page, error) // ListBackends retrieves a list of available backends ListBackends(ctx context.Context, token string) ([]string, error) // ViewBackend retrieves a backend by the name diff --git a/sinks/sinks_internal_test.go b/sinks/sinks_internal_test.go index 98adf9659..e7fbd5b43 100644 --- a/sinks/sinks_internal_test.go +++ b/sinks/sinks_internal_test.go @@ -43,7 +43,7 @@ func Test_sinkService_validateBackend(t *testing.T) { Backend: "prometheus", Config: nil, Format: "yaml", - ConfigData: "authentication:\n type: basicauth\n password: \"password\"\n username: \"user\"\nexporter:\n remote_host: \"https://acme.com/api/prom/push\"\nopentelemetry: enabled\n", + ConfigData: "authentication:\n type: basicauth\n password: \"password\"\n username: \"user\"\nexporter:\n remote_host: \"https://acme.com/api/prom/push\"\n", }, }, wantBe: reflect.TypeOf(&prometheus.Backend{}), @@ -61,7 +61,7 @@ func Test_sinkService_validateBackend(t *testing.T) { Backend: "otlphttp", Config: nil, Format: "yaml", - ConfigData: "authentication:\n type: basicauth\n password: \"password\"\n username: \"user\"\nexporter:\n endpoint: \"https://acme.com/api/prom/push\"\nopentelemetry: enabled\n", + ConfigData: "authentication:\n type: basicauth\n password: \"password\"\n username: \"user\"\nexporter:\n endpoint: \"https://acme.com/api/prom/push\"\n", }, }, wantBe: reflect.TypeOf(&otlphttpexporter.OTLPHTTPBackend{}), diff --git a/sinks/sinks_service.go b/sinks/sinks_service.go index c10be9d17..b181ed840 100644 --- a/sinks/sinks_service.go +++ b/sinks/sinks_service.go @@ -11,6 +11,7 @@ package sinks import ( "context" "encoding/hex" + "encoding/json" "github.com/orb-community/orb/pkg/errors" "github.com/orb-community/orb/pkg/types" @@ -49,17 +50,16 @@ func (svc sinkService) CreateSink(ctx context.Context, token string, sink Sink) Exporter: be, } + if sink.Format == "" { + sink.Format = "json" + } + // encrypt data for the password sink, err = svc.encryptMetadata(cfg, sink) if err != nil { return Sink{}, err } - // add default values - defaultMetadata := make(types.Metadata, 1) - defaultMetadata["opentelemetry"] = "enabled" - sink.Config.Merge(defaultMetadata) - id, err := svc.sinkRepo.Save(ctx, sink) if err != nil { return Sink{}, errors.Wrap(ErrCreateSink, err) @@ -96,12 +96,12 @@ func validateAuthType(s *Sink) (authentication_type.AuthenticationType, error) { } if _, ok := authTypeStr.(string); !ok { - return nil, errors.Wrap(errors.ErrInvalidAuthType, errors.New("invalid authentication type")) + return nil, errors.Wrap(errors.ErrAuthInvalidType, errors.New("invalid authentication type")) } authType, ok := authentication_type.GetAuthType(authTypeStr.(string)) if !ok { - return nil, errors.Wrap(errors.ErrInvalidAuthType, errors.New("invalid authentication type")) + return nil, errors.Wrap(errors.ErrAuthInvalidType, errors.New("invalid authentication type")) } err := authType.ValidateConfiguration("object", authMetadata) @@ -215,10 +215,6 @@ func (svc sinkService) UpdateSinkInternal(ctx context.Context, sink Sink) (Sink, Authentication: at, Exporter: be, } - //// add default values - defaultMetadata := make(types.Metadata, 1) - defaultMetadata["opentelemetry"] = "enabled" - sink.Config.Merge(defaultMetadata) sink.State = Unknown sink.Error = "" if sink.Format == "yaml" { @@ -293,7 +289,15 @@ func (svc sinkService) UpdateSink(ctx context.Context, token string, sink Sink) if sink.Config == nil && sink.ConfigData == "" { // No config sent, keep the previous sink.Config = currentSink.Config + sink.Format = currentSink.Format + sink.Config.RemoveKeys([]string{"opentelemetry"}) sink.ConfigData = currentSink.ConfigData + if sink.Format != "" { + sink.ConfigData, err = removeConfigDataKey(sink.ConfigData, sink.Format, []string{"opentelemetry"}) + if err != nil { + svc.logger.Warn("error removing opentelemetry config key", zap.Error(err)) + } + } } else { sink.Backend = currentSink.Backend be, err := svc.validateBackend(&sink) @@ -308,6 +312,9 @@ func (svc sinkService) UpdateSink(ctx context.Context, token string, sink Sink) Authentication: at, Exporter: be, } + if sink.Format == "" { + sink.Format = "json" + } // check if the password is encrypted and decrypt it if it is if existingAuth := sink.Config.GetSubMetadata(authentication_type.AuthenticationKey); existingAuth != nil { @@ -321,10 +328,6 @@ func (svc sinkService) UpdateSink(ctx context.Context, token string, sink Sink) } } - // add default values - defaultMetadata := make(types.Metadata, 1) - defaultMetadata["opentelemetry"] = "enabled" - sink.Config.Merge(defaultMetadata) if sink.Format == "yaml" { configDataByte, err := yaml.Marshal(sink.Config) if err != nil { @@ -371,7 +374,37 @@ func (svc sinkService) UpdateSink(ctx context.Context, token string, sink Sink) return sinkEdited, nil } -func (svc sinkService) ListBackends(ctx context.Context, token string) ([]string, error) { +func removeConfigDataKey(configData string, format string, keys []string) (string, error) { + if configData == "" { + return "", nil + } + var data types.Metadata + switch format { + case "json": + if err := json.Unmarshal([]byte(configData), &keys); err != nil { + return "", err + } + data.RemoveKeys(keys) + if newData, err := json.Marshal(data); err != nil { + return "", err + } else { + return string(newData), nil + } + case "yaml": + if err := yaml.Unmarshal([]byte(configData), &keys); err != nil { + return "", err + } + data.RemoveKeys(keys) + if newData, err := yaml.Marshal(data); err != nil { + return "", err + } else { + return string(newData), nil + } + } + return "", errors.New("unrecognized format") +} + +func (svc sinkService) ListBackends(_ context.Context, token string) ([]string, error) { _, err := svc.identify(token) if err != nil { return []string{}, err @@ -379,7 +412,7 @@ func (svc sinkService) ListBackends(ctx context.Context, token string) ([]string return backend.GetList(), nil } -func (svc sinkService) ViewBackend(ctx context.Context, token string, key string) (backend.Backend, error) { +func (svc sinkService) ViewBackend(_ context.Context, token string, key string) (backend.Backend, error) { _, err := svc.identify(token) if err != nil { return nil, err @@ -400,6 +433,9 @@ func (svc sinkService) ViewSink(ctx context.Context, token string, key string) ( if err != nil { return Sink{}, errors.Wrap(errors.ErrNotFound, err) } + if res.Format == "" { + res.Format = "json" + } return res, nil } @@ -414,6 +450,9 @@ func (svc sinkService) ViewSinkInternal(ctx context.Context, ownerID string, key Authentication: authType, Exporter: be, } + if res.Format == "" { + res.Format = "json" + } res, err = svc.decryptMetadata(cfg, res) if err != nil { return Sink{}, errors.Wrap(errors.ErrViewEntity, err) @@ -421,10 +460,10 @@ func (svc sinkService) ViewSinkInternal(ctx context.Context, ownerID string, key return res, nil } -func (svc sinkService) ListSinksInternal(ctx context.Context, filter Filter) (sinks []Sink, err error) { - sinks, err = svc.sinkRepo.SearchAllSinks(ctx, filter) +func (svc sinkService) ListSinksInternal(ctx context.Context, filter Filter) (sinksResp Page, err error) { + sinks, err := svc.sinkRepo.SearchAllSinks(ctx, filter) if err != nil { - return nil, errors.Wrap(errors.ErrNotFound, err) + return Page{}, errors.Wrap(errors.ErrNotFound, err) } for _, sink := range sinks { authType, _ := authentication_type.GetAuthType(sink.GetAuthenticationTypeName()) @@ -433,10 +472,14 @@ func (svc sinkService) ListSinksInternal(ctx context.Context, filter Filter) (si Authentication: authType, Exporter: be, } + if sink.Format == "" { + sink.Format = "json" + } sink, err = svc.decryptMetadata(cfg, sink) if err != nil { - return nil, errors.Wrap(errors.ErrViewEntity, err) + return Page{}, errors.Wrap(errors.ErrViewEntity, err) } + sinksResp.Sinks = append(sinksResp.Sinks, sink) } return diff --git a/ui/src/app/common/interfaces/orb/agent.policy.interface.ts b/ui/src/app/common/interfaces/orb/agent.policy.interface.ts index 04b4454e3..43d28ce23 100644 --- a/ui/src/app/common/interfaces/orb/agent.policy.interface.ts +++ b/ui/src/app/common/interfaces/orb/agent.policy.interface.ts @@ -20,7 +20,6 @@ export enum AgentPolicyUsage { export enum AgentPolicyBackend { pktvisor = 'pktvisor', - diode = 'diode', otel = 'otel', } diff --git a/ui/src/app/pages/datasets/policies.agent/add/agent.policy.add.component.ts b/ui/src/app/pages/datasets/policies.agent/add/agent.policy.add.component.ts index 01e2b9d34..0f94148d3 100644 --- a/ui/src/app/pages/datasets/policies.agent/add/agent.policy.add.component.ts +++ b/ui/src/app/pages/datasets/policies.agent/add/agent.policy.add.component.ts @@ -8,7 +8,7 @@ import { AgentPoliciesService } from 'app/common/services/agents/agent.policies. import { STRINGS } from '../../../../../assets/text/strings'; import { Tags } from 'app/common/interfaces/orb/tag'; import { CodeEditorService } from 'app/common/services/code.editor.service'; -import { POLICY_DIODE_CONFIG_JSON, POLICY_DIODE_CONFIG_YAML, POLICY_OTEL_CONFIG_JSON, POLICY_OTEL_CONFIG_YAML, POLICY_PKTVISOR_CONFIG_JSON, POLICY_PKTVISOR_CONFIG_YAML } from 'app/shared/configurations/configurations_schemas'; +import { POLICY_EMPTY_CONFIG_JSON, POLICY_EMPTY_CONFIG_YAML, POLICY_OTEL_CONFIG_JSON, POLICY_OTEL_CONFIG_YAML, POLICY_PKTVISOR_CONFIG_JSON, POLICY_PKTVISOR_CONFIG_YAML } from 'app/shared/configurations/configurations_schemas'; const CONFIG = { TAPS: 'TAPS', BACKEND: 'BACKEND', @@ -346,8 +346,8 @@ export class AgentPolicyAddComponent implements OnInit { this.codejson = POLICY_PKTVISOR_CONFIG_JSON; } else { - this.codeyaml = POLICY_DIODE_CONFIG_YAML; - this.codejson = POLICY_DIODE_CONFIG_JSON; + this.codeyaml = POLICY_EMPTY_CONFIG_YAML; + this.codejson = POLICY_EMPTY_CONFIG_JSON; } } } diff --git a/ui/src/app/pages/sinks/add/sink-add.component.ts b/ui/src/app/pages/sinks/add/sink-add.component.ts index 71ac47e5f..66cdc096e 100644 --- a/ui/src/app/pages/sinks/add/sink-add.component.ts +++ b/ui/src/app/pages/sinks/add/sink-add.component.ts @@ -79,14 +79,7 @@ export class SinkAddComponent { return !this.editor.checkEmpty(config.authentication) && !this.editor.checkEmpty(config.exporter) - && detailsValid - && !this.checkString(config); - } - checkString(config: any): boolean { - if (typeof config.authentication.password !== 'string' || typeof config.authentication.username !== 'string') { - return true; - } - return false; + && detailsValid; } createSink() { diff --git a/ui/src/app/shared/configurations/configurations_schemas.ts b/ui/src/app/shared/configurations/configurations_schemas.ts index 173769483..51f2d8fd3 100644 --- a/ui/src/app/shared/configurations/configurations_schemas.ts +++ b/ui/src/app/shared/configurations/configurations_schemas.ts @@ -80,10 +80,9 @@ export const POLICY_PKTVISOR_CONFIG_JSON = "kind": "collection" }`; -// yet to be defined -export const POLICY_DIODE_CONFIG_YAML = ``; +export const POLICY_EMPTY_CONFIG_YAML = ``; -export const POLICY_DIODE_CONFIG_JSON = +export const POLICY_EMPTY_CONFIG_JSON = `{ }`;