From 316856237aa513dce3764fae6481ded4484be554 Mon Sep 17 00:00:00 2001 From: Dimitrios Vasilas Date: Wed, 7 Jan 2026 11:11:52 +0200 Subject: [PATCH 1/8] LOGC-40: Update workbench values.yaml - Update services to the latest versions - Add clickhouse.image - Enable access_logging feature --- env/default/values.yaml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/env/default/values.yaml b/env/default/values.yaml index 2c7c30b..d9e3a88 100644 --- a/env/default/values.yaml +++ b/env/default/values.yaml @@ -2,16 +2,17 @@ global: log_level: info features: - scuba: - enabled: false - enable_service_user: false - + access_logging: + enabled: true cloudserver: - image: ghcr.io/scality/cloudserver:7.70.77 + image: ghcr.io/scality/cloudserver:9.2.14 vault: - image: ghcr.io/scality/vault:7.81.0 + image: ghcr.io/scality/vault:7.83.0 s3_metadata: - image: ghcr.io/scality/metadata:8.19.0-standalone + image: ghcr.io/scality/metadata:9.0.0-standalone + +clickhouse: + image: clickhouse/clickhouse-server:24.3.2.23-alpine From 93098b9ea6250fc8133cf1b5d1620bd590fb6f78 Mon Sep 17 00:00:00 2001 From: Dimitrios Vasilas Date: Wed, 7 Jan 2026 11:32:04 +0200 Subject: [PATCH 2/8] LOGC-40: Update ClickHouse cluster name Workbench uses workbench_cluster. --- pkg/testutil/clickhouse.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/testutil/clickhouse.go b/pkg/testutil/clickhouse.go index 6ab4a92..318c0a7 100644 --- a/pkg/testutil/clickhouse.go +++ b/pkg/testutil/clickhouse.go @@ -68,7 +68,7 @@ ORDER BY (raftSessionID, bucketName, insertedAt, timestamp, req_id) const schemaAccessLogsFederated = ` CREATE TABLE IF NOT EXISTS %s.access_logs_federated AS %s.access_logs -ENGINE = Distributed(test_cluster, %s, access_logs, raftSessionID) +ENGINE = Distributed(workbench_cluster, %s, access_logs, raftSessionID) ` const schemaOffsetsLocal = ` @@ -86,7 +86,7 @@ ORDER BY (bucketName, raftSessionID) const schemaOffsetsFederated = ` CREATE TABLE IF NOT EXISTS %s.offsets_federated AS %s.offsets -ENGINE = Distributed(test_cluster, %s, offsets, raftSessionID) +ENGINE = Distributed(workbench_cluster, %s, offsets, raftSessionID) ` // ========================================== From 1a7acdd5846549a4c18acdaa3be7cd32f4d971eb Mon Sep 17 00:00:00 2001 From: Dimitrios Vasilas Date: Wed, 7 Jan 2026 11:43:14 +0200 Subject: [PATCH 3/8] LOGC-40: Remove local ClickHouse infrastructure --- .github/workflows/tests.yaml | 14 --------- deployment/clickhouse-config.xml | 23 --------------- docker-compose.yml | 50 -------------------------------- 3 files changed, 87 deletions(-) delete mode 100644 deployment/clickhouse-config.xml diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index ee43b3e..dfacb2b 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -38,14 +38,6 @@ jobs: - name: Start Workbench uses: scality/workbench@v0.8.0 - - name: Start ClickHouse - run: docker compose up -d - - - name: Wait for ClickHouse to be ready - run: | - timeout 30 bash -c 'until docker compose exec -T clickhouse-shard-1 clickhouse-client --query "SELECT 1" > /dev/null 2>&1; do sleep 1; done' - timeout 30 bash -c 'until docker compose exec -T clickhouse-shard-2 clickhouse-client --query "SELECT 1" > /dev/null 2>&1; do sleep 1; done' - - name: Run GolangCI linter uses: golangci/golangci-lint-action@v9 with: @@ -75,9 +67,3 @@ jobs: run: | workbench logs workbench down - - - name: Stop ClickHouse - if: always() - run: | - docker compose logs - docker compose down diff --git a/deployment/clickhouse-config.xml b/deployment/clickhouse-config.xml deleted file mode 100644 index 9013407..0000000 --- a/deployment/clickhouse-config.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - clickhouse-shard-1 - 9000 - default - - - - - - clickhouse-shard-2 - 9000 - default - - - - - - diff --git a/docker-compose.yml b/docker-compose.yml index 080d45b..2599fa8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,44 +1,4 @@ services: - clickhouse-shard-1: - image: docker.io/clickhouse/clickhouse-server:24.3.2.23-alpine - container_name: log-courier-clickhouse-shard-1 - hostname: clickhouse-shard-1 - ports: - - "9002:9000" # Native protocol - - "8123:8123" # HTTP interface - environment: - CLICKHOUSE_DB: logs - CLICKHOUSE_USER: default - CLICKHOUSE_PASSWORD: "" - volumes: - - clickhouse-shard-1-data:/var/lib/clickhouse - - ./deployment/clickhouse-config.xml:/etc/clickhouse-server/config.d/cluster.xml:ro - healthcheck: - test: ["CMD", "clickhouse-client", "--query", "SELECT 1"] - interval: 10s - timeout: 5s - retries: 5 - - clickhouse-shard-2: - image: docker.io/clickhouse/clickhouse-server:24.3.2.23-alpine - container_name: log-courier-clickhouse-shard-2 - hostname: clickhouse-shard-2 - ports: - - "9003:9000" # Native protocol - - "8124:8123" # HTTP interface - environment: - CLICKHOUSE_DB: logs - CLICKHOUSE_USER: default - CLICKHOUSE_PASSWORD: "" - volumes: - - clickhouse-shard-2-data:/var/lib/clickhouse - - ./deployment/clickhouse-config.xml:/etc/clickhouse-server/config.d/cluster.xml:ro - healthcheck: - test: ["CMD", "clickhouse-client", "--query", "SELECT 1"] - interval: 10s - timeout: 5s - retries: 5 - log-courier: build: context: . @@ -48,19 +8,9 @@ services: network_mode: host profiles: - full - depends_on: - clickhouse-shard-1: - condition: service_healthy - clickhouse-shard-2: - condition: service_healthy environment: SUPERVISORD_CONF: supervisord.conf volumes: - ./deployment/conf/supervisord.conf:/conf/supervisord.conf:ro - ./deployment/conf/env:/conf/env:ro -volumes: - clickhouse-shard-1-data: - driver: local - clickhouse-shard-2-data: - driver: local From 2630924cd5fb02e3cb8ad214edd8711452dfe937 Mon Sep 17 00:00:00 2001 From: Dimitrios Vasilas Date: Wed, 7 Jan 2026 11:44:25 +0200 Subject: [PATCH 4/8] LOGC-40: Bump workbench to v0.9.0 --- .github/workflows/tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index dfacb2b..7233205 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -36,7 +36,7 @@ jobs: password: ${{ github.token }} - name: Start Workbench - uses: scality/workbench@v0.8.0 + uses: scality/workbench@v0.9.0 - name: Run GolangCI linter uses: golangci/golangci-lint-action@v9 From e77978ed6a0390d07fce5cbb59592444d360a3c3 Mon Sep 17 00:00:00 2001 From: Dimitrios Vasilas Date: Wed, 7 Jan 2026 15:30:39 +0200 Subject: [PATCH 5/8] LOGC-40: Exclude non-code directories from test pattern This prevents "permission denied" errors when go test tries to scan workbench-created directories. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9ea6cef..ef8fd87 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ clean: test: all mkdir -p $(COVDATA_DIR) - COVDATA_DIR=$(COVDATA_DIR) go test $(COVER_TESTFLAGS) -v ./... + COVDATA_DIR=$(COVDATA_DIR) go test $(COVER_TESTFLAGS) -v ./cmd/... ./pkg/... test-coverage: COVER_BUILDFLAGS=$(COVER_COMMONFLAGS) test-coverage: COVER_TESTFLAGS=$(COVER_COMMONFLAGS) -coverprofile cover.out From 5b728e5a4a5060c84c6135191d23d9f4440ae41e Mon Sep 17 00:00:00 2001 From: Dimitrios Vasilas Date: Wed, 7 Jan 2026 15:32:25 +0200 Subject: [PATCH 6/8] LOGC-40: Add workbench ClickHouse setup wait - Run linter before workbench to avoid permission errors on env/ - Wait for workbench setup container and both ClickHouse shards (port 9002) --- .github/workflows/tests.yaml | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 7233205..ff770f5 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -35,14 +35,34 @@ jobs: username: ${{ github.repository_owner }} password: ${{ github.token }} - - name: Start Workbench - uses: scality/workbench@v0.9.0 - - name: Run GolangCI linter uses: golangci/golangci-lint-action@v9 with: version: v2.1.6 + - name: Start Workbench + uses: scality/workbench@v0.9.0 + + - name: Wait for ClickHouse setup and fix permissions + run: | + # Wait for workbench setup container to complete + timeout 60 bash -c 'until [ "$(docker inspect -f {{.State.Status}} workbench-setup-clickhouse 2>/dev/null)" = "exited" ]; do sleep 1; done' + + # Wait for ClickHouse shards to be ready (workbench uses port 9002 internally) + for i in {1..30}; do + if docker exec workbench-clickhouse-shard-1 clickhouse-client --host localhost --port 9002 --query "SELECT 1" >/dev/null 2>&1; then + break + fi + sleep 2 + done + + for i in {1..30}; do + if docker exec workbench-clickhouse-shard-2 clickhouse-client --host localhost --port 9002 --query "SELECT 1" >/dev/null 2>&1; then + break + fi + sleep 2 + done + - name: Run unit tests run: make test-coverage From c2733cc5197e4bfaa632461ff23ece73894f4461 Mon Sep 17 00:00:00 2001 From: Dimitrios Vasilas Date: Wed, 7 Jan 2026 11:45:04 +0200 Subject: [PATCH 7/8] LOGC-40: Add dependabot monitoring for workbench dependencies --- .github/dependabot.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index ae46521..4df5d3c 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -16,3 +16,17 @@ updates: directory: "/images/svc-base/" schedule: interval: "weekly" + + - package-ecosystem: "docker" + directories: + - /env/default + schedule: + interval: "weekly" + ignore: + - dependency-name: "clickhouse/clickhouse-server" + groups: + workbench: + patterns: + - "*" + update-types: + - patch From f5e13a49beac7e1438166803fff1882744eff6ff Mon Sep 17 00:00:00 2001 From: Dimitrios Vasilas Date: Mon, 12 Jan 2026 11:14:45 +0200 Subject: [PATCH 8/8] LOGC-40: Fix race condition in error handling tests --- pkg/logcourier/processor_test.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pkg/logcourier/processor_test.go b/pkg/logcourier/processor_test.go index abe404f..e027943 100644 --- a/pkg/logcourier/processor_test.go +++ b/pkg/logcourier/processor_test.go @@ -423,21 +423,21 @@ var _ = Describe("Processor", func() { _ = testProcessor.Run(testCtx) }() - // Wait for upload attempt + // Wait for upload to fail Eventually(func() int64 { - return countingUploader.GetUploadCount() + return countingUploader.GetFailureCount() }).WithTimeout(3 * time.Second).WithPolling(100 * time.Millisecond).Should( BeNumerically(">=", 1), ) uploadCount := countingUploader.GetUploadCount() + failureCount := countingUploader.GetFailureCount() cancel() // Verify only one upload attempt was made Expect(uploadCount).To(Equal(int64(1)), "Should attempt upload exactly once") // Verify the upload failed - failureCount := countingUploader.GetFailureCount() Expect(failureCount).To(Equal(int64(1)), "Upload should have failed") // Verify offset was not committed @@ -505,21 +505,21 @@ var _ = Describe("Processor", func() { _ = testProcessor.Run(testCtx) }() - // Wait for upload attempt + // Wait for upload to fail Eventually(func() int64 { - return countingUploader.GetUploadCount() + return countingUploader.GetFailureCount() }).WithTimeout(3 * time.Second).WithPolling(100 * time.Millisecond).Should( BeNumerically(">=", 1), ) uploadCount := countingUploader.GetUploadCount() + failureCount := countingUploader.GetFailureCount() cancel() // Verify only one upload attempt was made Expect(uploadCount).To(Equal(int64(1)), "Should attempt upload exactly once") // Verify the upload failed - failureCount := countingUploader.GetFailureCount() Expect(failureCount).To(Equal(int64(1)), "Upload should have failed") // Verify offset was not committed @@ -672,21 +672,21 @@ var _ = Describe("Processor", func() { _ = testProcessor.Run(testCtx) }() - // Wait for upload attempt + // Wait for upload to fail Eventually(func() int64 { - return countingUploader.GetUploadCount() + return countingUploader.GetFailureCount() }).WithTimeout(3 * time.Second).WithPolling(100 * time.Millisecond).Should( BeNumerically(">=", 1), ) uploadCount := countingUploader.GetUploadCount() + failureCount := countingUploader.GetFailureCount() cancel() // Verify only one upload attempt was made Expect(uploadCount).To(Equal(int64(1)), "Should attempt upload exactly once") // Verify the upload failed - failureCount := countingUploader.GetFailureCount() Expect(failureCount).To(Equal(int64(1)), "Upload should have failed") // Verify offset was not committed