From 83f7f636b93a7ead4715c350d63d9c113ee0b342 Mon Sep 17 00:00:00 2001 From: Ragot Geoffrey Date: Wed, 6 Dec 2023 23:58:55 +0100 Subject: [PATCH] feat(orchestration): add triggers (#959) --- Earthfile | 1 + components/agent/go.mod | 16 +- components/agent/go.sum | 32 +- components/agent/internal/k8s/k8s.go | 2 +- components/auth/go.mod | 14 +- components/auth/go.sum | 267 +---- components/fctl/cmd/ledger/internal/print.go | 7 +- .../cmd/orchestration/instances/describe.go | 51 +- components/fctl/cmd/orchestration/root.go | 2 + .../fctl/cmd/orchestration/triggers/create.go | 111 ++ .../fctl/cmd/orchestration/triggers/delete.go | 80 ++ .../fctl/cmd/orchestration/triggers/list.go | 109 ++ .../triggers/occurrences/list.go | 105 ++ .../triggers/occurrences/root.go | 16 + .../fctl/cmd/orchestration/triggers/root.go | 21 + .../fctl/cmd/orchestration/triggers/show.go | 100 ++ .../fctl/cmd/search/views/transactions.go | 2 +- components/fctl/go.mod | 8 +- components/fctl/go.sum | 16 +- components/gateway/go.mod | 6 +- components/gateway/go.sum | 12 +- components/ledger/go.mod | 16 +- components/ledger/go.sum | 33 +- .../ledger/internal/analytics/analytics.go | 5 +- .../internal/api/v1/controllers_accounts.go | 7 +- .../api/v1/controllers_accounts_test.go | 5 +- .../internal/api/v1/controllers_balances.go | 5 +- .../internal/api/v1/controllers_config.go | 4 +- .../internal/api/v1/controllers_info.go | 7 +- .../internal/api/v1/controllers_info_test.go | 5 +- .../api/v1/controllers_transactions.go | 7 +- .../api/v1/controllers_transactions_test.go | 5 +- components/ledger/internal/api/v1/query.go | 4 +- .../internal/api/v2/controllers_accounts.go | 7 +- .../api/v2/controllers_accounts_test.go | 5 +- .../internal/api/v2/controllers_info.go | 7 +- .../internal/api/v2/controllers_info_test.go | 5 +- .../api/v2/controllers_list_ledgers.go | 5 +- .../api/v2/controllers_transactions.go | 7 +- .../api/v2/controllers_transactions_test.go | 5 +- components/ledger/internal/api/v2/query.go | 5 +- .../ledger/internal/storage/driver/cli.go | 6 +- .../ledger/internal/storage/driver/driver.go | 13 +- components/ledger/internal/storage/flags.go | 6 +- .../internal/storage/ledgerstore/accounts.go | 9 +- .../internal/storage/ledgerstore/balances.go | 7 +- .../internal/storage/ledgerstore/bucket.go | 6 +- .../internal/storage/ledgerstore/logs.go | 25 +- .../internal/storage/ledgerstore/logs_test.go | 5 +- .../internal/storage/ledgerstore/main_test.go | 5 +- .../storage/ledgerstore/migrations_v1.go | 5 +- .../storage/ledgerstore/transactions.go | 27 +- .../internal/storage/ledgerstore/utils.go | 18 +- .../storage/storagetesting/storage.go | 4 +- .../internal/storage/systemstore/ledgers.go | 7 +- .../storage/systemstore/ledgers_test.go | 9 +- .../internal/storage/systemstore/store.go | 6 +- .../bun/bunconnect/connect.go} | 29 +- .../bun/bunpaginate}/bigint.go | 2 +- .../bun/bunpaginate}/iterate.go | 2 +- .../bun/bunpaginate}/main_test.go | 2 +- .../bun/bunpaginate}/pagination.go | 2 +- .../bun/bunpaginate}/pagination_column.go | 6 +- .../bunpaginate}/pagination_column_test.go | 143 ++- .../bun/bunpaginate}/pagination_offset.go | 2 +- .../bunpaginate}/pagination_offset_test.go | 73 +- components/ledger/libs/go.mod | 18 +- components/ledger/libs/go.sum | 36 +- .../ledger/libs/migrations/migrator_test.go | 4 +- components/ledger/libs/publish/messages.go | 8 + components/operator/go.mod | 12 +- components/operator/go.sum | 24 +- .../deployments-apps-v1/monopod-latest.yaml | 8 + .../deployments-apps-v1/monopod-ledgerv1.yaml | 8 + ...monopod-payments-after-v1-0-0-alpha-6.yaml | 8 + ...onopod-payments-before-v1-0-0-alpha-6.yaml | 8 + .../monopod-search-before-v0-7-0.yaml | 8 + .../orchestration-worker.yaml | 8 + .../orchestration-worker.yaml | 8 + .../orchestration-worker.yaml | 8 + .../orchestration-worker.yaml | 8 + .../orchestration-worker.yaml | 8 + .../orchestration-worker.yaml | 8 + .../configuration.yaml | 72 ++ .../results/configmaps--v1/auth-config.yaml | 42 + .../configmaps--v1/gateway-config.yaml | 259 +++++ .../configmaps--v1/search-benthos-global.yaml | 18 + .../search-benthos-resources.yaml | 50 + .../search-benthos-streams.yaml | 344 ++++++ .../search-benthos-templates.yaml | 90 ++ .../cronjobs-batch-v1/reindex-ledger.yaml | 39 + .../results/deployments-apps-v1/auth.yaml | 132 +++ .../results/deployments-apps-v1/control.yaml | 97 ++ .../results/deployments-apps-v1/gateway.yaml | 106 ++ .../results/deployments-apps-v1/ledger.yaml | 121 +++ .../orchestration-worker.yaml | 115 ++ .../deployments-apps-v1/orchestration.yaml | 119 +++ .../deployments-apps-v1/payments-api.yaml | 123 +++ .../payments-connectors.yaml | 123 +++ .../deployments-apps-v1/search-benthos.yaml | 155 +++ .../results/deployments-apps-v1/search.yaml | 120 +++ .../results/deployments-apps-v1/stargate.yaml | 105 ++ .../results/deployments-apps-v1/wallets.yaml | 101 ++ .../deployments-apps-v1/webhooks-worker.yaml | 107 ++ .../results/deployments-apps-v1/webhooks.yaml | 117 +++ .../gateway.yaml | 22 + .../jobs-batch-v1/auth-create-database.yaml | 57 + .../jobs-batch-v1/ledger--db-migration.yaml | 56 + .../jobs-batch-v1/ledger-create-database.yaml | 57 + .../orchestration-create-database.yaml | 57 + .../jobs-batch-v1/payments--db-migration.yaml | 54 + .../payments-create-database.yaml | 57 + .../webhooks-create-database.yaml | 57 + .../payments-v0.6.5-post-upgrade.yaml | 17 + .../payments-v0.7.0-post-upgrade.yaml | 17 + .../payments-v0.8.0-post-upgrade.yaml | 17 + .../payments-v0.8.1-post-upgrade.yaml | 17 + .../payments-v1.0.0-beta.3-pre-upgrade.yaml | 17 + .../search-v0.0.0-pre-upgrade.yaml | 17 + .../search-v0.10.0-pre-upgrade.yaml | 17 + .../search-v0.7.0-post-upgrade.yaml | 17 + .../search-v0.7.0-pre-upgrade.yaml | 17 + .../wallets-v0.4.3-post-upgrade.yaml | 17 + .../wallets-v0.4.4-post-upgrade.yaml | 17 + .../results/secrets--v1/auth-secret.yaml | 10 + .../results/services--v1/auth.yaml | 24 + .../results/services--v1/control.yaml | 24 + .../results/services--v1/gateway.yaml | 24 + .../results/services--v1/ledger.yaml | 24 + .../results/services--v1/orchestration.yaml | 24 + .../results/services--v1/payments-api.yaml | 24 + .../services--v1/payments-connectors.yaml | 24 + .../results/services--v1/search-benthos.yaml | 24 + .../results/services--v1/search.yaml | 24 + .../results/services--v1/wallets.yaml | 24 + .../results/services--v1/webhooks.yaml | 24 + .../multipod-orchestration-v0.2.0/stack.yaml | 11 + .../versions.yaml | 6 + .../orchestration-worker.yaml | 8 + .../orchestration-worker.yaml | 8 + .../orchestration-worker.yaml | 8 + .../orchestration-worker.yaml | 8 + .../internal/modules/orchestration/handler.go | 49 + components/orchestration/cmd/root.go | 18 +- components/orchestration/cmd/serve.go | 2 - components/orchestration/cmd/worker.go | 7 +- components/orchestration/go.mod | 68 +- components/orchestration/go.sum | 192 ++-- .../orchestration/internal/api/backend.go | 38 + .../api/handler_abort_workflow_instance.go | 5 +- .../internal/api/handler_create_trigger.go | 38 + .../api/handler_create_trigger_test.go | 31 + .../internal/api/handler_create_workflow.go | 2 +- .../api/handler_create_workflow_test.go | 3 +- .../internal/api/handler_delete_trigger.go | 26 + .../internal/api/handler_delete_workflow.go | 4 +- .../api/handler_delete_workflow_test.go | 2 +- .../internal/api/handler_get_trigger.go | 28 + .../internal/api/handler_list_instances.go | 5 +- .../api/handler_list_instances_test.go | 2 +- .../internal/api/handler_list_triggers.go | 19 + .../api/handler_list_triggers_occurrences.go | 20 + .../internal/api/handler_list_workflows.go | 5 +- .../internal/api/handler_post_event.go | 4 +- .../internal/api/handler_read_instance.go | 5 +- .../api/handler_read_instance_history.go | 5 +- .../api/handler_read_instance_test.go | 2 +- .../api/handler_read_stage_history.go | 4 +- .../internal/api/handler_read_workflow.go | 5 +- .../internal/api/handler_run_workflow.go | 10 +- .../internal/api/handler_run_workflow_test.go | 4 +- .../orchestration/internal/api/main_test.go | 12 +- .../orchestration/internal/api/module.go | 1 + .../orchestration/internal/api/router.go | 34 +- .../internal/storage/migrations.go | 26 + .../orchestration/internal/storage/sqlite.go | 25 - .../internal/temporal/worker_module.go | 69 -- .../client_module.go | 4 +- .../{temporal => temporalclient}/logger.go | 2 +- .../internal/temporalworker/module.go | 88 ++ .../internal/triggers/activity.go | 79 ++ .../internal/triggers/listener.go | 111 ++ .../internal/triggers/manager.go | 115 ++ .../orchestration/internal/triggers/module.go | 37 + .../internal/triggers/trigger.go | 156 +++ .../internal/triggers/trigger_test.go | 82 ++ .../internal/triggers/workflow_trigger.go | 59 ++ .../triggers/workflow_trigger_test.go | 46 + .../internal/workflow/manager.go | 38 +- .../orchestration/internal/workflow/module.go | 24 +- .../workflow/stages/internal/context.go | 18 +- .../stages/internal/stagestesting/schema.go | 2 + .../stages/internal/stagestesting/workflow.go | 2 + components/orchestration/openapi.yaml | 168 +++ components/payments/go.mod | 26 +- components/payments/go.sum | 50 +- components/reconciliation/go.mod | 8 +- components/reconciliation/go.sum | 12 +- components/search/go.mod | 12 +- components/search/go.sum | 24 +- components/stargate/go.mod | 6 +- components/stargate/go.sum | 12 +- components/wallets/go.mod | 12 +- components/wallets/go.sum | 24 +- components/webhooks/go.mod | 24 +- components/webhooks/go.sum | 48 +- libs/go-libs/bun/bunconnect/connect.go | 73 ++ libs/go-libs/bun/bunpaginate/bigint.go | 92 ++ libs/go-libs/bun/bunpaginate/iterate.go | 36 + libs/go-libs/bun/bunpaginate/main_test.go | 22 + libs/go-libs/bun/bunpaginate/pagination.go | 99 ++ .../bun/bunpaginate/pagination_column.go | 117 +++ .../bun/bunpaginate/pagination_column_test.go | 346 ++++++ .../bun/bunpaginate/pagination_offset.go | 48 + .../bun/bunpaginate/pagination_offset_test.go | 173 +++ libs/go-libs/go.mod | 24 +- libs/go-libs/go.sum | 48 +- libs/go-libs/migrations/migrator_test.go | 4 +- libs/go-libs/publish/messages.go | 8 + openapi/build/generate.json | 984 +++++++++++++++++- tests/integration/go.mod | 35 +- tests/integration/go.sum | 70 +- tests/integration/internal/env.go | 10 +- tests/integration/internal/events.go | 10 + .../internal/modules/orchestration.go | 6 + tests/integration/internal/service.go | 1 + .../suite/orchestration-triggers.go | 153 +++ .../suite/orchestration-workflows-execute.go | 1 + 228 files changed, 8416 insertions(+), 1221 deletions(-) create mode 100644 components/fctl/cmd/orchestration/triggers/create.go create mode 100644 components/fctl/cmd/orchestration/triggers/delete.go create mode 100644 components/fctl/cmd/orchestration/triggers/list.go create mode 100644 components/fctl/cmd/orchestration/triggers/occurrences/list.go create mode 100644 components/fctl/cmd/orchestration/triggers/occurrences/root.go create mode 100644 components/fctl/cmd/orchestration/triggers/root.go create mode 100644 components/fctl/cmd/orchestration/triggers/show.go rename components/ledger/{internal/storage/sqlutils/utils.go => libs/bun/bunconnect/connect.go} (79%) rename components/ledger/{internal/storage/paginate => libs/bun/bunpaginate}/bigint.go (98%) rename components/ledger/{internal/storage/paginate => libs/bun/bunpaginate}/iterate.go (97%) rename components/ledger/{internal/storage/paginate => libs/bun/bunpaginate}/main_test.go (93%) rename components/ledger/{internal/storage/paginate => libs/bun/bunpaginate}/pagination.go (98%) rename components/ledger/{internal/storage/paginate => libs/bun/bunpaginate}/pagination_column.go (95%) rename components/ledger/{internal/storage/paginate => libs/bun/bunpaginate}/pagination_column_test.go (63%) rename components/ledger/{internal/storage/paginate => libs/bun/bunpaginate}/pagination_offset.go (98%) rename components/ledger/{internal/storage/paginate => libs/bun/bunpaginate}/pagination_offset_test.go (57%) create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/configuration.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/auth-config.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/gateway-config.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-global.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-resources.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-streams.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-templates.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/cronjobs-batch-v1/reindex-ledger.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/auth.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/control.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/gateway.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/ledger.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/orchestration-worker.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/orchestration.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/payments-api.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/payments-connectors.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/search-benthos.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/search.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/stargate.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/wallets.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/webhooks-worker.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/webhooks.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/ingresses-networking.k8s.io-v1/gateway.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/auth-create-database.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/ledger--db-migration.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/ledger-create-database.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/orchestration-create-database.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/payments--db-migration.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/payments-create-database.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/webhooks-create-database.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.6.5-post-upgrade.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.7.0-post-upgrade.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.8.0-post-upgrade.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.8.1-post-upgrade.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v1.0.0-beta.3-pre-upgrade.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.0.0-pre-upgrade.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.10.0-pre-upgrade.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.7.0-post-upgrade.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.7.0-pre-upgrade.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/wallets-v0.4.3-post-upgrade.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/wallets-v0.4.4-post-upgrade.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/secrets--v1/auth-secret.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/auth.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/control.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/gateway.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/ledger.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/orchestration.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/payments-api.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/payments-connectors.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/search-benthos.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/search.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/wallets.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/webhooks.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/stack.yaml create mode 100644 components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/versions.yaml create mode 100644 components/orchestration/internal/api/backend.go create mode 100644 components/orchestration/internal/api/handler_create_trigger.go create mode 100644 components/orchestration/internal/api/handler_create_trigger_test.go create mode 100644 components/orchestration/internal/api/handler_delete_trigger.go create mode 100644 components/orchestration/internal/api/handler_get_trigger.go create mode 100644 components/orchestration/internal/api/handler_list_triggers.go create mode 100644 components/orchestration/internal/api/handler_list_triggers_occurrences.go delete mode 100644 components/orchestration/internal/storage/sqlite.go delete mode 100644 components/orchestration/internal/temporal/worker_module.go rename components/orchestration/internal/{temporal => temporalclient}/client_module.go (92%) rename components/orchestration/internal/{temporal => temporalclient}/logger.go (97%) create mode 100644 components/orchestration/internal/temporalworker/module.go create mode 100644 components/orchestration/internal/triggers/activity.go create mode 100644 components/orchestration/internal/triggers/listener.go create mode 100644 components/orchestration/internal/triggers/manager.go create mode 100644 components/orchestration/internal/triggers/module.go create mode 100644 components/orchestration/internal/triggers/trigger.go create mode 100644 components/orchestration/internal/triggers/trigger_test.go create mode 100644 components/orchestration/internal/triggers/workflow_trigger.go create mode 100644 components/orchestration/internal/triggers/workflow_trigger_test.go create mode 100644 libs/go-libs/bun/bunconnect/connect.go create mode 100644 libs/go-libs/bun/bunpaginate/bigint.go create mode 100644 libs/go-libs/bun/bunpaginate/iterate.go create mode 100644 libs/go-libs/bun/bunpaginate/main_test.go create mode 100644 libs/go-libs/bun/bunpaginate/pagination.go create mode 100644 libs/go-libs/bun/bunpaginate/pagination_column.go create mode 100644 libs/go-libs/bun/bunpaginate/pagination_column_test.go create mode 100644 libs/go-libs/bun/bunpaginate/pagination_offset.go create mode 100644 libs/go-libs/bun/bunpaginate/pagination_offset_test.go create mode 100644 tests/integration/suite/orchestration-triggers.go diff --git a/Earthfile b/Earthfile index 3401582caf..7f4cf5dd53 100644 --- a/Earthfile +++ b/Earthfile @@ -40,6 +40,7 @@ build-final-spec: SAVE ARTIFACT build/generate-with-version.json AS LOCAL openapi/build/generate.json build-sdk: + BUILD --pass-args +build-final-spec # Force output of the final spec FROM core+base-image WORKDIR /src RUN apk update && apk add yq diff --git a/components/agent/go.mod b/components/agent/go.mod index bf00bd0c87..0919343d9d 100644 --- a/components/agent/go.mod +++ b/components/agent/go.mod @@ -10,7 +10,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.3 + github.com/stretchr/testify v1.8.4 github.com/zitadel/oidc/v2 v2.0.0-00010101000000-000000000000 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 go.uber.org/fx v1.19.3 @@ -77,27 +77,27 @@ require ( github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.14.0 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel v1.17.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.17.0 // indirect go.opentelemetry.io/otel/sdk v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.17.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.16.1 // indirect go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.12.0 // indirect golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/term v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/time v0.3.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/components/agent/go.sum b/components/agent/go.sum index 4800aeeb90..392cd14d19 100644 --- a/components/agent/go.sum +++ b/components/agent/go.sum @@ -307,8 +307,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 h1:OXsouNDvuET5o1A4uvoCnAXuuNke8JlfZWceciyUlC8= @@ -334,8 +334,8 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8= go.opentelemetry.io/contrib/propagators/b3 v1.14.0 h1:0SBc35DESy/YXShxFtu3634OwcEWJoGzSA8Hx/NbOo8= go.opentelemetry.io/contrib/propagators/b3 v1.14.0/go.mod h1:A76N3hFhcmXo+tkmn6SE1x0AQv1JwFyiJXMclWzy/YQ= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= @@ -348,12 +348,12 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 h1:iqjq9 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0/go.mod h1:hGXzO5bhhSHZnKvrDaXB82Y9DRFour0Nz/KrBh7reWw= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -375,8 +375,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= 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= @@ -508,11 +508,11 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= 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= @@ -521,8 +521,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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= diff --git a/components/agent/internal/k8s/k8s.go b/components/agent/internal/k8s/k8s.go index f7719c861d..96451ab7e9 100644 --- a/components/agent/internal/k8s/k8s.go +++ b/components/agent/internal/k8s/k8s.go @@ -25,7 +25,7 @@ func newClient(config *rest.Config) (*clientv1beta3.Client, error) { if crdConfig.UserAgent == "" { crdConfig.UserAgent = rest.DefaultKubernetesUserAgent() } - + config.Wrap(func(rt http.RoundTripper) http.RoundTripper { return otlp.NewRoundTripper(rt, false) }) diff --git a/components/auth/go.mod b/components/auth/go.mod index b87c472def..c4847531b8 100644 --- a/components/auth/go.mod +++ b/components/auth/go.mod @@ -11,16 +11,16 @@ require ( github.com/pkg/errors v0.9.1 github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.3 + github.com/stretchr/testify v1.8.4 github.com/zitadel/logging v0.3.4 github.com/zitadel/oidc/v2 v2.6.0 go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.39.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 - go.opentelemetry.io/otel v1.16.0 - go.opentelemetry.io/otel/trace v1.16.0 + go.opentelemetry.io/otel v1.17.0 + go.opentelemetry.io/otel/trace v1.17.0 go.uber.org/fx v1.19.1 golang.org/x/oauth2 v0.7.0 - golang.org/x/text v0.13.0 + golang.org/x/text v0.12.0 gopkg.in/square/go-jose.v2 v2.6.0 gorm.io/driver/postgres v1.4.8 gorm.io/gorm v1.24.5 @@ -89,17 +89,17 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.17.0 // indirect go.opentelemetry.io/otel/sdk v1.16.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.16.1 // indirect go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.12.0 // indirect golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.12.0 // indirect golang.org/x/tools v0.6.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect diff --git a/components/auth/go.sum b/components/auth/go.sum index 5436d70e9e..8963c078ac 100644 --- a/components/auth/go.sum +++ b/components/auth/go.sum @@ -17,146 +17,24 @@ 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.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= 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.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= 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/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 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= @@ -167,27 +45,15 @@ github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2B github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= github.com/ThreeDotsLabs/watermill v1.2.0 h1:TU3TML1dnQ/ifK09F2+4JQk2EKhmhXe7Qv7eb5ZpTS8= github.com/ThreeDotsLabs/watermill v1.2.0/go.mod h1:IuVxGk/kgCN0cex2S94BLglUiB0PwOm8hbUhm6g2Nx4= -github.com/ThreeDotsLabs/watermill-http v1.1.4/go.mod h1:mkQ9CC0pxTZerNwr281rBoOy355vYt/lePkmYSX/BRg= -github.com/ThreeDotsLabs/watermill-kafka/v2 v2.2.2/go.mod h1:U001oyrHo+df3Q7hIXgKqxY2OW6woz64+GNuIxZokbM= -github.com/ThreeDotsLabs/watermill-nats/v2 v2.0.0/go.mod h1:X6pcl579pScj4mII3KM/WJ+bcOqORqiCToy92f4gqJ4= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -198,16 +64,13 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -218,8 +81,6 @@ github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxG github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/cli v20.10.17+incompatible h1:eO2KS7ZFeov5UJeaDmIs1NFEDRf32PaqRpvoEkKBy5M= github.com/docker/cli v20.10.17+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= @@ -228,10 +89,6 @@ github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKoh github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= -github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -239,21 +96,14 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= -github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-chi/render v1.0.2/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -262,9 +112,7 @@ github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -274,11 +122,9 @@ github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzq github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -287,7 +133,6 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -306,7 +151,6 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -321,9 +165,6 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-github/v31 v31.0.0/go.mod h1:NQPZol8/1sMoWYGN2yaALIBytu17gAWfhbweiEed3pM= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= 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= @@ -344,10 +185,8 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= 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.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -359,20 +198,10 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 h1:1JYBfzqrWPcCclBwxFCPAou9n+q86mfnu7NAeHfte7A= github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0/go.mod h1:YDZoGHuwE+ov0c8smSH49WLF3F2LaWnYYuDVd+EWrc0= -github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= @@ -387,30 +216,21 @@ github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZ github.com/jackc/pgx/v5 v5.3.0 h1:/NQi8KHMpKWHInxXesC8yD4DhkXPrVhmnwYkjp9AmBA= github.com/jackc/pgx/v5 v5.3.0/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= github.com/jackc/puddle/v2 v2.2.0/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= -github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= -github.com/jcmturner/gokrb5/v8 v8.4.3/go.mod h1:dqRwJGXznQrzw6cWmyo6kH+E7jksEQG/CyVWsJEsJO0= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jeremija/gosubmit v0.2.7 h1:At0OhGCFGPXyjPYAsCchoBUhE099pcBXmsb4iZqROIc= -github.com/jeremija/gosubmit v0.2.7/go.mod h1:Ui+HS073lCFREXBbdfrJzMB57OI/bdxTiLtrDHHhFPI= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/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.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -419,29 +239,16 @@ github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lithammer/shortuuid/v3 v3.0.7 h1:trX0KTHy4Pbwo/6ia8fscyHoGA+mf1jWbPJVuvyJQQ8= github.com/lithammer/shortuuid/v3 v3.0.7/go.mod h1:vMk8ke37EmiewwolSO1NLW8vP4ZaKlRuDIi8tWWmAts= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -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/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/muhlemmer/gu v0.3.1 h1:7EAqmFrW7n3hETvuAdmFmn4hS8W+z3LgKtrnow+YzNM= github.com/muhlemmer/gu v0.3.1/go.mod h1:YHtHR+gxM+bKEIIs7Hmi9sPT3ZDUvTN/i88wQpZkrdM= -github.com/nats-io/jwt/v2 v2.5.0/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI= -github.com/nats-io/nats-server/v2 v2.9.23/go.mod h1:wEjrEy9vnqIGE4Pqz4/c75v9Pmaq7My2IgFmnykc4C0= -github.com/nats-io/nats.go v1.28.0/go.mod h1:XpbWUlOElGwTYbMR7imivs7jJj9GtK7ypv321Wp6pjc= -github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/oauth2-proxy/mockoidc v0.0.0-20220308204021-b9169deeb282 h1:TQMyrpijtkFyXpNI3rY5hsZQZw+paiH+BfAlsb81HBY= github.com/oauth2-proxy/mockoidc v0.0.0-20220308204021-b9169deeb282/go.mod h1:rW25Kyd08Wdn3UVn0YBsDTSvReu0jqpmJKzxITPSjks= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= @@ -456,24 +263,15 @@ github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.m github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/ory/dockertest/v3 v3.9.1 h1:v4dkG+dlu76goxMiTT2j8zV7s4oPPEppKT8K8p2f1kY= github.com/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= @@ -483,12 +281,7 @@ github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/segmentio/analytics-go v3.1.0+incompatible/go.mod h1:C7CYBtQWk4vRk2RyLu0qOcbHJ18E3F1HV2C/8JvKN48= -github.com/segmentio/backo-go v1.0.1/go.mod h1:9/Rh6yILuLysoQnZ2oNooD2g7aBnvM7r/fNVxRNWfBc= -github.com/shirou/gopsutil/v3 v3.23.4/go.mod h1:ZcGxyfzAMRevhUR2+cfhXDH6gQdFYE/t8j1nsU4mPI8= -github.com/shoenig/go-m1cpu v0.1.5/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= @@ -519,17 +312,11 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= -github.com/uptrace/bun v1.1.14/go.mod h1:RHk6DrIisO62dv10pUOJCz5MphXThuOTpVNYEYv7NI8= -github.com/uptrace/bun/dialect/pgdialect v1.1.14/go.mod h1:v6YiaXmnKQ2FlhRD2c0ZfKd+QXH09pYn4H8ojaavkKk= -github.com/uptrace/bun/extra/bundebug v1.1.14/go.mod h1:lto3guzS2v6mnQp1+akyE+ecBLOltevDDe324NXEYdw= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 h1:OXsouNDvuET5o1A4uvoCnAXuuNke8JlfZWceciyUlC8= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21/go.mod h1:Xm3wlRGm5xzdAGPOvqydXPiGj0Da1q0OlUNm7Utoda4= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 h1:HCqo51kNF8wxDMDhxcN5S6DlfZXigMtptRpkvjBCeVc= @@ -537,11 +324,6 @@ github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21/go.mod h1:2MNqrUmDrt5 github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -549,62 +331,47 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zitadel/logging v0.3.4 h1:9hZsTjMMTE3X2LUi0xcF9Q9EdLo+FAezeu52ireBbHM= github.com/zitadel/logging v0.3.4/go.mod h1:aPpLQhE+v6ocNK0TWrBrd363hZ95KcI17Q1ixAQwZF0= github.com/zitadel/oidc/v2 v2.6.0 h1:5Be3N72NWFFKZqoEe2YlFHNOu4Mf2Ao5CtjKPgWiaws= github.com/zitadel/oidc/v2 v2.6.0/go.mod h1:iCyw28lFEx3s+3s/IH8CJdph6zDvXreu0DTtHaXZAgQ= -go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= -go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/github.com/Shopify/sarama/otelsarama v0.42.0/go.mod h1:TDCzwfNfOr8Of31UVortnNAvRrgMyMS0zAXw9I3hoSc= go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.39.0 h1:+MLOxP3ot+XZZI1f+5M/uRCkAL7mjabNh0g4lMflG4Q= go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.39.0/go.mod h1:Akz6p0hPFEJf0vHyyDm0ZoY3ZS2gyjdaNL9KTylDuq8= -go.opentelemetry.io/contrib/instrumentation/host v0.42.0/go.mod h1:w6v1mVemRjTTdfejACjf+LgVA6zKtHOWmdAIf3icx7A= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8= -go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0/go.mod h1:rD9feqRYP24P14t5kmhNMqsqm1jvKmpx2H2rKVw52V8= go.opentelemetry.io/contrib/propagators/b3 v1.14.0 h1:0SBc35DESy/YXShxFtu3634OwcEWJoGzSA8Hx/NbOo8= go.opentelemetry.io/contrib/propagators/b3 v1.14.0/go.mod h1:A76N3hFhcmXo+tkmn6SE1x0AQv1JwFyiJXMclWzy/YQ= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0/go.mod h1:vLarbg68dH2Wa77g71zmKQqlQ8+8Rq3GRG31uc0WcWI= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.39.0/go.mod h1:UqL5mZ3qs6XYhDnZaW1Ps4upD+PX6LipH40AoeuIlwU= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.39.0/go.mod h1:sWFbI3jJ+6JdjOVepA5blpv/TJ20Hw+26561iMbWcwU= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.39.0/go.mod h1:xY111jIZtWb+pUUgT4UiiSonAaY2cD2Ts5zvuKLki3o= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 h1:cbsD4cUcviQGXdw8+bo5x2wazq10SKz8hEbtCRPcU78= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0/go.mod h1:JgXSGah17croqhJfhByOLVY719k1emAXC8MVhCIJlRs= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 h1:TVQp/bboR4mhZSav+MdgXB8FaRho1RC8UwVn3T0vjVc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0/go.mod h1:I33vtIe0sR96wfrUcilIzLoA3mLHhRmz9S9Te0S3gDo= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 h1:iqjq9LAB8aK++sKVcELezzn655JnBNdsDhghU4G/So8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0/go.mod h1:hGXzO5bhhSHZnKvrDaXB82Y9DRFour0Nz/KrBh7reWw= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0/go.mod h1:csyQxQ0UHHKVA8KApS7eUO/klMO5sd/av5CNZNU4O6w= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= -go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -615,7 +382,6 @@ go.uber.org/dig v1.16.1/go.mod h1:557JTAUZT5bUK0SvCwikmLPPtdQhfvLYtO5tJgQSbnk= go.uber.org/fx v1.19.1 h1:JwYIYAQzXBuBBwSZ1/tn/95pnQO/Sp3yE8lWj9eSAzI= go.uber.org/fx v1.19.1/go.mod h1:bGK+AEy7XUwTBkqCsK/vDyFF0JJOA6X5KWpNC0e6qTA= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= @@ -630,8 +396,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/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.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= 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= @@ -781,12 +547,11 @@ 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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= 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= @@ -797,12 +562,11 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -860,7 +624,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -880,7 +643,6 @@ 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.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= 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= @@ -992,7 +754,6 @@ gorm.io/gorm v1.24.5 h1:g6OPREKqqlWq4kh/3MCQbZKImeB9e6Xgc4zD+JgNZGE= gorm.io/gorm v1.24.5/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= -gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/components/fctl/cmd/ledger/internal/print.go b/components/fctl/cmd/ledger/internal/print.go index c55cae7173..915848fe63 100644 --- a/components/fctl/cmd/ledger/internal/print.go +++ b/components/fctl/cmd/ledger/internal/print.go @@ -58,7 +58,12 @@ func PrintExpandedTransaction(out io.Writer, transaction shared.ExpandedTransact if err := printCommonInformation( out, transaction.ID, - *transaction.Reference, + func() string { + if transaction.Reference == nil { + return "" + } + return *transaction.Reference + }(), transaction.Postings, transaction.Timestamp, ); err != nil { diff --git a/components/fctl/cmd/orchestration/instances/describe.go b/components/fctl/cmd/orchestration/instances/describe.go index 336468fc31..4acf0f1082 100644 --- a/components/fctl/cmd/orchestration/instances/describe.go +++ b/components/fctl/cmd/orchestration/instances/describe.go @@ -1,7 +1,6 @@ package instances import ( - "encoding/json" "fmt" "io" "time" @@ -154,38 +153,12 @@ func printStage(cmd *cobra.Command, i int, client *formance.Formance, id string, listItems := make([]pterm.BulletListItem, 0) - buf, err := json.Marshal(history.Input) - if err != nil { - return err - } - - var ( - stageSend shared.StageSend - stageDelay shared.StageDelay - stageWaitEvent shared.StageWaitEvent - ) - - err = json.Unmarshal(buf, &stageSend) - if err != nil { - return err - } - - err = json.Unmarshal(buf, &stageDelay) - if err != nil { - return err - } - - err = json.Unmarshal(buf, &stageWaitEvent) - if err != nil { - return err - } - - switch { - case stageSend.Amount != nil && stageSend.Source != nil && stageSend.Destination != nil: + switch history.Input.Type { + case shared.StageTypeStageSend: printHistoryBaseInfo(cmd.OutOrStdout(), "send", i, history) - cyanWriter.Printfln("Send %v %s from %s to %s", stageSend.Amount.Amount, - stageSend.Amount.Asset, stageSourceName(stageSend.Source), - stageDestinationName(stageSend.Destination)) + cyanWriter.Printfln("Send %v %s from %s to %s", history.Input.StageSend.Amount.Amount, + history.Input.StageSend.Amount.Asset, stageSourceName(history.Input.StageSend.Source), + stageDestinationName(history.Input.StageSend.Destination)) fctl.Println() stageResponse, err := client.Orchestration.GetInstanceStageHistory(cmd.Context(), operations.GetInstanceStageHistoryRequest{ @@ -291,17 +264,17 @@ func printStage(cmd *cobra.Command, i int, client *formance.Formance, id string, listItems = append(listItems, historyItemError(*historyStage.Error)) } } - case stageDelay.Duration != nil && stageDelay.Until != nil: + case shared.StageTypeStageDelay: printHistoryBaseInfo(cmd.OutOrStdout(), "delay", i, history) switch { - case stageDelay.Duration != nil: - listItems = append(listItems, historyItemTitle("Pause workflow for a delay of %s", *stageDelay.Duration)) - case stageDelay.Until != nil: - listItems = append(listItems, historyItemTitle("Pause workflow until %s", *stageDelay.Until)) + case history.Input.StageDelay.Duration != nil: + listItems = append(listItems, historyItemTitle("Pause workflow for a delay of %s", *history.Input.StageDelay.Duration)) + case history.Input.StageDelay.Until != nil: + listItems = append(listItems, historyItemTitle("Pause workflow until %s", *history.Input.StageDelay.Until)) } - case stageWaitEvent.Event != "": + case shared.StageTypeStageWaitEvent: printHistoryBaseInfo(cmd.OutOrStdout(), "wait_event", i, history) - listItems = append(listItems, historyItemTitle("Waiting event '%s'", stageWaitEvent.Event)) + listItems = append(listItems, historyItemTitle("Waiting event '%s'", history.Input.StageWaitEvent.Event)) if history.Error == nil { if history.Terminated { listItems = append(listItems, historyItemDetails("Event received!")) diff --git a/components/fctl/cmd/orchestration/root.go b/components/fctl/cmd/orchestration/root.go index a71663691b..06ba626a85 100644 --- a/components/fctl/cmd/orchestration/root.go +++ b/components/fctl/cmd/orchestration/root.go @@ -2,6 +2,7 @@ package orchestration import ( "github.com/formancehq/fctl/cmd/orchestration/instances" + "github.com/formancehq/fctl/cmd/orchestration/triggers" "github.com/formancehq/fctl/cmd/orchestration/workflows" fctl "github.com/formancehq/fctl/pkg" "github.com/spf13/cobra" @@ -15,6 +16,7 @@ func NewCommand() *cobra.Command { fctl.WithChildCommands( instances.NewCommand(), workflows.NewCommand(), + triggers.NewCommand(), ), ) } diff --git a/components/fctl/cmd/orchestration/triggers/create.go b/components/fctl/cmd/orchestration/triggers/create.go new file mode 100644 index 0000000000..26ae2dd4dc --- /dev/null +++ b/components/fctl/cmd/orchestration/triggers/create.go @@ -0,0 +1,111 @@ +package triggers + +import ( + "fmt" + "strings" + + fctl "github.com/formancehq/fctl/pkg" + "github.com/formancehq/formance-sdk-go/pkg/models/shared" + "github.com/formancehq/stack/libs/go-libs/pointer" + "github.com/pkg/errors" + "github.com/pterm/pterm" + "github.com/spf13/cobra" +) + +type TriggersCreateStore struct { + Trigger shared.Trigger `json:"trigger"` +} +type TriggersCreateController struct { + store *TriggersCreateStore + filterFlag string + varsFlag string +} + +var _ fctl.Controller[*TriggersCreateStore] = (*TriggersCreateController)(nil) + +func NewDefaultTriggersCreateStore() *TriggersCreateStore { + return &TriggersCreateStore{} +} + +func NewTriggersCreateController() *TriggersCreateController { + return &TriggersCreateController{ + store: NewDefaultTriggersCreateStore(), + filterFlag: "filter", + varsFlag: "vars", + } +} + +func NewCreateCommand() *cobra.Command { + ctrl := NewTriggersCreateController() + return fctl.NewCommand("create", + fctl.WithShortDescription("Create a trigger"), + fctl.WithArgs(cobra.ExactArgs(2)), + fctl.WithController[*TriggersCreateStore](ctrl), + fctl.WithStringFlag(ctrl.filterFlag, "", "Filter events"), + fctl.WithStringSliceFlag(ctrl.varsFlag, []string{}, "Variables to pass to the workflow"), + ) +} + +func (c *TriggersCreateController) GetStore() *TriggersCreateStore { + return c.store +} + +func (c *TriggersCreateController) Run(cmd *cobra.Command, args []string) (fctl.Renderable, error) { + soc, err := fctl.GetStackOrganizationConfig(cmd) + if err != nil { + return nil, err + } + + client, err := fctl.NewStackClient(cmd, soc.Config, soc.Stack) + if err != nil { + return nil, errors.Wrap(err, "creating stack client") + } + + var ( + event = args[0] + filter = fctl.GetString(cmd, c.filterFlag) + vars = fctl.GetStringSlice(cmd, c.varsFlag) + workflow = args[1] + ) + + data := &shared.TriggerData{ + Event: event, + WorkflowID: workflow, + Vars: map[string]interface{}{}, + } + if filter != "" { + data.Filter = pointer.For(filter) + } + if len(vars) > 0 { + for _, v := range vars { + parts := strings.SplitN(v, "=", 2) + if len(parts) != 2 { + return nil, errors.New("invalid 'vars' flag") + } + data.Vars[parts[0]] = parts[1] + } + } + + res, err := client.Orchestration.CreateTrigger(cmd.Context(), data) + if err != nil { + return nil, errors.Wrap(err, "reading trigger") + } + + if res.Error != nil { + return nil, fmt.Errorf("%s: %s", res.Error.ErrorCode, res.Error.ErrorMessage) + } + + if res.StatusCode >= 300 { + return nil, fmt.Errorf("unexpected status code: %d", res.StatusCode) + } + + c.store.Trigger = res.CreateTriggerResponse.Data + + return c, nil +} + +func (c *TriggersCreateController) Render(cmd *cobra.Command, args []string) error { + pterm.Success.WithWriter(cmd.OutOrStdout()).Printfln("Trigger created with ID: %s", c.store.Trigger.ID) + + return nil +} diff --git a/components/fctl/cmd/orchestration/triggers/delete.go b/components/fctl/cmd/orchestration/triggers/delete.go new file mode 100644 index 0000000000..52440fd3b5 --- /dev/null +++ b/components/fctl/cmd/orchestration/triggers/delete.go @@ -0,0 +1,80 @@ +package triggers + +import ( + "fmt" + + fctl "github.com/formancehq/fctl/pkg" + "github.com/formancehq/formance-sdk-go/pkg/models/operations" + "github.com/pkg/errors" + "github.com/pterm/pterm" + "github.com/spf13/cobra" +) + +type TriggersDeleteStore struct { + Success bool `json:"success"` + TriggerID string `json:"triggerID"` +} +type TriggersDeleteController struct { + store *TriggersDeleteStore +} + +var _ fctl.Controller[*TriggersDeleteStore] = (*TriggersDeleteController)(nil) + +func NewDefaultTriggersDeleteStore() *TriggersDeleteStore { + return &TriggersDeleteStore{} +} + +func NewTriggersDeleteController() *TriggersDeleteController { + return &TriggersDeleteController{ + store: NewDefaultTriggersDeleteStore(), + } +} + +func NewDeleteCommand() *cobra.Command { + return fctl.NewCommand("delete ", + fctl.WithShortDescription("Delete a specific workflow trigger"), + fctl.WithArgs(cobra.ExactArgs(1)), + fctl.WithController[*TriggersDeleteStore](NewTriggersDeleteController()), + ) +} + +func (c *TriggersDeleteController) GetStore() *TriggersDeleteStore { + return c.store +} + +func (c *TriggersDeleteController) Run(cmd *cobra.Command, args []string) (fctl.Renderable, error) { + soc, err := fctl.GetStackOrganizationConfig(cmd) + if err != nil { + return nil, err + } + + client, err := fctl.NewStackClient(cmd, soc.Config, soc.Stack) + if err != nil { + return nil, errors.Wrap(err, "creating stack client") + } + + res, err := client.Orchestration.DeleteTrigger(cmd.Context(), operations.DeleteTriggerRequest{ + TriggerID: args[0], + }) + if err != nil { + return nil, errors.Wrap(err, "deleting trigger") + } + + if res.Error != nil { + return nil, fmt.Errorf("%s: %s", res.Error.ErrorCode, res.Error.ErrorMessage) + } + + if res.StatusCode >= 300 { + return nil, fmt.Errorf("unexpected status code: %d", res.StatusCode) + } + + c.store.Success = true + c.store.TriggerID = args[0] + + return c, nil +} + +func (c *TriggersDeleteController) Render(cmd *cobra.Command, args []string) error { + pterm.Success.Printfln("Trigger %s Deleted!", c.store.TriggerID) + return nil +} diff --git a/components/fctl/cmd/orchestration/triggers/list.go b/components/fctl/cmd/orchestration/triggers/list.go new file mode 100644 index 0000000000..681d774a86 --- /dev/null +++ b/components/fctl/cmd/orchestration/triggers/list.go @@ -0,0 +1,109 @@ +package triggers + +import ( + "fmt" + "time" + + fctl "github.com/formancehq/fctl/pkg" + "github.com/formancehq/formance-sdk-go/pkg/models/shared" + "github.com/pkg/errors" + "github.com/pterm/pterm" + "github.com/spf13/cobra" +) + +type TriggersListStore struct { + WorkflowTrigger []shared.Trigger `json:"workflowTriggers"` +} +type TriggersListController struct { + store *TriggersListStore +} + +var _ fctl.Controller[*TriggersListStore] = (*TriggersListController)(nil) + +func NewDefaultTriggersListStore() *TriggersListStore { + return &TriggersListStore{} +} + +func NewTriggersListController() *TriggersListController { + return &TriggersListController{ + store: NewDefaultTriggersListStore(), + } +} + +func NewListCommand() *cobra.Command { + c := NewTriggersListController() + return fctl.NewCommand("list", + fctl.WithShortDescription("List all workflows triggers"), + fctl.WithAliases("ls", "l"), + fctl.WithArgs(cobra.ExactArgs(0)), + fctl.WithController[*TriggersListStore](c), + ) +} + +func (c *TriggersListController) GetStore() *TriggersListStore { + return c.store +} + +func (c *TriggersListController) Run(cmd *cobra.Command, args []string) (fctl.Renderable, error) { + soc, err := fctl.GetStackOrganizationConfig(cmd) + if err != nil { + return nil, err + } + + client, err := fctl.NewStackClient(cmd, soc.Config, soc.Stack) + if err != nil { + return nil, errors.Wrap(err, "creating stack client") + } + + response, err := client.Orchestration.ListTriggers(cmd.Context()) + if err != nil { + return nil, err + } + + if response.Error != nil { + return nil, fmt.Errorf("%s: %s", response.Error.ErrorCode, response.Error.ErrorMessage) + } + + if response.StatusCode >= 300 { + return nil, fmt.Errorf("unexpected status code: %d", response.StatusCode) + } + + c.store.WorkflowTrigger = response.ListTriggersResponse.Data + + return c, nil +} + +func (c *TriggersListController) Render(cmd *cobra.Command, args []string) error { + + if len(c.store.WorkflowTrigger) == 0 { + fctl.Println("No triggers found.") + return nil + } + if err := pterm.DefaultTable. + WithHasHeader(true). + WithWriter(cmd.OutOrStdout()). + WithData( + fctl.Prepend( + fctl.Map(c.store.WorkflowTrigger, + func(src shared.Trigger) []string { + return []string{ + src.ID, + src.WorkflowID, + src.CreatedAt.Format(time.RFC3339), + src.Event, + func() string { + if src.Filter == nil { + return "" + } + return *src.Filter + }(), + } + }), + []string{"ID", "Workflow ID", "Created at", "Event", "Filter"}, + ), + ).Render(); err != nil { + return errors.Wrap(err, "rendering table") + } + + return nil +} diff --git a/components/fctl/cmd/orchestration/triggers/occurrences/list.go b/components/fctl/cmd/orchestration/triggers/occurrences/list.go new file mode 100644 index 0000000000..6111d0e1f2 --- /dev/null +++ b/components/fctl/cmd/orchestration/triggers/occurrences/list.go @@ -0,0 +1,105 @@ +package occurrences + +import ( + "fmt" + "time" + + "github.com/formancehq/formance-sdk-go/pkg/models/operations" + + fctl "github.com/formancehq/fctl/pkg" + "github.com/formancehq/formance-sdk-go/pkg/models/shared" + "github.com/pkg/errors" + "github.com/pterm/pterm" + "github.com/spf13/cobra" +) + +type OccurrencesListStore struct { + WorkflowOccurrence []shared.TriggerOccurrence `json:"occurrences"` +} +type OccurrencesListController struct { + store *OccurrencesListStore +} + +var _ fctl.Controller[*OccurrencesListStore] = (*OccurrencesListController)(nil) + +func NewDefaultOccurrencesListStore() *OccurrencesListStore { + return &OccurrencesListStore{} +} + +func NewOccurrencesListController() *OccurrencesListController { + return &OccurrencesListController{ + store: NewDefaultOccurrencesListStore(), + } +} + +func NewListCommand() *cobra.Command { + c := NewOccurrencesListController() + return fctl.NewCommand("list", + fctl.WithShortDescription("List all workflows occurrences"), + fctl.WithAliases("ls", "l"), + fctl.WithArgs(cobra.ExactArgs(1)), + fctl.WithController[*OccurrencesListStore](c), + ) +} + +func (c *OccurrencesListController) GetStore() *OccurrencesListStore { + return c.store +} + +func (c *OccurrencesListController) Run(cmd *cobra.Command, args []string) (fctl.Renderable, error) { + soc, err := fctl.GetStackOrganizationConfig(cmd) + if err != nil { + return nil, err + } + + client, err := fctl.NewStackClient(cmd, soc.Config, soc.Stack) + if err != nil { + return nil, errors.Wrap(err, "creating stack client") + } + + response, err := client.Orchestration.ListTriggersOccurrences(cmd.Context(), operations.ListTriggersOccurrencesRequest{ + TriggerID: args[0], + }) + if err != nil { + return nil, err + } + + if response.Error != nil { + return nil, fmt.Errorf("%s: %s", response.Error.ErrorCode, response.Error.ErrorMessage) + } + + if response.StatusCode >= 300 { + return nil, fmt.Errorf("unexpected status code: %d", response.StatusCode) + } + + c.store.WorkflowOccurrence = response.ListTriggersOccurrencesResponse.Data + + return c, nil +} + +func (c *OccurrencesListController) Render(cmd *cobra.Command, args []string) error { + + if len(c.store.WorkflowOccurrence) == 0 { + fctl.Println("No occurrences found.") + return nil + } + if err := pterm.DefaultTable. + WithHasHeader(true). + WithWriter(cmd.OutOrStdout()). + WithData( + fctl.Prepend( + fctl.Map(c.store.WorkflowOccurrence, + func(src shared.TriggerOccurrence) []string { + return []string{ + src.WorkflowInstanceID, + src.Date.Format(time.RFC3339), + } + }), + []string{"Workflow instance ID", "Date"}, + ), + ).Render(); err != nil { + return errors.Wrap(err, "rendering table") + } + + return nil +} diff --git a/components/fctl/cmd/orchestration/triggers/occurrences/root.go b/components/fctl/cmd/orchestration/triggers/occurrences/root.go new file mode 100644 index 0000000000..039372eab0 --- /dev/null +++ b/components/fctl/cmd/orchestration/triggers/occurrences/root.go @@ -0,0 +1,16 @@ +package occurrences + +import ( + fctl "github.com/formancehq/fctl/pkg" + "github.com/spf13/cobra" +) + +func NewCommand() *cobra.Command { + return fctl.NewStackCommand("occurrences", + fctl.WithAliases("oc", "o"), + fctl.WithShortDescription("Triggers occurrences management"), + fctl.WithChildCommands( + NewListCommand(), + ), + ) +} diff --git a/components/fctl/cmd/orchestration/triggers/root.go b/components/fctl/cmd/orchestration/triggers/root.go new file mode 100644 index 0000000000..30e809ea1c --- /dev/null +++ b/components/fctl/cmd/orchestration/triggers/root.go @@ -0,0 +1,21 @@ +package triggers + +import ( + "github.com/formancehq/fctl/cmd/orchestration/triggers/occurrences" + fctl "github.com/formancehq/fctl/pkg" + "github.com/spf13/cobra" +) + +func NewCommand() *cobra.Command { + return fctl.NewStackCommand("triggers", + fctl.WithAliases("trig", "t"), + fctl.WithShortDescription("Triggers management"), + fctl.WithChildCommands( + NewListCommand(), + NewShowCommand(), + NewDeleteCommand(), + NewCreateCommand(), + occurrences.NewCommand(), + ), + ) +} diff --git a/components/fctl/cmd/orchestration/triggers/show.go b/components/fctl/cmd/orchestration/triggers/show.go new file mode 100644 index 0000000000..b18f1e2e7e --- /dev/null +++ b/components/fctl/cmd/orchestration/triggers/show.go @@ -0,0 +1,100 @@ +package triggers + +import ( + "fmt" + "time" + + fctl "github.com/formancehq/fctl/pkg" + "github.com/formancehq/formance-sdk-go/pkg/models/operations" + "github.com/formancehq/formance-sdk-go/pkg/models/shared" + "github.com/pkg/errors" + "github.com/pterm/pterm" + "github.com/spf13/cobra" +) + +type TriggersShowStore struct { + Trigger shared.Trigger `json:"trigger"` +} +type TriggersShowController struct { + store *TriggersShowStore +} + +var _ fctl.Controller[*TriggersShowStore] = (*TriggersShowController)(nil) + +func NewDefaultTriggersShowStore() *TriggersShowStore { + return &TriggersShowStore{} +} + +func NewTriggersShowController() *TriggersShowController { + return &TriggersShowController{ + store: NewDefaultTriggersShowStore(), + } +} + +func NewShowCommand() *cobra.Command { + return fctl.NewCommand("show ", + fctl.WithShortDescription("Show a specific workflow trigger"), + fctl.WithArgs(cobra.ExactArgs(1)), + fctl.WithController[*TriggersShowStore](NewTriggersShowController()), + ) +} + +func (c *TriggersShowController) GetStore() *TriggersShowStore { + return c.store +} + +func (c *TriggersShowController) Run(cmd *cobra.Command, args []string) (fctl.Renderable, error) { + soc, err := fctl.GetStackOrganizationConfig(cmd) + if err != nil { + return nil, err + } + + client, err := fctl.NewStackClient(cmd, soc.Config, soc.Stack) + if err != nil { + return nil, errors.Wrap(err, "creating stack client") + } + + res, err := client.Orchestration.ReadTrigger(cmd.Context(), operations.ReadTriggerRequest{ + TriggerID: args[0], + }) + if err != nil { + return nil, errors.Wrap(err, "reading trigger") + } + + if res.Error != nil { + return nil, fmt.Errorf("%s: %s", res.Error.ErrorCode, res.Error.ErrorMessage) + } + + if res.StatusCode >= 300 { + return nil, fmt.Errorf("unexpected status code: %d", res.StatusCode) + } + + c.store.Trigger = res.ReadTriggerResponse.Data + + return c, nil +} + +func (c *TriggersShowController) Render(cmd *cobra.Command, args []string) error { + // Print the trigger information + fctl.Section.WithWriter(cmd.OutOrStdout()).Println("Information") + tableData := pterm.TableData{} + tableData = append(tableData, []string{pterm.LightCyan("ID"), c.store.Trigger.ID}) + tableData = append(tableData, []string{pterm.LightCyan("Created at"), c.store.Trigger.CreatedAt.Format(time.RFC3339)}) + tableData = append(tableData, []string{pterm.LightCyan("Workflow ID"), c.store.Trigger.WorkflowID}) + tableData = append(tableData, []string{pterm.LightCyan("Event"), c.store.Trigger.Event}) + tableData = append(tableData, []string{pterm.LightCyan("Filter"), func() string { + if c.store.Trigger.Filter == nil { + return "" + } + return *c.store.Trigger.Filter + }()}) + + if err := pterm.DefaultTable. + WithWriter(cmd.OutOrStdout()). + WithData(tableData). + Render(); err != nil { + return err + } + + return nil +} diff --git a/components/fctl/cmd/search/views/transactions.go b/components/fctl/cmd/search/views/transactions.go index e01d05c510..404379e4f0 100644 --- a/components/fctl/cmd/search/views/transactions.go +++ b/components/fctl/cmd/search/views/transactions.go @@ -13,7 +13,7 @@ func DisplayTransactions(out io.Writer, txs []map[string]interface{}) error { for _, tx := range txs { tableData = append(tableData, []string{ tx["ledger"].(string), - fmt.Sprint(tx["id"].(float64)), + fmt.Sprint(tx["txid"].(float64)), tx["reference"].(string), tx["timestamp"].(string), }) diff --git a/components/fctl/go.mod b/components/fctl/go.mod index 1de7aed55c..17652d741b 100644 --- a/components/fctl/go.mod +++ b/components/fctl/go.mod @@ -63,12 +63,12 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.12.0 // indirect golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect golang.org/x/net v0.11.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/term v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect diff --git a/components/fctl/go.sum b/components/fctl/go.sum index cfc3e6b516..3b85969994 100644 --- a/components/fctl/go.sum +++ b/components/fctl/go.sum @@ -166,8 +166,8 @@ go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20221205204356-47842c84f3db h1:D/cFflL63o2KSLJIwjlcIt8PR064j/xsmdEJL/YvY/o= golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -207,23 +207,23 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/components/gateway/go.mod b/components/gateway/go.mod index a5fabb472a..9783d6d6e5 100644 --- a/components/gateway/go.mod +++ b/components/gateway/go.mod @@ -174,13 +174,13 @@ require ( go.etcd.io/bbolt v1.3.7 // indirect go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel v1.17.0 // indirect go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.17.0 // indirect go.opentelemetry.io/otel/sdk v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.17.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.step.sm/cli-utils v0.8.0 // indirect go.step.sm/crypto v0.35.1 // indirect diff --git a/components/gateway/go.sum b/components/gateway/go.sum index ec472bbb2a..5460665102 100644 --- a/components/gateway/go.sum +++ b/components/gateway/go.sum @@ -714,20 +714,20 @@ go.opentelemetry.io/contrib/propagators/jaeger v1.17.0 h1:Zbpbmwav32Ea5jSotpmkWE go.opentelemetry.io/contrib/propagators/jaeger v1.17.0/go.mod h1:tcTUAlmO8nuInPDSBVfG+CP6Mzjy5+gNV4mPxMbL0IA= go.opentelemetry.io/contrib/propagators/ot v1.17.0 h1:ufo2Vsz8l76eI47jFjuVyjyB3Ae2DmfiCV/o6Vc8ii0= go.opentelemetry.io/contrib/propagators/ot v1.17.0/go.mod h1:SbKPj5XGp8K/sGm05XblaIABgMgw2jDczP8gGeuaVLk= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0/go.mod h1:vLarbg68dH2Wa77g71zmKQqlQ8+8Rq3GRG31uc0WcWI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 h1:cbsD4cUcviQGXdw8+bo5x2wazq10SKz8hEbtCRPcU78= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0/go.mod h1:JgXSGah17croqhJfhByOLVY719k1emAXC8MVhCIJlRs= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 h1:TVQp/bboR4mhZSav+MdgXB8FaRho1RC8UwVn3T0vjVc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0/go.mod h1:I33vtIe0sR96wfrUcilIzLoA3mLHhRmz9S9Te0S3gDo= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= diff --git a/components/ledger/go.mod b/components/ledger/go.mod index 572caebaa7..8246b30039 100644 --- a/components/ledger/go.mod +++ b/components/ledger/go.mod @@ -23,13 +23,12 @@ require ( github.com/sirupsen/logrus v1.9.0 github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.3 - github.com/uptrace/bun v1.1.14 - github.com/uptrace/bun/dialect/pgdialect v1.1.14 - github.com/uptrace/bun/extra/bunotel v1.1.14 - go.opentelemetry.io/otel v1.16.0 - go.opentelemetry.io/otel/metric v1.16.0 - go.opentelemetry.io/otel/trace v1.16.0 + github.com/stretchr/testify v1.8.4 + github.com/uptrace/bun v1.1.16 + github.com/uptrace/bun/dialect/pgdialect v1.1.16 + go.opentelemetry.io/otel v1.17.0 + go.opentelemetry.io/otel/metric v1.17.0 + go.opentelemetry.io/otel/trace v1.17.0 go.uber.org/fx v1.19.2 go.uber.org/mock v0.3.0 gopkg.in/segmentio/analytics-go.v3 v3.1.0 @@ -110,8 +109,9 @@ require ( github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect + github.com/uptrace/bun/extra/bunotel v1.1.16 // indirect github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 // indirect - github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.1 // indirect + github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 // indirect github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 // indirect github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect diff --git a/components/ledger/go.sum b/components/ledger/go.sum index badfc7d9f5..417aa21ccb 100644 --- a/components/ledger/go.sum +++ b/components/ledger/go.sum @@ -428,8 +428,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -439,17 +440,17 @@ github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYm github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= -github.com/uptrace/bun v1.1.14 h1:S5vvNnjEynJ0CvnrBOD7MIRW7q/WbtvFXrdfy0lddAM= -github.com/uptrace/bun v1.1.14/go.mod h1:RHk6DrIisO62dv10pUOJCz5MphXThuOTpVNYEYv7NI8= -github.com/uptrace/bun/dialect/pgdialect v1.1.14 h1:b7+V1KDJPQSFYgkG/6YLXCl2uvwEY3kf/GSM7hTHRDY= -github.com/uptrace/bun/dialect/pgdialect v1.1.14/go.mod h1:v6YiaXmnKQ2FlhRD2c0ZfKd+QXH09pYn4H8ojaavkKk= -github.com/uptrace/bun/extra/bundebug v1.1.14 h1:9OCGfP9ZDlh41u6OLerWdhBtJAVGXHr0xtxO4xWi6t0= -github.com/uptrace/bun/extra/bunotel v1.1.14 h1:jKA1zNfD2/Y/O3eFP15ao+V0cMigXN+ReNbsVUqrOhg= -github.com/uptrace/bun/extra/bunotel v1.1.14/go.mod h1:BBuePZ4ciMqoeyRfef4GL7Z75FsiOm3Q3fvNt0z4sQk= +github.com/uptrace/bun v1.1.16 h1:cn9cgEMFwcyYRsQLfxCRMUxyK1WaHwOVrR3TvzEFZ/A= +github.com/uptrace/bun v1.1.16/go.mod h1:7HnsMRRvpLFUcquJxp22JO8PsWKpFQO/gNXqqsuGWg8= +github.com/uptrace/bun/dialect/pgdialect v1.1.16 h1:eUPZ+YCJ69BA+W1X1ZmpOJSkv1oYtinr0zCXf7zCo5g= +github.com/uptrace/bun/dialect/pgdialect v1.1.16/go.mod h1:KQjfx/r6JM0OXfbv0rFrxAbdkPD7idK8VitnjIV9fZI= +github.com/uptrace/bun/extra/bundebug v1.1.16 h1:SgicRQGtnjhrIhlYOxdkOm1Em4s6HykmT3JblHnoTBM= +github.com/uptrace/bun/extra/bunotel v1.1.16 h1:qkLTaTZK3FZk3b2P/stO/krS7KX9Fq5wSOj7Hlb2HG8= +github.com/uptrace/bun/extra/bunotel v1.1.16/go.mod h1:JwEH0kdXFnzYuK8D6eXUrf9HKsYy5wmB+lqQ/+dvH4E= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 h1:OXsouNDvuET5o1A4uvoCnAXuuNke8JlfZWceciyUlC8= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21/go.mod h1:Xm3wlRGm5xzdAGPOvqydXPiGj0Da1q0OlUNm7Utoda4= -github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.1 h1:sCYkntVVoSMuQuyRBaEkedb1qS1KeJJaqKbdtNfTsfM= -github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.1/go.mod h1:1frv9RN1rlTq0jzCq+mVuEQisubZCQ4OU6S/8CaHzGY= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 h1:USRngIQppxeyb39XzkVHXwQesKK0+JSwnHE/1c7fgic= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2/go.mod h1:1frv9RN1rlTq0jzCq+mVuEQisubZCQ4OU6S/8CaHzGY= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 h1:HCqo51kNF8wxDMDhxcN5S6DlfZXigMtptRpkvjBCeVc= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21/go.mod h1:2MNqrUmDrt5E0glMuoJI/9FyGVpBKo1FqjSH60UOZFg= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -500,8 +501,8 @@ go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0/go.mod h1:rD9feqRYP2 go.opentelemetry.io/contrib/propagators/b3 v1.17.0 h1:ImOVvHnku8jijXqkwCSyYKRDt2YrnGXD4BbhcpfbfJo= go.opentelemetry.io/contrib/propagators/b3 v1.17.0/go.mod h1:IkfUfMpKWmynvvE0264trz0sf32NRTZL4nuAN9AbWRc= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= @@ -522,16 +523,16 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 h1:fl2WmyenEf6LYY go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0/go.mod h1:csyQxQ0UHHKVA8KApS7eUO/klMO5sd/av5CNZNU4O6w= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= diff --git a/components/ledger/internal/analytics/analytics.go b/components/ledger/internal/analytics/analytics.go index 06046cdd9b..002cb849e7 100644 --- a/components/ledger/internal/analytics/analytics.go +++ b/components/ledger/internal/analytics/analytics.go @@ -7,7 +7,8 @@ import ( "runtime" "time" - "github.com/formancehq/ledger/internal/storage/paginate" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/formancehq/ledger/internal/storage/systemstore" "github.com/formancehq/stack/libs/go-libs/api" @@ -95,7 +96,7 @@ func (m *heartbeat) enqueue(ctx context.Context) error { Set(TotalMemoryProperty, memory.TotalMemory()/1024/1024) ledgersProperty := map[string]any{} - err = paginate.Iterate(ctx, systemstore.NewListLedgersQuery(10), + err = bunpaginate.Iterate(ctx, systemstore.NewListLedgersQuery(10), func(ctx context.Context, q systemstore.ListLedgersQuery) (*api.Cursor[systemstore.Ledger], error) { return m.backend.ListLedgers(ctx, q) }, diff --git a/components/ledger/internal/api/v1/controllers_accounts.go b/components/ledger/internal/api/v1/controllers_accounts.go index e3dc245b82..797d0b7783 100644 --- a/components/ledger/internal/api/v1/controllers_accounts.go +++ b/components/ledger/internal/api/v1/controllers_accounts.go @@ -7,17 +7,18 @@ import ( "strconv" "strings" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/go-chi/chi/v5" + "github.com/formancehq/ledger/internal/api/backend" "github.com/pkg/errors" ledger "github.com/formancehq/ledger/internal" "github.com/formancehq/ledger/internal/storage/ledgerstore" - "github.com/formancehq/ledger/internal/storage/paginate" sharedapi "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/collectionutils" "github.com/formancehq/stack/libs/go-libs/metadata" "github.com/formancehq/stack/libs/go-libs/query" - "github.com/go-chi/chi/v5" ) func buildAccountsFilterQuery(r *http.Request) (query.Builder, error) { @@ -93,7 +94,7 @@ func getAccounts(w http.ResponseWriter, r *http.Request) { q := ledgerstore.GetAccountsQuery{} if r.URL.Query().Get(QueryKeyCursor) != "" { - err := paginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &q) + err := bunpaginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &q) if err != nil { sharedapi.BadRequest(w, ErrValidation, fmt.Errorf("invalid '%s' query param", QueryKeyCursor)) return diff --git a/components/ledger/internal/api/v1/controllers_accounts_test.go b/components/ledger/internal/api/v1/controllers_accounts_test.go index 8cd4164322..f0cdb2dd3c 100644 --- a/components/ledger/internal/api/v1/controllers_accounts_test.go +++ b/components/ledger/internal/api/v1/controllers_accounts_test.go @@ -6,12 +6,13 @@ import ( "net/url" "testing" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + ledger "github.com/formancehq/ledger/internal" v1 "github.com/formancehq/ledger/internal/api/v1" "github.com/formancehq/ledger/internal/engine/command" "github.com/formancehq/ledger/internal/opentelemetry/metrics" "github.com/formancehq/ledger/internal/storage/ledgerstore" - "github.com/formancehq/ledger/internal/storage/paginate" sharedapi "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/metadata" "github.com/formancehq/stack/libs/go-libs/query" @@ -57,7 +58,7 @@ func TestGetAccounts(t *testing.T) { { name: "using empty cursor", queryParams: url.Values{ - "cursor": []string{paginate.EncodeCursor(ledgerstore.NewGetAccountsQuery(ledgerstore.NewPaginatedQueryOptions(ledgerstore.PITFilterWithVolumes{})))}, + "cursor": []string{bunpaginate.EncodeCursor(ledgerstore.NewGetAccountsQuery(ledgerstore.NewPaginatedQueryOptions(ledgerstore.PITFilterWithVolumes{})))}, }, expectQuery: ledgerstore.NewPaginatedQueryOptions(ledgerstore.PITFilterWithVolumes{}), }, diff --git a/components/ledger/internal/api/v1/controllers_balances.go b/components/ledger/internal/api/v1/controllers_balances.go index ff5c7abe73..ffa2f78e0e 100644 --- a/components/ledger/internal/api/v1/controllers_balances.go +++ b/components/ledger/internal/api/v1/controllers_balances.go @@ -4,11 +4,12 @@ import ( "math/big" "net/http" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/formancehq/ledger/internal/api/backend" "github.com/pkg/errors" "github.com/formancehq/ledger/internal/storage/ledgerstore" - "github.com/formancehq/ledger/internal/storage/paginate" sharedapi "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/query" ) @@ -46,7 +47,7 @@ func getBalances(w http.ResponseWriter, r *http.Request) { q := ledgerstore.GetAccountsQuery{} if r.URL.Query().Get(QueryKeyCursor) != "" { - err := paginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &q) + err := bunpaginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &q) if err != nil { sharedapi.BadRequest(w, ErrValidation, errors.Errorf("invalid '%s' query param", QueryKeyCursor)) return diff --git a/components/ledger/internal/api/v1/controllers_config.go b/components/ledger/internal/api/v1/controllers_config.go index b5a7d971d6..5e5117989a 100644 --- a/components/ledger/internal/api/v1/controllers_config.go +++ b/components/ledger/internal/api/v1/controllers_config.go @@ -5,7 +5,7 @@ import ( _ "embed" "net/http" - "github.com/formancehq/ledger/internal/storage/paginate" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" "github.com/formancehq/ledger/internal/storage/systemstore" "github.com/formancehq/stack/libs/go-libs/collectionutils" @@ -33,7 +33,7 @@ func getInfo(backend backend.Backend) func(w http.ResponseWriter, r *http.Reques return func(w http.ResponseWriter, r *http.Request) { ledgerNames := make([]string, 0) - if err := paginate.Iterate(r.Context(), systemstore.NewListLedgersQuery(100), + if err := bunpaginate.Iterate(r.Context(), systemstore.NewListLedgersQuery(100), func(ctx context.Context, q systemstore.ListLedgersQuery) (*sharedapi.Cursor[systemstore.Ledger], error) { return backend.ListLedgers(ctx, q) }, diff --git a/components/ledger/internal/api/v1/controllers_info.go b/components/ledger/internal/api/v1/controllers_info.go index 0c8c40e2a6..492e3bed02 100644 --- a/components/ledger/internal/api/v1/controllers_info.go +++ b/components/ledger/internal/api/v1/controllers_info.go @@ -3,16 +3,17 @@ package v1 import ( "net/http" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/go-chi/chi/v5" + "github.com/formancehq/ledger/internal/api/backend" "github.com/formancehq/ledger/internal/engine" "github.com/pkg/errors" "github.com/formancehq/ledger/internal/storage/ledgerstore" - "github.com/formancehq/ledger/internal/storage/paginate" sharedapi "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/migrations" "github.com/formancehq/stack/libs/go-libs/query" - "github.com/go-chi/chi/v5" ) type Info struct { @@ -82,7 +83,7 @@ func getLogs(w http.ResponseWriter, r *http.Request) { query := ledgerstore.GetLogsQuery{} if r.URL.Query().Get(QueryKeyCursor) != "" { - err := paginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &query) + err := bunpaginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &query) if err != nil { sharedapi.BadRequest(w, ErrValidation, errors.Errorf("invalid '%s' query param", QueryKeyCursor)) return diff --git a/components/ledger/internal/api/v1/controllers_info_test.go b/components/ledger/internal/api/v1/controllers_info_test.go index d0b849dea5..3ac05bdd5a 100644 --- a/components/ledger/internal/api/v1/controllers_info_test.go +++ b/components/ledger/internal/api/v1/controllers_info_test.go @@ -8,12 +8,13 @@ import ( "testing" "time" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + ledger "github.com/formancehq/ledger/internal" v1 "github.com/formancehq/ledger/internal/api/v1" "github.com/formancehq/ledger/internal/engine" "github.com/formancehq/ledger/internal/opentelemetry/metrics" "github.com/formancehq/ledger/internal/storage/ledgerstore" - "github.com/formancehq/ledger/internal/storage/paginate" sharedapi "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/metadata" "github.com/formancehq/stack/libs/go-libs/migrations" @@ -128,7 +129,7 @@ func TestGetLogs(t *testing.T) { { name: "using empty cursor", queryParams: url.Values{ - "cursor": []string{paginate.EncodeCursor(ledgerstore.NewGetLogsQuery(ledgerstore.NewPaginatedQueryOptions[any](nil)))}, + "cursor": []string{bunpaginate.EncodeCursor(ledgerstore.NewGetLogsQuery(ledgerstore.NewPaginatedQueryOptions[any](nil)))}, }, expectQuery: ledgerstore.NewPaginatedQueryOptions[any](nil), }, diff --git a/components/ledger/internal/api/v1/controllers_transactions.go b/components/ledger/internal/api/v1/controllers_transactions.go index 94f31b9da9..e1e862ac71 100644 --- a/components/ledger/internal/api/v1/controllers_transactions.go +++ b/components/ledger/internal/api/v1/controllers_transactions.go @@ -8,6 +8,9 @@ import ( "strconv" "strings" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/go-chi/chi/v5" + "github.com/formancehq/ledger/internal/api/backend" "github.com/formancehq/ledger/internal/engine" "github.com/formancehq/ledger/internal/engine/command" @@ -17,12 +20,10 @@ import ( ledger "github.com/formancehq/ledger/internal" "github.com/formancehq/ledger/internal/storage/ledgerstore" - "github.com/formancehq/ledger/internal/storage/paginate" sharedapi "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/collectionutils" "github.com/formancehq/stack/libs/go-libs/metadata" "github.com/formancehq/stack/libs/go-libs/query" - "github.com/go-chi/chi/v5" ) func mapTransactionToV1(tx ledger.Transaction) any { @@ -118,7 +119,7 @@ func getTransactions(w http.ResponseWriter, r *http.Request) { query := ledgerstore.GetTransactionsQuery{} if r.URL.Query().Get(QueryKeyCursor) != "" { - err := paginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &query) + err := bunpaginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &query) if err != nil { sharedapi.BadRequest(w, ErrValidation, errors.Errorf("invalid '%s' query param", QueryKeyCursor)) return diff --git a/components/ledger/internal/api/v1/controllers_transactions_test.go b/components/ledger/internal/api/v1/controllers_transactions_test.go index fd399702d2..e0a8e1d409 100644 --- a/components/ledger/internal/api/v1/controllers_transactions_test.go +++ b/components/ledger/internal/api/v1/controllers_transactions_test.go @@ -7,12 +7,13 @@ import ( "net/url" "testing" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + ledger "github.com/formancehq/ledger/internal" v1 "github.com/formancehq/ledger/internal/api/v1" "github.com/formancehq/ledger/internal/engine/command" "github.com/formancehq/ledger/internal/opentelemetry/metrics" "github.com/formancehq/ledger/internal/storage/ledgerstore" - "github.com/formancehq/ledger/internal/storage/paginate" sharedapi "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/metadata" "github.com/formancehq/stack/libs/go-libs/query" @@ -414,7 +415,7 @@ func TestGetTransactions(t *testing.T) { { name: "using empty cursor", queryParams: url.Values{ - "cursor": []string{paginate.EncodeCursor(ledgerstore.NewGetTransactionsQuery(ledgerstore.NewPaginatedQueryOptions(ledgerstore.PITFilterWithVolumes{})))}, + "cursor": []string{bunpaginate.EncodeCursor(ledgerstore.NewGetTransactionsQuery(ledgerstore.NewPaginatedQueryOptions(ledgerstore.PITFilterWithVolumes{})))}, }, expectQuery: ledgerstore.NewPaginatedQueryOptions(ledgerstore.PITFilterWithVolumes{}), }, diff --git a/components/ledger/internal/api/v1/query.go b/components/ledger/internal/api/v1/query.go index 6807bfa175..adf1f6ab0f 100644 --- a/components/ledger/internal/api/v1/query.go +++ b/components/ledger/internal/api/v1/query.go @@ -5,12 +5,12 @@ import ( "net/http" "strconv" - "github.com/formancehq/ledger/internal/storage/paginate" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" ) const ( MaxPageSize = 1000 - DefaultPageSize = paginate.QueryDefaultPageSize + DefaultPageSize = bunpaginate.QueryDefaultPageSize QueryKeyCursor = "cursor" QueryKeyPageSize = "pageSize" diff --git a/components/ledger/internal/api/v2/controllers_accounts.go b/components/ledger/internal/api/v2/controllers_accounts.go index 3dfeec48ac..1138b51a65 100644 --- a/components/ledger/internal/api/v2/controllers_accounts.go +++ b/components/ledger/internal/api/v2/controllers_accounts.go @@ -5,14 +5,15 @@ import ( "fmt" "net/http" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/go-chi/chi/v5" + ledger "github.com/formancehq/ledger/internal" "github.com/formancehq/ledger/internal/api/backend" "github.com/formancehq/ledger/internal/storage/ledgerstore" - "github.com/formancehq/ledger/internal/storage/paginate" sharedapi "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/collectionutils" "github.com/formancehq/stack/libs/go-libs/metadata" - "github.com/go-chi/chi/v5" "github.com/pkg/errors" ) @@ -46,7 +47,7 @@ func getAccounts(w http.ResponseWriter, r *http.Request) { query := ledgerstore.GetAccountsQuery{} if r.URL.Query().Get(QueryKeyCursor) != "" { - err := paginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &query) + err := bunpaginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &query) if err != nil { sharedapi.BadRequest(w, ErrValidation, fmt.Errorf("invalid '%s' query param", QueryKeyCursor)) return diff --git a/components/ledger/internal/api/v2/controllers_accounts_test.go b/components/ledger/internal/api/v2/controllers_accounts_test.go index d76faa965f..88b4f0a0b3 100644 --- a/components/ledger/internal/api/v2/controllers_accounts_test.go +++ b/components/ledger/internal/api/v2/controllers_accounts_test.go @@ -8,12 +8,13 @@ import ( "testing" "time" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + ledger "github.com/formancehq/ledger/internal" v2 "github.com/formancehq/ledger/internal/api/v2" "github.com/formancehq/ledger/internal/engine/command" "github.com/formancehq/ledger/internal/opentelemetry/metrics" "github.com/formancehq/ledger/internal/storage/ledgerstore" - "github.com/formancehq/ledger/internal/storage/paginate" sharedapi "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/metadata" "github.com/formancehq/stack/libs/go-libs/query" @@ -69,7 +70,7 @@ func TestGetAccounts(t *testing.T) { { name: "using empty cursor", queryParams: url.Values{ - "cursor": []string{paginate.EncodeCursor(ledgerstore.NewGetAccountsQuery(ledgerstore.NewPaginatedQueryOptions(ledgerstore.PITFilterWithVolumes{})))}, + "cursor": []string{bunpaginate.EncodeCursor(ledgerstore.NewGetAccountsQuery(ledgerstore.NewPaginatedQueryOptions(ledgerstore.PITFilterWithVolumes{})))}, }, expectQuery: ledgerstore.NewPaginatedQueryOptions(ledgerstore.PITFilterWithVolumes{}), }, diff --git a/components/ledger/internal/api/v2/controllers_info.go b/components/ledger/internal/api/v2/controllers_info.go index c965c94e54..99264f19c5 100644 --- a/components/ledger/internal/api/v2/controllers_info.go +++ b/components/ledger/internal/api/v2/controllers_info.go @@ -4,12 +4,13 @@ import ( "fmt" "net/http" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/go-chi/chi/v5" + "github.com/formancehq/ledger/internal/api/backend" "github.com/formancehq/ledger/internal/storage/ledgerstore" - "github.com/formancehq/ledger/internal/storage/paginate" sharedapi "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/migrations" - "github.com/go-chi/chi/v5" ) type Info struct { @@ -56,7 +57,7 @@ func getLogs(w http.ResponseWriter, r *http.Request) { query := ledgerstore.GetLogsQuery{} if r.URL.Query().Get(QueryKeyCursor) != "" { - err := paginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &query) + err := bunpaginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &query) if err != nil { sharedapi.BadRequest(w, ErrValidation, fmt.Errorf("invalid '%s' query param", QueryKeyCursor)) return diff --git a/components/ledger/internal/api/v2/controllers_info_test.go b/components/ledger/internal/api/v2/controllers_info_test.go index 297e7af888..3f5894ce89 100644 --- a/components/ledger/internal/api/v2/controllers_info_test.go +++ b/components/ledger/internal/api/v2/controllers_info_test.go @@ -10,12 +10,13 @@ import ( "testing" "time" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + ledger "github.com/formancehq/ledger/internal" v2 "github.com/formancehq/ledger/internal/api/v2" "github.com/formancehq/ledger/internal/engine" "github.com/formancehq/ledger/internal/opentelemetry/metrics" "github.com/formancehq/ledger/internal/storage/ledgerstore" - "github.com/formancehq/ledger/internal/storage/paginate" sharedapi "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/metadata" "github.com/formancehq/stack/libs/go-libs/migrations" @@ -127,7 +128,7 @@ func TestGetLogs(t *testing.T) { { name: "using empty cursor", queryParams: url.Values{ - "cursor": []string{paginate.EncodeCursor(ledgerstore.NewGetLogsQuery(ledgerstore.NewPaginatedQueryOptions[any](nil)))}, + "cursor": []string{bunpaginate.EncodeCursor(ledgerstore.NewGetLogsQuery(ledgerstore.NewPaginatedQueryOptions[any](nil)))}, }, expectQuery: ledgerstore.NewPaginatedQueryOptions[any](nil), }, diff --git a/components/ledger/internal/api/v2/controllers_list_ledgers.go b/components/ledger/internal/api/v2/controllers_list_ledgers.go index 46f997134f..551d931d8b 100644 --- a/components/ledger/internal/api/v2/controllers_list_ledgers.go +++ b/components/ledger/internal/api/v2/controllers_list_ledgers.go @@ -4,7 +4,8 @@ import ( "fmt" "net/http" - "github.com/formancehq/ledger/internal/storage/paginate" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/formancehq/ledger/internal/storage/systemstore" sharedapi "github.com/formancehq/stack/libs/go-libs/api" @@ -17,7 +18,7 @@ func listLedgers(b backend.Backend) http.HandlerFunc { query := systemstore.ListLedgersQuery{} if r.URL.Query().Get(QueryKeyCursor) != "" { - err := paginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &query) + err := bunpaginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &query) if err != nil { sharedapi.BadRequest(w, ErrValidation, fmt.Errorf("invalid '%s' query param", QueryKeyCursor)) return diff --git a/components/ledger/internal/api/v2/controllers_transactions.go b/components/ledger/internal/api/v2/controllers_transactions.go index da6b51f782..2423d276ff 100644 --- a/components/ledger/internal/api/v2/controllers_transactions.go +++ b/components/ledger/internal/api/v2/controllers_transactions.go @@ -6,6 +6,9 @@ import ( "math/big" "net/http" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/go-chi/chi/v5" + "github.com/formancehq/ledger/internal/api/backend" "github.com/formancehq/ledger/internal/engine" "github.com/formancehq/ledger/internal/engine/command" @@ -15,11 +18,9 @@ import ( ledger "github.com/formancehq/ledger/internal" "github.com/formancehq/ledger/internal/storage/ledgerstore" - "github.com/formancehq/ledger/internal/storage/paginate" sharedapi "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/collectionutils" "github.com/formancehq/stack/libs/go-libs/metadata" - "github.com/go-chi/chi/v5" ) func countTransactions(w http.ResponseWriter, r *http.Request) { @@ -52,7 +53,7 @@ func getTransactions(w http.ResponseWriter, r *http.Request) { query := ledgerstore.GetTransactionsQuery{} if r.URL.Query().Get(QueryKeyCursor) != "" { - err := paginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &query) + err := bunpaginate.UnmarshalCursor(r.URL.Query().Get(QueryKeyCursor), &query) if err != nil { sharedapi.BadRequest(w, ErrValidation, fmt.Errorf("invalid '%s' query param", QueryKeyCursor)) return diff --git a/components/ledger/internal/api/v2/controllers_transactions_test.go b/components/ledger/internal/api/v2/controllers_transactions_test.go index 2fb154539b..06af6b325d 100644 --- a/components/ledger/internal/api/v2/controllers_transactions_test.go +++ b/components/ledger/internal/api/v2/controllers_transactions_test.go @@ -10,6 +10,8 @@ import ( "testing" "time" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/formancehq/ledger/internal/api/backend" "github.com/pkg/errors" @@ -22,7 +24,6 @@ import ( "github.com/formancehq/ledger/internal/engine/command" "github.com/formancehq/ledger/internal/opentelemetry/metrics" "github.com/formancehq/ledger/internal/storage/ledgerstore" - "github.com/formancehq/ledger/internal/storage/paginate" sharedapi "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/metadata" "github.com/formancehq/stack/libs/go-libs/query" @@ -651,7 +652,7 @@ func TestGetTransactions(t *testing.T) { { name: "using empty cursor", queryParams: url.Values{ - "cursor": []string{paginate.EncodeCursor(ledgerstore.NewGetTransactionsQuery(ledgerstore.NewPaginatedQueryOptions(ledgerstore.PITFilterWithVolumes{})))}, + "cursor": []string{bunpaginate.EncodeCursor(ledgerstore.NewGetTransactionsQuery(ledgerstore.NewPaginatedQueryOptions(ledgerstore.PITFilterWithVolumes{})))}, }, expectQuery: ledgerstore.NewPaginatedQueryOptions(ledgerstore.PITFilterWithVolumes{ PITFilter: ledgerstore.PITFilter{}, diff --git a/components/ledger/internal/api/v2/query.go b/components/ledger/internal/api/v2/query.go index 0679d8c11a..4094610dff 100644 --- a/components/ledger/internal/api/v2/query.go +++ b/components/ledger/internal/api/v2/query.go @@ -5,14 +5,15 @@ import ( "strconv" "strings" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/formancehq/ledger/internal/engine/command" - "github.com/formancehq/ledger/internal/storage/paginate" "github.com/pkg/errors" ) const ( MaxPageSize = 100 - DefaultPageSize = paginate.QueryDefaultPageSize + DefaultPageSize = bunpaginate.QueryDefaultPageSize QueryKeyCursor = "cursor" QueryKeyPageSize = "pageSize" diff --git a/components/ledger/internal/storage/driver/cli.go b/components/ledger/internal/storage/driver/cli.go index 5bc5ec185e..e0ac72cf93 100644 --- a/components/ledger/internal/storage/driver/cli.go +++ b/components/ledger/internal/storage/driver/cli.go @@ -5,7 +5,7 @@ import ( "io" "time" - "github.com/formancehq/ledger/internal/storage/sqlutils" + "github.com/formancehq/stack/libs/go-libs/bun/bunconnect" storage "github.com/formancehq/ledger/internal/storage" "github.com/formancehq/stack/libs/go-libs/logging" @@ -33,12 +33,12 @@ type PostgresConfig struct { func CLIModule(v *viper.Viper, output io.Writer, debug bool) fx.Option { options := make([]fx.Option, 0) - options = append(options, fx.Provide(func(logger logging.Logger) sqlutils.ConnectionOptions { + options = append(options, fx.Provide(func(logger logging.Logger) bunconnect.ConnectionOptions { connectionOptions := storage.ConnectionOptionsFromFlags(v, output, debug) logger.WithField("config", connectionOptions).Infof("Opening connection to database...") return connectionOptions })) - options = append(options, fx.Provide(func(connectionOptions sqlutils.ConnectionOptions) (*Driver, error) { + options = append(options, fx.Provide(func(connectionOptions bunconnect.ConnectionOptions) (*Driver, error) { return New(connectionOptions), nil })) diff --git a/components/ledger/internal/storage/driver/driver.go b/components/ledger/internal/storage/driver/driver.go index ccc38ea7f0..5804421fd1 100644 --- a/components/ledger/internal/storage/driver/driver.go +++ b/components/ledger/internal/storage/driver/driver.go @@ -5,7 +5,10 @@ import ( "database/sql" "sync" - "github.com/formancehq/ledger/internal/storage/paginate" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + + "github.com/formancehq/stack/libs/go-libs/bun/bunconnect" + "github.com/formancehq/stack/libs/go-libs/api" ledger "github.com/formancehq/ledger/internal" @@ -35,7 +38,7 @@ type LedgerConfiguration struct { type Driver struct { systemStore *systemstore.Store lock sync.Mutex - connectionOptions sqlutils.ConnectionOptions + connectionOptions bunconnect.ConnectionOptions buckets map[string]*ledgerstore.Bucket db *bun.DB } @@ -143,7 +146,7 @@ func (d *Driver) Initialize(ctx context.Context) error { logging.FromContext(ctx).Debugf("Initialize driver") var err error - d.db, err = sqlutils.OpenSQLDB(d.connectionOptions) + d.db, err = bunconnect.OpenSQLDB(d.connectionOptions) if err != nil { return errors.Wrap(err, "connecting to database") } @@ -165,7 +168,7 @@ func (d *Driver) UpgradeAllBuckets(ctx context.Context) error { systemStore := d.GetSystemStore() buckets := collectionutils.Set[string]{} - err := paginate.Iterate(ctx, systemstore.NewListLedgersQuery(10), + err := bunpaginate.Iterate(ctx, systemstore.NewListLedgersQuery(10), func(ctx context.Context, q systemstore.ListLedgersQuery) (*api.Cursor[systemstore.Ledger], error) { return systemStore.ListLedgers(ctx, q) }, @@ -209,7 +212,7 @@ func (d *Driver) Close() error { return nil } -func New(connectionOptions sqlutils.ConnectionOptions) *Driver { +func New(connectionOptions bunconnect.ConnectionOptions) *Driver { return &Driver{ connectionOptions: connectionOptions, buckets: make(map[string]*ledgerstore.Bucket), diff --git a/components/ledger/internal/storage/flags.go b/components/ledger/internal/storage/flags.go index 095f8ecd88..763422c9d7 100644 --- a/components/ledger/internal/storage/flags.go +++ b/components/ledger/internal/storage/flags.go @@ -3,7 +3,7 @@ package storage import ( "io" - "github.com/formancehq/ledger/internal/storage/sqlutils" + "github.com/formancehq/stack/libs/go-libs/bun/bunconnect" "github.com/spf13/viper" ) @@ -17,8 +17,8 @@ const ( StoragePostgresMaxOpenConns = "storage-postgres-max-open-conns" ) -func ConnectionOptionsFromFlags(v *viper.Viper, output io.Writer, debug bool) sqlutils.ConnectionOptions { - return sqlutils.ConnectionOptions{ +func ConnectionOptionsFromFlags(v *viper.Viper, output io.Writer, debug bool) bunconnect.ConnectionOptions { + return bunconnect.ConnectionOptions{ DatabaseSourceName: v.GetString(StoragePostgresConnectionStringFlag), Debug: debug, Writer: output, diff --git a/components/ledger/internal/storage/ledgerstore/accounts.go b/components/ledger/internal/storage/ledgerstore/accounts.go index 2f7641a9bc..1f9506efcb 100644 --- a/components/ledger/internal/storage/ledgerstore/accounts.go +++ b/components/ledger/internal/storage/ledgerstore/accounts.go @@ -5,10 +5,11 @@ import ( "errors" "regexp" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + storageerrors "github.com/formancehq/ledger/internal/storage/sqlutils" ledger "github.com/formancehq/ledger/internal" - "github.com/formancehq/ledger/internal/storage/paginate" "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/pointer" "github.com/formancehq/stack/libs/go-libs/query" @@ -129,7 +130,7 @@ func (store *Store) GetAccountsWithVolumes(ctx context.Context, q GetAccountsQue } return paginateWithOffset[PaginatedQueryOptions[PITFilterWithVolumes], ledger.ExpandedAccount](store, ctx, - (*paginate.OffsetPaginatedQuery[PaginatedQueryOptions[PITFilterWithVolumes]])(&q), + (*bunpaginate.OffsetPaginatedQuery[PaginatedQueryOptions[PITFilterWithVolumes]])(&q), func(query *bun.SelectQuery) *bun.SelectQuery { return store.buildAccountListQuery(query, q, where, args) }, @@ -221,7 +222,7 @@ func NewGetAccountQuery(addr string) GetAccountQuery { } } -type GetAccountsQuery paginate.OffsetPaginatedQuery[PaginatedQueryOptions[PITFilterWithVolumes]] +type GetAccountsQuery bunpaginate.OffsetPaginatedQuery[PaginatedQueryOptions[PITFilterWithVolumes]] func (q GetAccountsQuery) WithExpandVolumes() GetAccountsQuery { q.Options.Options.ExpandVolumes = true @@ -238,7 +239,7 @@ func (q GetAccountsQuery) WithExpandEffectiveVolumes() GetAccountsQuery { func NewGetAccountsQuery(opts PaginatedQueryOptions[PITFilterWithVolumes]) GetAccountsQuery { return GetAccountsQuery{ PageSize: opts.PageSize, - Order: paginate.OrderAsc, + Order: bunpaginate.OrderAsc, Options: opts, } } diff --git a/components/ledger/internal/storage/ledgerstore/balances.go b/components/ledger/internal/storage/ledgerstore/balances.go index 8018f0040d..710753b01f 100644 --- a/components/ledger/internal/storage/ledgerstore/balances.go +++ b/components/ledger/internal/storage/ledgerstore/balances.go @@ -5,10 +5,11 @@ import ( "errors" "math/big" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/formancehq/ledger/internal/storage/sqlutils" ledger "github.com/formancehq/ledger/internal" - "github.com/formancehq/ledger/internal/storage/paginate" "github.com/formancehq/stack/libs/go-libs/query" "github.com/uptrace/bun" ) @@ -129,12 +130,12 @@ func (store *Store) GetBalance(ctx context.Context, address, asset string) (*big return v.Balance, nil } -type GetAggregatedBalanceQuery paginate.OffsetPaginatedQuery[PaginatedQueryOptions[PITFilter]] +type GetAggregatedBalanceQuery bunpaginate.OffsetPaginatedQuery[PaginatedQueryOptions[PITFilter]] func NewGetAggregatedBalancesQuery(options PaginatedQueryOptions[PITFilter]) GetAggregatedBalanceQuery { return GetAggregatedBalanceQuery{ PageSize: options.PageSize, - Order: paginate.OrderAsc, + Order: bunpaginate.OrderAsc, Options: options, } } diff --git a/components/ledger/internal/storage/ledgerstore/bucket.go b/components/ledger/internal/storage/ledgerstore/bucket.go index 5509559502..2693f91252 100644 --- a/components/ledger/internal/storage/ledgerstore/bucket.go +++ b/components/ledger/internal/storage/ledgerstore/bucket.go @@ -6,6 +6,8 @@ import ( _ "embed" "fmt" + "github.com/formancehq/stack/libs/go-libs/bun/bunconnect" + "github.com/formancehq/ledger/internal/storage/sqlutils" "github.com/formancehq/stack/libs/go-libs/migrations" "github.com/pkg/errors" @@ -124,8 +126,8 @@ func registerMigrations(migrator *migrations.Migrator, name string) { ) } -func ConnectToBucket(connectionOptions sqlutils.ConnectionOptions, name string, hooks ...bun.QueryHook) (*Bucket, error) { - db, err := sqlutils.OpenDBWithSchema(connectionOptions, name, hooks...) +func ConnectToBucket(connectionOptions bunconnect.ConnectionOptions, name string, hooks ...bun.QueryHook) (*Bucket, error) { + db, err := bunconnect.OpenDBWithSchema(connectionOptions, name, hooks...) if err != nil { return nil, sqlutils.PostgresError(err) } diff --git a/components/ledger/internal/storage/ledgerstore/logs.go b/components/ledger/internal/storage/ledgerstore/logs.go index 0a7df28d33..9b70241346 100644 --- a/components/ledger/internal/storage/ledgerstore/logs.go +++ b/components/ledger/internal/storage/ledgerstore/logs.go @@ -7,10 +7,11 @@ import ( "fmt" "math/big" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + storageerrors "github.com/formancehq/ledger/internal/storage/sqlutils" ledger "github.com/formancehq/ledger/internal" - "github.com/formancehq/ledger/internal/storage/paginate" "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/query" "github.com/lib/pq" @@ -25,13 +26,13 @@ const ( type Logs struct { bun.BaseModel `bun:"logs,alias:logs"` - Ledger string `bun:"ledger,type:varchar"` - ID *paginate.BigInt `bun:"id,unique,type:numeric"` - Type string `bun:"type,type:log_type"` - Hash []byte `bun:"hash,type:bytea"` - Date ledger.Time `bun:"date,type:timestamptz"` - Data []byte `bun:"data,type:jsonb"` - IdempotencyKey string `bun:"idempotency_key,type:varchar(256),unique"` + Ledger string `bun:"ledger,type:varchar"` + ID *bunpaginate.BigInt `bun:"id,unique,type:numeric"` + Type string `bun:"type,type:log_type"` + Hash []byte `bun:"hash,type:bytea"` + Date ledger.Time `bun:"date,type:timestamptz"` + Data []byte `bun:"data,type:jsonb"` + IdempotencyKey string `bun:"idempotency_key,type:varchar(256),unique"` } func (log *Logs) ToCore() *ledger.ChainedLog { @@ -106,7 +107,7 @@ func (store *Store) InsertLogs(ctx context.Context, activeLogs ...*ledger.Chaine ls[i] = Logs{ Ledger: store.name, - ID: (*paginate.BigInt)(chainedLogs.ID), + ID: (*bunpaginate.BigInt)(chainedLogs.ID), Type: chainedLogs.Type.String(), Hash: chainedLogs.Hash, Date: chainedLogs.Date, @@ -147,7 +148,7 @@ func (store *Store) GetLastLog(ctx context.Context) (*ledger.ChainedLog, error) func (store *Store) GetLogs(ctx context.Context, q GetLogsQuery) (*api.Cursor[ledger.ChainedLog], error) { logs, err := paginateWithColumn[PaginatedQueryOptions[any], Logs](store, ctx, - (*paginate.ColumnPaginatedQuery[PaginatedQueryOptions[any]])(&q), + (*bunpaginate.ColumnPaginatedQuery[PaginatedQueryOptions[any]])(&q), store.logsQueryBuilder(q.Options), ) if err != nil { @@ -176,13 +177,13 @@ func (store *Store) ReadLogWithIdempotencyKey(ctx context.Context, key string) ( return ret.ToCore(), nil } -type GetLogsQuery paginate.ColumnPaginatedQuery[PaginatedQueryOptions[any]] +type GetLogsQuery bunpaginate.ColumnPaginatedQuery[PaginatedQueryOptions[any]] func NewGetLogsQuery(options PaginatedQueryOptions[any]) GetLogsQuery { return GetLogsQuery{ PageSize: options.PageSize, Column: "id", - Order: paginate.OrderDesc, + Order: bunpaginate.OrderDesc, Options: options, } } diff --git a/components/ledger/internal/storage/ledgerstore/logs_test.go b/components/ledger/internal/storage/ledgerstore/logs_test.go index dcea17f044..f61a944bff 100644 --- a/components/ledger/internal/storage/ledgerstore/logs_test.go +++ b/components/ledger/internal/storage/ledgerstore/logs_test.go @@ -7,12 +7,13 @@ import ( "testing" "time" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/formancehq/stack/libs/go-libs/logging" "github.com/formancehq/ledger/internal/storage/sqlutils" ledger "github.com/formancehq/ledger/internal" - "github.com/formancehq/ledger/internal/storage/paginate" "github.com/formancehq/stack/libs/go-libs/metadata" "github.com/formancehq/stack/libs/go-libs/query" "github.com/stretchr/testify/require" @@ -260,7 +261,7 @@ func TestGetLogs(t *testing.T) { cursor, err := store.GetLogs(context.Background(), NewGetLogsQuery(NewPaginatedQueryOptions[any](nil))) require.NoError(t, err) - require.Equal(t, paginate.QueryDefaultPageSize, cursor.PageSize) + require.Equal(t, bunpaginate.QueryDefaultPageSize, cursor.PageSize) require.Equal(t, 3, len(cursor.Data)) require.Equal(t, big.NewInt(2), cursor.Data[0].ID) diff --git a/components/ledger/internal/storage/ledgerstore/main_test.go b/components/ledger/internal/storage/ledgerstore/main_test.go index 0fc8d54d94..d86607109d 100644 --- a/components/ledger/internal/storage/ledgerstore/main_test.go +++ b/components/ledger/internal/storage/ledgerstore/main_test.go @@ -8,12 +8,13 @@ import ( "testing" "time" + "github.com/formancehq/stack/libs/go-libs/bun/bunconnect" + "github.com/uptrace/bun/dialect/pgdialect" "github.com/uptrace/bun" ledger "github.com/formancehq/ledger/internal" - "github.com/formancehq/ledger/internal/storage/sqlutils" "github.com/formancehq/stack/libs/go-libs/logging" "github.com/formancehq/stack/libs/go-libs/pgtesting" "github.com/google/uuid" @@ -57,7 +58,7 @@ func newBucket(t T, hooks ...bun.QueryHook) *Bucket { pgDatabase := pgtesting.NewPostgresDatabase(t) - connectionOptions := sqlutils.ConnectionOptions{ + connectionOptions := bunconnect.ConnectionOptions{ DatabaseSourceName: pgDatabase.ConnString(), Debug: testing.Verbose(), MaxIdleConns: 40, diff --git a/components/ledger/internal/storage/ledgerstore/migrations_v1.go b/components/ledger/internal/storage/ledgerstore/migrations_v1.go index bca7f14baa..acc88ce6cb 100644 --- a/components/ledger/internal/storage/ledgerstore/migrations_v1.go +++ b/components/ledger/internal/storage/ledgerstore/migrations_v1.go @@ -6,8 +6,9 @@ import ( "fmt" "math/big" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + ledger "github.com/formancehq/ledger/internal" - "github.com/formancehq/ledger/internal/storage/paginate" "github.com/lib/pq" "github.com/pkg/errors" "github.com/uptrace/bun" @@ -114,7 +115,7 @@ func (l *LogV1) ToLogsV2() (Logs, error) { } return Logs{ - ID: (*paginate.BigInt)(big.NewInt(int64(l.ID))), + ID: (*bunpaginate.BigInt)(big.NewInt(int64(l.ID))), Type: logType.String(), Hash: []byte(l.Hash), Date: l.Date, diff --git a/components/ledger/internal/storage/ledgerstore/transactions.go b/components/ledger/internal/storage/ledgerstore/transactions.go index 43951a803b..ba05f09008 100644 --- a/components/ledger/internal/storage/ledgerstore/transactions.go +++ b/components/ledger/internal/storage/ledgerstore/transactions.go @@ -10,8 +10,9 @@ import ( "regexp" "strings" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + ledger "github.com/formancehq/ledger/internal" - "github.com/formancehq/ledger/internal/storage/paginate" "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/metadata" "github.com/formancehq/stack/libs/go-libs/query" @@ -29,13 +30,13 @@ var ( type Transaction struct { bun.BaseModel `bun:"transactions,alias:transactions"` - ID *paginate.BigInt `bun:"id,type:numeric"` - Timestamp ledger.Time `bun:"timestamp,type:timestamp without time zone"` - Reference string `bun:"reference,type:varchar,unique,nullzero"` - Postings []ledger.Posting `bun:"postings,type:jsonb"` - Metadata metadata.Metadata `bun:"metadata,type:jsonb,default:'{}'"` - RevertedAt *ledger.Time `bun:"reverted_at"` - LastUpdate *ledger.Time `bun:"last_update"` + ID *bunpaginate.BigInt `bun:"id,type:numeric"` + Timestamp ledger.Time `bun:"timestamp,type:timestamp without time zone"` + Reference string `bun:"reference,type:varchar,unique,nullzero"` + Postings []ledger.Posting `bun:"postings,type:jsonb"` + Metadata metadata.Metadata `bun:"metadata,type:jsonb,default:'{}'"` + RevertedAt *ledger.Time `bun:"reverted_at"` + LastUpdate *ledger.Time `bun:"last_update"` } func (t *Transaction) toCore() *ledger.Transaction { @@ -55,7 +56,7 @@ type ExpandedTransaction struct { Transaction bun.BaseModel `bun:"transactions,alias:transactions"` - ID *paginate.BigInt `bun:"id,type:numeric"` + ID *bunpaginate.BigInt `bun:"id,type:numeric"` Timestamp ledger.Time `bun:"timestamp,type:timestamp without time zone"` Reference string `bun:"reference,type:varchar,unique,nullzero"` Postings []ledger.Posting `bun:"postings,type:jsonb"` @@ -261,7 +262,7 @@ func (store *Store) GetTransactions(ctx context.Context, q GetTransactionsQuery) } transactions, err := paginateWithColumn[PaginatedQueryOptions[PITFilterWithVolumes], ExpandedTransaction](store, ctx, - (*paginate.ColumnPaginatedQuery[PaginatedQueryOptions[PITFilterWithVolumes]])(&q), + (*bunpaginate.ColumnPaginatedQuery[PaginatedQueryOptions[PITFilterWithVolumes]])(&q), func(query *bun.SelectQuery) *bun.SelectQuery { return store.buildTransactionListQuery(query, q.Options, where, args) }, @@ -316,7 +317,7 @@ func (store *Store) GetTransaction(ctx context.Context, txId *big.Int) (*ledger. Table("transactions"). ColumnExpr(`transactions.id, transactions.reference, transactions.postings, transactions.timestamp, transactions.reverted_at, tm.metadata`). Join("left join transactions_metadata tm on tm.transactions_seq = transactions.seq"). - Where("transactions.id = ?", (*paginate.BigInt)(txId)). + Where("transactions.id = ?", (*bunpaginate.BigInt)(txId)). Where("transactions.ledger = ?", store.name). Order("tm.revision desc"). Limit(1) @@ -365,7 +366,7 @@ func (store *Store) GetLastTransaction(ctx context.Context) (*ledger.ExpandedTra return ret.toCore(), nil } -type GetTransactionsQuery paginate.ColumnPaginatedQuery[PaginatedQueryOptions[PITFilterWithVolumes]] +type GetTransactionsQuery bunpaginate.ColumnPaginatedQuery[PaginatedQueryOptions[PITFilterWithVolumes]] func (q GetTransactionsQuery) WithExpandVolumes() GetTransactionsQuery { q.Options.Options.ExpandVolumes = true @@ -383,7 +384,7 @@ func NewGetTransactionsQuery(options PaginatedQueryOptions[PITFilterWithVolumes] return GetTransactionsQuery{ PageSize: options.PageSize, Column: "id", - Order: paginate.OrderDesc, + Order: bunpaginate.OrderDesc, Options: options, } } diff --git a/components/ledger/internal/storage/ledgerstore/utils.go b/components/ledger/internal/storage/ledgerstore/utils.go index 35e1fd78eb..9282207d63 100644 --- a/components/ledger/internal/storage/ledgerstore/utils.go +++ b/components/ledger/internal/storage/ledgerstore/utils.go @@ -7,10 +7,11 @@ import ( "reflect" "strings" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/formancehq/ledger/internal/storage/sqlutils" ledger "github.com/formancehq/ledger/internal" - "github.com/formancehq/ledger/internal/storage/paginate" "github.com/formancehq/stack/libs/go-libs/api" "github.com/formancehq/stack/libs/go-libs/query" "github.com/uptrace/bun" @@ -34,7 +35,7 @@ func fetch[T any](s *Store, ctx context.Context, builders ...func(query *bun.Sel } func paginateWithOffset[FILTERS any, RETURN any](s *Store, ctx context.Context, - q *paginate.OffsetPaginatedQuery[FILTERS], builders ...func(query *bun.SelectQuery) *bun.SelectQuery) (*api.Cursor[RETURN], error) { + q *bunpaginate.OffsetPaginatedQuery[FILTERS], builders ...func(query *bun.SelectQuery) *bun.SelectQuery) (*api.Cursor[RETURN], error) { //var ret RETURN query := s.bucket.db.NewSelect() @@ -45,16 +46,21 @@ func paginateWithOffset[FILTERS any, RETURN any](s *Store, ctx context.Context, // query = query.Model(ret) //} - return paginate.UsingOffset[FILTERS, RETURN](ctx, query, *q) + return bunpaginate.UsingOffset[FILTERS, RETURN](ctx, query, *q) } -func paginateWithColumn[FILTERS any, RETURN any](s *Store, ctx context.Context, q *paginate.ColumnPaginatedQuery[FILTERS], builders ...func(query *bun.SelectQuery) *bun.SelectQuery) (*api.Cursor[RETURN], error) { +func paginateWithColumn[FILTERS any, RETURN any](s *Store, ctx context.Context, q *bunpaginate.ColumnPaginatedQuery[FILTERS], builders ...func(query *bun.SelectQuery) *bun.SelectQuery) (*api.Cursor[RETURN], error) { query := s.bucket.db.NewSelect() for _, builder := range builders { query = query.Apply(builder) } - return paginate.UsingColumn[FILTERS, RETURN](ctx, query, *q) + ret, err := bunpaginate.UsingColumn[FILTERS, RETURN](ctx, query, *q) + if err != nil { + return nil, sqlutils.PostgresError(err) + } + + return ret, nil } func count(s *Store, ctx context.Context, builders ...func(query *bun.SelectQuery) *bun.SelectQuery) (int, error) { @@ -178,7 +184,7 @@ func (opts PaginatedQueryOptions[T]) WithPageSize(pageSize uint64) PaginatedQuer func NewPaginatedQueryOptions[T any](options T) PaginatedQueryOptions[T] { return PaginatedQueryOptions[T]{ Options: options, - PageSize: paginate.QueryDefaultPageSize, + PageSize: bunpaginate.QueryDefaultPageSize, } } diff --git a/components/ledger/internal/storage/storagetesting/storage.go b/components/ledger/internal/storage/storagetesting/storage.go index 0257c236f4..98aec31c3f 100644 --- a/components/ledger/internal/storage/storagetesting/storage.go +++ b/components/ledger/internal/storage/storagetesting/storage.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/formancehq/ledger/internal/storage/sqlutils" + "github.com/formancehq/stack/libs/go-libs/bun/bunconnect" "github.com/formancehq/ledger/internal/storage/driver" "github.com/formancehq/stack/libs/go-libs/pgtesting" @@ -15,7 +15,7 @@ import ( func StorageDriver(t pgtesting.TestingT) *driver.Driver { pgDatabase := pgtesting.NewPostgresDatabase(t) - d := driver.New(sqlutils.ConnectionOptions{ + d := driver.New(bunconnect.ConnectionOptions{ DatabaseSourceName: pgDatabase.ConnString(), Debug: testing.Verbose(), MaxIdleConns: 40, diff --git a/components/ledger/internal/storage/systemstore/ledgers.go b/components/ledger/internal/storage/systemstore/ledgers.go index 9d10f81f58..19922564b0 100644 --- a/components/ledger/internal/storage/systemstore/ledgers.go +++ b/components/ledger/internal/storage/systemstore/ledgers.go @@ -3,7 +3,8 @@ package systemstore import ( "context" - "github.com/formancehq/ledger/internal/storage/paginate" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "github.com/formancehq/ledger/internal/storage/sqlutils" sharedapi "github.com/formancehq/stack/libs/go-libs/api" @@ -24,7 +25,7 @@ type PaginatedQueryOptions struct { PageSize uint64 `json:"pageSize"` } -type ListLedgersQuery paginate.OffsetPaginatedQuery[PaginatedQueryOptions] +type ListLedgersQuery bunpaginate.OffsetPaginatedQuery[PaginatedQueryOptions] func (query ListLedgersQuery) WithPageSize(pageSize uint64) ListLedgersQuery { query.PageSize = pageSize @@ -43,7 +44,7 @@ func (s *Store) ListLedgers(ctx context.Context, q ListLedgersQuery) (*sharedapi Column("ledger", "bucket", "addedat"). Order("addedat asc") - return paginate.UsingOffset[PaginatedQueryOptions, Ledger](ctx, query, paginate.OffsetPaginatedQuery[PaginatedQueryOptions](q)) + return bunpaginate.UsingOffset[PaginatedQueryOptions, Ledger](ctx, query, bunpaginate.OffsetPaginatedQuery[PaginatedQueryOptions](q)) } func (s *Store) DeleteLedger(ctx context.Context, name string) error { diff --git a/components/ledger/internal/storage/systemstore/ledgers_test.go b/components/ledger/internal/storage/systemstore/ledgers_test.go index e01d0dbc85..475b7943ae 100644 --- a/components/ledger/internal/storage/systemstore/ledgers_test.go +++ b/components/ledger/internal/storage/systemstore/ledgers_test.go @@ -5,9 +5,10 @@ import ( "testing" "time" + "github.com/formancehq/stack/libs/go-libs/bun/bunconnect" + "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + ledger "github.com/formancehq/ledger/internal" - "github.com/formancehq/ledger/internal/storage/paginate" - "github.com/formancehq/ledger/internal/storage/sqlutils" "github.com/formancehq/stack/libs/go-libs/logging" "github.com/formancehq/stack/libs/go-libs/pgtesting" "github.com/stretchr/testify/require" @@ -20,7 +21,7 @@ func newSystemStore(t *testing.T) *Store { pgServer := pgtesting.NewPostgresDatabase(t) - store, err := Connect(ctx, sqlutils.ConnectionOptions{ + store, err := Connect(ctx, bunconnect.ConnectionOptions{ DatabaseSourceName: pgServer.ConnString(), Debug: testing.Verbose(), }) @@ -59,7 +60,7 @@ func TestListLedgers(t *testing.T) { for i := pageSize; i < count; i += pageSize { query := ListLedgersQuery{} - require.NoError(t, paginate.UnmarshalCursor(cursor.Next, &query)) + require.NoError(t, bunpaginate.UnmarshalCursor(cursor.Next, &query)) cursor, err = store.ListLedgers(ctx, query) require.NoError(t, err) diff --git a/components/ledger/internal/storage/systemstore/store.go b/components/ledger/internal/storage/systemstore/store.go index 96477697cf..471734ed71 100644 --- a/components/ledger/internal/storage/systemstore/store.go +++ b/components/ledger/internal/storage/systemstore/store.go @@ -4,6 +4,8 @@ import ( "context" "fmt" + "github.com/formancehq/stack/libs/go-libs/bun/bunconnect" + "github.com/formancehq/ledger/internal/storage/sqlutils" "github.com/uptrace/bun" @@ -15,9 +17,9 @@ type Store struct { db *bun.DB } -func Connect(ctx context.Context, connectionOptions sqlutils.ConnectionOptions) (*Store, error) { +func Connect(ctx context.Context, connectionOptions bunconnect.ConnectionOptions) (*Store, error) { - db, err := sqlutils.OpenDBWithSchema(connectionOptions, Schema) + db, err := bunconnect.OpenDBWithSchema(connectionOptions, Schema) if err != nil { return nil, sqlutils.PostgresError(err) } diff --git a/components/ledger/internal/storage/sqlutils/utils.go b/components/ledger/libs/bun/bunconnect/connect.go similarity index 79% rename from components/ledger/internal/storage/sqlutils/utils.go rename to components/ledger/libs/bun/bunconnect/connect.go index 8c625a6b3b..217a0999fa 100644 --- a/components/ledger/internal/storage/sqlutils/utils.go +++ b/components/ledger/libs/bun/bunconnect/connect.go @@ -1,18 +1,15 @@ -package sqlutils +package bunconnect import ( "database/sql" "fmt" - "io" - "net/url" - "time" - - "github.com/pkg/errors" - "github.com/formancehq/stack/libs/go-libs/bun/bundebug" "github.com/uptrace/bun" "github.com/uptrace/bun/dialect/pgdialect" "github.com/uptrace/bun/extra/bunotel" + "io" + "net/url" + "time" ) type ConnectionOptions struct { @@ -32,7 +29,7 @@ func (opts ConnectionOptions) String() string { func OpenSQLDB(options ConnectionOptions, hooks ...bun.QueryHook) (*bun.DB, error) { sqldb, err := sql.Open("postgres", options.DatabaseSourceName) if err != nil { - return nil, errors.Wrap(err, "connecting to server") + return nil, err } if options.MaxIdleConns != 0 { sqldb.SetMaxIdleConns(options.MaxIdleConns) @@ -54,27 +51,23 @@ func OpenSQLDB(options ConnectionOptions, hooks ...bun.QueryHook) (*bun.DB, erro } if err := db.Ping(); err != nil { - return nil, errors.Wrap(err, "pinging server") + return nil, err } return db, nil } func OpenDBWithSchema(connectionOptions ConnectionOptions, schema string, hooks ...bun.QueryHook) (*bun.DB, error) { - connectionOptions.DatabaseSourceName = SchemaConnectionString(connectionOptions.DatabaseSourceName, schema) - - return OpenSQLDB(connectionOptions, hooks...) -} - -func SchemaConnectionString(sourceName, schema string) string { - parsedConnectionParams, err := url.Parse(sourceName) + parsedConnectionParams, err := url.Parse(connectionOptions.DatabaseSourceName) if err != nil { - panic(err) + return nil, err } query := parsedConnectionParams.Query() query.Set("search_path", schema) parsedConnectionParams.RawQuery = query.Encode() - return parsedConnectionParams.String() + connectionOptions.DatabaseSourceName = parsedConnectionParams.String() + + return OpenSQLDB(connectionOptions, hooks...) } diff --git a/components/ledger/internal/storage/paginate/bigint.go b/components/ledger/libs/bun/bunpaginate/bigint.go similarity index 98% rename from components/ledger/internal/storage/paginate/bigint.go rename to components/ledger/libs/bun/bunpaginate/bigint.go index 29d4693a8f..cc4d5c0ce5 100644 --- a/components/ledger/internal/storage/paginate/bigint.go +++ b/components/ledger/libs/bun/bunpaginate/bigint.go @@ -1,4 +1,4 @@ -package paginate +package bunpaginate import ( "database/sql" diff --git a/components/ledger/internal/storage/paginate/iterate.go b/components/ledger/libs/bun/bunpaginate/iterate.go similarity index 97% rename from components/ledger/internal/storage/paginate/iterate.go rename to components/ledger/libs/bun/bunpaginate/iterate.go index 838c109a8d..7bad5c8c84 100644 --- a/components/ledger/internal/storage/paginate/iterate.go +++ b/components/ledger/libs/bun/bunpaginate/iterate.go @@ -1,4 +1,4 @@ -package paginate +package bunpaginate import ( "context" diff --git a/components/ledger/internal/storage/paginate/main_test.go b/components/ledger/libs/bun/bunpaginate/main_test.go similarity index 93% rename from components/ledger/internal/storage/paginate/main_test.go rename to components/ledger/libs/bun/bunpaginate/main_test.go index 20bab814d2..f00ab5d5a2 100644 --- a/components/ledger/internal/storage/paginate/main_test.go +++ b/components/ledger/libs/bun/bunpaginate/main_test.go @@ -1,4 +1,4 @@ -package paginate_test +package bunpaginate_test import ( "os" diff --git a/components/ledger/internal/storage/paginate/pagination.go b/components/ledger/libs/bun/bunpaginate/pagination.go similarity index 98% rename from components/ledger/internal/storage/paginate/pagination.go rename to components/ledger/libs/bun/bunpaginate/pagination.go index b05411162d..858728dd1c 100644 --- a/components/ledger/internal/storage/paginate/pagination.go +++ b/components/ledger/libs/bun/bunpaginate/pagination.go @@ -1,4 +1,4 @@ -package paginate +package bunpaginate import ( "encoding/base64" diff --git a/components/ledger/internal/storage/paginate/pagination_column.go b/components/ledger/libs/bun/bunpaginate/pagination_column.go similarity index 95% rename from components/ledger/internal/storage/paginate/pagination_column.go rename to components/ledger/libs/bun/bunpaginate/pagination_column.go index e466aa46d7..74cae26172 100644 --- a/components/ledger/internal/storage/paginate/pagination_column.go +++ b/components/ledger/libs/bun/bunpaginate/pagination_column.go @@ -1,4 +1,4 @@ -package paginate +package bunpaginate import ( "context" @@ -7,8 +7,6 @@ import ( "reflect" "strings" - storageerrors "github.com/formancehq/ledger/internal/storage/sqlutils" - "github.com/formancehq/stack/libs/go-libs/api" "github.com/uptrace/bun" ) @@ -44,7 +42,7 @@ func UsingColumn[FILTERS any, ENTITY any](ctx context.Context, } if err := sb.Scan(ctx, &ret); err != nil { - return nil, storageerrors.PostgresError(err) + return nil, err } var ( paginatedColumnIndex = 0 diff --git a/components/ledger/internal/storage/paginate/pagination_column_test.go b/components/ledger/libs/bun/bunpaginate/pagination_column_test.go similarity index 63% rename from components/ledger/internal/storage/paginate/pagination_column_test.go rename to components/ledger/libs/bun/bunpaginate/pagination_column_test.go index 3435918a02..dd442e0f4b 100644 --- a/components/ledger/internal/storage/paginate/pagination_column_test.go +++ b/components/ledger/libs/bun/bunpaginate/pagination_column_test.go @@ -1,13 +1,12 @@ -package paginate_test +package bunpaginate_test import ( "context" + "github.com/formancehq/stack/libs/go-libs/bun/bunconnect" + bunpaginate2 "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" "math/big" "testing" - "github.com/formancehq/ledger/internal/storage/sqlutils" - - "github.com/formancehq/ledger/internal/storage/paginate" "github.com/formancehq/stack/libs/go-libs/pgtesting" "github.com/stretchr/testify/require" ) @@ -16,7 +15,7 @@ func TestColumnPagination(t *testing.T) { t.Parallel() pgServer := pgtesting.NewPostgresDatabase(t) - db, err := sqlutils.OpenSQLDB(sqlutils.ConnectionOptions{ + db, err := bunconnect.OpenSQLDB(bunconnect.ConnectionOptions{ DatabaseSourceName: pgServer.ConnString(), Debug: testing.Verbose(), }) @@ -31,14 +30,14 @@ func TestColumnPagination(t *testing.T) { require.NoError(t, err) type model struct { - ID *paginate.BigInt `bun:"id,type:numeric"` - Pair bool `bun:"pair"` + ID *bunpaginate2.BigInt `bun:"id,type:numeric"` + Pair bool `bun:"pair"` } models := make([]model, 0) for i := 0; i < 100; i++ { models = append(models, model{ - ID: (*paginate.BigInt)(big.NewInt(int64(i))), + ID: (*bunpaginate2.BigInt)(big.NewInt(int64(i))), Pair: i%2 == 0, }) } @@ -50,67 +49,67 @@ func TestColumnPagination(t *testing.T) { type testCase struct { name string - query paginate.ColumnPaginatedQuery[bool] - expectedNext *paginate.ColumnPaginatedQuery[bool] - expectedPrevious *paginate.ColumnPaginatedQuery[bool] + query bunpaginate2.ColumnPaginatedQuery[bool] + expectedNext *bunpaginate2.ColumnPaginatedQuery[bool] + expectedPrevious *bunpaginate2.ColumnPaginatedQuery[bool] expectedNumberOfItems int64 } testCases := []testCase{ { name: "asc first page", - query: paginate.ColumnPaginatedQuery[bool]{ + query: bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, }, - expectedNext: &paginate.ColumnPaginatedQuery[bool]{ + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", PaginationID: big.NewInt(int64(10)), - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Bottom: big.NewInt(int64(0)), }, expectedNumberOfItems: 10, }, { name: "asc second page using next cursor", - query: paginate.ColumnPaginatedQuery[bool]{ + query: bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", PaginationID: big.NewInt(int64(10)), - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Bottom: big.NewInt(int64(0)), }, - expectedPrevious: &paginate.ColumnPaginatedQuery[bool]{ + expectedPrevious: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Bottom: big.NewInt(int64(0)), PaginationID: big.NewInt(int64(10)), Reverse: true, }, - expectedNext: &paginate.ColumnPaginatedQuery[bool]{ + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", PaginationID: big.NewInt(int64(20)), - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Bottom: big.NewInt(int64(0)), }, expectedNumberOfItems: 10, }, { name: "asc last page using next cursor", - query: paginate.ColumnPaginatedQuery[bool]{ + query: bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", PaginationID: big.NewInt(int64(90)), - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Bottom: big.NewInt(int64(0)), }, - expectedPrevious: &paginate.ColumnPaginatedQuery[bool]{ + expectedPrevious: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, PaginationID: big.NewInt(int64(90)), Bottom: big.NewInt(int64(0)), Reverse: true, @@ -119,116 +118,116 @@ func TestColumnPagination(t *testing.T) { }, { name: "desc first page", - query: paginate.ColumnPaginatedQuery[bool]{ + query: bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, }, - expectedNext: &paginate.ColumnPaginatedQuery[bool]{ + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Bottom: big.NewInt(int64(99)), Column: "id", PaginationID: big.NewInt(int64(89)), - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, }, expectedNumberOfItems: 10, }, { name: "desc second page using next cursor", - query: paginate.ColumnPaginatedQuery[bool]{ + query: bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Bottom: big.NewInt(int64(99)), Column: "id", PaginationID: big.NewInt(int64(89)), - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, }, - expectedPrevious: &paginate.ColumnPaginatedQuery[bool]{ + expectedPrevious: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Bottom: big.NewInt(int64(99)), Column: "id", PaginationID: big.NewInt(int64(89)), - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, Reverse: true, }, - expectedNext: &paginate.ColumnPaginatedQuery[bool]{ + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Bottom: big.NewInt(int64(99)), Column: "id", PaginationID: big.NewInt(int64(79)), - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, }, expectedNumberOfItems: 10, }, { name: "desc last page using next cursor", - query: paginate.ColumnPaginatedQuery[bool]{ + query: bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Bottom: big.NewInt(int64(99)), Column: "id", PaginationID: big.NewInt(int64(9)), - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, }, - expectedPrevious: &paginate.ColumnPaginatedQuery[bool]{ + expectedPrevious: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Bottom: big.NewInt(int64(99)), Column: "id", PaginationID: big.NewInt(int64(9)), - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, Reverse: true, }, expectedNumberOfItems: 10, }, { name: "asc first page using previous cursor", - query: paginate.ColumnPaginatedQuery[bool]{ + query: bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Bottom: big.NewInt(int64(0)), Column: "id", PaginationID: big.NewInt(int64(10)), - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Reverse: true, }, - expectedNext: &paginate.ColumnPaginatedQuery[bool]{ + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Bottom: big.NewInt(int64(0)), Column: "id", PaginationID: big.NewInt(int64(10)), - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, }, expectedNumberOfItems: 10, }, { name: "desc first page using previous cursor", - query: paginate.ColumnPaginatedQuery[bool]{ + query: bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Bottom: big.NewInt(int64(99)), Column: "id", PaginationID: big.NewInt(int64(89)), - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, Reverse: true, }, - expectedNext: &paginate.ColumnPaginatedQuery[bool]{ + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Bottom: big.NewInt(int64(99)), Column: "id", PaginationID: big.NewInt(int64(89)), - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, }, expectedNumberOfItems: 10, }, { name: "asc first page with filter", - query: paginate.ColumnPaginatedQuery[bool]{ + query: bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Options: true, }, - expectedNext: &paginate.ColumnPaginatedQuery[bool]{ + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", PaginationID: big.NewInt(int64(20)), - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Options: true, Bottom: big.NewInt(int64(0)), }, @@ -236,27 +235,27 @@ func TestColumnPagination(t *testing.T) { }, { name: "asc second page with filter", - query: paginate.ColumnPaginatedQuery[bool]{ + query: bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", PaginationID: big.NewInt(int64(20)), - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Options: true, Bottom: big.NewInt(int64(0)), }, - expectedNext: &paginate.ColumnPaginatedQuery[bool]{ + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", PaginationID: big.NewInt(int64(40)), - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Options: true, Bottom: big.NewInt(int64(0)), }, - expectedPrevious: &paginate.ColumnPaginatedQuery[bool]{ + expectedPrevious: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", PaginationID: big.NewInt(int64(20)), - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Options: true, Bottom: big.NewInt(int64(0)), Reverse: true, @@ -265,17 +264,17 @@ func TestColumnPagination(t *testing.T) { }, { name: "desc first page with filter", - query: paginate.ColumnPaginatedQuery[bool]{ + query: bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, Options: true, }, - expectedNext: &paginate.ColumnPaginatedQuery[bool]{ + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", PaginationID: big.NewInt(int64(78)), - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, Options: true, Bottom: big.NewInt(int64(98)), }, @@ -283,27 +282,27 @@ func TestColumnPagination(t *testing.T) { }, { name: "desc second page with filter", - query: paginate.ColumnPaginatedQuery[bool]{ + query: bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", PaginationID: big.NewInt(int64(78)), - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, Options: true, Bottom: big.NewInt(int64(98)), }, - expectedNext: &paginate.ColumnPaginatedQuery[bool]{ + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", PaginationID: big.NewInt(int64(58)), - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, Options: true, Bottom: big.NewInt(int64(98)), }, - expectedPrevious: &paginate.ColumnPaginatedQuery[bool]{ + expectedPrevious: &bunpaginate2.ColumnPaginatedQuery[bool]{ PageSize: 10, Column: "id", PaginationID: big.NewInt(int64(78)), - Order: paginate.OrderDesc, + Order: bunpaginate2.OrderDesc, Options: true, Bottom: big.NewInt(int64(98)), Reverse: true, @@ -320,7 +319,7 @@ func TestColumnPagination(t *testing.T) { if tc.query.Options { query = query.Where("pair = ?", true) } - cursor, err := paginate.UsingColumn[bool, model](context.Background(), query, tc.query) + cursor, err := bunpaginate2.UsingColumn[bool, model](context.Background(), query, tc.query) require.NoError(t, err) if tc.expectedNext == nil { @@ -328,8 +327,8 @@ func TestColumnPagination(t *testing.T) { } else { require.NotEmpty(t, cursor.Next) - q := paginate.ColumnPaginatedQuery[bool]{} - require.NoError(t, paginate.UnmarshalCursor(cursor.Next, &q)) + q := bunpaginate2.ColumnPaginatedQuery[bool]{} + require.NoError(t, bunpaginate2.UnmarshalCursor(cursor.Next, &q)) require.EqualValues(t, *tc.expectedNext, q) } @@ -338,8 +337,8 @@ func TestColumnPagination(t *testing.T) { } else { require.NotEmpty(t, cursor.Previous) - q := paginate.ColumnPaginatedQuery[bool]{} - require.NoError(t, paginate.UnmarshalCursor(cursor.Previous, &q)) + q := bunpaginate2.ColumnPaginatedQuery[bool]{} + require.NoError(t, bunpaginate2.UnmarshalCursor(cursor.Previous, &q)) require.EqualValues(t, *tc.expectedPrevious, q) } }) diff --git a/components/ledger/internal/storage/paginate/pagination_offset.go b/components/ledger/libs/bun/bunpaginate/pagination_offset.go similarity index 98% rename from components/ledger/internal/storage/paginate/pagination_offset.go rename to components/ledger/libs/bun/bunpaginate/pagination_offset.go index 9630b3d01a..263b5e69f1 100644 --- a/components/ledger/internal/storage/paginate/pagination_offset.go +++ b/components/ledger/libs/bun/bunpaginate/pagination_offset.go @@ -1,4 +1,4 @@ -package paginate +package bunpaginate import ( "context" diff --git a/components/ledger/internal/storage/paginate/pagination_offset_test.go b/components/ledger/libs/bun/bunpaginate/pagination_offset_test.go similarity index 57% rename from components/ledger/internal/storage/paginate/pagination_offset_test.go rename to components/ledger/libs/bun/bunpaginate/pagination_offset_test.go index 0156bae199..711bc0606b 100644 --- a/components/ledger/internal/storage/paginate/pagination_offset_test.go +++ b/components/ledger/libs/bun/bunpaginate/pagination_offset_test.go @@ -1,12 +1,11 @@ -package paginate_test +package bunpaginate_test import ( "context" + "github.com/formancehq/stack/libs/go-libs/bun/bunconnect" + bunpaginate2 "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" "testing" - "github.com/formancehq/ledger/internal/storage/sqlutils" - - "github.com/formancehq/ledger/internal/storage/paginate" "github.com/formancehq/stack/libs/go-libs/pgtesting" "github.com/stretchr/testify/require" ) @@ -15,7 +14,7 @@ func TestOffsetPagination(t *testing.T) { t.Parallel() pgServer := pgtesting.NewPostgresDatabase(t) - db, err := sqlutils.OpenSQLDB(sqlutils.ConnectionOptions{ + db, err := bunconnect.OpenSQLDB(bunconnect.ConnectionOptions{ DatabaseSourceName: pgServer.ConnString(), Debug: testing.Verbose(), }) @@ -49,87 +48,87 @@ func TestOffsetPagination(t *testing.T) { type testCase struct { name string - query paginate.OffsetPaginatedQuery[bool] - expectedNext *paginate.OffsetPaginatedQuery[bool] - expectedPrevious *paginate.OffsetPaginatedQuery[bool] + query bunpaginate2.OffsetPaginatedQuery[bool] + expectedNext *bunpaginate2.OffsetPaginatedQuery[bool] + expectedPrevious *bunpaginate2.OffsetPaginatedQuery[bool] expectedNumberOfItems uint64 } testCases := []testCase{ { name: "asc first page", - query: paginate.OffsetPaginatedQuery[bool]{ + query: bunpaginate2.OffsetPaginatedQuery[bool]{ PageSize: 10, - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, }, - expectedNext: &paginate.OffsetPaginatedQuery[bool]{ + expectedNext: &bunpaginate2.OffsetPaginatedQuery[bool]{ PageSize: 10, Offset: 10, - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, }, expectedNumberOfItems: 10, }, { name: "asc second page using next cursor", - query: paginate.OffsetPaginatedQuery[bool]{ + query: bunpaginate2.OffsetPaginatedQuery[bool]{ PageSize: 10, Offset: 10, - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, }, - expectedPrevious: &paginate.OffsetPaginatedQuery[bool]{ + expectedPrevious: &bunpaginate2.OffsetPaginatedQuery[bool]{ PageSize: 10, - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Offset: 0, }, - expectedNext: &paginate.OffsetPaginatedQuery[bool]{ + expectedNext: &bunpaginate2.OffsetPaginatedQuery[bool]{ PageSize: 10, - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Offset: 20, }, expectedNumberOfItems: 10, }, { name: "asc last page using next cursor", - query: paginate.OffsetPaginatedQuery[bool]{ + query: bunpaginate2.OffsetPaginatedQuery[bool]{ PageSize: 10, Offset: 90, - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, }, - expectedPrevious: &paginate.OffsetPaginatedQuery[bool]{ + expectedPrevious: &bunpaginate2.OffsetPaginatedQuery[bool]{ PageSize: 10, - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Offset: 80, }, expectedNumberOfItems: 10, }, { name: "asc last page partial", - query: paginate.OffsetPaginatedQuery[bool]{ + query: bunpaginate2.OffsetPaginatedQuery[bool]{ PageSize: 10, Offset: 95, - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, }, - expectedPrevious: &paginate.OffsetPaginatedQuery[bool]{ + expectedPrevious: &bunpaginate2.OffsetPaginatedQuery[bool]{ PageSize: 10, - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Offset: 85, }, expectedNumberOfItems: 10, }, { name: "asc fist page partial", - query: paginate.OffsetPaginatedQuery[bool]{ + query: bunpaginate2.OffsetPaginatedQuery[bool]{ PageSize: 10, Offset: 5, - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, }, - expectedPrevious: &paginate.OffsetPaginatedQuery[bool]{ + expectedPrevious: &bunpaginate2.OffsetPaginatedQuery[bool]{ PageSize: 10, - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Offset: 0, }, - expectedNext: &paginate.OffsetPaginatedQuery[bool]{ + expectedNext: &bunpaginate2.OffsetPaginatedQuery[bool]{ PageSize: 10, - Order: paginate.OrderAsc, + Order: bunpaginate2.OrderAsc, Offset: 15, }, expectedNumberOfItems: 10, @@ -144,7 +143,7 @@ func TestOffsetPagination(t *testing.T) { if tc.query.Options { query = query.Where("pair = ?", true) } - cursor, err := paginate.UsingOffset[bool, model]( + cursor, err := bunpaginate2.UsingOffset[bool, model]( context.Background(), query, tc.query) @@ -155,8 +154,8 @@ func TestOffsetPagination(t *testing.T) { } else { require.NotEmpty(t, cursor.Next) - q := paginate.OffsetPaginatedQuery[bool]{} - require.NoError(t, paginate.UnmarshalCursor(cursor.Next, &q)) + q := bunpaginate2.OffsetPaginatedQuery[bool]{} + require.NoError(t, bunpaginate2.UnmarshalCursor(cursor.Next, &q)) require.EqualValues(t, *tc.expectedNext, q) } @@ -165,8 +164,8 @@ func TestOffsetPagination(t *testing.T) { } else { require.NotEmpty(t, cursor.Previous) - q := paginate.OffsetPaginatedQuery[bool]{} - require.NoError(t, paginate.UnmarshalCursor(cursor.Previous, &q)) + q := bunpaginate2.OffsetPaginatedQuery[bool]{} + require.NoError(t, bunpaginate2.UnmarshalCursor(cursor.Previous, &q)) require.EqualValues(t, *tc.expectedPrevious, q) } }) diff --git a/components/ledger/libs/go.mod b/components/ledger/libs/go.mod index 4e11b4cac7..b14e9d5f1a 100644 --- a/components/ledger/libs/go.mod +++ b/components/ledger/libs/go.mod @@ -24,17 +24,18 @@ require ( github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.3 - github.com/uptrace/bun v1.1.14 - github.com/uptrace/bun/dialect/pgdialect v1.1.14 - github.com/uptrace/bun/extra/bundebug v1.1.14 + github.com/stretchr/testify v1.8.4 + github.com/uptrace/bun v1.1.16 + github.com/uptrace/bun/dialect/pgdialect v1.1.16 + github.com/uptrace/bun/extra/bundebug v1.1.16 + github.com/uptrace/bun/extra/bunotel v1.1.16 github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 github.com/xdg-go/scram v1.1.2 go.opentelemetry.io/contrib/instrumentation/host v0.42.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0 go.opentelemetry.io/contrib/propagators/b3 v1.13.0 - go.opentelemetry.io/otel v1.16.0 + go.opentelemetry.io/otel v1.17.0 go.opentelemetry.io/otel/exporters/jaeger v1.16.0 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.39.0 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.39.0 @@ -43,10 +44,10 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 - go.opentelemetry.io/otel/metric v1.16.0 + go.opentelemetry.io/otel/metric v1.17.0 go.opentelemetry.io/otel/sdk v1.16.0 go.opentelemetry.io/otel/sdk/metric v0.39.0 - go.opentelemetry.io/otel/trace v1.16.0 + go.opentelemetry.io/otel/trace v1.17.0 go.uber.org/fx v1.19.1 go.uber.org/zap v1.24.0 ) @@ -128,6 +129,7 @@ require ( github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect + github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 // indirect github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 // indirect github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect @@ -148,7 +150,7 @@ require ( golang.org/x/crypto v0.12.0 // indirect golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.11.0 // indirect + golang.org/x/sys v0.12.0 // indirect golang.org/x/text v0.12.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.6.0 // indirect diff --git a/components/ledger/libs/go.sum b/components/ledger/libs/go.sum index 0f2a5e0d5f..655b4bea6c 100644 --- a/components/ledger/libs/go.sum +++ b/components/ledger/libs/go.sum @@ -429,8 +429,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -440,14 +440,18 @@ github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYm github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= -github.com/uptrace/bun v1.1.14 h1:S5vvNnjEynJ0CvnrBOD7MIRW7q/WbtvFXrdfy0lddAM= -github.com/uptrace/bun v1.1.14/go.mod h1:RHk6DrIisO62dv10pUOJCz5MphXThuOTpVNYEYv7NI8= -github.com/uptrace/bun/dialect/pgdialect v1.1.14 h1:b7+V1KDJPQSFYgkG/6YLXCl2uvwEY3kf/GSM7hTHRDY= -github.com/uptrace/bun/dialect/pgdialect v1.1.14/go.mod h1:v6YiaXmnKQ2FlhRD2c0ZfKd+QXH09pYn4H8ojaavkKk= -github.com/uptrace/bun/extra/bundebug v1.1.14 h1:9OCGfP9ZDlh41u6OLerWdhBtJAVGXHr0xtxO4xWi6t0= -github.com/uptrace/bun/extra/bundebug v1.1.14/go.mod h1:lto3guzS2v6mnQp1+akyE+ecBLOltevDDe324NXEYdw= +github.com/uptrace/bun v1.1.16 h1:cn9cgEMFwcyYRsQLfxCRMUxyK1WaHwOVrR3TvzEFZ/A= +github.com/uptrace/bun v1.1.16/go.mod h1:7HnsMRRvpLFUcquJxp22JO8PsWKpFQO/gNXqqsuGWg8= +github.com/uptrace/bun/dialect/pgdialect v1.1.16 h1:eUPZ+YCJ69BA+W1X1ZmpOJSkv1oYtinr0zCXf7zCo5g= +github.com/uptrace/bun/dialect/pgdialect v1.1.16/go.mod h1:KQjfx/r6JM0OXfbv0rFrxAbdkPD7idK8VitnjIV9fZI= +github.com/uptrace/bun/extra/bundebug v1.1.16 h1:SgicRQGtnjhrIhlYOxdkOm1Em4s6HykmT3JblHnoTBM= +github.com/uptrace/bun/extra/bundebug v1.1.16/go.mod h1:SkiOkfUirBiO1Htc4s5bQKEq+JSeU1TkBVpMsPz2ePM= +github.com/uptrace/bun/extra/bunotel v1.1.16 h1:qkLTaTZK3FZk3b2P/stO/krS7KX9Fq5wSOj7Hlb2HG8= +github.com/uptrace/bun/extra/bunotel v1.1.16/go.mod h1:JwEH0kdXFnzYuK8D6eXUrf9HKsYy5wmB+lqQ/+dvH4E= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 h1:OXsouNDvuET5o1A4uvoCnAXuuNke8JlfZWceciyUlC8= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21/go.mod h1:Xm3wlRGm5xzdAGPOvqydXPiGj0Da1q0OlUNm7Utoda4= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 h1:USRngIQppxeyb39XzkVHXwQesKK0+JSwnHE/1c7fgic= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2/go.mod h1:1frv9RN1rlTq0jzCq+mVuEQisubZCQ4OU6S/8CaHzGY= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 h1:HCqo51kNF8wxDMDhxcN5S6DlfZXigMtptRpkvjBCeVc= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21/go.mod h1:2MNqrUmDrt5E0glMuoJI/9FyGVpBKo1FqjSH60UOZFg= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -495,8 +499,8 @@ go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0 h1:EbmAUG9hEAMXyfWEa go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0/go.mod h1:rD9feqRYP24P14t5kmhNMqsqm1jvKmpx2H2rKVw52V8= go.opentelemetry.io/contrib/propagators/b3 v1.13.0 h1:f17PBmZK60RoHvOpJVqEka8oS2EXjpjHquESD/8zZ50= go.opentelemetry.io/contrib/propagators/b3 v1.13.0/go.mod h1:zy2hz1TpGUoJzSwlBchVGvVAFQS8s2pglKLbrAFZ+Sc= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= @@ -517,14 +521,14 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 h1:fl2WmyenEf6LYY go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0/go.mod h1:csyQxQ0UHHKVA8KApS7eUO/klMO5sd/av5CNZNU4O6w= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -706,8 +710,8 @@ golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/components/ledger/libs/migrations/migrator_test.go b/components/ledger/libs/migrations/migrator_test.go index 3120ee2392..4723f4ee20 100644 --- a/components/ledger/libs/migrations/migrator_test.go +++ b/components/ledger/libs/migrations/migrator_test.go @@ -15,9 +15,9 @@ import ( func TestMigrations(t *testing.T) { require.NoError(t, pgtesting.CreatePostgresServer()) - defer func() { + t.Cleanup(func() { require.NoError(t, pgtesting.DestroyPostgresServer()) - }() + }) migrator := NewMigrator() migrator.RegisterMigrations( diff --git a/components/ledger/libs/publish/messages.go b/components/ledger/libs/publish/messages.go index 225f4152ca..acf580861f 100644 --- a/components/ledger/libs/publish/messages.go +++ b/components/ledger/libs/publish/messages.go @@ -26,3 +26,11 @@ type EventMessage struct { Type string `json:"type"` Payload any `json:"payload"` } + +func UnmarshalMessage(msg *message.Message) (*EventMessage, error) { + ev := &EventMessage{} + if err := json.Unmarshal(msg.Payload, ev); err != nil { + return nil, err + } + return ev, nil +} diff --git a/components/operator/go.mod b/components/operator/go.mod index 0b6a4bd8f3..41bd00dee5 100644 --- a/components/operator/go.mod +++ b/components/operator/go.mod @@ -58,7 +58,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/nats-io/nkeys v0.4.6 // indirect + github.com/nats-io/nkeys v0.4.4 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.14.0 // indirect @@ -67,17 +67,17 @@ require ( github.com/prometheus/procfs v0.9.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.8.3 // indirect + github.com/stretchr/testify v1.8.4 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/goleak v1.2.1 // indirect go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.12.0 // indirect golang.org/x/net v0.10.0 // indirect golang.org/x/oauth2 v0.6.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/term v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/time v0.3.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/components/operator/go.sum b/components/operator/go.sum index 47694dc770..9d2904f7cb 100644 --- a/components/operator/go.sum +++ b/components/operator/go.sum @@ -207,8 +207,8 @@ github.com/nats-io/jwt/v2 v2.5.0 h1:WQQ40AAlqqfx+f6ku+i0pOVm+ASirD4fUh+oQsiE9Ak= github.com/nats-io/nats-server/v2 v2.9.23 h1:6Wj6H6QpP9FMlpCyWUaNu2yeZ/qGj+mdRkZ1wbikExU= github.com/nats-io/nats.go v1.28.0 h1:Th4G6zdsz2d0OqXdfzKLClo6bOfoI/b1kInhRtFIy5c= github.com/nats-io/nats.go v1.28.0/go.mod h1:XpbWUlOElGwTYbMR7imivs7jJj9GtK7ypv321Wp6pjc= -github.com/nats-io/nkeys v0.4.6 h1:IzVe95ru2CT6ta874rt9saQRkWfe2nFj1NtvYSLqMzY= -github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= +github.com/nats-io/nkeys v0.4.4 h1:xvBJ8d69TznjcQl9t6//Q5xXuVhyYiSos6RPtvQNTwA= +github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/numary/auth/authclient v0.0.0-20220811153653-6335dd9658f2 h1:mBe5Xrlwtkmc/RkyLedf2LPFsFRZzpZNMgORW7rFmxs= @@ -254,8 +254,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= @@ -286,8 +286,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= 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= @@ -401,11 +401,11 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= 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= @@ -413,8 +413,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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= diff --git a/components/operator/internal/controllers/stack/testdata/monopod-latest/results/deployments-apps-v1/monopod-latest.yaml b/components/operator/internal/controllers/stack/testdata/monopod-latest/results/deployments-apps-v1/monopod-latest.yaml index 5a6d5ede2f..02f5da3ad2 100644 --- a/components/operator/internal/controllers/stack/testdata/monopod-latest/results/deployments-apps-v1/monopod-latest.yaml +++ b/components/operator/internal/controllers/stack/testdata/monopod-latest/results/deployments-apps-v1/monopod-latest.yaml @@ -438,6 +438,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka:1234 + - name: TOPICS + value: monopod-latest-ledger monopod-latest-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/monopod-ledgerv1/results/deployments-apps-v1/monopod-ledgerv1.yaml b/components/operator/internal/controllers/stack/testdata/monopod-ledgerv1/results/deployments-apps-v1/monopod-ledgerv1.yaml index 07ccd1f8b3..be49314643 100644 --- a/components/operator/internal/controllers/stack/testdata/monopod-ledgerv1/results/deployments-apps-v1/monopod-ledgerv1.yaml +++ b/components/operator/internal/controllers/stack/testdata/monopod-ledgerv1/results/deployments-apps-v1/monopod-ledgerv1.yaml @@ -440,6 +440,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka:1234 + - name: TOPICS + value: monopod-ledgerv1-ledger monopod-ledgerv1-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/monopod-payments-after-v1.0.0-alpha.6/results/deployments-apps-v1/monopod-payments-after-v1-0-0-alpha-6.yaml b/components/operator/internal/controllers/stack/testdata/monopod-payments-after-v1.0.0-alpha.6/results/deployments-apps-v1/monopod-payments-after-v1-0-0-alpha-6.yaml index 917fe28074..158bce505d 100644 --- a/components/operator/internal/controllers/stack/testdata/monopod-payments-after-v1.0.0-alpha.6/results/deployments-apps-v1/monopod-payments-after-v1-0-0-alpha-6.yaml +++ b/components/operator/internal/controllers/stack/testdata/monopod-payments-after-v1.0.0-alpha.6/results/deployments-apps-v1/monopod-payments-after-v1-0-0-alpha-6.yaml @@ -438,6 +438,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka:1234 + - name: TOPICS + value: monopod-payments-after-v1-0-0-alpha-6-ledger monopod-payments-after-v1-0-0-alpha-6-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/monopod-payments-before-v1.0.0-alpha.6/results/deployments-apps-v1/monopod-payments-before-v1-0-0-alpha-6.yaml b/components/operator/internal/controllers/stack/testdata/monopod-payments-before-v1.0.0-alpha.6/results/deployments-apps-v1/monopod-payments-before-v1-0-0-alpha-6.yaml index 3d4bba457e..0cb97db190 100644 --- a/components/operator/internal/controllers/stack/testdata/monopod-payments-before-v1.0.0-alpha.6/results/deployments-apps-v1/monopod-payments-before-v1-0-0-alpha-6.yaml +++ b/components/operator/internal/controllers/stack/testdata/monopod-payments-before-v1.0.0-alpha.6/results/deployments-apps-v1/monopod-payments-before-v1-0-0-alpha-6.yaml @@ -438,6 +438,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka:1234 + - name: TOPICS + value: monopod-payments-before-v1-0-0-alpha-6-ledger monopod-payments-before-v1-0-0-alpha-6-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/monopod-search-before-v0.7.0/results/deployments-apps-v1/monopod-search-before-v0-7-0.yaml b/components/operator/internal/controllers/stack/testdata/monopod-search-before-v0.7.0/results/deployments-apps-v1/monopod-search-before-v0-7-0.yaml index 49f537f6b9..b11f2dc337 100644 --- a/components/operator/internal/controllers/stack/testdata/monopod-search-before-v0.7.0/results/deployments-apps-v1/monopod-search-before-v0-7-0.yaml +++ b/components/operator/internal/controllers/stack/testdata/monopod-search-before-v0.7.0/results/deployments-apps-v1/monopod-search-before-v0-7-0.yaml @@ -438,6 +438,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka:1234 + - name: TOPICS + value: monopod-search-before-v0-7-0-ledger monopod-search-before-v0-7-0-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/multipod-debug/results/deployments-apps-v1/orchestration-worker.yaml b/components/operator/internal/controllers/stack/testdata/multipod-debug/results/deployments-apps-v1/orchestration-worker.yaml index f8304c4a40..b7261657a8 100644 --- a/components/operator/internal/controllers/stack/testdata/multipod-debug/results/deployments-apps-v1/orchestration-worker.yaml +++ b/components/operator/internal/controllers/stack/testdata/multipod-debug/results/deployments-apps-v1/orchestration-worker.yaml @@ -85,6 +85,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka:1234 + - name: TOPICS + value: multipod-debug-ledger multipod-debug-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/multipod-latest-no-monitoring/results/deployments-apps-v1/orchestration-worker.yaml b/components/operator/internal/controllers/stack/testdata/multipod-latest-no-monitoring/results/deployments-apps-v1/orchestration-worker.yaml index e4e224d3fb..a7bbf222a1 100644 --- a/components/operator/internal/controllers/stack/testdata/multipod-latest-no-monitoring/results/deployments-apps-v1/orchestration-worker.yaml +++ b/components/operator/internal/controllers/stack/testdata/multipod-latest-no-monitoring/results/deployments-apps-v1/orchestration-worker.yaml @@ -68,6 +68,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka:1234 + - name: TOPICS + value: multipod-latest-no-monitoring-ledger multipod-latest-no-monitoring-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/multipod-latest-with-custom-registry/results/deployments-apps-v1/orchestration-worker.yaml b/components/operator/internal/controllers/stack/testdata/multipod-latest-with-custom-registry/results/deployments-apps-v1/orchestration-worker.yaml index 2cf23bb42a..1c3235e567 100644 --- a/components/operator/internal/controllers/stack/testdata/multipod-latest-with-custom-registry/results/deployments-apps-v1/orchestration-worker.yaml +++ b/components/operator/internal/controllers/stack/testdata/multipod-latest-with-custom-registry/results/deployments-apps-v1/orchestration-worker.yaml @@ -85,6 +85,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka1:1234 kafka2:1234 + - name: TOPICS + value: multipod-latest-with-custom-registry-ledger multipod-latest-with-custom-registry-payments image: localhost:5000/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/multipod-latest-with-gateway-fallback/results/deployments-apps-v1/orchestration-worker.yaml b/components/operator/internal/controllers/stack/testdata/multipod-latest-with-gateway-fallback/results/deployments-apps-v1/orchestration-worker.yaml index 6d08deec75..b9b752922e 100644 --- a/components/operator/internal/controllers/stack/testdata/multipod-latest-with-gateway-fallback/results/deployments-apps-v1/orchestration-worker.yaml +++ b/components/operator/internal/controllers/stack/testdata/multipod-latest-with-gateway-fallback/results/deployments-apps-v1/orchestration-worker.yaml @@ -85,6 +85,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka1:1234 kafka2:1234 + - name: TOPICS + value: multipod-latest-with-gateway-fallback-ledger multipod-latest-with-gateway-fallback-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/multipod-latest-with-secrets/results/deployments-apps-v1/orchestration-worker.yaml b/components/operator/internal/controllers/stack/testdata/multipod-latest-with-secrets/results/deployments-apps-v1/orchestration-worker.yaml index 8cce6d6457..daa6c39c3d 100644 --- a/components/operator/internal/controllers/stack/testdata/multipod-latest-with-secrets/results/deployments-apps-v1/orchestration-worker.yaml +++ b/components/operator/internal/controllers/stack/testdata/multipod-latest-with-secrets/results/deployments-apps-v1/orchestration-worker.yaml @@ -99,6 +99,14 @@ spec: secretKeyRef: key: tls.crt name: temporal + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka1:1234 kafka2:1234 + - name: TOPICS + value: multipod-latest-with-secrets-ledger multipod-latest-with-secrets-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/multipod-latest/results/deployments-apps-v1/orchestration-worker.yaml b/components/operator/internal/controllers/stack/testdata/multipod-latest/results/deployments-apps-v1/orchestration-worker.yaml index c93ef34ba7..f7882dfa42 100644 --- a/components/operator/internal/controllers/stack/testdata/multipod-latest/results/deployments-apps-v1/orchestration-worker.yaml +++ b/components/operator/internal/controllers/stack/testdata/multipod-latest/results/deployments-apps-v1/orchestration-worker.yaml @@ -85,6 +85,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka1:1234 kafka2:1234 + - name: TOPICS + value: multipod-latest-ledger multipod-latest-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/configuration.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/configuration.yaml new file mode 100644 index 0000000000..37e2fd07da --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/configuration.yaml @@ -0,0 +1,72 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Configuration +metadata: + name: default +spec: + broker: + kafka: + brokers: + - kafka1:1234 + - kafka2:1234 + monitoring: + traces: + otlp: + endpoint: localhost + insecure: true + mode: grpc + port: 4317 + services: + auth: + postgres: + disableSSLMode: true + host: localhost + password: root + port: 5432 + username: root + control: {} + ledger: + postgres: + disableSSLMode: true + host: localhost + password: root + port: 5432 + username: root + orchestration: + postgres: + disableSSLMode: true + host: localhost + password: root + port: 5432 + username: root + payments: + encryptionKey: + postgres: + disableSSLMode: true + host: localhost + password: root + port: 5432 + username: root + search: + batching: + count: + period: + elasticSearch: + host: elasticsearch + pathPrefix: '' + port: 9200 + scheme: http + stargate: + wallets: + webhooks: + postgres: + disableSSLMode: true + host: localhost + password: root + port: 5432 + username: root + temporal: + address: + namespace: + tls: + crt: + key: diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/auth-config.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/auth-config.yaml new file mode 100644 index 0000000000..042bae1285 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/auth-config.yaml @@ -0,0 +1,42 @@ +apiVersion: v1 +data: + config.yaml: | + clients: + - public: false + description: null + redirectUris: + - http://example.net/auth/login + PostLogoutRedirectUris: + - http://example.net/auth/destroy + scopes: + - openid + - profile + - email + - offline + id: control + secrets: + - mocked-secret + - public: false + description: null + redirectUris: [] + PostLogoutRedirectUris: [] + scopes: + - openid + id: orchestration + secrets: + - mocked-secret + - public: false + description: null + redirectUris: [] + PostLogoutRedirectUris: [] + scopes: + - openid + id: wallets + secrets: + - mocked-secret +kind: ConfigMap +metadata: + labels: + stack: "true" + name: auth-config + namespace: multipod-orchestration-v0-2-0 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/gateway-config.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/gateway-config.yaml new file mode 100644 index 0000000000..4d6ac3be3c --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/gateway-config.yaml @@ -0,0 +1,259 @@ +apiVersion: v1 +data: + Caddyfile: |- + (cors) { + header { + Access-Control-Allow-Methods "GET,OPTIONS,PUT,POST,DELETE,HEAD,PATCH" + Access-Control-Allow-Headers content-type + Access-Control-Max-Age 100 + Access-Control-Allow-Origin * + } + } + + (auth) { + auth { + issuer http://example.net/api/auth + + read_key_set_max_retries 10 + } + } + + { + + # Many directives manipulate the HTTP handler chain and the order in which + # those directives are evaluated matters. So the jwtauth directive must be + # ordered. + # c.f. https://caddyserver.com/docs/caddyfile/directives#directive-order + order auth before basicauth + order versions after metrics + } + + :8000 { + tracing { + span gateway + } + log { + output stdout + } + + @authmatcher { + path /api/auth* + } + handle @authmatcher { + uri strip_prefix /api/auth + reverse_proxy auth:8080 + + import cors + } + + @ledgermatcher { + path /api/ledger* + } + handle @ledgermatcher { + uri strip_prefix /api/ledger + reverse_proxy ledger:8080 + + import cors + import auth + } + + @orchestrationmatcher { + path /api/orchestration* + } + handle @orchestrationmatcher { + uri strip_prefix /api/orchestration + reverse_proxy orchestration:8080 + + import cors + import auth + } + @paymentsmatcher { + path /api/payments/payments* + method POST GET PATCH + } + handle @paymentsmatcher { + uri strip_prefix /api/payments + reverse_proxy payments-api:8080 + import cors + import auth + } + @matcher { + path /api/payments/pools* + method POST GET DELETE + } + handle @matcher { + uri strip_prefix /api/payments + reverse_proxy payments-api:8080 + import cors + import auth + } + @accountsmatcher { + path /api/payments/accounts* + method GET + } + handle @accountsmatcher { + uri strip_prefix /api/payments + reverse_proxy payments-api:8080 + import cors + import auth + } + @bank-accounts-readmatcher { + path /api/payments/bank-accounts* + method GET + } + handle @bank-accounts-readmatcher { + uri strip_prefix /api/payments + reverse_proxy payments-api:8080 + import cors + import auth + } + @transfer-initiations-readmatcher { + path /api/payments/transfer-initiations* + method GET + } + handle @transfer-initiations-readmatcher { + uri strip_prefix /api/payments + reverse_proxy payments-api:8080 + import cors + import auth + } + + @payments-apimatcher { + path /api/payments* + } + handle @payments-apimatcher { + uri strip_prefix /api/payments + reverse_proxy payments-api:8080 + + import cors + import auth + } + @connectorsmatcher { + path /api/payments/connectors* + } + handle @connectorsmatcher { + uri strip_prefix /api/payments + reverse_proxy payments-connectors:8080 + import cors + import auth + } + @configsmatcher { + path /api/payments/configs* + } + handle @configsmatcher { + uri strip_prefix /api/payments + reverse_proxy payments-connectors:8080 + import cors + import auth + } + @transfer-initiations-writematcher { + path /api/payments/transfer-initiations* + method POST DELETE + } + handle @transfer-initiations-writematcher { + uri strip_prefix /api/payments + reverse_proxy payments-connectors:8080 + import cors + import auth + } + @bank-accounts-writematcher { + path /api/payments/bank-accounts* + method POST + } + handle @bank-accounts-writematcher { + uri strip_prefix /api/payments + reverse_proxy payments-connectors:8080 + import cors + import auth + } + + @payments-connectorsmatcher { + path /api/payments* + } + handle @payments-connectorsmatcher { + uri strip_prefix /api/payments + reverse_proxy payments-connectors:8080 + + import cors + import auth + } + + @searchmatcher { + path /api/search* + } + handle @searchmatcher { + uri strip_prefix /api/search + reverse_proxy search:8080 + + import cors + import auth + } + + @search-benthosmatcher { + path /api/search-benthos* + } + handle @search-benthosmatcher { + uri strip_prefix /api/search-benthos + reverse_proxy search-benthos:4195 + + import cors + import auth + } + + @walletsmatcher { + path /api/wallets* + } + handle @walletsmatcher { + uri strip_prefix /api/wallets + reverse_proxy wallets:8080 + + import cors + import auth + } + + @webhooksmatcher { + path /api/webhooks* + } + handle @webhooksmatcher { + uri strip_prefix /api/webhooks + reverse_proxy webhooks:8080 + + import cors + import auth + } + + handle /versions { + versions { + region "us-west-1" + env "staging" + endpoints { + auth http://auth:8080/_info http://auth:8080/_healthcheck + ledger http://ledger:8080/_info http://ledger:8080/_healthcheck + orchestration http://orchestration:8080/_info http://orchestration:8080/_healthcheck + payments-api http://payments-api:8080/_info http://payments-api:8080/_health + payments-connectors http://payments-connectors:8080/_info http://payments-connectors:8080/_health + search http://search:8080/_info http://search:8080/_healthcheck + wallets http://wallets:8080/_info http://wallets:8080/_healthcheck + webhooks http://webhooks:8080/_info http://webhooks:8080/_healthcheck + } + } + } + + # Respond 502 if service does not exists + handle /api/* { + respond "Bad Gateway" 502 + } + + # handle all other requests + handle { + reverse_proxy control:3000 + import cors + } + + } +kind: ConfigMap +metadata: + labels: + stack: "true" + name: gateway-config + namespace: multipod-orchestration-v0-2-0 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-global.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-global.yaml new file mode 100644 index 0000000000..099df1a773 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-global.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +data: + config.yaml: | + --- + tracer: + open_telemetry_collector: + tags: + service.name: search-ingester + service.version: latest + grpc: + - url: ${OTEL_TRACES_EXPORTER_OTLP_ENDPOINT} + # a useless comment +kind: ConfigMap +metadata: + labels: + stack: "true" + name: search-benthos-global + namespace: multipod-orchestration-v0-2-0 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-resources.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-resources.yaml new file mode 100644 index 0000000000..d146d81ce3 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-resources.yaml @@ -0,0 +1,50 @@ +apiVersion: v1 +data: + output_elasticsearch.yaml: |- + output_resources: + - label: elasticsearch + processors: + - mapping: | + root = match { + this.action == "update" => if this.exists("upsert") { this.merge({ + "upsert": { + "stack": env("STACK") + } + }) } else { this }, + _ => this.merge({ + "document": { + "stack": env("STACK") + } + }) + } + root.id = "%s-%s".format(env("STACK"), this.id) + - log: + message: "Will write: ${! this }" + elasticsearch: + urls: + - ${OPENSEARCH_URL} + id: ${! json().id } + sniff: false + healthcheck: false + index: ${OPENSEARCH_INDEX} + action: ${! json().action } + tls: + enabled: true + skip_cert_verify: true + basic_auth: + enabled: ${BASIC_AUTH_ENABLED} + username: ${BASIC_AUTH_USERNAME} + password: ${BASIC_AUTH_PASSWORD} + batching: + count: ${OPENSEARCH_BATCHING_COUNT:10} + period: ${OPENSEARCH_BATCHING_PERIOD:1s} + multipart: true + doc: ${! if json().exists("document") { json("document") } else {""} } + script: ${! if json().exists("script") { json("script") } else {""} } + upsert: ${! if json().exists("upsert") { json("upsert") } else {""} } +kind: ConfigMap +metadata: + labels: + stack: "true" + name: search-benthos-resources + namespace: multipod-orchestration-v0-2-0 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-streams.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-streams.yaml new file mode 100644 index 0000000000..ce5f2f7b33 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-streams.yaml @@ -0,0 +1,344 @@ +apiVersion: v1 +data: + ledger_ingestion.yaml: "input:\n event_bus:\n topic: ledger\n consumer_group: search\n\npipeline:\n processors:\n - log:\n message: \"receive message: ${! this }\"\n - switch_event_type:\n events:\n - label: COMMITTED_TRANSACTIONS\n processors:\n - bloblang: |\n \n map amount {\n root = [this.amount]\n let hasDecimals = this.asset.split(\"/\").length() > 1\n let decimals = if $hasDecimals { this.asset.split(\"/\").index(1).number() } else { 0 }\n root = if $decimals > 0 {\n root.append(\n this.amount / range(0, $decimals).fold(1, t -> t.tally * 10) # Just a pow...\n )\n }\n root = root.flatten()\n }\n \n map tx {\n root = {\n \"action\": \"index\",\n \"id\": \"TRANSACTION-%s-%s\".format(this.ledger, this.transaction.id),\n \"document\": {\n \"data\": {\n \"postings\": this.transaction.postings,\n \"reference\": this.transaction.reference,\n \"txid\": this.transaction.id,\n \"timestamp\": this.transaction.timestamp,\n \"metadata\": if this.transaction.metadata { this.transaction.metadata } else {{}}\n },\n \"indexed\": {\n \"reference\": this.transaction.reference,\n \"txid\": this.transaction.id,\n \"timestamp\": this.transaction.timestamp,\n \"asset\": this.transaction.postings.map_each(p -> p.asset),\n \"source\": this.transaction.postings.map_each(p -> p.source),\n \"destination\": this.transaction.postings.map_each(p -> p.destination),\n \"amount\": this.transaction.postings.map_each(p -> p.apply(\"amount\"))\n },\n \"kind\": \"TRANSACTION\"\n }\n }\n }\n \n map account {\n root = {\n \"action\": \"upsert\",\n \"id\": \"ACCOUNT-%s-%s\".format(this.ledger, this.account),\n \"document\": {\n \"data\": { \n \"address\": this.account,\n \"metadata\": {}\n },\n \"indexed\": { \n \"address\": this.account\n },\n \"kind\": \"ACCOUNT\"\n }\n }\n }\n \n root = []\n root = root.append(\n this.payload.transactions.map_each(transaction -> {\n \"transaction\": transaction,\n \"ledger\": this.payload.ledger\n }.apply(\"tx\"))\n )\n root = root.append(\n this.payload.transactions.\n map_each(transaction -> transaction.postings.map_each(posting -> [\n posting.source,\n posting.destination\n ]).\n flatten().\n map_each(account -> {\n \"account\": account,\n \"ledger\": this.payload.ledger\n }.apply(\"account\"))\n ).\n flatten()\n )\n root = root.append(\n this.payload.accountMetadata.map_each(item -> item.value.map_each(metadata -> {\n \"script\": \"ctx._source.data.metadata[\\\"\" + metadata.key + \"\\\"]=\\\"\" + metadata.value + \"\\\"\",\n \"action\": \"update\",\n \"id\": \"ACCOUNT-%s-%s\".format(this.payload.ledger, item.key),\n \"upsert\": {\n \"data\": { \n \"address\": item.key,\n \"metadata\": { metadata.key: metadata.value }\n },\n \"indexed\": { \n \"address\": item.key\n },\n \"kind\": \"ACCOUNT\"\n }\n }).values()).values().flatten()\n )\n root = root.flatten()\n \n let overlay = {\n \"data\": {\n \"ledger\": this.payload.ledger\n },\n \"indexed\": {\n \"ledger\": this.payload.ledger \n }\n }\n \n root = root.map_each(cmd -> match cmd.action {\n cmd.action == \"update\" => if cmd.exists(\"upsert\") { cmd.merge({\n \"upsert\": $overlay\n }) } else { cmd },\n _ => cmd.merge({\n \"document\": $overlay\n }) \n })\n - log:\n message: \"Computed: ${! this }\"\n - unarchive:\n format: json_array\n - label: SAVED_METADATA\n processors:\n - bloblang: |\n root = this.payload.metadata.map_each(item -> {\n \"script\": \"ctx._source.data.metadata[\\\"\" + item.key + \"\\\"]=\\\"\" + item.value + \"\\\"\",\n \"action\": \"update\",\n \"id\": \"%s-%s-%s\".format(this.payload.targetType, this.payload.ledger, this.payload.targetId),\n \"upsert\": {\n \"data\": { \n \"address\": this.payload.targetId,\n \"metadata\": { item.key: item.value },\n \"ledger\": this.payload.ledger\n },\n \"indexed\": { \n \"address\": this.payload.targetId,\n \"ledger\": this.payload.ledger\n },\n \"kind\": \"ACCOUNT\"\n }\n }).values()\n - unarchive:\n format: json_array\n - label: DELETED_METADATA\n processors:\n - bloblang: |\n root = {\n \"script\": \"ctx._source.data.metadata.remove(\\\"\" + this.payload.key + \"\\\")\",\n \"action\": \"update\",\n \"id\": \"%s-%s-%s\".format(this.payload.targetType, this.payload.ledger, this.payload.targetId)\n }\n\noutput:\n resource: elasticsearch\n" + ledger_reindex.yaml: | + input: + http_server: + path: / + + output: + broker: + outputs: + - http_client: + verb: POST + url: http://localhost:4195/ledger_reindex_transactions + - http_client: + verb: POST + url: http://localhost:4195/ledger_reindex_accounts + ledger_reindex_accounts.yaml: "input:\n http_server:\n path: /\n\npipeline:\n processors:\n - bloblang: |\n meta ledger = this.ledger\n - postgres_query:\n service: ledger\n query: |\n select address, metadata\n from \"${! meta(\"ledger\") }\".accounts\n - unarchive:\n format: json_array\n - bloblang: |\n root = this.assign({\n \"metadata\": this.metadata.parse_json()\n })\n - bloblang: |\n root = {\n \"document\": {\n \"data\": { \n \"address\": this.address,\n \"ledger\": meta(\"ledger\"),\n \"metadata\": this.metadata\n },\n \"indexed\": {\n \"address\": this.address,\n \"ledger\": meta(\"ledger\")\n },\n \"kind\": \"ACCOUNT\",\n \"ledger\": meta(\"ledger\")\n },\n \"id\": \"ACCOUNT-%s-%s\".format(meta(\"ledger\"), this.address),\n \"action\": \"upsert\"\n }\n\noutput:\n resource: elasticsearch\n" + ledger_reindex_all.yaml: | + input: + http_server: + path: / + + pipeline: + processors: + - postgres_query: + service: ledger + query: 'select * from "_system".ledgers' + - unarchive: + format: json_array + - log: + message: "Process ledger: ${! this.ledger }" + + output: + broker: + outputs: + - http_client: + verb: POST + url: http://localhost:4195/ledger_reindex + ledger_reindex_transactions.yaml: | + input: + http_server: + path: / + + pipeline: + processors: + - bloblang: | + meta ledger = this.ledger + - postgres_query: + service: ledger + query: | + select id::varchar as id, timestamp, reference, metadata, postings + from "${! meta("ledger") }".transactions; + - unarchive: + format: json_array + - bloblang: | + root = this.assign({ + "postings": this.postings.parse_json(), + "metadata": this.metadata.parse_json() + }) + - bloblang: | + root = { + "id": "TRANSACTION-%s-%s".format(meta("ledger"), this.id), + "action": "upsert", + "document": { + "data": { + "postings": this.postings, + "reference": this.reference, + "txid": this.id, + "timestamp": this.timestamp, + "metadata": if this.metadata { this.metadata } else {{}}, + "ledger": meta("ledger") + }, + "indexed": { + "reference": this.reference, + "txid": this.id, + "timestamp": this.timestamp, + "asset": this.postings.map_each(p -> p.asset), + "source": this.postings.map_each(p -> p.source), + "destination": this.postings.map_each(p -> p.destination), + "amount": this.postings.map_each(p -> if p.asset.contains("/") { + [ + p.amount, + p.amount / range(0, p.asset.split("/").index(1).number()).fold(1, t -> t.tally * 10) # amount / pow(10, decimal part of asset) + ] + } else { [ p.amount ] }).flatten().map_each(v -> "%v".format(v)), + "ledger": meta("ledger") + }, + "kind": "TRANSACTION", + "ledger": meta("ledger") + } + } + + output: + resource: elasticsearch + payments_deletion.yaml: | + input: + event_bus: + topic: payments + consumer_group: search-payments-resets + + pipeline: + processors: + - switch_event_type: + events: + - label: CONNECTOR_RESET + processors: + - bloblang: | + root = { + "query": { + "bool": { + "must": [ + { + "bool": { + "should": [ + { + "match": { + "kind": "PAYMENT" + } + }, + { + "match": { + "kind": "PAYMENT_ACCOUNT" + } + }, + { + "match": { + "kind": "PAYMENT_BALANCE" + } + }, + { + "match": { + "kind": "PAYMENT_BANK_ACCOUNT" + } + }, + { + "match": { + "kind": "PAYMENT_TRANSFER_INITIATION" + } + } + ] + } + }, + { + "match": { + "indexed.connectorId": this.payload.connectorId + } + }, + { + "match": { + "stack": env("STACK") + } + } + ] + } + } + } + + - label: DELETED_TRANSFER_INITIATION + processors: + - bloblang: | + root = { + "query": { + "bool": { + "must": [ + { + "match": { + "kind": "PAYMENT_TRANSFER_INITIATION" + } + }, + { + "should": [ + { + "match": { + "indexed.id": this.payload.id + } + }, + { + "match": { + "indexed.provider": this.payload.provider + } + } + ] + }, + { + "match": { + "stack": env("STACK") + } + } + ] + } + } + } + + output: + http_client: + url: ${OPENSEARCH_URL}/${OPENSEARCH_INDEX}/_delete_by_query + verb: POST + headers: + Content-Type: application/json + basic_auth: + enabled: ${BASIC_AUTH_ENABLED} + username: ${BASIC_AUTH_USERNAME} + password: ${BASIC_AUTH_PASSWORD} + payments_ingestion.yaml: | + input: + event_bus: + topic: payments + consumer_group: search + + pipeline: + processors: + - switch_event_type: + events: + - label: SAVED_PAYMENT + processors: + - bloblang: | + root = { + "document": { + "data": this.payload, + "indexed": { + "id": this.payload.id, + "reference": this.payload.reference, + "provider": this.payload.provider, + "createdAt": this.payload.createdAt, + "connectorId": this.payload.connectorId, + "type": this.payload.type, + "status": this.payload.status, + "scheme": this.payload.scheme, + "asset": this.payload.asset, + "initialAmount": this.payload.initialAmount + }, + "kind": "PAYMENT", + "when": this.date + }, + "action": "index", + "id": "PAYMENT-%s".format(this.payload.id) + } + - label: SAVED_ACCOUNT + processors: + - bloblang: | + root = { + "document": { + "data": this.payload, + "indexed": { + "id": this.payload.id, + "provider": this.payload.provider, + "createdAt": this.payload.createdAt, + "reference": this.payload.reference, + "connectorId": this.payload.connectorId, + "defaultAsset": this.payload.defaultAsset, + "accountName": this.payload.accountName, + "type": this.payload.type + }, + "kind": "PAYMENT_ACCOUNT", + "when": this.date + }, + "action": "index", + "id": "PAYMENT-ACCOUNT-%s".format(this.payload.id) + } + - label: SAVED_BALANCE + processors: + - bloblang: | + root = { + "document": { + "data": this.payload, + "indexed": { + "accountId": this.payload.accountID, + "provider": this.payload.provider, + "connectorId": this.payload.connectorId, + "createdAt": this.payload.createdAt, + "asset": this.payload.asset, + "balance": this.payload.balance + }, + "kind": "PAYMENT_BALANCE", + "when": this.date + }, + "action": "index", + "id": "PAYMENT-BALANCE-%s-%s".format(this.payload.accountId, this.payload.asset) + } + - label: SAVED_BANK_ACCOUNT + processors: + - bloblang: | + root = { + "document": { + "data": this.payload, + "indexed": { + "id": this.payload.id, + "createdAt": this.payload.createdAt, + "connectorId": this.payload.connectorId, + "provider": this.payload.provider, + "name": this.payload.name, + "accountNumber": this.payload.accountNumber, + "iban": this.payload.iban, + "swiftBicCode": this.payload.swiftBicCode, + "country": this.payload.country, + "provider": this.payload.provider, + "accountId": this.payload.accountID + }, + "kind": "PAYMENT_BANK_ACCOUNT", + "when": this.date + }, + "action": "index", + "id": "PAYMENT-BANK-ACCOUNT-%s".format(this.payload.id) + } + - label: SAVED_TRANSFER_INITIATION + processors: + - bloblang: | + root = { + "document": { + "data": this.payload, + "indexed": { + "id": this.payload.id, + "createdAt": this.payload.createdAt, + "scheduledAt": this.payload.scheduledAt, + "updatedAt": this.payload.updatedAt, + "connectorId": this.payload.connectorId, + "description": this.payload.description, + "type": this.payload.type, + "provider": this.payload.provider, + "sourceAccountId": this.payload.sourceAccountID, + "destinationAccountId": this.payload.destinationAccountID, + "amount": this.payload.amount, + "asset": this.payload.asset, + "attempts": this.payload.attempts, + "status": this.payload.status, + "error": this.payload.error, + "relatedPayment": this.payload.relatedPayment + }, + "kind": "PAYMENT_TRANSFER_INITIATION", + "when": this.date + }, + "action": "index", + "id": "PAYMENT-TRANSFER-INITIATION-%s".format(this.payload.id) + } + + output: + resource: elasticsearch +kind: ConfigMap +metadata: + labels: + stack: "true" + name: search-benthos-streams + namespace: multipod-orchestration-v0-2-0 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-templates.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-templates.yaml new file mode 100644 index 0000000000..4ca9295cfc --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/configmaps--v1/search-benthos-templates.yaml @@ -0,0 +1,90 @@ +apiVersion: v1 +data: + event_bus.yaml: | + name: event_bus + type: input + + fields: + - name: topic + type: string + - name: consumer_group + type: string + + mapping: | + root = if env("BROKER") == "kafka" {{ + "kafka": { + "addresses": [ env("KAFKA_ADDRESS") ], + "topics": [ env("TOPIC_PREFIX") + this.topic ], + "target_version": env("KAFKA_VERSION"), + "consumer_group": this.consumer_group, + "checkpoint_limit": 1024, + "sasl": { + "mechanism": env("KAFKA_SASL_MECHANISM"), + "password": env("KAFKA_SASL_PASSWORD"), + "user": env("KAFKA_SASL_USERNAME") + }, + "tls": { + "enabled": env("KAFKA_TLS_ENABLED") == "true" + }, + "extract_tracing_map": "root = meta()" + } + }} else {{ + "nats_jetstream": { + "urls": [env("NATS_URL")], + "queue": this.consumer_group, + "subject": env("TOPIC_PREFIX") + this.topic, + "durable": this.consumer_group + } + }} + postgres_query.yaml: | + name: postgres_query + type: processor + + fields: + - name: query + type: string + - name: service + type: string + + mapping: | + root = { + "sql_raw": { + "dsn": env("%s_POSTGRES_URI".format(this.service.uppercase())), + "driver": "postgres", + "query": this.query, + "unsafe_dynamic_query": true + } + } + switch_event_type.yaml: | + name: switch_event_type + type: processor + + fields: + - kind: list + type: unknown + name: events + + mapping: | + root = { + "switch": this.events.map_each(eventDefinition -> { + "check": "this.type == \"%s\"".format(eventDefinition.label), + "processors": eventDefinition.processors + }).append({ + "processors": [ + { + "log": { + "message": "unable to handle message ${! content() }" + } + }, + { + "bloblang": "root = deleted()" + } + ] + }) + } +kind: ConfigMap +metadata: + labels: + stack: "true" + name: search-benthos-templates + namespace: multipod-orchestration-v0-2-0 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/cronjobs-batch-v1/reindex-ledger.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/cronjobs-batch-v1/reindex-ledger.yaml new file mode 100644 index 0000000000..8ae38ab8de --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/cronjobs-batch-v1/reindex-ledger.yaml @@ -0,0 +1,39 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + generation: 1 + labels: + stack: "true" + name: reindex-ledger + namespace: multipod-orchestration-v0-2-0 +spec: + concurrencyPolicy: Allow + failedJobsHistoryLimit: 1 + jobTemplate: + metadata: + creationTimestamp: null + spec: + template: + metadata: + creationTimestamp: null + spec: + containers: + - command: + - sh + - -c + - "/bin/sh <<'EOF'\n\n\t\t\n\t\t\t\t\tcurl http://search-benthos.multipod-orchestration-v0-2-0.svc.cluster.local:4195/ledger_reindex_all -X POST -H 'Content-Type: application/json' -d '{}'\n \t\t\t\t\t\t \nEOF" + image: curlimages/curl:8.2.1 + imagePullPolicy: IfNotPresent + name: reindex-ledger + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Never + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 + schedule: '* * * * *' + successfulJobsHistoryLimit: 3 + suspend: true +status: {} diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/auth.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/auth.yaml new file mode 100644 index 0000000000..6573ddf607 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/auth.yaml @@ -0,0 +1,132 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: auth + formance.com/monopod: "false" + stack: "true" + name: auth + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: auth + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: 7dwr9TSCRLxhAFSJuusb42WLDizNvny_FgLhRkc6ysw= + creationTimestamp: null + labels: + app.kubernetes.io/name: auth + spec: + containers: + - args: + - serve + env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-auth + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: LISTEN + value: :8080 + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: auth + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: CONFIG + value: /config/config/config.yaml + - name: DELEGATED_CLIENT_SECRET + - name: DELEGATED_CLIENT_ID + - name: DELEGATED_ISSUER + - name: BASE_URL + value: http://example.net/api/auth + - name: SIGNING_KEY + valueFrom: + secretKeyRef: + key: signingKey + name: auth-secret + image: ghcr.io/formancehq/auth:latest + imagePullPolicy: Always + livenessProbe: + failureThreshold: 20 + httpGet: + path: /_healthcheck + port: 8080 + scheme: HTTP + initialDelaySeconds: 1 + periodSeconds: 2 + successThreshold: 1 + timeoutSeconds: 30 + name: auth + ports: + - containerPort: 8080 + name: http + protocol: TCP + resources: + requests: + cpu: 100m + memory: 50Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /config/config + name: config + readOnly: true + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 + volumes: + - configMap: + defaultMode: 420 + name: auth-config + name: config +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/control.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/control.yaml new file mode 100644 index 0000000000..eca9c9ca30 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/control.yaml @@ -0,0 +1,97 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: control + formance.com/monopod: "false" + stack: "true" + name: control + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: control + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: 47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU= + creationTimestamp: null + labels: + app.kubernetes.io/name: control + spec: + containers: + - env: + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: control + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: API_URL + value: http://example.net + - name: ENCRYPTION_KEY + value: 9h44y2ZqrDuUy5R9NGLA9hca7uRUr932 + - name: ENCRYPTION_IV + value: b6747T6eP9DnMvEw + - name: CLIENT_ID + value: control + - name: CLIENT_SECRET + value: mocked-secret + - name: REDIRECT_URI + value: http://example.net + - name: UNSECURE_COOKIES + value: "false" + image: ghcr.io/formancehq/control:latest + imagePullPolicy: Always + name: control + ports: + - containerPort: 3000 + name: http + protocol: TCP + resources: + requests: + cpu: 100m + memory: 512Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/gateway.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/gateway.yaml new file mode 100644 index 0000000000..23eedbe74a --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/gateway.yaml @@ -0,0 +1,106 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: gateway + formance.com/monopod: "false" + stack: "true" + name: gateway + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: gateway + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: cx7_UJD52WL5PAAkZPcjBRZNF-jE9VvkkI3lLsMOJho= + creationTimestamp: null + labels: + app.kubernetes.io/name: gateway + spec: + containers: + - args: + - run + - --config + - /config/config/Caddyfile + - --adapter + - caddyfile + command: + - /usr/bin/caddy + env: + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: gateway + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka1:1234 kafka2:1234 + image: ghcr.io/formancehq/gateway:latest + imagePullPolicy: Always + name: gateway + ports: + - containerPort: 8000 + name: http + protocol: TCP + resources: + requests: + cpu: 100m + memory: 50Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /config/config + name: config + readOnly: true + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 + volumes: + - configMap: + defaultMode: 420 + name: gateway-config + name: config +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/ledger.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/ledger.yaml new file mode 100644 index 0000000000..2fc2bf9cc8 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/ledger.yaml @@ -0,0 +1,121 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: ledger + formance.com/monopod: "false" + stack: "true" + name: ledger + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: ledger + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: 47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU= + creationTimestamp: null + labels: + app.kubernetes.io/name: ledger + spec: + containers: + - env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-ledger + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: BIND + value: :8080 + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: ledger + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: STORAGE_DRIVER + value: postgres + - name: PUBLISHER_TOPIC_MAPPING + value: '*:multipod-orchestration-v0-2-0-ledger' + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka1:1234 kafka2:1234 + - name: STORAGE_POSTGRES_CONN_STRING + value: $(POSTGRES_URI) + image: ghcr.io/formancehq/ledger:latest + imagePullPolicy: Always + livenessProbe: + failureThreshold: 20 + httpGet: + path: /_healthcheck + port: 8080 + scheme: HTTP + initialDelaySeconds: 1 + periodSeconds: 2 + successThreshold: 1 + timeoutSeconds: 30 + name: ledger + ports: + - containerPort: 8080 + name: http + protocol: TCP + resources: + requests: + cpu: 100m + memory: 50Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/orchestration-worker.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/orchestration-worker.yaml new file mode 100644 index 0000000000..27bbc4fcbd --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/orchestration-worker.yaml @@ -0,0 +1,115 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: orchestration + formance.com/monopod: "false" + stack: "true" + name: orchestration-worker + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: orchestration-worker + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: 47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU= + creationTimestamp: null + labels: + app.kubernetes.io/name: orchestration-worker + spec: + containers: + - args: + - worker + env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-orchestration + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: orchestration-worker + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: POSTGRES_DSN + value: $(POSTGRES_URI) + - name: TEMPORAL_TASK_QUEUE + value: multipod-orchestration-v0-2-0 + - name: TEMPORAL_ADDRESS + - name: TEMPORAL_NAMESPACE + - name: STACK_CLIENT_ID + value: orchestration + - name: STACK_CLIENT_SECRET + value: mocked-secret + - name: TEMPORAL_SSL_CLIENT_KEY + - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka1:1234 kafka2:1234 + - name: TOPICS + value: multipod-orchestration-v0-2-0-ledger multipod-orchestration-v0-2-0-payments + image: ghcr.io/formancehq/orchestration:v0.2.0 + imagePullPolicy: IfNotPresent + name: orchestration-worker + resources: + requests: + cpu: 100m + memory: 50Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/orchestration.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/orchestration.yaml new file mode 100644 index 0000000000..2498f96848 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/orchestration.yaml @@ -0,0 +1,119 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: orchestration + formance.com/monopod: "false" + stack: "true" + name: orchestration + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: orchestration + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: 47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU= + creationTimestamp: null + labels: + app.kubernetes.io/name: orchestration + spec: + containers: + - env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-orchestration + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: orchestration + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: POSTGRES_DSN + value: $(POSTGRES_URI) + - name: TEMPORAL_TASK_QUEUE + value: multipod-orchestration-v0-2-0 + - name: TEMPORAL_ADDRESS + - name: TEMPORAL_NAMESPACE + - name: STACK_CLIENT_ID + value: orchestration + - name: STACK_CLIENT_SECRET + value: mocked-secret + - name: TEMPORAL_SSL_CLIENT_KEY + - name: TEMPORAL_SSL_CLIENT_CERT + image: ghcr.io/formancehq/orchestration:v0.2.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 20 + httpGet: + path: /_healthcheck + port: 8080 + scheme: HTTP + initialDelaySeconds: 1 + periodSeconds: 2 + successThreshold: 1 + timeoutSeconds: 30 + name: orchestration + ports: + - containerPort: 8080 + name: http + protocol: TCP + resources: + requests: + cpu: 100m + memory: 50Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/payments-api.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/payments-api.yaml new file mode 100644 index 0000000000..42fb809734 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/payments-api.yaml @@ -0,0 +1,123 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: payments + formance.com/monopod: "false" + stack: "true" + name: payments-api + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: payments-api + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: 47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU= + creationTimestamp: null + labels: + app.kubernetes.io/name: payments-api + spec: + containers: + - args: + - api + - serve + env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-payments + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: LISTEN + value: :8080 + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: payments-api + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka1:1234 kafka2:1234 + - name: POSTGRES_DATABASE_NAME + value: $(POSTGRES_DATABASE) + - name: CONFIG_ENCRYPTION_KEY + - name: PUBLISHER_TOPIC_MAPPING + value: '*:multipod-orchestration-v0-2-0-payments' + image: ghcr.io/formancehq/payments:latest + imagePullPolicy: Always + livenessProbe: + failureThreshold: 20 + httpGet: + path: /_health + port: 8080 + scheme: HTTP + initialDelaySeconds: 1 + periodSeconds: 2 + successThreshold: 1 + timeoutSeconds: 30 + name: payments-api + ports: + - containerPort: 8080 + name: http + protocol: TCP + resources: + requests: + cpu: 100m + memory: 50Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/payments-connectors.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/payments-connectors.yaml new file mode 100644 index 0000000000..b29e76212b --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/payments-connectors.yaml @@ -0,0 +1,123 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: payments + formance.com/monopod: "false" + stack: "true" + name: payments-connectors + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: payments-connectors + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: 47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU= + creationTimestamp: null + labels: + app.kubernetes.io/name: payments-connectors + spec: + containers: + - args: + - connectors + - serve + env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-payments + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: LISTEN + value: :8080 + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: payments-connectors + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka1:1234 kafka2:1234 + - name: POSTGRES_DATABASE_NAME + value: $(POSTGRES_DATABASE) + - name: CONFIG_ENCRYPTION_KEY + - name: PUBLISHER_TOPIC_MAPPING + value: '*:multipod-orchestration-v0-2-0-payments' + image: ghcr.io/formancehq/payments:latest + imagePullPolicy: Always + livenessProbe: + failureThreshold: 20 + httpGet: + path: /_health + port: 8080 + scheme: HTTP + initialDelaySeconds: 1 + periodSeconds: 2 + successThreshold: 1 + timeoutSeconds: 30 + name: payments-connectors + ports: + - containerPort: 8080 + name: http + protocol: TCP + resources: + requests: + cpu: 100m + memory: 50Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/search-benthos.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/search-benthos.yaml new file mode 100644 index 0000000000..424b46bd4d --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/search-benthos.yaml @@ -0,0 +1,155 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: search + formance.com/monopod: "false" + stack: "true" + name: search-benthos + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: search-benthos + strategy: + type: Recreate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: XAoeNRyNlYPVHlXqJ9489fdaUDa9XjgtcUy5DM54PZc= + creationTimestamp: null + labels: + app.kubernetes.io/name: search-benthos + spec: + containers: + - command: + - /benthos + - -r + - /config/resources/*.yaml + - -t + - /config/templates/*.yaml + - -c + - /config/global/config.yaml + - --log.level + - trace + - streams + - /config/streams/*.yaml + env: + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: search-benthos + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: OPENSEARCH_URL + value: http://elasticsearch:9200 + - name: OPENSEARCH_BATCHING_COUNT + value: "0" + - name: OPENSEARCH_BATCHING_PERIOD + - name: TOPIC_PREFIX + value: multipod-orchestration-v0-2-0- + - name: OPENSEARCH_INDEX + value: stacks + - name: KAFKA_ADDRESS + value: kafka1:1234,kafka2:1234 + - name: BASIC_AUTH_ENABLED + value: "false" + - name: BASIC_AUTH_USERNAME + value: username + - name: BASIC_AUTH_PASSWORD + value: password + - name: LEDGER_POSTGRES_HOST + value: localhost + - name: LEDGER_POSTGRES_PORT + value: "5432" + - name: LEDGER_POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-ledger + - name: LEDGER_POSTGRES_USERNAME + value: root + - name: LEDGER_POSTGRES_PASSWORD + value: root + - name: LEDGER_POSTGRES_NO_DATABASE_URI + value: postgresql://$(LEDGER_POSTGRES_USERNAME):$(LEDGER_POSTGRES_PASSWORD)@$(LEDGER_POSTGRES_HOST):$(LEDGER_POSTGRES_PORT) + - name: LEDGER_POSTGRES_URI + value: $(LEDGER_POSTGRES_NO_DATABASE_URI)/$(LEDGER_POSTGRES_DATABASE)?sslmode=disable + - name: BROKER + value: kafka + image: public.ecr.aws/formance-internal/jeffail/benthos:v4.23.0-es + imagePullPolicy: IfNotPresent + name: search-benthos + ports: + - containerPort: 4195 + name: http + protocol: TCP + resources: + requests: + cpu: 100m + memory: 50Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /config/global + name: global + readOnly: true + - mountPath: /config/resources + name: resources + readOnly: true + - mountPath: /config/streams + name: streams + readOnly: true + - mountPath: /config/templates + name: templates + readOnly: true + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 + volumes: + - configMap: + defaultMode: 420 + name: search-benthos-global + name: global + - configMap: + defaultMode: 420 + name: search-benthos-resources + name: resources + - configMap: + defaultMode: 420 + name: search-benthos-streams + name: streams + - configMap: + defaultMode: 420 + name: search-benthos-templates + name: templates +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/search.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/search.yaml new file mode 100644 index 0000000000..1ddc69ea19 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/search.yaml @@ -0,0 +1,120 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: search + formance.com/monopod: "false" + stack: "true" + name: search + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: search + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: 47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU= + creationTimestamp: null + labels: + app.kubernetes.io/name: search + spec: + containers: + - env: + - name: BIND + value: :8080 + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: search + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: OPENSEARCH_URL + value: http://elasticsearch:9200 + - name: OPENSEARCH_BATCHING_COUNT + value: "0" + - name: OPENSEARCH_BATCHING_PERIOD + - name: TOPIC_PREFIX + value: multipod-orchestration-v0-2-0- + - name: OPENSEARCH_INDEX + value: stacks + - name: KAFKA_ADDRESS + value: kafka1:1234,kafka2:1234 + - name: BASIC_AUTH_ENABLED + value: "false" + - name: BASIC_AUTH_USERNAME + value: username + - name: BASIC_AUTH_PASSWORD + value: password + - name: OPEN_SEARCH_SERVICE + value: elasticsearch:9200 + - name: OPEN_SEARCH_SCHEME + value: http + - name: MAPPING_INIT_DISABLED + value: "true" + - name: ES_INDICES + value: stacks + image: ghcr.io/formancehq/search:latest + imagePullPolicy: Always + livenessProbe: + failureThreshold: 20 + httpGet: + path: /_healthcheck + port: 8080 + scheme: HTTP + initialDelaySeconds: 1 + periodSeconds: 2 + successThreshold: 1 + timeoutSeconds: 30 + name: search + ports: + - containerPort: 8080 + name: http + protocol: TCP + resources: + requests: + cpu: 100m + memory: 50Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/stargate.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/stargate.yaml new file mode 100644 index 0000000000..fbc2bae17e --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/stargate.yaml @@ -0,0 +1,105 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: stargate + formance.com/monopod: "false" + stack: "true" + name: stargate + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: stargate + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: 47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU= + creationTimestamp: null + labels: + app.kubernetes.io/name: stargate + spec: + containers: + - env: + - name: BIND + value: :8080 + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: stargate + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: ORGANIZATION_ID + value: multipod + - name: STACK_ID + value: orchestration + - name: STARGATE_SERVER_URL + - name: GATEWAY_URL + value: http://gateway:8000 + - name: STARGATE_AUTH_CLIENT_ID + - name: STARGATE_AUTH_CLIENT_SECRET + - name: STARGATE_AUTH_ISSUER_URL + image: ghcr.io/formancehq/stargate:latest + imagePullPolicy: Always + livenessProbe: + failureThreshold: 20 + httpGet: + path: /_healthcheck + port: 8080 + scheme: HTTP + initialDelaySeconds: 1 + periodSeconds: 2 + successThreshold: 1 + timeoutSeconds: 30 + name: stargate + ports: + - containerPort: 8080 + name: http + protocol: TCP + resources: + requests: + cpu: 100m + memory: 50Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/wallets.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/wallets.yaml new file mode 100644 index 0000000000..c395470b1d --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/wallets.yaml @@ -0,0 +1,101 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: wallets + formance.com/monopod: "false" + stack: "true" + name: wallets + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: wallets + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: 47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU= + creationTimestamp: null + labels: + app.kubernetes.io/name: wallets + spec: + containers: + - env: + - name: LISTEN + value: :8080 + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: wallets + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: STORAGE_POSTGRES_CONN_STRING + value: $(POSTGRES_URI) + - name: STACK_CLIENT_ID + value: wallets + - name: STACK_CLIENT_SECRET + value: mocked-secret + image: ghcr.io/formancehq/wallets:latest + imagePullPolicy: Always + livenessProbe: + failureThreshold: 20 + httpGet: + path: /_healthcheck + port: 8080 + scheme: HTTP + initialDelaySeconds: 1 + periodSeconds: 2 + successThreshold: 1 + timeoutSeconds: 30 + name: wallets + ports: + - containerPort: 8080 + name: http + protocol: TCP + resources: + requests: + cpu: 100m + memory: 50Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/webhooks-worker.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/webhooks-worker.yaml new file mode 100644 index 0000000000..2f32a78907 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/webhooks-worker.yaml @@ -0,0 +1,107 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: webhooks + formance.com/monopod: "false" + stack: "true" + name: webhooks-worker + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: webhooks-worker + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: 47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU= + creationTimestamp: null + labels: + app.kubernetes.io/name: webhooks-worker + spec: + containers: + - args: + - worker + env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-webhooks + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: LISTEN + value: :0 + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: webhooks-worker + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka1:1234 kafka2:1234 + - name: STORAGE_POSTGRES_CONN_STRING + value: $(POSTGRES_URI) + - name: KAFKA_TOPICS + value: multipod-orchestration-v0-2-0-ledger multipod-orchestration-v0-2-0-payments + image: ghcr.io/formancehq/webhooks:latest + imagePullPolicy: Always + name: webhooks-worker + resources: + requests: + cpu: 100m + memory: 50Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/webhooks.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/webhooks.yaml new file mode 100644 index 0000000000..dc9d7a39f2 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/deployments-apps-v1/webhooks.yaml @@ -0,0 +1,117 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app.kubernetes.io/name: webhooks + formance.com/monopod: "false" + stack: "true" + name: webhooks + namespace: multipod-orchestration-v0-2-0 +spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: webhooks + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + stack.formance.cloud/volumes-hash: 47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU= + creationTimestamp: null + labels: + app.kubernetes.io/name: webhooks + spec: + containers: + - env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-webhooks + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: LISTEN + value: :8080 + - name: OTEL_TRACES + value: "true" + - name: OTEL_TRACES_EXPORTER + value: otlp + - name: OTEL_TRACES_EXPORTER_OTLP_INSECURE + value: "true" + - name: OTEL_TRACES_EXPORTER_OTLP_MODE + value: grpc + - name: OTEL_TRACES_PORT + value: "4317" + - name: OTEL_TRACES_ENDPOINT + value: localhost + - name: OTEL_TRACES_EXPORTER_OTLP_ENDPOINT + value: $(OTEL_TRACES_ENDPOINT):$(OTEL_TRACES_PORT) + - name: OTEL_RESOURCE_ATTRIBUTES + - name: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://$(OTEL_TRACES_EXPORTER_OTLP_ENDPOINT) + - name: DEBUG + value: "false" + - name: DEV + value: "false" + - name: STACK_URL + value: http://example.net + - name: OTEL_SERVICE_NAME + value: webhooks + - name: STACK + value: multipod-orchestration-v0-2-0 + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka1:1234 kafka2:1234 + - name: STORAGE_POSTGRES_CONN_STRING + value: $(POSTGRES_URI) + image: ghcr.io/formancehq/webhooks:latest + imagePullPolicy: Always + livenessProbe: + failureThreshold: 20 + httpGet: + path: /_healthcheck + port: 8080 + scheme: HTTP + initialDelaySeconds: 1 + periodSeconds: 2 + successThreshold: 1 + timeoutSeconds: 30 + name: webhooks + ports: + - containerPort: 8080 + name: http + protocol: TCP + resources: + requests: + cpu: 100m + memory: 50Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + availableReplicas: 1 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/ingresses-networking.k8s.io-v1/gateway.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/ingresses-networking.k8s.io-v1/gateway.yaml new file mode 100644 index 0000000000..c7a2035d0b --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/ingresses-networking.k8s.io-v1/gateway.yaml @@ -0,0 +1,22 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + generation: 1 + labels: + stack: "true" + name: gateway + namespace: multipod-orchestration-v0-2-0 +spec: + rules: + - host: example.net + http: + paths: + - backend: + service: + name: gateway + port: + name: http + path: / + pathType: Prefix +status: + loadBalancer: {} diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/auth-create-database.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/auth-create-database.yaml new file mode 100644 index 0000000000..a5979d9ac4 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/auth-create-database.yaml @@ -0,0 +1,57 @@ +apiVersion: batch/v1 +kind: Job +metadata: + generation: 1 + labels: + stack: "true" + name: auth-create-database + namespace: multipod-orchestration-v0-2-0 +spec: + backoffLimit: 6 + completionMode: NonIndexed + completions: 1 + parallelism: 1 + selector: + matchLabels: {} + suspend: false + template: + metadata: + creationTimestamp: null + labels: + job-name: auth-create-database + spec: + containers: + - args: + - sh + - -c + - echo SELECT \'CREATE DATABASE \"${POSTGRES_DATABASE}\"\' WHERE NOT EXISTS \(SELECT FROM pg_database WHERE datname = \'${POSTGRES_DATABASE}\'\)\\gexec | psql -h ${POSTGRES_HOST} -p ${POSTGRES_PORT} -U ${POSTGRES_USERNAME} "sslmode=disable" + env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-auth + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: PGPASSWORD + value: $(POSTGRES_PASSWORD) + image: postgres:15-alpine + imagePullPolicy: IfNotPresent + name: create-database + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: OnFailure + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + succeeded: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/ledger--db-migration.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/ledger--db-migration.yaml new file mode 100644 index 0000000000..1aaff26ed2 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/ledger--db-migration.yaml @@ -0,0 +1,56 @@ +apiVersion: batch/v1 +kind: Job +metadata: + generation: 1 + labels: + stack: "true" + name: ledger--db-migration + namespace: multipod-orchestration-v0-2-0 +spec: + backoffLimit: 6 + completionMode: NonIndexed + completions: 1 + parallelism: 1 + selector: + matchLabels: {} + suspend: false + template: + metadata: + creationTimestamp: null + labels: + job-name: ledger--db-migration + spec: + containers: + - args: + - buckets + - upgrade-all + env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-ledger + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: STORAGE_POSTGRES_CONN_STRING + value: $(POSTGRES_URI) + image: ghcr.io/formancehq/ledger:latest + imagePullPolicy: Always + name: migrate + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: OnFailure + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + succeeded: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/ledger-create-database.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/ledger-create-database.yaml new file mode 100644 index 0000000000..83ca80601f --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/ledger-create-database.yaml @@ -0,0 +1,57 @@ +apiVersion: batch/v1 +kind: Job +metadata: + generation: 1 + labels: + stack: "true" + name: ledger-create-database + namespace: multipod-orchestration-v0-2-0 +spec: + backoffLimit: 6 + completionMode: NonIndexed + completions: 1 + parallelism: 1 + selector: + matchLabels: {} + suspend: false + template: + metadata: + creationTimestamp: null + labels: + job-name: ledger-create-database + spec: + containers: + - args: + - sh + - -c + - echo SELECT \'CREATE DATABASE \"${POSTGRES_DATABASE}\"\' WHERE NOT EXISTS \(SELECT FROM pg_database WHERE datname = \'${POSTGRES_DATABASE}\'\)\\gexec | psql -h ${POSTGRES_HOST} -p ${POSTGRES_PORT} -U ${POSTGRES_USERNAME} "sslmode=disable" + env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-ledger + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: PGPASSWORD + value: $(POSTGRES_PASSWORD) + image: postgres:15-alpine + imagePullPolicy: IfNotPresent + name: create-database + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: OnFailure + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + succeeded: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/orchestration-create-database.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/orchestration-create-database.yaml new file mode 100644 index 0000000000..ba4d997b82 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/orchestration-create-database.yaml @@ -0,0 +1,57 @@ +apiVersion: batch/v1 +kind: Job +metadata: + generation: 1 + labels: + stack: "true" + name: orchestration-create-database + namespace: multipod-orchestration-v0-2-0 +spec: + backoffLimit: 6 + completionMode: NonIndexed + completions: 1 + parallelism: 1 + selector: + matchLabels: {} + suspend: false + template: + metadata: + creationTimestamp: null + labels: + job-name: orchestration-create-database + spec: + containers: + - args: + - sh + - -c + - echo SELECT \'CREATE DATABASE \"${POSTGRES_DATABASE}\"\' WHERE NOT EXISTS \(SELECT FROM pg_database WHERE datname = \'${POSTGRES_DATABASE}\'\)\\gexec | psql -h ${POSTGRES_HOST} -p ${POSTGRES_PORT} -U ${POSTGRES_USERNAME} "sslmode=disable" + env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-orchestration + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: PGPASSWORD + value: $(POSTGRES_PASSWORD) + image: postgres:15-alpine + imagePullPolicy: IfNotPresent + name: create-database + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: OnFailure + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + succeeded: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/payments--db-migration.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/payments--db-migration.yaml new file mode 100644 index 0000000000..77f9aa96d2 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/payments--db-migration.yaml @@ -0,0 +1,54 @@ +apiVersion: batch/v1 +kind: Job +metadata: + generation: 1 + labels: + stack: "true" + name: payments--db-migration + namespace: multipod-orchestration-v0-2-0 +spec: + backoffLimit: 6 + completionMode: NonIndexed + completions: 1 + parallelism: 1 + selector: + matchLabels: {} + suspend: false + template: + metadata: + creationTimestamp: null + labels: + job-name: payments--db-migration + spec: + containers: + - args: + - migrate + env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-payments + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: CONFIG_ENCRYPTION_KEY + image: ghcr.io/formancehq/payments:latest + imagePullPolicy: Always + name: migrate + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: OnFailure + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + succeeded: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/payments-create-database.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/payments-create-database.yaml new file mode 100644 index 0000000000..6aae7e6993 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/payments-create-database.yaml @@ -0,0 +1,57 @@ +apiVersion: batch/v1 +kind: Job +metadata: + generation: 1 + labels: + stack: "true" + name: payments-create-database + namespace: multipod-orchestration-v0-2-0 +spec: + backoffLimit: 6 + completionMode: NonIndexed + completions: 1 + parallelism: 1 + selector: + matchLabels: {} + suspend: false + template: + metadata: + creationTimestamp: null + labels: + job-name: payments-create-database + spec: + containers: + - args: + - sh + - -c + - echo SELECT \'CREATE DATABASE \"${POSTGRES_DATABASE}\"\' WHERE NOT EXISTS \(SELECT FROM pg_database WHERE datname = \'${POSTGRES_DATABASE}\'\)\\gexec | psql -h ${POSTGRES_HOST} -p ${POSTGRES_PORT} -U ${POSTGRES_USERNAME} "sslmode=disable" + env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-payments + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: PGPASSWORD + value: $(POSTGRES_PASSWORD) + image: postgres:15-alpine + imagePullPolicy: IfNotPresent + name: create-database + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: OnFailure + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + succeeded: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/webhooks-create-database.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/webhooks-create-database.yaml new file mode 100644 index 0000000000..1ad4e9c10e --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/jobs-batch-v1/webhooks-create-database.yaml @@ -0,0 +1,57 @@ +apiVersion: batch/v1 +kind: Job +metadata: + generation: 1 + labels: + stack: "true" + name: webhooks-create-database + namespace: multipod-orchestration-v0-2-0 +spec: + backoffLimit: 6 + completionMode: NonIndexed + completions: 1 + parallelism: 1 + selector: + matchLabels: {} + suspend: false + template: + metadata: + creationTimestamp: null + labels: + job-name: webhooks-create-database + spec: + containers: + - args: + - sh + - -c + - echo SELECT \'CREATE DATABASE \"${POSTGRES_DATABASE}\"\' WHERE NOT EXISTS \(SELECT FROM pg_database WHERE datname = \'${POSTGRES_DATABASE}\'\)\\gexec | psql -h ${POSTGRES_HOST} -p ${POSTGRES_PORT} -U ${POSTGRES_USERNAME} "sslmode=disable" + env: + - name: POSTGRES_HOST + value: localhost + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_DATABASE + value: multipod-orchestration-v0-2-0-webhooks + - name: POSTGRES_USERNAME + value: root + - name: POSTGRES_PASSWORD + value: root + - name: POSTGRES_NO_DATABASE_URI + value: postgresql://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT) + - name: POSTGRES_URI + value: $(POSTGRES_NO_DATABASE_URI)/$(POSTGRES_DATABASE)?sslmode=disable + - name: PGPASSWORD + value: $(POSTGRES_PASSWORD) + image: postgres:15-alpine + imagePullPolicy: IfNotPresent + name: create-database + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: OnFailure + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 +status: + succeeded: 1 diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.6.5-post-upgrade.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.6.5-post-upgrade.yaml new file mode 100644 index 0000000000..e6ece77f53 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.6.5-post-upgrade.yaml @@ -0,0 +1,17 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Migration +metadata: + generation: 1 + labels: + stack: "true" + name: payments-v0.6.5-post-upgrade + namespace: multipod-orchestration-v0-2-0 +spec: + configuration: multipod-orchestration-v0-2-0 + currentVersion: "" + module: payments + postUpgrade: true + targetedVersion: v0.6.5 + version: multipod-orchestration-v0-2-0 +status: + terminated: true diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.7.0-post-upgrade.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.7.0-post-upgrade.yaml new file mode 100644 index 0000000000..c4ce07e17c --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.7.0-post-upgrade.yaml @@ -0,0 +1,17 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Migration +metadata: + generation: 1 + labels: + stack: "true" + name: payments-v0.7.0-post-upgrade + namespace: multipod-orchestration-v0-2-0 +spec: + configuration: multipod-orchestration-v0-2-0 + currentVersion: "" + module: payments + postUpgrade: true + targetedVersion: v0.7.0 + version: multipod-orchestration-v0-2-0 +status: + terminated: true diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.8.0-post-upgrade.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.8.0-post-upgrade.yaml new file mode 100644 index 0000000000..2d5ce3ee7d --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.8.0-post-upgrade.yaml @@ -0,0 +1,17 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Migration +metadata: + generation: 1 + labels: + stack: "true" + name: payments-v0.8.0-post-upgrade + namespace: multipod-orchestration-v0-2-0 +spec: + configuration: multipod-orchestration-v0-2-0 + currentVersion: "" + module: payments + postUpgrade: true + targetedVersion: v0.8.0 + version: multipod-orchestration-v0-2-0 +status: + terminated: true diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.8.1-post-upgrade.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.8.1-post-upgrade.yaml new file mode 100644 index 0000000000..f4b43242de --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v0.8.1-post-upgrade.yaml @@ -0,0 +1,17 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Migration +metadata: + generation: 1 + labels: + stack: "true" + name: payments-v0.8.1-post-upgrade + namespace: multipod-orchestration-v0-2-0 +spec: + configuration: multipod-orchestration-v0-2-0 + currentVersion: "" + module: payments + postUpgrade: true + targetedVersion: v0.8.1 + version: multipod-orchestration-v0-2-0 +status: + terminated: true diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v1.0.0-beta.3-pre-upgrade.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v1.0.0-beta.3-pre-upgrade.yaml new file mode 100644 index 0000000000..64e58e204d --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/payments-v1.0.0-beta.3-pre-upgrade.yaml @@ -0,0 +1,17 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Migration +metadata: + generation: 1 + labels: + stack: "true" + name: payments-v1.0.0-beta.3-pre-upgrade + namespace: multipod-orchestration-v0-2-0 +spec: + configuration: multipod-orchestration-v0-2-0 + currentVersion: "" + module: payments + postUpgrade: false + targetedVersion: v1.0.0-beta.3 + version: multipod-orchestration-v0-2-0 +status: + terminated: true diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.0.0-pre-upgrade.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.0.0-pre-upgrade.yaml new file mode 100644 index 0000000000..c44fdd55ba --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.0.0-pre-upgrade.yaml @@ -0,0 +1,17 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Migration +metadata: + generation: 1 + labels: + stack: "true" + name: search-v0.0.0-pre-upgrade + namespace: multipod-orchestration-v0-2-0 +spec: + configuration: multipod-orchestration-v0-2-0 + currentVersion: "" + module: search + postUpgrade: false + targetedVersion: v0.0.0 + version: multipod-orchestration-v0-2-0 +status: + terminated: true diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.10.0-pre-upgrade.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.10.0-pre-upgrade.yaml new file mode 100644 index 0000000000..dc3eab6812 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.10.0-pre-upgrade.yaml @@ -0,0 +1,17 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Migration +metadata: + generation: 1 + labels: + stack: "true" + name: search-v0.10.0-pre-upgrade + namespace: multipod-orchestration-v0-2-0 +spec: + configuration: multipod-orchestration-v0-2-0 + currentVersion: "" + module: search + postUpgrade: false + targetedVersion: v0.10.0 + version: multipod-orchestration-v0-2-0 +status: + terminated: true diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.7.0-post-upgrade.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.7.0-post-upgrade.yaml new file mode 100644 index 0000000000..86f313eae9 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.7.0-post-upgrade.yaml @@ -0,0 +1,17 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Migration +metadata: + generation: 1 + labels: + stack: "true" + name: search-v0.7.0-post-upgrade + namespace: multipod-orchestration-v0-2-0 +spec: + configuration: multipod-orchestration-v0-2-0 + currentVersion: "" + module: search + postUpgrade: true + targetedVersion: v0.7.0 + version: multipod-orchestration-v0-2-0 +status: + terminated: true diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.7.0-pre-upgrade.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.7.0-pre-upgrade.yaml new file mode 100644 index 0000000000..5859da4f42 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/search-v0.7.0-pre-upgrade.yaml @@ -0,0 +1,17 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Migration +metadata: + generation: 1 + labels: + stack: "true" + name: search-v0.7.0-pre-upgrade + namespace: multipod-orchestration-v0-2-0 +spec: + configuration: multipod-orchestration-v0-2-0 + currentVersion: "" + module: search + postUpgrade: false + targetedVersion: v0.7.0 + version: multipod-orchestration-v0-2-0 +status: + terminated: true diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/wallets-v0.4.3-post-upgrade.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/wallets-v0.4.3-post-upgrade.yaml new file mode 100644 index 0000000000..4efb08ca83 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/wallets-v0.4.3-post-upgrade.yaml @@ -0,0 +1,17 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Migration +metadata: + generation: 1 + labels: + stack: "true" + name: wallets-v0.4.3-post-upgrade + namespace: multipod-orchestration-v0-2-0 +spec: + configuration: multipod-orchestration-v0-2-0 + currentVersion: "" + module: wallets + postUpgrade: true + targetedVersion: v0.4.3 + version: multipod-orchestration-v0-2-0 +status: + terminated: true diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/wallets-v0.4.4-post-upgrade.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/wallets-v0.4.4-post-upgrade.yaml new file mode 100644 index 0000000000..15b875896f --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/migrations-stack.formance.com-v1beta3/wallets-v0.4.4-post-upgrade.yaml @@ -0,0 +1,17 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Migration +metadata: + generation: 1 + labels: + stack: "true" + name: wallets-v0.4.4-post-upgrade + namespace: multipod-orchestration-v0-2-0 +spec: + configuration: multipod-orchestration-v0-2-0 + currentVersion: "" + module: wallets + postUpgrade: true + targetedVersion: v0.4.4 + version: multipod-orchestration-v0-2-0 +status: + terminated: true diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/secrets--v1/auth-secret.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/secrets--v1/auth-secret.yaml new file mode 100644 index 0000000000..381b443e55 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/secrets--v1/auth-secret.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + signingKey: ZmFrZS1yc2Eta2V5 +kind: Secret +metadata: + labels: + stack: "true" + name: auth-secret + namespace: multipod-orchestration-v0-2-0 +type: Opaque diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/auth.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/auth.yaml new file mode 100644 index 0000000000..073aaa93ac --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/auth.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/service-name: auth + name: auth + namespace: multipod-orchestration-v0-2-0 +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - appProtocol: http + name: http + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app.kubernetes.io/name: auth + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/control.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/control.yaml new file mode 100644 index 0000000000..f653c20d24 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/control.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/service-name: control + name: control + namespace: multipod-orchestration-v0-2-0 +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - appProtocol: http + name: http + port: 3000 + protocol: TCP + targetPort: 3000 + selector: + app.kubernetes.io/name: control + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/gateway.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/gateway.yaml new file mode 100644 index 0000000000..1bb8b8e484 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/gateway.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/service-name: gateway + name: gateway + namespace: multipod-orchestration-v0-2-0 +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - appProtocol: http + name: http + port: 8000 + protocol: TCP + targetPort: 8000 + selector: + app.kubernetes.io/name: gateway + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/ledger.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/ledger.yaml new file mode 100644 index 0000000000..3e3b634c99 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/ledger.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/service-name: ledger + name: ledger + namespace: multipod-orchestration-v0-2-0 +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - appProtocol: http + name: http + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app.kubernetes.io/name: ledger + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/orchestration.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/orchestration.yaml new file mode 100644 index 0000000000..1a37d3a99f --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/orchestration.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/service-name: orchestration + name: orchestration + namespace: multipod-orchestration-v0-2-0 +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - appProtocol: http + name: http + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app.kubernetes.io/name: orchestration + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/payments-api.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/payments-api.yaml new file mode 100644 index 0000000000..5f6353542c --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/payments-api.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/service-name: payments-api + name: payments-api + namespace: multipod-orchestration-v0-2-0 +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - appProtocol: http + name: http + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app.kubernetes.io/name: payments-api + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/payments-connectors.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/payments-connectors.yaml new file mode 100644 index 0000000000..fc1d6abcee --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/payments-connectors.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/service-name: payments-connectors + name: payments-connectors + namespace: multipod-orchestration-v0-2-0 +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - appProtocol: http + name: http + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app.kubernetes.io/name: payments-connectors + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/search-benthos.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/search-benthos.yaml new file mode 100644 index 0000000000..768c24072b --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/search-benthos.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/service-name: search-benthos + name: search-benthos + namespace: multipod-orchestration-v0-2-0 +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - appProtocol: http + name: http + port: 4195 + protocol: TCP + targetPort: 4195 + selector: + app.kubernetes.io/name: search-benthos + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/search.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/search.yaml new file mode 100644 index 0000000000..04ca2e0578 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/search.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/service-name: search + name: search + namespace: multipod-orchestration-v0-2-0 +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - appProtocol: http + name: http + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app.kubernetes.io/name: search + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/wallets.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/wallets.yaml new file mode 100644 index 0000000000..a77f634d25 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/wallets.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/service-name: wallets + name: wallets + namespace: multipod-orchestration-v0-2-0 +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - appProtocol: http + name: http + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app.kubernetes.io/name: wallets + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/webhooks.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/webhooks.yaml new file mode 100644 index 0000000000..a70b1112c2 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/results/services--v1/webhooks.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/service-name: webhooks + name: webhooks + namespace: multipod-orchestration-v0-2-0 +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - appProtocol: http + name: http + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app.kubernetes.io/name: webhooks + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/stack.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/stack.yaml new file mode 100644 index 0000000000..cc9a37df15 --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/stack.yaml @@ -0,0 +1,11 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Stack +metadata: + name: stack1 +spec: + debug: false + dev: false + scheme: http + host: example.net + seed: stacks + versions: default diff --git a/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/versions.yaml b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/versions.yaml new file mode 100644 index 0000000000..7c3ae552fa --- /dev/null +++ b/components/operator/internal/controllers/stack/testdata/multipod-orchestration-v0.2.0/versions.yaml @@ -0,0 +1,6 @@ +apiVersion: stack.formance.com/v1beta3 +kind: Versions +metadata: + name: default +spec: + orchestration: v0.2.0 \ No newline at end of file diff --git a/components/operator/internal/controllers/stack/testdata/multipod-service-annotation/results/deployments-apps-v1/orchestration-worker.yaml b/components/operator/internal/controllers/stack/testdata/multipod-service-annotation/results/deployments-apps-v1/orchestration-worker.yaml index 609ee7d9ec..500c556bc5 100644 --- a/components/operator/internal/controllers/stack/testdata/multipod-service-annotation/results/deployments-apps-v1/orchestration-worker.yaml +++ b/components/operator/internal/controllers/stack/testdata/multipod-service-annotation/results/deployments-apps-v1/orchestration-worker.yaml @@ -68,6 +68,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka:1234 + - name: TOPICS + value: multipod-service-annotation-ledger multipod-service-annotation-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/multipod-with-audit-log-unvalid-tag/results/deployments-apps-v1/orchestration-worker.yaml b/components/operator/internal/controllers/stack/testdata/multipod-with-audit-log-unvalid-tag/results/deployments-apps-v1/orchestration-worker.yaml index ac092675cd..4a67f712a7 100644 --- a/components/operator/internal/controllers/stack/testdata/multipod-with-audit-log-unvalid-tag/results/deployments-apps-v1/orchestration-worker.yaml +++ b/components/operator/internal/controllers/stack/testdata/multipod-with-audit-log-unvalid-tag/results/deployments-apps-v1/orchestration-worker.yaml @@ -68,6 +68,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka:1234 + - name: TOPICS + value: multipod-with-audit-log-unvalid-tag-ledger multipod-with-audit-log-unvalid-tag-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/multipod-with-audit-log/results/deployments-apps-v1/orchestration-worker.yaml b/components/operator/internal/controllers/stack/testdata/multipod-with-audit-log/results/deployments-apps-v1/orchestration-worker.yaml index d0d7228a9c..3e0051dcab 100644 --- a/components/operator/internal/controllers/stack/testdata/multipod-with-audit-log/results/deployments-apps-v1/orchestration-worker.yaml +++ b/components/operator/internal/controllers/stack/testdata/multipod-with-audit-log/results/deployments-apps-v1/orchestration-worker.yaml @@ -68,6 +68,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka:1234 + - name: TOPICS + value: multipod-with-audit-log-ledger multipod-with-audit-log-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/controllers/stack/testdata/multipod-without-audit-log/results/deployments-apps-v1/orchestration-worker.yaml b/components/operator/internal/controllers/stack/testdata/multipod-without-audit-log/results/deployments-apps-v1/orchestration-worker.yaml index 8f67bf337b..88e92b0006 100644 --- a/components/operator/internal/controllers/stack/testdata/multipod-without-audit-log/results/deployments-apps-v1/orchestration-worker.yaml +++ b/components/operator/internal/controllers/stack/testdata/multipod-without-audit-log/results/deployments-apps-v1/orchestration-worker.yaml @@ -68,6 +68,14 @@ spec: value: mocked-secret - name: TEMPORAL_SSL_CLIENT_KEY - name: TEMPORAL_SSL_CLIENT_CERT + - name: BROKER + value: kafka + - name: PUBLISHER_KAFKA_ENABLED + value: "true" + - name: PUBLISHER_KAFKA_BROKER + value: kafka:1234 + - name: TOPICS + value: multipod-without-audit-log-ledger multipod-without-audit-log-payments image: ghcr.io/formancehq/orchestration:latest imagePullPolicy: Always name: orchestration-worker diff --git a/components/operator/internal/modules/orchestration/handler.go b/components/operator/internal/modules/orchestration/handler.go index 1564b5e30a..2251a67998 100644 --- a/components/operator/internal/modules/orchestration/handler.go +++ b/components/operator/internal/modules/orchestration/handler.go @@ -1,6 +1,7 @@ package orchestration import ( + "fmt" stackv1beta3 "github.com/formancehq/operator/apis/stack/v1beta3" "github.com/formancehq/operator/internal/modules" ) @@ -59,6 +60,54 @@ func (o module) Versions() map[string]modules.Version { } }, }, + "v0.2.0": { + Services: func(ctx modules.ReconciliationConfig) modules.Services { + return modules.Services{ + { + Port: 8080, + AuthConfiguration: func(config modules.ReconciliationConfig) stackv1beta3.ClientConfiguration { + return stackv1beta3.NewClientConfiguration() + }, + ExposeHTTP: modules.DefaultExposeHTTP, + HasVersionEndpoint: true, + InjectPostgresVariables: true, + Annotations: ctx.Configuration.Spec.Services.Orchestration.Annotations.Service, + Container: func(resolveContext modules.ContainerResolutionConfiguration) modules.Container { + return modules.Container{ + Env: orchestrationEnvVars(resolveContext), + Image: modules.GetImage("orchestration", resolveContext.Versions.Spec.Orchestration), + Resources: modules.GetResourcesWithDefault( + resolveContext.Configuration.Spec.Services.Orchestration.ResourceProperties, + modules.ResourceSizeSmall(), + ), + } + }, + }, + { + Name: "worker", + InjectPostgresVariables: true, + Liveness: modules.LivenessDisable, + Container: func(resolveContext modules.ContainerResolutionConfiguration) modules.Container { + env := orchestrationEnvVars(resolveContext) + env = append(env, modules.BrokerEnvVars(resolveContext.Configuration.Spec.Broker, "orchestration")...) + + // TODO(gfyrag): Make more generic + env = append(env, modules.Env("TOPICS", fmt.Sprintf("%s-ledger %s-payments", + resolveContext.Stack.Name, resolveContext.Stack.Name))) + return modules.Container{ + Env: env, + Image: modules.GetImage("orchestration", resolveContext.Versions.Spec.Orchestration), + Args: []string{"worker"}, + Resources: modules.GetResourcesWithDefault( + resolveContext.Configuration.Spec.Services.Orchestration.ResourceProperties, + modules.ResourceSizeSmall(), + ), + } + }, + }, + } + }, + }, } } diff --git a/components/orchestration/cmd/root.go b/components/orchestration/cmd/root.go index 3b28260d14..af184e2cc8 100644 --- a/components/orchestration/cmd/root.go +++ b/components/orchestration/cmd/root.go @@ -5,8 +5,13 @@ import ( "io" "os" + "github.com/formancehq/orchestration/internal/triggers" + "github.com/formancehq/orchestration/internal/workflow" + + "github.com/formancehq/orchestration/internal/temporalclient" + "github.com/formancehq/stack/libs/go-libs/publish" + "github.com/formancehq/orchestration/internal/storage" - "github.com/formancehq/orchestration/internal/temporal" _ "github.com/formancehq/orchestration/internal/workflow/stages/all" "github.com/formancehq/stack/libs/go-libs/otlp/otlptraces" "github.com/formancehq/stack/libs/go-libs/service" @@ -31,6 +36,7 @@ const ( temporalSSLClientKeyFlag = "temporal-ssl-client-key" temporalSSLClientCertFlag = "temporal-ssl-client-cert" temporalTaskQueueFlag = "temporal-task-queue" + topicsFlag = "topics" listenFlag = "listen" postgresDSNFlag = "postgres-dsn" workerFlag = "worker" @@ -53,7 +59,10 @@ func NewRootCommand() *cobra.Command { cmd.PersistentFlags().String(temporalSSLClientCertFlag, "", "Temporal client cert") cmd.PersistentFlags().String(temporalTaskQueueFlag, "default", "Temporal task queue name") cmd.PersistentFlags().String(postgresDSNFlag, "", "Postgres address") - cmd.AddCommand(newServeCommand(), newWorkerCommand(), newVersionCommand()) + cmd.PersistentFlags().StringSlice(topicsFlag, []string{}, "Topics to listen") + cmd.AddCommand(newServeCommand(), newVersionCommand(), newWorkerCommand()) + + publish.InitCLIFlags(cmd) return cmd } @@ -72,12 +81,15 @@ func Execute() { func commonOptions(output io.Writer) fx.Option { return fx.Options( otlptraces.CLITracesModule(viper.GetViper()), - temporal.NewClientModule( + temporalclient.NewModule( viper.GetString(temporalAddressFlag), viper.GetString(temporalNamespaceFlag), viper.GetString(temporalSSLClientCertFlag), viper.GetString(temporalSSLClientKeyFlag), ), storage.NewModule(viper.GetString(postgresDSNFlag), viper.GetBool(service.DebugFlag), output), + publish.CLIPublisherModule(viper.GetViper(), "orchestration"), + workflow.NewModule(viper.GetString(temporalTaskQueueFlag)), + triggers.NewModule(viper.GetString(temporalTaskQueueFlag)), ) } diff --git a/components/orchestration/cmd/serve.go b/components/orchestration/cmd/serve.go index 7a78ac89ad..d6b0cb2cf0 100644 --- a/components/orchestration/cmd/serve.go +++ b/components/orchestration/cmd/serve.go @@ -5,7 +5,6 @@ import ( "github.com/formancehq/orchestration/internal/api" "github.com/formancehq/orchestration/internal/storage" - "github.com/formancehq/orchestration/internal/workflow" "github.com/formancehq/stack/libs/go-libs/health" "github.com/formancehq/stack/libs/go-libs/httpserver" "github.com/formancehq/stack/libs/go-libs/service" @@ -43,7 +42,6 @@ func newServeCommand() *cobra.Command { } }), api.NewModule(), - workflow.NewModule(viper.GetString(temporalTaskQueueFlag)), fx.Invoke(func(lifecycle fx.Lifecycle, db *bun.DB) { lifecycle.Append(fx.Hook{ OnStart: func(ctx context.Context) error { diff --git a/components/orchestration/cmd/worker.go b/components/orchestration/cmd/worker.go index 94b688e466..bd7818fde6 100644 --- a/components/orchestration/cmd/worker.go +++ b/components/orchestration/cmd/worker.go @@ -5,8 +5,10 @@ import ( "fmt" "net/http" + "github.com/formancehq/orchestration/internal/triggers" + sdk "github.com/formancehq/formance-sdk-go" - "github.com/formancehq/orchestration/internal/temporal" + "github.com/formancehq/orchestration/internal/temporalworker" "github.com/formancehq/stack/libs/go-libs/otlp" "github.com/formancehq/stack/libs/go-libs/service" "github.com/spf13/cobra" @@ -43,7 +45,8 @@ func stackClientModule() fx.Option { func workerOptions() fx.Option { return fx.Options( stackClientModule(), - temporal.NewWorkerModule(viper.GetString(temporalTaskQueueFlag)), + temporalworker.NewWorkerModule(viper.GetString(temporalTaskQueueFlag)), + triggers.NewListenerModule(viper.GetString(temporalTaskQueueFlag), viper.GetStringSlice(topicsFlag)), ) } diff --git a/components/orchestration/go.mod b/components/orchestration/go.mod index 9f701ef8fb..13b27ae3f6 100644 --- a/components/orchestration/go.mod +++ b/components/orchestration/go.mod @@ -3,6 +3,8 @@ module github.com/formancehq/orchestration go 1.20 require ( + github.com/ThreeDotsLabs/watermill v1.2.0 + github.com/expr-lang/expr v1.15.6 github.com/formancehq/formance-sdk-go v1.0.0-rc.1 github.com/formancehq/stack/libs/go-libs v0.0.0-20230221161632-e6dc6a89a85e github.com/go-chi/chi/v5 v5.0.8 @@ -13,14 +15,12 @@ require ( github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.3 - github.com/uptrace/bun v1.1.14 - github.com/uptrace/bun/dialect/pgdialect v1.1.14 - github.com/uptrace/bun/dialect/sqlitedialect v1.1.14 + github.com/stretchr/testify v1.8.4 + github.com/uptrace/bun v1.1.16 + github.com/uptrace/bun/dialect/pgdialect v1.1.16 github.com/uptrace/bun/driver/pgdriver v1.1.14 - github.com/uptrace/bun/driver/sqliteshim v1.1.14 - github.com/uptrace/bun/extra/bundebug v1.1.14 - go.opentelemetry.io/otel v1.16.0 + github.com/uptrace/bun/extra/bundebug v1.1.16 + go.opentelemetry.io/otel v1.17.0 go.temporal.io/api v1.18.1 go.temporal.io/sdk v1.21.1 go.temporal.io/sdk/contrib/opentelemetry v0.2.0 @@ -34,7 +34,11 @@ require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Microsoft/go-winio v0.6.0 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect - github.com/ThreeDotsLabs/watermill v1.2.0 // indirect + github.com/Shopify/sarama v1.38.1 // indirect + github.com/ThreeDotsLabs/watermill-http v1.1.4 // indirect + github.com/ThreeDotsLabs/watermill-kafka/v2 v2.2.2 // indirect + github.com/ThreeDotsLabs/watermill-nats/v2 v2.0.0 // indirect + github.com/ajg/form v1.5.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/containerd/continuity v0.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -42,12 +46,16 @@ require ( github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.4.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect + github.com/eapache/go-resiliency v1.3.0 // indirect + github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 // indirect + github.com/eapache/queue v1.1.0 // indirect github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05 // indirect github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect github.com/fatih/color v1.15.0 // indirect github.com/felixge/httpsnoop v1.0.3 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-chi/chi v4.1.2+incompatible // indirect + github.com/go-chi/render v1.0.2 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-playground/locales v0.14.1 // indirect @@ -58,23 +66,34 @@ require ( github.com/gogo/status v1.1.1 // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jcmturner/aescts/v2 v2.0.0 // indirect + github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect + github.com/jcmturner/gofork v1.7.6 // indirect + github.com/jcmturner/gokrb5/v8 v8.4.3 // indirect + github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/jinzhu/inflection v1.0.0 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/lib/pq v1.10.7 // indirect github.com/lithammer/shortuuid/v3 v3.0.7 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect - github.com/mattn/go-sqlite3 v1.14.16 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae // indirect + github.com/nats-io/nats.go v1.28.0 // indirect + github.com/nats-io/nkeys v0.4.4 // indirect + github.com/nats-io/nuid v1.0.1 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect @@ -82,8 +101,9 @@ require ( github.com/ory/dockertest/v3 v3.9.1 // indirect github.com/pborman/uuid v1.2.1 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/robfig/cron v1.2.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/spf13/afero v1.9.3 // indirect @@ -96,10 +116,14 @@ require ( github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 // indirect github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect go.opentelemetry.io/contrib v1.14.0 // indirect + go.opentelemetry.io/contrib/instrumentation/github.com/Shopify/sarama/otelsarama v0.42.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.14.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.16.0 // indirect @@ -108,18 +132,18 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.17.0 // indirect go.opentelemetry.io/otel/sdk v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.17.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.16.1 // indirect go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.12.0 // indirect golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.9.1 // indirect google.golang.org/appengine v1.6.7 // indirect @@ -128,17 +152,7 @@ require ( google.golang.org/protobuf v1.30.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - lukechampine.com/uint128 v1.3.0 // indirect mellium.im/sasl v0.3.1 // indirect - modernc.org/cc/v3 v3.40.0 // indirect - modernc.org/ccgo/v3 v3.16.13 // indirect - modernc.org/libc v1.22.6 // indirect - modernc.org/mathutil v1.5.0 // indirect - modernc.org/memory v1.5.0 // indirect - modernc.org/opt v0.1.3 // indirect - modernc.org/sqlite v1.22.1 // indirect - modernc.org/strutil v1.1.3 // indirect - modernc.org/token v1.1.0 // indirect ) replace github.com/formancehq/stack/libs/go-libs => ../../libs/go-libs diff --git a/components/orchestration/go.sum b/components/orchestration/go.sum index a0b297a299..3b9824e63c 100644 --- a/components/orchestration/go.sum +++ b/components/orchestration/go.sum @@ -394,10 +394,27 @@ github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2B github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= +github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= +github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= +github.com/ThreeDotsLabs/watermill v1.1.0/go.mod h1:Qd1xNFxolCAHCzcMrm6RnjW0manbvN+DJVWc1MWRFlI= github.com/ThreeDotsLabs/watermill v1.2.0 h1:TU3TML1dnQ/ifK09F2+4JQk2EKhmhXe7Qv7eb5ZpTS8= github.com/ThreeDotsLabs/watermill v1.2.0/go.mod h1:IuVxGk/kgCN0cex2S94BLglUiB0PwOm8hbUhm6g2Nx4= +github.com/ThreeDotsLabs/watermill-http v1.1.4 h1:wRM54z/BPnIWjGbXMrOnwOlrCAESzoSNxTAHiLysFA4= +github.com/ThreeDotsLabs/watermill-http v1.1.4/go.mod h1:mkQ9CC0pxTZerNwr281rBoOy355vYt/lePkmYSX/BRg= +github.com/ThreeDotsLabs/watermill-kafka/v2 v2.2.2 h1:COB5neqVL8jGwoz1Y9dawQ7Xhxid1XXX8+1CI/PebVU= +github.com/ThreeDotsLabs/watermill-kafka/v2 v2.2.2/go.mod h1:U001oyrHo+df3Q7hIXgKqxY2OW6woz64+GNuIxZokbM= +github.com/ThreeDotsLabs/watermill-nats/v2 v2.0.0 h1:ZbdQ+cHwOZmXByEoKUH8SS6qR/erNQfrsNpvH5z/gfk= +github.com/ThreeDotsLabs/watermill-nats/v2 v2.0.0/go.mod h1:X6pcl579pScj4mII3KM/WJ+bcOqORqiCToy92f4gqJ4= +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= 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= @@ -446,8 +463,12 @@ github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKoh github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.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.3.0 h1:RRL0nge+cWGlxXbUzJ7yMcq6w2XBEr19dCN6HECGaT0= +github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 h1:8yY/I9ndfrgrXUbOGObLHKBR4Fl3nZXwM2c7OYTT8hM= +github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -463,6 +484,8 @@ github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05 h1:S92OBrGuLLZsyM5ybUzgc/mPjIYk2AZqufieooe98uw= github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05/go.mod h1:M9R1FoZ3y//hwwnJtO51ypFGwm8ZfpxPT/ZLtO1mcgQ= +github.com/expr-lang/expr v1.15.6 h1:dQFgzj5DBu3wnUz8+PGLZdPMpefAvxaCFTNM3iSjkGA= +github.com/expr-lang/expr v1.15.6/go.mod h1:uCkhfG+x7fcZ5A5sXHKuQ07jGZRl6J0FCAaf2k4PtVQ= github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a h1:yDWHCSQ40h88yih2JAcL6Ls/kVkSE8GFACTGVnMPruw= github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= @@ -470,17 +493,26 @@ github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBD github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= +github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-chi/render v1.0.1/go.mod h1:pq4Rr7HbnsdaeHagklXub+p6Wd16Af5l9koip1OvJns= +github.com/go-chi/render v1.0.2 h1:4ER/udB0+fMWB2Jlf15RV3F4A2FDuYi/9f+lFttR/Lg= +github.com/go-chi/render v1.0.2/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -505,7 +537,9 @@ github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= @@ -547,6 +581,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -584,11 +620,11 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -608,6 +644,8 @@ github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMd github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -615,6 +653,15 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4Zs github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 h1:1JYBfzqrWPcCclBwxFCPAou9n+q86mfnu7NAeHfte7A= github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0/go.mod h1:YDZoGHuwE+ov0c8smSH49WLF3F2LaWnYYuDVd+EWrc0= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -630,14 +677,29 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgx/v5 v5.3.0 h1:/NQi8KHMpKWHInxXesC8yD4DhkXPrVhmnwYkjp9AmBA= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.3 h1:iTonLeSJOn7MVUtyMT+arAn5AKAPrkilzhGw8wE/Tq8= +github.com/jcmturner/gokrb5/v8 v8.4.3/go.mod h1:dqRwJGXznQrzw6cWmyo6kH+E7jksEQG/CyVWsJEsJO0= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= 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.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -652,6 +714,7 @@ github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lithammer/shortuuid/v3 v3.0.4/go.mod h1:RviRjexKqIzx/7r1peoAITm6m7gnif/h+0zmolKJjzw= github.com/lithammer/shortuuid/v3 v3.0.7 h1:trX0KTHy4Pbwo/6ia8fscyHoGA+mf1jWbPJVuvyJQQ8= github.com/lithammer/shortuuid/v3 v3.0.7/go.mod h1:vMk8ke37EmiewwolSO1NLW8vP4ZaKlRuDIi8tWWmAts= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= @@ -663,14 +726,25 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= 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/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/jwt/v2 v2.5.0 h1:WQQ40AAlqqfx+f6ku+i0pOVm+ASirD4fUh+oQsiE9Ak= +github.com/nats-io/nats-server/v2 v2.9.23 h1:6Wj6H6QpP9FMlpCyWUaNu2yeZ/qGj+mdRkZ1wbikExU= +github.com/nats-io/nats.go v1.28.0 h1:Th4G6zdsz2d0OqXdfzKLClo6bOfoI/b1kInhRtFIy5c= +github.com/nats-io/nats.go v1.28.0/go.mod h1:XpbWUlOElGwTYbMR7imivs7jJj9GtK7ypv321Wp6pjc= +github.com/nats-io/nkeys v0.4.4 h1:xvBJ8d69TznjcQl9t6//Q5xXuVhyYiSos6RPtvQNTwA= +github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -689,6 +763,9 @@ github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= +github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -696,22 +773,29 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/riandyrn/otelchi v0.5.1 h1:0/45omeqpP7f/cvdL16GddQBfAEmZvUyl2QzLSE6uYo= github.com/riandyrn/otelchi v0.5.1/go.mod h1:ZxVxNEl+jQ9uHseRYIxKWRb3OY8YXFEu+EkNiiSNUEA= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= @@ -749,25 +833,21 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= -github.com/uptrace/bun v1.1.14 h1:S5vvNnjEynJ0CvnrBOD7MIRW7q/WbtvFXrdfy0lddAM= -github.com/uptrace/bun v1.1.14/go.mod h1:RHk6DrIisO62dv10pUOJCz5MphXThuOTpVNYEYv7NI8= -github.com/uptrace/bun/dialect/pgdialect v1.1.14 h1:b7+V1KDJPQSFYgkG/6YLXCl2uvwEY3kf/GSM7hTHRDY= -github.com/uptrace/bun/dialect/pgdialect v1.1.14/go.mod h1:v6YiaXmnKQ2FlhRD2c0ZfKd+QXH09pYn4H8ojaavkKk= -github.com/uptrace/bun/dialect/sqlitedialect v1.1.14 h1:SlwXLxr+N1kEo8Q0cheRlnIZLZlWniEB1OI+jkiLgWE= -github.com/uptrace/bun/dialect/sqlitedialect v1.1.14/go.mod h1:9RTEj1l4bB9a4l1Mnc9y4COTwWlFYe1dh6fyxq1rR7A= +github.com/uptrace/bun v1.1.16 h1:cn9cgEMFwcyYRsQLfxCRMUxyK1WaHwOVrR3TvzEFZ/A= +github.com/uptrace/bun v1.1.16/go.mod h1:7HnsMRRvpLFUcquJxp22JO8PsWKpFQO/gNXqqsuGWg8= +github.com/uptrace/bun/dialect/pgdialect v1.1.16 h1:eUPZ+YCJ69BA+W1X1ZmpOJSkv1oYtinr0zCXf7zCo5g= +github.com/uptrace/bun/dialect/pgdialect v1.1.16/go.mod h1:KQjfx/r6JM0OXfbv0rFrxAbdkPD7idK8VitnjIV9fZI= github.com/uptrace/bun/driver/pgdriver v1.1.14 h1:V2Etm7mLGS3mhx8ddxZcUnwZLX02Jmq9JTlo0sNVDhA= github.com/uptrace/bun/driver/pgdriver v1.1.14/go.mod h1:D4FjWV9arDYct6sjMJhFoyU71SpllZRHXFRRP2Kd0Kw= -github.com/uptrace/bun/driver/sqliteshim v1.1.14 h1:DFPUJ6KjDP2myjq15gtYYNngmAFMww1Y2UFZv4tbUw8= -github.com/uptrace/bun/driver/sqliteshim v1.1.14/go.mod h1:5BFN7V6Sm37Tn7UE4FWNm/F6V3iJPUzAJ7QyRwA5b1k= -github.com/uptrace/bun/extra/bundebug v1.1.14 h1:9OCGfP9ZDlh41u6OLerWdhBtJAVGXHr0xtxO4xWi6t0= -github.com/uptrace/bun/extra/bundebug v1.1.14/go.mod h1:lto3guzS2v6mnQp1+akyE+ecBLOltevDDe324NXEYdw= +github.com/uptrace/bun/extra/bundebug v1.1.16 h1:SgicRQGtnjhrIhlYOxdkOm1Em4s6HykmT3JblHnoTBM= +github.com/uptrace/bun/extra/bundebug v1.1.16/go.mod h1:SkiOkfUirBiO1Htc4s5bQKEq+JSeU1TkBVpMsPz2ePM= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 h1:OXsouNDvuET5o1A4uvoCnAXuuNke8JlfZWceciyUlC8= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21/go.mod h1:Xm3wlRGm5xzdAGPOvqydXPiGj0Da1q0OlUNm7Utoda4= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 h1:HCqo51kNF8wxDMDhxcN5S6DlfZXigMtptRpkvjBCeVc= @@ -779,6 +859,12 @@ github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9 github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -803,14 +889,16 @@ go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib v1.0.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM= go.opentelemetry.io/contrib v1.14.0 h1:XHKHbkvibjNRzXAIrubQXzNLImvkZrhOB2M1OodfAZs= go.opentelemetry.io/contrib v1.14.0/go.mod h1:O3SXx534x0bWzGJlxXiUXpV7Ao7Iweib+s/urIXELrs= +go.opentelemetry.io/contrib/instrumentation/github.com/Shopify/sarama/otelsarama v0.42.0 h1:bdoQBGxf0fxHaJo/Ry+RCi8k2ug7T5pqD/NdrwnbyyE= +go.opentelemetry.io/contrib/instrumentation/github.com/Shopify/sarama/otelsarama v0.42.0/go.mod h1:TDCzwfNfOr8Of31UVortnNAvRrgMyMS0zAXw9I3hoSc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8= go.opentelemetry.io/contrib/propagators/b3 v1.14.0 h1:0SBc35DESy/YXShxFtu3634OwcEWJoGzSA8Hx/NbOo8= go.opentelemetry.io/contrib/propagators/b3 v1.14.0/go.mod h1:A76N3hFhcmXo+tkmn6SE1x0AQv1JwFyiJXMclWzy/YQ= go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= @@ -823,16 +911,16 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 h1:iqjq9 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0/go.mod h1:hGXzO5bhhSHZnKvrDaXB82Y9DRFour0Nz/KrBh7reWw= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= @@ -861,6 +949,7 @@ go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTV go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -870,8 +959,9 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= 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= @@ -914,6 +1004,7 @@ golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -950,6 +1041,7 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -959,6 +1051,7 @@ golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= @@ -1013,6 +1106,8 @@ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1094,8 +1189,8 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -1116,8 +1211,8 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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= @@ -1126,6 +1221,7 @@ golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1430,6 +1526,7 @@ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 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-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1437,6 +1534,7 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= @@ -1455,32 +1553,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= -lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= mellium.im/sasl v0.3.1 h1:wE0LW6g7U83vhvxjC1IY8DnXM+EU095yeo8XClvCdfo= mellium.im/sasl v0.3.1/go.mod h1:xm59PUYpZHhgQ9ZqoJ5QaCqzWMi8IeS49dhp6plPCzw= -modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= -modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= -modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= -modernc.org/libc v1.22.6 h1:cbXU8R+A6aOjRuhsFh3nbDWXO/Hs4ClJRXYB11KmPDo= -modernc.org/libc v1.22.6/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= -modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.22.1 h1:P2+Dhp5FR1RlVRkQ3dDfCiv3Ok8XPxqpe70IjYVA9oE= -modernc.org/sqlite v1.22.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= -modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= -modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/components/orchestration/internal/api/backend.go b/components/orchestration/internal/api/backend.go new file mode 100644 index 0000000000..4cb3c89694 --- /dev/null +++ b/components/orchestration/internal/api/backend.go @@ -0,0 +1,38 @@ +package api + +import ( + "context" + + "github.com/formancehq/orchestration/internal/triggers" + "github.com/formancehq/orchestration/internal/workflow" +) + +type Backend interface { + CreateTrigger(context context.Context, data triggers.TriggerData) (*triggers.Trigger, error) + AbortRun(ctx context.Context, id string) error + Create(ctx context.Context, config workflow.Config) (*workflow.Workflow, error) + DeleteWorkflow(ctx context.Context, id string) error + ListInstances(ctx context.Context, workflowID string, deleted bool) ([]workflow.Instance, error) + ListTriggers(ctx context.Context) ([]triggers.Trigger, error) + ListWorkflows(ctx context.Context) ([]workflow.Workflow, error) + PostEvent(ctx context.Context, id string, event workflow.Event) error + GetInstance(ctx context.Context, id string) (*workflow.Instance, error) + ReadInstanceHistory(ctx context.Context, id string) ([]workflow.StageHistory, error) + ReadStageHistory(ctx context.Context, instanceID string, stage int) ([]*workflow.ActivityHistory, error) + ReadWorkflow(ctx context.Context, id string) (workflow.Workflow, error) + RunWorkflow(ctx context.Context, id string, input map[string]string) (*workflow.Instance, error) + Wait(ctx context.Context, id string) error + ListTriggersOccurrences(ctx context.Context, triggerID string) ([]triggers.Occurrence, error) + DeleteTrigger(ctx context.Context, triggerID string) error + GetTrigger(ctx context.Context, triggerID string) (*triggers.Trigger, error) +} + +func newDefaultBackend(triggersManager *triggers.TriggerManager, workflowManager *workflow.WorkflowManager) Backend { + return struct { + *triggers.TriggerManager + *workflow.WorkflowManager + }{ + WorkflowManager: workflowManager, + TriggerManager: triggersManager, + } +} diff --git a/components/orchestration/internal/api/handler_abort_workflow_instance.go b/components/orchestration/internal/api/handler_abort_workflow_instance.go index 5959555a5a..e6be986b2e 100644 --- a/components/orchestration/internal/api/handler_abort_workflow_instance.go +++ b/components/orchestration/internal/api/handler_abort_workflow_instance.go @@ -3,13 +3,12 @@ package api import ( "net/http" - "github.com/formancehq/orchestration/internal/workflow" "github.com/formancehq/stack/libs/go-libs/api" ) -func abortWorkflowInstance(m *workflow.Manager) http.HandlerFunc { +func abortWorkflowInstance(backend Backend) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - if err := m.AbortRun(r.Context(), instanceID(r)); err != nil { + if err := backend.AbortRun(r.Context(), instanceID(r)); err != nil { api.InternalServerError(w, r, err) return } diff --git a/components/orchestration/internal/api/handler_create_trigger.go b/components/orchestration/internal/api/handler_create_trigger.go new file mode 100644 index 0000000000..4fdc4f1689 --- /dev/null +++ b/components/orchestration/internal/api/handler_create_trigger.go @@ -0,0 +1,38 @@ +package api + +import ( + "encoding/json" + "net/http" + + "github.com/formancehq/orchestration/internal/triggers" + sharedapi "github.com/formancehq/stack/libs/go-libs/api" + "github.com/pkg/errors" +) + +func createTrigger(backend Backend) func(writer http.ResponseWriter, request *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + + data := triggers.TriggerData{} + if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + sharedapi.InternalServerError(w, r, err) + return + } + + trigger, err := backend.CreateTrigger(r.Context(), data) + if err != nil { + switch { + case errors.Is(err, triggers.ErrMissingWorkflowID), + errors.Is(err, triggers.ErrMissingEvent), + triggers.IsExprCompilationError(err): + sharedapi.BadRequest(w, "VALIDATION", err) + case errors.Is(err, triggers.ErrWorkflowNotExists): + sharedapi.NotFound(w) + default: + sharedapi.InternalServerError(w, r, err) + } + return + } + + sharedapi.Created(w, trigger) + } +} diff --git a/components/orchestration/internal/api/handler_create_trigger_test.go b/components/orchestration/internal/api/handler_create_trigger_test.go new file mode 100644 index 0000000000..8f38135d18 --- /dev/null +++ b/components/orchestration/internal/api/handler_create_trigger_test.go @@ -0,0 +1,31 @@ +package api + +import ( + "bytes" + "context" + "fmt" + "net/http" + "net/http/httptest" + "testing" + + "github.com/formancehq/orchestration/internal/workflow" + "github.com/go-chi/chi/v5" + "github.com/stretchr/testify/require" + "github.com/uptrace/bun" +) + +func TestCreateTrigger(t *testing.T) { + test(t, func(router *chi.Mux, m Backend, db *bun.DB) { + + w, err := m.Create(context.Background(), workflow.Config{}) + require.NoError(t, err) + + req := httptest.NewRequest(http.MethodPost, "/triggers", + bytes.NewBufferString(fmt.Sprintf(`{"workflowID": "%s", "event": "SAVED_PAYMENT"}`, w.ID))) + rec := httptest.NewRecorder() + + router.ServeHTTP(rec, req) + + require.Equal(t, http.StatusCreated, rec.Result().StatusCode) + }) +} diff --git a/components/orchestration/internal/api/handler_create_workflow.go b/components/orchestration/internal/api/handler_create_workflow.go index 8a2654c605..febdeef281 100644 --- a/components/orchestration/internal/api/handler_create_workflow.go +++ b/components/orchestration/internal/api/handler_create_workflow.go @@ -10,7 +10,7 @@ import ( "gopkg.in/yaml.v3" ) -func createWorkflow(m *workflow.Manager) http.HandlerFunc { +func createWorkflow(m Backend) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { config := workflow.Config{} diff --git a/components/orchestration/internal/api/handler_create_workflow_test.go b/components/orchestration/internal/api/handler_create_workflow_test.go index 8f05572ef1..05d4c6ca25 100644 --- a/components/orchestration/internal/api/handler_create_workflow_test.go +++ b/components/orchestration/internal/api/handler_create_workflow_test.go @@ -6,14 +6,13 @@ import ( "net/http/httptest" "testing" - "github.com/formancehq/orchestration/internal/workflow" "github.com/go-chi/chi/v5" "github.com/stretchr/testify/require" "github.com/uptrace/bun" ) func TestCreateWorkflow(t *testing.T) { - test(t, func(router *chi.Mux, m *workflow.Manager, db *bun.DB) { + test(t, func(router *chi.Mux, m Backend, db *bun.DB) { req := httptest.NewRequest(http.MethodPost, "/workflows", bytes.NewBufferString(`{"stages": []}`)) rec := httptest.NewRecorder() diff --git a/components/orchestration/internal/api/handler_delete_trigger.go b/components/orchestration/internal/api/handler_delete_trigger.go new file mode 100644 index 0000000000..db7d1de10b --- /dev/null +++ b/components/orchestration/internal/api/handler_delete_trigger.go @@ -0,0 +1,26 @@ +package api + +import ( + "database/sql" + "net/http" + + sharedapi "github.com/formancehq/stack/libs/go-libs/api" + "github.com/go-chi/chi/v5" + "github.com/pkg/errors" +) + +func deleteTrigger(backend Backend) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if err := backend.DeleteTrigger(r.Context(), chi.URLParam(r, "triggerID")); err != nil { + switch { + case errors.Is(err, sql.ErrNoRows): + sharedapi.NotFound(w) + default: + sharedapi.InternalServerError(w, r, err) + } + return + } + + sharedapi.NoContent(w) + } +} diff --git a/components/orchestration/internal/api/handler_delete_workflow.go b/components/orchestration/internal/api/handler_delete_workflow.go index 8d46a48daa..2859b14ee4 100644 --- a/components/orchestration/internal/api/handler_delete_workflow.go +++ b/components/orchestration/internal/api/handler_delete_workflow.go @@ -13,7 +13,7 @@ var ( ErrEmptyID = errors.New("ID is empty") ) -func deleteWorkflow(m *workflow.Manager) http.HandlerFunc { +func deleteWorkflow(backend Backend) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { id := workflowID(r) @@ -23,7 +23,7 @@ func deleteWorkflow(m *workflow.Manager) http.HandlerFunc { return } - err = m.DeleteWorkflow(r.Context(), workflowID(r)) + err = backend.DeleteWorkflow(r.Context(), workflowID(r)) if errors.Is(err, workflow.ErrWorkflowNotFound) { api.NotFound(w) diff --git a/components/orchestration/internal/api/handler_delete_workflow_test.go b/components/orchestration/internal/api/handler_delete_workflow_test.go index 73ee8d8ab4..32c1740d21 100644 --- a/components/orchestration/internal/api/handler_delete_workflow_test.go +++ b/components/orchestration/internal/api/handler_delete_workflow_test.go @@ -16,7 +16,7 @@ import ( ) func TestDeleteWorkflow(t *testing.T) { - test(t, func(router *chi.Mux, m *workflow.Manager, db *bun.DB) { + test(t, func(router *chi.Mux, m Backend, db *bun.DB) { // Create a workflow req := httptest.NewRequest(http.MethodPost, "/workflows", bytes.NewBufferString(`{"stages": []}`)) rec := httptest.NewRecorder() diff --git a/components/orchestration/internal/api/handler_get_trigger.go b/components/orchestration/internal/api/handler_get_trigger.go new file mode 100644 index 0000000000..979bd42f70 --- /dev/null +++ b/components/orchestration/internal/api/handler_get_trigger.go @@ -0,0 +1,28 @@ +package api + +import ( + "database/sql" + "net/http" + + sharedapi "github.com/formancehq/stack/libs/go-libs/api" + "github.com/go-chi/chi/v5" + "github.com/pkg/errors" +) + +func getTrigger(backend Backend) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + trigger, err := backend.GetTrigger(r.Context(), chi.URLParam(r, "triggerID")) + if err != nil { + switch { + case errors.Is(err, sql.ErrNoRows): + sharedapi.NotFound(w) + return + default: + sharedapi.InternalServerError(w, r, err) + } + return + } + + sharedapi.Ok(w, trigger) + } +} diff --git a/components/orchestration/internal/api/handler_list_instances.go b/components/orchestration/internal/api/handler_list_instances.go index 180b6880d0..147411539e 100644 --- a/components/orchestration/internal/api/handler_list_instances.go +++ b/components/orchestration/internal/api/handler_list_instances.go @@ -3,13 +3,12 @@ package api import ( "net/http" - "github.com/formancehq/orchestration/internal/workflow" "github.com/formancehq/stack/libs/go-libs/api" ) -func listInstances(m *workflow.Manager) http.HandlerFunc { +func listInstances(backend Backend) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - runs, err := m.ListInstances(r.Context(), r.URL.Query().Get("workflowID"), r.URL.Query().Get("running") == "true") + runs, err := backend.ListInstances(r.Context(), r.URL.Query().Get("workflowID"), r.URL.Query().Get("running") == "true") if err != nil { api.InternalServerError(w, r, err) return diff --git a/components/orchestration/internal/api/handler_list_instances_test.go b/components/orchestration/internal/api/handler_list_instances_test.go index d4ab186d54..e0b46cf488 100644 --- a/components/orchestration/internal/api/handler_list_instances_test.go +++ b/components/orchestration/internal/api/handler_list_instances_test.go @@ -16,7 +16,7 @@ import ( ) func TestListInstances(t *testing.T) { - test(t, func(router *chi.Mux, m *workflow.Manager, db *bun.DB) { + test(t, func(router *chi.Mux, m Backend, db *bun.DB) { // Create a workflow with 10 instances w := workflow.New(workflow.Config{}) _, err := db.NewInsert().Model(&w).Exec(context.TODO()) diff --git a/components/orchestration/internal/api/handler_list_triggers.go b/components/orchestration/internal/api/handler_list_triggers.go new file mode 100644 index 0000000000..38534cdb9b --- /dev/null +++ b/components/orchestration/internal/api/handler_list_triggers.go @@ -0,0 +1,19 @@ +package api + +import ( + "net/http" + + sharedapi "github.com/formancehq/stack/libs/go-libs/api" +) + +func listTriggers(backend Backend) func(writer http.ResponseWriter, request *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + triggers, err := backend.ListTriggers(r.Context()) + if err != nil { + sharedapi.InternalServerError(w, r, err) + return + } + + sharedapi.Ok(w, triggers) + } +} diff --git a/components/orchestration/internal/api/handler_list_triggers_occurrences.go b/components/orchestration/internal/api/handler_list_triggers_occurrences.go new file mode 100644 index 0000000000..1f5fd813ff --- /dev/null +++ b/components/orchestration/internal/api/handler_list_triggers_occurrences.go @@ -0,0 +1,20 @@ +package api + +import ( + "net/http" + + sharedapi "github.com/formancehq/stack/libs/go-libs/api" + "github.com/go-chi/chi/v5" +) + +func listTriggersOccurrences(backend Backend) func(writer http.ResponseWriter, request *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + triggersOccurrences, err := backend.ListTriggersOccurrences(r.Context(), chi.URLParam(r, "triggerID")) + if err != nil { + sharedapi.InternalServerError(w, r, err) + return + } + + sharedapi.Ok(w, triggersOccurrences) + } +} diff --git a/components/orchestration/internal/api/handler_list_workflows.go b/components/orchestration/internal/api/handler_list_workflows.go index 16beaf6272..599861db86 100644 --- a/components/orchestration/internal/api/handler_list_workflows.go +++ b/components/orchestration/internal/api/handler_list_workflows.go @@ -3,13 +3,12 @@ package api import ( "net/http" - "github.com/formancehq/orchestration/internal/workflow" "github.com/formancehq/stack/libs/go-libs/api" ) -func listWorkflows(m *workflow.Manager) http.HandlerFunc { +func listWorkflows(backend Backend) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - workflows, err := m.ListWorkflows(r.Context()) + workflows, err := backend.ListWorkflows(r.Context()) if err != nil { api.InternalServerError(w, r, err) return diff --git a/components/orchestration/internal/api/handler_post_event.go b/components/orchestration/internal/api/handler_post_event.go index 0a3502140f..63bb6906f7 100644 --- a/components/orchestration/internal/api/handler_post_event.go +++ b/components/orchestration/internal/api/handler_post_event.go @@ -8,7 +8,7 @@ import ( "github.com/formancehq/stack/libs/go-libs/api" ) -func postEventToWorkflowInstance(m *workflow.Manager) http.HandlerFunc { +func postEventToWorkflowInstance(backend Backend) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { event := workflow.Event{} if err := json.NewDecoder(r.Body).Decode(&event); err != nil { @@ -16,7 +16,7 @@ func postEventToWorkflowInstance(m *workflow.Manager) http.HandlerFunc { return } - if err := m.PostEvent(r.Context(), instanceID(r), event); err != nil { + if err := backend.PostEvent(r.Context(), instanceID(r), event); err != nil { api.InternalServerError(w, r, err) return } diff --git a/components/orchestration/internal/api/handler_read_instance.go b/components/orchestration/internal/api/handler_read_instance.go index 7757a0caef..7b327ab9dc 100644 --- a/components/orchestration/internal/api/handler_read_instance.go +++ b/components/orchestration/internal/api/handler_read_instance.go @@ -3,13 +3,12 @@ package api import ( "net/http" - "github.com/formancehq/orchestration/internal/workflow" "github.com/formancehq/stack/libs/go-libs/api" ) -func readInstance(m *workflow.Manager) http.HandlerFunc { +func readInstance(backend Backend) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - workflows, err := m.GetInstance(r.Context(), instanceID(r)) + workflows, err := backend.GetInstance(r.Context(), instanceID(r)) if err != nil { api.InternalServerError(w, r, err) return diff --git a/components/orchestration/internal/api/handler_read_instance_history.go b/components/orchestration/internal/api/handler_read_instance_history.go index f22883bff5..9961e947cc 100644 --- a/components/orchestration/internal/api/handler_read_instance_history.go +++ b/components/orchestration/internal/api/handler_read_instance_history.go @@ -3,13 +3,12 @@ package api import ( "net/http" - "github.com/formancehq/orchestration/internal/workflow" "github.com/formancehq/stack/libs/go-libs/api" ) -func readInstanceHistory(m *workflow.Manager) http.HandlerFunc { +func readInstanceHistory(backend Backend) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - workflows, err := m.ReadInstanceHistory(r.Context(), instanceID(r)) + workflows, err := backend.ReadInstanceHistory(r.Context(), instanceID(r)) if err != nil { api.InternalServerError(w, r, err) return diff --git a/components/orchestration/internal/api/handler_read_instance_test.go b/components/orchestration/internal/api/handler_read_instance_test.go index c85c0a10a6..10f0f21e74 100644 --- a/components/orchestration/internal/api/handler_read_instance_test.go +++ b/components/orchestration/internal/api/handler_read_instance_test.go @@ -16,7 +16,7 @@ import ( ) func TestGetInstance(t *testing.T) { - test(t, func(router *chi.Mux, m *workflow.Manager, db *bun.DB) { + test(t, func(router *chi.Mux, m Backend, db *bun.DB) { w, err := m.Create(context.TODO(), workflow.Config{ Stages: []workflow.RawStage{}, }) diff --git a/components/orchestration/internal/api/handler_read_stage_history.go b/components/orchestration/internal/api/handler_read_stage_history.go index e4d30e6c73..9e06b4bc90 100644 --- a/components/orchestration/internal/api/handler_read_stage_history.go +++ b/components/orchestration/internal/api/handler_read_stage_history.go @@ -10,7 +10,7 @@ import ( "github.com/pkg/errors" ) -func readStageHistory(m *workflow.Manager) http.HandlerFunc { +func readStageHistory(backend Backend) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { stageNumberAsString := chi.URLParam(r, "number") stage, err := strconv.ParseInt(stageNumberAsString, 10, 64) @@ -18,7 +18,7 @@ func readStageHistory(m *workflow.Manager) http.HandlerFunc { w.WriteHeader(http.StatusNotFound) return } - workflows, err := m.ReadStageHistory(r.Context(), instanceID(r), int(stage)) + workflows, err := backend.ReadStageHistory(r.Context(), instanceID(r), int(stage)) if err != nil { switch { case errors.Is(err, workflow.ErrInstanceNotFound): diff --git a/components/orchestration/internal/api/handler_read_workflow.go b/components/orchestration/internal/api/handler_read_workflow.go index 9d64f15412..7cd4148cb7 100644 --- a/components/orchestration/internal/api/handler_read_workflow.go +++ b/components/orchestration/internal/api/handler_read_workflow.go @@ -3,13 +3,12 @@ package api import ( "net/http" - "github.com/formancehq/orchestration/internal/workflow" "github.com/formancehq/stack/libs/go-libs/api" ) -func readWorkflow(m *workflow.Manager) http.HandlerFunc { +func readWorkflow(backend Backend) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - workflow, err := m.ReadWorkflow(r.Context(), workflowID(r)) + workflow, err := backend.ReadWorkflow(r.Context(), workflowID(r)) if err != nil { api.InternalServerError(w, r, err) return diff --git a/components/orchestration/internal/api/handler_run_workflow.go b/components/orchestration/internal/api/handler_run_workflow.go index da977510ef..9310ecdebf 100644 --- a/components/orchestration/internal/api/handler_run_workflow.go +++ b/components/orchestration/internal/api/handler_run_workflow.go @@ -9,7 +9,7 @@ import ( "github.com/formancehq/stack/libs/go-libs/api" ) -func runWorkflow(m *workflow.Manager) http.HandlerFunc { +func runWorkflow(backend Backend) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { input := make(map[string]string) if r.ContentLength > 0 { @@ -18,7 +18,7 @@ func runWorkflow(m *workflow.Manager) http.HandlerFunc { return } } - instance, err := m.RunWorkflow(r.Context(), workflowID(r), input) + instance, err := backend.RunWorkflow(r.Context(), workflowID(r), input) if err != nil { api.InternalServerError(w, r, err) return @@ -29,12 +29,12 @@ func runWorkflow(m *workflow.Manager) http.HandlerFunc { *workflow.Instance Error string `json:"error,omitempty"` }{ - Instance: &instance, + Instance: instance, } - if err := m.Wait(r.Context(), instance.ID); err != nil { + if err := backend.Wait(r.Context(), instance.ID); err != nil { ret.Error = err.Error() } - ret.Instance, err = m.GetInstance(r.Context(), instance.ID) + ret.Instance, err = backend.GetInstance(r.Context(), instance.ID) if err != nil { panic(err) } diff --git a/components/orchestration/internal/api/handler_run_workflow_test.go b/components/orchestration/internal/api/handler_run_workflow_test.go index 45d2a6be69..04e538ebf7 100644 --- a/components/orchestration/internal/api/handler_run_workflow_test.go +++ b/components/orchestration/internal/api/handler_run_workflow_test.go @@ -15,7 +15,7 @@ import ( ) func TestRunWorkflow(t *testing.T) { - test(t, func(router *chi.Mux, m *workflow.Manager, db *bun.DB) { + test(t, func(router *chi.Mux, m Backend, db *bun.DB) { w, err := m.Create(context.TODO(), workflow.Config{ Stages: []workflow.RawStage{}, }) @@ -31,7 +31,7 @@ func TestRunWorkflow(t *testing.T) { } func TestRunWorkflowWaitEvent(t *testing.T) { - test(t, func(router *chi.Mux, m *workflow.Manager, db *bun.DB) { + test(t, func(router *chi.Mux, m Backend, db *bun.DB) { w, err := m.Create(context.TODO(), workflow.Config{ Stages: []workflow.RawStage{ map[string]map[string]any{ diff --git a/components/orchestration/internal/api/main_test.go b/components/orchestration/internal/api/main_test.go index 77278c335c..30e2704efa 100644 --- a/components/orchestration/internal/api/main_test.go +++ b/components/orchestration/internal/api/main_test.go @@ -7,6 +7,8 @@ import ( "testing" "time" + "github.com/formancehq/orchestration/internal/triggers" + "github.com/formancehq/orchestration/internal/storage" "github.com/formancehq/orchestration/internal/workflow" "github.com/formancehq/stack/libs/go-libs/health" @@ -69,7 +71,7 @@ func newMockedClient(t *testing.T, db *bun.DB) *mockedClient { } } -func test(t *testing.T, fn func(router *chi.Mux, m *workflow.Manager, db *bun.DB)) { +func test(t *testing.T, fn func(router *chi.Mux, backend Backend, db *bun.DB)) { t.Parallel() database := pgtesting.NewPostgresDatabase(t) @@ -79,11 +81,13 @@ func test(t *testing.T, fn func(router *chi.Mux, m *workflow.Manager, db *bun.DB }) require.NoError(t, storage.Migrate(context.Background(), db)) - manager := workflow.NewManager(db, newMockedClient(t, db), "default") - router := newRouter(manager, ServiceInfo{ + workflowManager := workflow.NewManager(db, newMockedClient(t, db), "default") + triggersManager := triggers.NewManager(db) + backend := newDefaultBackend(triggersManager, workflowManager) + router := newRouter(backend, ServiceInfo{ Version: "test", }, &health.HealthController{}) - fn(router, manager, db) + fn(router, backend, db) } func TestMain(m *testing.M) { diff --git a/components/orchestration/internal/api/module.go b/components/orchestration/internal/api/module.go index 54e7828ed1..b2358a7c1a 100644 --- a/components/orchestration/internal/api/module.go +++ b/components/orchestration/internal/api/module.go @@ -7,5 +7,6 @@ import ( func NewModule() fx.Option { return fx.Options( fx.Provide(newRouter), + fx.Provide(newDefaultBackend), ) } diff --git a/components/orchestration/internal/api/router.go b/components/orchestration/internal/api/router.go index 58f5535a6f..1ba953f81a 100644 --- a/components/orchestration/internal/api/router.go +++ b/components/orchestration/internal/api/router.go @@ -3,14 +3,13 @@ package api import ( "net/http" - "github.com/formancehq/orchestration/internal/workflow" "github.com/formancehq/stack/libs/go-libs/health" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/riandyrn/otelchi" ) -func newRouter(m *workflow.Manager, info ServiceInfo, healthController *health.HealthController) *chi.Mux { +func newRouter(backend Backend, info ServiceInfo, healthController *health.HealthController) *chi.Mux { r := chi.NewRouter() r.Use(middleware.Recoverer) r.Use(func(handler http.Handler) http.Handler { @@ -24,27 +23,36 @@ func newRouter(m *workflow.Manager, info ServiceInfo, healthController *health.H r.Group(func(r chi.Router) { // Plug middleware to handle traces r.Use(otelchi.Middleware("orchestration")) + r.Route("/triggers", func(r chi.Router) { + r.Get("/", listTriggers(backend)) + r.Post("/", createTrigger(backend)) + r.Route("/{triggerID}", func(r chi.Router) { + r.Get("/", getTrigger(backend)) + r.Delete("/", deleteTrigger(backend)) + r.Get("/occurrences", listTriggersOccurrences(backend)) + }) + }) r.Route("/workflows", func(r chi.Router) { - r.Get("/", listWorkflows(m)) - r.Post("/", createWorkflow(m)) + r.Get("/", listWorkflows(backend)) + r.Post("/", createWorkflow(backend)) r.Route("/{workflowId}", func(r chi.Router) { - r.Delete("/", deleteWorkflow(m)) - r.Get("/", readWorkflow(m)) + r.Delete("/", deleteWorkflow(backend)) + r.Get("/", readWorkflow(backend)) r.Route("/instances", func(r chi.Router) { - r.Post("/", runWorkflow(m)) + r.Post("/", runWorkflow(backend)) }) }) }) r.Route("/instances", func(r chi.Router) { - r.Get("/", listInstances(m)) + r.Get("/", listInstances(backend)) r.Route("/{instanceId}", func(r chi.Router) { - r.Get("/", readInstance(m)) - r.Post("/events", postEventToWorkflowInstance(m)) - r.Put("/abort", abortWorkflowInstance(m)) - r.Get("/history", readInstanceHistory(m)) + r.Get("/", readInstance(backend)) + r.Post("/events", postEventToWorkflowInstance(backend)) + r.Put("/abort", abortWorkflowInstance(backend)) + r.Get("/history", readInstanceHistory(backend)) r.Route("/stages", func(r chi.Router) { r.Route("/{number}", func(r chi.Router) { - r.Get("/history", readStageHistory(m)) + r.Get("/history", readStageHistory(backend)) }) }) }) diff --git a/components/orchestration/internal/storage/migrations.go b/components/orchestration/internal/storage/migrations.go index 626bfb46c2..2120f9df1d 100644 --- a/components/orchestration/internal/storage/migrations.go +++ b/components/orchestration/internal/storage/migrations.go @@ -78,5 +78,31 @@ func registerMigrations(migrator *migrations.Migrator) { return nil }, }, + migrations.Migration{ + Up: func(tx bun.Tx) error { + if _, err := tx.Exec(` + create table triggers ( + id varchar primary key, + workflow_id varchar references workflows(id), + filter varchar null, + event varchar not null, + vars jsonb, + created_at timestamp not null default now(), + deleted_at timestamp default null + ); + create table triggers_occurrences ( + workflow_instance_id varchar references workflow_instances(id), + trigger_id varchar references triggers(id), + event_id varchar not null, + date timestamp not null default now(), + event jsonb not null, + primary key (trigger_id, event_id) + ); + `); err != nil { + return err + } + return nil + }, + }, ) } diff --git a/components/orchestration/internal/storage/sqlite.go b/components/orchestration/internal/storage/sqlite.go deleted file mode 100644 index 6de69f1a86..0000000000 --- a/components/orchestration/internal/storage/sqlite.go +++ /dev/null @@ -1,25 +0,0 @@ -package storage - -import ( - "database/sql" - - "github.com/uptrace/bun" - "github.com/uptrace/bun/dialect/sqlitedialect" - "github.com/uptrace/bun/driver/sqliteshim" - "github.com/uptrace/bun/extra/bundebug" -) - -func NewSQLiteDB(debug bool) *bun.DB { - sqldb, err := sql.Open(sqliteshim.ShimName, "file::memory:?cache=shared") - if err != nil { - panic(err) - } - db := bun.NewDB(sqldb, sqlitedialect.New()) - if debug { - db.AddQueryHook(bundebug.NewQueryHook( - bundebug.WithVerbose(true), - bundebug.FromEnv("BUNDEBUG"), - )) - } - return db -} diff --git a/components/orchestration/internal/temporal/worker_module.go b/components/orchestration/internal/temporal/worker_module.go deleted file mode 100644 index fba18e7bc6..0000000000 --- a/components/orchestration/internal/temporal/worker_module.go +++ /dev/null @@ -1,69 +0,0 @@ -package temporal - -import ( - "context" - "reflect" - - sdk "github.com/formancehq/formance-sdk-go" - "github.com/formancehq/orchestration/internal/workflow" - "github.com/formancehq/orchestration/internal/workflow/activities" - "github.com/formancehq/orchestration/internal/workflow/stages" - "github.com/uptrace/bun" - "go.temporal.io/sdk/activity" - "go.temporal.io/sdk/client" - "go.temporal.io/sdk/worker" - "go.uber.org/fx" -) - -func NewWorker(c client.Client, db *bun.DB, apiClient *sdk.Formance, taskQueue string) worker.Worker { - w := worker.New(c, taskQueue, worker.Options{}) - - workflow := workflow.NewWorkflows(db) - activities := activities.New(apiClient) - - valueOfActivities := reflect.ValueOf(activities) - for i := 0; i < valueOfActivities.NumMethod(); i++ { - w.RegisterActivityWithOptions(valueOfActivities.Method(i).Interface(), activity.RegisterOptions{ - Name: reflect.TypeOf(activities).Method(i).Name, - }) - } - RegisterWorkflows(workflow, w) - - return w -} - -func RegisterWorkflows(workflows *workflow.Workflows, w interface { - RegisterWorkflow(any) -}) { - w.RegisterWorkflow(workflows.Run) - for _, schema := range stages.All() { - w.RegisterWorkflow(schema.GetWorkflow()) - } -} - -func NewWorkerModule(taskQueue string) fx.Option { - return fx.Options( - fx.Provide(func(c client.Client, db *bun.DB, apiClient *sdk.Formance) worker.Worker { - return NewWorker(c, db, apiClient, taskQueue) - }), - fx.Invoke(func(lc fx.Lifecycle, w worker.Worker) { - stopping := false - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - go func() { - err := w.Run(worker.InterruptCh()) - if err != nil && !stopping { - panic(err) - } - }() - return nil - }, - OnStop: func(ctx context.Context) error { - stopping = true - w.Stop() - return nil - }, - }) - }), - ) -} diff --git a/components/orchestration/internal/temporal/client_module.go b/components/orchestration/internal/temporalclient/client_module.go similarity index 92% rename from components/orchestration/internal/temporal/client_module.go rename to components/orchestration/internal/temporalclient/client_module.go index 935dd3a491..002ac4810f 100644 --- a/components/orchestration/internal/temporal/client_module.go +++ b/components/orchestration/internal/temporalclient/client_module.go @@ -1,4 +1,4 @@ -package temporal +package temporalclient import ( "context" @@ -12,7 +12,7 @@ import ( "go.uber.org/fx" ) -func NewClientModule(address, namespace string, certStr string, key string) fx.Option { +func NewModule(address, namespace string, certStr string, key string) fx.Option { return fx.Options( fx.Provide(func(logger logging.Logger) (client.Options, error) { diff --git a/components/orchestration/internal/temporal/logger.go b/components/orchestration/internal/temporalclient/logger.go similarity index 97% rename from components/orchestration/internal/temporal/logger.go rename to components/orchestration/internal/temporalclient/logger.go index 74b40a7bbd..c15c3a7b6c 100644 --- a/components/orchestration/internal/temporal/logger.go +++ b/components/orchestration/internal/temporalclient/logger.go @@ -1,4 +1,4 @@ -package temporal +package temporalclient import ( "github.com/formancehq/stack/libs/go-libs/logging" diff --git a/components/orchestration/internal/temporalworker/module.go b/components/orchestration/internal/temporalworker/module.go new file mode 100644 index 0000000000..215b4989d6 --- /dev/null +++ b/components/orchestration/internal/temporalworker/module.go @@ -0,0 +1,88 @@ +package temporalworker + +import ( + "context" + "reflect" + + temporalworkflow "go.temporal.io/sdk/workflow" + + "go.temporal.io/sdk/activity" + "go.temporal.io/sdk/client" + "go.temporal.io/sdk/worker" + "go.uber.org/fx" +) + +func registerWorkflow(worker worker.Worker, workflow any) { + valueOfWorkflow := reflect.ValueOf(workflow) + switch valueOfWorkflow.Kind() { + case reflect.Func: + worker.RegisterWorkflow(workflow) + case reflect.Struct: + for i := 0; i < valueOfWorkflow.NumMethod(); i++ { + name := reflect.TypeOf(workflow).Method(i).Name + worker.RegisterWorkflowWithOptions(valueOfWorkflow.Method(i).Interface(), temporalworkflow.RegisterOptions{ + Name: name, + }) + } + case reflect.Ptr: + registerWorkflow(worker, valueOfWorkflow.Elem().Interface()) + } +} + +func registerActivity(worker worker.Worker, act any) { + valueOfActivities := reflect.ValueOf(act) + switch valueOfActivities.Kind() { + case reflect.Struct: + for i := 0; i < valueOfActivities.NumMethod(); i++ { + name := reflect.TypeOf(act).Method(i).Name + worker.RegisterActivityWithOptions(valueOfActivities.Method(i).Interface(), activity.RegisterOptions{ + Name: name, + }) + } + case reflect.Func: + worker.RegisterActivity(act) + case reflect.Ptr: + registerActivity(worker, valueOfActivities.Elem().Interface()) + } +} + +func NewWorker(c client.Client, taskQueue string, workflows, activities []any) worker.Worker { + worker := worker.New(c, taskQueue, worker.Options{}) + + for _, workflow := range workflows { + registerWorkflow(worker, workflow) + } + + for _, act := range activities { + registerActivity(worker, act) + } + + return worker +} + +func NewWorkerModule(taskQueue string) fx.Option { + return fx.Options( + fx.Provide( + fx.Annotate(func(c client.Client, workflows, activities []any) worker.Worker { + return NewWorker(c, taskQueue, workflows, activities) + }, fx.ParamTags(``, `group:"workflows"`, `group:"activities"`)), + ), + fx.Invoke(func(lc fx.Lifecycle, w worker.Worker) { + lc.Append(fx.Hook{ + OnStart: func(ctx context.Context) error { + go func() { + err := w.Run(worker.InterruptCh()) + if err != nil { + panic(err) + } + }() + return nil + }, + OnStop: func(ctx context.Context) error { + w.Stop() + return nil + }, + }) + }), + ) +} diff --git a/components/orchestration/internal/triggers/activity.go b/components/orchestration/internal/triggers/activity.go new file mode 100644 index 0000000000..f3a74f50ab --- /dev/null +++ b/components/orchestration/internal/triggers/activity.go @@ -0,0 +1,79 @@ +package triggers + +import ( + "context" + + "github.com/formancehq/orchestration/internal/workflow" + "github.com/formancehq/stack/libs/go-libs/pointer" + "github.com/uptrace/bun" +) + +type Activities struct { + db *bun.DB + manager *workflow.WorkflowManager +} + +func (a Activities) ListTriggers(ctx context.Context, request ProcessEventRequest) ([]Trigger, error) { + ret := make([]Trigger, 0) + + triggers := make([]Trigger, 0) + if err := a.db.NewSelect(). + Model(&triggers). + Where("deleted_at is null"). + Where("event = ?", request.Event.Type). + Scan(ctx); err != nil { + return nil, err + } + + for _, trigger := range triggers { + ok := true + var err error + if trigger.Filter != nil && *trigger.Filter != "" { + ok, err = evalFilter(request.Event.Payload, *trigger.Filter) + if err != nil { + panic("unable to eval filter") + } + } + + if ok { + ret = append(ret, trigger) + } + } + + return ret, nil +} + +func (a Activities) ProcessTrigger(ctx context.Context, trigger Trigger, request ProcessEventRequest) error { + var ( + evaluated map[string]string + err error + ) + if trigger.Vars != nil { + evaluated, err = evalVariables(request.Event.Payload, trigger.Vars) + if err != nil { + return err + } + } + + instance, err := a.manager.RunWorkflow(ctx, trigger.WorkflowID, evaluated) + if err != nil { + return err + } + + _, err = a.db.NewInsert(). + Model(pointer.For(NewTriggerOccurrence(request.MessageID, trigger.ID, instance.ID, request.Event))). + On("CONFLICT (trigger_id, event_id) DO NOTHING"). + Exec(ctx) + + return err +} + +func NewActivities(db *bun.DB, manager *workflow.WorkflowManager) Activities { + return Activities{ + db: db, + manager: manager, + } +} + +var ProcessEventActivity = Activities{}.ProcessTrigger +var ListTriggersActivity = Activities{}.ListTriggers diff --git a/components/orchestration/internal/triggers/listener.go b/components/orchestration/internal/triggers/listener.go new file mode 100644 index 0000000000..df6fe35608 --- /dev/null +++ b/components/orchestration/internal/triggers/listener.go @@ -0,0 +1,111 @@ +package triggers + +import ( + "encoding/json" + "fmt" + + "github.com/formancehq/stack/libs/go-libs/pointer" + "go.temporal.io/api/enums/v1" + "go.temporal.io/api/serviceerror" + + "github.com/formancehq/stack/libs/go-libs/logging" + + "github.com/ThreeDotsLabs/watermill/message" + "github.com/formancehq/stack/libs/go-libs/publish" + "github.com/pkg/errors" + "go.temporal.io/sdk/client" +) + +// Quick hack to filter already processed events +func getWorkflowIDFromEvent(event publish.EventMessage) *string { + switch event.Type { + case "SAVED_PAYMENT", "SAVED_ACCOUNT": + data, err := json.Marshal(event.Payload) + if err != nil { + panic(err) + } + + type object struct { + ID string `json:"id"` + } + o := &object{} + if err := json.Unmarshal(data, o); err != nil { + panic(err) + } + + return pointer.For(o.ID) + default: + return nil + } +} + +func handleMessage(logger logging.Logger, temporalClient client.Client, taskQueue string, msg *message.Message) error { + logger = logger.WithFields(map[string]any{ + "event-id": msg.UUID, + "duplicate": "false", + }) + + var err error + defer func() { + if err != nil { + logger = logger.WithField("err", err) + logger.Errorf("Handle message") + } else { + logger.Infof("Handle message") + } + }() + + var event *publish.EventMessage + event, err = publish.UnmarshalMessage(msg) + if err != nil { + return err + } + // todo: debug + if event.Type != "SAVED_PAYMENT" { + return nil + } + + logger = logger.WithField("type", event.Type) + + options := client.StartWorkflowOptions{ + TaskQueue: taskQueue, + } + if ik := getWorkflowIDFromEvent(*event); ik != nil { + options.ID = *ik + options.WorkflowIDReusePolicy = enums.WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE + options.WorkflowExecutionErrorWhenAlreadyStarted = true + logger = logger.WithField("ik", *ik) + } + + var w client.WorkflowRun + w, err = temporalClient.ExecuteWorkflow(msg.Context(), options, RunTrigger, ProcessEventRequest{ + MessageID: msg.UUID, + Event: *event, + }) + if err != nil { + _, ok := err.(*serviceerror.WorkflowExecutionAlreadyStarted) + if ok { + logger = logger.WithField("duplicate", "true") + err = nil + return nil + } + } + logger = logger.WithFields(map[string]any{ + "id": w.GetID(), + "run-id": w.GetRunID(), + }) + + return errors.Wrap(err, "executing workflow") +} + +func registerListener(logger logging.Logger, r *message.Router, s message.Subscriber, temporalClient client.Client, taskQueue string, topics []string) { + for _, topic := range topics { + r.AddNoPublisherHandler(fmt.Sprintf("listen-%s-events", topic), topic, s, func(msg *message.Message) error { + if err := handleMessage(logger, temporalClient, taskQueue, msg); err != nil { + logging.Errorf("Error executing workflow: %s", err) + return err + } + return nil + }) + } +} diff --git a/components/orchestration/internal/triggers/manager.go b/components/orchestration/internal/triggers/manager.go new file mode 100644 index 0000000000..2890a3f383 --- /dev/null +++ b/components/orchestration/internal/triggers/manager.go @@ -0,0 +1,115 @@ +package triggers + +import ( + "context" + "database/sql" + "time" + + "github.com/formancehq/orchestration/internal/workflow" + "github.com/pkg/errors" + "github.com/uptrace/bun" +) + +var ErrWorkflowNotExists = errors.New("workflow does not exists") + +type TriggerManager struct { + db *bun.DB +} + +func (m *TriggerManager) ListTriggers(ctx context.Context) ([]Trigger, error) { + ret := make([]Trigger, 0) + err := m.db.NewSelect(). + Model(&ret). + Where("deleted_at is null"). + Scan(ctx) + if err != nil { + return nil, err + } + + return ret, nil +} + +func (m *TriggerManager) GetTrigger(ctx context.Context, triggerID string) (*Trigger, error) { + ret := &Trigger{} + err := m.db.NewSelect(). + Model(ret). + Where("deleted_at is null"). + Where("id = ?", triggerID). + Scan(ctx) + if err != nil { + return nil, err + } + + return ret, nil +} + +func (m *TriggerManager) DeleteTrigger(ctx context.Context, triggerID string) error { + updated, err := m.db.NewUpdate(). + Model(&Trigger{}). + Where("deleted_at is null"). + Where("id = ?", triggerID). + Set("deleted_at = ?", time.Now()). + Exec(ctx) + rowsAffected, err := updated.RowsAffected() + if err != nil { + panic(err) + } + if rowsAffected == 0 { + return sql.ErrNoRows + } + return err +} + +func (m *TriggerManager) CreateTrigger(ctx context.Context, data TriggerData) (*Trigger, error) { + + if err := data.Validate(); err != nil { + return nil, errors.Wrap(err, "validating data") + } + + exists, err := m.db.NewSelect(). + Model(&workflow.Workflow{}). + Where("deleted_at is null"). + Where("id = ?", data.WorkflowID). + Exists(ctx) + if err != nil { + return nil, err + } + + if !exists { + return nil, ErrWorkflowNotExists + } + + trigger, err := NewTrigger(data) + if err != nil { + return nil, err + } + + _, err = m.db.NewInsert(). + Model(trigger). + Exec(ctx) + + if err != nil { + return nil, err + } + + return trigger, nil +} + +func (m *TriggerManager) ListTriggersOccurrences(ctx context.Context, triggerID string) ([]Occurrence, error) { + ret := make([]Occurrence, 0) + err := m.db.NewSelect(). + Model(&ret). + Where("trigger_id = ?", triggerID). + Scan(ctx) + if err != nil { + return nil, err + } + + return ret, nil +} + +func NewManager(db *bun.DB) *TriggerManager { + return &TriggerManager{ + db: db, + } +} diff --git a/components/orchestration/internal/triggers/module.go b/components/orchestration/internal/triggers/module.go new file mode 100644 index 0000000000..84b08f9abc --- /dev/null +++ b/components/orchestration/internal/triggers/module.go @@ -0,0 +1,37 @@ +package triggers + +import ( + "strings" + + "github.com/ThreeDotsLabs/watermill/message" + "github.com/formancehq/orchestration/internal/workflow" + "github.com/formancehq/stack/libs/go-libs/logging" + "github.com/uptrace/bun" + "go.temporal.io/sdk/client" + "go.uber.org/fx" +) + +func NewModule(taskQueue string) fx.Option { + return fx.Options( + fx.Provide(NewManager), + fx.Provide( + fx.Annotate(func(db *bun.DB) *triggerWorkflow { + return NewWorkflow(db, taskQueue) + }, fx.As(new(any)), fx.ResultTags(`group:"workflows"`)), + ), + fx.Provide( + fx.Annotate(func(db *bun.DB, manager *workflow.WorkflowManager) Activities { + return NewActivities(db, manager) + }, fx.As(new(any)), fx.ResultTags(`group:"activities"`)), + ), + ) +} + +func NewListenerModule(taskQueue string, topics []string) fx.Option { + return fx.Options( + fx.Invoke(func(logger logging.Logger, r *message.Router, s message.Subscriber, temporalClient client.Client) { + logger.Infof("Listening events from topics: %s", strings.Join(topics, ",")) + registerListener(logger, r, s, temporalClient, taskQueue, topics) + }), + ) +} diff --git a/components/orchestration/internal/triggers/trigger.go b/components/orchestration/internal/triggers/trigger.go new file mode 100644 index 0000000000..50dc634f84 --- /dev/null +++ b/components/orchestration/internal/triggers/trigger.go @@ -0,0 +1,156 @@ +package triggers + +import ( + "fmt" + "time" + + "github.com/formancehq/stack/libs/go-libs/publish" + + "github.com/expr-lang/expr" + "github.com/google/uuid" + "github.com/pkg/errors" + "github.com/uptrace/bun" +) + +var ( + ErrMissingEvent = errors.New("missing event") + ErrMissingWorkflowID = errors.New("missing workflow id") +) + +type ExprCompilationError struct { + err error + expr string +} + +func (e ExprCompilationError) Unwrap() error { + return e.err +} + +func (e ExprCompilationError) Error() string { + return fmt.Sprintf("error compiling expression '%s': %s", e.expr, e.err) +} + +func (e ExprCompilationError) Is(err error) bool { + _, ok := err.(ExprCompilationError) + return ok +} + +func IsExprCompilationError(err error) bool { + return errors.Is(err, ExprCompilationError{}) +} + +func newExprCompilationError(expr string, err error) ExprCompilationError { + return ExprCompilationError{ + err: err, + expr: expr, + } +} + +type TriggerData struct { + Event string `json:"event" bun:"event,type:varchar"` + Filter *string `json:"filter,omitempty" bun:"filter,type:varchar"` + WorkflowID string `json:"workflowID" bun:"workflow_id,type:varchar"` + Vars map[string]string `json:"vars,omitempty" bun:"vars,type:jsonb"` +} + +func (t TriggerData) Validate() error { + if t.Event == "" { + return ErrMissingEvent + } + if t.WorkflowID == "" { + return ErrMissingWorkflowID + } + if t.Filter != nil && *t.Filter != "" { + _, err := expr.Compile(*t.Filter) + if err != nil { + return newExprCompilationError(*t.Filter, err) + } + } + for _, e := range t.Vars { + _, err := expr.Compile(e) + if err != nil { + return newExprCompilationError(e, err) + } + } + return nil +} + +type Trigger struct { + bun.BaseModel `bun:"triggers"` + TriggerData + + ID string `json:"id" bun:"id,type:varchar,pk"` + CreatedAt time.Time `json:"createdAt" bun:"created_at"` +} + +func NewTrigger(data TriggerData) (*Trigger, error) { + return &Trigger{ + TriggerData: data, + ID: uuid.NewString(), + CreatedAt: time.Now().Round(time.Microsecond).UTC(), + }, nil +} + +type Occurrence struct { + bun.BaseModel `bun:"triggers_occurrences"` + + EventID string `json:"-" bun:"event_id,pk"` + TriggerID string `json:"triggerID" bun:"trigger_id,pk"` + WorkflowInstanceID string `json:"workflowInstanceID" bun:"workflow_instance_id"` + Date time.Time `json:"date" bun:"date"` + Event publish.EventMessage `json:"event" bun:"event"` +} + +func NewTriggerOccurrence(eventID, triggerID, workflowInstanceID string, event publish.EventMessage) Occurrence { + return Occurrence{ + TriggerID: triggerID, + EventID: eventID, + WorkflowInstanceID: workflowInstanceID, + Date: time.Now().Round(time.Microsecond).UTC(), + Event: event, + } +} + +func evalFilter(event any, filter string) (bool, error) { + + p, err := expr.Compile(filter) + if err != nil { + return false, err + } + + output, err := expr.Run(p, map[string]any{ + "event": event, + }) + if err != nil { + return false, err + } + + switch output := output.(type) { + case bool: + return output, nil + default: + return false, nil + } +} + +func evalVariables(rawObject any, vars map[string]string) (map[string]string, error) { + results := make(map[string]string) + for k, v := range vars { + + p, err := expr.Compile(v) + if err != nil { + return nil, err + } + + output, err := expr.Run(p, map[string]any{ + "event": rawObject, + }) + if err != nil { + return nil, err + } + + results[k] = fmt.Sprint(output) + } + + return results, nil +} diff --git a/components/orchestration/internal/triggers/trigger_test.go b/components/orchestration/internal/triggers/trigger_test.go new file mode 100644 index 0000000000..7af2ae4c60 --- /dev/null +++ b/components/orchestration/internal/triggers/trigger_test.go @@ -0,0 +1,82 @@ +package triggers + +import ( + "math" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestFilters(t *testing.T) { + t.Parallel() + + type testCase struct { + name string + object map[string]any + filter string + shouldBeOk bool + } + + testCases := []testCase{ + { + name: "nominal", + object: map[string]any{ + "a": map[string]any{ + "b": map[string]any{ + "c": 3, + }, + }, + }, + filter: "event.a.b.c == 3", + shouldBeOk: true, + }, + { + name: "comparison with $gt and float", + object: map[string]any{ + "a": map[string]any{ + "b": map[string]any{ + "c": math.Pi, + }, + }, + }, + filter: "event.a.b.c > 3", + shouldBeOk: true, + }, + { + name: "comparison with $lt and float", + object: map[string]any{ + "a": map[string]any{ + "b": map[string]any{ + "c": 3.14, + }, + }, + }, + filter: "event.a.b.c < 3.14", + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + ok, err := evalFilter(tc.object, tc.filter) + require.NoError(t, err) + require.Equal(t, tc.shouldBeOk, ok) + }) + } +} + +func TestEvalVariables(t *testing.T) { + evaluated, err := evalVariables(map[string]any{ + "metadata": map[string]any{ + "psp": "stripe", + }, + }, map[string]string{ + "psp": "event.metadata.psp", + }) + require.NoError(t, err) + require.Equal(t, map[string]string{ + "psp": "stripe", + }, evaluated) +} diff --git a/components/orchestration/internal/triggers/workflow_trigger.go b/components/orchestration/internal/triggers/workflow_trigger.go new file mode 100644 index 0000000000..6efeb566e2 --- /dev/null +++ b/components/orchestration/internal/triggers/workflow_trigger.go @@ -0,0 +1,59 @@ +package triggers + +import ( + "time" + + "github.com/formancehq/stack/libs/go-libs/publish" + "github.com/uptrace/bun" + temporalworkflow "go.temporal.io/sdk/workflow" +) + +type ProcessEventRequest struct { + MessageID string `json:"messageID"` + Event publish.EventMessage `json:"ledger"` +} + +type triggerWorkflow struct { + taskQueue string + db *bun.DB +} + +func (w triggerWorkflow) RunTrigger(ctx temporalworkflow.Context, req ProcessEventRequest) error { + + triggers := make([]Trigger, 0) + err := temporalworkflow.ExecuteActivity( + temporalworkflow.WithActivityOptions(ctx, temporalworkflow.ActivityOptions{ + StartToCloseTimeout: 10 * time.Second, + }), + ListTriggersActivity, + req, + ).Get(ctx, &triggers) + if err != nil { + return err + } + + for _, trigger := range triggers { + err := temporalworkflow.ExecuteActivity( + temporalworkflow.WithActivityOptions(ctx, temporalworkflow.ActivityOptions{ + StartToCloseTimeout: 10 * time.Second, + }), + ProcessEventActivity, + trigger, + req, + ).Get(ctx, nil) + if err != nil { + return err + } + } + + return nil +} + +func NewWorkflow(db *bun.DB, taskQueue string) *triggerWorkflow { + return &triggerWorkflow{ + db: db, + taskQueue: taskQueue, + } +} + +var RunTrigger = triggerWorkflow{}.RunTrigger diff --git a/components/orchestration/internal/triggers/workflow_trigger_test.go b/components/orchestration/internal/triggers/workflow_trigger_test.go new file mode 100644 index 0000000000..e22131163e --- /dev/null +++ b/components/orchestration/internal/triggers/workflow_trigger_test.go @@ -0,0 +1,46 @@ +package triggers + +import ( + "testing" + "time" + + "github.com/formancehq/stack/libs/go-libs/publish" + "github.com/google/uuid" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "go.temporal.io/sdk/testsuite" +) + +func TestWorkflow(t *testing.T) { + t.Parallel() + + testSuite := &testsuite.WorkflowTestSuite{} + + req := ProcessEventRequest{ + Event: publish.EventMessage{ + Date: time.Now().Round(time.Second).UTC(), + }, + } + + trigger := Trigger{ + TriggerData: TriggerData{ + Event: "NEW_TRANSACTION", + WorkflowID: "xxx", + }, + ID: uuid.NewString(), + } + + env := testSuite.NewTestWorkflowEnvironment() + env. + OnActivity(ListTriggersActivity, mock.Anything, req). + Once(). + Return([]Trigger{trigger}, nil) + env. + OnActivity(ProcessEventActivity, mock.Anything, trigger, req). + Once(). + Return(nil) + + env.ExecuteWorkflow(RunTrigger, req) + require.True(t, env.IsWorkflowCompleted()) + require.NoError(t, env.GetWorkflowError()) +} diff --git a/components/orchestration/internal/workflow/manager.go b/components/orchestration/internal/workflow/manager.go index f0e932060a..0217087b76 100644 --- a/components/orchestration/internal/workflow/manager.go +++ b/components/orchestration/internal/workflow/manager.go @@ -28,13 +28,13 @@ type Event struct { Name string `json:"name"` } -type Manager struct { +type WorkflowManager struct { db *bun.DB temporalClient client.Client taskQueue string } -func (m *Manager) Create(ctx context.Context, config Config) (*Workflow, error) { +func (m *WorkflowManager) Create(ctx context.Context, config Config) (*Workflow, error) { if err := config.Validate(); err != nil { return nil, err @@ -52,7 +52,7 @@ func (m *Manager) Create(ctx context.Context, config Config) (*Workflow, error) return &workflow, nil } -func (m *Manager) DeleteWorkflow(ctx context.Context, id string) error { +func (m *WorkflowManager) DeleteWorkflow(ctx context.Context, id string) error { var workflow Workflow @@ -73,14 +73,14 @@ func (m *Manager) DeleteWorkflow(ctx context.Context, id string) error { return nil } -func (m *Manager) RunWorkflow(ctx context.Context, id string, variables map[string]string) (Instance, error) { +func (m *WorkflowManager) RunWorkflow(ctx context.Context, id string, variables map[string]string) (*Instance, error) { workflow := Workflow{} if err := m.db.NewSelect(). Where("id = ?", id). Model(&workflow). Scan(ctx); err != nil { - return Instance{}, err + return nil, err } instance := NewInstance(id) @@ -89,7 +89,7 @@ func (m *Manager) RunWorkflow(ctx context.Context, id string, variables map[stri NewInsert(). Model(&instance). Exec(ctx); err != nil { - return Instance{}, err + return nil, err } _, err := m.temporalClient.ExecuteWorkflow(ctx, client.StartWorkflowOptions{ @@ -101,13 +101,13 @@ func (m *Manager) RunWorkflow(ctx context.Context, id string, variables map[stri Variables: variables, }) if err != nil { - return Instance{}, err + return nil, err } - return instance, nil + return &instance, nil } -func (m *Manager) Wait(ctx context.Context, instanceID string) error { +func (m *WorkflowManager) Wait(ctx context.Context, instanceID string) error { if err := m.temporalClient. GetWorkflow(ctx, instanceID, ""). Get(ctx, nil); err != nil { @@ -119,7 +119,7 @@ func (m *Manager) Wait(ctx context.Context, instanceID string) error { return nil } -func (m *Manager) ListWorkflows(ctx context.Context) ([]Workflow, error) { +func (m *WorkflowManager) ListWorkflows(ctx context.Context) ([]Workflow, error) { workflows := make([]Workflow, 0) if err := m.db.NewSelect(). Model(&workflows). @@ -130,7 +130,7 @@ func (m *Manager) ListWorkflows(ctx context.Context) ([]Workflow, error) { return workflows, nil } -func (m *Manager) ReadWorkflow(ctx context.Context, id string) (Workflow, error) { +func (m *WorkflowManager) ReadWorkflow(ctx context.Context, id string) (Workflow, error) { var workflow Workflow if err := m.db.NewSelect(). Model(&workflow). @@ -141,7 +141,7 @@ func (m *Manager) ReadWorkflow(ctx context.Context, id string) (Workflow, error) return workflow, nil } -func (m *Manager) PostEvent(ctx context.Context, instanceID string, event Event) error { +func (m *WorkflowManager) PostEvent(ctx context.Context, instanceID string, event Event) error { stage := Stage{} if err := m.db.NewSelect(). Model(&stage). @@ -160,7 +160,7 @@ func (m *Manager) PostEvent(ctx context.Context, instanceID string, event Event) return nil } -func (m *Manager) AbortRun(ctx context.Context, instanceID string) error { +func (m *WorkflowManager) AbortRun(ctx context.Context, instanceID string) error { instance := Instance{} if err := m.db.NewSelect(). Model(&instance). @@ -172,7 +172,7 @@ func (m *Manager) AbortRun(ctx context.Context, instanceID string) error { return m.temporalClient.CancelWorkflow(ctx, instanceID, "") } -func (m *Manager) ListInstances(ctx context.Context, workflowID string, running bool) ([]Instance, error) { +func (m *WorkflowManager) ListInstances(ctx context.Context, workflowID string, running bool) ([]Instance, error) { instances := make([]Instance, 0) query := m.db.NewSelect().Model(&instances) @@ -200,7 +200,7 @@ type StageHistory struct { TerminatedAt *time.Time `json:"terminatedAt,omitempty"` } -func (m *Manager) ReadInstanceHistory(ctx context.Context, instanceID string) ([]StageHistory, error) { +func (m *WorkflowManager) ReadInstanceHistory(ctx context.Context, instanceID string) ([]StageHistory, error) { historyIterator := m.temporalClient.GetWorkflowHistory(ctx, instanceID, "", false, enums.HISTORY_EVENT_FILTER_TYPE_ALL_EVENT) ret := make([]StageHistory, 0) @@ -263,7 +263,7 @@ type ActivityHistory struct { NextExecution *time.Time `json:"nextExecution,omitempty"` } -func (m *Manager) ReadStageHistory(ctx context.Context, instanceID string, stage int) ([]*ActivityHistory, error) { +func (m *WorkflowManager) ReadStageHistory(ctx context.Context, instanceID string, stage int) ([]*ActivityHistory, error) { stageID := fmt.Sprintf("%s-%d", instanceID, stage) described, err := m.temporalClient.DescribeWorkflowExecution(ctx, stageID, "") if err != nil { @@ -346,7 +346,7 @@ func (m *Manager) ReadStageHistory(ctx context.Context, instanceID string, stage return ret, nil } -func (m *Manager) GetInstance(ctx context.Context, instanceID string) (*Instance, error) { +func (m *WorkflowManager) GetInstance(ctx context.Context, instanceID string) (*Instance, error) { occurrence := Instance{} err := m.db.NewSelect(). Model(&occurrence). @@ -362,8 +362,8 @@ func (m *Manager) GetInstance(ctx context.Context, instanceID string) (*Instance return &occurrence, nil } -func NewManager(db *bun.DB, temporalClient client.Client, taskQueue string) *Manager { - return &Manager{ +func NewManager(db *bun.DB, temporalClient client.Client, taskQueue string) *WorkflowManager { + return &WorkflowManager{ db: db, temporalClient: temporalClient, taskQueue: taskQueue, diff --git a/components/orchestration/internal/workflow/module.go b/components/orchestration/internal/workflow/module.go index f9e8724420..a2d8ded884 100644 --- a/components/orchestration/internal/workflow/module.go +++ b/components/orchestration/internal/workflow/module.go @@ -1,13 +1,31 @@ package workflow import ( + "github.com/formancehq/orchestration/internal/workflow/activities" + "github.com/formancehq/orchestration/internal/workflow/stages" "github.com/uptrace/bun" "go.temporal.io/sdk/client" "go.uber.org/fx" ) func NewModule(taskQueue string) fx.Option { - return fx.Provide(func(db *bun.DB, temporalClient client.Client) *Manager { - return NewManager(db, temporalClient, taskQueue) - }) + ret := []fx.Option{ + fx.Provide(func(db *bun.DB, temporalClient client.Client) *WorkflowManager { + return NewManager(db, temporalClient, taskQueue) + }), + fx.Provide(fx.Annotate(NewWorkflows, fx.ResultTags(`group:"workflows"`), fx.As(new(any)))), + fx.Provide(fx.Annotate(activities.New, fx.ResultTags(`group:"activities"`), fx.As(new(any)))), + } + + for _, schema := range stages.All() { + ret = append(ret, fx.Supply( + fx.Annotate( + schema.GetWorkflow(), + fx.ResultTags(`group:"workflows"`), + fx.As(new(any)), + ), + )) + } + + return fx.Options(ret...) } diff --git a/components/orchestration/internal/workflow/stages/internal/context.go b/components/orchestration/internal/workflow/stages/internal/context.go index c77ff54f7d..bcdc342ad7 100644 --- a/components/orchestration/internal/workflow/stages/internal/context.go +++ b/components/orchestration/internal/workflow/stages/internal/context.go @@ -7,6 +7,13 @@ import ( "go.temporal.io/sdk/workflow" ) +const ( + ErrorCodeValidation = "VALIDATION" + ErrorCodeConflict = "CONFLICT" + ErrorCodeNoScript = "NO_SCRIPT" + ErrorCodeCompilationFailed = "COMPILATION_FAILED" +) + func InfiniteRetryContext(ctx workflow.Context) workflow.Context { return workflow.WithActivityOptions(ctx, workflow.ActivityOptions{ StartToCloseTimeout: 10 * time.Second, @@ -15,13 +22,10 @@ func InfiniteRetryContext(ctx workflow.Context) workflow.Context { BackoffCoefficient: 2, MaximumInterval: 100 * time.Second, NonRetryableErrorTypes: []string{ - //"INTERNAL", - //"INSUFFICIENT_FUND", - "VALIDATION", - "CONFLICT", - "NO_SCRIPT", - "COMPILATION_FAILED", - //"METADATA_OVERRIDE", + ErrorCodeValidation, + ErrorCodeConflict, + ErrorCodeNoScript, + ErrorCodeCompilationFailed, }, }, }) diff --git a/components/orchestration/internal/workflow/stages/internal/stagestesting/schema.go b/components/orchestration/internal/workflow/stages/internal/stagestesting/schema.go index 384749a3ad..cc9d10fe09 100644 --- a/components/orchestration/internal/workflow/stages/internal/stagestesting/schema.go +++ b/components/orchestration/internal/workflow/stages/internal/stagestesting/schema.go @@ -19,6 +19,8 @@ type SchemaTestCase struct { func TestSchema(t *testing.T, stageName string, testCase SchemaTestCase) { t.Run(testCase.Name, func(t *testing.T) { + t.Parallel() + variables := testCase.Variables if variables == nil { variables = map[string]string{} diff --git a/components/orchestration/internal/workflow/stages/internal/stagestesting/workflow.go b/components/orchestration/internal/workflow/stages/internal/stagestesting/workflow.go index 832397e098..4841ae8b4c 100644 --- a/components/orchestration/internal/workflow/stages/internal/stagestesting/workflow.go +++ b/components/orchestration/internal/workflow/stages/internal/stagestesting/workflow.go @@ -29,6 +29,8 @@ type WorkflowTestCase[T stages.Stage] struct { func RunWorkflowTest[T stages.Stage](t *testing.T, testCase WorkflowTestCase[T]) { t.Run(testCase.Name, func(t *testing.T) { + t.Parallel() + testSuite := &testsuite.WorkflowTestSuite{} env := testSuite.NewTestWorkflowEnvironment() diff --git a/components/orchestration/openapi.yaml b/components/orchestration/openapi.yaml index 1714a150cf..3bc720c0dc 100644 --- a/components/orchestration/openapi.yaml +++ b/components/orchestration/openapi.yaml @@ -20,6 +20,99 @@ paths: $ref: '#/components/schemas/ServerInfo' default: $ref: '#/components/responses/ErrorResponse' + /triggers: + get: + summary: List triggers + operationId: listTriggers + description: List triggers + tags: + - Orchestration + responses: + 200: + description: List of triggers + content: + application/json: + schema: + $ref: '#/components/schemas/ListTriggersResponse' + default: + $ref: '#/components/responses/ErrorResponse' + post: + summary: Create trigger + operationId: createTrigger + description: Create trigger + tags: + - Orchestration + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TriggerData' + responses: + 201: + description: Created trigger + content: + application/json: + schema: + $ref: '#/components/schemas/CreateTriggerResponse' + default: + $ref: '#/components/responses/ErrorResponse' + /triggers/{triggerID}: + parameters: + - name: triggerID + description: The trigger id + in: path + schema: + type: string + required: true + get: + summary: Read trigger + operationId: readTrigger + description: Read trigger + tags: + - Orchestration + responses: + 200: + description: A specific trigger + content: + application/json: + schema: + $ref: '#/components/schemas/ReadTriggerResponse' + default: + $ref: '#/components/responses/ErrorResponse' + delete: + summary: Delete trigger + operationId: deleteTrigger + description: Read trigger + tags: + - Orchestration + responses: + 204: + description: Trigger deleted + default: + $ref: '#/components/responses/ErrorResponse' + /triggers/{triggerID}/occurrences: + parameters: + - name: triggerID + description: The trigger id + in: path + schema: + type: string + required: true + get: + summary: List triggers occurrences + operationId: listTriggersOccurrences + description: List triggers occurrences + tags: + - Orchestration + responses: + 200: + description: List of triggers occurrences + content: + application/json: + schema: + $ref: '#/components/schemas/ListTriggersOccurrencesResponse' + default: + $ref: '#/components/responses/ErrorResponse' /workflows: get: summary: List registered workflows @@ -468,6 +561,66 @@ components: type: array required: - data + TriggerData: + type: object + required: + - event + - workflowID + properties: + event: + type: string + workflowID: + type: string + filter: + type: string + vars: + type: object + additionalProperties: true + Trigger: + allOf: + - $ref: '#/components/schemas/TriggerData' + - type: object + required: + - id + - createdAt + properties: + id: + type: string + createdAt: + type: string + format: date-time + TriggerOccurrence: + type: object + required: + - triggerID + - workflowInstanceID + - date + properties: + date: + type: string + format: date-time + workflowInstanceID: + type: string + triggerID: + type: string + ListTriggersOccurrencesResponse: + type: object + properties: + data: + items: + $ref: '#/components/schemas/TriggerOccurrence' + type: array + required: + - data + ListTriggersResponse: + type: object + properties: + data: + items: + $ref: '#/components/schemas/Trigger' + type: array + required: + - data ReadWorkflowResponse: type: object required: @@ -484,6 +637,13 @@ components: properties: data: $ref: '#/components/schemas/Workflow' + CreateTriggerResponse: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Trigger' RunWorkflowRequest: type: object additionalProperties: @@ -1216,6 +1376,14 @@ components: data: $ref: '#/components/schemas/Account' + ReadTriggerResponse: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Trigger' + Account: type: object required: diff --git a/components/payments/go.mod b/components/payments/go.mod index 987a4c7b82..9b6e2e256d 100644 --- a/components/payments/go.mod +++ b/components/payments/go.mod @@ -11,7 +11,7 @@ require ( github.com/get-momo/atlar-v1-go-client v1.1.0 github.com/gibson042/canonicaljson-go v1.0.3 github.com/go-openapi/runtime v0.26.0 - github.com/go-openapi/strfmt v0.21.7 + github.com/go-openapi/strfmt v0.21.8 github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.1 github.com/gorilla/mux v1.8.0 @@ -26,15 +26,15 @@ require ( github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.8.4 github.com/stripe/stripe-go/v72 v72.122.0 - github.com/uptrace/bun v1.1.14 - github.com/uptrace/bun/dialect/pgdialect v1.1.14 - github.com/uptrace/bun/extra/bundebug v1.1.14 - github.com/uptrace/bun/extra/bunotel v1.1.14 + github.com/uptrace/bun v1.1.16 + github.com/uptrace/bun/dialect/pgdialect v1.1.16 + github.com/uptrace/bun/extra/bundebug v1.1.16 + github.com/uptrace/bun/extra/bunotel v1.1.16 go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.39.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 - go.opentelemetry.io/otel v1.16.0 - go.opentelemetry.io/otel/metric v1.16.0 - go.opentelemetry.io/otel/trace v1.16.0 + go.opentelemetry.io/otel v1.17.0 + go.opentelemetry.io/otel/metric v1.17.0 + go.opentelemetry.io/otel/trace v1.17.0 go.uber.org/dig v1.16.1 go.uber.org/fx v1.19.1 go.uber.org/mock v0.3.0 @@ -107,7 +107,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae // indirect github.com/nats-io/nats.go v1.28.0 // indirect - github.com/nats-io/nkeys v0.4.6 // indirect + github.com/nats-io/nkeys v0.4.4 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect @@ -130,7 +130,7 @@ require ( github.com/tklauser/numcpus v0.6.0 // indirect github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 // indirect - github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.1 // indirect + github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 // indirect github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 // indirect github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect @@ -162,11 +162,11 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.12.0 // indirect golang.org/x/mod v0.11.0 // indirect golang.org/x/net v0.14.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/tools v0.7.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect diff --git a/components/payments/go.sum b/components/payments/go.sum index 3f9ef65604..2b0baba2a8 100644 --- a/components/payments/go.sum +++ b/components/payments/go.sum @@ -779,8 +779,8 @@ github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6 github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg= -github.com/go-openapi/strfmt v0.21.7 h1:rspiXgNWgeUzhjo1YU01do6qsahtJNByjLVbPLNHb8k= -github.com/go-openapi/strfmt v0.21.7/go.mod h1:adeGTkxE44sPyLk0JV235VQAO/ZXUr8KAzYjclFs3ew= +github.com/go-openapi/strfmt v0.21.8 h1:VYBUoKYRLAlgKDrIxR/I0lKrztDQ0tuTDrbhLVP8Erg= +github.com/go-openapi/strfmt v0.21.8/go.mod h1:adeGTkxE44sPyLk0JV235VQAO/ZXUr8KAzYjclFs3ew= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= @@ -1041,8 +1041,8 @@ github.com/nats-io/jwt/v2 v2.5.0 h1:WQQ40AAlqqfx+f6ku+i0pOVm+ASirD4fUh+oQsiE9Ak= github.com/nats-io/nats-server/v2 v2.9.23 h1:6Wj6H6QpP9FMlpCyWUaNu2yeZ/qGj+mdRkZ1wbikExU= github.com/nats-io/nats.go v1.28.0 h1:Th4G6zdsz2d0OqXdfzKLClo6bOfoI/b1kInhRtFIy5c= github.com/nats-io/nats.go v1.28.0/go.mod h1:XpbWUlOElGwTYbMR7imivs7jJj9GtK7ypv321Wp6pjc= -github.com/nats-io/nkeys v0.4.6 h1:IzVe95ru2CT6ta874rt9saQRkWfe2nFj1NtvYSLqMzY= -github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= +github.com/nats-io/nkeys v0.4.4 h1:xvBJ8d69TznjcQl9t6//Q5xXuVhyYiSos6RPtvQNTwA= +github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -1161,18 +1161,18 @@ github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYm github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= -github.com/uptrace/bun v1.1.14 h1:S5vvNnjEynJ0CvnrBOD7MIRW7q/WbtvFXrdfy0lddAM= -github.com/uptrace/bun v1.1.14/go.mod h1:RHk6DrIisO62dv10pUOJCz5MphXThuOTpVNYEYv7NI8= -github.com/uptrace/bun/dialect/pgdialect v1.1.14 h1:b7+V1KDJPQSFYgkG/6YLXCl2uvwEY3kf/GSM7hTHRDY= -github.com/uptrace/bun/dialect/pgdialect v1.1.14/go.mod h1:v6YiaXmnKQ2FlhRD2c0ZfKd+QXH09pYn4H8ojaavkKk= -github.com/uptrace/bun/extra/bundebug v1.1.14 h1:9OCGfP9ZDlh41u6OLerWdhBtJAVGXHr0xtxO4xWi6t0= -github.com/uptrace/bun/extra/bundebug v1.1.14/go.mod h1:lto3guzS2v6mnQp1+akyE+ecBLOltevDDe324NXEYdw= -github.com/uptrace/bun/extra/bunotel v1.1.14 h1:jKA1zNfD2/Y/O3eFP15ao+V0cMigXN+ReNbsVUqrOhg= -github.com/uptrace/bun/extra/bunotel v1.1.14/go.mod h1:BBuePZ4ciMqoeyRfef4GL7Z75FsiOm3Q3fvNt0z4sQk= +github.com/uptrace/bun v1.1.16 h1:cn9cgEMFwcyYRsQLfxCRMUxyK1WaHwOVrR3TvzEFZ/A= +github.com/uptrace/bun v1.1.16/go.mod h1:7HnsMRRvpLFUcquJxp22JO8PsWKpFQO/gNXqqsuGWg8= +github.com/uptrace/bun/dialect/pgdialect v1.1.16 h1:eUPZ+YCJ69BA+W1X1ZmpOJSkv1oYtinr0zCXf7zCo5g= +github.com/uptrace/bun/dialect/pgdialect v1.1.16/go.mod h1:KQjfx/r6JM0OXfbv0rFrxAbdkPD7idK8VitnjIV9fZI= +github.com/uptrace/bun/extra/bundebug v1.1.16 h1:SgicRQGtnjhrIhlYOxdkOm1Em4s6HykmT3JblHnoTBM= +github.com/uptrace/bun/extra/bundebug v1.1.16/go.mod h1:SkiOkfUirBiO1Htc4s5bQKEq+JSeU1TkBVpMsPz2ePM= +github.com/uptrace/bun/extra/bunotel v1.1.16 h1:qkLTaTZK3FZk3b2P/stO/krS7KX9Fq5wSOj7Hlb2HG8= +github.com/uptrace/bun/extra/bunotel v1.1.16/go.mod h1:JwEH0kdXFnzYuK8D6eXUrf9HKsYy5wmB+lqQ/+dvH4E= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 h1:OXsouNDvuET5o1A4uvoCnAXuuNke8JlfZWceciyUlC8= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21/go.mod h1:Xm3wlRGm5xzdAGPOvqydXPiGj0Da1q0OlUNm7Utoda4= -github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.1 h1:sCYkntVVoSMuQuyRBaEkedb1qS1KeJJaqKbdtNfTsfM= -github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.1/go.mod h1:1frv9RN1rlTq0jzCq+mVuEQisubZCQ4OU6S/8CaHzGY= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 h1:USRngIQppxeyb39XzkVHXwQesKK0+JSwnHE/1c7fgic= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2/go.mod h1:1frv9RN1rlTq0jzCq+mVuEQisubZCQ4OU6S/8CaHzGY= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 h1:HCqo51kNF8wxDMDhxcN5S6DlfZXigMtptRpkvjBCeVc= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21/go.mod h1:2MNqrUmDrt5E0glMuoJI/9FyGVpBKo1FqjSH60UOZFg= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -1232,8 +1232,8 @@ go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0 h1:EbmAUG9hEAMXyfWEa go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0/go.mod h1:rD9feqRYP24P14t5kmhNMqsqm1jvKmpx2H2rKVw52V8= go.opentelemetry.io/contrib/propagators/b3 v1.14.0 h1:0SBc35DESy/YXShxFtu3634OwcEWJoGzSA8Hx/NbOo8= go.opentelemetry.io/contrib/propagators/b3 v1.14.0/go.mod h1:A76N3hFhcmXo+tkmn6SE1x0AQv1JwFyiJXMclWzy/YQ= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= @@ -1254,14 +1254,14 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 h1:fl2WmyenEf6LYY go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0/go.mod h1:csyQxQ0UHHKVA8KApS7eUO/klMO5sd/av5CNZNU4O6w= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= @@ -1295,9 +1295,8 @@ golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1564,8 +1563,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1593,9 +1592,8 @@ golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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= diff --git a/components/reconciliation/go.mod b/components/reconciliation/go.mod index d5929d3de3..dc8f37eca3 100644 --- a/components/reconciliation/go.mod +++ b/components/reconciliation/go.mod @@ -11,6 +11,7 @@ require ( github.com/riandyrn/otelchi v0.5.1 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.17.0 + github.com/stretchr/testify v1.8.4 go.uber.org/fx v1.20.1 golang.org/x/oauth2 v0.12.0 golang.org/x/sync v0.3.0 @@ -48,7 +49,6 @@ require ( github.com/spf13/afero v1.10.0 // indirect github.com/spf13/cast v1.5.1 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.8.4 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect @@ -60,7 +60,7 @@ require ( go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.13.0 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel v1.17.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.39.0 // indirect @@ -71,10 +71,10 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.17.0 // indirect go.opentelemetry.io/otel/sdk v1.16.0 // indirect go.opentelemetry.io/otel/sdk/metric v0.39.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.17.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.17.0 // indirect diff --git a/components/reconciliation/go.sum b/components/reconciliation/go.sum index a1b289f9fb..ef230cd7b0 100644 --- a/components/reconciliation/go.sum +++ b/components/reconciliation/go.sum @@ -286,8 +286,8 @@ go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0/go.mod h1:rD9feqRYP2 go.opentelemetry.io/contrib/propagators/b3 v1.13.0 h1:f17PBmZK60RoHvOpJVqEka8oS2EXjpjHquESD/8zZ50= go.opentelemetry.io/contrib/propagators/b3 v1.13.0/go.mod h1:zy2hz1TpGUoJzSwlBchVGvVAFQS8s2pglKLbrAFZ+Sc= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= @@ -308,16 +308,16 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 h1:fl2WmyenEf6LYY go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0/go.mod h1:csyQxQ0UHHKVA8KApS7eUO/klMO5sd/av5CNZNU4O6w= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= diff --git a/components/search/go.mod b/components/search/go.mod index 0abd9af09b..670a1a4b3d 100644 --- a/components/search/go.mod +++ b/components/search/go.mod @@ -12,11 +12,11 @@ require ( github.com/pkg/errors v0.9.1 github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.3 + github.com/stretchr/testify v1.8.4 github.com/tidwall/gjson v1.14.4 go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.39.0 - go.opentelemetry.io/otel v1.16.0 - go.opentelemetry.io/otel/trace v1.16.0 + go.opentelemetry.io/otel v1.17.0 + go.opentelemetry.io/otel/trace v1.17.0 go.uber.org/fx v1.19.1 ) @@ -60,7 +60,7 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.17.0 // indirect go.opentelemetry.io/otel/sdk v1.16.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/atomic v1.10.0 // indirect @@ -68,8 +68,8 @@ require ( go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.12.0 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect google.golang.org/grpc v1.56.3 // indirect google.golang.org/protobuf v1.30.0 // indirect diff --git a/components/search/go.sum b/components/search/go.sum index e33ca7fba6..79e1ab1cd3 100644 --- a/components/search/go.sum +++ b/components/search/go.sum @@ -245,8 +245,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= @@ -276,8 +276,8 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8= go.opentelemetry.io/contrib/propagators/b3 v1.14.0 h1:0SBc35DESy/YXShxFtu3634OwcEWJoGzSA8Hx/NbOo8= go.opentelemetry.io/contrib/propagators/b3 v1.14.0/go.mod h1:A76N3hFhcmXo+tkmn6SE1x0AQv1JwFyiJXMclWzy/YQ= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= @@ -290,12 +290,12 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 h1:iqjq9 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0/go.mod h1:hGXzO5bhhSHZnKvrDaXB82Y9DRFour0Nz/KrBh7reWw= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -444,8 +444,8 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 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= @@ -455,8 +455,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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= diff --git a/components/stargate/go.mod b/components/stargate/go.mod index c51eecbc98..1a958d1904 100644 --- a/components/stargate/go.mod +++ b/components/stargate/go.mod @@ -23,8 +23,8 @@ require ( github.com/stretchr/testify v1.8.4 github.com/zitadel/oidc v1.13.4 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 - go.opentelemetry.io/otel v1.16.0 - go.opentelemetry.io/otel/metric v1.16.0 + go.opentelemetry.io/otel v1.17.0 + go.opentelemetry.io/otel/metric v1.17.0 go.uber.org/fx v1.19.1 golang.org/x/net v0.10.0 golang.org/x/oauth2 v0.7.0 @@ -128,7 +128,7 @@ require ( go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect go.opentelemetry.io/otel/sdk v1.16.0 // indirect go.opentelemetry.io/otel/sdk/metric v0.39.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.17.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.16.1 // indirect diff --git a/components/stargate/go.sum b/components/stargate/go.sum index 04019b6b22..649b7a8549 100644 --- a/components/stargate/go.sum +++ b/components/stargate/go.sum @@ -466,8 +466,8 @@ go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0/go.mod h1:rD9feqRYP2 go.opentelemetry.io/contrib/propagators/b3 v1.14.0 h1:0SBc35DESy/YXShxFtu3634OwcEWJoGzSA8Hx/NbOo8= go.opentelemetry.io/contrib/propagators/b3 v1.14.0/go.mod h1:A76N3hFhcmXo+tkmn6SE1x0AQv1JwFyiJXMclWzy/YQ= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= @@ -488,16 +488,16 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 h1:fl2WmyenEf6LYY go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0/go.mod h1:csyQxQ0UHHKVA8KApS7eUO/klMO5sd/av5CNZNU4O6w= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= diff --git a/components/wallets/go.mod b/components/wallets/go.mod index 4276579113..17494ad5a7 100644 --- a/components/wallets/go.mod +++ b/components/wallets/go.mod @@ -12,7 +12,7 @@ require ( github.com/riandyrn/otelchi v0.5.1 github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.3 + github.com/stretchr/testify v1.8.4 go.uber.org/fx v1.19.2 golang.org/x/oauth2 v0.7.0 ) @@ -49,24 +49,24 @@ require ( go.opentelemetry.io/contrib v1.14.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.14.0 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel v1.17.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.17.0 // indirect go.opentelemetry.io/otel/sdk v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.17.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.16.1 // indirect go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.12.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect google.golang.org/grpc v1.56.3 // indirect diff --git a/components/wallets/go.sum b/components/wallets/go.sum index ed7e63877f..d0649f3d8d 100644 --- a/components/wallets/go.sum +++ b/components/wallets/go.sum @@ -238,8 +238,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 h1:OXsouNDvuET5o1A4uvoCnAXuuNke8JlfZWceciyUlC8= @@ -264,8 +264,8 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1: go.opentelemetry.io/contrib/propagators/b3 v1.14.0 h1:0SBc35DESy/YXShxFtu3634OwcEWJoGzSA8Hx/NbOo8= go.opentelemetry.io/contrib/propagators/b3 v1.14.0/go.mod h1:A76N3hFhcmXo+tkmn6SE1x0AQv1JwFyiJXMclWzy/YQ= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= @@ -278,14 +278,14 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 h1:iqjq9 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0/go.mod h1:hGXzO5bhhSHZnKvrDaXB82Y9DRFour0Nz/KrBh7reWw= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -434,8 +434,8 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 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= @@ -444,8 +444,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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= diff --git a/components/webhooks/go.mod b/components/webhooks/go.mod index 505aa3ffcb..d3982227f0 100644 --- a/components/webhooks/go.mod +++ b/components/webhooks/go.mod @@ -14,11 +14,11 @@ require ( github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.3 - github.com/uptrace/bun v1.1.14 - github.com/uptrace/bun/dialect/pgdialect v1.1.14 + github.com/stretchr/testify v1.8.4 + github.com/uptrace/bun v1.1.16 + github.com/uptrace/bun/dialect/pgdialect v1.1.16 github.com/uptrace/bun/driver/pgdriver v1.1.14 - github.com/uptrace/bun/extra/bunotel v1.1.14 + github.com/uptrace/bun/extra/bunotel v1.1.16 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 go.uber.org/fx v1.19.2 ) @@ -72,7 +72,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae // indirect github.com/nats-io/nats.go v1.28.0 // indirect - github.com/nats-io/nkeys v0.4.6 // indirect + github.com/nats-io/nkeys v0.4.4 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect @@ -89,7 +89,7 @@ require ( github.com/subosito/gotenv v1.4.2 // indirect github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 // indirect - github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.1 // indirect + github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 // indirect github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 // indirect github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect @@ -102,26 +102,26 @@ require ( go.opentelemetry.io/contrib v1.14.0 // indirect go.opentelemetry.io/contrib/instrumentation/github.com/Shopify/sarama/otelsarama v0.42.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.14.0 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel v1.17.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.17.0 // indirect go.opentelemetry.io/otel/sdk v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.17.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.16.1 // indirect go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.12.0 // indirect golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/tools v0.6.0 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect google.golang.org/grpc v1.56.3 // indirect diff --git a/components/webhooks/go.sum b/components/webhooks/go.sum index 812c26f92b..e4c91ffe31 100644 --- a/components/webhooks/go.sum +++ b/components/webhooks/go.sum @@ -313,8 +313,8 @@ github.com/nats-io/jwt/v2 v2.5.0 h1:WQQ40AAlqqfx+f6ku+i0pOVm+ASirD4fUh+oQsiE9Ak= github.com/nats-io/nats-server/v2 v2.9.23 h1:6Wj6H6QpP9FMlpCyWUaNu2yeZ/qGj+mdRkZ1wbikExU= github.com/nats-io/nats.go v1.28.0 h1:Th4G6zdsz2d0OqXdfzKLClo6bOfoI/b1kInhRtFIy5c= github.com/nats-io/nats.go v1.28.0/go.mod h1:XpbWUlOElGwTYbMR7imivs7jJj9GtK7ypv321Wp6pjc= -github.com/nats-io/nkeys v0.4.6 h1:IzVe95ru2CT6ta874rt9saQRkWfe2nFj1NtvYSLqMzY= -github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= +github.com/nats-io/nkeys v0.4.4 h1:xvBJ8d69TznjcQl9t6//Q5xXuVhyYiSos6RPtvQNTwA= +github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= @@ -391,25 +391,25 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= -github.com/uptrace/bun v1.1.14 h1:S5vvNnjEynJ0CvnrBOD7MIRW7q/WbtvFXrdfy0lddAM= -github.com/uptrace/bun v1.1.14/go.mod h1:RHk6DrIisO62dv10pUOJCz5MphXThuOTpVNYEYv7NI8= -github.com/uptrace/bun/dialect/pgdialect v1.1.14 h1:b7+V1KDJPQSFYgkG/6YLXCl2uvwEY3kf/GSM7hTHRDY= -github.com/uptrace/bun/dialect/pgdialect v1.1.14/go.mod h1:v6YiaXmnKQ2FlhRD2c0ZfKd+QXH09pYn4H8ojaavkKk= +github.com/uptrace/bun v1.1.16 h1:cn9cgEMFwcyYRsQLfxCRMUxyK1WaHwOVrR3TvzEFZ/A= +github.com/uptrace/bun v1.1.16/go.mod h1:7HnsMRRvpLFUcquJxp22JO8PsWKpFQO/gNXqqsuGWg8= +github.com/uptrace/bun/dialect/pgdialect v1.1.16 h1:eUPZ+YCJ69BA+W1X1ZmpOJSkv1oYtinr0zCXf7zCo5g= +github.com/uptrace/bun/dialect/pgdialect v1.1.16/go.mod h1:KQjfx/r6JM0OXfbv0rFrxAbdkPD7idK8VitnjIV9fZI= github.com/uptrace/bun/driver/pgdriver v1.1.14 h1:V2Etm7mLGS3mhx8ddxZcUnwZLX02Jmq9JTlo0sNVDhA= github.com/uptrace/bun/driver/pgdriver v1.1.14/go.mod h1:D4FjWV9arDYct6sjMJhFoyU71SpllZRHXFRRP2Kd0Kw= -github.com/uptrace/bun/extra/bunotel v1.1.14 h1:jKA1zNfD2/Y/O3eFP15ao+V0cMigXN+ReNbsVUqrOhg= -github.com/uptrace/bun/extra/bunotel v1.1.14/go.mod h1:BBuePZ4ciMqoeyRfef4GL7Z75FsiOm3Q3fvNt0z4sQk= +github.com/uptrace/bun/extra/bunotel v1.1.16 h1:qkLTaTZK3FZk3b2P/stO/krS7KX9Fq5wSOj7Hlb2HG8= +github.com/uptrace/bun/extra/bunotel v1.1.16/go.mod h1:JwEH0kdXFnzYuK8D6eXUrf9HKsYy5wmB+lqQ/+dvH4E= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 h1:OXsouNDvuET5o1A4uvoCnAXuuNke8JlfZWceciyUlC8= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21/go.mod h1:Xm3wlRGm5xzdAGPOvqydXPiGj0Da1q0OlUNm7Utoda4= -github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.1 h1:sCYkntVVoSMuQuyRBaEkedb1qS1KeJJaqKbdtNfTsfM= -github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.1/go.mod h1:1frv9RN1rlTq0jzCq+mVuEQisubZCQ4OU6S/8CaHzGY= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 h1:USRngIQppxeyb39XzkVHXwQesKK0+JSwnHE/1c7fgic= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2/go.mod h1:1frv9RN1rlTq0jzCq+mVuEQisubZCQ4OU6S/8CaHzGY= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 h1:HCqo51kNF8wxDMDhxcN5S6DlfZXigMtptRpkvjBCeVc= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21/go.mod h1:2MNqrUmDrt5E0glMuoJI/9FyGVpBKo1FqjSH60UOZFg= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -453,8 +453,8 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1: go.opentelemetry.io/contrib/propagators/b3 v1.14.0 h1:0SBc35DESy/YXShxFtu3634OwcEWJoGzSA8Hx/NbOo8= go.opentelemetry.io/contrib/propagators/b3 v1.14.0/go.mod h1:A76N3hFhcmXo+tkmn6SE1x0AQv1JwFyiJXMclWzy/YQ= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= @@ -467,14 +467,14 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 h1:iqjq9 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0/go.mod h1:hGXzO5bhhSHZnKvrDaXB82Y9DRFour0Nz/KrBh7reWw= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -499,8 +499,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-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= 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= @@ -648,8 +648,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -662,8 +662,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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= diff --git a/libs/go-libs/bun/bunconnect/connect.go b/libs/go-libs/bun/bunconnect/connect.go new file mode 100644 index 0000000000..217a0999fa --- /dev/null +++ b/libs/go-libs/bun/bunconnect/connect.go @@ -0,0 +1,73 @@ +package bunconnect + +import ( + "database/sql" + "fmt" + "github.com/formancehq/stack/libs/go-libs/bun/bundebug" + "github.com/uptrace/bun" + "github.com/uptrace/bun/dialect/pgdialect" + "github.com/uptrace/bun/extra/bunotel" + "io" + "net/url" + "time" +) + +type ConnectionOptions struct { + DatabaseSourceName string + Debug bool + Writer io.Writer + MaxIdleConns int + MaxOpenConns int + ConnMaxIdleTime time.Duration +} + +func (opts ConnectionOptions) String() string { + return fmt.Sprintf("dsn=%s, debug=%v, max-idle-conns=%d, max-open-conns=%d, conn-max-idle-time=%s", + opts.DatabaseSourceName, opts.Debug, opts.MaxIdleConns, opts.MaxOpenConns, opts.ConnMaxIdleTime) +} + +func OpenSQLDB(options ConnectionOptions, hooks ...bun.QueryHook) (*bun.DB, error) { + sqldb, err := sql.Open("postgres", options.DatabaseSourceName) + if err != nil { + return nil, err + } + if options.MaxIdleConns != 0 { + sqldb.SetMaxIdleConns(options.MaxIdleConns) + } + if options.ConnMaxIdleTime != 0 { + sqldb.SetConnMaxIdleTime(options.ConnMaxIdleTime) + } + if options.MaxOpenConns != 0 { + sqldb.SetMaxOpenConns(options.MaxOpenConns) + } + + db := bun.NewDB(sqldb, pgdialect.New(), bun.WithDiscardUnknownColumns()) + if options.Debug { + db.AddQueryHook(bundebug.NewQueryHook()) + } + db.AddQueryHook(bunotel.NewQueryHook()) + for _, hook := range hooks { + db.AddQueryHook(hook) + } + + if err := db.Ping(); err != nil { + return nil, err + } + + return db, nil +} + +func OpenDBWithSchema(connectionOptions ConnectionOptions, schema string, hooks ...bun.QueryHook) (*bun.DB, error) { + parsedConnectionParams, err := url.Parse(connectionOptions.DatabaseSourceName) + if err != nil { + return nil, err + } + + query := parsedConnectionParams.Query() + query.Set("search_path", schema) + parsedConnectionParams.RawQuery = query.Encode() + + connectionOptions.DatabaseSourceName = parsedConnectionParams.String() + + return OpenSQLDB(connectionOptions, hooks...) +} diff --git a/libs/go-libs/bun/bunpaginate/bigint.go b/libs/go-libs/bun/bunpaginate/bigint.go new file mode 100644 index 0000000000..cc4d5c0ce5 --- /dev/null +++ b/libs/go-libs/bun/bunpaginate/bigint.go @@ -0,0 +1,92 @@ +package bunpaginate + +import ( + "database/sql" + "database/sql/driver" + "encoding/json" + "fmt" + "math/big" +) + +type BigInt big.Int + +func (i *BigInt) MarshalJSON() ([]byte, error) { + return json.Marshal(i.ToMathBig()) +} + +func (i *BigInt) UnmarshalJSON(bytes []byte) error { + v, err := i.FromString(string(bytes)) + if err != nil { + return err + } + *i = *v + return nil +} + +func NewInt() *BigInt { + return new(BigInt) +} +func newBigint(x *big.Int) *BigInt { + return (*BigInt)(x) +} + +// same as NewBigint() +func FromMathBig(x *big.Int) *BigInt { + return (*BigInt)(x) +} + +func FromInt64(x int64) *BigInt { + return FromMathBig(big.NewInt(x)) +} + +func (i *BigInt) FromString(x string) (*BigInt, error) { + if x == "" { + return FromInt64(0), nil + } + a := big.NewInt(0) + b, ok := a.SetString(x, 10) + + if !ok { + return nil, fmt.Errorf("cannot create Int from string") + } + + return newBigint(b), nil +} + +func (b *BigInt) Value() (driver.Value, error) { + return (*big.Int)(b).String(), nil +} + +func (b *BigInt) Set(v *BigInt) *BigInt { + return (*BigInt)((*big.Int)(b).Set((*big.Int)(v))) +} + +func (b *BigInt) Sub(x *BigInt, y *BigInt) *BigInt { + return (*BigInt)((*big.Int)(b).Sub((*big.Int)(x), (*big.Int)(y))) +} + +func (b *BigInt) Scan(value interface{}) error { + + var i sql.NullString + + if err := i.Scan(value); err != nil { + return err + } + + if _, ok := (*big.Int)(b).SetString(i.String, 10); ok { + return nil + } + + return fmt.Errorf("Error converting type %T into Bigint", value) +} + +func (b *BigInt) ToMathBig() *big.Int { + return (*big.Int)(b) +} + +func (i *BigInt) Cmp(bottom *BigInt) int { + return (*big.Int)(i).Cmp((*big.Int)(bottom)) +} + +var _ json.Unmarshaler = (*BigInt)(nil) +var _ json.Marshaler = (*BigInt)(nil) diff --git a/libs/go-libs/bun/bunpaginate/iterate.go b/libs/go-libs/bun/bunpaginate/iterate.go new file mode 100644 index 0000000000..7bad5c8c84 --- /dev/null +++ b/libs/go-libs/bun/bunpaginate/iterate.go @@ -0,0 +1,36 @@ +package bunpaginate + +import ( + "context" + "reflect" + + sharedapi "github.com/formancehq/stack/libs/go-libs/api" + "github.com/pkg/errors" +) + +func Iterate[T any, Q any](ctx context.Context, q Q, iterator func(ctx context.Context, q Q) (*sharedapi.Cursor[T], error), cb func(cursor *sharedapi.Cursor[T]) error) error { + + for { + cursor, err := iterator(ctx, q) + if err != nil { + return err + } + + if err := cb(cursor); err != nil { + return err + } + + if !cursor.HasMore { + break + } + + newQuery := reflect.New(reflect.TypeOf(q)) + if err := UnmarshalCursor(cursor.Next, newQuery.Interface()); err != nil { + return errors.Wrap(err, "paginating next request") + } + + q = newQuery.Elem().Interface().(Q) + } + + return nil +} diff --git a/libs/go-libs/bun/bunpaginate/main_test.go b/libs/go-libs/bun/bunpaginate/main_test.go new file mode 100644 index 0000000000..f00ab5d5a2 --- /dev/null +++ b/libs/go-libs/bun/bunpaginate/main_test.go @@ -0,0 +1,22 @@ +package bunpaginate_test + +import ( + "os" + "testing" + + "github.com/formancehq/stack/libs/go-libs/logging" + "github.com/formancehq/stack/libs/go-libs/pgtesting" +) + +func TestMain(m *testing.M) { + if err := pgtesting.CreatePostgresServer(); err != nil { + logging.Error(err) + os.Exit(1) + } + + code := m.Run() + if err := pgtesting.DestroyPostgresServer(); err != nil { + logging.Error(err) + } + os.Exit(code) +} diff --git a/libs/go-libs/bun/bunpaginate/pagination.go b/libs/go-libs/bun/bunpaginate/pagination.go new file mode 100644 index 0000000000..858728dd1c --- /dev/null +++ b/libs/go-libs/bun/bunpaginate/pagination.go @@ -0,0 +1,99 @@ +package bunpaginate + +import ( + "encoding/base64" + "encoding/json" + "math/big" +) + +const ( + OrderAsc = iota + OrderDesc + + QueryDefaultPageSize = 15 +) + +type Order int + +func (o Order) String() string { + switch o { + case OrderAsc: + return "ASC" + case OrderDesc: + return "DESC" + } + panic("should not happen") +} + +func (o Order) Reverse() Order { + return (o + 1) % 2 +} + +type ColumnPaginatedQuery[OPTIONS any] struct { + PageSize uint64 `json:"pageSize"` + Bottom *big.Int `json:"bottom"` + Column string `json:"column"` + PaginationID *big.Int `json:"paginationID"` + Order Order `json:"order"` + Options OPTIONS `json:"filters"` + Reverse bool `json:"reverse"` +} + +func (q *ColumnPaginatedQuery[PAYLOAD]) EncodeAsCursor() string { + return encodeCursor(q) +} + +func (a *ColumnPaginatedQuery[PAYLOAD]) WithPageSize(pageSize uint64) *ColumnPaginatedQuery[PAYLOAD] { + if pageSize != 0 { + a.PageSize = pageSize + } + + return a +} + +type OffsetPaginatedQuery[OPTIONS any] struct { + Offset uint64 `json:"offset"` + Order Order `json:"order"` + PageSize uint64 `json:"pageSize"` + Options OPTIONS `json:"filters"` +} + +func (q *OffsetPaginatedQuery[PAYLOAD]) EncodeAsCursor() string { + return encodeCursor(q) +} + +func (a *OffsetPaginatedQuery[PAYLOAD]) WithPageSize(pageSize uint64) *OffsetPaginatedQuery[PAYLOAD] { + if pageSize != 0 { + a.PageSize = pageSize + } + + return a +} + +func encodeCursor[T any](v *T) string { + if v == nil { + return "" + } + return EncodeCursor(*v) +} + +func EncodeCursor[T any](v T) string { + data, err := json.Marshal(v) + if err != nil { + panic(err) + } + return base64.RawURLEncoding.EncodeToString(data) +} + +func UnmarshalCursor(v string, to any) error { + res, err := base64.RawURLEncoding.DecodeString(v) + if err != nil { + return err + } + + if err := json.Unmarshal(res, &to); err != nil { + return err + } + + return nil +} diff --git a/libs/go-libs/bun/bunpaginate/pagination_column.go b/libs/go-libs/bun/bunpaginate/pagination_column.go new file mode 100644 index 0000000000..74cae26172 --- /dev/null +++ b/libs/go-libs/bun/bunpaginate/pagination_column.go @@ -0,0 +1,117 @@ +package bunpaginate + +import ( + "context" + "fmt" + "math/big" + "reflect" + "strings" + + "github.com/formancehq/stack/libs/go-libs/api" + "github.com/uptrace/bun" +) + +func UsingColumn[FILTERS any, ENTITY any](ctx context.Context, + sb *bun.SelectQuery, + query ColumnPaginatedQuery[FILTERS]) (*api.Cursor[ENTITY], error) { + ret := make([]ENTITY, 0) + + sb = sb.Limit(int(query.PageSize) + 1) // Fetch one additional item to find the next token + order := query.Order + if query.Reverse { + order = order.Reverse() + } + sb = sb.OrderExpr(fmt.Sprintf("%s %s", query.Column, order)) + + if query.PaginationID != nil { + if query.Reverse { + switch query.Order { + case OrderAsc: + sb = sb.Where(fmt.Sprintf("%s < ?", query.Column), query.PaginationID) + case OrderDesc: + sb = sb.Where(fmt.Sprintf("%s > ?", query.Column), query.PaginationID) + } + } else { + switch query.Order { + case OrderAsc: + sb = sb.Where(fmt.Sprintf("%s >= ?", query.Column), query.PaginationID) + case OrderDesc: + sb = sb.Where(fmt.Sprintf("%s <= ?", query.Column), query.PaginationID) + } + } + } + + if err := sb.Scan(ctx, &ret); err != nil { + return nil, err + } + var ( + paginatedColumnIndex = 0 + ) + typeOfT := reflect.TypeOf(ret).Elem() + for ; paginatedColumnIndex < typeOfT.NumField(); paginatedColumnIndex++ { + field := typeOfT.Field(paginatedColumnIndex) + tag := field.Tag.Get("bun") + column := strings.Split(tag, ",")[0] + if column == query.Column { + break + } + } + + var ( + paginationIDs = make([]*BigInt, 0) + ) + for _, t := range ret { + paginationID := reflect.ValueOf(t). + Field(paginatedColumnIndex). + Interface().(*BigInt) + if query.Bottom == nil { + query.Bottom = (*big.Int)(paginationID) + } + paginationIDs = append(paginationIDs, paginationID) + } + + hasMore := len(ret) > int(query.PageSize) + if hasMore { + ret = ret[:len(ret)-1] + } + if query.Reverse { + for i := 0; i < len(ret)/2; i++ { + ret[i], ret[len(ret)-i-1] = ret[len(ret)-i-1], ret[i] + } + } + + var previous, next *ColumnPaginatedQuery[FILTERS] + + if query.Reverse { + cp := query + cp.Reverse = false + next = &cp + + if hasMore { + cp := query + cp.PaginationID = (*big.Int)(paginationIDs[len(paginationIDs)-2]) + previous = &cp + } + } else { + if hasMore { + cp := query + cp.PaginationID = (*big.Int)(paginationIDs[len(paginationIDs)-1]) + next = &cp + } + if query.PaginationID != nil { + if (query.Order == OrderAsc && query.PaginationID.Cmp(query.Bottom) > 0) || (query.Order == OrderDesc && query.PaginationID.Cmp(query.Bottom) < 0) { + cp := query + cp.Reverse = true + previous = &cp + } + } + } + + return &api.Cursor[ENTITY]{ + PageSize: int(query.PageSize), + HasMore: next != nil, + Previous: previous.EncodeAsCursor(), + Next: next.EncodeAsCursor(), + Data: ret, + }, nil +} diff --git a/libs/go-libs/bun/bunpaginate/pagination_column_test.go b/libs/go-libs/bun/bunpaginate/pagination_column_test.go new file mode 100644 index 0000000000..dd442e0f4b --- /dev/null +++ b/libs/go-libs/bun/bunpaginate/pagination_column_test.go @@ -0,0 +1,346 @@ +package bunpaginate_test + +import ( + "context" + "github.com/formancehq/stack/libs/go-libs/bun/bunconnect" + bunpaginate2 "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "math/big" + "testing" + + "github.com/formancehq/stack/libs/go-libs/pgtesting" + "github.com/stretchr/testify/require" +) + +func TestColumnPagination(t *testing.T) { + t.Parallel() + + pgServer := pgtesting.NewPostgresDatabase(t) + db, err := bunconnect.OpenSQLDB(bunconnect.ConnectionOptions{ + DatabaseSourceName: pgServer.ConnString(), + Debug: testing.Verbose(), + }) + require.NoError(t, err) + t.Cleanup(func() { + _ = db.Close() + }) + + _, err = db.Exec(` + CREATE TABLE "models" (id int, pair boolean); + `) + require.NoError(t, err) + + type model struct { + ID *bunpaginate2.BigInt `bun:"id,type:numeric"` + Pair bool `bun:"pair"` + } + + models := make([]model, 0) + for i := 0; i < 100; i++ { + models = append(models, model{ + ID: (*bunpaginate2.BigInt)(big.NewInt(int64(i))), + Pair: i%2 == 0, + }) + } + + _, err = db.NewInsert(). + Model(&models). + Exec(context.Background()) + require.NoError(t, err) + + type testCase struct { + name string + query bunpaginate2.ColumnPaginatedQuery[bool] + expectedNext *bunpaginate2.ColumnPaginatedQuery[bool] + expectedPrevious *bunpaginate2.ColumnPaginatedQuery[bool] + expectedNumberOfItems int64 + } + testCases := []testCase{ + { + name: "asc first page", + query: bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + Order: bunpaginate2.OrderAsc, + }, + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + PaginationID: big.NewInt(int64(10)), + Order: bunpaginate2.OrderAsc, + Bottom: big.NewInt(int64(0)), + }, + expectedNumberOfItems: 10, + }, + { + name: "asc second page using next cursor", + query: bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + PaginationID: big.NewInt(int64(10)), + Order: bunpaginate2.OrderAsc, + Bottom: big.NewInt(int64(0)), + }, + expectedPrevious: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + Order: bunpaginate2.OrderAsc, + Bottom: big.NewInt(int64(0)), + PaginationID: big.NewInt(int64(10)), + Reverse: true, + }, + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + PaginationID: big.NewInt(int64(20)), + Order: bunpaginate2.OrderAsc, + Bottom: big.NewInt(int64(0)), + }, + expectedNumberOfItems: 10, + }, + { + name: "asc last page using next cursor", + query: bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + PaginationID: big.NewInt(int64(90)), + Order: bunpaginate2.OrderAsc, + Bottom: big.NewInt(int64(0)), + }, + expectedPrevious: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + Order: bunpaginate2.OrderAsc, + PaginationID: big.NewInt(int64(90)), + Bottom: big.NewInt(int64(0)), + Reverse: true, + }, + expectedNumberOfItems: 10, + }, + { + name: "desc first page", + query: bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + Order: bunpaginate2.OrderDesc, + }, + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Bottom: big.NewInt(int64(99)), + Column: "id", + PaginationID: big.NewInt(int64(89)), + Order: bunpaginate2.OrderDesc, + }, + expectedNumberOfItems: 10, + }, + { + name: "desc second page using next cursor", + query: bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Bottom: big.NewInt(int64(99)), + Column: "id", + PaginationID: big.NewInt(int64(89)), + Order: bunpaginate2.OrderDesc, + }, + expectedPrevious: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Bottom: big.NewInt(int64(99)), + Column: "id", + PaginationID: big.NewInt(int64(89)), + Order: bunpaginate2.OrderDesc, + Reverse: true, + }, + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Bottom: big.NewInt(int64(99)), + Column: "id", + PaginationID: big.NewInt(int64(79)), + Order: bunpaginate2.OrderDesc, + }, + expectedNumberOfItems: 10, + }, + { + name: "desc last page using next cursor", + query: bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Bottom: big.NewInt(int64(99)), + Column: "id", + PaginationID: big.NewInt(int64(9)), + Order: bunpaginate2.OrderDesc, + }, + expectedPrevious: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Bottom: big.NewInt(int64(99)), + Column: "id", + PaginationID: big.NewInt(int64(9)), + Order: bunpaginate2.OrderDesc, + Reverse: true, + }, + expectedNumberOfItems: 10, + }, + { + name: "asc first page using previous cursor", + query: bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Bottom: big.NewInt(int64(0)), + Column: "id", + PaginationID: big.NewInt(int64(10)), + Order: bunpaginate2.OrderAsc, + Reverse: true, + }, + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Bottom: big.NewInt(int64(0)), + Column: "id", + PaginationID: big.NewInt(int64(10)), + Order: bunpaginate2.OrderAsc, + }, + expectedNumberOfItems: 10, + }, + { + name: "desc first page using previous cursor", + query: bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Bottom: big.NewInt(int64(99)), + Column: "id", + PaginationID: big.NewInt(int64(89)), + Order: bunpaginate2.OrderDesc, + Reverse: true, + }, + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Bottom: big.NewInt(int64(99)), + Column: "id", + PaginationID: big.NewInt(int64(89)), + Order: bunpaginate2.OrderDesc, + }, + expectedNumberOfItems: 10, + }, + { + name: "asc first page with filter", + query: bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + Order: bunpaginate2.OrderAsc, + Options: true, + }, + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + PaginationID: big.NewInt(int64(20)), + Order: bunpaginate2.OrderAsc, + Options: true, + Bottom: big.NewInt(int64(0)), + }, + expectedNumberOfItems: 10, + }, + { + name: "asc second page with filter", + query: bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + PaginationID: big.NewInt(int64(20)), + Order: bunpaginate2.OrderAsc, + Options: true, + Bottom: big.NewInt(int64(0)), + }, + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + PaginationID: big.NewInt(int64(40)), + Order: bunpaginate2.OrderAsc, + Options: true, + Bottom: big.NewInt(int64(0)), + }, + expectedPrevious: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + PaginationID: big.NewInt(int64(20)), + Order: bunpaginate2.OrderAsc, + Options: true, + Bottom: big.NewInt(int64(0)), + Reverse: true, + }, + expectedNumberOfItems: 10, + }, + { + name: "desc first page with filter", + query: bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + Order: bunpaginate2.OrderDesc, + Options: true, + }, + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + PaginationID: big.NewInt(int64(78)), + Order: bunpaginate2.OrderDesc, + Options: true, + Bottom: big.NewInt(int64(98)), + }, + expectedNumberOfItems: 10, + }, + { + name: "desc second page with filter", + query: bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + PaginationID: big.NewInt(int64(78)), + Order: bunpaginate2.OrderDesc, + Options: true, + Bottom: big.NewInt(int64(98)), + }, + expectedNext: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + PaginationID: big.NewInt(int64(58)), + Order: bunpaginate2.OrderDesc, + Options: true, + Bottom: big.NewInt(int64(98)), + }, + expectedPrevious: &bunpaginate2.ColumnPaginatedQuery[bool]{ + PageSize: 10, + Column: "id", + PaginationID: big.NewInt(int64(78)), + Order: bunpaginate2.OrderDesc, + Options: true, + Bottom: big.NewInt(int64(98)), + Reverse: true, + }, + expectedNumberOfItems: 10, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + models := make([]model, 0) + query := db.NewSelect().Model(&models).Column("id") + if tc.query.Options { + query = query.Where("pair = ?", true) + } + cursor, err := bunpaginate2.UsingColumn[bool, model](context.Background(), query, tc.query) + require.NoError(t, err) + + if tc.expectedNext == nil { + require.Empty(t, cursor.Next) + } else { + require.NotEmpty(t, cursor.Next) + + q := bunpaginate2.ColumnPaginatedQuery[bool]{} + require.NoError(t, bunpaginate2.UnmarshalCursor(cursor.Next, &q)) + require.EqualValues(t, *tc.expectedNext, q) + } + + if tc.expectedPrevious == nil { + require.Empty(t, cursor.Previous) + } else { + require.NotEmpty(t, cursor.Previous) + + q := bunpaginate2.ColumnPaginatedQuery[bool]{} + require.NoError(t, bunpaginate2.UnmarshalCursor(cursor.Previous, &q)) + require.EqualValues(t, *tc.expectedPrevious, q) + } + }) + } +} diff --git a/libs/go-libs/bun/bunpaginate/pagination_offset.go b/libs/go-libs/bun/bunpaginate/pagination_offset.go new file mode 100644 index 0000000000..263b5e69f1 --- /dev/null +++ b/libs/go-libs/bun/bunpaginate/pagination_offset.go @@ -0,0 +1,48 @@ +package bunpaginate + +import ( + "context" + + "github.com/formancehq/stack/libs/go-libs/api" + "github.com/uptrace/bun" +) + +func UsingOffset[Q any, T any](ctx context.Context, sb *bun.SelectQuery, query OffsetPaginatedQuery[Q]) (*api.Cursor[T], error) { + ret := make([]T, 0) + + sb = sb.Offset(int(query.Offset)) + sb = sb.Limit(int(query.PageSize) + 1) + + if err := sb.Scan(ctx, &ret); err != nil { + return nil, err + } + + var previous, next *OffsetPaginatedQuery[Q] + + // Page with transactions before + if query.Offset > 0 { + cp := query + offset := int(query.Offset) - int(query.PageSize) + if offset < 0 { + offset = 0 + } + cp.Offset = uint64(offset) + previous = &cp + } + + // Page with transactions after + if len(ret) > int(query.PageSize) { + cp := query + cp.Offset = query.Offset + query.PageSize + next = &cp + ret = ret[:len(ret)-1] + } + + return &api.Cursor[T]{ + PageSize: int(query.PageSize), + HasMore: next != nil, + Previous: previous.EncodeAsCursor(), + Next: next.EncodeAsCursor(), + Data: ret, + }, nil +} diff --git a/libs/go-libs/bun/bunpaginate/pagination_offset_test.go b/libs/go-libs/bun/bunpaginate/pagination_offset_test.go new file mode 100644 index 0000000000..711bc0606b --- /dev/null +++ b/libs/go-libs/bun/bunpaginate/pagination_offset_test.go @@ -0,0 +1,173 @@ +package bunpaginate_test + +import ( + "context" + "github.com/formancehq/stack/libs/go-libs/bun/bunconnect" + bunpaginate2 "github.com/formancehq/stack/libs/go-libs/bun/bunpaginate" + "testing" + + "github.com/formancehq/stack/libs/go-libs/pgtesting" + "github.com/stretchr/testify/require" +) + +func TestOffsetPagination(t *testing.T) { + t.Parallel() + + pgServer := pgtesting.NewPostgresDatabase(t) + db, err := bunconnect.OpenSQLDB(bunconnect.ConnectionOptions{ + DatabaseSourceName: pgServer.ConnString(), + Debug: testing.Verbose(), + }) + require.NoError(t, err) + t.Cleanup(func() { + _ = db.Close() + }) + + _, err = db.Exec(` + CREATE TABLE "models" (id int, pair boolean); + `) + require.NoError(t, err) + + type model struct { + ID uint64 `bun:"id"` + Pair bool `bun:"pair"` + } + + models := make([]model, 0) + for i := 0; i < 100; i++ { + models = append(models, model{ + ID: uint64(i), + Pair: i%2 == 0, + }) + } + + _, err = db.NewInsert(). + Model(&models). + Exec(context.Background()) + require.NoError(t, err) + + type testCase struct { + name string + query bunpaginate2.OffsetPaginatedQuery[bool] + expectedNext *bunpaginate2.OffsetPaginatedQuery[bool] + expectedPrevious *bunpaginate2.OffsetPaginatedQuery[bool] + expectedNumberOfItems uint64 + } + testCases := []testCase{ + { + name: "asc first page", + query: bunpaginate2.OffsetPaginatedQuery[bool]{ + PageSize: 10, + Order: bunpaginate2.OrderAsc, + }, + expectedNext: &bunpaginate2.OffsetPaginatedQuery[bool]{ + PageSize: 10, + Offset: 10, + Order: bunpaginate2.OrderAsc, + }, + expectedNumberOfItems: 10, + }, + { + name: "asc second page using next cursor", + query: bunpaginate2.OffsetPaginatedQuery[bool]{ + PageSize: 10, + Offset: 10, + Order: bunpaginate2.OrderAsc, + }, + expectedPrevious: &bunpaginate2.OffsetPaginatedQuery[bool]{ + PageSize: 10, + Order: bunpaginate2.OrderAsc, + Offset: 0, + }, + expectedNext: &bunpaginate2.OffsetPaginatedQuery[bool]{ + PageSize: 10, + Order: bunpaginate2.OrderAsc, + Offset: 20, + }, + expectedNumberOfItems: 10, + }, + { + name: "asc last page using next cursor", + query: bunpaginate2.OffsetPaginatedQuery[bool]{ + PageSize: 10, + Offset: 90, + Order: bunpaginate2.OrderAsc, + }, + expectedPrevious: &bunpaginate2.OffsetPaginatedQuery[bool]{ + PageSize: 10, + Order: bunpaginate2.OrderAsc, + Offset: 80, + }, + expectedNumberOfItems: 10, + }, + { + name: "asc last page partial", + query: bunpaginate2.OffsetPaginatedQuery[bool]{ + PageSize: 10, + Offset: 95, + Order: bunpaginate2.OrderAsc, + }, + expectedPrevious: &bunpaginate2.OffsetPaginatedQuery[bool]{ + PageSize: 10, + Order: bunpaginate2.OrderAsc, + Offset: 85, + }, + expectedNumberOfItems: 10, + }, + { + name: "asc fist page partial", + query: bunpaginate2.OffsetPaginatedQuery[bool]{ + PageSize: 10, + Offset: 5, + Order: bunpaginate2.OrderAsc, + }, + expectedPrevious: &bunpaginate2.OffsetPaginatedQuery[bool]{ + PageSize: 10, + Order: bunpaginate2.OrderAsc, + Offset: 0, + }, + expectedNext: &bunpaginate2.OffsetPaginatedQuery[bool]{ + PageSize: 10, + Order: bunpaginate2.OrderAsc, + Offset: 15, + }, + expectedNumberOfItems: 10, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + + query := db.NewSelect().Model(&models).Column("id") + if tc.query.Options { + query = query.Where("pair = ?", true) + } + cursor, err := bunpaginate2.UsingOffset[bool, model]( + context.Background(), + query, + tc.query) + require.NoError(t, err) + + if tc.expectedNext == nil { + require.Empty(t, cursor.Next) + } else { + require.NotEmpty(t, cursor.Next) + + q := bunpaginate2.OffsetPaginatedQuery[bool]{} + require.NoError(t, bunpaginate2.UnmarshalCursor(cursor.Next, &q)) + require.EqualValues(t, *tc.expectedNext, q) + } + + if tc.expectedPrevious == nil { + require.Empty(t, cursor.Previous) + } else { + require.NotEmpty(t, cursor.Previous) + + q := bunpaginate2.OffsetPaginatedQuery[bool]{} + require.NoError(t, bunpaginate2.UnmarshalCursor(cursor.Previous, &q)) + require.EqualValues(t, *tc.expectedPrevious, q) + } + }) + } +} diff --git a/libs/go-libs/go.mod b/libs/go-libs/go.mod index d814b24a17..b14e9d5f1a 100644 --- a/libs/go-libs/go.mod +++ b/libs/go-libs/go.mod @@ -24,17 +24,18 @@ require ( github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.3 - github.com/uptrace/bun v1.1.14 - github.com/uptrace/bun/dialect/pgdialect v1.1.14 - github.com/uptrace/bun/extra/bundebug v1.1.14 + github.com/stretchr/testify v1.8.4 + github.com/uptrace/bun v1.1.16 + github.com/uptrace/bun/dialect/pgdialect v1.1.16 + github.com/uptrace/bun/extra/bundebug v1.1.16 + github.com/uptrace/bun/extra/bunotel v1.1.16 github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 github.com/xdg-go/scram v1.1.2 go.opentelemetry.io/contrib/instrumentation/host v0.42.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0 go.opentelemetry.io/contrib/propagators/b3 v1.13.0 - go.opentelemetry.io/otel v1.16.0 + go.opentelemetry.io/otel v1.17.0 go.opentelemetry.io/otel/exporters/jaeger v1.16.0 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.39.0 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.39.0 @@ -43,10 +44,10 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 - go.opentelemetry.io/otel/metric v1.16.0 + go.opentelemetry.io/otel/metric v1.17.0 go.opentelemetry.io/otel/sdk v1.16.0 go.opentelemetry.io/otel/sdk/metric v0.39.0 - go.opentelemetry.io/otel/trace v1.16.0 + go.opentelemetry.io/otel/trace v1.17.0 go.uber.org/fx v1.19.1 go.uber.org/zap v1.24.0 ) @@ -107,7 +108,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae // indirect github.com/nats-io/jwt/v2 v2.5.0 // indirect - github.com/nats-io/nkeys v0.4.6 // indirect + github.com/nats-io/nkeys v0.4.4 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect @@ -128,6 +129,7 @@ require ( github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect + github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 // indirect github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 // indirect github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect @@ -145,11 +147,11 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.16.1 // indirect go.uber.org/multierr v1.9.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.12.0 // indirect golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.6.0 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect diff --git a/libs/go-libs/go.sum b/libs/go-libs/go.sum index a935b9a29f..655b4bea6c 100644 --- a/libs/go-libs/go.sum +++ b/libs/go-libs/go.sum @@ -338,8 +338,8 @@ github.com/nats-io/nats-server/v2 v2.9.23 h1:6Wj6H6QpP9FMlpCyWUaNu2yeZ/qGj+mdRkZ github.com/nats-io/nats-server/v2 v2.9.23/go.mod h1:wEjrEy9vnqIGE4Pqz4/c75v9Pmaq7My2IgFmnykc4C0= github.com/nats-io/nats.go v1.28.0 h1:Th4G6zdsz2d0OqXdfzKLClo6bOfoI/b1kInhRtFIy5c= github.com/nats-io/nats.go v1.28.0/go.mod h1:XpbWUlOElGwTYbMR7imivs7jJj9GtK7ypv321Wp6pjc= -github.com/nats-io/nkeys v0.4.6 h1:IzVe95ru2CT6ta874rt9saQRkWfe2nFj1NtvYSLqMzY= -github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= +github.com/nats-io/nkeys v0.4.4 h1:xvBJ8d69TznjcQl9t6//Q5xXuVhyYiSos6RPtvQNTwA= +github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= @@ -429,8 +429,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -440,14 +440,18 @@ github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYm github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= -github.com/uptrace/bun v1.1.14 h1:S5vvNnjEynJ0CvnrBOD7MIRW7q/WbtvFXrdfy0lddAM= -github.com/uptrace/bun v1.1.14/go.mod h1:RHk6DrIisO62dv10pUOJCz5MphXThuOTpVNYEYv7NI8= -github.com/uptrace/bun/dialect/pgdialect v1.1.14 h1:b7+V1KDJPQSFYgkG/6YLXCl2uvwEY3kf/GSM7hTHRDY= -github.com/uptrace/bun/dialect/pgdialect v1.1.14/go.mod h1:v6YiaXmnKQ2FlhRD2c0ZfKd+QXH09pYn4H8ojaavkKk= -github.com/uptrace/bun/extra/bundebug v1.1.14 h1:9OCGfP9ZDlh41u6OLerWdhBtJAVGXHr0xtxO4xWi6t0= -github.com/uptrace/bun/extra/bundebug v1.1.14/go.mod h1:lto3guzS2v6mnQp1+akyE+ecBLOltevDDe324NXEYdw= +github.com/uptrace/bun v1.1.16 h1:cn9cgEMFwcyYRsQLfxCRMUxyK1WaHwOVrR3TvzEFZ/A= +github.com/uptrace/bun v1.1.16/go.mod h1:7HnsMRRvpLFUcquJxp22JO8PsWKpFQO/gNXqqsuGWg8= +github.com/uptrace/bun/dialect/pgdialect v1.1.16 h1:eUPZ+YCJ69BA+W1X1ZmpOJSkv1oYtinr0zCXf7zCo5g= +github.com/uptrace/bun/dialect/pgdialect v1.1.16/go.mod h1:KQjfx/r6JM0OXfbv0rFrxAbdkPD7idK8VitnjIV9fZI= +github.com/uptrace/bun/extra/bundebug v1.1.16 h1:SgicRQGtnjhrIhlYOxdkOm1Em4s6HykmT3JblHnoTBM= +github.com/uptrace/bun/extra/bundebug v1.1.16/go.mod h1:SkiOkfUirBiO1Htc4s5bQKEq+JSeU1TkBVpMsPz2ePM= +github.com/uptrace/bun/extra/bunotel v1.1.16 h1:qkLTaTZK3FZk3b2P/stO/krS7KX9Fq5wSOj7Hlb2HG8= +github.com/uptrace/bun/extra/bunotel v1.1.16/go.mod h1:JwEH0kdXFnzYuK8D6eXUrf9HKsYy5wmB+lqQ/+dvH4E= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 h1:OXsouNDvuET5o1A4uvoCnAXuuNke8JlfZWceciyUlC8= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21/go.mod h1:Xm3wlRGm5xzdAGPOvqydXPiGj0Da1q0OlUNm7Utoda4= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 h1:USRngIQppxeyb39XzkVHXwQesKK0+JSwnHE/1c7fgic= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2/go.mod h1:1frv9RN1rlTq0jzCq+mVuEQisubZCQ4OU6S/8CaHzGY= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 h1:HCqo51kNF8wxDMDhxcN5S6DlfZXigMtptRpkvjBCeVc= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21/go.mod h1:2MNqrUmDrt5E0glMuoJI/9FyGVpBKo1FqjSH60UOZFg= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -495,8 +499,8 @@ go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0 h1:EbmAUG9hEAMXyfWEa go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0/go.mod h1:rD9feqRYP24P14t5kmhNMqsqm1jvKmpx2H2rKVw52V8= go.opentelemetry.io/contrib/propagators/b3 v1.13.0 h1:f17PBmZK60RoHvOpJVqEka8oS2EXjpjHquESD/8zZ50= go.opentelemetry.io/contrib/propagators/b3 v1.13.0/go.mod h1:zy2hz1TpGUoJzSwlBchVGvVAFQS8s2pglKLbrAFZ+Sc= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= @@ -517,14 +521,14 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 h1:fl2WmyenEf6LYY go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0/go.mod h1:csyQxQ0UHHKVA8KApS7eUO/klMO5sd/av5CNZNU4O6w= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -549,8 +553,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-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= 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= @@ -706,8 +710,8 @@ golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -720,8 +724,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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= diff --git a/libs/go-libs/migrations/migrator_test.go b/libs/go-libs/migrations/migrator_test.go index 3120ee2392..4723f4ee20 100644 --- a/libs/go-libs/migrations/migrator_test.go +++ b/libs/go-libs/migrations/migrator_test.go @@ -15,9 +15,9 @@ import ( func TestMigrations(t *testing.T) { require.NoError(t, pgtesting.CreatePostgresServer()) - defer func() { + t.Cleanup(func() { require.NoError(t, pgtesting.DestroyPostgresServer()) - }() + }) migrator := NewMigrator() migrator.RegisterMigrations( diff --git a/libs/go-libs/publish/messages.go b/libs/go-libs/publish/messages.go index 225f4152ca..acf580861f 100644 --- a/libs/go-libs/publish/messages.go +++ b/libs/go-libs/publish/messages.go @@ -26,3 +26,11 @@ type EventMessage struct { Type string `json:"type"` Payload any `json:"payload"` } + +func UnmarshalMessage(msg *message.Message) (*EventMessage, error) { + ev := &EventMessage{} + if err := json.Unmarshal(msg.Payload, ev); err != nil { + return nil, err + } + return ev, nil +} diff --git a/openapi/build/generate.json b/openapi/build/generate.json index 4363d5cf79..3c3feb4e81 100644 --- a/openapi/build/generate.json +++ b/openapi/build/generate.json @@ -1950,6 +1950,22 @@ } }, "/api/payments/payments": { + "post": { + "summary": "Create a payment", + "tags": [ + "Payments" + ], + "operationId": "createPayment", + "description": "Create a payment", + "requestBody": { + "$ref": "#/components/requestBodies/Payment" + }, + "responses": { + "200": { + "$ref": "#/components/responses/Payment" + } + } + }, "get": { "summary": "List payments", "operationId": "listPayments", @@ -2139,6 +2155,162 @@ } } }, + "/api/payments/pools": { + "get": { + "summary": "List Pools", + "operationId": "listPools", + "tags": [ + "Payments" + ], + "parameters": [ + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/Cursor" + }, + { + "$ref": "#/components/parameters/Sort" + }, + { + "$ref": "#/components/parameters/Query" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/Pools" + } + } + }, + "post": { + "summary": "Create a Pool", + "tags": [ + "Payments" + ], + "operationId": "createPool", + "description": "Create a Pool", + "requestBody": { + "$ref": "#/components/requestBodies/Pool" + }, + "responses": { + "200": { + "$ref": "#/components/responses/Pool" + } + } + } + }, + "/api/payments/pools/{poolId}": { + "get": { + "summary": "Get a Pool", + "tags": [ + "Payments" + ], + "operationId": "getPool", + "parameters": [ + { + "$ref": "#/components/parameters/PoolId" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/Pool" + } + } + }, + "delete": { + "summary": "Delete a Pool", + "operationId": "deletePool", + "tags": [ + "Payments" + ], + "description": "Delete a pool by its id.", + "parameters": [ + { + "$ref": "#/components/parameters/PoolId" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/NoContent" + } + } + } + }, + "/api/payments/pools/{poolId}/accounts": { + "post": { + "summary": "Add an account to a pool", + "tags": [ + "Payments" + ], + "operationId": "addAccountToPool", + "description": "Add an account to a pool", + "parameters": [ + { + "$ref": "#/components/parameters/PoolId" + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/AddAccountToPool" + }, + "responses": { + "204": { + "$ref": "#/components/responses/NoContent" + } + } + } + }, + "/api/payments/pools/{poolId}/accounts/{accountId}": { + "delete": { + "summary": "Remove an account from a pool", + "operationId": "removeAccountFromPool", + "tags": [ + "Payments" + ], + "description": "Remove an account from a pool by its id.", + "parameters": [ + { + "$ref": "#/components/parameters/PoolId" + }, + { + "$ref": "#/components/parameters/AccountId" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/NoContent" + } + } + } + }, + "/api/payments/pools/{poolId}/balances": { + "get": { + "summary": "Get pool balances", + "operationId": "getPoolBalances", + "tags": [ + "Payments" + ], + "parameters": [ + { + "$ref": "#/components/parameters/PoolId" + }, + { + "name": "at", + "in": "query", + "description": "Filter balances by date.\n", + "required": true, + "schema": { + "type": "string", + "format": "date-time" + } + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/PoolBalances" + } + } + } + }, "/api/payments/accounts": { "get": { "summary": "List accounts", @@ -3764,6 +3936,151 @@ } } }, + "/api/orchestration/triggers": { + "get": { + "summary": "List triggers", + "operationId": "listTriggers", + "description": "List triggers", + "tags": [ + "Orchestration" + ], + "responses": { + "200": { + "description": "List of triggers", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListTriggersResponse" + } + } + } + }, + "default": { + "$ref": "#/components/responses/ErrorResponse" + } + } + }, + "post": { + "summary": "Create trigger", + "operationId": "createTrigger", + "description": "Create trigger", + "tags": [ + "Orchestration" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerData" + } + } + } + }, + "responses": { + "201": { + "description": "Created trigger", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTriggerResponse" + } + } + } + }, + "default": { + "$ref": "#/components/responses/ErrorResponse" + } + } + } + }, + "/api/orchestration/triggers/{triggerID}": { + "parameters": [ + { + "name": "triggerID", + "description": "The trigger id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "get": { + "summary": "Read trigger", + "operationId": "readTrigger", + "description": "Read trigger", + "tags": [ + "Orchestration" + ], + "responses": { + "200": { + "description": "A specific trigger", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReadTriggerResponse" + } + } + } + }, + "default": { + "$ref": "#/components/responses/ErrorResponse" + } + } + }, + "delete": { + "summary": "Delete trigger", + "operationId": "deleteTrigger", + "description": "Read trigger", + "tags": [ + "Orchestration" + ], + "responses": { + "204": { + "description": "Trigger deleted" + }, + "default": { + "$ref": "#/components/responses/ErrorResponse" + } + } + } + }, + "/api/orchestration/triggers/{triggerID}/occurrences": { + "parameters": [ + { + "name": "triggerID", + "description": "The trigger id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "get": { + "summary": "List triggers occurrences", + "operationId": "listTriggersOccurrences", + "description": "List triggers occurrences", + "tags": [ + "Orchestration" + ], + "responses": { + "200": { + "description": "List of triggers occurrences", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListTriggersOccurrencesResponse" + } + } + } + }, + "default": { + "$ref": "#/components/responses/ErrorResponse" + } + } + } + }, "/api/orchestration/workflows": { "get": { "summary": "List registered workflows", @@ -5630,7 +5947,7 @@ } } }, - "TransferInitiationsCursor": { + "PoolsCursor": { "type": "object", "required": [ "cursor" @@ -5650,7 +5967,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/TransferInitiation" + "$ref": "#/components/schemas/Pool" } } } @@ -5659,7 +5976,7 @@ } } }, - "BankAccountsCursor": { + "TransferInitiationsCursor": { "type": "object", "required": [ "cursor" @@ -5679,7 +5996,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/BankAccount" + "$ref": "#/components/schemas/TransferInitiation" } } } @@ -5688,7 +6005,7 @@ } } }, - "AccountsCursor": { + "BankAccountsCursor": { "type": "object", "required": [ "cursor" @@ -5708,7 +6025,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/paymentsAccount" + "$ref": "#/components/schemas/BankAccount" } } } @@ -5717,7 +6034,36 @@ } } }, - "BalancesCursor": { + "AccountsCursor": { + "type": "object", + "required": [ + "cursor" + ], + "properties": { + "cursor": { + "allOf": [ + { + "$ref": "#/components/schemas/CursorBase" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/paymentsAccount" + } + } + } + } + ] + } + } + }, + "BalancesCursor": { "type": "object", "required": [ "cursor" @@ -5822,6 +6168,28 @@ } } }, + "PoolBalancesResponse": { + "type": "object", + "required": [ + "data" + ], + "properties": { + "data": { + "$ref": "#/components/schemas/PoolBalances" + } + } + }, + "PoolResponse": { + "type": "object", + "required": [ + "data" + ], + "properties": { + "data": { + "$ref": "#/components/schemas/Pool" + } + } + }, "TransferInitiationResponse": { "type": "object", "required": [ @@ -5887,6 +6255,9 @@ }, "connectorID": { "type": "string" + }, + "enabled": { + "type": "boolean" } } } @@ -6036,7 +6407,8 @@ "CURRENCY-CLOUD", "BANKING-CIRCLE", "MANGOPAY", - "MONEYCORP" + "MONEYCORP", + "ATLAR" ] }, "TransferInitiationStatus": { @@ -6075,6 +6447,9 @@ }, { "$ref": "#/components/schemas/MoneycorpConfig" + }, + { + "$ref": "#/components/schemas/AtlarConfig" } ] }, @@ -6341,6 +6716,50 @@ } } }, + "AtlarConfig": { + "type": "object", + "required": [ + "name", + "accessKey", + "secret" + ], + "properties": { + "name": { + "type": "string", + "example": "My Atlar Account" + }, + "baseUrl": { + "type": "string", + "example": "https://api.example.com", + "default": "https://api.atlar.com", + "description": "The base URL the client uses for making requests towards the Atlar API.\n" + }, + "pollingPeriod": { + "type": "string", + "example": "60s", + "description": "The frequency at which the connector tries to fetch new Transaction objects from the Atlar API.\n", + "default": "120s" + }, + "accessKey": { + "type": "string", + "example": "XXX", + "description": "The access key used by the connector for authorizing requests to the Atlar API.\nYou can obtain it along with the associated secret from the Atlar dashboard.\n" + }, + "secret": { + "type": "string", + "example": "XXX", + "description": "The secret used by the connector for authorizing requests to the Atlar API.\nYou can obtain it along with the associated access key from the Atlar dashboard.\n" + }, + "pageSize": { + "type": "integer", + "format": "int64", + "minimum": 0, + "description": "Number of items to fetch when querying paginated APIs.\n", + "default": 25, + "example": 50 + } + } + }, "TransferInitiation": { "type": "object", "required": [ @@ -6462,6 +6881,9 @@ "connectorID": { "type": "string" }, + "provider": { + "type": "string" + }, "iban": { "type": "string" }, @@ -6512,13 +6934,7 @@ "$ref": "#/components/schemas/Connector" }, "type": { - "type": "string", - "enum": [ - "PAY-IN", - "PAYOUT", - "TRANSFER", - "OTHER" - ] + "$ref": "#/components/schemas/PaymentType" }, "status": { "$ref": "#/components/schemas/PaymentStatus" @@ -6530,27 +6946,7 @@ "example": 100 }, "scheme": { - "type": "string", - "enum": [ - "visa", - "mastercard", - "amex", - "diners", - "discover", - "jcb", - "unionpay", - "sepa debit", - "sepa credit", - "sepa", - "apple pay", - "google pay", - "a2a", - "ach debit", - "ach", - "rtp", - "unknown", - "other" - ] + "$ref": "#/components/schemas/PaymentScheme" }, "asset": { "type": "string", @@ -6608,12 +7004,72 @@ }, "PaymentMetadata": { "type": "object", + "additionalProperties": { + "type": "string" + }, + "nullable": true + }, + "AccountMetadata": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "nullable": true + }, + "Pool": { + "type": "object", + "required": [ + "id", + "name", + "accounts" + ], "properties": { - "key": { + "id": { "type": "string" + }, + "name": { + "type": "string" + }, + "accounts": { + "type": "array", + "items": { + "type": "string" + } } - }, - "nullable": true + } + }, + "PoolBalances": { + "type": "object", + "required": [ + "balances" + ], + "properties": { + "balances": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PoolBalance" + } + } + } + }, + "PoolBalance": { + "type": "object", + "required": [ + "amount", + "asset" + ], + "properties": { + "amount": { + "type": "integer", + "format": "bigint", + "minimum": 0, + "example": 100 + }, + "asset": { + "type": "string", + "example": "USD" + } + } }, "paymentsAccount": { "type": "object", @@ -6626,6 +7082,7 @@ "defaultAsset", "accountName", "type", + "metadata", "raw" ], "properties": { @@ -6655,6 +7112,9 @@ "type": { "type": "string" }, + "metadata": { + "$ref": "#/components/schemas/AccountMetadata" + }, "raw": { "type": "object", "nullable": true @@ -7021,6 +7481,85 @@ } } }, + "AddAccountToPoolRequest": { + "type": "object", + "required": [ + "accountID" + ], + "properties": { + "accountID": { + "type": "string" + } + } + }, + "PoolRequest": { + "type": "object", + "required": [ + "name", + "accountIDs" + ], + "properties": { + "name": { + "type": "string" + }, + "accountIDs": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PaymentRequest": { + "type": "object", + "required": [ + "reference", + "connectorID", + "createdAt", + "amount", + "type", + "status", + "scheme", + "asset" + ], + "properties": { + "reference": { + "type": "string" + }, + "connectorID": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "amount": { + "type": "integer", + "format": "bigint", + "minimum": 0, + "example": 100 + }, + "type": { + "$ref": "#/components/schemas/PaymentType" + }, + "status": { + "$ref": "#/components/schemas/PaymentStatus" + }, + "scheme": { + "$ref": "#/components/schemas/PaymentScheme" + }, + "asset": { + "type": "string", + "example": "USD" + }, + "sourceAccountID": { + "type": "string" + }, + "destinationAccountID": { + "type": "string" + } + } + }, "TransferInitiationRequest": { "type": "object", "required": [ @@ -7097,6 +7636,38 @@ } } }, + "PaymentType": { + "type": "string", + "enum": [ + "PAY-IN", + "PAYOUT", + "TRANSFER", + "OTHER" + ] + }, + "PaymentScheme": { + "type": "string", + "enum": [ + "visa", + "mastercard", + "amex", + "diners", + "discover", + "jcb", + "unionpay", + "sepa debit", + "sepa credit", + "sepa", + "apple pay", + "google pay", + "a2a", + "ach debit", + "ach", + "rtp", + "unknown", + "other" + ] + }, "PaymentStatus": { "type": "string", "enum": [ @@ -8451,14 +9022,107 @@ "data" ] }, - "ReadWorkflowResponse": { + "TriggerData": { "type": "object", "required": [ - "data" + "event", + "workflowID" ], "properties": { - "data": { - "$ref": "#/components/schemas/Workflow" + "event": { + "type": "string" + }, + "workflowID": { + "type": "string" + }, + "filter": { + "type": "string" + }, + "vars": { + "type": "object", + "additionalProperties": true + } + } + }, + "Trigger": { + "allOf": [ + { + "$ref": "#/components/schemas/TriggerData" + }, + { + "type": "object", + "required": [ + "id", + "createdAt" + ], + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + } + } + } + ] + }, + "TriggerOccurrence": { + "type": "object", + "required": [ + "triggerID", + "workflowInstanceID", + "date" + ], + "properties": { + "date": { + "type": "string", + "format": "date-time" + }, + "workflowInstanceID": { + "type": "string" + }, + "triggerID": { + "type": "string" + } + } + }, + "ListTriggersOccurrencesResponse": { + "type": "object", + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/TriggerOccurrence" + }, + "type": "array" + } + }, + "required": [ + "data" + ] + }, + "ListTriggersResponse": { + "type": "object", + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/Trigger" + }, + "type": "array" + } + }, + "required": [ + "data" + ] + }, + "ReadWorkflowResponse": { + "type": "object", + "required": [ + "data" + ], + "properties": { + "data": { + "$ref": "#/components/schemas/Workflow" } } }, @@ -8476,6 +9140,17 @@ } } }, + "CreateTriggerResponse": { + "type": "object", + "required": [ + "data" + ], + "properties": { + "data": { + "$ref": "#/components/schemas/Trigger" + } + } + }, "RunWorkflowRequest": { "type": "object", "additionalProperties": { @@ -8704,6 +9379,11 @@ "type": "string", "example": "acct_1Gqj58KZcSIg2N2q" }, + "waitingValidation": { + "type": "boolean", + "example": false, + "default": false + }, "metadata": { "type": "object", "description": "A set of key/value pairs that you can attach to a transfer object.\nIt can be useful for storing additional information about the transfer in a structured format.\n", @@ -8844,7 +9524,142 @@ "$ref": "#/components/schemas/RevertTransactionResponse" }, "ActivityGetPaymentOutput": { - "$ref": "#/components/schemas/PaymentResponse" + "$ref": "#/components/schemas/orchestrationPaymentResponse" + }, + "orchestrationPaymentResponse": { + "type": "object", + "required": [ + "data" + ], + "properties": { + "data": { + "$ref": "#/components/schemas/orchestrationPayment" + } + } + }, + "orchestrationPayment": { + "type": "object", + "required": [ + "id", + "reference", + "connectorID", + "sourceAccountID", + "destinationAccountID", + "type", + "status", + "initialAmount", + "scheme", + "asset", + "createdAt", + "raw", + "adjustments", + "metadata" + ], + "properties": { + "id": { + "type": "string", + "example": "XXX" + }, + "reference": { + "type": "string" + }, + "sourceAccountID": { + "type": "string" + }, + "destinationAccountID": { + "type": "string" + }, + "connectorID": { + "type": "string" + }, + "provider": { + "$ref": "#/components/schemas/orchestrationConnector" + }, + "type": { + "type": "string", + "enum": [ + "PAY-IN", + "PAYOUT", + "TRANSFER", + "OTHER" + ] + }, + "status": { + "$ref": "#/components/schemas/PaymentStatus" + }, + "initialAmount": { + "type": "integer", + "format": "bigint", + "minimum": 0, + "example": 100 + }, + "scheme": { + "type": "string", + "enum": [ + "visa", + "mastercard", + "amex", + "diners", + "discover", + "jcb", + "unionpay", + "sepa debit", + "sepa credit", + "sepa", + "apple pay", + "google pay", + "a2a", + "ach debit", + "ach", + "rtp", + "unknown", + "other" + ] + }, + "asset": { + "type": "string", + "example": "USD" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "raw": { + "type": "object", + "nullable": true + }, + "adjustments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PaymentAdjustment" + } + }, + "metadata": { + "$ref": "#/components/schemas/orchestrationPaymentMetadata" + } + } + }, + "orchestrationConnector": { + "type": "string", + "enum": [ + "STRIPE", + "DUMMY-PAY", + "WISE", + "MODULR", + "CURRENCY-CLOUD", + "BANKING-CIRCLE", + "MANGOPAY", + "MONEYCORP" + ] + }, + "orchestrationPaymentMetadata": { + "type": "object", + "properties": { + "key": { + "type": "string" + } + }, + "nullable": true }, "ActivityDebitWalletOutput": { "$ref": "#/components/schemas/DebitWalletResponse" @@ -8918,6 +9733,17 @@ "example": { "admin": "true" } + }, + "ReadTriggerResponse": { + "type": "object", + "required": [ + "data" + ], + "properties": { + "data": { + "$ref": "#/components/schemas/Trigger" + } + } } }, "securitySchemes": { @@ -8966,6 +9792,36 @@ } } }, + "Pools": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PoolsCursor" + } + } + } + }, + "Pool": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PoolResponse" + } + } + } + }, + "PoolBalances": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PoolBalancesResponse" + } + } + } + }, "TransferInitiations": { "description": "OK", "content": { @@ -9204,6 +10060,16 @@ "example": "XXX", "required": true }, + "PoolId": { + "name": "poolId", + "in": "path", + "schema": { + "type": "string" + }, + "description": "The pool ID.", + "example": "XXX", + "required": true + }, "TransferId": { "name": "transferId", "in": "path", @@ -9265,6 +10131,36 @@ } } }, + "Payment": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequest" + } + } + } + }, + "Pool": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PoolRequest" + } + } + } + }, + "AddAccountToPool": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddAccountToPoolRequest" + } + } + } + }, "TransferInitiation": { "required": true, "content": { diff --git a/tests/integration/go.mod b/tests/integration/go.mod index 1de734975c..306447bd90 100644 --- a/tests/integration/go.mod +++ b/tests/integration/go.mod @@ -27,8 +27,8 @@ require ( github.com/sirupsen/logrus v1.9.0 github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.15.0 - github.com/uptrace/bun v1.1.14 - github.com/uptrace/bun/dialect/pgdialect v1.1.14 + github.com/uptrace/bun v1.1.16 + github.com/uptrace/bun/dialect/pgdialect v1.1.16 github.com/uptrace/bun/driver/pgdriver v1.1.14 github.com/xo/dburl v0.13.0 gopkg.in/yaml.v3 v3.0.1 @@ -59,12 +59,12 @@ require ( github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect github.com/eapache/go-resiliency v1.3.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/elastic/go-elasticsearch/v7 v7.17.7 // indirect github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05 // indirect + github.com/expr-lang/expr v1.15.6 // indirect github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect github.com/fatih/color v1.15.0 // indirect github.com/fatih/structs v1.1.0 // indirect @@ -87,7 +87,7 @@ require ( github.com/go-openapi/loads v0.21.2 // indirect github.com/go-openapi/runtime v0.26.0 // indirect github.com/go-openapi/spec v0.20.9 // indirect - github.com/go-openapi/strfmt v0.21.7 // indirect + github.com/go-openapi/strfmt v0.21.8 // indirect github.com/go-openapi/swag v0.22.4 // indirect github.com/go-openapi/validate v0.22.2 // indirect github.com/go-playground/locales v0.14.1 // indirect @@ -127,7 +127,6 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/klauspost/compress v1.16.7 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/lib/pq v1.10.7 // indirect @@ -138,7 +137,6 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect - github.com/mattn/go-sqlite3 v1.14.16 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect @@ -159,7 +157,6 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/riandyrn/otelchi v0.5.1 // indirect github.com/robfig/cron v1.2.0 // indirect github.com/rs/cors v1.9.0 // indirect @@ -181,12 +178,10 @@ require ( github.com/tklauser/numcpus v0.6.0 // indirect github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect github.com/ugorji/go/codec v1.2.11 // indirect - github.com/uptrace/bun/dialect/sqlitedialect v1.1.14 // indirect - github.com/uptrace/bun/driver/sqliteshim v1.1.14 // indirect - github.com/uptrace/bun/extra/bundebug v1.1.14 // indirect - github.com/uptrace/bun/extra/bunotel v1.1.14 // indirect + github.com/uptrace/bun/extra/bundebug v1.1.16 // indirect + github.com/uptrace/bun/extra/bunotel v1.1.16 // indirect github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 // indirect - github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.1 // indirect + github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 // indirect github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 // indirect github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect @@ -208,7 +203,7 @@ require ( go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.17.0 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel v1.17.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.39.0 // indirect @@ -219,10 +214,10 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.17.0 // indirect go.opentelemetry.io/otel/sdk v1.16.0 // indirect go.opentelemetry.io/otel/sdk/metric v0.39.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.17.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.temporal.io/api v1.18.1 // indirect go.temporal.io/sdk v1.21.1 // indirect @@ -254,17 +249,7 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gorm.io/driver/postgres v1.4.8 // indirect gorm.io/gorm v1.24.5 // indirect - lukechampine.com/uint128 v1.3.0 // indirect mellium.im/sasl v0.3.1 // indirect - modernc.org/cc/v3 v3.40.0 // indirect - modernc.org/ccgo/v3 v3.16.13 // indirect - modernc.org/libc v1.22.6 // indirect - modernc.org/mathutil v1.5.0 // indirect - modernc.org/memory v1.5.0 // indirect - modernc.org/opt v0.1.3 // indirect - modernc.org/sqlite v1.22.1 // indirect - modernc.org/strutil v1.1.3 // indirect - modernc.org/token v1.1.0 // indirect ) replace ( diff --git a/tests/integration/go.sum b/tests/integration/go.sum index a191f70c28..2328b0b113 100644 --- a/tests/integration/go.sum +++ b/tests/integration/go.sum @@ -710,8 +710,6 @@ github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4 github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/eapache/go-resiliency v1.3.0 h1:RRL0nge+cWGlxXbUzJ7yMcq6w2XBEr19dCN6HECGaT0= github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 h1:8yY/I9ndfrgrXUbOGObLHKBR4Fl3nZXwM2c7OYTT8hM= @@ -740,6 +738,8 @@ github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0+ github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05 h1:S92OBrGuLLZsyM5ybUzgc/mPjIYk2AZqufieooe98uw= github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05/go.mod h1:M9R1FoZ3y//hwwnJtO51ypFGwm8ZfpxPT/ZLtO1mcgQ= +github.com/expr-lang/expr v1.15.6 h1:dQFgzj5DBu3wnUz8+PGLZdPMpefAvxaCFTNM3iSjkGA= +github.com/expr-lang/expr v1.15.6/go.mod h1:uCkhfG+x7fcZ5A5sXHKuQ07jGZRl6J0FCAaf2k4PtVQ= github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a h1:yDWHCSQ40h88yih2JAcL6Ls/kVkSE8GFACTGVnMPruw= github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= @@ -821,8 +821,8 @@ github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6 github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg= -github.com/go-openapi/strfmt v0.21.7 h1:rspiXgNWgeUzhjo1YU01do6qsahtJNByjLVbPLNHb8k= -github.com/go-openapi/strfmt v0.21.7/go.mod h1:adeGTkxE44sPyLk0JV235VQAO/ZXUr8KAzYjclFs3ew= +github.com/go-openapi/strfmt v0.21.8 h1:VYBUoKYRLAlgKDrIxR/I0lKrztDQ0tuTDrbhLVP8Erg= +github.com/go-openapi/strfmt v0.21.8/go.mod h1:adeGTkxE44sPyLk0JV235VQAO/ZXUr8KAzYjclFs3ew= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= @@ -1060,7 +1060,6 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -1110,8 +1109,6 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= @@ -1203,8 +1200,6 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/riandyrn/otelchi v0.5.1 h1:0/45omeqpP7f/cvdL16GddQBfAEmZvUyl2QzLSE6uYo= github.com/riandyrn/otelchi v0.5.1/go.mod h1:ZxVxNEl+jQ9uHseRYIxKWRb3OY8YXFEu+EkNiiSNUEA= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= @@ -1294,24 +1289,20 @@ github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6 github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/uptrace/bun v1.1.14 h1:S5vvNnjEynJ0CvnrBOD7MIRW7q/WbtvFXrdfy0lddAM= -github.com/uptrace/bun v1.1.14/go.mod h1:RHk6DrIisO62dv10pUOJCz5MphXThuOTpVNYEYv7NI8= -github.com/uptrace/bun/dialect/pgdialect v1.1.14 h1:b7+V1KDJPQSFYgkG/6YLXCl2uvwEY3kf/GSM7hTHRDY= -github.com/uptrace/bun/dialect/pgdialect v1.1.14/go.mod h1:v6YiaXmnKQ2FlhRD2c0ZfKd+QXH09pYn4H8ojaavkKk= -github.com/uptrace/bun/dialect/sqlitedialect v1.1.14 h1:SlwXLxr+N1kEo8Q0cheRlnIZLZlWniEB1OI+jkiLgWE= -github.com/uptrace/bun/dialect/sqlitedialect v1.1.14/go.mod h1:9RTEj1l4bB9a4l1Mnc9y4COTwWlFYe1dh6fyxq1rR7A= +github.com/uptrace/bun v1.1.16 h1:cn9cgEMFwcyYRsQLfxCRMUxyK1WaHwOVrR3TvzEFZ/A= +github.com/uptrace/bun v1.1.16/go.mod h1:7HnsMRRvpLFUcquJxp22JO8PsWKpFQO/gNXqqsuGWg8= +github.com/uptrace/bun/dialect/pgdialect v1.1.16 h1:eUPZ+YCJ69BA+W1X1ZmpOJSkv1oYtinr0zCXf7zCo5g= +github.com/uptrace/bun/dialect/pgdialect v1.1.16/go.mod h1:KQjfx/r6JM0OXfbv0rFrxAbdkPD7idK8VitnjIV9fZI= github.com/uptrace/bun/driver/pgdriver v1.1.14 h1:V2Etm7mLGS3mhx8ddxZcUnwZLX02Jmq9JTlo0sNVDhA= github.com/uptrace/bun/driver/pgdriver v1.1.14/go.mod h1:D4FjWV9arDYct6sjMJhFoyU71SpllZRHXFRRP2Kd0Kw= -github.com/uptrace/bun/driver/sqliteshim v1.1.14 h1:DFPUJ6KjDP2myjq15gtYYNngmAFMww1Y2UFZv4tbUw8= -github.com/uptrace/bun/driver/sqliteshim v1.1.14/go.mod h1:5BFN7V6Sm37Tn7UE4FWNm/F6V3iJPUzAJ7QyRwA5b1k= -github.com/uptrace/bun/extra/bundebug v1.1.14 h1:9OCGfP9ZDlh41u6OLerWdhBtJAVGXHr0xtxO4xWi6t0= -github.com/uptrace/bun/extra/bundebug v1.1.14/go.mod h1:lto3guzS2v6mnQp1+akyE+ecBLOltevDDe324NXEYdw= -github.com/uptrace/bun/extra/bunotel v1.1.14 h1:jKA1zNfD2/Y/O3eFP15ao+V0cMigXN+ReNbsVUqrOhg= -github.com/uptrace/bun/extra/bunotel v1.1.14/go.mod h1:BBuePZ4ciMqoeyRfef4GL7Z75FsiOm3Q3fvNt0z4sQk= +github.com/uptrace/bun/extra/bundebug v1.1.16 h1:SgicRQGtnjhrIhlYOxdkOm1Em4s6HykmT3JblHnoTBM= +github.com/uptrace/bun/extra/bundebug v1.1.16/go.mod h1:SkiOkfUirBiO1Htc4s5bQKEq+JSeU1TkBVpMsPz2ePM= +github.com/uptrace/bun/extra/bunotel v1.1.16 h1:qkLTaTZK3FZk3b2P/stO/krS7KX9Fq5wSOj7Hlb2HG8= +github.com/uptrace/bun/extra/bunotel v1.1.16/go.mod h1:JwEH0kdXFnzYuK8D6eXUrf9HKsYy5wmB+lqQ/+dvH4E= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21 h1:OXsouNDvuET5o1A4uvoCnAXuuNke8JlfZWceciyUlC8= github.com/uptrace/opentelemetry-go-extra/otellogrus v0.1.21/go.mod h1:Xm3wlRGm5xzdAGPOvqydXPiGj0Da1q0OlUNm7Utoda4= -github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.1 h1:sCYkntVVoSMuQuyRBaEkedb1qS1KeJJaqKbdtNfTsfM= -github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.1/go.mod h1:1frv9RN1rlTq0jzCq+mVuEQisubZCQ4OU6S/8CaHzGY= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 h1:USRngIQppxeyb39XzkVHXwQesKK0+JSwnHE/1c7fgic= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2/go.mod h1:1frv9RN1rlTq0jzCq+mVuEQisubZCQ4OU6S/8CaHzGY= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21 h1:HCqo51kNF8wxDMDhxcN5S6DlfZXigMtptRpkvjBCeVc= github.com/uptrace/opentelemetry-go-extra/otelutil v0.1.21/go.mod h1:2MNqrUmDrt5E0glMuoJI/9FyGVpBKo1FqjSH60UOZFg= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -1384,8 +1375,8 @@ go.opentelemetry.io/contrib/propagators/b3 v1.17.0 h1:ImOVvHnku8jijXqkwCSyYKRDt2 go.opentelemetry.io/contrib/propagators/b3 v1.17.0/go.mod h1:IkfUfMpKWmynvvE0264trz0sf32NRTZL4nuAN9AbWRc= go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= @@ -1406,8 +1397,8 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0 h1:fl2WmyenEf6LYY go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.39.0/go.mod h1:csyQxQ0UHHKVA8KApS7eUO/klMO5sd/av5CNZNU4O6w= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= @@ -1416,8 +1407,8 @@ go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh4 go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= @@ -2186,26 +2177,18 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= -lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= mellium.im/sasl v0.3.1 h1:wE0LW6g7U83vhvxjC1IY8DnXM+EU095yeo8XClvCdfo= mellium.im/sasl v0.3.1/go.mod h1:xm59PUYpZHhgQ9ZqoJ5QaCqzWMi8IeS49dhp6plPCzw= modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= @@ -2214,33 +2197,20 @@ modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/libc v1.22.6 h1:cbXU8R+A6aOjRuhsFh3nbDWXO/Hs4ClJRXYB11KmPDo= -modernc.org/libc v1.22.6/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/sqlite v1.22.1 h1:P2+Dhp5FR1RlVRkQ3dDfCiv3Ok8XPxqpe70IjYVA9oE= -modernc.org/sqlite v1.22.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= -modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/tests/integration/internal/env.go b/tests/integration/internal/env.go index b319195c9b..f76fb15118 100644 --- a/tests/integration/internal/env.go +++ b/tests/integration/internal/env.go @@ -2,6 +2,7 @@ package internal import ( "context" + "github.com/pkg/errors" "io" "os" @@ -30,7 +31,7 @@ func (e *env) Setup(ctx context.Context) error { e.sqlConn, err = pgx.Connect(ctx, GetPostgresDSNString()) if err != nil { - return err + return errors.Wrapf(err, "connecting to database '%s'", GetPostgresDSNString()) } e.dockerPool, err = dockertest.NewPool("") @@ -53,9 +54,12 @@ func (e *env) Setup(ctx context.Context) error { } func (e *env) Teardown(ctx context.Context) error { - if err := e.dockerClient.Close(); err != nil { - return err + if e.dockerClient != nil { + if err := e.dockerClient.Close(); err != nil { + return err + } } + // TODO: Purge docker pool resources if e.sqlConn != nil { return e.sqlConn.Close(ctx) diff --git a/tests/integration/internal/events.go b/tests/integration/internal/events.go index 11a483a97e..7589764d2f 100644 --- a/tests/integration/internal/events.go +++ b/tests/integration/internal/events.go @@ -1,7 +1,9 @@ package internal import ( + "encoding/json" "fmt" + "github.com/formancehq/stack/libs/go-libs/publish" "github.com/nats-io/nats.go" . "github.com/onsi/gomega" ) @@ -33,3 +35,11 @@ func SubscribePayments() (func(), chan *nats.Msg) { Expect(subscription.Unsubscribe()).To(Succeed()) }, msgs } + +func PublishPayments(message publish.EventMessage) { + data, err := json.Marshal(message) + Expect(err).WithOffset(1).To(BeNil()) + + err = NatsClient().Publish(fmt.Sprintf("%s-payments", currentTest.id), data) + Expect(err).To(BeNil()) +} diff --git a/tests/integration/internal/modules/orchestration.go b/tests/integration/internal/modules/orchestration.go index d21d2a037c..fc5f8ac6a3 100644 --- a/tests/integration/internal/modules/orchestration.go +++ b/tests/integration/internal/modules/orchestration.go @@ -1,6 +1,7 @@ package modules import ( + "fmt" "github.com/formancehq/orchestration/cmd" "github.com/formancehq/stack/tests/integration/internal" ) @@ -20,6 +21,11 @@ var Orchestration = internal.NewModule("orchestration"). "--temporal-address=" + internal.GetTemporalAddress(), "--temporal-task-queue=" + test.ID(), "--worker", + "--publisher-nats-enabled", + "--publisher-nats-client-id=ledger", + "--publisher-nats-url=" + internal.GetNatsAddress(), + fmt.Sprintf("--topics=%s-ledger", test.ID()), + fmt.Sprintf("--topics=%s-payments", test.ID()), } }), ) diff --git a/tests/integration/internal/service.go b/tests/integration/internal/service.go index 4e34206580..ed8a2ce6f5 100644 --- a/tests/integration/internal/service.go +++ b/tests/integration/internal/service.go @@ -26,6 +26,7 @@ type cobraCommandService struct { command func() *cobra.Command name string cancel func() + started bool appContext context.Context running bool } diff --git a/tests/integration/suite/orchestration-triggers.go b/tests/integration/suite/orchestration-triggers.go new file mode 100644 index 0000000000..357b9cf7ac --- /dev/null +++ b/tests/integration/suite/orchestration-triggers.go @@ -0,0 +1,153 @@ +package suite + +import ( + "github.com/formancehq/formance-sdk-go/pkg/models/operations" + "github.com/formancehq/formance-sdk-go/pkg/models/shared" + paymentsevents "github.com/formancehq/payments/pkg/events" + "github.com/formancehq/stack/libs/go-libs/publish" + . "github.com/formancehq/stack/tests/integration/internal" + "github.com/formancehq/stack/tests/integration/internal/modules" + "github.com/google/uuid" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "math/big" + "net/http" + "strings" + "time" +) + +var _ = WithModules([]*Module{modules.Auth, modules.Orchestration, modules.Ledger}, func() { + BeforeEach(func() { + createLedgerResponse, err := Client().Ledger.CreateLedger(TestContext(), operations.CreateLedgerRequest{ + Ledger: "default", + }) + Expect(err).To(BeNil()) + Expect(createLedgerResponse.StatusCode).To(Equal(http.StatusNoContent)) + }) + When("creating a new workflow and a trigger on payments creation", func() { + var ( + createTriggerResponse *operations.CreateTriggerResponse + ) + BeforeEach(func() { + response, err := Client().Orchestration.CreateWorkflow( + TestContext(), + &shared.CreateWorkflowRequest{ + Name: ptr(uuid.NewString()), + Stages: []map[string]interface{}{ + { + "send": map[string]any{ + "source": map[string]any{ + "account": map[string]any{ + "id": "world", + }, + }, + "destination": map[string]any{ + "account": map[string]any{ + "id": "${account}", + }, + }, + "amount": map[string]any{ + "amount": "${amount}", + "asset": "${asset}", + }, + }, + }, + }, + }, + ) + Expect(err).ToNot(HaveOccurred()) + Expect(response.StatusCode).To(Equal(201)) + + createTriggerResponse, err = Client().Orchestration.CreateTrigger( + TestContext(), + &shared.TriggerData{ + Event: paymentsevents.EventTypeSavedPayments, + WorkflowID: response.CreateWorkflowResponse.Data.ID, + Vars: map[string]any{ + "account": `replace(event.id, "-", "_")`, + "amount": "event.amount", + "asset": "event.asset", + }, + }, + ) + Expect(err).ToNot(HaveOccurred()) + }) + It("should be ok and the trigger should be available on list", func() { + Expect(createTriggerResponse.StatusCode).To(Equal(201)) + Expect(createTriggerResponse.CreateTriggerResponse.Data.ID).NotTo(BeEmpty()) + + listTriggersResponse, err := Client().Orchestration.ListTriggers(TestContext()) + Expect(err).To(BeNil()) + Expect(listTriggersResponse.ListTriggersResponse.Data).Should(HaveLen(1)) + }) + Then("publishing a new payments in the event bus", func() { + var payment map[string]any + BeforeEach(func() { + payment = map[string]any{ + "amount": 100, + "asset": "USD/2", + "id": uuid.NewString(), + } + PublishPayments(publish.EventMessage{ + Date: time.Now(), + App: "payments", + Type: paymentsevents.EventTypeSavedPayments, + Payload: payment, + }) + }) + It("Should trigger the workflow", func() { + var ( + listTriggersOccurrencesResponse *operations.ListTriggersOccurrencesResponse + err error + ) + Eventually(func(g Gomega) []shared.TriggerOccurrence { + listTriggersOccurrencesResponse, err = Client().Orchestration.ListTriggersOccurrences(TestContext(), operations.ListTriggersOccurrencesRequest{ + TriggerID: createTriggerResponse.CreateTriggerResponse.Data.ID, + }) + g.Expect(err).To(BeNil()) + return listTriggersOccurrencesResponse.ListTriggersOccurrencesResponse.Data + }).ShouldNot(BeEmpty()) + + var getInstanceResponse *operations.GetInstanceResponse + Eventually(func() bool { + getInstanceResponse, err = Client().Orchestration.GetInstance(TestContext(), operations.GetInstanceRequest{ + InstanceID: listTriggersOccurrencesResponse.ListTriggersOccurrencesResponse.Data[0].WorkflowInstanceID, + }) + Expect(err).To(BeNil()) + + return getInstanceResponse.GetWorkflowInstanceResponse.Data.Terminated + }).Should(BeTrue()) + + Expect(*getInstanceResponse.GetWorkflowInstanceResponse.Data.Error).To(BeEmpty()) + + listTransactionsResponse, err := Client().Ledger.V2.ListTransactions(TestContext(), operations.ListTransactionsRequest{ + Ledger: "default", + }) + Expect(err).To(BeNil()) + Expect(listTransactionsResponse.TransactionsCursorResponse.Cursor.Data).To(HaveLen(1)) + Expect(listTransactionsResponse.TransactionsCursorResponse.Cursor.Data[0].Postings).To(HaveLen(1)) + Expect(listTransactionsResponse.TransactionsCursorResponse.Cursor.Data[0].Postings[0].Source). + To(Equal("world")) + Expect(listTransactionsResponse.TransactionsCursorResponse.Cursor.Data[0].Postings[0].Destination). + To(Equal(strings.Replace(payment["id"].(string), "-", "_", -1))) + Expect(listTransactionsResponse.TransactionsCursorResponse.Cursor.Data[0].Postings[0].Asset). + To(Equal("USD/2")) + Expect(listTransactionsResponse.TransactionsCursorResponse.Cursor.Data[0].Postings[0].Amount). + To(Equal(big.NewInt(100))) + }) + }) + Then("deleting the trigger", func() { + BeforeEach(func() { + _, err := Client().Orchestration.DeleteTrigger(TestContext(), operations.DeleteTriggerRequest{ + TriggerID: createTriggerResponse.CreateTriggerResponse.Data.ID, + }) + Expect(err).To(BeNil()) + }) + It("should not appear on list", func() { + listTriggersResponse, err := Client().Orchestration.ListTriggers(TestContext()) + Expect(err).To(BeNil()) + Expect(listTriggersResponse.ListTriggersResponse.Data).Should(HaveLen(0)) + }) + }) + }) +}) diff --git a/tests/integration/suite/orchestration-workflows-execute.go b/tests/integration/suite/orchestration-workflows-execute.go index b8090a6376..bd948c101f 100644 --- a/tests/integration/suite/orchestration-workflows-execute.go +++ b/tests/integration/suite/orchestration-workflows-execute.go @@ -97,6 +97,7 @@ var _ = WithModules([]*Module{modules.Orchestration, modules.Auth, modules.Ledge Expect(response.StatusCode).To(Equal(200)) instanceResponse = response.GetWorkflowInstanceResponse + return response.GetWorkflowInstanceResponse.Data.Terminated }).Should(BeTrue()) })