From 6848f23615caba4abd1c231aad054dc42dd5213b Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Tue, 2 Jul 2024 17:14:09 -0700 Subject: [PATCH 01/17] hubble-469: create go integration tests for ledger exporter sub commands, standalone network, fake gcs --- .github/workflows/horizon.yml | 3 +- exp/services/ledgerexporter/Makefile | 26 -- exp/services/ledgerexporter/README.md | 15 + .../ledgerexporter/docker/config.test.toml | 13 - .../ledgerexporter/internal/config.go | 4 +- .../internal/integration_test.go | 269 ++++++++++++++++++ .../test/integration_captive_core.cfg | 18 ++ .../test/integration_config_template.toml | 14 + go.mod | 72 +++-- go.sum | 174 ++++++----- 10 files changed, 469 insertions(+), 139 deletions(-) delete mode 100644 exp/services/ledgerexporter/docker/config.test.toml create mode 100644 exp/services/ledgerexporter/internal/integration_test.go create mode 100644 exp/services/ledgerexporter/internal/test/integration_captive_core.cfg create mode 100644 exp/services/ledgerexporter/internal/test/integration_config_template.toml diff --git a/.github/workflows/horizon.yml b/.github/workflows/horizon.yml index 3ea92c8b17..f5e77c6c6b 100644 --- a/.github/workflows/horizon.yml +++ b/.github/workflows/horizon.yml @@ -154,6 +154,7 @@ jobs: runs-on: ubuntu-latest env: STELLAR_CORE_VERSION: 21.0.0-1872.c6f474133.focal + LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED: "true" steps: - uses: actions/checkout@v3 with: @@ -163,7 +164,7 @@ jobs: run: make -C exp/services/ledgerexporter docker-build - name: Run Ledger Exporter test - run: make -C exp/services/ledgerexporter docker-test + run: go test -v -race ./exp/services/ledgerexporter/... # Push images - if: github.ref == 'refs/heads/master' diff --git a/exp/services/ledgerexporter/Makefile b/exp/services/ledgerexporter/Makefile index 971fc3eb25..3890a56fcf 100644 --- a/exp/services/ledgerexporter/Makefile +++ b/exp/services/ledgerexporter/Makefile @@ -14,32 +14,6 @@ $(if $(STELLAR_CORE_VERSION), --build-arg STELLAR_CORE_VERSION=$(STELLAR_CORE_VE -t $(DOCKER_IMAGE):$(VERSION) \ -t $(DOCKER_IMAGE):latest . -docker-clean: - $(SUDO) docker stop fake-gcs-server || true - $(SUDO) docker rm fake-gcs-server || true - $(SUDO) rm -rf ${PWD}/storage || true - $(SUDO) docker network rm test-network || true - -docker-test: docker-clean - # Create temp storage dir - $(SUDO) mkdir -p ${PWD}/storage/exporter-test - - # Create test network for docker - $(SUDO) docker network create test-network - - # Run the fake GCS server - $(SUDO) docker run -d --name fake-gcs-server -p 4443:4443 \ - -v ${PWD}/storage:/data --network test-network fsouza/fake-gcs-server -scheme http - - # Run the ledger-exporter - $(SUDO) docker run --platform linux/amd64 -t --network test-network\ - -v ${PWD}/exp/services/ledgerexporter/docker/config.test.toml:/config.toml \ - -e STORAGE_EMULATOR_HOST=http://fake-gcs-server:4443 \ - $(DOCKER_IMAGE):$(VERSION) \ - scan-and-fill --start 1000 --end 2000 - - $(MAKE) docker-clean - docker-push: $(SUDO) docker push $(DOCKER_IMAGE):$(VERSION) $(SUDO) docker push $(DOCKER_IMAGE):latest diff --git a/exp/services/ledgerexporter/README.md b/exp/services/ledgerexporter/README.md index 57757508e1..2299b0f45f 100644 --- a/exp/services/ledgerexporter/README.md +++ b/exp/services/ledgerexporter/README.md @@ -99,3 +99,18 @@ with `ledgers_per_file = 64` and `files_per_partition = 10`: - To locate a specific ledger sequence, calculate the partition name and ledger file name using `files_per_partition` and `ledgers_per_file`. - The `GetObjectKeyFromSequenceNumber` function automates this calculation. +#### Running Integration Tests: +from top directory of stellar/go repo, run go test to launch ledger exporter integration +tests. + +`LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED=true` is required environment variable to allow +tests to run. + +Optional, tests will try to run `stellar-core` from o/s PATH for captive core, if not resolvable, then set `LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN=/path/to/stellar-core` + +Optional, can override the version of quickstart used to run standalone stellar network, p `LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE=docker.io/stellar/quickstart:`. Ideally don't need to change this, but is available. + +``` +$ LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED=true go test -v -race -run TestLedgerExporterTestSuite ./exp/services/ledgerexporter/... +``` + diff --git a/exp/services/ledgerexporter/docker/config.test.toml b/exp/services/ledgerexporter/docker/config.test.toml deleted file mode 100644 index c5c4519f0b..0000000000 --- a/exp/services/ledgerexporter/docker/config.test.toml +++ /dev/null @@ -1,13 +0,0 @@ -[datastore_config] -type = "GCS" - -[datastore_config.params] -destination_bucket_path = "exporter-test/ledgers/testnet" - -[datastore_config.schema] -ledgers_per_file = 1 -files_per_partition = 64000 - -[stellar_core_config] - network = "testnet" - diff --git a/exp/services/ledgerexporter/internal/config.go b/exp/services/ledgerexporter/internal/config.go index d5aad53256..9b0225549e 100644 --- a/exp/services/ledgerexporter/internal/config.go +++ b/exp/services/ledgerexporter/internal/config.go @@ -98,8 +98,8 @@ func NewConfig(settings RuntimeSettings, getCoreVersionFn ledgerbackend.CoreBuil } logger.Infof("Network Config Archive URLs: %v", config.StellarCoreConfig.HistoryArchiveUrls) logger.Infof("Network Config Archive Passphrase: %v", config.StellarCoreConfig.NetworkPassphrase) - logger.Infof("Network Config Archive Stellar Core Binary Path: %v", config.StellarCoreConfig.StellarCoreBinaryPath) - logger.Infof("Network Config Archive Stellar Core Toml Config: %v", string(config.SerializedCaptiveCoreToml)) + logger.Infof("Network Config Stellar Core Binary Path: %v", config.StellarCoreConfig.StellarCoreBinaryPath) + logger.Infof("Network Config Stellar Core Toml Config: %v", string(config.SerializedCaptiveCoreToml)) return config, nil } diff --git a/exp/services/ledgerexporter/internal/integration_test.go b/exp/services/ledgerexporter/internal/integration_test.go new file mode 100644 index 0000000000..edaceec023 --- /dev/null +++ b/exp/services/ledgerexporter/internal/integration_test.go @@ -0,0 +1,269 @@ +package ledgerexporter + +import ( + "bytes" + "context" + "io" + "os" + "os/signal" + "path/filepath" + "testing" + "time" + + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/image" + "github.com/docker/docker/client" + "github.com/docker/go-connections/nat" + "github.com/pkg/errors" + + "github.com/pelletier/go-toml" + "github.com/stretchr/testify/suite" + + "github.com/fsouza/fake-gcs-server/fakestorage" + "github.com/stellar/go/historyarchive" + "github.com/stellar/go/support/datastore" + "github.com/stellar/go/support/storage" +) + +const ( + maxWaitForCoreStartup = (30 * time.Second) + coreStartupPingInterval = time.Second +) + +func TestLedgerExporterTestSuite(t *testing.T) { + if os.Getenv("LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED") != "true" { + t.Skip("skipping integration test: LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED not true") + } + + defineCommands() + + ledgerExporterSuite := &LedgerExporterTestSuite{} + suite.Run(t, ledgerExporterSuite) +} + +type LedgerExporterTestSuite struct { + suite.Suite + tempConfigFile string + ctx context.Context + ctxStop context.CancelFunc + coreContainerId string + coreHttpPort int + dockerCli *client.Client + gcsServer *fakestorage.Server +} + +func (s *LedgerExporterTestSuite) TestScanAndFill() { + require := s.Require() + + rootCmd.SetArgs([]string{"scan-and-fill", "--start", "4", "--end", "5", "--config-file", s.tempConfigFile}) + var errWriter io.Writer = &bytes.Buffer{} + var outWriter io.Writer = &bytes.Buffer{} + rootCmd.SetErr(errWriter) + rootCmd.SetOut(outWriter) + err := rootCmd.ExecuteContext(s.ctx) + require.NoError(err) + + output := outWriter.(*bytes.Buffer).String() + errOutput := errWriter.(*bytes.Buffer).String() + s.T().Log(output) + s.T().Log(errOutput) + + datastore, err := datastore.NewGCSDataStore(s.ctx, "integration-test/standalone") + require.NoError(err) + + _, err = datastore.GetFile(s.ctx, "FFFFFFFF--0-9/FFFFFFFA--5.xdr.zstd") + require.NoError(err) +} + +func (s *LedgerExporterTestSuite) TestAppend() { + require := s.Require() + + // first populate ledgers 4-5 + rootCmd.SetArgs([]string{"scan-and-fill", "--start", "4", "--end", "5", "--config-file", s.tempConfigFile}) + err := rootCmd.ExecuteContext(s.ctx) + require.NoError(err) + + // now run an append of overalapping range, it will resume past existing ledgers 4,5 + rootCmd.SetArgs([]string{"append", "--start", "4", "--end", "7", "--config-file", s.tempConfigFile}) + var errWriter io.Writer = &bytes.Buffer{} + var outWriter io.Writer = &bytes.Buffer{} + rootCmd.SetErr(errWriter) + rootCmd.SetOut(outWriter) + err = rootCmd.ExecuteContext(s.ctx) + require.NoError(err) + + output := outWriter.(*bytes.Buffer).String() + errOutput := errWriter.(*bytes.Buffer).String() + s.T().Log(output) + s.T().Log(errOutput) + + datastore, err := datastore.NewGCSDataStore(s.ctx, "integration-test/standalone") + require.NoError(err) + + _, err = datastore.GetFile(s.ctx, "FFFFFFFF--0-9/FFFFFFF8--7.xdr.zstd") + require.NoError(err) +} + +func (s *LedgerExporterTestSuite) SetupSuite() { + var err error + t := s.T() + + s.ctx, s.ctxStop = signal.NotifyContext(context.Background(), os.Interrupt, os.Kill) + + ledgerExporterConfigTemplate, err := toml.LoadFile("test/integration_config_template.toml") + if err != nil { + t.Fatalf("unable to load config template file %v", err) + } + + // if LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN specified, + // ledgerexporter will attempt resolve core bin using 'stellar-core' from OS path + ledgerExporterConfigTemplate.Set("stellar_core_config.stellar_core_binary_path", + os.Getenv("LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN")) + + tomlBytes, err := toml.Marshal(ledgerExporterConfigTemplate) + if err != nil { + t.Fatalf("unable to load config file %v", err) + } + testTempDir := t.TempDir() + tempSeedDataPath := filepath.Join(testTempDir, "data") + if err = os.MkdirAll(filepath.Join(tempSeedDataPath, "integration-test"), 0777); err != nil { + t.Fatalf("unable to create seed data in temp path, %v", err) + } + + s.tempConfigFile = filepath.Join(testTempDir, "config.toml") + err = os.WriteFile(s.tempConfigFile, tomlBytes, 0777) + if err != nil { + t.Fatalf("unable to write temp config file %v, %v", s.tempConfigFile, err) + } + + testWriter := &testWriter{test: t} + opts := fakestorage.Options{ + Scheme: "http", + Host: "127.0.0.1", + Port: uint16(0), + Writer: testWriter, + Seed: tempSeedDataPath, + StorageRoot: filepath.Join(testTempDir, "bucket"), + PublicHost: "127.0.0.1", + } + + s.gcsServer, err = fakestorage.NewServerWithOptions(opts) + + if err != nil { + t.Fatalf("couldn't start the fake gcs http server %v", err) + } + + t.Logf("fake gcs server started at %v", s.gcsServer.URL()) + t.Setenv("STORAGE_EMULATOR_HOST", s.gcsServer.URL()) + + quickstartImage := os.Getenv("LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE") + if quickstartImage == "" { + quickstartImage = "stellar/quickstart:testing" + } + s.mustStartCore(t, quickstartImage) + s.mustWaitForCore(t, ledgerExporterConfigTemplate.GetArray("stellar_core_config.history_archive_urls").([]string), + ledgerExporterConfigTemplate.Get("stellar_core_config.network_passphrase").(string)) +} + +func (s *LedgerExporterTestSuite) TearDownSuite() { + if s.coreContainerId != "" { + if err := s.dockerCli.ContainerStop(context.Background(), s.coreContainerId, container.StopOptions{}); err != nil { + s.T().Logf("unable to stop core container, %v, %v", s.coreContainerId, err) + } + s.dockerCli.Close() + } + if s.gcsServer != nil { + s.gcsServer.Stop() + } + s.ctxStop() +} + +func (s *LedgerExporterTestSuite) mustStartCore(t *testing.T, quickstartImage string) { + var err error + s.dockerCli, err = client.NewClientWithOpts(client.WithAPIVersionNegotiation()) + if err != nil { + t.Fatalf("could not create docker client, %v", err) + } + + img, err := s.dockerCli.ImagePull(s.ctx, quickstartImage, image.PullOptions{}) + if err != nil { + t.Fatalf("could not pull docker image, %v, %v", quickstartImage, err) + } + img.Close() + + resp, err := s.dockerCli.ContainerCreate(s.ctx, + &container.Config{ + Image: quickstartImage, + Cmd: []string{"--enable", "core", "--local"}, + AttachStdout: true, + AttachStderr: true, + ExposedPorts: nat.PortSet{ + nat.Port("1570/tcp"): {}, + nat.Port("11625/tcp"): {}, + }, + }, + + &container.HostConfig{ + PortBindings: nat.PortMap{ + nat.Port("1570/tcp"): {nat.PortBinding{HostIP: "127.0.0.1", HostPort: "1570"}}, + nat.Port("11625/tcp"): {nat.PortBinding{HostIP: "127.0.0.1", HostPort: "11625"}}, + }, + AutoRemove: true, + }, + nil, nil, "") + + if err != nil { + t.Fatalf("could not create quickstart docker container, %v, error %v", quickstartImage, err) + } + s.coreContainerId = resp.ID + + if err := s.dockerCli.ContainerStart(s.ctx, resp.ID, container.StartOptions{}); err != nil { + t.Fatalf("could not run quickstart docker container, %v, error %v", quickstartImage, err) + } +} + +func (s *LedgerExporterTestSuite) mustWaitForCore(t *testing.T, archiveUrls []string, passphrase string) { + t.Log("Waiting for core to be up...") + //coreClient := &stellarcore.Client{URL: "http://localhost:" + strconv.Itoa(s.coreHttpPort)} + startTime := time.Now() + infoTime := startTime + archive, err := historyarchive.NewArchivePool(archiveUrls, historyarchive.ArchiveOptions{ + NetworkPassphrase: passphrase, + // due to ARTIFICIALLY_ACCELERATE_TIME_FOR_TESTING that is done by quickstart's local network + CheckpointFrequency: 8, + ConnectOptions: storage.ConnectOptions{ + Context: s.ctx, + }, + }) + if err != nil { + t.Fatalf("unable to create archive pool against core, %v", err) + } + for time.Since(startTime) < maxWaitForCoreStartup { + if durationSince := time.Since(infoTime); durationSince < coreStartupPingInterval { + time.Sleep(coreStartupPingInterval - durationSince) + } + infoTime = time.Now() + has, requestErr := archive.GetRootHAS() + if errors.Is(requestErr, context.Canceled) { + break + } + if requestErr != nil { + t.Logf("request to fetch checkpoint failed: %v", requestErr) + continue + } + latestCheckpoint := has.CurrentLedger + if latestCheckpoint > 1 { + return + } + } + t.Fatalf("core did not progress ledgers within %v seconds", maxWaitForCoreStartup) +} + +type testWriter struct { + test *testing.T +} + +func (w *testWriter) Write(p []byte) (n int, err error) { + w.test.Log(string(p)) + return len(p), nil +} diff --git a/exp/services/ledgerexporter/internal/test/integration_captive_core.cfg b/exp/services/ledgerexporter/internal/test/integration_captive_core.cfg new file mode 100644 index 0000000000..03721f05ee --- /dev/null +++ b/exp/services/ledgerexporter/internal/test/integration_captive_core.cfg @@ -0,0 +1,18 @@ +# this is based on quickstart --local network settings +ARTIFICIALLY_ACCELERATE_TIME_FOR_TESTING = true +DATABASE = "sqlite3://stellar.db" +DEPRECATED_SQL_LEDGER_STATE = false +ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = true +FAILURE_SAFETY = 0 +HTTP_PORT = 11726 +LOG_FILE_PATH = "" +NETWORK_PASSPHRASE = "Standalone Network ; February 2017" +UNSAFE_QUORUM = true + +[[VALIDATORS]] + ADDRESS = "localhost:11625" + HISTORY = "curl -sf http://localhost:1570/{0} -o {1}" + HOME_DOMAIN = "core.local" + NAME = "local_core" + PUBLIC_KEY = "GCTI6HMWRH2QGMFKWVU5M5ZSOTKL7P7JAHZDMJJBKDHGWTEC4CJ7O3DU" + QUALITY = "MEDIUM" diff --git a/exp/services/ledgerexporter/internal/test/integration_config_template.toml b/exp/services/ledgerexporter/internal/test/integration_config_template.toml new file mode 100644 index 0000000000..50042c9806 --- /dev/null +++ b/exp/services/ledgerexporter/internal/test/integration_config_template.toml @@ -0,0 +1,14 @@ +[datastore_config] +type = "GCS" + +[datastore_config.params] +destination_bucket_path = "integration-test/standalone" + +[datastore_config.schema] +ledgers_per_file = 1 +files_per_partition = 10 + +[stellar_core_config] +captive_core_toml_path = "test/integration_captive_core.cfg" +history_archive_urls = ["http://localhost:1570"] +network_passphrase = "Standalone Network ; February 2017" \ No newline at end of file diff --git a/go.mod b/go.mod index 9e1caca7aa..531a7ecd3f 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.1 require ( cloud.google.com/go/firestore v1.15.0 // indirect - cloud.google.com/go/storage v1.40.0 + cloud.google.com/go/storage v1.42.0 firebase.google.com/go v3.12.0+incompatible github.com/2opremio/pretty v0.2.2-0.20230601220618-e1d5758b2a95 github.com/BurntSushi/toml v1.3.2 @@ -52,34 +52,40 @@ require ( github.com/stretchr/testify v1.9.0 github.com/tyler-smith/go-bip39 v0.0.0-20180618194314-52158e4697b8 github.com/xdrpp/goxdr v0.1.1 - google.golang.org/api v0.177.0 + google.golang.org/api v0.183.0 gopkg.in/gavv/httpexpect.v1 v1.0.0-20170111145843-40724cf1e4a0 gopkg.in/square/go-jose.v2 v2.4.1 gopkg.in/tylerb/graceful.v1 v1.2.15 ) require ( - github.com/cenkalti/backoff/v4 v4.2.1 - github.com/fsouza/fake-gcs-server v1.49.0 + github.com/cenkalti/backoff/v4 v4.3.0 + github.com/docker/docker v27.0.3+incompatible + github.com/docker/go-connections v0.5.0 + github.com/fsouza/fake-gcs-server v1.49.2 ) require ( - cloud.google.com/go/auth v0.3.0 // indirect + cloud.google.com/go/auth v0.5.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect cloud.google.com/go/compute/metadata v0.3.0 // indirect cloud.google.com/go/iam v1.1.8 // indirect - cloud.google.com/go/longrunning v0.5.6 // indirect - cloud.google.com/go/pubsub v1.37.0 // indirect + cloud.google.com/go/longrunning v0.5.7 // indirect + cloud.google.com/go/pubsub v1.38.0 // indirect github.com/andybalholm/brotli v1.0.4 // indirect github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/containerd/log v0.1.0 // indirect github.com/creachadair/mds v0.0.1 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/go-units v0.5.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/gobuffalo/packd v1.0.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect github.com/google/renameio/v2 v2.0.0 // indirect github.com/google/s2a-go v0.1.7 // indirect @@ -87,7 +93,12 @@ require ( github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/morikuni/aec v1.0.0 // indirect github.com/nxadm/tail v1.4.8 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/pkg/xattr v0.4.9 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect @@ -98,22 +109,25 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.28.0 // indirect + go.opentelemetry.io/otel/sdk v1.28.0 // indirect + go.opentelemetry.io/otel/trace v1.28.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/mod v0.13.0 // indirect + golang.org/x/mod v0.17.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/tools v0.14.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect gopkg.in/djherbis/atime.v1 v1.0.0 // indirect gopkg.in/djherbis/stream.v1 v1.3.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gotest.tools/v3 v3.5.1 // indirect ) require ( - cloud.google.com/go v0.112.2 // indirect + cloud.google.com/go v0.114.0 // indirect github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/buger/goreplay v1.3.2 @@ -124,7 +138,7 @@ require ( github.com/golang/protobuf v1.5.4 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v0.0.0-20160401233042-9235644dd9e5 // indirect - github.com/googleapis/gax-go/v2 v2.12.3 // indirect + github.com/googleapis/gax-go/v2 v2.12.4 // indirect github.com/hashicorp/golang-lru v1.0.2 github.com/imkira/go-interpol v1.1.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -146,26 +160,26 @@ require ( github.com/stretchr/objx v0.5.2 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.34.0 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20151027082146-e0fe6f683076 // indirect - github.com/xeipuuv/gojsonreference v0.0.0-20150808065054-e02fc20de94c // indirect - github.com/xeipuuv/gojsonschema v0.0.0-20161231055540-f06f290571ce // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/yalp/jsonpath v0.0.0-20150812003900-31a79c7593bb // indirect github.com/yudai/gojsondiff v0.0.0-20170107030110-7b1b7adf999d // indirect github.com/yudai/golcs v0.0.0-20150405163532-d1c525dea8ce // indirect github.com/yudai/pp v2.0.1+incompatible // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.24.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d - golang.org/x/net v0.24.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/oauth2 v0.21.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.5.0 google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda // indirect - google.golang.org/grpc v1.63.2 // indirect - google.golang.org/protobuf v1.34.1 // indirect + google.golang.org/genproto v0.0.0-20240528184218-531527333157 // indirect + google.golang.org/grpc v1.64.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index ab95f599dd..13d3a0acf0 100644 --- a/go.sum +++ b/go.sum @@ -17,10 +17,10 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb 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.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.112.2 h1:ZaGT6LiG7dBzi6zNOvVZwacaXlmf3lRqnC4DQzqyRQw= -cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= -cloud.google.com/go/auth v0.3.0 h1:PRyzEpGfx/Z9e8+lHsbkoUVXD0gnu4MNmm7Gp8TQNIs= -cloud.google.com/go/auth v0.3.0/go.mod h1:lBv6NKTWp8E3LPzmO1TbiiRKc4drLOfHsgmlH9ogv5w= +cloud.google.com/go v0.114.0 h1:OIPFAdfrFDFO2ve2U7r/H5SwSbBzEdrBdE7xkgwc+kY= +cloud.google.com/go v0.114.0/go.mod h1:ZV9La5YYxctro1HTPug5lXH/GefROyW8PPD4T8n9J8E= +cloud.google.com/go/auth v0.5.1 h1:0QNO7VThG54LUzKiQxv8C6x1YX7lUrzlAa1nVLF8CIw= +cloud.google.com/go/auth v0.5.1/go.mod h1:vbZT8GjzDf3AVqCcQmqeeM32U9HBFc32vVVAbwDsa6s= cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= @@ -37,29 +37,31 @@ cloud.google.com/go/firestore v1.15.0 h1:/k8ppuWOtNuDHt2tsRV42yI21uaGnKDEQnRFeBp cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= -cloud.google.com/go/kms v1.15.8 h1:szIeDCowID8th2i8XE4uRev5PMxQFqW+JjwYxL9h6xs= -cloud.google.com/go/kms v1.15.8/go.mod h1:WoUHcDjD9pluCg7pNds131awnH429QGvRM3N/4MyoVs= -cloud.google.com/go/longrunning v0.5.6 h1:xAe8+0YaWoCKr9t1+aWe+OeQgN/iJK1fEgZSXmjuEaE= -cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA= +cloud.google.com/go/kms v1.17.1 h1:5k0wXqkxL+YcXd4viQzTqCgzzVKKxzgrK+rCZJytEQs= +cloud.google.com/go/kms v1.17.1/go.mod h1:DCMnCF/apA6fZk5Cj4XsD979OyHAqFasPuA5Sd0kGlQ= +cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU= +cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng= 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/pubsub v1.37.0 h1:0uEEfaB1VIJzabPpwpZf44zWAKAme3zwKKxHk7vJQxQ= -cloud.google.com/go/pubsub v1.37.0/go.mod h1:YQOQr1uiUM092EXwKs56OPT650nwnawc+8/IjoUeGzQ= +cloud.google.com/go/pubsub v1.38.0 h1:J1OT7h51ifATIedjqk/uBNPh+1hkvUaH4VKbz4UuAsc= +cloud.google.com/go/pubsub v1.38.0/go.mod h1:IPMJSWSus/cu57UyR01Jqa/bNOQA+XnPF6Z4dKW4fAA= 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= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.40.0 h1:VEpDQV5CJxFmJ6ueWNsKxcr1QAYOXEgxDa+sBbJahPw= -cloud.google.com/go/storage v1.40.0/go.mod h1:Rrj7/hKlG87BLqDJYtwR0fbPld8uJPbQ2ucUMY7Ir0g= +cloud.google.com/go/storage v1.42.0 h1:4QtGpplCVt1wz6g5o1ifXd656P5z+yNgzdw1tVfp0cU= +cloud.google.com/go/storage v1.42.0/go.mod h1:HjMXRFq65pGKFn6hxj6x3HCyR41uSB72Z0SO/Vn6JFQ= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= firebase.google.com/go v3.12.0+incompatible h1:q70KCp/J0oOL8kJ8oV2j3646kV4TB8Y5IvxXC0WT1bo= firebase.google.com/go v3.12.0+incompatible/go.mod h1:xlah6XbEyW6tbfSklcfe5FHJIwjt8toICdV5Wh9ptHs= github.com/2opremio/pretty v0.2.2-0.20230601220618-e1d5758b2a95 h1:vvMDiVd621MU1Djr7Ep7OXu8gHOtsdwrI4tjnIGvpTg= github.com/2opremio/pretty v0.2.2-0.20230601220618-e1d5758b2a95/go.mod h1:Gv4NIpY67KDahg+DtIG5/2Ok4l8vzYEekiirSCH+IGA= +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/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= @@ -88,8 +90,8 @@ github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENU github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/buger/goreplay v1.3.2 h1:MFAStZZCsHMPeN5xJ11rhUtV4ZctFRgzSHTfWSWOJsg= github.com/buger/goreplay v1.3.2/go.mod h1:EyAKHxJR6K6phd0NaoPETSDbJRB/ogIw3Y15UlSbVBM= -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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d h1:S2NE3iHSwP0XV47EEXL8mWmRdEfGscSJ+7EgePNgt0s= github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= @@ -102,6 +104,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk 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/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creachadair/jrpc2 v1.1.0 h1:SgpJf0v1rVCZx68+4APv6dgsTFsIHlpgFD1NlQAWA0A= github.com/creachadair/jrpc2 v1.1.0/go.mod h1:5jN7MKwsm8qvgfTsTzLX3JIfidsAkZ1c8DZSQmp+g38= @@ -112,8 +116,16 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs 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/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/djherbis/fscache v0.10.1 h1:hDv+RGyvD+UDKyRYuLoVNbuRTnf2SrA2K3VyR1br9lk= github.com/djherbis/fscache v0.10.1/go.mod h1:yyPYtkNnnPXsW+81lAcQS6yab3G2CRfnPLotBvtbf0c= +github.com/docker/docker v27.0.3+incompatible h1:aBGI9TeQ4MPlhquTQKq9XbK79rKFVwXNUAYz9aXyEBE= +github.com/docker/docker v27.0.3+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/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.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -140,8 +152,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fsouza/fake-gcs-server v1.49.0 h1:4x1RxKuqoqhZrXogtj5nInQnIjQylxld43tKrkPHnmE= -github.com/fsouza/fake-gcs-server v1.49.0/go.mod h1:FJYZxdHQk2nGxrczFjLbDv8h6SnYXxSxcnM14eeespA= +github.com/fsouza/fake-gcs-server v1.49.2 h1:fukDqzEQM50QkA0jAbl6cLqeDu3maQjwZBuys759TR4= +github.com/fsouza/fake-gcs-server v1.49.2/go.mod h1:17SYzJEXRcaAA5ATwwvgBkSIqIy7r1icnGM0y/y4foY= github.com/gavv/monotime v0.0.0-20161010190848-47d58efa6955 h1:gmtGRvSexPU4B1T/yYo0sLOKzER1YT+b4kPxPpm0Ty4= github.com/gavv/monotime v0.0.0-20161010190848-47d58efa6955/go.mod h1:vmp8DIyckQMXOPl0AQVHt+7n5h7Gb7hS6CUydiV8QeA= github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= @@ -156,8 +168,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 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-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -174,6 +186,8 @@ github.com/gobuffalo/packr/v2 v2.8.3 h1:xE1yzvnO56cUC0sTpKR3DIbxZgB54AftTFMhB2XE github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXsOdiU5KwbKc= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +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 v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -230,8 +244,8 @@ github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPg 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/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= 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= @@ -256,8 +270,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= 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/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= -github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= +github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= +github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -269,6 +283,8 @@ github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0= github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= github.com/guregu/null v4.0.0+incompatible h1:4zw0ckM7ECd6FNNddc3Fu4aty9nTlpkkzH7dPn4/4Gw= github.com/guregu/null v4.0.0+incompatible/go.mod h1:ePGpQaN9cw0tj45IR5E5ehMvsFlLlQZAkkOXZurJ3NM= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -305,6 +321,7 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +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.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= @@ -351,12 +368,18 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zk github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.70 h1:1u9NtMgfK1U42kUxcsl5v0yj6TEOPR497OAQxpJnn2g= -github.com/minio/minio-go/v7 v7.0.70/go.mod h1:4yBA8v80xGA30cfM3fz0DKYMXunWl/AV/6tWEs9ryzo= +github.com/minio/minio-go/v7 v7.0.71 h1:No9XfOKTYi6i0GnBj+WZwD8WP5GZfL7n7GOjRqCdAjA= +github.com/minio/minio-go/v7 v7.0.71/go.mod h1:4yBA8v80xGA30cfM3fz0DKYMXunWl/AV/6tWEs9ryzo= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +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/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/moul/http2curl v0.0.0-20161031194548-4e24498b31db h1:eZgFHVkk9uOTaOQLC6tgjkzdp7Ays8eEVecBcfHZlJQ= github.com/moul/http2curl v0.0.0-20161031194548-4e24498b31db/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -372,6 +395,10 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= @@ -450,6 +477,7 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -475,12 +503,12 @@ github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhe github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xdrpp/goxdr v0.1.1 h1:E1B2c6E8eYhOVyd7yEpOyopzTPirUeF6mVOfXfGyJyc= github.com/xdrpp/goxdr v0.1.1/go.mod h1:dXo1scL/l6s7iME1gxHWo2XCppbHEKZS7m/KyYWkNzA= -github.com/xeipuuv/gojsonpointer v0.0.0-20151027082146-e0fe6f683076 h1:KM4T3G70MiR+JtqplcYkNVoNz7pDwYaBxWBXQK804So= -github.com/xeipuuv/gojsonpointer v0.0.0-20151027082146-e0fe6f683076/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20150808065054-e02fc20de94c h1:XZWnr3bsDQWAZg4Ne+cPoXRPILrNlPNQfxBuwLl43is= -github.com/xeipuuv/gojsonreference v0.0.0-20150808065054-e02fc20de94c/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20161231055540-f06f290571ce h1:cVSRGH8cOveJNwFEEZLXtB+XMnRqKLjUP6V/ZFYQCXI= -github.com/xeipuuv/gojsonschema v0.0.0-20161231055540-f06f290571ce/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +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/yalp/jsonpath v0.0.0-20150812003900-31a79c7593bb h1:06WAhQa+mYv7BiOk13B/ywyTlkoE/S7uu6TBKU6FHnE= github.com/yalp/jsonpath v0.0.0-20150812003900-31a79c7593bb/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v0.0.0-20170107030110-7b1b7adf999d h1:yJIizrfO599ot2kQ6Af1enICnwBD3XoxgX3MrMwot2M= @@ -494,8 +522,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.einride.tech/aip v0.66.0 h1:XfV+NQX6L7EOYK11yoHHFtndeaWh3KbD9/cN/6iWEt8= -go.einride.tech/aip v0.66.0/go.mod h1:qAhMsfT7plxBX+Oy7Huol6YUvZ0ZzdUz26yZsQwfl1M= +go.einride.tech/aip v0.67.1 h1:d/4TW92OxXBngkSOwWS2CH5rez869KpKMaN44mdxkFI= +go.einride.tech/aip v0.67.1/go.mod h1:ZGX4/zKw8dcgzdLsrvpOOGxfxI2QSk12SlP7d6c0/XI= 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= @@ -508,14 +536,20 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.4 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= +go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= +go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= +go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= +go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -528,8 +562,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-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= @@ -566,8 +600,8 @@ 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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.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= @@ -606,8 +640,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 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.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.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= @@ -617,8 +651,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ 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.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-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= @@ -682,13 +716,13 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.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.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -699,8 +733,8 @@ 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.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.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= @@ -744,6 +778,7 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY 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= @@ -753,11 +788,12 @@ golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4f 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.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -783,8 +819,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 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.177.0 h1:8a0p/BbPa65GlqGWtUKxot4p0TV8OGOfyTjtmkXNXmk= -google.golang.org/api v0.177.0/go.mod h1:srbhue4MLjkjbkux5p3dw/ocYOSZTaIEvf7bCOnFQDw= +google.golang.org/api v0.183.0 h1:PNMeRDwo1pJdgNcFQ9GstuLe/noWKIc89pRWRLMvLwE= +google.golang.org/api v0.183.0/go.mod h1:q43adC5/pHoSZTx5h2mSmdF7NcyfW9JuDyIOJAgS9ZQ= 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= @@ -830,12 +866,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda h1:wu/KJm9KJwpfHWhkkZGohVC6KRrc1oJNr4jwtQMOQXw= -google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda/go.mod h1:g2LLCvCeCSir/JJSWosk19BR4NVxGqHUC6rxIRsd7Aw= -google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 h1:DTJM0R8LECCgFeUwApvcEJHz85HLagW8uRENYxHh1ww= -google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6/go.mod h1:10yRODfgim2/T8csjQsMPgZOMvtytXKTDRzH6HRGzRw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 h1:DujSIu+2tC9Ht0aPNA7jgj23Iq8Ewi5sgkQ++wdvonE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto v0.0.0-20240528184218-531527333157 h1:u7WMYrIrVvs0TF5yaKwKNbcJyySYf+HAIFXxWltJOXE= +google.golang.org/genproto v0.0.0-20240528184218-531527333157/go.mod h1:ubQlAQnzejB8uZzszhrTCU2Fyp6Vi7ZE5nn0c3W8+qQ= +google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 h1:0+ozOGcrp+Y8Aq8TLNN2Aliibms5LEzsq99ZZmAGYm0= +google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094/go.mod h1:fJ/e3If/Q67Mj99hin0hMhiNyCRmt6BQ2aWIJshUSJw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= 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= @@ -852,8 +888,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM 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.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= 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= @@ -866,8 +902,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj 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.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -903,6 +939,8 @@ 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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= 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= From 7f0f1e016af81a805f67f4326d7a5f0a55f1d69c Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Tue, 2 Jul 2024 21:35:39 -0700 Subject: [PATCH 02/17] hubble-469: use fully qualified docker.io url --- .github/workflows/ledgerexporter-release.yml | 2 +- .github/workflows/ledgerexporter.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ledgerexporter-release.yml b/.github/workflows/ledgerexporter-release.yml index e25ea92382..d6dac29806 100644 --- a/.github/workflows/ledgerexporter-release.yml +++ b/.github/workflows/ledgerexporter-release.yml @@ -12,7 +12,7 @@ jobs: env: LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED: "true" LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN: /usr/bin/stellar-core - LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE: stellar/quickstart:testing + LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE: docker.io/stellar/quickstart:testing STELLAR_CORE_VERSION: 21.1.0-1921.b3aeb14cc.focal VERSION: ${GITHUB_REF_NAME#ledgerexporter-v} steps: diff --git a/.github/workflows/ledgerexporter.yml b/.github/workflows/ledgerexporter.yml index 1c25a5c8b3..3b3fc6f418 100644 --- a/.github/workflows/ledgerexporter.yml +++ b/.github/workflows/ledgerexporter.yml @@ -13,7 +13,7 @@ jobs: CAPTIVE_CORE_DEBIAN_PKG_VERSION: 21.1.0-1921.b3aeb14cc.focal LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED: "true" LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN: /usr/bin/stellar-core - LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE: stellar/quickstart:testing + LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE: docker.io/stellar/quickstart:testing steps: - name: Install captive core run: | From 31e22556244dc05ebb365906ec4f50d4cb5768b7 Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Tue, 2 Jul 2024 21:44:42 -0700 Subject: [PATCH 03/17] hubble-469: pull docker image in gha step on le ci --- .github/workflows/ledgerexporter.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ledgerexporter.yml b/.github/workflows/ledgerexporter.yml index 3b3fc6f418..369241faf1 100644 --- a/.github/workflows/ledgerexporter.yml +++ b/.github/workflows/ledgerexporter.yml @@ -28,9 +28,15 @@ jobs: sudo apt-get update && sudo apt-get install -y stellar-core="$CAPTIVE_CORE_DEBIAN_PKG_VERSION" echo "Using stellar core version $(stellar-core version)" + - name: Pull Quickstart image + shell: bash + run: | + docker pull "$LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE" + - uses: actions/checkout@v3 with: # For pull requests, build and test the PR head not a merge of the PR with the destination. ref: ${{ github.event.pull_request.head.sha || github.ref }} + - name: Run Ledger Exporter test run: go test -v -race -run TestLedgerExporterTestSuite ./exp/services/ledgerexporter/... From 17ce7fe87475f71017aa9b0a8e261d8cbe3f670e Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Tue, 2 Jul 2024 21:50:07 -0700 Subject: [PATCH 04/17] hubble-469: pull docker image in gha step on le release ci --- .github/workflows/ledgerexporter-release.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ledgerexporter-release.yml b/.github/workflows/ledgerexporter-release.yml index d6dac29806..c00f1571d1 100644 --- a/.github/workflows/ledgerexporter-release.yml +++ b/.github/workflows/ledgerexporter-release.yml @@ -19,6 +19,10 @@ jobs: - uses: actions/checkout@v3 with: ref: github.sha + - name: Pull Quickstart image + shell: bash + run: | + docker pull "$LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE" - name: Install captive core run: | # Workaround for https://github.com/actions/virtual-environments/issues/5245, From 1bb82f508e2c5e8798a24483925a0b4a74441858 Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Wed, 3 Jul 2024 11:13:21 -0700 Subject: [PATCH 05/17] #hubble-469: moved integration test docs to developer guide --- exp/services/ledgerexporter/DEVELOPER_GUIDE.md | 17 +++++++++++++++-- exp/services/ledgerexporter/README.md | 18 +----------------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/exp/services/ledgerexporter/DEVELOPER_GUIDE.md b/exp/services/ledgerexporter/DEVELOPER_GUIDE.md index ef81553e37..7cb9a23b31 100644 --- a/exp/services/ledgerexporter/DEVELOPER_GUIDE.md +++ b/exp/services/ledgerexporter/DEVELOPER_GUIDE.md @@ -32,14 +32,27 @@ To achieve its goals, the ledger exporter uses the following architecture, which - An example implementation of `DataStore` for GCS, Google Cloud Storage. This plugin is located in the [support](https://github.com/stellar/go/tree/master/support/datastore) package. - The ledger exporter currently implements the interface only for Google Cloud Storage (GCS). The [GCS plugin](https://github.com/stellar/go/blob/master/support/datastore/gcs_datastore.go) uses GCS-specific behaviors like conditional puts, automatic retry, metadata, and CRC checksum. -## Build, Run and Test using Docker +## Build and Run using Docker The Dockerfile contains all the necessary dependencies (e.g., Stellar-core) required to run the ledger exporter. - Build: To build the Docker container, use the provided [Makefile](./Makefile). Simply run make `make docker-build` to build a new container after making any changes. - Run: For instructions on running the Docker container, refer to the [Installation Guide](./README.md). -- Test: To test the Docker container, refer to the [docker-test](./Makefile) command for an example of how to use the [GCS emulator](https://github.com/fsouza/fake-gcs-server) for local testing. +## Running Integration Tests: +from top directory of stellar/go repo, run go test to launch ledger exporter integration +tests. + +`LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED=true` is required environment variable to allow +tests to run. + +Optional, tests will try to run `stellar-core` from o/s PATH for captive core, if not resolvable, then set `LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN=/path/to/stellar-core` + +Optional, can override the version of quickstart used to run standalone stellar network, p `LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE=docker.io/stellar/quickstart:`. Ideally don't need to change this, but is available. + +``` +$ LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED=true go test -v -race -run TestLedgerExporterTestSuite ./exp/services/ledgerexporter/... +``` ## Adding support for a new storage type Support for different data storage types are encapsulated as 'plugins', which are implementation of `DataStore` interface in a go package. To add a data storage plugin based on a new storage type (e.g. AWS S3), follow these steps: diff --git a/exp/services/ledgerexporter/README.md b/exp/services/ledgerexporter/README.md index 97f6eb3aa7..8308bfdaeb 100644 --- a/exp/services/ledgerexporter/README.md +++ b/exp/services/ledgerexporter/README.md @@ -126,20 +126,4 @@ docker run --platform linux/amd64 -d \ Arguments: - `--start ` (required): The starting ledger sequence number in the range to export. - `--end ` (required): The ending ledger sequence number in the range. -- `--config-file ` (optional): The path to your configuration file, containing details like GCS bucket information. If not provided, the exporter will look for config.toml in the directory where you run the command. - -#### Running Integration Tests: -from top directory of stellar/go repo, run go test to launch ledger exporter integration -tests. - -`LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED=true` is required environment variable to allow -tests to run. - -Optional, tests will try to run `stellar-core` from o/s PATH for captive core, if not resolvable, then set `LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN=/path/to/stellar-core` - -Optional, can override the version of quickstart used to run standalone stellar network, p `LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE=docker.io/stellar/quickstart:`. Ideally don't need to change this, but is available. - -``` -$ LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED=true go test -v -race -run TestLedgerExporterTestSuite ./exp/services/ledgerexporter/... -``` - +- `--config-file ` (optional): The path to your configuration file, containing details like GCS bucket information. If not provided, the exporter will look for config.toml in the directory where you run the command. \ No newline at end of file From 0d3a999fb1cb0e8bb35498bf06ea4bf3bbfe5615 Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Wed, 3 Jul 2024 12:22:43 -0700 Subject: [PATCH 06/17] #hubble-469: fixed docker image pull --- exp/services/ledgerexporter/internal/integration_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exp/services/ledgerexporter/internal/integration_test.go b/exp/services/ledgerexporter/internal/integration_test.go index edaceec023..9fc88c4e6b 100644 --- a/exp/services/ledgerexporter/internal/integration_test.go +++ b/exp/services/ledgerexporter/internal/integration_test.go @@ -185,7 +185,7 @@ func (s *LedgerExporterTestSuite) mustStartCore(t *testing.T, quickstartImage st t.Fatalf("could not create docker client, %v", err) } - img, err := s.dockerCli.ImagePull(s.ctx, quickstartImage, image.PullOptions{}) + img, err := s.dockerCli.ImagePull(s.ctx, quickstartImage, image.PullOptions{All: true}) if err != nil { t.Fatalf("could not pull docker image, %v, %v", quickstartImage, err) } From 0300ed68fa50b121bd51563f5d06540c6bfa25e7 Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Wed, 3 Jul 2024 12:25:32 -0700 Subject: [PATCH 07/17] #hubble-469: fix typo, review feedback --- exp/services/ledgerexporter/DEVELOPER_GUIDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exp/services/ledgerexporter/DEVELOPER_GUIDE.md b/exp/services/ledgerexporter/DEVELOPER_GUIDE.md index 7cb9a23b31..3c06dc4875 100644 --- a/exp/services/ledgerexporter/DEVELOPER_GUIDE.md +++ b/exp/services/ledgerexporter/DEVELOPER_GUIDE.md @@ -48,7 +48,7 @@ tests to run. Optional, tests will try to run `stellar-core` from o/s PATH for captive core, if not resolvable, then set `LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN=/path/to/stellar-core` -Optional, can override the version of quickstart used to run standalone stellar network, p `LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE=docker.io/stellar/quickstart:`. Ideally don't need to change this, but is available. +Optional, can override the version of quickstart used to run standalone stellar network, `LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE=docker.io/stellar/quickstart:`. Ideally don't need to change this, but is available. ``` $ LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED=true go test -v -race -run TestLedgerExporterTestSuite ./exp/services/ledgerexporter/... From 9167c228ecdaecb8b204fae3975d033cff938363 Mon Sep 17 00:00:00 2001 From: shawn Date: Wed, 3 Jul 2024 12:26:07 -0700 Subject: [PATCH 08/17] Update .github/workflows/ledgerexporter-release.yml, review feedback Co-authored-by: urvisavla --- .github/workflows/ledgerexporter-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ledgerexporter-release.yml b/.github/workflows/ledgerexporter-release.yml index c00f1571d1..dd4e61415b 100644 --- a/.github/workflows/ledgerexporter-release.yml +++ b/.github/workflows/ledgerexporter-release.yml @@ -14,7 +14,7 @@ jobs: LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN: /usr/bin/stellar-core LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE: docker.io/stellar/quickstart:testing STELLAR_CORE_VERSION: 21.1.0-1921.b3aeb14cc.focal - VERSION: ${GITHUB_REF_NAME#ledgerexporter-v} + VERSION: ${GITHUB_REF_NAME#ledgerexporter-v} steps: - uses: actions/checkout@v3 with: From c75d9939913bd5c3851cfc235ec950ae12ca8041 Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Wed, 3 Jul 2024 13:04:18 -0700 Subject: [PATCH 09/17] #hubble-469: bring the fake gcs make target back in, review feedback --- .../ledgerexporter/DEVELOPER_GUIDE.md | 2 ++ exp/services/ledgerexporter/Makefile | 26 +++++++++++++++++++ .../ledgerexporter/docker/config.test.toml | 13 ++++++++++ 3 files changed, 41 insertions(+) create mode 100644 exp/services/ledgerexporter/docker/config.test.toml diff --git a/exp/services/ledgerexporter/DEVELOPER_GUIDE.md b/exp/services/ledgerexporter/DEVELOPER_GUIDE.md index 3c06dc4875..4cef8419bb 100644 --- a/exp/services/ledgerexporter/DEVELOPER_GUIDE.md +++ b/exp/services/ledgerexporter/DEVELOPER_GUIDE.md @@ -39,6 +39,8 @@ The Dockerfile contains all the necessary dependencies (e.g., Stellar-core) requ - Run: For instructions on running the Docker container, refer to the [Installation Guide](./README.md). +- Run ledgerexporter with a local, fake GCS backend: Requires `make docker-build` first, then run `make docker-test-fake-gcs`. This will run the ledger exporter against `testnet` and export to the 'fake' GCS instance started in the container. + ## Running Integration Tests: from top directory of stellar/go repo, run go test to launch ledger exporter integration tests. diff --git a/exp/services/ledgerexporter/Makefile b/exp/services/ledgerexporter/Makefile index b8b45aff89..6561c4f24c 100644 --- a/exp/services/ledgerexporter/Makefile +++ b/exp/services/ledgerexporter/Makefile @@ -14,6 +14,32 @@ $(if $(STELLAR_CORE_VERSION), --build-arg STELLAR_CORE_VERSION=$(STELLAR_CORE_VE -t $(DOCKER_IMAGE):$(VERSION) \ -t $(DOCKER_IMAGE):latest . +docker-clean: + $(SUDO) docker stop fake-gcs-server || true + $(SUDO) docker rm fake-gcs-server || true + $(SUDO) rm -rf ${PWD}/storage || true + $(SUDO) docker network rm test-network || true + +docker-test-fake-gcs: docker-clean + # Create temp storage dir + $(SUDO) mkdir -p ${PWD}/storage/exporter-test + + # Create test network for docker + $(SUDO) docker network create test-network + + # Run the fake GCS server + $(SUDO) docker run -d --name fake-gcs-server -p 4443:4443 \ + -v ${PWD}/storage:/data --network test-network fsouza/fake-gcs-server -scheme http + + # Run the ledger-exporter + $(SUDO) docker run --platform linux/amd64 -t --network test-network\ + -v ${PWD}/exp/services/ledgerexporter/docker/config.test.toml:/config.toml \ + -e STORAGE_EMULATOR_HOST=http://fake-gcs-server:4443 \ + $(DOCKER_IMAGE):$(VERSION) \ + scan-and-fill --start 1000 --end 2000 + + $(MAKE) docker-clean + docker-push: $(SUDO) docker push $(DOCKER_IMAGE):$(VERSION) $(SUDO) docker push $(DOCKER_IMAGE):latest diff --git a/exp/services/ledgerexporter/docker/config.test.toml b/exp/services/ledgerexporter/docker/config.test.toml new file mode 100644 index 0000000000..c5c4519f0b --- /dev/null +++ b/exp/services/ledgerexporter/docker/config.test.toml @@ -0,0 +1,13 @@ +[datastore_config] +type = "GCS" + +[datastore_config.params] +destination_bucket_path = "exporter-test/ledgers/testnet" + +[datastore_config.schema] +ledgers_per_file = 1 +files_per_partition = 64000 + +[stellar_core_config] + network = "testnet" + From 9374cf3fa406b92e8b63e600569d63a8d58211f4 Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Thu, 4 Jul 2024 23:53:13 -0700 Subject: [PATCH 10/17] #hubble-469: fixed docker pull aspects, use temp dir for ccore storage path, make cli commands be instance not package static vars --- .github/workflows/ledgerexporter-release.yml | 5 +- .github/workflows/ledgerexporter.yml | 5 +- .../ledgerexporter/DEVELOPER_GUIDE.md | 4 +- exp/services/ledgerexporter/internal/app.go | 2 +- .../ledgerexporter/internal/config.go | 10 +- .../internal/integration_test.go | 158 +++++++++++++----- exp/services/ledgerexporter/internal/main.go | 22 ++- .../ledgerexporter/internal/main_test.go | 2 +- .../test/integration_config_template.toml | 3 +- 9 files changed, 159 insertions(+), 52 deletions(-) diff --git a/.github/workflows/ledgerexporter-release.yml b/.github/workflows/ledgerexporter-release.yml index dd4e61415b..2e66847286 100644 --- a/.github/workflows/ledgerexporter-release.yml +++ b/.github/workflows/ledgerexporter-release.yml @@ -12,7 +12,10 @@ jobs: env: LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED: "true" LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN: /usr/bin/stellar-core - LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE: docker.io/stellar/quickstart:testing + # this pins to a version of quickstart:testing that has the same version as STELLAR_CORE_VERSION + # this is the multi-arch index sha, get it by 'docker buildx imagetools inspect stellar/quickstart:testing' + LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE: docker.io/stellar/quickstart:testing@sha256:03c6679f838a92b1eda4cd3a9e2bdee4c3586e278a138a0acf36a9bc99a0041f + LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE_PULL: "false" STELLAR_CORE_VERSION: 21.1.0-1921.b3aeb14cc.focal VERSION: ${GITHUB_REF_NAME#ledgerexporter-v} steps: diff --git a/.github/workflows/ledgerexporter.yml b/.github/workflows/ledgerexporter.yml index 369241faf1..c80a367771 100644 --- a/.github/workflows/ledgerexporter.yml +++ b/.github/workflows/ledgerexporter.yml @@ -13,7 +13,10 @@ jobs: CAPTIVE_CORE_DEBIAN_PKG_VERSION: 21.1.0-1921.b3aeb14cc.focal LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED: "true" LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN: /usr/bin/stellar-core - LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE: docker.io/stellar/quickstart:testing + # this pins to a version of quickstart:testing that has the same version as LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN + # this is the multi-arch index sha, get it by 'docker buildx imagetools inspect stellar/quickstart:testing' + LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE: docker.io/stellar/quickstart:testing@sha256:03c6679f838a92b1eda4cd3a9e2bdee4c3586e278a138a0acf36a9bc99a0041f + LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE_PULL: "false" steps: - name: Install captive core run: | diff --git a/exp/services/ledgerexporter/DEVELOPER_GUIDE.md b/exp/services/ledgerexporter/DEVELOPER_GUIDE.md index 4cef8419bb..28a16ec1b0 100644 --- a/exp/services/ledgerexporter/DEVELOPER_GUIDE.md +++ b/exp/services/ledgerexporter/DEVELOPER_GUIDE.md @@ -50,7 +50,9 @@ tests to run. Optional, tests will try to run `stellar-core` from o/s PATH for captive core, if not resolvable, then set `LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN=/path/to/stellar-core` -Optional, can override the version of quickstart used to run standalone stellar network, `LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE=docker.io/stellar/quickstart:`. Ideally don't need to change this, but is available. +Optional, can override the version of quickstart used to run standalone stellar network, `LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE=docker.io/stellar/quickstart:`. By default it will try to docker pull `stellar/quickstart:testing` image to local host's docker image store. Set `LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE_PULL=false` to skip the pull, if you know host has up to date image. + +Note, the version of stellar core in `LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE` and `LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN` needs to be on the same major rev or the captive core process may not be able to join or parse ledger meta from the `local` network created by `LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE` ``` $ LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED=true go test -v -race -run TestLedgerExporterTestSuite ./exp/services/ledgerexporter/... diff --git a/exp/services/ledgerexporter/internal/app.go b/exp/services/ledgerexporter/internal/app.go index 40cdf90f0e..00382f00e4 100644 --- a/exp/services/ledgerexporter/internal/app.go +++ b/exp/services/ledgerexporter/internal/app.go @@ -186,7 +186,7 @@ func newAdminServer(adminPort int, prometheusRegistry *prometheus.Registry) *htt } func (a *App) Run(runtimeSettings RuntimeSettings) error { - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(runtimeSettings.Ctx) defer cancel() if err := a.init(ctx, runtimeSettings); err != nil { diff --git a/exp/services/ledgerexporter/internal/config.go b/exp/services/ledgerexporter/internal/config.go index 754fe5512b..196327e229 100644 --- a/exp/services/ledgerexporter/internal/config.go +++ b/exp/services/ledgerexporter/internal/config.go @@ -48,6 +48,7 @@ type RuntimeSettings struct { EndLedger uint32 ConfigFilePath string Mode Mode + Ctx context.Context } type StellarCoreConfig struct { @@ -56,6 +57,8 @@ type StellarCoreConfig struct { HistoryArchiveUrls []string `toml:"history_archive_urls"` StellarCoreBinaryPath string `toml:"stellar_core_binary_path"` CaptiveCoreTomlPath string `toml:"captive_core_toml_path"` + CheckpointFrequency uint32 `toml:"checkpoint_frequency"` + StoragePath string `toml:"storage_path"` } type Config struct { @@ -185,15 +188,20 @@ func (config *Config) GenerateCaptiveCoreConfig(coreBinFromPath string) (ledgerb return ledgerbackend.CaptiveCoreConfig{}, errors.Wrap(err, "Failed to create captive-core toml") } + checkpointFrequency := historyarchive.DefaultCheckpointFrequency + if config.StellarCoreConfig.CheckpointFrequency > 0 { + checkpointFrequency = config.StellarCoreConfig.CheckpointFrequency + } return ledgerbackend.CaptiveCoreConfig{ BinaryPath: config.StellarCoreConfig.StellarCoreBinaryPath, NetworkPassphrase: params.NetworkPassphrase, HistoryArchiveURLs: params.HistoryArchiveURLs, - CheckpointFrequency: historyarchive.DefaultCheckpointFrequency, + CheckpointFrequency: checkpointFrequency, Log: logger.WithField("subservice", "stellar-core"), Toml: captiveCoreToml, UserAgent: "ledger-exporter", UseDB: true, + StoragePath: config.StellarCoreConfig.StoragePath, }, nil } diff --git a/exp/services/ledgerexporter/internal/integration_test.go b/exp/services/ledgerexporter/internal/integration_test.go index 9fc88c4e6b..a9af8b9550 100644 --- a/exp/services/ledgerexporter/internal/integration_test.go +++ b/exp/services/ledgerexporter/internal/integration_test.go @@ -13,10 +13,12 @@ import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/image" "github.com/docker/docker/client" + "github.com/docker/docker/pkg/stdcopy" "github.com/docker/go-connections/nat" "github.com/pkg/errors" "github.com/pelletier/go-toml" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" "github.com/fsouza/fake-gcs-server/fakestorage" @@ -26,17 +28,21 @@ import ( ) const ( - maxWaitForCoreStartup = (30 * time.Second) + maxWaitForCoreStartup = (180 * time.Second) coreStartupPingInterval = time.Second + // set the max ledger we want the standalone network to emit + // tests then refer to ledger sequences only up to this, therefore + // don't have to do complex waiting within test for a sequence to exist. + waitForCoreLedgerSequence = 16 ) func TestLedgerExporterTestSuite(t *testing.T) { + os.Setenv("LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED", "true") + if os.Getenv("LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED") != "true" { t.Skip("skipping integration test: LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED not true") } - defineCommands() - ledgerExporterSuite := &LedgerExporterTestSuite{} suite.Run(t, ledgerExporterSuite) } @@ -46,25 +52,26 @@ type LedgerExporterTestSuite struct { tempConfigFile string ctx context.Context ctxStop context.CancelFunc - coreContainerId string - coreHttpPort int + coreContainerID string dockerCli *client.Client gcsServer *fakestorage.Server + finishedSetup bool } func (s *LedgerExporterTestSuite) TestScanAndFill() { require := s.Require() + rootCmd := defineCommands() rootCmd.SetArgs([]string{"scan-and-fill", "--start", "4", "--end", "5", "--config-file", s.tempConfigFile}) - var errWriter io.Writer = &bytes.Buffer{} - var outWriter io.Writer = &bytes.Buffer{} - rootCmd.SetErr(errWriter) - rootCmd.SetOut(outWriter) + var errWriter bytes.Buffer + var outWriter bytes.Buffer + rootCmd.SetErr(&errWriter) + rootCmd.SetOut(&outWriter) err := rootCmd.ExecuteContext(s.ctx) require.NoError(err) - output := outWriter.(*bytes.Buffer).String() - errOutput := errWriter.(*bytes.Buffer).String() + output := outWriter.String() + errOutput := errWriter.String() s.T().Log(output) s.T().Log(errOutput) @@ -79,29 +86,64 @@ func (s *LedgerExporterTestSuite) TestAppend() { require := s.Require() // first populate ledgers 4-5 - rootCmd.SetArgs([]string{"scan-and-fill", "--start", "4", "--end", "5", "--config-file", s.tempConfigFile}) + rootCmd := defineCommands() + rootCmd.SetArgs([]string{"scan-and-fill", "--start", "6", "--end", "7", "--config-file", s.tempConfigFile}) err := rootCmd.ExecuteContext(s.ctx) require.NoError(err) - // now run an append of overalapping range, it will resume past existing ledgers 4,5 - rootCmd.SetArgs([]string{"append", "--start", "4", "--end", "7", "--config-file", s.tempConfigFile}) - var errWriter io.Writer = &bytes.Buffer{} - var outWriter io.Writer = &bytes.Buffer{} - rootCmd.SetErr(errWriter) - rootCmd.SetOut(outWriter) + // now run an append of overalapping range, it will resume past existing ledgers + rootCmd.SetArgs([]string{"append", "--start", "6", "--end", "9", "--config-file", s.tempConfigFile}) + var errWriter bytes.Buffer + var outWriter bytes.Buffer + rootCmd.SetErr(&errWriter) + rootCmd.SetOut(&outWriter) err = rootCmd.ExecuteContext(s.ctx) require.NoError(err) - output := outWriter.(*bytes.Buffer).String() - errOutput := errWriter.(*bytes.Buffer).String() + output := outWriter.String() + errOutput := errWriter.String() s.T().Log(output) s.T().Log(errOutput) datastore, err := datastore.NewGCSDataStore(s.ctx, "integration-test/standalone") require.NoError(err) - _, err = datastore.GetFile(s.ctx, "FFFFFFFF--0-9/FFFFFFF8--7.xdr.zstd") + _, err = datastore.GetFile(s.ctx, "FFFFFFFF--0-9/FFFFFFF6--9.xdr.zstd") + require.NoError(err) +} + +func (s *LedgerExporterTestSuite) TestAppendUnbounded() { + require := s.Require() + + rootCmd := defineCommands() + rootCmd.SetArgs([]string{"append", "--start", "10", "--config-file", s.tempConfigFile}) + var errWriter bytes.Buffer + var outWriter bytes.Buffer + rootCmd.SetErr(&errWriter) + rootCmd.SetOut(&outWriter) + + appendCtx, cancel := context.WithCancel(s.ctx) + syn := make(chan struct{}) + defer func() { <-syn }() + defer cancel() + go func() { + defer close(syn) + require.NoError(rootCmd.ExecuteContext(appendCtx)) + output := outWriter.String() + errOutput := errWriter.String() + s.T().Log(output) + s.T().Log(errOutput) + }() + + datastore, err := datastore.NewGCSDataStore(s.ctx, "integration-test/standalone") require.NoError(err) + + require.EventuallyWithT(func(c *assert.CollectT) { + // this checks every 50ms up to 180s total + assert := assert.New(c) + _, err = datastore.GetFile(s.ctx, "FFFFFFF5--10-19/FFFFFFF0--15.xdr.zstd") + assert.NoError(err) + }, 180*time.Second, 50*time.Millisecond, "append unbounded did not work") } func (s *LedgerExporterTestSuite) SetupSuite() { @@ -110,21 +152,31 @@ func (s *LedgerExporterTestSuite) SetupSuite() { s.ctx, s.ctxStop = signal.NotifyContext(context.Background(), os.Interrupt, os.Kill) + defer func() { + if !s.finishedSetup { + s.TearDownSuite() + } + }() + ledgerExporterConfigTemplate, err := toml.LoadFile("test/integration_config_template.toml") if err != nil { t.Fatalf("unable to load config template file %v", err) } - // if LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN specified, + testTempDir := t.TempDir() + + // if LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN not specified, // ledgerexporter will attempt resolve core bin using 'stellar-core' from OS path ledgerExporterConfigTemplate.Set("stellar_core_config.stellar_core_binary_path", os.Getenv("LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN")) + ledgerExporterConfigTemplate.Set("stellar_core_config.storage_path", filepath.Join(testTempDir, "captive-core")) + tomlBytes, err := toml.Marshal(ledgerExporterConfigTemplate) if err != nil { t.Fatalf("unable to load config file %v", err) } - testTempDir := t.TempDir() + tempSeedDataPath := filepath.Join(testTempDir, "data") if err = os.MkdirAll(filepath.Join(tempSeedDataPath, "integration-test"), 0777); err != nil { t.Fatalf("unable to create seed data in temp path, %v", err) @@ -160,16 +212,34 @@ func (s *LedgerExporterTestSuite) SetupSuite() { if quickstartImage == "" { quickstartImage = "stellar/quickstart:testing" } - s.mustStartCore(t, quickstartImage) + pullQuickStartImage := true + if os.Getenv("LEDGEREXPORTER_INTEGRATION_TESTS_QUICKSTART_IMAGE_PULL") == "false" { + pullQuickStartImage = false + } + + s.mustStartCore(t, quickstartImage, pullQuickStartImage) s.mustWaitForCore(t, ledgerExporterConfigTemplate.GetArray("stellar_core_config.history_archive_urls").([]string), ledgerExporterConfigTemplate.Get("stellar_core_config.network_passphrase").(string)) + s.finishedSetup = true } func (s *LedgerExporterTestSuite) TearDownSuite() { - if s.coreContainerId != "" { - if err := s.dockerCli.ContainerStop(context.Background(), s.coreContainerId, container.StopOptions{}); err != nil { - s.T().Logf("unable to stop core container, %v, %v", s.coreContainerId, err) + if s.coreContainerID != "" { + s.T().Logf("Stopping the quickstart container %v", s.coreContainerID) + containerLogs, err := s.dockerCli.ContainerLogs(s.ctx, s.coreContainerID, container.LogsOptions{ShowStdout: true, ShowStderr: true}) + + if err == nil { + var errWriter bytes.Buffer + var outWriter bytes.Buffer + stdcopy.StdCopy(&outWriter, &errWriter, containerLogs) + s.T().Log(outWriter.String()) + s.T().Log(errWriter.String()) + } + if err := s.dockerCli.ContainerStop(context.Background(), s.coreContainerID, container.StopOptions{}); err != nil { + s.T().Logf("unable to stop core container, %v, %v", s.coreContainerID, err) } + } + if s.dockerCli != nil { s.dockerCli.Close() } if s.gcsServer != nil { @@ -178,25 +248,35 @@ func (s *LedgerExporterTestSuite) TearDownSuite() { s.ctxStop() } -func (s *LedgerExporterTestSuite) mustStartCore(t *testing.T, quickstartImage string) { +func (s *LedgerExporterTestSuite) mustStartCore(t *testing.T, quickstartImage string, pullImage bool) { var err error s.dockerCli, err = client.NewClientWithOpts(client.WithAPIVersionNegotiation()) if err != nil { t.Fatalf("could not create docker client, %v", err) } - img, err := s.dockerCli.ImagePull(s.ctx, quickstartImage, image.PullOptions{All: true}) - if err != nil { - t.Fatalf("could not pull docker image, %v, %v", quickstartImage, err) + if pullImage { + imgReader, err := s.dockerCli.ImagePull(s.ctx, quickstartImage, image.PullOptions{}) + if err != nil { + t.Fatalf("could not pull docker image, %v, %v", quickstartImage, err) + } + // ImagePull is asynchronous. + // The reader needs to be read completely for the pull operation to complete. + _, err = io.Copy(io.Discard, imgReader) + if err != nil { + t.Fatalf("could not pull docker image, %v, %v", quickstartImage, err) + } + + err = imgReader.Close() + if err != nil { + t.Fatalf("could not download all of docker image bytes after pull, %v, %v", quickstartImage, err) + } } - img.Close() resp, err := s.dockerCli.ContainerCreate(s.ctx, &container.Config{ - Image: quickstartImage, - Cmd: []string{"--enable", "core", "--local"}, - AttachStdout: true, - AttachStderr: true, + Image: quickstartImage, + Cmd: []string{"--enable", "core", "--local"}, ExposedPorts: nat.PortSet{ nat.Port("1570/tcp"): {}, nat.Port("11625/tcp"): {}, @@ -215,16 +295,16 @@ func (s *LedgerExporterTestSuite) mustStartCore(t *testing.T, quickstartImage st if err != nil { t.Fatalf("could not create quickstart docker container, %v, error %v", quickstartImage, err) } - s.coreContainerId = resp.ID + s.coreContainerID = resp.ID if err := s.dockerCli.ContainerStart(s.ctx, resp.ID, container.StartOptions{}); err != nil { t.Fatalf("could not run quickstart docker container, %v, error %v", quickstartImage, err) } + t.Logf("Started quickstart container %v", s.coreContainerID) } func (s *LedgerExporterTestSuite) mustWaitForCore(t *testing.T, archiveUrls []string, passphrase string) { t.Log("Waiting for core to be up...") - //coreClient := &stellarcore.Client{URL: "http://localhost:" + strconv.Itoa(s.coreHttpPort)} startTime := time.Now() infoTime := startTime archive, err := historyarchive.NewArchivePool(archiveUrls, historyarchive.ArchiveOptions{ @@ -252,7 +332,7 @@ func (s *LedgerExporterTestSuite) mustWaitForCore(t *testing.T, archiveUrls []st continue } latestCheckpoint := has.CurrentLedger - if latestCheckpoint > 1 { + if latestCheckpoint >= waitForCoreLedgerSequence { return } } diff --git a/exp/services/ledgerexporter/internal/main.go b/exp/services/ledgerexporter/internal/main.go index d1409eb89c..f0ff076ae3 100644 --- a/exp/services/ledgerexporter/internal/main.go +++ b/exp/services/ledgerexporter/internal/main.go @@ -1,6 +1,7 @@ package ledgerexporter import ( + "context" "fmt" "github.com/spf13/cobra" @@ -14,16 +15,15 @@ var ( app := NewApp() return app.Run(runtimeSettings) } - rootCmd, scanAndFillCmd, appendCmd *cobra.Command ) func Execute() error { - defineCommands() + rootCmd := defineCommands() return rootCmd.Execute() } -func defineCommands() { - rootCmd = &cobra.Command{ +func defineCommands() *cobra.Command { + var rootCmd = &cobra.Command{ Use: "ledgerexporter", Short: "Export Stellar network ledger data to a remote data store", Long: "Converts ledger meta data from Stellar network into static data and exports it remote data storage.", @@ -32,7 +32,7 @@ func defineCommands() { return fmt.Errorf("please specify one of the availble sub-commands to initiate export") }, } - scanAndFillCmd = &cobra.Command{ + var scanAndFillCmd = &cobra.Command{ Use: "scan-and-fill", Short: "scans the entire bounded requested range between 'start' and 'end' flags and exports only the ledgers which are missing from the data lake.", Long: "scans the entire bounded requested range between 'start' and 'end' flags and exports only the ledgers which are missing from the data lake.", @@ -42,10 +42,14 @@ func defineCommands() { cmd.PersistentFlags().Lookup("config-file"), ) settings.Mode = ScanFill + settings.Ctx = cmd.Context() + if settings.Ctx == nil { + settings.Ctx = context.Background() + } return ledgerExporterCmdRunner(settings) }, } - appendCmd = &cobra.Command{ + var appendCmd = &cobra.Command{ Use: "append", Short: "export ledgers beginning with the first missing ledger after the specified 'start' ledger and resumes exporting from there", Long: "export ledgers beginning with the first missing ledger after the specified 'start' ledger and resumes exporting from there", @@ -55,6 +59,10 @@ func defineCommands() { cmd.PersistentFlags().Lookup("config-file"), ) settings.Mode = Append + settings.Ctx = cmd.Context() + if settings.Ctx == nil { + settings.Ctx = context.Background() + } return ledgerExporterCmdRunner(settings) }, } @@ -73,6 +81,8 @@ func defineCommands() { "If 'end' is absent or '0' means unbounded mode, exporter will continue to run indefintely and export the latest closed ledgers from network as they are generated in real time.") appendCmd.PersistentFlags().String("config-file", "config.toml", "Path to the TOML config file. Defaults to 'config.toml' on runtime working directory path.") viper.BindPFlags(appendCmd.PersistentFlags()) + + return rootCmd } func bindCliParameters(startFlag *pflag.Flag, endFlag *pflag.Flag, configFileFlag *pflag.Flag) RuntimeSettings { diff --git a/exp/services/ledgerexporter/internal/main_test.go b/exp/services/ledgerexporter/internal/main_test.go index 4c9e5412f3..fdc5e04deb 100644 --- a/exp/services/ledgerexporter/internal/main_test.go +++ b/exp/services/ledgerexporter/internal/main_test.go @@ -97,7 +97,7 @@ func TestFlagsOutput(t *testing.T) { t.Run(testCase.name, func(t *testing.T) { // mock the ledger exporter's cmd runner to be this test's mock routine instead of real app ledgerExporterCmdRunner = testCase.appRunner - defineCommands() + rootCmd := defineCommands() rootCmd.SetArgs(testCase.commandArgs) var errWriter io.Writer = &bytes.Buffer{} var outWriter io.Writer = &bytes.Buffer{} diff --git a/exp/services/ledgerexporter/internal/test/integration_config_template.toml b/exp/services/ledgerexporter/internal/test/integration_config_template.toml index 50042c9806..410aa0f7e5 100644 --- a/exp/services/ledgerexporter/internal/test/integration_config_template.toml +++ b/exp/services/ledgerexporter/internal/test/integration_config_template.toml @@ -11,4 +11,5 @@ files_per_partition = 10 [stellar_core_config] captive_core_toml_path = "test/integration_captive_core.cfg" history_archive_urls = ["http://localhost:1570"] -network_passphrase = "Standalone Network ; February 2017" \ No newline at end of file +network_passphrase = "Standalone Network ; February 2017" +checkpoint_frequency = 8 \ No newline at end of file From 4dd77b999264dc875866f378193125b4339aec6f Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Fri, 5 Jul 2024 00:00:22 -0700 Subject: [PATCH 11/17] #hubble-469: fix govet warn --- exp/services/ledgerexporter/internal/integration_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exp/services/ledgerexporter/internal/integration_test.go b/exp/services/ledgerexporter/internal/integration_test.go index a9af8b9550..398f253144 100644 --- a/exp/services/ledgerexporter/internal/integration_test.go +++ b/exp/services/ledgerexporter/internal/integration_test.go @@ -256,9 +256,9 @@ func (s *LedgerExporterTestSuite) mustStartCore(t *testing.T, quickstartImage st } if pullImage { - imgReader, err := s.dockerCli.ImagePull(s.ctx, quickstartImage, image.PullOptions{}) - if err != nil { - t.Fatalf("could not pull docker image, %v, %v", quickstartImage, err) + imgReader, imgErr := s.dockerCli.ImagePull(s.ctx, quickstartImage, image.PullOptions{}) + if imgErr != nil { + t.Fatalf("could not pull docker image, %v, %v", quickstartImage, imgErr) } // ImagePull is asynchronous. // The reader needs to be read completely for the pull operation to complete. From 4cdb5b98be7e67744cc5ed219ef74b6d20ac5751 Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Fri, 5 Jul 2024 10:17:20 -0700 Subject: [PATCH 12/17] #hubble-469: fix unit test for flags, change captive core config on integration test to not bind to peer port --- exp/services/ledgerexporter/internal/integration_test.go | 4 ++-- exp/services/ledgerexporter/internal/main_test.go | 9 ++++++++- .../internal/test/integration_captive_core.cfg | 4 +++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/exp/services/ledgerexporter/internal/integration_test.go b/exp/services/ledgerexporter/internal/integration_test.go index 398f253144..f623cc92ab 100644 --- a/exp/services/ledgerexporter/internal/integration_test.go +++ b/exp/services/ledgerexporter/internal/integration_test.go @@ -62,6 +62,7 @@ func (s *LedgerExporterTestSuite) TestScanAndFill() { require := s.Require() rootCmd := defineCommands() + rootCmd.SetArgs([]string{"scan-and-fill", "--start", "4", "--end", "5", "--config-file", s.tempConfigFile}) var errWriter bytes.Buffer var outWriter bytes.Buffer @@ -157,14 +158,13 @@ func (s *LedgerExporterTestSuite) SetupSuite() { s.TearDownSuite() } }() + testTempDir := t.TempDir() ledgerExporterConfigTemplate, err := toml.LoadFile("test/integration_config_template.toml") if err != nil { t.Fatalf("unable to load config template file %v", err) } - testTempDir := t.TempDir() - // if LEDGEREXPORTER_INTEGRATION_TESTS_CAPTIVE_CORE_BIN not specified, // ledgerexporter will attempt resolve core bin using 'stellar-core' from OS path ledgerExporterConfigTemplate.Set("stellar_core_config.stellar_core_binary_path", diff --git a/exp/services/ledgerexporter/internal/main_test.go b/exp/services/ledgerexporter/internal/main_test.go index fdc5e04deb..c9fe0f853d 100644 --- a/exp/services/ledgerexporter/internal/main_test.go +++ b/exp/services/ledgerexporter/internal/main_test.go @@ -2,6 +2,7 @@ package ledgerexporter import ( "bytes" + "context" "io" "testing" @@ -20,6 +21,8 @@ func TestFlagsOutput(t *testing.T) { return errors.New("test error") } + ctx := context.Background() + testCases := []struct { name string commandArgs []string @@ -42,6 +45,7 @@ func TestFlagsOutput(t *testing.T) { EndLedger: 5, ConfigFilePath: "myfile", Mode: Append, + Ctx: ctx, }, }, { @@ -54,6 +58,7 @@ func TestFlagsOutput(t *testing.T) { EndLedger: 0, ConfigFilePath: "myfile", Mode: Append, + Ctx: ctx, }, }, { @@ -72,6 +77,7 @@ func TestFlagsOutput(t *testing.T) { EndLedger: 5, ConfigFilePath: "myfile", Mode: ScanFill, + Ctx: ctx, }, }, { @@ -84,6 +90,7 @@ func TestFlagsOutput(t *testing.T) { EndLedger: 0, ConfigFilePath: "myfile", Mode: ScanFill, + Ctx: ctx, }, }, { @@ -103,7 +110,7 @@ func TestFlagsOutput(t *testing.T) { var outWriter io.Writer = &bytes.Buffer{} rootCmd.SetErr(errWriter) rootCmd.SetOut(outWriter) - rootCmd.Execute() + rootCmd.ExecuteContext(ctx) errOutput := errWriter.(*bytes.Buffer).String() if testCase.expectedErrOutput != "" { diff --git a/exp/services/ledgerexporter/internal/test/integration_captive_core.cfg b/exp/services/ledgerexporter/internal/test/integration_captive_core.cfg index 03721f05ee..720778093f 100644 --- a/exp/services/ledgerexporter/internal/test/integration_captive_core.cfg +++ b/exp/services/ledgerexporter/internal/test/integration_captive_core.cfg @@ -4,7 +4,9 @@ DATABASE = "sqlite3://stellar.db" DEPRECATED_SQL_LEDGER_STATE = false ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = true FAILURE_SAFETY = 0 -HTTP_PORT = 11726 +HTTP_PORT = 0 +PUBLIC_HTTP_PORT = false +PEER_PORT = 0 LOG_FILE_PATH = "" NETWORK_PASSPHRASE = "Standalone Network ; February 2017" UNSAFE_QUORUM = true From eb27809452f8f5997252e6bac7026f618b504f19 Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Fri, 5 Jul 2024 11:13:44 -0700 Subject: [PATCH 13/17] #hubble-469: removed debugging code --- exp/services/ledgerexporter/internal/integration_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/exp/services/ledgerexporter/internal/integration_test.go b/exp/services/ledgerexporter/internal/integration_test.go index f623cc92ab..65239b8611 100644 --- a/exp/services/ledgerexporter/internal/integration_test.go +++ b/exp/services/ledgerexporter/internal/integration_test.go @@ -37,8 +37,6 @@ const ( ) func TestLedgerExporterTestSuite(t *testing.T) { - os.Setenv("LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED", "true") - if os.Getenv("LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED") != "true" { t.Skip("skipping integration test: LEDGEREXPORTER_INTEGRATION_TESTS_ENABLED not true") } From eb1976af0725084577a45dd49814ef74961770e7 Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Fri, 5 Jul 2024 11:39:26 -0700 Subject: [PATCH 14/17] #hubble-469: fixing captive core peer port collsion with quickstart standalone instance --- .../ledgerexporter/internal/test/integration_captive_core.cfg | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exp/services/ledgerexporter/internal/test/integration_captive_core.cfg b/exp/services/ledgerexporter/internal/test/integration_captive_core.cfg index 720778093f..14e3772542 100644 --- a/exp/services/ledgerexporter/internal/test/integration_captive_core.cfg +++ b/exp/services/ledgerexporter/internal/test/integration_captive_core.cfg @@ -6,7 +6,8 @@ ENABLE_SOROBAN_DIAGNOSTIC_EVENTS = true FAILURE_SAFETY = 0 HTTP_PORT = 0 PUBLIC_HTTP_PORT = false -PEER_PORT = 0 +# avoid colliding with peer port from standalone core instance on same host +PEER_PORT = 15625 LOG_FILE_PATH = "" NETWORK_PASSPHRASE = "Standalone Network ; February 2017" UNSAFE_QUORUM = true From 87fb038e9aeb4df4d3620936310c074be459286b Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Fri, 5 Jul 2024 13:59:40 -0700 Subject: [PATCH 15/17] hubble-469: start quickstart with '--limits default' to disable unneeded(for test purposes) soroban upgrades to local network --- exp/services/ledgerexporter/internal/integration_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/exp/services/ledgerexporter/internal/integration_test.go b/exp/services/ledgerexporter/internal/integration_test.go index 65239b8611..5eefe4ce13 100644 --- a/exp/services/ledgerexporter/internal/integration_test.go +++ b/exp/services/ledgerexporter/internal/integration_test.go @@ -274,7 +274,9 @@ func (s *LedgerExporterTestSuite) mustStartCore(t *testing.T, quickstartImage st resp, err := s.dockerCli.ContainerCreate(s.ctx, &container.Config{ Image: quickstartImage, - Cmd: []string{"--enable", "core", "--local"}, + // only run tge core service(no horizon, rpc, etc) and don't spend any time upgrading + // the core with newer soroban limits + Cmd: []string{"--enable", "core", "--limits", "default", "--local"}, ExposedPorts: nat.PortSet{ nat.Port("1570/tcp"): {}, nat.Port("11625/tcp"): {}, From bba71e6e0cb0f036b7e0d7bf6cb7ce372ca2de34 Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Fri, 5 Jul 2024 14:05:05 -0700 Subject: [PATCH 16/17] #hubble-469: fix gofmt warn --- exp/services/ledgerexporter/internal/integration_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exp/services/ledgerexporter/internal/integration_test.go b/exp/services/ledgerexporter/internal/integration_test.go index 5eefe4ce13..3b7079ceb8 100644 --- a/exp/services/ledgerexporter/internal/integration_test.go +++ b/exp/services/ledgerexporter/internal/integration_test.go @@ -276,7 +276,7 @@ func (s *LedgerExporterTestSuite) mustStartCore(t *testing.T, quickstartImage st Image: quickstartImage, // only run tge core service(no horizon, rpc, etc) and don't spend any time upgrading // the core with newer soroban limits - Cmd: []string{"--enable", "core", "--limits", "default", "--local"}, + Cmd: []string{"--enable", "core", "--limits", "default", "--local"}, ExposedPorts: nat.PortSet{ nat.Port("1570/tcp"): {}, nat.Port("11625/tcp"): {}, From f45234c9eaaee6437812683a8e4f26c72355cef0 Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Sun, 7 Jul 2024 22:12:50 -0700 Subject: [PATCH 17/17] #hubble-469: use fully qualified ENABLE settig for quickstart --- exp/services/ledgerexporter/internal/integration_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exp/services/ledgerexporter/internal/integration_test.go b/exp/services/ledgerexporter/internal/integration_test.go index 3b7079ceb8..dab2e5b5f8 100644 --- a/exp/services/ledgerexporter/internal/integration_test.go +++ b/exp/services/ledgerexporter/internal/integration_test.go @@ -276,7 +276,7 @@ func (s *LedgerExporterTestSuite) mustStartCore(t *testing.T, quickstartImage st Image: quickstartImage, // only run tge core service(no horizon, rpc, etc) and don't spend any time upgrading // the core with newer soroban limits - Cmd: []string{"--enable", "core", "--limits", "default", "--local"}, + Cmd: []string{"--enable", "core,,", "--limits", "default", "--local"}, ExposedPorts: nat.PortSet{ nat.Port("1570/tcp"): {}, nat.Port("11625/tcp"): {},