Skip to content

Commit 2958cb4

Browse files
authored
[SECURESIGN-2588] Add data persistence for trust targets (#21)
* Add data persistence for trust targets * review updates * updates * review updates
1 parent 9e23dd9 commit 2958cb4

File tree

11 files changed

+593
-182
lines changed

11 files changed

+593
-182
lines changed

Makefile

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,17 @@ BINARY_NAME=rhtas_console
22
CMD_DIR=cmd/rhtas_console
33
BUILD_DIR=bin
44

5+
# Database config
6+
DB_NAME = tuf_trust
7+
DB_USER = rootuser
8+
DB_PASS = root
9+
DB_ROOT_PASS = rootpassword
10+
DB_PORT = 3306
11+
DB_CONTAINER = mariadb
12+
DB_IMAGE = registry.redhat.io/rhel9/mariadb-105@sha256:050dd5a7a32395b73b8680570e967e55050b152727412fdd73a25d8816e62d53
13+
DB_DSN = $(DB_USER):$(DB_PASS)@tcp(localhost:$(DB_PORT))/$(DB_NAME)
14+
TUF_PUBLIC_INSTANCE = https://tuf-repo-cdn.sigstore.dev
15+
516
.PHONY: all
617
all: generate-openapi build
718

@@ -18,17 +29,56 @@ build: generate-openapi deps
1829
go build -v -o $(BUILD_DIR)/$(BINARY_NAME) ./$(CMD_DIR)
1930

2031
.PHONY: run
21-
run: build
32+
run: build deploy-mariadb
33+
@echo "Waiting for MariaDB to be ready..."
34+
@until podman exec $(DB_CONTAINER) mysqladmin ping -h "127.0.0.1" -u$(DB_USER) -p$(DB_PASS) --silent; do \
35+
echo "Waiting for database..."; \
36+
sleep 1; \
37+
done
38+
@echo "MariaDB is up."
2239
@echo "Running $(BINARY_NAME)..."
23-
@./$(BUILD_DIR)/$(BINARY_NAME)
24-
25-
.PHONY: clean
26-
clean:
27-
@echo "Cleaning build artifacts..."
28-
@rm -rf $(BUILD_DIR)
40+
@DB_DSN="$(DB_DSN)" \
41+
TUF_REPO_URL="$(TUF_PUBLIC_INSTANCE)" \
42+
"./$(BUILD_DIR)/$(BINARY_NAME)"
2943

3044
.PHONY: deps
3145
deps:
3246
@echo "Installing dependencies..."
3347
@go mod tidy
3448
@go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@latest
49+
50+
# Database Management
51+
.PHONY: deploy-mariadb
52+
deploy-mariadb:
53+
@echo "Starting MariaDB container..."
54+
@if podman ps -a --format '{{.Names}}' | grep -q "^$(DB_CONTAINER)$$"; then \
55+
echo "Container $(DB_CONTAINER) already exists. Removing..."; \
56+
podman rm -f $(DB_CONTAINER); \
57+
fi
58+
podman run -d --name $(DB_CONTAINER) \
59+
-e MYSQL_ROOT_PASSWORD=$(DB_ROOT_PASS) \
60+
-e MYSQL_DATABASE=$(DB_NAME) \
61+
-e MYSQL_USER=$(DB_USER) \
62+
-e MYSQL_PASSWORD=$(DB_PASS) \
63+
-p $(DB_PORT):3306 \
64+
$(DB_IMAGE)
65+
@echo "MariaDB started. DSN: $(DB_DSN)"
66+
67+
.PHONY: stop-mariadb
68+
stop-mariadb:
69+
@echo "Stopping MariaDB container..."
70+
podman stop $(DB_CONTAINER)
71+
72+
.PHONY: clean-mariadb
73+
clean-mariadb:
74+
@echo "Removing MariaDB container..."
75+
podman rm -f $(DB_CONTAINER)
76+
77+
.PHONY: restart-mariadb
78+
restart-mariadb: stop-mariadb deploy-mariadb
79+
80+
.PHONY: clean
81+
clean:
82+
@echo "Cleaning build artifacts..."
83+
@rm -rf $(BUILD_DIR)
84+
@$(MAKE) clean-mariadb

README.md

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,11 @@ The RHTAS Console is a Go-based RESTful API server, providing functionality for
3131
cd rhtas-console
3232
```
3333

34-
2. **Build the application**:
34+
2. **Run the server**:
3535

3636
```bash
37-
make build
38-
```
39-
40-
3. **Run the server**:
41-
42-
```bash
43-
./bin/rhtas_console
37+
# Builds and runs the application, including deploying a MariaDB container.
38+
make run
4439
```
4540

4641
The backend server runs on `localhost:8080` by default. Configure the port via `--port` flag.
@@ -53,12 +48,27 @@ The RHTAS Console is a Go-based RESTful API server, providing functionality for
5348

5449
## Usage
5550

51+
### Using the Makefile
52+
The project includes a Makefile to streamline common development tasks. Below are the key make targets available:
53+
54+
| Target | Description |
55+
|-----------------------------------|--------------------------------------------------|
56+
| `make generate-openapi` | Generates Go code from the OpenAPI specification (`rhtas-console.yaml`). |
57+
| `make build` | Builds the `rhtas_console` binary, placing it in the `bin/` directory. |
58+
| `make run` | Builds and runs the application, including deploying a MariaDB container. |
59+
| `make deps` | Installs Go dependencies and the oapi-codegen tool. |
60+
| `make deploy-mariadb` | Starts a MariaDB container for the database with configured settings. |
61+
| `make stop-mariadb` | Stops the running MariaDB container. |
62+
| `make clean-mariadb` | Removes the MariaDB container. |
63+
| `make restart-mariadb` | Restarts the MariaDB container by stopping and redeploying it. |
64+
| `make clean` | Removes build artifacts and the MariaDB container. |
65+
5666
### Running the Backend server
5767

5868
Start the server with:
5969

6070
```bash
61-
./bin/rhtas_console
71+
make run
6272
```
6373

6474
The API will be available at `http://localhost:8080` (or `https://api.rhtas.example.com` in production).
@@ -69,17 +79,20 @@ The backend exposes the following RESTful endpoints, as defined in the OpenAPI s
6979

7080
| Method | Endpoint | Description |
7181
|--------|-----------------------------------|--------------------------------------------------|
72-
| GET | `/healthz` | Retrieves the current health status of the server. |
73-
| GET | `/swagger-ui` | Serves the Swagger User Interface. |
74-
| GET | `/rhtas-console.yaml` | Returns the project OpenAPI spec file. |
75-
| POST | `/api/v1/artifacts/sign` | Signs an artifact using Cosign. |
76-
| POST | `/api/v1/artifacts/verify` | Verifies an artifact using Cosign. |
77-
| GET | `/api/v1/artifacts/{artifact}/policies` | Retrieves policies and attestations for an artifact. |
78-
| GET | `/api/v1/artifacts/image` | Retrieves metadata for a container image by full reference URI. |
79-
| GET | `/api/v1/rekor/entries/{uuid}` | Retrieves a Rekor transparency log entry by UUID. |
80-
| GET | `/api/v1/rekor/public-key` | Retrieves the Rekor public key in PEM format. |
81-
| GET | `/api/v1/trust/config` | Retrieves Fulcio certificate authorities and Rekor transparency logs. |
82-
| GET | `/api/v1/trust/root-metadata-info` | Retrieves the full history of TUF root metadata versions, including version, expiration date, and status (valid, expiring, expired). |
82+
| GET | `/healthz` | Retrieves the current health status of the server. |
83+
| GET | `/swagger-ui` | Serves the Swagger User Interface. |
84+
| GET | `/rhtas-console.yaml` | Returns the project OpenAPI spec file. |
85+
| POST | `/api/v1/artifacts/sign` | Signs an artifact using Cosign. |
86+
| POST | `/api/v1/artifacts/verify` | Verifies an artifact using Cosign. |
87+
| GET | `/api/v1/artifacts/{artifact}/policies` | Retrieves policies and attestations for an artifact. |
88+
| GET | `/api/v1/artifacts/image` | Retrieves metadata for a container image by full reference URI. |
89+
| GET | `/api/v1/rekor/entries/{uuid}` | Retrieves a Rekor transparency log entry by UUID. |
90+
| GET | `/api/v1/rekor/public-key` | Retrieves the Rekor public key in PEM format. |
91+
| GET | `/api/v1/trust/config` | Retrieves Fulcio certificate authorities and Rekor transparency logs. |
92+
| GET | `/api/v1/trust/root-metadata-info` | Retrieves the full history of TUF root metadata versions, including version, expiration date, and status (valid, expiring, expired). |
93+
| GET | `/api/v1/trust/targets` | Retrieves all TUF targets. |
94+
| GET | `/api/v1/trust/target` | Retrieves a specific TUF target. |
95+
| GET | `/api/v1/trust/targets/certificates` | Retrieves certificates for TUF targets. |
8396

8497
#### Example: Sign an artifact
8598

cmd/rhtas_console/main.go

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package main
22

33
import (
4+
"context"
45
"flag"
56
"log"
67
"net/http"
8+
"os/signal"
79
"strconv"
10+
"syscall"
11+
"time"
812

913
"github.com/go-chi/chi/v5"
1014
"github.com/go-chi/chi/v5/middleware"
@@ -38,10 +42,35 @@ func main() {
3842

3943
api.RegisterRoutes(r, artifactService, rekorService, trustService)
4044

41-
portStr := strconv.Itoa(*serverPort)
42-
addr := ":" + portStr
43-
log.Printf("Starting server on %s", addr)
44-
if err := http.ListenAndServe(addr, r); err != nil {
45-
log.Fatalf("Server failed: %v", err)
45+
server := &http.Server{
46+
Addr: ":" + strconv.Itoa(*serverPort),
47+
Handler: r,
4648
}
49+
50+
go func() {
51+
log.Printf("Starting server on %s", server.Addr)
52+
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
53+
log.Fatalf("Server failed: %v", err)
54+
}
55+
}()
56+
57+
// Handle shutdown signals
58+
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
59+
defer stop()
60+
61+
<-ctx.Done()
62+
log.Println("Shutting down server...")
63+
64+
shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
65+
defer cancel()
66+
67+
if err := server.Shutdown(shutdownCtx); err != nil {
68+
log.Printf("Server shutdown failed: %v", err)
69+
}
70+
71+
if err := trustService.CloseDB(); err != nil {
72+
log.Printf("Failed to close trustService: %v", err)
73+
}
74+
75+
log.Println("Server shut down successfully")
4776
}

go.mod

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ toolchain go1.23.9
66

77
require (
88
github.com/go-chi/chi/v5 v5.2.1
9+
github.com/go-sql-driver/mysql v1.9.1
10+
github.com/golang-migrate/migrate/v4 v4.18.3
911
github.com/google/go-containerregistry v0.20.3
1012
github.com/oapi-codegen/runtime v1.1.1
1113
github.com/sigstore/sigstore-go v1.0.0
@@ -14,19 +16,22 @@ require (
1416
)
1517

1618
require (
19+
filippo.io/edwards25519 v1.1.0 // indirect
1720
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
1821
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
1922
github.com/cespare/xxhash/v2 v2.3.0 // indirect
2023
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
2124
github.com/google/uuid v1.6.0 // indirect
22-
github.com/kr/text v0.2.0 // indirect
25+
github.com/hashicorp/errwrap v1.1.0 // indirect
26+
github.com/hashicorp/go-multierror v1.1.1 // indirect
2327
github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec // indirect
2428
github.com/opencontainers/go-digest v1.0.0 // indirect
2529
github.com/rogpeppe/go-internal v1.13.1 // indirect
2630
github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect
2731
github.com/sigstore/protobuf-specs v0.4.1 // indirect
2832
github.com/sigstore/sigstore v1.9.4 // indirect
2933
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect
34+
go.uber.org/atomic v1.7.0 // indirect
3035
golang.org/x/crypto v0.39.0 // indirect
3136
golang.org/x/sys v0.33.0 // indirect
3237
golang.org/x/term v0.32.0 // indirect

go.sum

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
2+
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
3+
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
4+
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
5+
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
6+
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
17
github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk=
28
github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
39
github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
@@ -10,17 +16,28 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF
1016
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
1117
github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8=
1218
github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU=
13-
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
1419
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1520
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1621
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
1722
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
23+
github.com/dhui/dktest v0.4.5 h1:uUfYBIVREmj/Rw6MvgmqNAYzTiKOHJak+enB5Di73MM=
24+
github.com/dhui/dktest v0.4.5/go.mod h1:tmcyeHDKagvlDrz7gDKq4UAJOLIfVZYkfD5OnHDwcCo=
25+
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
26+
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
1827
github.com/docker/cli v28.2.2+incompatible h1:qzx5BNUDFqlvyq4AHzdNB7gSyVTmU4cgsyN9SdInc1A=
1928
github.com/docker/cli v28.2.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
2029
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
2130
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
31+
github.com/docker/docker v27.5.0+incompatible h1:um++2NcQtGRTz5eEgO6aJimo6/JxrTXC941hd05JO6U=
32+
github.com/docker/docker v27.5.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
2233
github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8=
2334
github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo=
35+
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
36+
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
37+
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
38+
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
39+
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
40+
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
2441
github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8=
2542
github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
2643
github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4=
@@ -31,8 +48,14 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
3148
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
3249
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
3350
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
51+
github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI=
52+
github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
3453
github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U=
3554
github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
55+
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
56+
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
57+
github.com/golang-migrate/migrate/v4 v4.18.3 h1:EYGkoOsvgHHfm5U/naS1RP/6PL/Xv3S4B/swMiAmDLs=
58+
github.com/golang-migrate/migrate/v4 v4.18.3/go.mod h1:99BKpIi6ruaaXRM1A77eqZ+FWPQ3cfRa+ZVy5bmWMaY=
3659
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
3760
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
3861
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
@@ -41,6 +64,11 @@ github.com/google/go-containerregistry v0.20.3 h1:oNx7IdTI936V8CQRveCjaxOiegWwvM
4164
github.com/google/go-containerregistry v0.20.3/go.mod h1:w00pIgBRDVUDFM6bq+Qx8lwNWK+cxgCuX1vd3PIBDNI=
4265
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
4366
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
67+
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
68+
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
69+
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
70+
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
71+
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
4472
github.com/jmhodges/clock v1.2.0 h1:eq4kys+NI0PLngzaHEe7AmPT90XMGIEySD1JfV1PDIs=
4573
github.com/jmhodges/clock v1.2.0/go.mod h1:qKjhA7x7u/lQpPB1XAqX1b1lCI/w3/fNuYpI/ZjLynI=
4674
github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
@@ -52,10 +80,18 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
5280
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
5381
github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec h1:2tTW6cDth2TSgRbAhD7yjZzTQmcN25sDRPEeinR51yQ=
5482
github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec/go.mod h1:TmwEoGCwIti7BCeJ9hescZgRtatxRE+A72pCoPfmcfk=
83+
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
84+
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
5585
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
5686
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
5787
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
5888
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
89+
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
90+
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
91+
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
92+
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
93+
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
94+
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
5995
github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro=
6096
github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg=
6197
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
@@ -101,6 +137,18 @@ github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C
101137
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs=
102138
github.com/vbatts/tar-split v0.12.1 h1:CqKoORW7BUWBe7UL/iqTVvkTBOF8UvOMKOIZykxnnbo=
103139
github.com/vbatts/tar-split v0.12.1/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA=
140+
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
141+
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
142+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU=
143+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q=
144+
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
145+
go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
146+
go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
147+
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
148+
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
149+
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
150+
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
151+
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
104152
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
105153
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
106154
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=

0 commit comments

Comments
 (0)