Skip to content

OSAC-3424: implement M360 metering adapter - #236

Merged
omer-vishlitzky merged 4 commits into
osac-project:mainfrom
amito:feat/OSAC-3423-m360-adapter
Aug 12, 2026
Merged

OSAC-3424: implement M360 metering adapter#236
omer-vishlitzky merged 4 commits into
osac-project:mainfrom
amito:feat/OSAC-3423-m360-adapter

Conversation

@amito

@amito amito commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Description

Standalone Go binary that consumes OSAC metering CloudEvents from Kafka and
forwards them to the Monetize360 (M360) Usage API via REST. Implements the
ProviderAdapter interface using the existing adapter Runner framework
(Kafka consumption, dedup, retry, offset management all handled by the Runner).

The adapter translates nested CloudEvents to M360's flat payload format and
routes to the correct M360 endpoint by resource type:

Resource Type M360 Endpoint
compute_instance (VMaaS) POST /vmaas/event
cluster_order (CaaS) POST /caas/event
maas_inference (MaaS) POST /maas/event

Key behaviors:

  • Per-event submit (M360 API is per-event; no batch endpoint)
  • Defaults to adapters.AllTopics (lifecycle, heartbeat, corrections, inference); overridable via KAFKA_TOPICS env var (rejects empty override)
  • Bearer token auth from K8s Secret file mount
  • Error classification: 4xx → non-retryable (except 408/429), 5xx → retryable by Runner
  • HTTP 408 (Request Timeout) and 429 (Too Many Requests) treated as retryable
  • Null/empty fields replaced with " " (space string) per M360 convention
  • Non-billable billing_dimensions (nil, empty, zero) are skipped
  • billing_dimensions cannot overwrite canonical CloudEvent/data fields
  • Malformed billing_dimensions (non-nil, non-map) returns NonRetryableError
  • Validates CloudEvent ID (non-empty) and timestamp (non-zero) before translation
  • Response body truncated to 256 bytes in error messages to prevent log leakage
  • Flush interval uses framework default (10s) — configurable via FLUSH_INTERVAL env var
  • Rejects negative FLUSH_INTERVAL values (prevents time.NewTicker panic)
  • TLS enabled by default, configurable API version (default v1)
  • GET /healthz — liveness probe (always 200)
  • GET /readyz — readiness probe (M360 connectivity check, timeoutSeconds: 5 to accommodate upstream latency)
  • Helm deployment gated by m360Adapter.enabled: false (disabled by default)
  • Helm required checks for apiKeySecret, apiUrl, image.repository, image.tag
  • Graceful HTTP server shutdown on SIGTERM with ReadHeaderTimeout
  • CI image-build workflow (build-metering-m360-adapter-image.yaml) — mirrors echo-adapter workflow

Files

File Purpose
adapters/cmd/m360-adapter/translate.go CloudEvent → flat M360 payload, endpoint routing
adapters/cmd/m360-adapter/client.go HTTP client, Bearer auth, error classification
adapters/cmd/m360-adapter/main.go Entry point, env config, health/metrics server
adapters/cmd/m360-adapter/m360_adapter_suite_test.go Ginkgo suite bootstrap
adapters/Containerfile.m360-adapter Multi-stage UBI 10 container build
adapters/Makefile all default target, build-m360-adapter, recursive test/lint
.github/workflows/build-metering-m360-adapter-image.yaml CI image build workflow
charts/osac-metering/templates/m360-adapter-* Deployment, KafkaUser, Service
charts/osac-metering/templates/kafka-secrets-rbac.yaml RBAC for m360-adapter Kafka secret
charts/osac-metering/values.yaml m360Adapter config section

Jira

Not Included

  • Kafka-based ingestion to M360 — deferred to a follow-up story; this PR
    uses REST API only
  • Batch/bulk event submission — M360 API is per-event, no batch endpoint
    exists
  • M360 account/tenant provisioning — out of scope
  • DLQ handling — handled by the Runner framework (no adapter-level changes)
  • Shared schema package — adapter intentionally decouples from
    metering-service's Go module, depending only on CloudEvents SDK and
    M360 API contract; track as fast-follow if schema drift becomes a concern
  • SHA-pinned Actions / cosign signing — all repo workflows use floating
    version tags; pinning and signing should be a repo-wide effort, not
    introduced in a single adapter PR
  • Configurable Secret key name in Helm chart — the adapter expects the
    Secret to have a key named api-key (documented in values.yaml); making
    this configurable is a follow-up enhancement
  • automountServiceAccountToken: false — valid security hardening, but
    should be applied consistently across all chart deployments (metering-service,
    echo-adapter, m360-adapter) in a dedicated follow-up

References

How Has This Been Tested?

23 Ginkgo unit tests across 3 suites (105 total specs):

  • Translation (13 tests): VMaaS/CaaS/MaaS event translation, null→space
    conversion, empty string→space conversion, nil billing_dimensions handling,
    non-billable billing_dimensions filtering, malformed billing_dimensions (non-map)
    error, canonical field overwrite protection, unknown resource_type error,
    empty CloudEvent ID error, zero timestamp error, malformed CloudEvent error
  • HTTP client (10 tests): POST with correct URL/auth/body, configurable API
    version, NonRetryableError on 400/401, retryable error on 408/429, retryable
    error on 500, context cancellation, health check success/failure
cd osac-metering/adapters
make test   # 105 specs across 3 suites (Adapters 67, Echo 15, M360 23)
make lint   # 0 issues (recursive ./...)

Manual end-to-end testing (adapter → M360 UAT/simulator) to be performed
during deployment validation.

Merge criteria:

  • The commits are squashed in a cohesive manner and have meaningful messages.
  • Testing instructions have been added in the PR body (for PRs involving changes that are not immediately obvious).
  • The developer has manually tested the changes and verified that the changes work

@openshift-ci-robot

openshift-ci-robot commented Aug 10, 2026

Copy link
Copy Markdown

@amito: This pull request references OSAC-3424 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Description

Standalone Go binary that consumes OSAC metering CloudEvents from Kafka and
forwards them to the Monetize360 (M360) Usage API via REST. Implements the
ProviderAdapter interface using the existing adapter Runner framework
(Kafka consumption, dedup, retry, offset management all handled by the Runner).

The adapter translates nested CloudEvents to M360's flat payload format and
routes to the correct M360 endpoint by resource type:

Resource Type M360 Endpoint
compute_instance (VMaaS) POST /vmaas/event
cluster_order (CaaS) POST /caas/event
maas_inference (MaaS) POST /maas/event

Key behaviors:

  • Per-event submit (M360 API is per-event; no batch endpoint)
  • Bearer token auth from K8s Secret file mount
  • Error classification: 4xx → non-retryable, 5xx → retryable by Runner
  • Null/empty fields replaced with " " (space string) per M360 convention
  • TLS enabled by default, configurable API version (default v1)
  • Helm deployment gated by m360Adapter.enabled: false (disabled by default)

Files

File Purpose
adapters/cmd/m360-adapter/translate.go CloudEvent → flat M360 payload, endpoint routing
adapters/cmd/m360-adapter/client.go HTTP client, Bearer auth, error classification
adapters/cmd/m360-adapter/main.go Entry point, env config, health/metrics server
adapters/Containerfile.m360-adapter Multi-stage UBI 10 container build
adapters/Makefile build-m360-adapter target
charts/osac-metering/templates/m360-adapter-* Deployment, KafkaUser, Service
charts/osac-metering/templates/kafka-secrets-rbac.yaml RBAC for m360-adapter Kafka secret
charts/osac-metering/values.yaml m360Adapter config section

Jira

Not Included

  • Kafka-based ingestion to M360 — deferred to a follow-up story; this PR
    uses REST API only
  • Batch/bulk event submission — M360 API is per-event, no batch endpoint
    exists
  • M360 account/tenant provisioning — out of scope
  • DLQ handling — handled by the Runner framework (no adapter-level changes)
  • Configurable Secret key name in Helm chart — the adapter expects the
    Secret to have a key named api-key (documented in values.yaml); making
    this configurable is a follow-up enhancement

References

How Has This Been Tested?

16 Ginkgo unit tests covering:

  • Translation (6 tests): VMaaS/CaaS/MaaS event translation, null→space
    conversion, empty string→space conversion, nil billing_dimensions handling,
    unknown resource_type error, malformed CloudEvent error
  • HTTP client (8 tests): POST with correct URL/auth/body, configurable API
    version, NonRetryableError on 400/401, retryable error on 500, context
    cancellation, health check success/failure
  • Edge cases (2 tests): empty string field conversion, missing
    billing_dimensions with valid resource type
cd osac-metering/adapters
go run github.com/onsi/ginkgo/v2/ginkgo run ./cmd/m360-adapter/
# 16 of 16 Specs passing
make lint
# 0 issues

Manual end-to-end testing (adapter → M360 UAT/simulator) to be performed
during deployment validation.

Merge criteria:

  • The commits are squashed in a cohesive manner and have meaningful messages.
  • Testing instructions have been added in the PR body (for PRs involving changes that are not immediately obvious).
  • The developer has manually tested the changes and verified that the changes work

Assisted-by: Claude Code noreply@anthropic.com

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci

openshift-ci Bot commented Aug 10, 2026

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: amito

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

The PR adds an M360 Kafka adapter that translates OSAC CloudEvents, sends them to the M360 Usage API, exposes health and metrics endpoints, and provides container, CI, and conditional Helm deployment support.

Changes

M360 adapter

Layer / File(s) Summary
CloudEvent translation and validation
osac-metering/adapters/cmd/m360-adapter/translate.go, osac-metering/adapters/cmd/m360-adapter/translate_test.go
Maps VMaaS, CaaS, and MaaS events to M360 payloads. Tests cover field mapping, value normalization, billing dimensions, and non-retryable validation errors.
M360 API client
osac-metering/adapters/cmd/m360-adapter/client.go, osac-metering/adapters/cmd/m360-adapter/client_test.go
Adds authenticated event posting, health checks, bounded response handling, retry classification, and HTTP client tests.
Kafka adapter runtime
osac-metering/adapters/cmd/m360-adapter/main.go, osac-metering/adapters/cmd/m360-adapter/m360_adapter_suite_test.go, osac-metering/adapters/Makefile
Adds environment validation, Kafka and API wiring, metrics and health endpoints, topic parsing, API-key loading, graceful shutdown, and recursive test and lint targets.
Build and image publishing
osac-metering/adapters/Containerfile.m360-adapter, .github/workflows/build-metering-m360-adapter-image.yaml
Adds a non-root UBI image build and a workflow that builds and publishes tagged images.
Conditional Helm deployment
osac-metering/charts/osac-metering/values.yaml, osac-metering/charts/osac-metering/templates/*m360*, osac-metering/charts/osac-metering/templates/kafka-secrets-rbac.yaml
Adds optional Deployment, Service, KafkaUser, secret access, credential setup, probes, configuration, and restricted security settings.
Supporting test fixture cleanup
osac-metering/adapters/cmd/echo-adapter/store_test.go
Reformats JSON fixture alignment without changing values or behavior.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Kafka
  participant Runner
  participant m360Adapter
  participant translateEvent
  participant m360Client
  participant M360UsageAPI
  Kafka->>Runner: Deliver OSAC CloudEvent
  Runner->>m360Adapter: Process event
  m360Adapter->>translateEvent: Translate CloudEvent
  translateEvent-->>m360Adapter: Return M360 payload
  m360Adapter->>m360Client: Post usage event
  m360Client->>M360UsageAPI: Authenticated HTTP POST
  M360UsageAPI-->>m360Client: Return response
  m360Client-->>m360Adapter: Return delivery result
Loading

Possibly related PRs

Suggested reviewers: danielerez, masayag

🚥 Pre-merge checks | ✅ 5 | ❌ 6

❌ Failed checks (6 inconclusive)

Check name Status Explanation Resolution
No-Hardcoded-Secrets ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
No-Weak-Crypto ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
No-Injection-Vectors ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Container-Privileges ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
No-Sensitive-Data-In-Logs ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
Ai-Attribution ❓ Inconclusive Repository clone failed, so this custom check could not run with code access. Retry the review run. If this persists, inspect pre-merge custom-check logs for infrastructure or agent runtime failures.
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: implementing the M360 metering adapter.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@amito
amito force-pushed the feat/OSAC-3423-m360-adapter branch from 1f43bc5 to f15efae Compare August 10, 2026 11:38
@amito
amito force-pushed the feat/OSAC-3423-m360-adapter branch from f15efae to ba9705a Compare August 10, 2026 12:22
@amito
amito force-pushed the feat/OSAC-3423-m360-adapter branch from ba9705a to fc245b6 Compare August 11, 2026 07:02
@amito
amito force-pushed the feat/OSAC-3423-m360-adapter branch from fc245b6 to e490c40 Compare August 11, 2026 07:03
@amito
amito marked this pull request as ready for review August 11, 2026 07:04
@openshift-ci
openshift-ci Bot requested review from danielerez and masayag August 11, 2026 07:04
fullsend-ai-review[bot]

This comment was marked as outdated.

@masayag

masayag commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Final Review — Follow-up Verification

Re-checked out the latest head (f9c2f9d) and re-ran the same verification commands as before (not just reading the diff) to confirm which of the prior findings (earlier review) are actually resolved.

Fixed ✅

  • HIGH — missing image-build workflow: .github/workflows/build-metering-m360-adapter-image.yaml added, mirrors the echo-adapter workflow.
  • MEDIUM — silent fallback on malformed billing_dimensions: now returns NonRetryableError on a non-map value instead of silently skipping the merge.
  • MEDIUM — flush interval diverged from framework default: main.go now leaves flushInterval at its zero value unless FLUSH_INTERVAL is set, so the Runner's 10s default applies (previously hardcoded to 5s), with added negative-duration validation.
  • LOW — dead case int: in isZeroValue: removed, replaced with a comment explaining float64-only decoding.
  • Bonus fixes I didn't flag but are also done: main.go now uses adapters.AllTopics instead of a hardcoded topic list (this also fixes the missing osac.metering.corrections topic another reviewer caught), and /healthz//readyz are now split (liveness always 200, readiness checks M360) so an M360 outage won't trigger pod restarts. client_test.go gained an HTTP 408 case (23/23 specs now).

Still open — CRITICAL — CI still doesn't run the new tests ⚠️

osac-metering/adapters/Makefile's test target was fixed to $(GINKGO) run -r ., but .github/workflows/unit-tests.yml's run-osac-metering-adapters-tests job (line 102) still calls ginkgo run . directly — it doesn't invoke make test. I re-ran it exactly as CI does:

ginkgo run .     → 67 specs   (Adapters Suite only — unchanged)
make test        → 105 specs (Adapters: 67, Echo Adapter: 15, M360 Adapter: 23)

So the Run unit tests (osac-metering/adapters) CI check will still pass without ever executing client_test.go or translate_test.go, regardless of whether they're broken. This is the one item from the last round that isn't actually resolved yet — the Makefile fix alone doesn't change what CI runs.

Suggestion: change line 102 of .github/workflows/unit-tests.yml from ginkgo run . to ginkgo run -r ..

(Side note: there's no CI lint gate for osac-metering/adapters at all today — make lint now correctly scopes to ./... and passes with 0 issues when run manually, but that's not wired into any workflow. Pre-existing, not a regression from this PR, fine to leave for a follow-up.)

Still open — not blocking, but worth doing

  • Docs: osac-metering/AGENTS.md, CLAUDE.md, and README.md still have zero mentions of m360-adapter (README's components table doesn't list adapters/ at all). Flagged repeatedly across review passes; fine as an immediate fast-follow but would be nice to land in this PR since it's a small diff.
  • Readiness probe timeout: m360-adapter-deployment.yaml's readinessProbe hits /readyz, which makes a synchronous call to M360 (client timeout 30s), but the probe has no explicit timeoutSeconds (kubelet default is 1s). Any M360 latency above ~1s will flap the pod out of Ready even though it's otherwise healthy. Since m360Adapter.enabled: false by default, this isn't merge-blocking, but should be fixed (e.g., timeoutSeconds: 5) before anyone flips it on.
  • DRY / shared schema (from the earlier DRY discussion): still not addressed — translate.go still hand-derives resource-type/field constants instead of sharing them with metering-service/internal/events. Agreed previously this is fine as a tracked fast-follow against OSAC-3411 rather than a blocker.

Verdict

Good shape overall — 4 of 6 original findings are cleanly resolved plus two bonus fixes. One item remains a genuine blocker for me: the CI workflow still doesn't execute the new tests, which was the core of the original CRITICAL finding (the Makefile fix doesn't change CI behavior since the workflow doesn't call make test). Once unit-tests.yml line 102 is updated to ginkgo run -r ., I'm good to approve.

@amito
amito force-pushed the feat/OSAC-3423-m360-adapter branch from f9c2f9d to e05f805 Compare August 12, 2026 08:42
@omer-vishlitzky
omer-vishlitzky dismissed stale reviews from coderabbitai[bot], coderabbitai[bot], coderabbitai[bot], and coderabbitai[bot] August 12, 2026 08:42

Auto-dismissed: only Prow labels gate merging

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 12, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 8:43 AM UTC · Completed 8:58 AM UTC

Commit: e05f805 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

amito added 4 commits August 12, 2026 13:13
Implements translateEvent() function that converts OSAC metering
CloudEvents to flat M360 Usage API payloads with endpoint routing.

- Maps resource types to M360 endpoints (compute_instance -> /vmaas/event,
  cluster_order -> /caas/event, maas_inference -> /maas/event)
- Flattens nested billing_dimensions to top-level fields
- Converts nil/empty values to M360 space string convention
- Returns NonRetryableError for unknown resource types and malformed data

Test coverage: 6 tests covering VMaaS, CaaS, MaaS events and error cases.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Amit Oren <amoren@redhat.com>
Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Amit Oren <amoren@redhat.com>
Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Amit Oren <amoren@redhat.com>
Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Amit Oren <amoren@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 12, 2026

Copy link
Copy Markdown

🤖 Review · ❌ Terminated · Started 10:15 AM UTC · Ended 10:34 AM UTC

Commit: 380e6f7 · View workflow run →

@masayag

masayag commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

/lgtm

@fullsend-ai-review fullsend-ai-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the review comment for full details.

}
return v
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] edge-case

isZeroValue filters numeric zero from billing_dimensions, silently dropping zero-valued dimensions (e.g., cache_creation_tokens: 0). M360 cannot distinguish not applicable from measured as zero. The behavior is intentional and tested, but the semantic distinction may matter for token-based MaaS billing.

Suggested fix: Consider sending zero values and using nil or absence to indicate not applicable. If M360 treats zero and absent identically, document this explicitly in the code comment referencing the M360 API contract.

core="${version%%-*}"
echo "RELEASE_VERSION=${version}" >> "$GITHUB_ENV"
echo "RELEASE_MAJOR_MINOR=${core%.*}" >> "$GITHUB_ENV"
echo "RELEASE_MAJOR=${core%%.*}" >> "$GITHUB_ENV"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] GHA workflow command injection

The ::error:: workflow command interpolates GITHUB_REF_NAME without sanitization for :: sequences. Practical risk is very low (requires collaborator push access, ::set-env:: disabled by default, semver regex rejects most payloads). Same pattern as existing echo-adapter workflow.

Suggested fix: Sanitize GITHUB_REF_NAME before embedding in ::error:: or use GITHUB_STEP_SUMMARY approach.

Err: fmt.Errorf("marshal M360 payload: %w", err),
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] authentication

No HTTPS enforcement on M360_API_URL. If misconfigured with an http:// URL, the Bearer token would transmit in cleartext.

Suggested fix: Consider validating that M360_API_URL starts with https:// at startup, or log a warning when using plaintext HTTP.

# tag: latest
# pullPolicy: Always

## M360 adapter — forwards metering events to Monetize360 Usage API.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] pattern-inconsistency

The m360-adapter provides real image defaults while the echo-adapter image config is commented out. The required wrappers in the deployment template are redundant given the defaults exist. Minor inconsistency with no functional impact.

@fullsend-ai-review

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 10:15 AM UTC · Completed 10:34 AM UTC

Commit: 380e6f7 · View workflow run →

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved docker Pull requests that update docker code github_actions Pull requests that update GitHub Actions code go Pull requests that update go code jira/valid-reference lgtm requires-manual-review Review requires human judgment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants