Skip to content
This repository was archived by the owner on Apr 28, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 42 additions & 6 deletions cmd/policy/registeredResources.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,11 @@ func policyCreateRegisteredResource(cmd *cobra.Command, args []string) {
defer h.Close()

name := c.Flags.GetRequiredString("name")
namespace := c.Flags.GetRequiredString("namespace")
registeredResourceValues = c.Flags.GetStringSlice("value", registeredResourceValues, cli.FlagsStringSliceOptions{})
metadataLabels = c.Flags.GetStringSlice("label", metadataLabels, cli.FlagsStringSliceOptions{Min: 0})

resource, err := h.CreateRegisteredResource(cmd.Context(), name, registeredResourceValues, getMetadataMutable(metadataLabels))
resource, err := h.CreateRegisteredResource(cmd.Context(), namespace, name, registeredResourceValues, getMetadataMutable(metadataLabels))
if err != nil {
cli.ExitWithError("Failed to create registered resource", err)
}
Expand Down Expand Up @@ -61,12 +62,13 @@ func policyGetRegisteredResource(cmd *cobra.Command, args []string) {

id := c.Flags.GetOptionalID("id")
name := c.Flags.GetOptionalString("name")
namespaceFqn := c.Flags.GetOptionalString("namespace")

if id == "" && name == "" {
cli.ExitWithError("Either 'id' or 'name' must be provided", nil)
}

resource, err := h.GetRegisteredResource(cmd.Context(), id, name)
resource, err := h.GetRegisteredResource(cmd.Context(), id, name, namespaceFqn)
if err != nil {
identifier := fmt.Sprintf("id: %s", id)
if id == "" {
Expand Down Expand Up @@ -96,10 +98,11 @@ func policyListRegisteredResources(cmd *cobra.Command, args []string) {
h := common.NewHandler(c)
defer h.Close()

namespace := c.Flags.GetOptionalString("namespace")
limit := c.Flags.GetRequiredInt32("limit")
offset := c.Flags.GetRequiredInt32("offset")

resp, err := h.ListRegisteredResources(cmd.Context(), limit, offset)
resp, err := h.ListRegisteredResources(cmd.Context(), limit, offset, namespace)
if err != nil {
cli.ExitWithError("Failed to list registered resources", err)
}
Expand Down Expand Up @@ -166,7 +169,7 @@ func policyDeleteRegisteredResource(cmd *cobra.Command, args []string) {
force := c.Flags.GetRequiredBool("force")
ctx := cmd.Context()

resource, err := h.GetRegisteredResource(ctx, id, "")
resource, err := h.GetRegisteredResource(ctx, id, "", "")
if err != nil {
errMsg := fmt.Sprintf("Failed to find registered resource (%s)", id)
cli.ExitWithError(errMsg, err)
Expand Down Expand Up @@ -207,11 +210,13 @@ func policyCreateRegisteredResourceValue(cmd *cobra.Command, args []string) {
actionAttributeValues = c.Flags.GetStringSlice("action-attribute-value", actionAttributeValues, cli.FlagsStringSliceOptions{Min: 0})
metadataLabels = c.Flags.GetStringSlice("label", metadataLabels, cli.FlagsStringSliceOptions{Min: 0})

namespace := c.Flags.GetOptionalString("namespace")

var resourceID string
if uuid.Validate(resource) == nil {
resourceID = resource
} else {
resourceByName, err := h.GetRegisteredResource(ctx, "", resource)
resourceByName, err := h.GetRegisteredResource(ctx, "", resource, namespace)
if err != nil {
cli.ExitWithError(fmt.Sprintf("Failed to find registered resource (name: %s)", resource), err)
}
Expand Down Expand Up @@ -284,14 +289,15 @@ func policyListRegisteredResourceValues(cmd *cobra.Command, args []string) {

ctx := cmd.Context()
resource := c.Flags.GetRequiredString("resource")
namespace := c.Flags.GetOptionalString("namespace")
limit := c.Flags.GetRequiredInt32("limit")
offset := c.Flags.GetRequiredInt32("offset")

var resourceID string
if uuid.Validate(resource) == nil {
resourceID = resource
} else {
resourceByName, err := h.GetRegisteredResource(ctx, "", resource)
resourceByName, err := h.GetRegisteredResource(ctx, "", resource, namespace)
if err != nil {
cli.ExitWithError(fmt.Sprintf("Failed to find registered resource (name: %s)", resource), err)
}
Expand Down Expand Up @@ -465,10 +471,22 @@ func initRegisteredResourcesCommands() {
getDoc.GetDocFlag("name").Default,
getDoc.GetDocFlag("name").Description,
)
getDoc.Flags().StringP(
getDoc.GetDocFlag("namespace").Name,
getDoc.GetDocFlag("namespace").Shorthand,
getDoc.GetDocFlag("namespace").Default,
getDoc.GetDocFlag("namespace").Description,
)
Comment thread
alkalescent marked this conversation as resolved.
Resolved

listDoc := man.Docs.GetCommand("policy/registered-resources/list",
man.WithRun(policyListRegisteredResources),
)
listDoc.Flags().StringP(
listDoc.GetDocFlag("namespace").Name,
listDoc.GetDocFlag("namespace").Shorthand,
listDoc.GetDocFlag("namespace").Default,
listDoc.GetDocFlag("namespace").Description,
)
injectListPaginationFlags(listDoc)

createDoc := man.Docs.GetCommand("policy/registered-resources/create",
Expand All @@ -480,6 +498,12 @@ func initRegisteredResourcesCommands() {
createDoc.GetDocFlag("name").Default,
createDoc.GetDocFlag("name").Description,
)
createDoc.Flags().StringP(
createDoc.GetDocFlag("namespace").Name,
createDoc.GetDocFlag("namespace").Shorthand,
createDoc.GetDocFlag("namespace").Default,
createDoc.GetDocFlag("namespace").Description,
)
createDoc.Flags().StringSliceVarP(
&registeredResourceValues,
createDoc.GetDocFlag("value").Name,
Expand Down Expand Up @@ -548,6 +572,12 @@ func initRegisteredResourcesCommands() {
listValuesDoc.GetDocFlag("resource").Default,
listValuesDoc.GetDocFlag("resource").Description,
)
listValuesDoc.Flags().StringP(
listValuesDoc.GetDocFlag("namespace").Name,
listValuesDoc.GetDocFlag("namespace").Shorthand,
listValuesDoc.GetDocFlag("namespace").Default,
listValuesDoc.GetDocFlag("namespace").Description,
)
injectListPaginationFlags(listValuesDoc)

createValueDoc := man.Docs.GetCommand("policy/registered-resources/values/create",
Expand All @@ -565,6 +595,12 @@ func initRegisteredResourcesCommands() {
createValueDoc.GetDocFlag("value").Default,
createValueDoc.GetDocFlag("value").Description,
)
createValueDoc.Flags().StringP(
createValueDoc.GetDocFlag("namespace").Name,
createValueDoc.GetDocFlag("namespace").Shorthand,
createValueDoc.GetDocFlag("namespace").Default,
createValueDoc.GetDocFlag("namespace").Description,
)
createValueDoc.Flags().StringSliceVarP(
&actionAttributeValues,
createValueDoc.GetDocFlag("action-attribute-value").Name,
Expand Down
6 changes: 5 additions & 1 deletion docs/man/policy/registered-resources/create.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ command:
flags:
- name: name
shorthand: n
description: Name of the registered resource (must be unique within Policy)
description: Name of the registered resource (must be unique within a Namespace)
required: true
- name: namespace
shorthand: s
description: Namespace ID or FQN
required: true
- name: value
shorthand: v
Expand Down
3 changes: 3 additions & 0 deletions docs/man/policy/registered-resources/get.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ command:
- name: name
shorthand: n
description: Name of the registered resource
- name: namespace
shorthand: s
description: Namespace FQN for name-based lookups (optional)
Comment thread
alkalescent marked this conversation as resolved.
Resolved
---

Retrieve a registered resource along with its metadata and values.
Expand Down
3 changes: 3 additions & 0 deletions docs/man/policy/registered-resources/list.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ command:
aliases:
- l
flags:
- name: namespace
shorthand: s
description: Namespace ID or FQN to filter results
- name: limit
shorthand: l
description: Limit retrieved count
Expand Down
3 changes: 3 additions & 0 deletions docs/man/policy/registered-resources/values/create.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ command:
shorthand: v
description: Value of the registered resource (i.e. 'value1', must be unique within the Registered Resource)
required: true
- name: namespace
shorthand: s
description: "Namespace ID or FQN (required when --resource is a name)"
- name: action-attribute-value
shorthand: a
description: "Optional action attribute values in the format: \"<action_id | action_name>;<attribute_value_id | attribute_value_fqn>\""
Expand Down
3 changes: 3 additions & 0 deletions docs/man/policy/registered-resources/values/list.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ command:
- name: resource
shorthand: r
description: Identifier of the associated registered resource (ID or name)
- name: namespace
shorthand: s
description: "Namespace ID or FQN (required when --resource is a name)"
- name: limit
shorthand: l
description: Limit retrieved count
Expand Down
39 changes: 21 additions & 18 deletions e2e/registered-resources.bats.x → e2e/registered-resources.bats
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,13 @@ setup_file() {
export WITH_CREDS='--with-client-creds-file ./creds.json'
export HOST='--host http://localhost:8080'

# create namespace first (needed for registered resource creation)
export NS_NAME="test-rr.org"
export NS_ID=$(./otdfctl $HOST $WITH_CREDS policy attributes namespaces create --name "$NS_NAME" --json | jq -r '.id')

# create registered resource used in registered resource values tests
export RR_NAME="test_rr_for_values"
export RR_ID=$(./otdfctl $HOST $WITH_CREDS policy registered-resources create --name "$RR_NAME" --json | jq -r '.id')
export RR_ID=$(./otdfctl $HOST $WITH_CREDS policy registered-resources create --name "$RR_NAME" --namespace "$NS_ID" --json | jq -r '.id')

# create custom action to be used in registered resource values tests
export CUSTOM_ACTION_NAME="test_action_for_values"
Expand All @@ -17,10 +21,6 @@ setup_file() {
# get standard read action id to use in registered resource values tests
export READ_ACTION_NAME="read"
export READ_ACTION_ID=$(./otdfctl $HOST $WITH_CREDS policy actions get --name "$READ_ACTION_NAME" --json | jq -r '.id')

# create attribute value to be used in registered resource values tests
export NS_NAME="test-rr.org"
export NS_ID=$(./otdfctl $HOST $WITH_CREDS policy attributes namespaces create --name "$NS_NAME" --json | jq -r '.id')
export ATTR_NAME=test_rr_attr
attr_id=$(./otdfctl $HOST $WITH_CREDS policy attributes create --namespace "$NS_ID" --name "$ATTR_NAME" --rule ANY_OF -l key=value --json | jq -r '.id')
export ATTR_VAL_1_ID=$(./otdfctl $HOST $WITH_CREDS policy attributes values create --attribute-id "$attr_id" --value test_reg_res_attr__val_1 --json | jq -r '.id')
Expand Down Expand Up @@ -59,7 +59,7 @@ teardown_file() {
}

@test "Create a registered resource - Good" {
run_otdfctl_reg_res create --name test_create_rr
run_otdfctl_reg_res create --name test_create_rr --namespace "$NS_ID"
assert_output --partial "SUCCESS"
assert_line --regexp "Name.*test_create_rr"
assert_output --partial "Id"
Expand All @@ -73,23 +73,26 @@ teardown_file() {

@test "Create a registered resource - Bad" {
# bad resource names
run_otdfctl_reg_res create --name ends_underscored_
run_otdfctl_reg_res create --name ends_underscored_ --namespace "$NS_ID"
assert_failure
run_otdfctl_reg_res create --name -first-char-hyphen
run_otdfctl_reg_res create --name -first-char-hyphen --namespace "$NS_ID"
assert_failure
run_otdfctl_reg_res create --name inval!d.chars
run_otdfctl_reg_res create --name inval!d.chars --namespace "$NS_ID"
assert_failure

# missing flag
# missing flags
run_otdfctl_reg_res create
assert_failure
assert_output --partial "Flag '--name' is required"

run_otdfctl_reg_res create --name test_no_namespace
assert_failure
assert_output --partial "Flag '--namespace' is required"

# conflict
run_otdfctl_reg_res create --name test_create_rr_conflict
run_otdfctl_reg_res create --name test_create_rr_conflict --namespace "$NS_ID"
assert_output --partial "SUCCESS"
created_id=$(echo "$output" | grep Id | awk -F'│' '{print $3}' | xargs)
run_otdfctl_reg_res create --name test_create_rr_conflict
run_otdfctl_reg_res create --name test_create_rr_conflict --namespace "$NS_ID"
assert_failure
assert_output --partial "already_exists"

Expand All @@ -99,7 +102,7 @@ teardown_file() {

@test "Get a registered resource - Good" {
# setup a resource to get
run_otdfctl_reg_res create --name test_get_rr
run_otdfctl_reg_res create --name test_get_rr --namespace "$NS_ID"
assert_success
created_id=$(echo "$output" | grep Id | awk -F'│' '{print $3}' | xargs)

Expand Down Expand Up @@ -131,9 +134,9 @@ teardown_file() {

@test "List registered resources" {
# setup registered resources to list
run_otdfctl_reg_res create --name test_list_rr_1
run_otdfctl_reg_res create --name test_list_rr_1 --namespace "$NS_ID"
reg_res1_id=$(echo "$output" | grep Id | awk -F'│' '{print $3}' | xargs)
run_otdfctl_reg_res create --name test_list_rr_2
run_otdfctl_reg_res create --name test_list_rr_2 --namespace "$NS_ID"
reg_res2_id=$(echo "$output" | grep Id | awk -F'│' '{print $3}' | xargs)

run_otdfctl_reg_res list
Expand All @@ -160,7 +163,7 @@ teardown_file() {

@test "Update registered resource" {
# setup a resource to update
run_otdfctl_reg_res create --name test_update_rr
run_otdfctl_reg_res create --name test_update_rr --namespace "$NS_ID"
assert_success
created_id=$(echo "$output" | grep Id | awk -F'│' '{print $3}' | xargs)

Expand All @@ -187,7 +190,7 @@ teardown_file() {

@test "Delete registered resource - Good" {
# setup a resource to delete
run_otdfctl_reg_res create --name test_delete_rr
run_otdfctl_reg_res create --name test_delete_rr --namespace "$NS_ID"
created_id=$(echo "$output" | grep Id | awk -F'│' '{print $3}' | xargs)

run_otdfctl_reg_res delete --id "$created_id" --force
Expand Down
9 changes: 5 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ require (
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/catppuccin/go v0.3.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
github.com/charmbracelet/x/ansi v0.10.1 // indirect
github.com/charmbracelet/x/cellbuf v0.0.13 // indirect
Expand Down Expand Up @@ -98,13 +99,13 @@ require (
github.com/zitadel/logging v0.6.2 // indirect
github.com/zitadel/schema v1.3.1 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
go.opentelemetry.io/otel v1.38.0 // indirect
go.opentelemetry.io/otel/metric v1.38.0 // indirect
go.opentelemetry.io/otel/trace v1.38.0 // indirect
go.opentelemetry.io/otel v1.40.0 // indirect
go.opentelemetry.io/otel/metric v1.40.0 // indirect
go.opentelemetry.io/otel/trace v1.40.0 // indirect
golang.org/x/crypto v0.45.0 // indirect
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
golang.org/x/net v0.47.0 // indirect
golang.org/x/sys v0.39.0 // indirect
golang.org/x/sys v0.40.0 // indirect
golang.org/x/text v0.32.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8 // indirect
Expand Down
18 changes: 10 additions & 8 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ github.com/catppuccin/go v0.3.0 h1:d+0/YicIq+hSTo5oPuRi5kOpqkVA5tAsU6dNhvRu+aY=
github.com/catppuccin/go v0.3.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/charmbracelet/bubbles v0.21.1-0.20250623103423-23b8fd6302d7 h1:JFgG/xnwFfbezlUnFMJy0nusZvytYysV4SCS2cYbvws=
github.com/charmbracelet/bubbles v0.21.1-0.20250623103423-23b8fd6302d7/go.mod h1:ISC1gtLcVilLOf23wvTfoQuYbW2q0JevFxPfUzZ9Ybw=
github.com/charmbracelet/bubbletea v1.3.10 h1:otUDHWMMzQSB0Pkc87rm691KZ3SWa4KUlvF9nRvCICw=
Expand Down Expand Up @@ -320,16 +322,16 @@ go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI=
go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms=
go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g=
go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g=
go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc=
go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E=
go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg=
go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM=
go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=
go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw=
go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
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=
Expand Down Expand Up @@ -363,8 +365,8 @@ 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.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
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=
Expand Down
Loading
Loading