Skip to content

Commit 223ec1e

Browse files
authored
Implement PostgreSQL datastore (#7961)
# Description This change implements our datastore abstraction using PostgreSQL. This is an easier and better option for users to manage than our current set of datastores. The next pull-request in this series will hook it up to Radius so we can start using it. Ultimately we can replace the current default of Kubernetes CRD-store for both dev and deployed configurations in a few steps. Also included in this pull-request is a set of new makefile commands (`make db-*`) to make it easier to work with the local database. As always run `make` to see the command-line help. ## Type of change - This pull request is a minor refactor, code cleanup, test improvement, or other maintenance task and doesn't change the functionality of Radius (issue link optional). Signed-off-by: Ryan Nowak <[email protected]>
1 parent b4c4d50 commit 223ec1e

File tree

14 files changed

+813
-46
lines changed

14 files changed

+813
-46
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@
1717
ARROW := \033[34;1m=>\033[0m
1818

1919
# order matters for these
20-
include build/help.mk build/version.mk build/build.mk build/util.mk build/generate.mk build/test.mk build/docker.mk build/recipes.mk build/install.mk build/debug.mk
20+
include build/help.mk build/version.mk build/build.mk build/util.mk build/generate.mk build/test.mk build/docker.mk build/recipes.mk build/install.mk build/db.mk build/debug.mk

build/db.mk

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# ------------------------------------------------------------
2+
# Copyright 2023 The Radius Authors.
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
# ------------------------------------------------------------
16+
17+
POSTGRES_USER=postgres
18+
POSTGRES_PASSWORD=ucprulz!
19+
POSTGRES_IMAGE=ghcr.io/radius-project/mirror/postgres:latest
20+
POSTGRES_CONTAINER_NAME=radius-postgres
21+
22+
##@ Database
23+
24+
.PHONY: db-init
25+
db-init: db-dependency-docker-running ## Initialize a local PostgresSQL database for testing
26+
@echo "$(ARROW) Initializing local PostgresSQL database"
27+
@if [ "$$( docker container inspect -f '{{.State.Running}}' $(POSTGRES_CONTAINER_NAME) 2> /dev/null)" = "true" ]; then \
28+
echo "PostgresSQL container $(POSTGRES_CONTAINER_NAME) is already runnning"; \
29+
elif [ "$$( docker container inspect -f '{{.State.Running}}' $(POSTGRES_CONTAINER_NAME) 2> /dev/null)" = "false" ]; then \
30+
echo "PostgresSQL container $(POSTGRES_CONTAINER_NAME) is not running"; \
31+
echo "This might have been a crash"; \
32+
echo ""; \
33+
docker logs $(POSTGRES_CONTAINER_NAME); \
34+
echo ""; \
35+
echo "Restarting PostgresSQL container $(POSTGRES_CONTAINER_NAME)" \
36+
docker start $(POSTGRES_CONTAINER_NAME) 1> /dev/null; \
37+
else \
38+
docker run \
39+
--detach \
40+
--name $(POSTGRES_CONTAINER_NAME) \
41+
--publish 5432:5432 \
42+
--env POSTGRES_USER=$(POSTGRES_USER) \
43+
--env POSTGRES_PASSWORD=$(POSTGRES_PASSWORD) \
44+
--volume $(PWD)/deploy/init-db/:/docker-entrypoint-initdb.d/ \
45+
$(POSTGRES_IMAGE) 1> /dev/null; \
46+
echo "Started PostgresSQL container $(POSTGRES_CONTAINER_NAME)"; \
47+
fi;
48+
@echo ""
49+
@echo "Use PostgreSQL in tests:"
50+
@echo ""
51+
@echo "export TEST_POSTGRES_URL=postgresql://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@localhost:5432/ucp"
52+
@echo ""
53+
@echo "Makefile cheatsheet:"
54+
@echo " - Stop the database $(ARROW) make db-stop"
55+
@echo " - Reset the database $(ARROW) make db-reset"
56+
@echo " - Logs $(ARROW) docker logs $(POSTGRES_CONTAINER_NAME)"
57+
@echo " - Connect to the database server: make db-shell"
58+
@echo " - Shell tip: Connect to UCP database $(ARROW) \\\\c ucp"
59+
@echo " - Shell tip: Connect to applications_rp database $(ARROW) \\\\c applications_rp"
60+
@echo " - Shell tip: List resources $(ARROW) select * from resources;"
61+
62+
.PHONY: db-stop
63+
db-stop: db-dependency-docker-running ## Stop the local PostgresSQL database
64+
@echo "$(ARROW) Stopping local PostgresSQL database..."
65+
@if [ "$$( docker container inspect -f '{{.State.Running}}' $(POSTGRES_CONTAINER_NAME) 2> /dev/null)" = "true" ]; then \
66+
docker stop $(POSTGRES_CONTAINER_NAME) 1> /dev/null; \
67+
else \
68+
echo "PostgresSQL container $(POSTGRES_CONTAINER_NAME) is not running"; \
69+
fi;
70+
71+
.PHONY: db-shell
72+
db-shell: db-postgres-running ## Open a shell to the local PostgresSQL database
73+
@echo "$(ARROW) Connecting to local PostgresSQL database..."
74+
@DOCKER_CLI_HINTS=false docker exec \
75+
--interactive \
76+
--tty \
77+
$(POSTGRES_CONTAINER_NAME) \
78+
psql \
79+
"postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@localhost:5432"
80+
81+
.PHONY: db-reset
82+
db-reset: db-postgres-running ## Reset the local PostgresSQL database
83+
@echo "$(ARROW) Resetting local PostgresSQL database"
84+
@echo ""
85+
@echo "Resetting ucp resources..."
86+
@DOCKER_CLI_HINTS=false docker exec \
87+
--interactive \
88+
--tty \
89+
$(POSTGRES_CONTAINER_NAME) \
90+
psql \
91+
"postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@localhost:5432/ucp" \
92+
--command "DELETE FROM resources;"
93+
@echo ""
94+
@echo "Resetting applications_rp resources..."
95+
@DOCKER_CLI_HINTS=false docker exec \
96+
--interactive \
97+
--tty \
98+
$(POSTGRES_CONTAINER_NAME) \
99+
psql \
100+
"postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@localhost:5432/applications_rp" \
101+
--command "DELETE FROM resources;"
102+
103+
.PHONY: db-dependency-docker-running
104+
db-dependency-docker-running:
105+
@if [ ! docker info > /dev/null 2>&1 ]; then \
106+
echo "Docker is not installed or not running. Please install docker and try again."; \
107+
exit 1; \
108+
fi;
109+
110+
.PHONY: db-postgres-running
111+
db-postgres-running: db-dependency-docker-running
112+
@if [ "$$( docker container inspect -f '{{.State.Running}}' $(POSTGRES_CONTAINER_NAME) 2> /dev/null)" = "true" ]; then \
113+
exit 0; \
114+
else \
115+
echo "PostgresSQL container $(POSTGRES_CONTAINER_NAME) is not running"; \
116+
exit 1; \
117+
fi;

deploy/init-db/db.sql.txt

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
-- 'resources' is used to store all of our resources. See comments below for an explanation of the columns.
2+
CREATE TABLE resources (
3+
-- example: "/planes/radius/local/resourceGroups/rg1/providers/Applications.Core/applications/my-app"
4+
--
5+
-- We use columns to break out the most important components of the resource id for optimal querying.
6+
--
7+
-- Since resource ids are case-insensitive we canonicalize these columns to lowercase.
8+
-- We store the original resource id with the original casing so users can work with their preferred
9+
-- naming/casing conventions.
10+
--
11+
-- We ensure a leading and trailing slash on the components of the resource id for ease of comparison.
12+
--
13+
-- id -> "/planes/radius/local/resourcegroups/rg1/providers/applications.core/applications/my-app/"
14+
-- resource_type -> "/applications.core/applications/"
15+
-- root_scope -> "/planes/radius/local/resourcegroups/rg1/"
16+
-- routing_scope -> "/applications.core/applications/my-app/"
17+
18+
-- resource id used as key.
19+
id TEXT PRIMARY KEY NOT NULL,
20+
21+
-- original_id is used to store the original id of the resource before any normalization occurs.
22+
-- This is provided for compatability with the existing design of the store API, and can be removed
23+
-- in the future.
24+
original_id TEXT NOT NULL,
25+
26+
-- resource type by queries to filter by type.
27+
resource_type TEXT NOT NULL,
28+
29+
-- root_scope used by queries to list resources by their scope.
30+
root_scope TEXT NOT NULL,
31+
32+
-- routing_scope used by queries to list resources when they are child resources.
33+
routing_scope TEXT NOT NULL,
34+
35+
-- etag used for optimistic concurrency control.
36+
etag TEXT NOT NULL,
37+
38+
-- timestamp is used to implement cursor-based pagination (see below).
39+
created_at TIMESTAMP (6) WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
40+
41+
-- resource_data stores the resource data.
42+
resource_data JSONB NOT NULL
43+
);
44+
45+
-- idx_resource_query is an index for improving performance of queries.
46+
--
47+
-- Queries always list resources by their:
48+
-- - resource_type, and root_scope OR
49+
-- - resource_type, root_scope, and (LIKE) routing_scope
50+
--
51+
-- eg: "find all Applications.Core/applications resources in /planes/radius/local/resourceGroups/my-rg"
52+
--
53+
-- > "resource_type" = "/applications.core/applications/"
54+
-- > "root_scope" = "/planes/radius/local/resourcegroups/my-rg"
55+
-- > "routing_scope" = NULL
56+
--
57+
-- 'created_at' is used with ORDER BY to sort the output, so we can implement cursor-based pagination.
58+
--
59+
-- 1) For the initial query, we won't specify a cursor value.
60+
-- 2) For the next query, we will specify the cursor value as the last created_at value from the previous
61+
-- query, which allows us to skip the records that were already returned.
62+
--
63+
-- The index only contains resource_type and root_scope because these are usually specified exactly.
64+
-- We don't really benefit from routing_scope being in the index because it's always used with LIKE.
65+
-- We don't benefit from created_at being in the index because it's used for sorting.
66+
CREATE INDEX idx_resource_query ON resources (resource_type, root_scope);

deploy/init-db/init-db.sh

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/bin/bash
2+
set -e
3+
4+
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
5+
6+
# Array of usernames
7+
RESOURCE_PROVIDERS=("ucp" "applications_rp")
8+
9+
# Create databases and users
10+
for RESOURCE_PROVIDER in "${RESOURCE_PROVIDERS[@]}"; do
11+
echo "Creating database and user for $RESOURCE_PROVIDER"
12+
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
13+
CREATE USER $RESOURCE_PROVIDER WITH PASSWORD '$POSTGRES_PASSWORD';
14+
CREATE DATABASE $RESOURCE_PROVIDER;
15+
GRANT ALL PRIVILEGES ON DATABASE $RESOURCE_PROVIDER TO $RESOURCE_PROVIDER;
16+
EOSQL
17+
done
18+
19+
# Create tables within those databases
20+
for RESOURCE_PROVIDER in "${RESOURCE_PROVIDERS[@]}"; do
21+
echo "Creating tables in database $RESOURCE_PROVIDER"
22+
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$RESOURCE_PROVIDER" < $SCRIPT_DIR/db.sql.txt
23+
done

go.mod

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ require (
2121
github.com/aws/aws-sdk-go-v2/service/cloudcontrol v1.20.5
2222
github.com/aws/aws-sdk-go-v2/service/cloudformation v1.53.5
2323
github.com/aws/aws-sdk-go-v2/service/ec2 v1.177.0
24+
github.com/aws/aws-sdk-go-v2/service/ecr v1.32.4
2425
github.com/aws/aws-sdk-go-v2/service/sts v1.30.5
2526
github.com/aws/smithy-go v1.20.4
2627
github.com/charmbracelet/bubbles v0.19.0
@@ -50,6 +51,7 @@ require (
5051
github.com/hashicorp/hc-install v0.8.0
5152
github.com/hashicorp/terraform-config-inspect v0.0.0-20240607080351-271db412dbcb
5253
github.com/hashicorp/terraform-exec v0.21.0
54+
github.com/jackc/pgx/v5 v5.7.1
5355
github.com/mattn/go-isatty v0.0.20
5456
github.com/mitchellh/mapstructure v1.5.0
5557
github.com/novln/docker-parser v1.0.0
@@ -80,7 +82,7 @@ require (
8082
go.uber.org/mock v0.4.0
8183
go.uber.org/zap v1.27.0
8284
golang.org/x/sync v0.8.0
83-
golang.org/x/text v0.17.0
85+
golang.org/x/text v0.18.0
8486
gopkg.in/yaml.v3 v3.0.1
8587
helm.sh/helm/v3 v3.15.4
8688
k8s.io/api v0.30.3
@@ -106,7 +108,6 @@ require (
106108
github.com/Microsoft/hcsshim v0.12.4 // indirect
107109
github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect
108110
github.com/aws/aws-sdk-go v1.54.6 // indirect
109-
github.com/aws/aws-sdk-go-v2/service/ecr v1.32.4 // indirect
110111
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect
111112
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect
112113
github.com/blang/semver/v4 v4.0.0 // indirect
@@ -130,6 +131,9 @@ require (
130131
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
131132
github.com/googleapis/gax-go/v2 v2.12.5 // indirect
132133
github.com/hashicorp/go-safetemp v1.0.0 // indirect
134+
github.com/jackc/pgpassfile v1.0.0 // indirect
135+
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
136+
github.com/jackc/puddle/v2 v2.2.2 // indirect
133137
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
134138
github.com/kevinburke/ssh_config v1.2.0 // indirect
135139
github.com/mitchellh/go-homedir v1.1.0 // indirect
@@ -191,7 +195,7 @@ require (
191195
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
192196
github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
193197
github.com/cyphar/filepath-securejoin v0.2.5 // indirect
194-
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
198+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
195199
github.com/docker/cli v26.1.4+incompatible // indirect
196200
github.com/docker/distribution v2.8.3+incompatible // indirect
197201
github.com/docker/docker v27.1.1+incompatible // indirect
@@ -309,13 +313,13 @@ require (
309313
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
310314
go.starlark.net v0.0.0-20240520160348-046347dcd104 // indirect
311315
go.uber.org/multierr v1.11.0 // indirect
312-
golang.org/x/crypto v0.25.0 // indirect
316+
golang.org/x/crypto v0.27.0 // indirect
313317
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8
314318
golang.org/x/mod v0.19.0 // indirect
315319
golang.org/x/net v0.27.0 // indirect
316320
golang.org/x/oauth2 v0.21.0 // indirect
317-
golang.org/x/sys v0.24.0 // indirect
318-
golang.org/x/term v0.22.0 // indirect
321+
golang.org/x/sys v0.25.0 // indirect
322+
golang.org/x/term v0.24.0 // indirect
319323
golang.org/x/time v0.5.0 // indirect
320324
google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d // indirect
321325
google.golang.org/genproto/googleapis/api v0.0.0-20240624140628-dc46fd24d27d // indirect

go.sum

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -281,8 +281,6 @@ github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn
281281
github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
282282
github.com/aws/aws-sdk-go v1.54.6 h1:HEYUib3yTt8E6vxjMWM3yAq5b+qjj/6aKA62mkgux9g=
283283
github.com/aws/aws-sdk-go v1.54.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
284-
github.com/aws/aws-sdk-go-v2 v1.30.4 h1:frhcagrVNrzmT95RJImMHgabt99vkXGslubDaDagTk8=
285-
github.com/aws/aws-sdk-go-v2 v1.30.4/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0=
286284
github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g=
287285
github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0=
288286
github.com/aws/aws-sdk-go-v2/config v1.27.31 h1:kxBoRsjhT3pq0cKthgj6RU6bXTm/2SgdoUMyrVw0rAI=
@@ -291,12 +289,8 @@ github.com/aws/aws-sdk-go-v2/credentials v1.17.30 h1:aau/oYFtibVovr2rDt8FHlU17BT
291289
github.com/aws/aws-sdk-go-v2/credentials v1.17.30/go.mod h1:BPJ/yXV92ZVq6G8uYvbU0gSl8q94UB63nMT5ctNO38g=
292290
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12 h1:yjwoSyDZF8Jth+mUk5lSPJCkMC0lMy6FaCD51jm6ayE=
293291
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12/go.mod h1:fuR57fAgMk7ot3WcNQfb6rSEn+SUffl7ri+aa8uKysI=
294-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16 h1:TNyt/+X43KJ9IJJMjKfa3bNTiZbUP7DeCxfbTROESwY=
295-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16/go.mod h1:2DwJF39FlNAUiX5pAc0UNeiz16lK2t7IaFcm0LFHEgc=
296292
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ=
297293
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE=
298-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16 h1:jYfy8UPmd+6kJW5YhY0L1/KftReOGxI/4NtVSTh9O/I=
299-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16/go.mod h1:7ZfEPZxkW42Afq4uQB8H2E2e6ebh6mXTueEpYzjCzcs=
300294
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc=
301295
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU=
302296
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
@@ -736,6 +730,14 @@ github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
736730
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
737731
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
738732
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
733+
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
734+
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
735+
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
736+
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
737+
github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs=
738+
github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA=
739+
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
740+
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
739741
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
740742
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
741743
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
@@ -1106,8 +1108,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
11061108
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
11071109
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
11081110
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
1109-
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
1110-
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
1111+
golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
1112+
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
11111113
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
11121114
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
11131115
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1321,14 +1323,14 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
13211323
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
13221324
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
13231325
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1324-
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
1325-
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
1326+
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
1327+
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
13261328
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
13271329
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
13281330
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
13291331
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
1330-
golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
1331-
golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
1332+
golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM=
1333+
golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
13321334
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
13331335
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
13341336
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1339,8 +1341,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
13391341
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
13401342
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
13411343
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
1342-
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
1343-
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
1344+
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
1345+
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
13441346
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
13451347
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
13461348
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=

0 commit comments

Comments
 (0)