Skip to content

sr/context: implement /contexts/{context}/... prefixed handlers#30189

Merged
nguyen-andrew merged 14 commits into
redpanda-data:devfrom
nguyen-andrew:sr/context-prefix-handlers
Apr 30, 2026
Merged

sr/context: implement /contexts/{context}/... prefixed handlers#30189
nguyen-andrew merged 14 commits into
redpanda-data:devfrom
nguyen-andrew:sr/context-prefix-handlers

Conversation

@nguyen-andrew
Copy link
Copy Markdown
Member

@nguyen-andrew nguyen-andrew commented Apr 16, 2026

Implement /contexts/{context}/... prefixed routes for the Schema Registry,
allowing clients to target a non-default context by prefixing any endpoint URL
with /contexts/{context}. This is a Schema Registry compatibility
feature that lets serde clients point their schema.registry.url at a
context-prefixed base URL (e.g. http://host:8081/contexts/.serde) and
transparently register/lookup schemas in that context.

Each context-prefixed route extracts the {context} path parameter, rewrites
the request (scoping the subject, query param, or injecting a synthetic subject),
and delegates to the existing handler. Four URL-rewriting strategies cover all
endpoint shapes:

  • scope_subject_param — qualifies the {subject} path param with the context
  • scope_subject_query — injects/qualifies the ?subject query param
  • scope_subject_prefix_query — injects/prepends context into ?subjectPrefix
  • inject_context_as_subject — sets subject to context-only form for config/mode

Authorization uses a new context_prefix_subject resource type that qualifies
the subject with the context before the ACL check, so users cannot bypass
context isolation via the URL prefix.

Also fixes a bug where DELETE /contexts/{context} was not normalizing the
context path parameter before the default-context check.

Fixes CORE-15191

Backports Required

  • none - not a bug fix
  • none - this is a backport
  • none - issue does not exist in previous branches
  • none - papercut/not impactful enough to backport
  • v26.1.x
  • v25.3.x
  • v25.2.x

Release Notes

Features

  • Schema Registry now accepts /contexts/{context}/... prefixed URLs on all
    endpoints, allowing serde clients to target a non-default context by
    configuring their base URL (e.g. schema.registry.url=http://host:8081/contexts/.myctx).

@nguyen-andrew nguyen-andrew requested a review from a team as a code owner April 16, 2026 06:22
Copilot AI review requested due to automatic review settings April 16, 2026 06:22
@nguyen-andrew nguyen-andrew self-assigned this Apr 16, 2026
@nguyen-andrew nguyen-andrew requested a review from pgellert April 16, 2026 06:25
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR adds Confluent-compatible context-prefixed Schema Registry routes (/contexts/{context}/...) so clients can target non-default contexts by setting a context-prefixed base URL. It does this by introducing request-rewriting helpers to scope subjects/query params and by updating authorization to evaluate ACLs against the context-qualified subject derived from the URL prefix.

Changes:

  • Add /contexts/{context}/... route registrations that rewrite requests and delegate to existing handlers.
  • Introduce context parsing/normalization and subject scoping utilities, plus unit/integration tests for routing and ACL isolation.
  • Extend Schema Registry auth resource handling to support authorization against context-qualified subjects for prefixed routes.

Reviewed changes

Copilot reviewed 17 out of 18 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
tests/rptest/tests/schema_registry_test.py Adds end-to-end tests for context-prefixed routing, delete-context normalization, serde client base-URL behavior, and ACL isolation.
tests/go/go-kafka-serde/go.mod Updates Go toolchain/deps for the Go serde test client (used by the new serde acceptance test).
tests/go/go-kafka-serde/go.sum Updates dependency lockfile for the Go serde test client.
src/v/utils/variant.h Adds extend_variant_t helper to extend std::variant types.
src/v/utils/tests/variant_test.cc Compile-only test coverage for extend_variant_t.
src/v/utils/tests/BUILD Registers the new variant_test target.
src/v/pandaproxy/schema_registry/test/context_router.cc Adds unit tests for context normalization and request rewrite helpers.
src/v/pandaproxy/schema_registry/test/BUILD Registers the new context_router_test target.
src/v/pandaproxy/schema_registry/service.cc Registers context-prefixed routes and delegates via rewrite wrappers; updates route resource typing.
src/v/pandaproxy/schema_registry/handlers.cc Normalizes context path parameter when deleting contexts (bug fix).
src/v/pandaproxy/schema_registry/errors.h Adds context_invalid error info helper.
src/v/pandaproxy/schema_registry/error.h Adds context_invalid to the Schema Registry error_code enum.
src/v/pandaproxy/schema_registry/error.cc Maps context_invalid to an HTTP 400 response.
src/v/pandaproxy/schema_registry/context_router.h Implements context normalization and rewrite helpers for subject/path/query scoping.
src/v/pandaproxy/schema_registry/authorization.cc Updates auth resource extraction to support context-prefixed subject authorization.
src/v/pandaproxy/schema_registry/auth.h Introduces context_prefix_subject and route_resource to resolve route-time resources into auth-time resources.
src/v/pandaproxy/schema_registry/BUILD Adds context_router.h and links the variant utility into schema registry.
src/v/pandaproxy/api/api-doc/schema_registry.json Documents the new /contexts/{context}/... endpoints for compatibility.

Comment thread src/v/pandaproxy/schema_registry/service.cc Outdated
@nguyen-andrew nguyen-andrew force-pushed the sr/context-prefix-handlers branch from 5eae7af to 866cdb4 Compare April 16, 2026 06:45
@nguyen-andrew
Copy link
Copy Markdown
Member Author

Force push to address copilot comment

@vbotbuildovich
Copy link
Copy Markdown
Collaborator

vbotbuildovich commented Apr 16, 2026

Retry command for Build#83227

please wait until all jobs are finished before running the slash command

/ci-repeat 1
skip-redpanda-build
skip-units
skip-rebase
tests/rptest/tests/schema_registry_test.py::SchemaRegistryTest.test_serde_client@{"client_type":3,"protocol":2}
tests/rptest/tests/schema_registry_test.py::SchemaRegistryAutoAuthTest.test_serde_client@{"client_type":3,"protocol":2}

@vbotbuildovich
Copy link
Copy Markdown
Collaborator

vbotbuildovich commented Apr 16, 2026

CI test results

test results on build#83227
test_status test_class test_method test_arguments test_kind job_url passed reason test_history
FAIL SchemaRegistryAutoAuthTest test_serde_client {"client_type": 3, "protocol": 2} integration https://buildkite.com/redpanda/redpanda/builds/83227#019d9515-00a6-452b-bc92-3fbb72c794fb 0/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=SchemaRegistryAutoAuthTest&test_method=test_serde_client
FAIL SchemaRegistryAutoAuthTest test_serde_client {"client_type": 3, "protocol": 2} integration https://buildkite.com/redpanda/redpanda/builds/83227#019d9516-0cc1-4e30-aef3-3d3ea08fbfc1 0/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=SchemaRegistryAutoAuthTest&test_method=test_serde_client
FAIL SchemaRegistryTest test_serde_client {"client_type": 3, "protocol": 2} integration https://buildkite.com/redpanda/redpanda/builds/83227#019d9515-00a7-479f-8a0c-4e7748038bb4 0/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=SchemaRegistryTest&test_method=test_serde_client
FAIL SchemaRegistryTest test_serde_client {"client_type": 3, "protocol": 2} integration https://buildkite.com/redpanda/redpanda/builds/83227#019d9516-0cc2-43eb-a5b2-e16448c14dfe 0/11 Test FAILS after retries.Significant increase in flaky rate(baseline=0.0000, p0=0.0000, reject_threshold=0.0100) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=SchemaRegistryTest&test_method=test_serde_client
test results on build#83857
test_status test_class test_method test_arguments test_kind job_url passed reason test_history
FLAKY(PASS) ShadowLinkingReplicationTests test_replication_with_failures {"storage_mode": "tiered_cloud"} integration https://buildkite.com/redpanda/redpanda/builds/83857#019ddb81-b1ef-4e01-b456-986d58402d6f 10/11 Test PASSES after retries.No significant increase in flaky rate(baseline=0.0012, p0=1.0000, reject_threshold=0.0100. adj_baseline=0.1000, p1=0.3487, trust_threshold=0.5000) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=ShadowLinkingReplicationTests&test_method=test_replication_with_failures
FLAKY(PASS) SimpleEndToEndTest test_relaxed_acks {"write_caching": false} integration https://buildkite.com/redpanda/redpanda/builds/83857#019ddb82-ec51-4555-93e7-a5db2ffbd805 10/11 Test PASSES after retries.No significant increase in flaky rate(baseline=0.0067, p0=1.0000, reject_threshold=0.0100. adj_baseline=0.1000, p1=0.3487, trust_threshold=0.5000) https://redpanda.metabaseapp.com/dashboard/87-tests?tab=142-dt-individual-test-history&test_class=SimpleEndToEndTest&test_method=test_relaxed_acks

@nguyen-andrew nguyen-andrew force-pushed the sr/context-prefix-handlers branch from 866cdb4 to 1bb9ae6 Compare April 16, 2026 16:44
@nguyen-andrew
Copy link
Copy Markdown
Member Author

Force push to change confluent-kafka-go upgrade to v2.3.0. The only thing we need from the upgrade is the URL path fix (confluent-kafka-go#943, landed in v2.1.0). Jumping to v2.14.0 was overkill and pulled in unnecessary transitive deps (Azure SDK, JWT, oauth2). v2.3.0 is the first stable release past the fix.

@nguyen-andrew nguyen-andrew force-pushed the sr/context-prefix-handlers branch from 1bb9ae6 to f3b2f7a Compare April 16, 2026 17:20
@nguyen-andrew
Copy link
Copy Markdown
Member Author

Force push to fold in a security fix. Snyk flagged 4 transitive vulns in tests/go/go-kafka-serde

@nguyen-andrew nguyen-andrew force-pushed the sr/context-prefix-handlers branch from f3b2f7a to 179c951 Compare April 16, 2026 17:32
@nguyen-andrew
Copy link
Copy Markdown
Member Author

Force push to rebase on latest dev.

@nguyen-andrew nguyen-andrew force-pushed the sr/context-prefix-handlers branch from 179c951 to a921cd1 Compare April 16, 2026 18:51
@nguyen-andrew
Copy link
Copy Markdown
Member Author

Force push to bump golang/protobuf from v1.5.3 to v1.5.4 to try to fix issues with the CI docker image.

Copy link
Copy Markdown
Contributor

@pgellert pgellert left a comment

Choose a reason for hiding this comment

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

I'll double-check that all endpoints are added, with the correct ACLs, etc., in the next round. I haven't done that yet. But it's looking great!

return context_subject::from_string(sub);
},
[](const auto& res) -> auth::resource { return res; });
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

What happens to the authorization of deferred handler like handle_get_schemas_ids_id_authz here? I think at the moment these deferred handlers have some hardcoded assumptions about what exact path they are handling, which might break going forward. E.g. handle_get_schemas_ids_id_authz uses the get_schemas_ids_id nickname but now the nickname could depend on whether it's a context-prefixed endpoint or not I think.

Can you add a few tests around the context path + ACLs + audit logging integration as well please?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Good catch, pushed some changes to address this.

Updated auth::deferred_function_handler to now take a std::string_view operation_name, and wrap::operator() forwards the route's path.operations.nickname. All ten deferred handlers in handlers.cc thread it through to the four authz helpers (handle_get_schemas_ids_id_authz, handle_get_subjects_authz, handle_get_contexts_authz, handle_config_mode_authz), which no longer hardcode the non-prefixed nickname.

Added test_sr_audit_context_prefix_authz to exercise one regular and three deferred handlers, asserting both the ctx_* nickname and the context-qualified resource on each audit record.

Comment thread tests/rptest/tests/schema_registry_test.py Outdated
Comment on lines +58 to +60
req.param.set(
ss::sstring("subject"),
ss::sstring(fmt::format("/:{0}:{1}", nctx, sub)));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Does rewriting the path parameter have any unintended consequences? I can see this being brittle or having unintended consequences to the data we log in audit logs or the logic in pandaproxy::log_request, either now or in the future.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

req.param.set only mutates the parsed-params multimap. req._url is unchanged, and both pandaproxy::log_request (src/v/pandaproxy/json/util.h) and the audit event's uniform_resource_locator (src/v/security/audit/schemas/utils.cc) read req._url, so trace and audit URLs stay correct. The handler is the only consumer of the rewritten params.

The one real consequence was the deferred-authz operation_name that you flagged in the other thread, so I've pushed a change to address that.

Comment on lines +566 to +577
routes.routes.emplace_back(wrap(
ss::httpd::schema_registry_json::ctx_get_schemas_types,
auth::level::publik,
acl_operation::read,
auth::none{},
// Schema types are global — the handler ignores the context. Validate
// it anyway for consistency with other /contexts/{context}/... routes.
ctx_route(
[](ss::http::request&, const ss::sstring& ctx) {
normalize_context(ctx);
},
get_schemas_types)));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Does this endpoint exist in Confluent SR? I suspect maybe not.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Confluent uses a pre-matching filter that strips /contexts/{ctx}/ from any URL and forwards, so every endpoint can be context-prefixed. For /schemas/types it's a no-op rewrite, but I've added it for completeness.

Comment thread src/v/pandaproxy/schema_registry/handlers.cc Outdated
Comment thread tests/rptest/tests/schema_registry_test.py Outdated
Comment thread src/v/utils/variant.h
@nguyen-andrew nguyen-andrew force-pushed the sr/context-prefix-handlers branch from a921cd1 to e435233 Compare April 29, 2026 22:49
@nguyen-andrew
Copy link
Copy Markdown
Member Author

Force push to address PR comments. Four new commits on top of the rebased original series:

  • SchemaRegistryRedpandaClient now accepts a base_path prefix that gets prepended to every request, with a per-call base_path= override for global endpoints. Existing test_context_prefix_* tests are refactored to use self.sr_client.base_path = f"contexts/{ctx}" instead of building raw context-prefixed URLs.
  • New parse_normalized_context helper bundles the parse::request_param + normalize_context pair used at every context-prefixed route boundary; scope helpers now take a pre-normalized std::string_view.
  • Deferred-authz handlers now receive the route's operation_name instead of hardcoding the non-prefixed nickname. handle_get_schemas_ids_id_authz, handle_get_subjects_authz, handle_get_contexts_authz, and the handle_config_mode_authz call sites used to record audit events as e.g. get_subjects even when invoked via /contexts/{ctx}/subjects; they now correctly record ctx_get_subjects.
  • New test_sr_audit_context_prefix_authz covers ACL + audit-log integration for one regular handler (ctx_post_subject_versions) and three deferred handlers (ctx_get_subjects, ctx_get_schemas_ids_id, ctx_get_config_subject), asserting both the ctx_* operation nickname and the context-qualified resource on each audit record.

Introduces context_router.h with inline helpers that will be used by
context-prefixed route wrappers:

- normalize_context(): canonicalize a URL path context parameter
    by stripping outer ':' delimiters, adding '.' prefix, and
    rejecting embedded colons (400 Bad Request via new
    context_invalid error code)
- starts_with_context(): detect subjects already qualified with
    a context prefix

Aliases like "staging", ":.staging:", and ".staging" all resolve to
the canonical form ".staging".

Includes gtest coverage for both helpers.

Includes gtest coverage for all helpers.
Adds a type-level utility for extending a std::variant with additional
alternative types without repeating the original type list. This enables
composing variant types where a superset variant needs all alternatives
from a base variant plus extras.
Splits the auth resource type into `route_resource` (route registration
time) and `resource` (authorization time). The new
`context_prefix_subject` variant in `route_resource` qualifies the
subject with the {context} path param before the ACL check runs, then
resolves to `context_subject`.

This ensures a user with ACLs on "foo" (default context) cannot access
:.staging:foo via the /contexts/.staging/subjects/foo/... URL.
Add an optional `base_path` argument to `SchemaRegistryRedpandaClient`
that, when set, is prepended to every request path. This lets tests
target context-prefixed routes such as `/contexts/.staging/...`
without modifying call sites or duplicating the client.

`SchemaRegistryEndpoints` exposes the same parameter, and `base_path`
is stored via a property that strips leading and trailing slashes so
callers can pass either form. Individual `request()` calls can also
override the configured prefix via a `base_path=` kwarg: pass `""` to
issue a single request without the prefix, or any other string to
swap it for that call.

The administrative endpoints (`status/ready`, `security/acls`,
`contexts`) are server-global and have no context-prefixed routes,
so their helpers hardcode `base_path=""` to avoid accidental
prefixing when callers have set `self.base_path` for the surrounding
test.
Registers 15 context-prefixed routes that have a {subject} path
parameter. Each route extracts the context from the URL prefix,
scopes the subject with it via scope_subject_param(), and
delegates to the existing handler.

Covers: subject CRUD, versions, compatibility, config/{subject}, and
mode/{subject} — all via /contexts/{context}/... URLs.

Includes unit tests for scope_subject_param() and ducktape coverage
for all 15 endpoints and ACL isolation.
Registers 4 context-prefixed routes for /schemas/ids/{id} and its
sub-resources (/schema, /versions, /subjects). Adds a
scope_subject_query helper that injects the context as a "subject"
query parameter, scoping schema lookups to the specified context.

Includes unit tests for scope_subject_query and ducktape coverage
for schema lookup and sub-resource queries.
Adds scope_subject_prefix_query(), which injects or prepends the
normalized context into the subjectPrefix query parameter. The
context-prefixed GET /contexts/{context}/subjects route uses this
helper to scope subject listings to the specified context.

Includes unit tests for scope_subject_prefix_query and ducktape
coverage verifying subject isolation across contexts.
Registers context-prefixed routes for context-level config/mode and
schema types:

  - GET/PUT/DELETE /contexts/{context}/config
  - GET/PUT/DELETE /contexts/{context}/mode
  - GET /contexts/{context}/schemas/types (pass-through)

Adds inject_context_as_subject(), which sets the subject path
parameter to a context-only qualified subject (e.g., ":.staging:").
The config and mode wrappers use this to delegate to the existing
config/mode subject handlers. Schema types are global so the context
is accepted for compatibility but ignored.

Includes unit tests for inject_context_as_subject and ducktape
coverage for all operations.
While implementing context-prefixed route handlers, noticed that
DELETE /contexts/{context} was not normalizing the context path
parameter before the default-context check.

Apply normalize_context() to the context path parameter before the
default-context check. This ensures alias forms like "staging",
":.staging:", and ".staging" all resolve to the same canonical context
for deletion.

Includes ducktape coverage cycling through alias forms.
The v2.0.2 Schema Registry client stripped the path component from
URLs (confluent-kafka-go#943), preventing context-prefixed URLs
like /contexts/.serde from working. Fixed in v2.1.0 via PR redpanda-data#950.
A serde client configured with schema.registry.url pointing to
/contexts/.serde performs a full produce/consume round-trip. Verifies
schemas are registered in the target context and isolated from the
default context.

Parametrized across Python, Go, and Java clients to cover all
language ecosystems.
Several handlers parse the {context} path parameter and feed it to
normalize_context. Pull both steps into one helper used at the route
boundary, and have the scope_subject_* helpers take an already-normalized
context (std::string_view) so a single normalize call validates the
context before any URL rewriting.
The deferred-authz helpers (handle_get_schemas_ids_id_authz,
handle_get_subjects_authz, handle_get_contexts_authz) and several
handle_config_mode_authz call sites inside the per-request handlers
hardcoded the operation nickname against the non-prefixed route's
path_description (e.g. "get_schemas_ids_id"). With the new
/contexts/{context}/... routes registered against the same handlers,
audit log records issued via these deferred paths attributed to the
wrong nickname.

Pass the route's operation_name from the wrap class through
ctx_deferred_route, the handler entry points, and into the authz
helpers so audit events record the actual route nickname (e.g.
"ctx_get_subjects" for context-prefixed requests).
Add an integration test that exercises four representative
/contexts/{context}/... routes — one regular handler
(POST /subjects/{subject}/versions) and three deferred handlers
(GET /subjects, GET /schemas/ids/{id}, GET /config/{subject}) — and
verifies that each audit record uses the context-prefixed nickname
(ctx_post_subject_versions, ctx_get_subjects, ctx_get_schemas_ids_id,
ctx_get_config_subject) and an authz resource scoped to the
context-qualified subject.
@nguyen-andrew nguyen-andrew force-pushed the sr/context-prefix-handlers branch from e435233 to bc778c4 Compare April 29, 2026 22:58
@nguyen-andrew
Copy link
Copy Markdown
Member Author

Force push to rebase on dev.

Copy link
Copy Markdown
Contributor

@pgellert pgellert left a comment

Choose a reason for hiding this comment

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

lgtm

Comment on lines +167 to 168
std::string_view operation_name,
std::optional<request_auth_result>& auth_result,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit: we could wrap the operation_name and the auth_result in a deferred_auth_ctx struct to make this a bit cleaner.

Comment on lines +55 to +58
/// Route-registration-time resource type — includes
/// `context_prefix_subject`, which is resolved to `context_subject` before
/// authorization.
using route_resource = extend_variant_t<resource, context_prefix_subject>;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I'm wondering if it would be simpler to just merge resource and route_resource. The reason being that resource is already a "route-behaviour-variant", not really a resource, so I think context_prefix_subject would fit in well there.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I've split them because narrowing from route_resource to resource in extract_resource_from_request gives us a compile-time guarantee that context_prefix_subject is gone by the time we hit the authorizer (get_resource_type<T> in src/v/security/acl.cc would static_assert otherwise).

If we merge, requires_auth matches context_prefix_subject and the static_assert fires, so we'd have to either lump it into no_auth (which probably wouldn't be right) or put a vassert(false) arm in the visit, which would be replacing a compile-time check with a runtime one.

@pgellert
Copy link
Copy Markdown
Contributor

Let's backport this to 26.1 as we agreed with product

@nguyen-andrew nguyen-andrew merged commit 9fa838b into redpanda-data:dev Apr 30, 2026
22 checks passed
@vbotbuildovich
Copy link
Copy Markdown
Collaborator

/backport v26.1.x

@vbotbuildovich
Copy link
Copy Markdown
Collaborator

Failed to create a backport PR to v26.1.x branch. I tried:

git remote add upstream https://github.com/redpanda-data/redpanda.git
git fetch --all
git checkout -b backport-pr-30189-v26.1.x-122 remotes/upstream/v26.1.x
git cherry-pick -x cceffc0499 c1506c29a3 5551d4325d 913cedb4c8 0acf252efd a93647dd4a c44d2c3913 8e2b44b2c7 7c2d3d8bfa 18720e284c cb5aff6ec9 955d7bec2b e314131f65 bc778c4455

Workflow run logs.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants