├── testdata ├── simple.yaml ├── recursive │ └── a │ │ ├── a.yaml │ │ └── b │ │ └── b.yaml ├── k8s.yaml └── multi.yaml ├── cmd ├── test-cgo │ └── main.go ├── test-lambda │ └── main.go └── test │ └── main.go ├── examples ├── provider │ └── provider.tf └── resources │ └── ko_image │ └── resource.tf ├── terraform-registry-manifest.json ├── tools └── tools.go ├── .github ├── dependabot.yml └── workflows │ ├── verify.yml │ ├── build.yml │ ├── test.yml │ └── release.yml ├── .chainguard └── source.yaml ├── internal └── provider │ ├── provider_test.go │ ├── provider.go │ ├── resource_ko_build_test.go │ └── resource_ko_build.go ├── provider-examples ├── lambda │ ├── README.md │ └── lambda.tf ├── apprunner │ ├── README.md │ └── apprunner.tf ├── lightsail │ ├── README.md │ └── lightsail.tf ├── fly.io │ ├── README.md │ └── fly.tf ├── kubernetes │ ├── README.md │ └── kubernetes.tf ├── cloudrun │ ├── README.md │ └── cloudrun.tf └── ecs │ ├── README.md │ └── ecs.tf ├── docs ├── index.md └── resources │ └── build.md ├── .gitignore ├── .golangci.yaml ├── DEVELOPMENT.md ├── .vscode └── launch.json ├── README.md ├── main.go ├── .goreleaser.yml ├── go.mod ├── LICENSE └── go.sum /testdata/simple.yaml: -------------------------------------------------------------------------------- 1 | image: ko://github.com/google/ko/test 2 | -------------------------------------------------------------------------------- /testdata/recursive/a/a.yaml: -------------------------------------------------------------------------------- 1 | a: ko://github.com/google/ko/test 2 | -------------------------------------------------------------------------------- /testdata/recursive/a/b/b.yaml: -------------------------------------------------------------------------------- 1 | b: ko://github.com/google/ko/test 2 | -------------------------------------------------------------------------------- /cmd/test-cgo/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "C" 4 | 5 | func main() {} 6 | -------------------------------------------------------------------------------- /examples/provider/provider.tf: -------------------------------------------------------------------------------- 1 | provider "ko" { 2 | repo = "ttl.sh/foo" 3 | } 4 | -------------------------------------------------------------------------------- /examples/resources/ko_image/resource.tf: -------------------------------------------------------------------------------- 1 | resource "ko_build" "example" { 2 | importpath = "github.com/google/ko" 3 | } 4 | -------------------------------------------------------------------------------- /terraform-registry-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "metadata": { 4 | "protocol_versions": ["5.0"] 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /tools/tools.go: -------------------------------------------------------------------------------- 1 | //go:build tools 2 | // +build tools 3 | 4 | package tools 5 | 6 | import ( 7 | // document generation 8 | _ "github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs" 9 | ) 10 | -------------------------------------------------------------------------------- /testdata/k8s.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: kodata 5 | namespace: default 6 | spec: 7 | containers: 8 | - name: obiwan 9 | image: ko://github.com/google/ko/test 10 | -------------------------------------------------------------------------------- /testdata/multi.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # comments should be ignored 3 | 0: ko://github.com/google/ko/test 4 | 5 | --- 6 | # this should get skipped 7 | --- 8 | 9 | --- 10 | 1: ko://github.com/google/ko/test 11 | # erroneous whitespaces should be ignored 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | 8 | - package-ecosystem: "gomod" 9 | directory: "/" 10 | schedule: 11 | interval: "weekly" 12 | -------------------------------------------------------------------------------- /cmd/test-lambda/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/aws/aws-lambda-go/lambda" 4 | 5 | func hello() (string, error) { 6 | return "Hello ƛ!", nil 7 | } 8 | 9 | func main() { 10 | // Make the handler available for Remote Procedure Call by AWS Lambda 11 | lambda.Start(hello) 12 | } 13 | -------------------------------------------------------------------------------- /cmd/test/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "html" 6 | "log" 7 | "net/http" 8 | ) 9 | 10 | func main() { 11 | http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { 12 | fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) 13 | }) 14 | 15 | log.Fatal(http.ListenAndServe(":8080", nil)) 16 | } 17 | -------------------------------------------------------------------------------- /.chainguard/source.yaml: -------------------------------------------------------------------------------- 1 | # Copyright 2022 Chainguard, Inc. 2 | # SPDX-License-Identifier: Apache-2.0 3 | 4 | spec: 5 | authorities: 6 | - keyless: 7 | url: https://fulcio.sigstore.dev 8 | ctlog: 9 | url: https://rekor.sigstore.dev 10 | - key: 11 | # Allow commits signed by GitHub. 12 | kms: https://github.com/web-flow.gpg 13 | -------------------------------------------------------------------------------- /internal/provider/provider_test.go: -------------------------------------------------------------------------------- 1 | package provider 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" 7 | ) 8 | 9 | var providerFactories = map[string]func() (*schema.Provider, error){ 10 | "ko": func() (*schema.Provider, error) { //nolint: unparam 11 | return New("dev")(), nil 12 | }, 13 | } 14 | 15 | func TestProvider(t *testing.T) { 16 | if err := New("dev")().InternalValidate(); err != nil { 17 | t.Fatalf("err: %s", err) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /provider-examples/lambda/README.md: -------------------------------------------------------------------------------- 1 | # Example: Deploying to AWS Lambda 2 | 3 | This example uses the [`aws`](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) provider and its [`lambda`](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function) resources. 4 | 5 | Then `terraform init` to install the necessary providers. 6 | 7 | Then `terraform apply` to build and deploy the example app into a new lambda function. 8 | 9 | To clean up created resources, `terraform destroy`. 10 | -------------------------------------------------------------------------------- /provider-examples/apprunner/README.md: -------------------------------------------------------------------------------- 1 | # Example: Deploying to AWS App Runner 2 | 3 | This example uses the [`aws`](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) provider and its [`apprunner`](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/apprunner_service) resources. 4 | 5 | Then `terraform init` to install the necessary providers. 6 | 7 | Then `terraform apply` to build and deploy the example app into a new AppRunner service. 8 | 9 | To clean up created resources, `terraform destroy`. 10 | -------------------------------------------------------------------------------- /provider-examples/lightsail/README.md: -------------------------------------------------------------------------------- 1 | # Example: Deploying to AWS Lightsail 2 | 3 | This example uses the [`aws`](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) provider and its [`lightsail`](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lightsail_container_service) resources. 4 | 5 | Then `terraform init` to install the necessary providers. 6 | 7 | Then `terraform apply` to build and deploy the example app into a new Lightsail container service. 8 | 9 | To clean up created resources, `terraform destroy`. 10 | -------------------------------------------------------------------------------- /provider-examples/fly.io/README.md: -------------------------------------------------------------------------------- 1 | # Example: Deploying to fly.io 2 | 3 | This example is based on https://fly.io/docs/app-guides/terraform-iac-getting-started/ 4 | 5 | To start, [install the `flyctl` CLI](https://fly.io/docs/hands-on/install-flyctl/), log in, and create an app. 6 | 7 | Then `terraform init` to install the necessary providers. 8 | 9 | Then `terraform apply` and provide your app name to build and deploy the example app to Fly.io in two locations. 10 | 11 | When complete, your app will be available `https://.fly.dev`. 12 | 13 | To clean up created resources, `terraform destroy`. 14 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | # generated by https://github.com/hashicorp/terraform-plugin-docs 3 | page_title: "ko Provider" 4 | subcategory: "" 5 | description: |- 6 | 7 | --- 8 | 9 | # ko Provider 10 | 11 | 12 | 13 | ## Example Usage 14 | 15 | ```terraform 16 | provider "ko" { 17 | repo = "ttl.sh/foo" 18 | } 19 | ``` 20 | 21 | 22 | ## Schema 23 | 24 | ### Optional 25 | 26 | - `base_image` (String) Default base image for builds 27 | - `basic_auth` (String) Basic auth to use to authorize requests 28 | - `repo` (String) Container repository to publish images to. Defaults to `KO_DOCKER_REPO` env var 29 | -------------------------------------------------------------------------------- /.github/workflows/verify.yml: -------------------------------------------------------------------------------- 1 | name: verify 2 | 3 | on: 4 | pull_request: 5 | branches: ['main'] 6 | push: 7 | branches: ['main'] 8 | 9 | 10 | jobs: 11 | golangci: 12 | name: lint 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 16 | 17 | - uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 18 | with: 19 | go-version-file: './go.mod' 20 | check-latest: true 21 | 22 | - name: golangci-lint 23 | uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 # v9.2.0 24 | with: 25 | version: v2.1 26 | -------------------------------------------------------------------------------- /provider-examples/kubernetes/README.md: -------------------------------------------------------------------------------- 1 | # Example: Deploying to Kubernetes 2 | 3 | This example uses the [`kubernetes`](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs) provider and its [`kubernetes_deployment`](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment) resource. 4 | 5 | To start, set up a Kubernetes cluster. 6 | 7 | Then `terraform init` to install the necessary providers. 8 | 9 | Then `terraform apply` to build and deploy the example app to the current Kubernetes context. 10 | 11 | When complete, your deployment will start in the `tf-ko-example` namespace. 12 | 13 | To clean up created resources, `terraform destroy`. 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.dll 2 | *.exe 3 | .DS_Store 4 | terraform.tfplan 5 | terraform.tfstate 6 | bin/ 7 | dist/ 8 | modules-dev/ 9 | /pkg/ 10 | website/.vagrant 11 | website/.bundle 12 | website/build 13 | website/node_modules 14 | .vagrant/ 15 | *.backup 16 | ./*.tfstate 17 | .terraform/ 18 | *.log 19 | *.bak 20 | *~ 21 | .*.swp 22 | .idea 23 | *.iml 24 | *.test 25 | *.iml 26 | 27 | # Ignore federated GCP credentials. 28 | gha-creds-*.json 29 | 30 | website/vendor 31 | 32 | # Test exclusions 33 | !command/test-fixtures/**/*.tfstate 34 | !command/test-fixtures/**/.terraform/ 35 | 36 | # Keep windows files with windows line endings 37 | *.winfile eol=crlf 38 | 39 | terraform-provider-ko 40 | .terraform.lock.hcl 41 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | on: 3 | pull_request: 4 | branches: ['main'] 5 | push: 6 | branches: ['main'] 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 13 | - uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 14 | with: 15 | go-version-file: './go.mod' 16 | check-latest: true 17 | - uses: goreleaser/goreleaser-action@e435ccd777264be153ace6237001ef4d979d3a7a # v6.4.0 18 | with: 19 | version: latest 20 | args: release --clean --snapshot --skip=sign 21 | env: 22 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 23 | -------------------------------------------------------------------------------- /provider-examples/cloudrun/README.md: -------------------------------------------------------------------------------- 1 | # Example: Deploying to Google Cloud Run 2 | 3 | This example uses the [`google`](https://registry.terraform.io/providers/hashicorp/google/latest/docs) provider and its [`cloud_run_service`](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_service) resource. 4 | 5 | To start, `terraform init` to install the necessary providers. 6 | 7 | Then `terraform apply` to build and deploy the example app to Cloud Run. 8 | You will be prompted for your GCP project. 9 | 10 | > Note: Cloud Run requires that images are pushed to Google Artifact Registry to be deployed to Cloud Run. 11 | 12 | When complete, your service will be named `tf-ko-example`. 13 | 14 | To clean up created resources, `terraform destroy`. 15 | -------------------------------------------------------------------------------- /provider-examples/ecs/README.md: -------------------------------------------------------------------------------- 1 | # Example: Deploying to ECS 2 | 3 | This example uses the [`aws`](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) provider and its [`ecs`](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_cluster) resources. 4 | 5 | Then `terraform init` to install the necessary providers. 6 | 7 | Then `terraform apply` to build and deploy the example app into a new ECS cluster and service. 8 | 9 | Since Fargate needs to know what subnet to host things on, the terraform variable `subnet` must be specified (e.g. `TF_VAR_subnet`) or you will be prompted for it. 10 | 11 | When complete, your service will run in a new ECS cluster named `tf-cluster`. 12 | 13 | To clean up created resources, `terraform destroy`. 14 | -------------------------------------------------------------------------------- /.golangci.yaml: -------------------------------------------------------------------------------- 1 | version: "2" 2 | linters: 3 | enable: 4 | - asciicheck 5 | - errorlint 6 | - gosec 7 | - importas 8 | - misspell 9 | - prealloc 10 | - revive 11 | - staticcheck 12 | - tparallel 13 | - unconvert 14 | - unparam 15 | - whitespace 16 | exclusions: 17 | generated: lax 18 | presets: 19 | - comments 20 | - common-false-positives 21 | - legacy 22 | - std-error-handling 23 | rules: 24 | - linters: 25 | - gosec 26 | path: test 27 | paths: 28 | - third_party$ 29 | - builtin$ 30 | - examples$ 31 | formatters: 32 | enable: 33 | - gofmt 34 | - goimports 35 | exclusions: 36 | generated: lax 37 | paths: 38 | - third_party$ 39 | - builtin$ 40 | - examples$ 41 | -------------------------------------------------------------------------------- /DEVELOPMENT.md: -------------------------------------------------------------------------------- 1 | # Generating docs 2 | 3 | **The repo must be checked out into a directory named `terraform-provider-ko`.** 4 | 5 | After that, `go generate ./...` 6 | 7 | # Running acceptance tests 8 | 9 | ``` 10 | TF_ACC=1 go test ./internal/provider/... 11 | ``` 12 | 13 | --- 14 | 15 | # Iterating locally 16 | 17 | This relies on https://www.terraform.io/cli/config/config-file#implied-local-mirror-directories 18 | 19 | ``` 20 | rm .terraform.lock.hcl && \ 21 | go build -o ~/.terraform.d/plugins/registry.terraform.io/ko-build/ko/0.0.100/darwin_arm64/terraform-provider-ko && \ 22 | terraform init && \ 23 | terraform apply 24 | ``` 25 | 26 | Also update `version = "0.0.0"` in the .tf file. 27 | 28 | This builds the provider code into the correct local mirror location, installs the provider using that location, 29 | 30 | Don't forget to delete the provider from the local mirror if you want to use the released provider later. 31 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Acceptance Tests", 9 | "type": "go", 10 | "request": "launch", 11 | "mode": "test", 12 | // this assumes your workspace is the root of the repo 13 | "program": "${fileDirname}", 14 | "env": { 15 | "TF_ACC": "1", 16 | }, 17 | "args": [], 18 | }, 19 | { 20 | "name": "Debug - Attach External CLI", 21 | "type": "go", 22 | "request": "launch", 23 | "mode": "debug", 24 | // this assumes your workspace is the root of the repo 25 | "program": "${workspaceFolder}", 26 | "env": {}, 27 | "args": [ 28 | // pass the debug flag for reattaching 29 | "-debug", 30 | ], 31 | } 32 | ] 33 | } -------------------------------------------------------------------------------- /provider-examples/kubernetes/kubernetes.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | kubernetes = { 4 | source = "hashicorp/kubernetes" 5 | } 6 | ko = { 7 | source = "ko-build/ko" 8 | } 9 | } 10 | } 11 | 12 | // See https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs 13 | provider "kubernetes" { 14 | config_path = "~/.kube/config" 15 | } 16 | 17 | provider "ko" {} 18 | 19 | resource "ko_build" "example" { 20 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 21 | } 22 | 23 | resource "kubernetes_namespace" "ns" { 24 | metadata { 25 | name = "tf-ko-example" 26 | } 27 | } 28 | 29 | resource "kubernetes_deployment" "deploy" { 30 | metadata { 31 | name = "deployment" 32 | namespace = kubernetes_namespace.ns.metadata[0].name 33 | } 34 | spec { 35 | replicas = 3 36 | 37 | selector { 38 | match_labels = { 39 | app = "tf-ko-example" 40 | } 41 | } 42 | 43 | template { 44 | metadata { 45 | labels = { 46 | app = "tf-ko-example" 47 | } 48 | } 49 | 50 | spec { 51 | container { 52 | image = ko_build.example.image_ref 53 | name = "app" 54 | } 55 | } 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Terraform Provider for `ko` 2 | 3 | 🚨 **This is a work in progress.** 🚨 4 | 5 | https://registry.terraform.io/providers/ko-build/ko 6 | 7 | ## Usage 8 | 9 | This provides a `ko_build` resource that will build the referenced Go application specified by the `importpath`, push an image to the configured container repository, and make the image's reference available to other Terraform resources. 10 | 11 | ``` 12 | provider "ko" {} 13 | 14 | resource "ko_build" "example" { 15 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 16 | } 17 | ``` 18 | 19 | See provider examples: 20 | 21 | - [Google Cloud Run](./provider-examples/cloudrun/README.md) 22 | - [AWS Lambda](./provider-examples/lambda/README.md) 23 | - [AWS ECS](./provider-examples/ecs/README.md) 24 | - [AWS App Runner](./provider-examples/apprunner/README.md) 25 | - [AWS Lightsail](./provider-examples/lightsail/README.md) 26 | - [fly.io](./provider-examples/fly.io/README.md) 27 | - [Kubernetes](./provider-examples/kubernetes/README.md) 28 | 29 | The image will be rebuilt every time it's _referenced_, and will only report as having changed if the image that was built was different since the last time the image resource was read. 30 | 31 | This means that `terraform plan` will rebuild all referenced images, but only show diffs if rebuilds resulted in new images since last time the plan was made. 32 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | 6 | "github.com/hashicorp/terraform-plugin-sdk/v2/plugin" 7 | "github.com/ko-build/terraform-provider-ko/internal/provider" 8 | ) 9 | 10 | // Run "go generate" to format example terraform files and generate the docs for the registry/website 11 | 12 | // If you do not have terraform installed, you can remove the formatting command, but its suggested to 13 | // ensure the documentation is formatted properly. 14 | //go:generate terraform fmt -recursive ./examples/ 15 | 16 | // Run the docs generation tool, check its repository for more information on how it works and how docs 17 | // can be customized. 18 | //go:generate go run github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs 19 | 20 | var ( 21 | // these will be set by the goreleaser configuration 22 | // to appropriate values for the compiled binary 23 | version = "dev" 24 | 25 | // goreleaser can also pass the specific commit if you want 26 | // commit string = "" 27 | ) 28 | 29 | func main() { 30 | var debugMode bool 31 | 32 | flag.BoolVar(&debugMode, "debug", false, "set to true to run the provider with support for debuggers like delve") 33 | flag.Parse() 34 | 35 | opts := &plugin.ServeOpts{ 36 | Debug: debugMode, 37 | ProviderAddr: "registry.terraform.io/ko-build/ko", 38 | ProviderFunc: provider.New(version), 39 | } 40 | 41 | plugin.Serve(opts) 42 | } 43 | -------------------------------------------------------------------------------- /provider-examples/fly.io/fly.tf: -------------------------------------------------------------------------------- 1 | // https://fly.io/docs/app-guides/terraform-iac-getting-started/ 2 | 3 | terraform { 4 | required_providers { 5 | fly = { 6 | source = "fly-apps/fly" 7 | } 8 | ko = { 9 | source = "ko-build/ko" 10 | } 11 | } 12 | } 13 | 14 | variable "app" { 15 | type = string 16 | } 17 | 18 | provider "ko" {} 19 | 20 | resource "ko_build" "example" { 21 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 22 | } 23 | 24 | resource "fly_app" "example" { 25 | name = var.app 26 | org = "personal" 27 | } 28 | 29 | resource "fly_ip" "ip" { 30 | app = fly_app.example.name 31 | type = "v4" 32 | } 33 | 34 | resource "fly_ip" "ipv6" { 35 | app = fly_app.example.name 36 | type = "v6" 37 | } 38 | 39 | resource "fly_machine" "machine" { 40 | for_each = toset(["ewr", "lax"]) 41 | app = var.app 42 | region = each.value 43 | name = "${fly_app.example.name}-${each.value}" 44 | image = ko_build.example.image_ref 45 | services = [ 46 | { 47 | ports = [ 48 | { 49 | port = 443 50 | handlers = ["tls", "http"] 51 | }, 52 | { 53 | port = 80 54 | handlers = ["http"] 55 | } 56 | ] 57 | "protocol" : "tcp", 58 | "internal_port" : 80 59 | }, 60 | ] 61 | cpus = 1 62 | memorymb = 256 63 | } 64 | -------------------------------------------------------------------------------- /provider-examples/cloudrun/cloudrun.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | google = { 4 | source = "hashicorp/google" 5 | } 6 | ko = { 7 | source = "ko-build/ko" 8 | } 9 | } 10 | } 11 | 12 | provider "google" { 13 | project = var.project 14 | region = var.region 15 | } 16 | 17 | variable "project" {} 18 | 19 | variable "region" { 20 | default = "us-central1" 21 | } 22 | 23 | variable "service" { 24 | default = "tf-ko-example" 25 | } 26 | 27 | provider "ko" {} 28 | 29 | resource "ko_build" "example" { 30 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 31 | } 32 | 33 | resource "google_cloud_run_service" "default" { 34 | name = var.service 35 | location = var.region 36 | 37 | template { 38 | spec { 39 | containers { 40 | image = ko_build.example.image_ref 41 | } 42 | } 43 | } 44 | 45 | traffic { 46 | percent = 100 47 | latest_revision = true 48 | } 49 | } 50 | 51 | data "google_iam_policy" "noauth" { 52 | binding { 53 | role = "roles/run.invoker" 54 | members = [ 55 | "allUsers", 56 | ] 57 | } 58 | } 59 | 60 | resource "google_cloud_run_service_iam_policy" "noauth" { 61 | location = google_cloud_run_service.default.location 62 | project = google_cloud_run_service.default.project 63 | service = google_cloud_run_service.default.name 64 | 65 | policy_data = data.google_iam_policy.noauth.policy_data 66 | } 67 | 68 | output "url" { 69 | value = google_cloud_run_service.default.status[0].url 70 | } 71 | -------------------------------------------------------------------------------- /docs/resources/build.md: -------------------------------------------------------------------------------- 1 | --- 2 | # generated by https://github.com/hashicorp/terraform-plugin-docs 3 | page_title: "ko_build Resource - terraform-provider-ko" 4 | subcategory: "" 5 | description: |- 6 | Sample resource in the Terraform provider scaffolding. 7 | --- 8 | 9 | # ko_build (Resource) 10 | 11 | Sample resource in the Terraform provider scaffolding. 12 | 13 | 14 | 15 | 16 | ## Schema 17 | 18 | ### Required 19 | 20 | - `importpath` (String) import path to build 21 | 22 | ### Optional 23 | 24 | - `base_image` (String) base image to use 25 | - `env` (List of String) Extra environment variables to pass to the go build 26 | - `go_binary_path` (String) Path to the Go binary to use for builds (sets KO_GO_PATH) 27 | - `ldflags` (List of String) Extra ldflags to pass to the go build 28 | - `platforms` (List of String) Which platform to use when pulling a multi-platform base. Format: all | [/[/]][,platform]* 29 | - `repo` (String) Container repository to publish images to. If set, this overrides the provider's `repo`, and the image name will be exactly the specified `repo`, without the importpath appended. 30 | - `sbom` (String) The SBOM media type to use (none will disable SBOM synthesis and upload). 31 | - `tags` (List of String) Which tags to use for the produced image instead of the default 'latest' tag 32 | - `working_dir` (String) working directory for the build 33 | 34 | ### Read-Only 35 | 36 | - `id` (String) The ID of this resource. 37 | - `image_ref` (String) built image reference by digest 38 | -------------------------------------------------------------------------------- /.goreleaser.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | before: 4 | hooks: 5 | - go mod tidy 6 | - /bin/bash -c 'if [ -n "$(git --no-pager diff --exit-code go.mod go.sum)" ]; then exit 1; fi' 7 | 8 | builds: 9 | - env: 10 | - CGO_ENABLED=0 11 | mod_timestamp: '{{ .CommitTimestamp }}' 12 | flags: 13 | - -trimpath 14 | ldflags: 15 | - '-s -w -X main.version={{.Version}} -X main.commit={{.Commit}}' 16 | goos: 17 | - freebsd 18 | - windows 19 | - linux 20 | - darwin 21 | goarch: 22 | - amd64 23 | - '386' 24 | - arm 25 | - arm64 26 | ignore: 27 | - goos: darwin 28 | goarch: '386' 29 | binary: '{{ .ProjectName }}_v{{ .Version }}' 30 | 31 | archives: 32 | - formats: 33 | - zip 34 | name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}' 35 | 36 | checksum: 37 | extra_files: 38 | - glob: 'terraform-registry-manifest.json' 39 | name_template: '{{ .ProjectName }}_{{ .Version }}_manifest.json' 40 | name_template: '{{ .ProjectName }}_{{ .Version }}_SHA256SUMS' 41 | algorithm: sha256 42 | 43 | signs: 44 | - artifacts: checksum 45 | args: 46 | - "--batch" 47 | - "--local-user" 48 | - "{{ .Env.GPG_FINGERPRINT }}" # set this environment variable for your signing key 49 | - "--output" 50 | - "${signature}" 51 | - "--detach-sign" 52 | - "${artifact}" 53 | 54 | release: 55 | extra_files: 56 | - glob: 'terraform-registry-manifest.json' 57 | name_template: '{{ .ProjectName }}_{{ .Version }}_manifest.json' 58 | -------------------------------------------------------------------------------- /provider-examples/lambda/lambda.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | ko = { 4 | source = "ko-build/ko" 5 | } 6 | } 7 | } 8 | 9 | variable "region" { 10 | default = "us-west-2" 11 | } 12 | 13 | provider "aws" { 14 | region = var.region 15 | } 16 | 17 | provider "ko" { 18 | // This is added as a check that `repo` works below, it should never be used. 19 | repo = "example.com" 20 | } 21 | 22 | resource "aws_ecr_repository" "foo" { 23 | name = "github.com/ko-build/terraform-provider-ko/provider-examples/lambda" 24 | image_tag_mutability = "MUTABLE" 25 | 26 | image_scanning_configuration { 27 | scan_on_push = false 28 | } 29 | } 30 | 31 | resource "ko_build" "image" { 32 | repo = aws_ecr_repository.foo.repository_url 33 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test-lambda" 34 | working_dir = path.module 35 | // Disable SBOM generation due to 36 | // https://github.com/ko-build/ko/issues/878 37 | sbom = "none" 38 | } 39 | 40 | resource "aws_iam_role" "lambda_access_role" { 41 | name = "lambda_access_role" 42 | 43 | assume_role_policy = jsonencode({ 44 | "Version" : "2012-10-17", 45 | "Statement" : [ 46 | { 47 | "Effect" : "Allow", 48 | "Principal" : { 49 | "Service" : "lambda.amazonaws.com" 50 | }, 51 | "Action" : "sts:AssumeRole" 52 | } 53 | ] 54 | }) 55 | } 56 | 57 | resource "aws_lambda_function" "example" { 58 | function_name = "terraform-provider-ko-sample" 59 | role = aws_iam_role.lambda_access_role.arn 60 | package_type = "Image" 61 | image_uri = ko_build.image.image_ref 62 | 63 | tags = { 64 | Name = "example-lambda-function" 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | on: 3 | pull_request: 4 | branches: ['main'] 5 | push: 6 | branches: ['main'] 7 | 8 | jobs: 9 | generate: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 13 | - uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 14 | with: 15 | go-version-file: './go.mod' 16 | check-latest: true 17 | 18 | - uses: hashicorp/setup-terraform@b9cd54a3c349d3f38e8881555d616ced269862dd # v3.1.2 19 | with: 20 | terraform_version: '1.11.*' 21 | terraform_wrapper: false 22 | 23 | - run: go generate ./... 24 | - name: git diff 25 | run: | 26 | git diff --compact-summary --exit-code || \ 27 | (echo; echo "Unexpected difference in directories after code generation. Run 'go generate ./...' command and commit."; exit 1) 28 | 29 | test: 30 | name: Test 31 | runs-on: ubuntu-latest 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | terraform: 36 | - '1.9.*' 37 | - '1.10.*' 38 | - '1.11.*' 39 | steps: 40 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 41 | - uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 42 | with: 43 | go-version-file: './go.mod' 44 | check-latest: true 45 | 46 | - uses: hashicorp/setup-terraform@b9cd54a3c349d3f38e8881555d616ced269862dd # v3.1.2 47 | with: 48 | terraform_version: ${{ matrix.terraform }} 49 | terraform_wrapper: false 50 | 51 | - run: go mod download 52 | - run: go build -v . 53 | - run: TF_ACC=1 go test -v -cover ./internal/provider/ 54 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: release 2 | on: 3 | push: 4 | tags: 5 | - 'v*' 6 | 7 | jobs: 8 | goreleaser: 9 | permissions: 10 | contents: write # To publish the release. 11 | id-token: write # To federate for the GPG key. 12 | 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 16 | - run: git fetch --prune --unshallow 17 | - uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 18 | with: 19 | go-version-file: './go.mod' 20 | check-latest: true 21 | cache: true 22 | 23 | # This is provisioned here: https://github.com/chainguard-dev/secrets/blob/main/terraform-provider-ko.tf 24 | - uses: google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3.0.0 25 | id: auth 26 | with: 27 | workload_identity_provider: "projects/12758742386/locations/global/workloadIdentityPools/github-pool/providers/github-provider" 28 | service_account: "terraform-provider-ko@chainguard-github-secrets.iam.gserviceaccount.com" 29 | - uses: google-github-actions/setup-gcloud@aa5489c8933f4cc7a4f7d45035b3b1440c9c10db # v3.0.1 30 | with: 31 | project_id: "chainguard-github-secrets" 32 | - uses: google-github-actions/get-secretmanager-secrets@bc9c54b29fdffb8a47776820a7d26e77b379d262 # v3.0.0 33 | id: secrets 34 | with: 35 | secrets: |- 36 | token:chainguard-github-secrets/terraform-provider-ko-signing-key 37 | 38 | - id: import_gpg 39 | uses: crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec # v6.3.0 40 | with: 41 | gpg_private_key: ${{ steps.secrets.outputs.token }} 42 | 43 | - uses: goreleaser/goreleaser-action@e435ccd777264be153ace6237001ef4d979d3a7a # v6.4.0 44 | with: 45 | version: latest 46 | args: release --clean 47 | env: 48 | GPG_FINGERPRINT: ${{ steps.import_gpg.outputs.fingerprint }} 49 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 50 | -------------------------------------------------------------------------------- /provider-examples/apprunner/apprunner.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | ko = { 4 | source = "ko-build/ko" 5 | } 6 | } 7 | } 8 | 9 | variable "region" { 10 | default = "us-west-2" 11 | } 12 | 13 | provider "aws" { 14 | region = var.region 15 | } 16 | 17 | provider "ko" { 18 | // This is added as a check that `repo` works below, it should never be used. 19 | repo = "example.com" 20 | } 21 | 22 | resource "aws_ecr_repository" "foo" { 23 | name = "github.com/ko-build/terraform-provider-ko/provider-examples/apprunner" 24 | image_tag_mutability = "MUTABLE" 25 | 26 | image_scanning_configuration { 27 | scan_on_push = false 28 | } 29 | } 30 | 31 | resource "ko_build" "image" { 32 | repo = aws_ecr_repository.foo.repository_url 33 | base_image = "cgr.dev/chainguard/static:latest-glibc" 34 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 35 | working_dir = path.module 36 | // Disable SBOM generation due to 37 | // https://github.com/ko-build/ko/issues/878 38 | sbom = "none" 39 | } 40 | 41 | resource "aws_iam_role" "apprunner_access_role" { 42 | name = "apprunner_access_role" 43 | 44 | assume_role_policy = jsonencode({ 45 | "Version" : "2012-10-17", 46 | "Statement" : [ 47 | { 48 | "Effect" : "Allow", 49 | "Principal" : { 50 | "Service" : "build.apprunner.amazonaws.com" 51 | }, 52 | "Action" : "sts:AssumeRole" 53 | } 54 | ] 55 | }) 56 | 57 | inline_policy { 58 | name = "can-pull-ecr" 59 | policy = jsonencode({ 60 | "Version" : "2012-10-17", 61 | "Statement" : [ 62 | { 63 | "Action" : [ 64 | "ecr:GetDownloadUrlForLayer", 65 | "ecr:BatchGetImage", 66 | "ecr:DescribeImages", 67 | "ecr:GetAuthorizationToken", 68 | "ecr:BatchCheckLayerAvailability", 69 | ], 70 | "Resource" : "*", 71 | "Effect" : "Allow" 72 | } 73 | ] 74 | }) 75 | } 76 | } 77 | 78 | resource "aws_apprunner_service" "example" { 79 | service_name = "example" 80 | 81 | source_configuration { 82 | authentication_configuration { 83 | access_role_arn = aws_iam_role.apprunner_access_role.arn 84 | } 85 | 86 | image_repository { 87 | image_identifier = ko_build.image.image_ref 88 | image_repository_type = "ECR" 89 | } 90 | auto_deployments_enabled = false 91 | } 92 | 93 | tags = { 94 | Name = "example-apprunner-service" 95 | } 96 | } 97 | 98 | output "apprunner-url" { 99 | value = aws_apprunner_service.example.service_url 100 | } 101 | -------------------------------------------------------------------------------- /provider-examples/lightsail/lightsail.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | ko = { 4 | source = "ko-build/ko" 5 | } 6 | } 7 | } 8 | 9 | variable "region" { 10 | default = "us-west-2" 11 | } 12 | 13 | provider "aws" { 14 | region = var.region 15 | } 16 | 17 | provider "ko" { 18 | // This is added as a check that `repo` works below, it should never be used. 19 | repo = "example.com" 20 | } 21 | 22 | resource "aws_ecr_repository" "foo" { 23 | name = "github.com/ko-build/terraform-provider-ko/provider-examples/lightsail" 24 | image_tag_mutability = "MUTABLE" 25 | 26 | image_scanning_configuration { 27 | scan_on_push = false 28 | } 29 | } 30 | 31 | resource "ko_build" "image" { 32 | repo = aws_ecr_repository.foo.repository_url 33 | base_image = "cgr.dev/chainguard/static:latest-glibc" 34 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 35 | working_dir = path.module 36 | // Disable SBOM generation due to 37 | // https://github.com/ko-build/ko/issues/878 38 | sbom = "none" 39 | } 40 | 41 | resource "aws_lightsail_container_service" "example" { 42 | name = "terraform-provider-ko" 43 | power = "nano" 44 | scale = 1 45 | 46 | private_registry_access { 47 | ecr_image_puller_role { 48 | is_active = true 49 | } 50 | } 51 | 52 | tags = { 53 | Name = "example-lightsail-service" 54 | } 55 | } 56 | 57 | resource "aws_ecr_repository_policy" "lightsail_ecr_download" { 58 | repository = aws_ecr_repository.foo.name 59 | 60 | policy = jsonencode({ 61 | "Version" : "2012-10-17", 62 | "Statement" : [ 63 | { 64 | "Sid" : "AllowLightsailPull", 65 | "Effect" : "Allow", 66 | "Principal" : { 67 | "AWS" : "${aws_lightsail_container_service.example.private_registry_access[0].ecr_image_puller_role[0].principal_arn}" 68 | }, 69 | "Action" : [ 70 | "ecr:BatchGetImage", 71 | "ecr:GetDownloadUrlForLayer" 72 | ] 73 | } 74 | ] 75 | }) 76 | } 77 | 78 | resource "aws_lightsail_container_service_deployment_version" "example" { 79 | container { 80 | container_name = "hello-world" 81 | image = ko_build.image.image_ref 82 | 83 | ports = { 84 | 8080 = "HTTP" 85 | } 86 | } 87 | 88 | public_endpoint { 89 | container_name = "hello-world" 90 | container_port = 8080 91 | 92 | health_check { 93 | healthy_threshold = 2 94 | unhealthy_threshold = 2 95 | timeout_seconds = 2 96 | interval_seconds = 5 97 | path = "/" 98 | success_codes = "200-499" 99 | } 100 | } 101 | 102 | service_name = aws_lightsail_container_service.example.name 103 | } 104 | 105 | output "url" { 106 | value = aws_lightsail_container_service.example.url 107 | } 108 | -------------------------------------------------------------------------------- /provider-examples/ecs/ecs.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | ko = { 4 | source = "ko-build/ko" 5 | } 6 | } 7 | } 8 | 9 | variable "region" { 10 | default = "us-west-2" 11 | } 12 | 13 | variable "subnet" { 14 | type = string 15 | } 16 | 17 | provider "aws" { 18 | region = var.region 19 | } 20 | 21 | provider "ko" { 22 | // This is added as a check that `repo` works below, it should never be used. 23 | repo = "example.com" 24 | } 25 | 26 | resource "aws_ecr_repository" "foo" { 27 | name = "github.com/ko-build/terraform-provider-ko/provider-examples/ecs" 28 | image_tag_mutability = "MUTABLE" 29 | 30 | image_scanning_configuration { 31 | scan_on_push = false 32 | } 33 | } 34 | 35 | resource "ko_build" "image" { 36 | repo = aws_ecr_repository.foo.repository_url 37 | base_image = "cgr.dev/chainguard/static:latest-glibc" 38 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 39 | working_dir = path.module 40 | // Disable SBOM generation due to 41 | // https://github.com/ko-build/ko/issues/878 42 | sbom = "none" 43 | } 44 | 45 | resource "aws_iam_role" "example" { 46 | name = "terraform-ecs-ko" 47 | 48 | assume_role_policy = jsonencode({ 49 | "Version" : "2012-10-17", 50 | "Statement" : [ 51 | { 52 | "Effect" : "Allow", 53 | "Principal" : { 54 | "Service" : "ecs.amazonaws.com" 55 | }, 56 | "Action" : "sts:AssumeRole" 57 | }, { 58 | "Effect" : "Allow", 59 | "Principal" : { 60 | "Service" : "ecs-tasks.amazonaws.com" 61 | }, 62 | "Action" : "sts:AssumeRole" 63 | } 64 | ] 65 | }) 66 | } 67 | 68 | // From https://aws.amazon.com/premiumsupport/knowledge-center/ecs-tasks-pull-images-ecr-repository/ 69 | resource "aws_iam_role_policy_attachment" "allow_ecs" { 70 | role = aws_iam_role.example.id 71 | policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" 72 | } 73 | 74 | resource "aws_ecs_cluster" "cluster" { 75 | name = "tf-cluster" 76 | } 77 | 78 | resource "aws_ecs_service" "foo" { 79 | name = "foo" 80 | cluster = aws_ecs_cluster.cluster.id 81 | task_definition = aws_ecs_task_definition.foo.arn 82 | desired_count = 2 83 | capacity_provider_strategy { 84 | base = 1 85 | capacity_provider = "FARGATE" 86 | weight = 100 87 | } 88 | network_configuration { 89 | assign_public_ip = true 90 | subnets = [var.subnet] 91 | } 92 | } 93 | 94 | resource "aws_ecs_task_definition" "foo" { 95 | family = "foo" 96 | requires_compatibilities = ["FARGATE"] 97 | network_mode = "awsvpc" 98 | execution_role_arn = aws_iam_role.example.arn 99 | cpu = 1024 100 | memory = 2048 101 | container_definitions = jsonencode([ 102 | { 103 | "name" : "foo", 104 | "image" : ko_build.image.image_ref, 105 | "cpu" : 1024, 106 | "memory" : 2048, 107 | "essential" : true 108 | } 109 | ]) 110 | } 111 | 112 | resource "aws_ecs_cluster_capacity_providers" "cluster" { 113 | cluster_name = aws_ecs_cluster.cluster.name 114 | capacity_providers = ["FARGATE"] 115 | default_capacity_provider_strategy { 116 | base = 1 117 | weight = 100 118 | capacity_provider = "FARGATE" 119 | } 120 | } 121 | 122 | -------------------------------------------------------------------------------- /internal/provider/provider.go: -------------------------------------------------------------------------------- 1 | package provider 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "strings" 7 | 8 | "github.com/google/go-containerregistry/pkg/authn" 9 | "github.com/google/ko/pkg/commands/options" 10 | "github.com/hashicorp/terraform-plugin-sdk/v2/diag" 11 | "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" 12 | ) 13 | 14 | func init() { 15 | // Set descriptions to support markdown syntax, this will be used in document generation 16 | // and the language server. 17 | schema.DescriptionKind = schema.StringMarkdown 18 | 19 | // Customize the content of descriptions when output. For example you can add defaults on 20 | // to the exported descriptions if present. 21 | // schema.SchemaDescriptionBuilder = func(s *schema.Schema) string { 22 | // desc := s.Description 23 | // if s.Default != nil { 24 | // desc += fmt.Sprintf(" Defaults to `%v`.", s.Default) 25 | // } 26 | // return strings.TrimSpace(desc) 27 | // } 28 | } 29 | 30 | func New(version string) func() *schema.Provider { 31 | return func() *schema.Provider { 32 | p := &schema.Provider{ 33 | Schema: map[string]*schema.Schema{ 34 | "repo": { 35 | Description: "Container repository to publish images to. Defaults to `KO_DOCKER_REPO` env var", 36 | Optional: true, 37 | DefaultFunc: schema.EnvDefaultFunc("KO_DOCKER_REPO", ""), 38 | Type: schema.TypeString, 39 | }, 40 | "basic_auth": { 41 | Description: "Basic auth to use to authorize requests", 42 | Optional: true, 43 | Default: "", 44 | Type: schema.TypeString, 45 | }, 46 | "base_image": { 47 | Description: "Default base image for builds", 48 | Optional: true, 49 | Default: "", 50 | Type: schema.TypeString, 51 | }, 52 | }, 53 | ResourcesMap: map[string]*schema.Resource{ 54 | "ko_build": resourceBuild(), 55 | }, 56 | } 57 | 58 | p.ConfigureContextFunc = configure(version, p) 59 | 60 | return p 61 | } 62 | } 63 | 64 | // configure initializes the global provider with sensible defaults (that mimic what ko does with cli/cobra defaults) 65 | // TODO: review input parameters 66 | func configure(version string, p *schema.Provider) func(context.Context, *schema.ResourceData) (interface{}, diag.Diagnostics) { //nolint: revive 67 | return func(_ context.Context, s *schema.ResourceData) (interface{}, diag.Diagnostics) { 68 | koDockerRepo, ok := s.Get("repo").(string) 69 | if !ok { 70 | return nil, diag.Errorf("expected repo to be string") 71 | } 72 | 73 | baseImage, ok := s.Get("base_image").(string) 74 | if !ok { 75 | return nil, diag.Errorf("expected base_image to be string") 76 | } 77 | 78 | var auth *authn.Basic 79 | if a, ok := s.Get("basic_auth").(string); !ok { 80 | return nil, diag.Errorf("expected basic_auth to be string") 81 | } else if a != "" { 82 | user, pass, ok := strings.Cut(a, ":") 83 | if !ok { 84 | return nil, diag.Errorf(`basic_auth did not contain ":"`) 85 | } 86 | auth = &authn.Basic{ 87 | Username: user, 88 | Password: pass, 89 | } 90 | } 91 | 92 | return &Opts{ 93 | bo: &options.BuildOptions{ 94 | BaseImage: baseImage, 95 | }, 96 | po: &options.PublishOptions{ 97 | DockerRepo: koDockerRepo, 98 | }, 99 | auth: auth, 100 | }, nil 101 | } 102 | } 103 | 104 | type Opts struct { 105 | bo *options.BuildOptions 106 | po *options.PublishOptions 107 | auth *authn.Basic 108 | } 109 | 110 | func NewProviderOpts(meta interface{}) (*Opts, error) { 111 | opts, ok := meta.(*Opts) 112 | if !ok { 113 | return nil, fmt.Errorf("parsing provider args: %v", meta) 114 | } 115 | 116 | // This won't parse the cmd flags, but it will parse any environment vars and set some helpful defaults for us 117 | if err := opts.bo.LoadConfig(); err != nil { 118 | return nil, err 119 | } 120 | 121 | return opts, nil 122 | } 123 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/ko-build/terraform-provider-ko 2 | 3 | go 1.24.3 4 | 5 | require ( 6 | github.com/aws/aws-lambda-go v1.51.0 7 | github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.10.1 8 | github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 9 | github.com/google/go-containerregistry v0.20.7 10 | github.com/google/ko v0.18.0 11 | github.com/hashicorp/go-cty v1.5.0 12 | github.com/hashicorp/terraform-plugin-docs v0.21.0 13 | github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1 14 | ) 15 | 16 | require ( 17 | al.essio.dev/pkg/shellescape v1.6.0 // indirect 18 | cloud.google.com/go/compute/metadata v0.7.0 // indirect 19 | github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect 20 | github.com/Azure/go-autorest v14.2.0+incompatible // indirect 21 | github.com/Azure/go-autorest/autorest v0.11.30 // indirect 22 | github.com/Azure/go-autorest/autorest/adal v0.9.24 // indirect 23 | github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 // indirect 24 | github.com/Azure/go-autorest/autorest/azure/cli v0.4.7 // indirect 25 | github.com/Azure/go-autorest/autorest/date v0.3.1 // indirect 26 | github.com/Azure/go-autorest/logger v0.2.2 // indirect 27 | github.com/Azure/go-autorest/tracing v0.6.1 // indirect 28 | github.com/BurntSushi/toml v1.5.0 // indirect 29 | github.com/Kunde21/markdownfmt/v3 v3.1.0 // indirect 30 | github.com/Masterminds/goutils v1.1.1 // indirect 31 | github.com/Masterminds/semver/v3 v3.2.0 // indirect 32 | github.com/Masterminds/sprig/v3 v3.2.3 // indirect 33 | github.com/Microsoft/go-winio v0.6.2 // indirect 34 | github.com/ProtonMail/go-crypto v1.1.6 // indirect 35 | github.com/agext/levenshtein v1.2.3 // indirect 36 | github.com/alessio/shellescape v1.4.2 // indirect 37 | github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect 38 | github.com/armon/go-radix v1.0.0 // indirect 39 | github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect 40 | github.com/aws/aws-sdk-go-v2 v1.36.5 // indirect 41 | github.com/aws/aws-sdk-go-v2/config v1.29.17 // indirect 42 | github.com/aws/aws-sdk-go-v2/credentials v1.17.70 // indirect 43 | github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 // indirect 44 | github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 // indirect 45 | github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 // indirect 46 | github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect 47 | github.com/aws/aws-sdk-go-v2/service/ecr v1.45.1 // indirect 48 | github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.33.2 // indirect 49 | github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect 50 | github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 // indirect 51 | github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 // indirect 52 | github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 // indirect 53 | github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 // indirect 54 | github.com/aws/smithy-go v1.22.4 // indirect 55 | github.com/bgentry/speakeasy v0.1.0 // indirect 56 | github.com/blang/semver v3.5.1+incompatible // indirect 57 | github.com/bmatcuk/doublestar/v4 v4.8.1 // indirect 58 | github.com/cloudflare/circl v1.6.1 // indirect 59 | github.com/containerd/errdefs v1.0.0 // indirect 60 | github.com/containerd/errdefs/pkg v0.3.0 // indirect 61 | github.com/containerd/stargz-snapshotter/estargz v0.18.1 // indirect 62 | github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 // indirect 63 | github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 // indirect 64 | github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 // indirect 65 | github.com/dimchansky/utfbom v1.1.1 // indirect 66 | github.com/distribution/reference v0.6.0 // indirect 67 | github.com/docker/cli v29.0.3+incompatible // indirect 68 | github.com/docker/distribution v2.8.3+incompatible // indirect 69 | github.com/docker/docker v28.5.2+incompatible // indirect 70 | github.com/docker/docker-credential-helpers v0.9.3 // indirect 71 | github.com/docker/go-connections v0.5.0 // indirect 72 | github.com/docker/go-units v0.5.0 // indirect 73 | github.com/dustin/go-humanize v1.0.1 // indirect 74 | github.com/evanphx/json-patch/v5 v5.9.11 // indirect 75 | github.com/fatih/color v1.18.0 // indirect 76 | github.com/felixge/httpsnoop v1.0.4 // indirect 77 | github.com/fsnotify/fsnotify v1.9.0 // indirect 78 | github.com/go-chi/chi v4.1.2+incompatible // indirect 79 | github.com/go-jose/go-jose/v4 v4.1.1 // indirect 80 | github.com/go-logr/logr v1.4.3 // indirect 81 | github.com/go-logr/stdr v1.2.2 // indirect 82 | github.com/go-openapi/analysis v0.23.0 // indirect 83 | github.com/go-openapi/errors v0.22.1 // indirect 84 | github.com/go-openapi/jsonpointer v0.21.1 // indirect 85 | github.com/go-openapi/jsonreference v0.21.0 // indirect 86 | github.com/go-openapi/loads v0.22.0 // indirect 87 | github.com/go-openapi/runtime v0.28.0 // indirect 88 | github.com/go-openapi/spec v0.21.0 // indirect 89 | github.com/go-openapi/strfmt v0.23.0 // indirect 90 | github.com/go-openapi/swag v0.23.1 // indirect 91 | github.com/go-openapi/validate v0.24.0 // indirect 92 | github.com/go-viper/mapstructure/v2 v2.2.1 // indirect 93 | github.com/golang-jwt/jwt/v4 v4.5.2 // indirect 94 | github.com/golang/protobuf v1.5.4 // indirect 95 | github.com/google/certificate-transparency-go v1.3.1 // indirect 96 | github.com/google/go-cmp v0.7.0 // indirect 97 | github.com/google/safetext v0.0.0-20240722112252-5a72de7e7962 // indirect 98 | github.com/google/uuid v1.6.0 // indirect 99 | github.com/hashicorp/cli v1.1.7 // indirect 100 | github.com/hashicorp/errwrap v1.1.0 // indirect 101 | github.com/hashicorp/go-checkpoint v0.5.0 // indirect 102 | github.com/hashicorp/go-cleanhttp v0.5.2 // indirect 103 | github.com/hashicorp/go-hclog v1.6.3 // indirect 104 | github.com/hashicorp/go-multierror v1.1.1 // indirect 105 | github.com/hashicorp/go-plugin v1.7.0 // indirect 106 | github.com/hashicorp/go-retryablehttp v0.7.7 // indirect 107 | github.com/hashicorp/go-uuid v1.0.3 // indirect 108 | github.com/hashicorp/go-version v1.7.0 // indirect 109 | github.com/hashicorp/hc-install v0.9.2 // indirect 110 | github.com/hashicorp/hcl/v2 v2.24.0 // indirect 111 | github.com/hashicorp/logutils v1.0.0 // indirect 112 | github.com/hashicorp/terraform-exec v0.23.1 // indirect 113 | github.com/hashicorp/terraform-json v0.27.1 // indirect 114 | github.com/hashicorp/terraform-plugin-go v0.29.0 // indirect 115 | github.com/hashicorp/terraform-plugin-log v0.9.0 // indirect 116 | github.com/hashicorp/terraform-registry-address v0.4.0 // indirect 117 | github.com/hashicorp/terraform-svchost v0.1.1 // indirect 118 | github.com/hashicorp/yamux v0.1.2 // indirect 119 | github.com/huandu/xstrings v1.3.3 // indirect 120 | github.com/imdario/mergo v0.3.16 // indirect 121 | github.com/in-toto/attestation v1.1.1 // indirect 122 | github.com/in-toto/in-toto-golang v0.9.0 // indirect 123 | github.com/inconshreveable/mousetrap v1.1.0 // indirect 124 | github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7 // indirect 125 | github.com/josharian/intern v1.0.0 // indirect 126 | github.com/klauspost/compress v1.18.1 // indirect 127 | github.com/letsencrypt/boulder v0.0.0-20250411005613-d800055fe666 // indirect 128 | github.com/mailru/easyjson v0.9.0 // indirect 129 | github.com/mattn/go-colorable v0.1.14 // indirect 130 | github.com/mattn/go-isatty v0.0.20 // indirect 131 | github.com/mattn/go-runewidth v0.0.13 // indirect 132 | github.com/mitchellh/copystructure v1.2.0 // indirect 133 | github.com/mitchellh/go-homedir v1.1.0 // indirect 134 | github.com/mitchellh/go-testing-interface v1.14.1 // indirect 135 | github.com/mitchellh/go-wordwrap v1.0.1 // indirect 136 | github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect 137 | github.com/mitchellh/reflectwalk v1.0.2 // indirect 138 | github.com/moby/docker-image-spec v1.3.1 // indirect 139 | github.com/moby/sys/sequential v0.6.0 // indirect 140 | github.com/oklog/run v1.1.0 // indirect 141 | github.com/oklog/ulid v1.3.1 // indirect 142 | github.com/opencontainers/go-digest v1.0.0 // indirect 143 | github.com/opencontainers/image-spec v1.1.1 // indirect 144 | github.com/opentracing/opentracing-go v1.2.0 // indirect 145 | github.com/pborman/uuid v1.2.1 // indirect 146 | github.com/pelletier/go-toml v1.9.5 // indirect 147 | github.com/pelletier/go-toml/v2 v2.2.4 // indirect 148 | github.com/pkg/errors v0.9.1 // indirect 149 | github.com/posener/complete v1.2.3 // indirect 150 | github.com/rivo/uniseg v0.4.4 // indirect 151 | github.com/sagikazarmark/locafero v0.9.0 // indirect 152 | github.com/sassoftware/relic v7.2.1+incompatible // indirect 153 | github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect 154 | github.com/shibumi/go-pathspec v1.3.0 // indirect 155 | github.com/shopspring/decimal v1.3.1 // indirect 156 | github.com/sigstore/cosign/v2 v2.5.0 // indirect 157 | github.com/sigstore/protobuf-specs v0.4.1 // indirect 158 | github.com/sigstore/rekor v1.3.9 // indirect 159 | github.com/sigstore/sigstore v1.9.3 // indirect 160 | github.com/sigstore/sigstore-go v0.7.1 // indirect 161 | github.com/sigstore/timestamp-authority v1.2.5 // indirect 162 | github.com/sirupsen/logrus v1.9.3 // indirect 163 | github.com/sourcegraph/conc v0.3.0 // indirect 164 | github.com/spf13/afero v1.14.0 // indirect 165 | github.com/spf13/cast v1.7.1 // indirect 166 | github.com/spf13/cobra v1.10.1 // indirect 167 | github.com/spf13/pflag v1.0.9 // indirect 168 | github.com/spf13/viper v1.20.1 // indirect 169 | github.com/subosito/gotenv v1.6.0 // indirect 170 | github.com/theupdateframework/go-tuf v0.7.0 // indirect 171 | github.com/theupdateframework/go-tuf/v2 v2.0.2 // indirect 172 | github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect 173 | github.com/transparency-dev/merkle v0.0.2 // indirect 174 | github.com/vbatts/tar-split v0.12.2 // indirect 175 | github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect 176 | github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect 177 | github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect 178 | github.com/yuin/goldmark v1.7.7 // indirect 179 | github.com/yuin/goldmark-meta v1.1.0 // indirect 180 | github.com/zclconf/go-cty v1.17.0 // indirect 181 | go.abhg.dev/goldmark/frontmatter v0.2.0 // indirect 182 | go.mongodb.org/mongo-driver v1.17.3 // indirect 183 | go.opentelemetry.io/auto/sdk v1.1.0 // indirect 184 | go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect 185 | go.opentelemetry.io/otel v1.37.0 // indirect 186 | go.opentelemetry.io/otel/metric v1.37.0 // indirect 187 | go.opentelemetry.io/otel/trace v1.37.0 // indirect 188 | go.uber.org/multierr v1.11.0 // indirect 189 | go.uber.org/zap v1.27.0 // indirect 190 | golang.org/x/crypto v0.44.0 // indirect 191 | golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect 192 | golang.org/x/mod v0.30.0 // indirect 193 | golang.org/x/net v0.47.0 // indirect 194 | golang.org/x/oauth2 v0.33.0 // indirect 195 | golang.org/x/sync v0.18.0 // indirect 196 | golang.org/x/sys v0.38.0 // indirect 197 | golang.org/x/term v0.37.0 // indirect 198 | golang.org/x/text v0.31.0 // indirect 199 | golang.org/x/tools v0.39.0 // indirect 200 | google.golang.org/appengine v1.6.8 // indirect 201 | google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect 202 | google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect 203 | google.golang.org/grpc v1.75.1 // indirect 204 | google.golang.org/protobuf v1.36.9 // indirect 205 | gopkg.in/yaml.v2 v2.4.0 // indirect 206 | gopkg.in/yaml.v3 v3.0.1 // indirect 207 | gotest.tools/v3 v3.1.0 // indirect 208 | k8s.io/klog/v2 v2.130.1 // indirect 209 | sigs.k8s.io/kind v0.27.0 // indirect 210 | sigs.k8s.io/yaml v1.4.0 // indirect 211 | ) 212 | -------------------------------------------------------------------------------- /internal/provider/resource_ko_build_test.go: -------------------------------------------------------------------------------- 1 | package provider 2 | 3 | import ( 4 | "fmt" 5 | "net/http/httptest" 6 | "regexp" 7 | "slices" 8 | "strings" 9 | "testing" 10 | 11 | "github.com/google/go-containerregistry/pkg/crane" 12 | "github.com/google/go-containerregistry/pkg/registry" 13 | "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" 14 | "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" 15 | ) 16 | 17 | func TestAccResourceKoBuild(t *testing.T) { 18 | // Setup a local registry and have tests push to that. 19 | srv := httptest.NewServer(registry.New()) 20 | defer srv.Close() 21 | parts := strings.Split(srv.URL, ":") 22 | url := fmt.Sprintf("localhost:%s/test", parts[len(parts)-1]) 23 | t.Setenv("KO_DOCKER_REPO", url) 24 | 25 | imageRefRE := regexp.MustCompile("^" + url + "/github.com/ko-build/terraform-provider-ko/cmd/test@sha256:") 26 | 27 | resource.Test(t, resource.TestCase{ 28 | ProviderFactories: providerFactories, 29 | Steps: []resource.TestStep{{ 30 | Config: ` 31 | resource "ko_build" "foo" { 32 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 33 | sbom = "spdx" 34 | } 35 | `, 36 | Check: resource.ComposeTestCheckFunc( 37 | resource.TestMatchResourceAttr("ko_build.foo", "image_ref", imageRefRE), 38 | ), 39 | }}, 40 | // TODO: add a test that there's no terraform diff if the image hasn't changed. 41 | // TODO: add a test that there's a terraform diff if the image has changed. 42 | // TODO: add a test covering what happens if the build fails for any reason. 43 | }) 44 | 45 | // This tests building an image and using it as a base image for another image. 46 | // Mostly just to prove we can. 47 | resource.Test(t, resource.TestCase{ 48 | ProviderFactories: providerFactories, 49 | Steps: []resource.TestStep{{ 50 | Config: ` 51 | resource "ko_build" "base" { 52 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 53 | } 54 | resource "ko_build" "top" { 55 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 56 | base_image = "${ko_build.base.image_ref}" 57 | } 58 | `, 59 | Check: resource.ComposeTestCheckFunc( 60 | resource.TestMatchResourceAttr("ko_build.top", "image_ref", imageRefRE), 61 | resource.TestMatchResourceAttr("ko_build.top", "base_image", imageRefRE), 62 | resource.TestMatchResourceAttr("ko_build.base", "image_ref", imageRefRE), 63 | // TODO(jason): Check that top's base_image attr matches base's image_ref exactly. 64 | ), 65 | }}, 66 | }) 67 | 68 | // Test that working_dir can be set. 69 | // TODO: Setting the importpath as "." means the image gets pushed as $KO_DOCKER_REPO exactly, 70 | // and we probably want to expand this to be the full resolved importpath of the package. 71 | resource.Test(t, resource.TestCase{ 72 | ProviderFactories: providerFactories, 73 | Steps: []resource.TestStep{{ 74 | Config: ` 75 | resource "ko_build" "foo" { 76 | importpath = "." 77 | working_dir = "../../cmd/test" 78 | } 79 | `, 80 | Check: resource.ComposeTestCheckFunc( 81 | resource.TestMatchResourceAttr("ko_build.foo", "image_ref", regexp.MustCompile("^"+url+"@sha256:")), 82 | // TODO(jason): Check that top's base_image attr matches base's image_ref exactly. 83 | ), 84 | }}, 85 | }) 86 | 87 | resource.Test(t, resource.TestCase{ 88 | ProviderFactories: providerFactories, 89 | Steps: []resource.TestStep{{ 90 | Config: ` 91 | resource "ko_build" "foo" { 92 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 93 | platforms = ["linux/amd64", "linux/arm64"] 94 | } 95 | `, 96 | Check: resource.ComposeTestCheckFunc( 97 | resource.TestMatchResourceAttr("ko_build.foo", "image_ref", imageRefRE), 98 | ), 99 | }}, 100 | }) 101 | 102 | resource.Test(t, resource.TestCase{ 103 | ProviderFactories: providerFactories, 104 | Steps: []resource.TestStep{{ 105 | Config: ` 106 | resource "ko_build" "foo" { 107 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 108 | platforms = ["all"] 109 | ldflags = ["-s", "-w"] 110 | } 111 | `, 112 | Check: resource.ComposeTestCheckFunc( 113 | resource.TestMatchResourceAttr("ko_build.foo", "image_ref", imageRefRE), 114 | ), 115 | }}, 116 | }) 117 | 118 | resource.Test(t, resource.TestCase{ 119 | ProviderFactories: providerFactories, 120 | Steps: []resource.TestStep{{ 121 | Config: ` 122 | resource "ko_build" "foo" { 123 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test-cgo" 124 | env = ["CGO_ENABLED=1"] 125 | } 126 | `, 127 | Check: resource.ComposeTestCheckFunc( 128 | resource.TestMatchResourceAttr("ko_build.foo", "image_ref", 129 | regexp.MustCompile("^"+url+"/github.com/ko-build/terraform-provider-ko/cmd/test-cgo@sha256:")), 130 | ), 131 | }}, 132 | }) 133 | 134 | for _, sbom := range []string{"spdx", "none"} { 135 | resource.Test(t, resource.TestCase{ 136 | ProviderFactories: providerFactories, 137 | Steps: []resource.TestStep{{ 138 | Config: fmt.Sprintf(` 139 | resource "ko_build" "foo" { 140 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 141 | sbom = %q 142 | } 143 | `, sbom), 144 | Check: resource.ComposeTestCheckFunc( 145 | resource.TestMatchResourceAttr("ko_build.foo", "image_ref", imageRefRE), 146 | ), 147 | }}, 148 | }) 149 | } 150 | 151 | t.Run("SOURCE_DATE_EPOCH", func(t *testing.T) { 152 | t.Setenv("SOURCE_DATE_EPOCH", "1234567890") 153 | resource.Test(t, resource.TestCase{ 154 | ProviderFactories: providerFactories, 155 | Steps: []resource.TestStep{{ 156 | Config: `resource "ko_build" "foo" { 157 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 158 | }`, 159 | Check: resource.ComposeTestCheckFunc( 160 | resource.TestMatchResourceAttr("ko_build.foo", "image_ref", imageRefRE), 161 | ), 162 | }}, 163 | }) 164 | }) 165 | t.Run("SOURCE_DATE_EPOCH_failure", func(t *testing.T) { 166 | t.Setenv("SOURCE_DATE_EPOCH", "abc123") 167 | resource.Test(t, resource.TestCase{ 168 | ProviderFactories: providerFactories, 169 | Steps: []resource.TestStep{{ 170 | Config: `resource "ko_build" "foo" { 171 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 172 | }`, 173 | ExpectError: regexp.MustCompile("should be the number of seconds since"), 174 | }}, 175 | }) 176 | }) 177 | 178 | t.Run("build fails during plan", func(t *testing.T) { 179 | res := `resource "ko_build" "foo" { importpath = "github.com/ko-build/terraform-provider-ko/cmd/not-found" }` 180 | 181 | resource.Test(t, resource.TestCase{ 182 | ProviderFactories: providerFactories, 183 | Steps: []resource.TestStep{{ 184 | // A failed build during plan should still show a diff, which will fail at create time. 185 | // This enables cases where an importpath changes, where the previous state is now invalid 186 | // and the ko build will fail; this should not block the create though, which should 187 | // succeed and update the state. 188 | PlanOnly: true, 189 | ExpectNonEmptyPlan: true, 190 | Config: res, 191 | }, { 192 | // The same failed build during create should fail with an error. 193 | Config: res, 194 | ExpectError: regexp.MustCompile(".*create doBuild.*no required module provides package.*"), 195 | }}, 196 | }) 197 | }) 198 | } 199 | 200 | func TestAccResourceKoBuild_Tags(t *testing.T) { 201 | type testCase struct { 202 | name string 203 | config string 204 | expectNamedTags []string 205 | } 206 | 207 | path := "github.com/ko-build/terraform-provider-ko/cmd/test" 208 | testCases := []testCase{ 209 | { 210 | name: "named_tags_foo_bar", 211 | config: ` 212 | resource "ko_build" "foo" { 213 | sbom = "none" 214 | importpath = "%s" 215 | tags = ["foo", "bar"] 216 | } 217 | `, 218 | expectNamedTags: []string{"foo", "bar"}, 219 | }, 220 | { 221 | name: "named_tags_v1.0.0_stable", 222 | config: ` 223 | resource "ko_build" "foo" { 224 | sbom = "none" 225 | importpath = "%s" 226 | tags = ["v1.0.0", "stable"] 227 | } 228 | `, 229 | expectNamedTags: []string{"v1.0.0", "stable"}, 230 | }, 231 | { 232 | name: "named_tags_multiple_including_latest", 233 | config: ` 234 | resource "ko_build" "foo" { 235 | sbom = "none" 236 | importpath = "%s" 237 | tags = ["v1.0.0", "stable", "latest", "production"] 238 | } 239 | `, 240 | expectNamedTags: []string{"v1.0.0", "stable", "latest", "production"}, 241 | }, 242 | { 243 | name: "named_tags_omit_default_latest", 244 | config: ` 245 | resource "ko_build" "foo" { 246 | sbom = "none" 247 | importpath = "%s" 248 | } 249 | `, 250 | expectNamedTags: []string{"latest"}, 251 | }, 252 | } 253 | 254 | var srv *httptest.Server 255 | for _, tc := range testCases { 256 | // Setup a local registry and have tests push to that. 257 | srv = httptest.NewServer(registry.New()) 258 | parts := strings.Split(srv.URL, ":") 259 | url := fmt.Sprintf("localhost:%s/test", parts[len(parts)-1]) 260 | t.Setenv("KO_DOCKER_REPO", url) 261 | 262 | imageRefRE := regexp.MustCompile("^" + url + fmt.Sprintf("/%s@sha256:", path)) 263 | 264 | t.Run(tc.name, func(t *testing.T) { 265 | resource.Test(t, resource.TestCase{ 266 | ProviderFactories: providerFactories, 267 | Steps: []resource.TestStep{{ 268 | Config: fmt.Sprintf(tc.config, path), 269 | Check: resource.ComposeTestCheckFunc( 270 | resource.TestMatchResourceAttr("ko_build.foo", "image_ref", imageRefRE), 271 | ), 272 | }}, 273 | }) 274 | tags, err := crane.ListTags(fmt.Sprintf("%s/%s", url, path), 275 | crane.WithTransport(srv.Client().Transport)) 276 | if err != nil { 277 | t.Fatalf("failed to list tags: %v", err) 278 | } 279 | if len(tags) != len(tc.expectNamedTags) { 280 | t.Fatalf("expected %d tags, got %d", len(tc.expectNamedTags), len(tags)) 281 | } 282 | slices.Sort(tc.expectNamedTags) 283 | slices.Sort(tags) 284 | if !slices.Equal(tc.expectNamedTags, tags) { 285 | t.Fatalf("expected tags %v, got %v", tc.expectNamedTags, tags) 286 | } 287 | }) 288 | 289 | srv.Close() 290 | } 291 | } 292 | 293 | func TestAccResourceKoBuild_ImageRepo(t *testing.T) { 294 | // Setup a local registry and have tests push to that. 295 | srv := httptest.NewServer(registry.New()) 296 | defer srv.Close() 297 | parts := strings.Split(srv.URL, ":") 298 | url := fmt.Sprintf("localhost:%s/test", parts[len(parts)-1]) 299 | t.Setenv("KO_DOCKER_REPO", url) 300 | 301 | // Test that the repo attribute of the ko_build resource is respected, and 302 | // the returned image_ref's repo is exactly the configured repo, without 303 | // the importpath appended. 304 | resource.Test(t, resource.TestCase{ 305 | ProviderFactories: providerFactories, 306 | Steps: []resource.TestStep{{ 307 | Config: fmt.Sprintf(` 308 | resource "ko_build" "foo" { 309 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 310 | repo = "%s/configured-in-resource" 311 | } 312 | `, url), 313 | Check: resource.ComposeTestCheckFunc( 314 | resource.TestMatchResourceAttr("ko_build.foo", "image_ref", regexp.MustCompile("^"+url+"/configured-in-resource@sha256:")), 315 | ), 316 | }}, 317 | }) 318 | } 319 | 320 | func TestAccResourceKoBuild_ProviderRepo(t *testing.T) { 321 | // Setup a local registry and have tests push to that. 322 | srv := httptest.NewServer(registry.New()) 323 | defer srv.Close() 324 | parts := strings.Split(srv.URL, ":") 325 | url := fmt.Sprintf("localhost:%s/test", parts[len(parts)-1]) 326 | t.Setenv("KO_DOCKER_REPO", url) 327 | 328 | var providerConfigured = map[string]func() (*schema.Provider, error){ 329 | "ko": func() (*schema.Provider, error) { //nolint: unparam 330 | p := New("dev")() 331 | p.Schema["repo"].Default = url + "/configured-in-provider" 332 | return p, nil 333 | }, 334 | } 335 | 336 | // Test that the repo attribute of the provider is respected, and overrides 337 | // the KO_DOCKER_REPO. 338 | // When configured in the provider, the importpath is appended to the image ref. 339 | resource.Test(t, resource.TestCase{ 340 | ProviderFactories: providerConfigured, 341 | Steps: []resource.TestStep{{ 342 | Config: ` 343 | resource "ko_build" "foo" { 344 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 345 | ldflags = ["-s", "-w"] 346 | } 347 | `, 348 | Check: resource.ComposeTestCheckFunc( 349 | resource.TestMatchResourceAttr("ko_build.foo", "image_ref", regexp.MustCompile("^"+url+"/configured-in-provider/github.com/ko-build/terraform-provider-ko/cmd/test@sha256:")), 350 | ), 351 | }}, 352 | }) 353 | } 354 | 355 | func TestAccResourceKoBuild_PlanNoPush(t *testing.T) { 356 | // Don't run a registry at this endpoint, we want to test that we don't push anything. 357 | t.Setenv("KO_DOCKER_REPO", "localhost:12345/test") 358 | 359 | // Test that the repo attribute of the provider is respected, and overrides 360 | // the KO_DOCKER_REPO. 361 | // When configured in the provider, the importpath is appended to the image ref. 362 | resource.Test(t, resource.TestCase{ 363 | ProviderFactories: providerFactories, 364 | Steps: []resource.TestStep{{ 365 | Config: ` 366 | resource "ko_build" "foo" { 367 | importpath = "github.com/ko-build/terraform-provider-ko/cmd/test" 368 | } 369 | `, 370 | PlanOnly: true, // Only plan, and expect a diff. 371 | ExpectNonEmptyPlan: true, 372 | Check: resource.ComposeTestCheckFunc( 373 | resource.TestMatchResourceAttr("ko_build.foo", "image_ref", regexp.MustCompile("^localhost:12345/github.com/ko-build/terraform-provider-ko/cmd/test@sha256:")), 374 | ), 375 | }}, 376 | }) 377 | } 378 | -------------------------------------------------------------------------------- /internal/provider/resource_ko_build.go: -------------------------------------------------------------------------------- 1 | package provider 2 | 3 | import ( 4 | "context" 5 | "errors" 6 | "fmt" 7 | "io" 8 | "os" 9 | "strconv" 10 | "sync" 11 | "time" 12 | 13 | "github.com/awslabs/amazon-ecr-credential-helper/ecr-login" 14 | "github.com/chrismellard/docker-credential-acr-env/pkg/credhelper" 15 | "github.com/google/go-containerregistry/pkg/authn" 16 | "github.com/google/go-containerregistry/pkg/authn/github" 17 | "github.com/google/go-containerregistry/pkg/name" 18 | v1 "github.com/google/go-containerregistry/pkg/v1" 19 | "github.com/google/go-containerregistry/pkg/v1/google" 20 | "github.com/google/go-containerregistry/pkg/v1/remote" 21 | "github.com/google/ko/pkg/build" 22 | "github.com/google/ko/pkg/commands/options" 23 | "github.com/google/ko/pkg/publish" 24 | "github.com/hashicorp/go-cty/cty" 25 | "github.com/hashicorp/terraform-plugin-sdk/v2/diag" 26 | "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" 27 | ) 28 | 29 | const ( 30 | version = "devel" 31 | userAgent = "terraform-provider-ko" 32 | ) 33 | 34 | var validTypes = map[string]struct{}{ 35 | "spdx": {}, 36 | "none": {}, 37 | } 38 | 39 | func resourceBuild() *schema.Resource { 40 | return &schema.Resource{ 41 | // This description is used by the documentation generator and the language server. 42 | Description: "Sample resource in the Terraform provider scaffolding.", 43 | 44 | CreateContext: resourceKoBuildCreate, 45 | ReadContext: resourceKoBuildRead, 46 | DeleteContext: resourceKoBuildDelete, 47 | 48 | SchemaVersion: 1, 49 | 50 | Schema: map[string]*schema.Schema{ 51 | "importpath": { 52 | Description: "import path to build", 53 | Type: schema.TypeString, 54 | Required: true, 55 | ValidateDiagFunc: func(_ interface{}, _ cty.Path) diag.Diagnostics { 56 | // TODO: validate stuff here. 57 | return nil 58 | }, 59 | ForceNew: true, // Any time this changes, don't try to update in-place, just create it. 60 | }, 61 | "working_dir": { 62 | Description: "working directory for the build", 63 | Optional: true, 64 | Default: ".", 65 | Type: schema.TypeString, 66 | ForceNew: true, // Any time this changes, don't try to update in-place, just create it. 67 | }, 68 | "platforms": { 69 | Description: "Which platform to use when pulling a multi-platform base. Format: all | [/[/]][,platform]*", 70 | Optional: true, 71 | Type: schema.TypeList, 72 | Elem: &schema.Schema{Type: schema.TypeString}, 73 | ForceNew: true, // Any time this changes, don't try to update in-place, just create it. 74 | }, 75 | "base_image": { 76 | Description: "base image to use", 77 | Default: "", 78 | Optional: true, 79 | Type: schema.TypeString, 80 | ForceNew: true, // Any time this changes, don't try to update in-place, just create it. 81 | }, 82 | "sbom": { 83 | Description: "The SBOM media type to use (none will disable SBOM synthesis and upload).", 84 | Default: "spdx", 85 | Optional: true, 86 | Type: schema.TypeString, 87 | ForceNew: true, // Any time this changes, don't try to update in-place, just create it. 88 | ValidateDiagFunc: func(data interface{}, _ cty.Path) diag.Diagnostics { 89 | v := data.(string) 90 | if _, found := validTypes[v]; !found { 91 | return diag.Errorf("Invalid sbom type: %q", v) 92 | } 93 | return nil 94 | }, 95 | }, 96 | "repo": { 97 | Description: "Container repository to publish images to. If set, this overrides the provider's `repo`, and the image name will be exactly the specified `repo`, without the importpath appended.", 98 | Default: "", 99 | Optional: true, 100 | Type: schema.TypeString, 101 | ForceNew: true, // Any time this changes, don't try to update in-place, just create it. 102 | }, 103 | "image_ref": { 104 | Description: "built image reference by digest", 105 | Type: schema.TypeString, 106 | Computed: true, 107 | }, 108 | "ldflags": { 109 | Description: "Extra ldflags to pass to the go build", 110 | Optional: true, 111 | Type: schema.TypeList, 112 | Elem: &schema.Schema{Type: schema.TypeString}, 113 | ForceNew: true, // Any time this changes, don't try to update in-place, just create it. 114 | }, 115 | "env": { 116 | Description: "Extra environment variables to pass to the go build", 117 | Optional: true, 118 | Type: schema.TypeList, 119 | Elem: &schema.Schema{Type: schema.TypeString}, 120 | ForceNew: true, // Any time this changes, don't try to update in-place, just create it. 121 | }, 122 | "tags": { 123 | Description: "Which tags to use for the produced image instead of the default 'latest' tag", 124 | Optional: true, 125 | Type: schema.TypeList, 126 | Elem: &schema.Schema{Type: schema.TypeString}, 127 | ForceNew: true, // Any time this changes, don't try to update in-place, just create it. 128 | }, 129 | "go_binary_path": { 130 | Description: "Path to the Go binary to use for builds (sets KO_GO_PATH)", 131 | Optional: true, 132 | Type: schema.TypeString, 133 | ForceNew: true, // Any time this changes, don't try to update in-place, just create it. 134 | }, 135 | }, 136 | } 137 | } 138 | 139 | type buildOptions struct { 140 | ip string 141 | workingDir string 142 | imageRepo string // The image's repo, either from the KO_DOCKER_REPO env var, or provider-configured dockerRepo/repo, or image resource's repo. 143 | platforms []string 144 | baseImage string 145 | sbom string 146 | auth *authn.Basic 147 | bare bool // If true, use the "bare" namer that doesn't append the importpath. 148 | ldflags []string // Extra ldflags to pass to the go build. 149 | env []string // Extra environment variables to pass to the go build. 150 | tags []string // Which tags to use for the produced image instead of the default 'latest' 151 | goBinaryPath string // Path to go binary (sets KO_GO_PATH) 152 | } 153 | 154 | var ( 155 | amazonKeychain authn.Keychain = authn.NewKeychainFromHelper(ecr.NewECRHelper(ecr.WithLogger(io.Discard))) 156 | azureKeychain authn.Keychain = authn.NewKeychainFromHelper(credhelper.NewACRCredentialsHelper()) 157 | keychain = authn.NewMultiKeychain( 158 | authn.DefaultKeychain, 159 | amazonKeychain, 160 | google.Keychain, 161 | github.Keychain, 162 | azureKeychain, 163 | ) 164 | ) 165 | 166 | func (o *buildOptions) makeBuilder(ctx context.Context) (*build.Caching, error) { 167 | // If goBinaryPath is set, set the KO_GO_PATH environment variable 168 | if o.goBinaryPath != "" { 169 | os.Setenv("KO_GO_PATH", o.goBinaryPath) 170 | } 171 | 172 | bo := []build.Option{ 173 | build.WithTrimpath(true), 174 | build.WithPlatforms(o.platforms...), 175 | build.WithConfig(map[string]build.Config{ 176 | o.ip: { 177 | Ldflags: o.ldflags, 178 | Env: o.env, 179 | }}), 180 | build.WithBaseImages(func(_ context.Context, _ string) (name.Reference, build.Result, error) { 181 | ref, err := name.ParseReference(o.baseImage) 182 | if err != nil { 183 | return nil, nil, err 184 | } 185 | 186 | if cached, found := baseImages.Load(o.baseImage); found { 187 | return ref, cached.(build.Result), nil 188 | } 189 | 190 | kc := keychain 191 | if o.auth != nil { 192 | kc = authn.NewMultiKeychain(staticKeychain{o.imageRepo, o.auth}, kc) 193 | } 194 | desc, err := remote.Get(ref, 195 | remote.WithAuthFromKeychain(kc), 196 | remote.WithUserAgent(userAgent), 197 | ) 198 | if err != nil { 199 | return nil, nil, err 200 | } 201 | if desc.MediaType.IsImage() { 202 | img, err := desc.Image() 203 | baseImages.Store(o.baseImage, img) 204 | return ref, img, err 205 | } 206 | if desc.MediaType.IsIndex() { 207 | idx, err := desc.ImageIndex() 208 | baseImages.Store(o.baseImage, idx) 209 | return ref, idx, err 210 | } 211 | return nil, nil, fmt.Errorf("unexpected base image media type: %s", desc.MediaType) 212 | }), 213 | } 214 | 215 | switch o.sbom { 216 | case "spdx": 217 | bo = append(bo, build.WithSPDX(version)) 218 | case "none": 219 | bo = append(bo, build.WithDisabledSBOM()) 220 | default: 221 | return nil, fmt.Errorf("unknown sbom type: %q", o.sbom) 222 | } 223 | 224 | // We read the environment variable directly here instead of plumbing it through as a provider option to keep the behavior consistent with resolve. 225 | // While CreationTime is a build.Option, it is not a field in options.BuildOptions and is inferred from the environment variable when a new resolver is created. 226 | if epoch := os.Getenv("SOURCE_DATE_EPOCH"); epoch != "" { 227 | s, err := strconv.ParseInt(epoch, 10, 64) 228 | if err != nil { 229 | return nil, fmt.Errorf("the environment variable %s should be the number of seconds since January 1st 1970, 00:00 UTC, got: %w", epoch, err) 230 | } 231 | bo = append(bo, build.WithCreationTime(v1.Time{Time: time.Unix(s, 0)})) 232 | } 233 | 234 | b, err := build.NewGo(ctx, o.workingDir, bo...) 235 | if err != nil { 236 | return nil, fmt.Errorf("NewGo: %w", err) 237 | } 238 | return build.NewCaching(b) 239 | } 240 | 241 | var baseImages sync.Map // Cache of base image lookups. 242 | 243 | // doBuild builds the image and returns the built image, and the full name.Reference by digest that the image would be pushed to. 244 | // 245 | // doBuild doesn't publish images, use doPublish to publish the build.Result that doBuild returns. 246 | func doBuild(ctx context.Context, opts buildOptions) (build.Result, string, error) { 247 | if opts.imageRepo == "" { 248 | return nil, "", errors.New("one of KO_DOCKER_REPO env var, or provider `repo`, or image resource `repo` must be set") 249 | } 250 | 251 | b, err := opts.makeBuilder(ctx) 252 | if err != nil { 253 | return nil, "", fmt.Errorf("NewGo: %w", err) 254 | } 255 | res, err := b.Build(ctx, opts.ip) 256 | if err != nil { 257 | return nil, "", fmt.Errorf("build: %w", err) 258 | } 259 | dig, err := res.Digest() 260 | if err != nil { 261 | return nil, "", fmt.Errorf("digest: %w", err) 262 | } 263 | ref, err := name.ParseReference(namer(opts)(opts.imageRepo, opts.ip)) 264 | if err != nil { 265 | return nil, "", fmt.Errorf("ParseReference: %w", err) 266 | } 267 | 268 | return res, ref.Context().Digest(dig.String()).String(), nil 269 | } 270 | 271 | func namer(opts buildOptions) publish.Namer { 272 | return options.MakeNamer(&options.PublishOptions{ 273 | DockerRepo: opts.imageRepo, 274 | Bare: opts.bare, 275 | PreserveImportPaths: !opts.bare, 276 | Tags: opts.tags, 277 | }) 278 | } 279 | 280 | func doPublish(ctx context.Context, r build.Result, opts buildOptions) (string, error) { 281 | kc := keychain 282 | if opts.auth != nil { 283 | kc = authn.NewMultiKeychain(staticKeychain{opts.imageRepo, opts.auth}, kc) 284 | } 285 | 286 | po := []publish.Option{ 287 | publish.WithAuthFromKeychain(kc), 288 | publish.WithNamer(namer(opts)), 289 | publish.WithUserAgent(userAgent), 290 | } 291 | 292 | if len(opts.tags) > 0 { 293 | po = append(po, publish.WithTags(opts.tags)) 294 | } 295 | 296 | p, err := publish.NewDefault(opts.imageRepo, po...) 297 | if err != nil { 298 | return "", fmt.Errorf("NewDefault: %w", err) 299 | } 300 | ref, err := p.Publish(ctx, r, opts.ip) 301 | if err != nil { 302 | return "", fmt.Errorf("publish: %w", err) 303 | } 304 | return ref.String(), nil 305 | } 306 | 307 | func fromData(d *schema.ResourceData, po *Opts) buildOptions { 308 | // Use the repo configured in the ko_build resource, if set. 309 | // Otherwise, fallback to the provider-configured repo. 310 | // If the ko_build resource configured the repo, use bare image naming. 311 | repo := po.po.DockerRepo 312 | bare := false 313 | if r := d.Get("repo").(string); r != "" { 314 | repo = r 315 | bare = true 316 | } 317 | 318 | return buildOptions{ 319 | ip: d.Get("importpath").(string), 320 | workingDir: d.Get("working_dir").(string), 321 | imageRepo: repo, 322 | platforms: defaultPlatform(toStringSlice(d.Get("platforms").([]interface{}))), 323 | baseImage: getString(d, "base_image", po.bo.BaseImage), 324 | sbom: d.Get("sbom").(string), 325 | auth: po.auth, 326 | bare: bare, 327 | ldflags: toStringSlice(d.Get("ldflags").([]interface{})), 328 | env: toStringSlice(d.Get("env").([]interface{})), 329 | tags: toStringSlice(d.Get("tags").([]interface{})), 330 | goBinaryPath: getString(d, "go_binary_path", ""), 331 | } 332 | } 333 | 334 | func getString(d *schema.ResourceData, key string, defaultVal string) string { 335 | if v, ok := d.Get(key).(string); ok && v != "" { 336 | return v 337 | } 338 | return defaultVal 339 | } 340 | 341 | func defaultPlatform(in []string) []string { 342 | if len(in) == 0 { 343 | return []string{"linux/amd64"} 344 | } 345 | return in 346 | } 347 | 348 | func toStringSlice(in []interface{}) []string { 349 | out := make([]string, len(in)) 350 | for i, ii := range in { 351 | if s, ok := ii.(string); ok { 352 | out[i] = s 353 | } else { 354 | panic(fmt.Errorf("expected string, got %T", ii)) 355 | } 356 | } 357 | return out 358 | } 359 | 360 | func resourceKoBuildCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { 361 | po, err := NewProviderOpts(meta) 362 | if err != nil { 363 | return diag.Errorf("configuring provider: %v", err) 364 | } 365 | 366 | res, _, err := doBuild(ctx, fromData(d, po)) 367 | if err != nil { 368 | return diag.Errorf("[id=%s] create doBuild: %v", d.Id(), err) 369 | } 370 | ref, err := doPublish(ctx, res, fromData(d, po)) 371 | if err != nil { 372 | return diag.Errorf("[id=%s] create doPublish: %v", d.Id(), err) 373 | } 374 | 375 | _ = d.Set("image_ref", ref) 376 | d.SetId(ref) 377 | return nil 378 | } 379 | 380 | const zeroRef = "example.com/zero@sha256:0000000000000000000000000000000000000000000000000000000000000000" 381 | 382 | func resourceKoBuildRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { 383 | po, err := NewProviderOpts(meta) 384 | if err != nil { 385 | return diag.Errorf("configuring provider: %v", err) 386 | } 387 | 388 | var diags diag.Diagnostics 389 | _, ref, err := doBuild(ctx, fromData(d, po)) 390 | if err != nil { 391 | ref = zeroRef 392 | diags = append(diags, diag.Diagnostic{ 393 | Severity: diag.Warning, 394 | Summary: "Image build failed to read -- create may fail.", 395 | Detail: fmt.Sprintf("failed to read image: %v", err), 396 | }) 397 | } 398 | 399 | _ = d.Set("image_ref", ref) 400 | if ref != d.Id() || ref == zeroRef { 401 | d.SetId("") // triggers create on next apply. 402 | } else { 403 | d.SetId(ref) 404 | } 405 | return diags 406 | } 407 | 408 | func resourceKoBuildDelete(_ context.Context, _ *schema.ResourceData, _ interface{}) diag.Diagnostics { 409 | // TODO: If we ever want to delete the image from the registry, we can do it here. 410 | return nil 411 | } 412 | 413 | type staticKeychain struct { 414 | repo string 415 | b *authn.Basic 416 | } 417 | 418 | func (k staticKeychain) Resolve(r authn.Resource) (authn.Authenticator, error) { 419 | ref, err := name.ParseReference(k.repo) 420 | if err != nil { 421 | return nil, err 422 | } 423 | if r.RegistryStr() == ref.Context().RegistryStr() { 424 | return staticAuthenticator{k.b}, nil 425 | } 426 | return authn.Anonymous, nil 427 | } 428 | 429 | type staticAuthenticator struct{ b *authn.Basic } 430 | 431 | func (a staticAuthenticator) Authorization() (*authn.AuthConfig, error) { 432 | return &authn.AuthConfig{ 433 | Username: a.b.Username, 434 | Password: a.b.Password, 435 | }, nil 436 | } 437 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | al.essio.dev/pkg/shellescape v1.6.0 h1:NxFcEqzFSEVCGN2yq7Huv/9hyCEGVa/TncnOOBBeXHA= 2 | al.essio.dev/pkg/shellescape v1.6.0/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= 3 | cloud.google.com/go v0.118.3 h1:jsypSnrE/w4mJysioGdMBg4MiW/hHx/sArFpaBWHdME= 4 | cloud.google.com/go v0.118.3/go.mod h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc= 5 | cloud.google.com/go/auth v0.15.0 h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps= 6 | cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= 7 | cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= 8 | cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= 9 | cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= 10 | cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= 11 | cloud.google.com/go/iam v1.4.1 h1:cFC25Nv+u5BkTR/BT1tXdoF2daiVbZ1RLx2eqfQ9RMM= 12 | cloud.google.com/go/iam v1.4.1/go.mod h1:2vUEJpUG3Q9p2UdsyksaKpDzlwOrnMzS30isdReIcLM= 13 | cloud.google.com/go/kms v1.21.1 h1:r1Auo+jlfJSf8B7mUnVw5K0fI7jWyoUy65bV53VjKyk= 14 | cloud.google.com/go/kms v1.21.1/go.mod h1:s0wCyByc9LjTdCjG88toVs70U9W+cc6RKFc8zAqX7nE= 15 | cloud.google.com/go/longrunning v0.6.5 h1:sD+t8DO8j4HKW4QfouCklg7ZC1qC4uzVZt8iz3uTW+Q= 16 | cloud.google.com/go/longrunning v0.6.5/go.mod h1:Et04XK+0TTLKa5IPYryKf5DkpwImy6TluQ1QTLwlKmY= 17 | dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= 18 | dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= 19 | filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= 20 | filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= 21 | github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d h1:zjqpY4C7H15HjRPEenkS4SAn3Jy2eRRjkjZbGR30TOg= 22 | github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d/go.mod h1:XNqJ7hv2kY++g8XEHREpi+JqZo3+0l+CH2egBVN4yqM= 23 | github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= 24 | github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= 25 | github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 h1:DSDNVxqkoXJiko6x8a90zidoYqnYYa6c1MTzDKzKkTo= 26 | github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1/go.mod h1:zGqV2R4Cr/k8Uye5w+dgQ06WJtEcbQG/8J7BB6hnCr4= 27 | github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys= 28 | github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= 29 | github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= 30 | github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= 31 | github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.3.1 h1:Wgf5rZba3YZqeTNJPtvqZoBu1sBN/L4sry+u2U3Y75w= 32 | github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.3.1/go.mod h1:xxCBG/f/4Vbmh2XQJBsOmNdxWUY5j/s27jujKPbQf14= 33 | github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.1.1 h1:bFWuoEKg+gImo7pvkiQEFAc8ocibADgXeiLAxWhWmkI= 34 | github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.1.1/go.mod h1:Vih/3yc6yac2JzU4hzpaDupBJP0Flaia9rXXrU8xyww= 35 | github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= 36 | github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= 37 | github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= 38 | github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= 39 | github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA= 40 | github.com/Azure/go-autorest/autorest v0.11.30 h1:iaZ1RGz/ALZtN5eq4Nr1SOFSlf2E4pDI3Tcsl+dZPVE= 41 | github.com/Azure/go-autorest/autorest v0.11.30/go.mod h1:t1kpPIOpIVX7annvothKvb0stsrXa37i7b+xpmBW8Fs= 42 | github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= 43 | github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= 44 | github.com/Azure/go-autorest/autorest/adal v0.9.24 h1:BHZfgGsGwdkHDyZdtQRQk1WeUdW0m2WPAwuHZwUi5i4= 45 | github.com/Azure/go-autorest/autorest/adal v0.9.24/go.mod h1:7T1+g0PYFmACYW5LlG2fcoPiPlFHjClyRGL7dRlP5c8= 46 | github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 h1:Ov8avRZi2vmrE2JcXw+tu5K/yB41r7xK9GZDiBF7NdM= 47 | github.com/Azure/go-autorest/autorest/azure/auth v0.5.13/go.mod h1:5BAVfWLWXihP47vYrPuBKKf4cS0bXI+KM9Qx6ETDJYo= 48 | github.com/Azure/go-autorest/autorest/azure/cli v0.4.6/go.mod h1:piCfgPho7BiIDdEQ1+g4VmKyD5y+p/XtSNqE6Hc4QD0= 49 | github.com/Azure/go-autorest/autorest/azure/cli v0.4.7 h1:Q9R3utmFg9K1B4OYtAZ7ZUUvIUdzQt7G2MN5Hi/d670= 50 | github.com/Azure/go-autorest/autorest/azure/cli v0.4.7/go.mod h1:bVrAueELJ0CKLBpUHDIvD516TwmHmzqwCpvONWRsw3s= 51 | github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= 52 | github.com/Azure/go-autorest/autorest/date v0.3.1 h1:o9Z8Jyt+VJJTCZ/UORishuHOusBwolhjokt9s5k8I4w= 53 | github.com/Azure/go-autorest/autorest/date v0.3.1/go.mod h1:Dz/RDmXlfiFFS/eW+b/xMUSFs1tboPVy6UjgADToWDM= 54 | github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= 55 | github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= 56 | github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= 57 | github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= 58 | github.com/Azure/go-autorest/logger v0.2.2 h1:hYqBsEBywrrOSW24kkOCXRcKfKhK76OzLTfF+MYDE2o= 59 | github.com/Azure/go-autorest/logger v0.2.2/go.mod h1:I5fg9K52o+iuydlWfa9T5K6WFos9XYr9dYTFzpqgibw= 60 | github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= 61 | github.com/Azure/go-autorest/tracing v0.6.1 h1:YUMSrC/CeD1ZnnXcNYU4a/fzsO35u2Fsful9L/2nyR0= 62 | github.com/Azure/go-autorest/tracing v0.6.1/go.mod h1:/3EgjbsjraOqiicERAeu3m7/z0x1TzjQGAwDrJrXGkc= 63 | github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 h1:H5xDQaE3XowWfhZRUpnfC+rGZMEVoSiji+b+/HFAPU4= 64 | github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= 65 | github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= 66 | github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= 67 | github.com/Kunde21/markdownfmt/v3 v3.1.0 h1:KiZu9LKs+wFFBQKhrZJrFZwtLnCCWJahL+S+E/3VnM0= 68 | github.com/Kunde21/markdownfmt/v3 v3.1.0/go.mod h1:tPXN1RTyOzJwhfHoon9wUr4HGYmWgVxSQN6VBJDkrVc= 69 | github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= 70 | github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= 71 | github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= 72 | github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= 73 | github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= 74 | github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= 75 | github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= 76 | github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= 77 | github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw= 78 | github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= 79 | github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= 80 | github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= 81 | github.com/alessio/shellescape v1.4.2 h1:MHPfaU+ddJ0/bYWpgIeUnQUqKrlJ1S7BfEYPM4uEoM0= 82 | github.com/alessio/shellescape v1.4.2/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= 83 | github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec= 84 | github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= 85 | github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= 86 | github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= 87 | github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 88 | github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= 89 | github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= 90 | github.com/aws/aws-lambda-go v1.51.0 h1:/THH60NjiAs3K5TWet3Gx5w8MdR7oPOQH9utaKYY1JQ= 91 | github.com/aws/aws-lambda-go v1.51.0/go.mod h1:dpMpZgvWx5vuQJfBt0zqBha60q7Dd7RfgJv23DymV8A= 92 | github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= 93 | github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= 94 | github.com/aws/aws-sdk-go-v2 v1.36.5 h1:0OF9RiEMEdDdZEMqF9MRjevyxAQcf6gY+E7vwBILFj0= 95 | github.com/aws/aws-sdk-go-v2 v1.36.5/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= 96 | github.com/aws/aws-sdk-go-v2/config v1.29.17 h1:jSuiQ5jEe4SAMH6lLRMY9OVC+TqJLP5655pBGjmnjr0= 97 | github.com/aws/aws-sdk-go-v2/config v1.29.17/go.mod h1:9P4wwACpbeXs9Pm9w1QTh6BwWwJjwYvJ1iCt5QbCXh8= 98 | github.com/aws/aws-sdk-go-v2/credentials v1.17.70 h1:ONnH5CM16RTXRkS8Z1qg7/s2eDOhHhaXVd72mmyv4/0= 99 | github.com/aws/aws-sdk-go-v2/credentials v1.17.70/go.mod h1:M+lWhhmomVGgtuPOhO85u4pEa3SmssPTdcYpP/5J/xc= 100 | github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 h1:KAXP9JSHO1vKGCr5f4O6WmlVKLFFXgWYAGoJosorxzU= 101 | github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32/go.mod h1:h4Sg6FQdexC1yYG9RDnOvLbW1a/P986++/Y/a+GyEM8= 102 | github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 h1:SsytQyTMHMDPspp+spo7XwXTP44aJZZAC7fBV2C5+5s= 103 | github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36/go.mod h1:Q1lnJArKRXkenyog6+Y+zr7WDpk4e6XlR6gs20bbeNo= 104 | github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 h1:i2vNHQiXUvKhs3quBR6aqlgJaiaexz/aNvdCktW/kAM= 105 | github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36/go.mod h1:UdyGa7Q91id/sdyHPwth+043HhmP6yP9MBHgbZM0xo8= 106 | github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= 107 | github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= 108 | github.com/aws/aws-sdk-go-v2/service/ecr v1.45.1 h1:Bwzh202Aq7/MYnAjXA9VawCf6u+hjwMdoYmZ4HYsdf8= 109 | github.com/aws/aws-sdk-go-v2/service/ecr v1.45.1/go.mod h1:xZzWl9AXYa6zsLLH41HBFW8KRKJRIzlGmvSM0mVMIX4= 110 | github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.33.2 h1:XJ/AEFYj9VFPJdF+VFi4SUPEDfz1akHwxxm07JfZJcs= 111 | github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.33.2/go.mod h1:JUBHdhvKbbKmhaHjLsKJAWnQL80T6nURmhB/LEprV+4= 112 | github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc= 113 | github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ= 114 | github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 h1:t0E6FzREdtCsiLIoLCWsYliNsRBgyGD/MCK571qk4MI= 115 | github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17/go.mod h1:ygpklyoaypuyDvOM5ujWGrYWpAK3h7ugnmKCU/76Ys4= 116 | github.com/aws/aws-sdk-go-v2/service/kms v1.38.1 h1:tecq7+mAav5byF+Mr+iONJnCBf4B4gon8RSp4BrweSc= 117 | github.com/aws/aws-sdk-go-v2/service/kms v1.38.1/go.mod h1:cQn6tAF77Di6m4huxovNM7NVAozWTZLsDRp9t8Z/WYk= 118 | github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 h1:AIRJ3lfb2w/1/8wOOSqYb9fUKGwQbtysJ2H1MofRUPg= 119 | github.com/aws/aws-sdk-go-v2/service/sso v1.25.5/go.mod h1:b7SiVprpU+iGazDUqvRSLf5XmCdn+JtT1on7uNL6Ipc= 120 | github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 h1:BpOxT3yhLwSJ77qIY3DoHAQjZsc4HEGfMCE4NGy3uFg= 121 | github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3/go.mod h1:vq/GQR1gOFLquZMSrxUK/cpvKCNVYibNyJ1m7JrU88E= 122 | github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 h1:NFOJ/NXEGV4Rq//71Hs1jC/NvPs1ezajK+yQmkwnPV0= 123 | github.com/aws/aws-sdk-go-v2/service/sts v1.34.0/go.mod h1:7ph2tGpfQvwzgistp2+zga9f+bCjlQJPkPUmMgDSD7w= 124 | github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= 125 | github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= 126 | github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.10.1 h1:6lMw4/QGLFPvbKQ0eri/9Oh3YX5Nm6BPrUlZR8yuJHg= 127 | github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.10.1/go.mod h1:EVJOSYOVeoD3VFFZ/dWCAzWJp5wZr9lTOCjW8ejAmO0= 128 | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 129 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 130 | github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= 131 | github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= 132 | github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= 133 | github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= 134 | github.com/bmatcuk/doublestar/v4 v4.8.1 h1:54Bopc5c2cAvhLRAzqOGCYHYyhcDHsFF4wWIR5wKP38= 135 | github.com/bmatcuk/doublestar/v4 v4.8.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= 136 | github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= 137 | github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= 138 | github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= 139 | github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= 140 | github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= 141 | github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 142 | github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 h1:krfRl01rzPzxSxyLyrChD+U+MzsBXbm0OwYYB67uF+4= 143 | github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589/go.mod h1:OuDyvmLnMCwa2ep4Jkm6nyA0ocJuZlGyk2gGseVzERM= 144 | github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= 145 | github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= 146 | github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= 147 | github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= 148 | github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= 149 | github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= 150 | github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= 151 | github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= 152 | github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= 153 | github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= 154 | github.com/containerd/stargz-snapshotter/estargz v0.18.1 h1:cy2/lpgBXDA3cDKSyEfNOFMA/c10O1axL69EU7iirO8= 155 | github.com/containerd/stargz-snapshotter/estargz v0.18.1/go.mod h1:ALIEqa7B6oVDsrF37GkGN20SuvG/pIMm7FwP7ZmRb0Q= 156 | github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= 157 | github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q= 158 | github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= 159 | github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= 160 | github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= 161 | github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0= 162 | github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8= 163 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 164 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 165 | github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= 166 | github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 167 | github.com/digitorus/pkcs7 v0.0.0-20230713084857-e76b763bdc49/go.mod h1:SKVExuS+vpu2l9IoOc0RwqE7NYnb0JlcFHFnEJkVDzc= 168 | github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 h1:ge14PCmCvPjpMQMIAH7uKg0lrtNSOdpYsRXlwk3QbaE= 169 | github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352/go.mod h1:SKVExuS+vpu2l9IoOc0RwqE7NYnb0JlcFHFnEJkVDzc= 170 | github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 h1:lxmTCgmHE1GUYL7P0MlNa00M67axePTq+9nBSGddR8I= 171 | github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7/go.mod h1:GvWntX9qiTlOud0WkQ6ewFm0LPy5JUR1Xo0Ngbd1w6Y= 172 | github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= 173 | github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= 174 | github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= 175 | github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= 176 | github.com/docker/cli v29.0.3+incompatible h1:8J+PZIcF2xLd6h5sHPsp5pvvJA+Sr2wGQxHkRl53a1E= 177 | github.com/docker/cli v29.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= 178 | github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= 179 | github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= 180 | github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= 181 | github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= 182 | github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= 183 | github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= 184 | github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= 185 | github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= 186 | github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= 187 | github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= 188 | github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= 189 | github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= 190 | github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= 191 | github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= 192 | github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= 193 | github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= 194 | github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= 195 | github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= 196 | github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= 197 | github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= 198 | github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= 199 | github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= 200 | github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= 201 | github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= 202 | github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= 203 | github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= 204 | github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= 205 | github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= 206 | github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= 207 | github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= 208 | github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= 209 | github.com/go-git/go-git/v5 v5.14.0 h1:/MD3lCrGjCen5WfEAzKg00MJJffKhC8gzS80ycmCi60= 210 | github.com/go-git/go-git/v5 v5.14.0/go.mod h1:Z5Xhoia5PcWA3NF8vRLURn9E5FRhSl7dGj9ItW3Wk5k= 211 | github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= 212 | github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= 213 | github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 214 | github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= 215 | github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 216 | github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= 217 | github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 218 | github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= 219 | github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= 220 | github.com/go-openapi/errors v0.22.1 h1:kslMRRnK7NCb/CvR1q1VWuEQCEIsBGn5GgKD9e+HYhU= 221 | github.com/go-openapi/errors v0.22.1/go.mod h1:+n/5UdIqdVnLIJ6Q9Se8HNGUXYaY6CN8ImWzfi/Gzp0= 222 | github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= 223 | github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= 224 | github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= 225 | github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= 226 | github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= 227 | github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= 228 | github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ= 229 | github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc= 230 | github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= 231 | github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= 232 | github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= 233 | github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= 234 | github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= 235 | github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= 236 | github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= 237 | github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= 238 | github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= 239 | github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= 240 | github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= 241 | github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= 242 | github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= 243 | github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= 244 | github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= 245 | github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 246 | github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= 247 | github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= 248 | github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= 249 | github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= 250 | github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= 251 | github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= 252 | github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= 253 | github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= 254 | github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= 255 | github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 256 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 257 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 258 | github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= 259 | github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= 260 | github.com/google/certificate-transparency-go v1.3.1 h1:akbcTfQg0iZlANZLn0L9xOeWtyCIdeoYhKrqi5iH3Go= 261 | github.com/google/certificate-transparency-go v1.3.1/go.mod h1:gg+UQlx6caKEDQ9EElFOujyxEQEfOiQzAt6782Bvi8k= 262 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 263 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 264 | github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 265 | github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= 266 | github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= 267 | github.com/google/go-containerregistry v0.20.7 h1:24VGNpS0IwrOZ2ms2P1QE3Xa5X9p4phx0aUgzYzHW6I= 268 | github.com/google/go-containerregistry v0.20.7/go.mod h1:Lx5LCZQjLH1QBaMPeGwsME9biPeo1lPx6lbGj/UmzgM= 269 | github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= 270 | github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 271 | github.com/google/ko v0.18.0 h1:jkF5Fkvm+SMtqTt/SMzsCJO+6hz7FSDE6GRldGn0VVI= 272 | github.com/google/ko v0.18.0/go.mod h1:iR0zT5aR4pINW9tk2Ujj99dBJ7cVy4to9ZirAkGKb9g= 273 | github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= 274 | github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= 275 | github.com/google/safetext v0.0.0-20240722112252-5a72de7e7962 h1:+9C/TgFfcCmZBV7Fjb3kQCGlkpFrhtvFDgbdQHB9RaA= 276 | github.com/google/safetext v0.0.0-20240722112252-5a72de7e7962/go.mod h1:H3K1Iu/utuCfa10JO+GsmKUYSWi7ug57Rk6GaDRHaaQ= 277 | github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= 278 | github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= 279 | github.com/google/tink/go v1.7.0 h1:6Eox8zONGebBFcCBqkVmt60LaWZa6xg1cl/DwAh/J1w= 280 | github.com/google/tink/go v1.7.0/go.mod h1:GAUOd+QE3pgj9q8VKIGTCP33c/B7eb4NhxLcgTJZStM= 281 | github.com/google/trillian v1.7.1 h1:+zX8jLM3524bAMPS+VxaDIDgsMv3/ty6DuLWerHXcek= 282 | github.com/google/trillian v1.7.1/go.mod h1:E1UMAHqpZCA8AQdrKdWmHmtUfSeiD0sDWD1cv00Xa+c= 283 | github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 284 | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 285 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 286 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 287 | github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= 288 | github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= 289 | github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= 290 | github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= 291 | github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= 292 | github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= 293 | github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= 294 | github.com/hashicorp/cli v1.1.7 h1:/fZJ+hNdwfTSfsxMBa9WWMlfjUZbX8/LnUxgAd7lCVU= 295 | github.com/hashicorp/cli v1.1.7/go.mod h1:e6Mfpga9OCT1vqzFuoGZiiF/KaG9CbUfO5s3ghU3YgU= 296 | github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 297 | github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= 298 | github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 299 | github.com/hashicorp/go-checkpoint v0.5.0 h1:MFYpPZCnQqQTE18jFwSII6eUQrD/oxMFp3mlgcqk5mU= 300 | github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg= 301 | github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 302 | github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= 303 | github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= 304 | github.com/hashicorp/go-cty v1.5.0 h1:EkQ/v+dDNUqnuVpmS5fPqyY71NXVgT5gf32+57xY8g0= 305 | github.com/hashicorp/go-cty v1.5.0/go.mod h1:lFUCG5kd8exDobgSfyj4ONE/dc822kiYMguVKdHGMLM= 306 | github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= 307 | github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= 308 | github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= 309 | github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= 310 | github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= 311 | github.com/hashicorp/go-plugin v1.7.0 h1:YghfQH/0QmPNc/AZMTFE3ac8fipZyZECHdDPshfk+mA= 312 | github.com/hashicorp/go-plugin v1.7.0/go.mod h1:BExt6KEaIYx804z8k4gRzRLEvxKVb+kn0NMcihqOqb8= 313 | github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= 314 | github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= 315 | github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= 316 | github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= 317 | github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 h1:UpiO20jno/eV1eVZcxqWnUohyKRe1g8FPV/xH1s/2qs= 318 | github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= 319 | github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= 320 | github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= 321 | github.com/hashicorp/go-sockaddr v1.0.5 h1:dvk7TIXCZpmfOlM+9mlcrWmWjw/wlKT+VDq2wMvfPJU= 322 | github.com/hashicorp/go-sockaddr v1.0.5/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= 323 | github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 324 | github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= 325 | github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 326 | github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= 327 | github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 328 | github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= 329 | github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= 330 | github.com/hashicorp/hc-install v0.9.2 h1:v80EtNX4fCVHqzL9Lg/2xkp62bbvQMnvPQ0G+OmtO24= 331 | github.com/hashicorp/hc-install v0.9.2/go.mod h1:XUqBQNnuT4RsxoxiM9ZaUk0NX8hi2h+Lb6/c0OZnC/I= 332 | github.com/hashicorp/hcl v1.0.1-vault-7 h1:ag5OxFVy3QYTFTJODRzTKVZ6xvdfLLCA1cy/Y6xGI0I= 333 | github.com/hashicorp/hcl v1.0.1-vault-7/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= 334 | github.com/hashicorp/hcl/v2 v2.24.0 h1:2QJdZ454DSsYGoaE6QheQZjtKZSUs9Nh2izTWiwQxvE= 335 | github.com/hashicorp/hcl/v2 v2.24.0/go.mod h1:oGoO1FIQYfn/AgyOhlg9qLC6/nOJPX3qGbkZpYAcqfM= 336 | github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= 337 | github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= 338 | github.com/hashicorp/terraform-exec v0.23.1 h1:diK5NSSDXDKqHEOIQefBMu9ny+FhzwlwV0xgUTB7VTo= 339 | github.com/hashicorp/terraform-exec v0.23.1/go.mod h1:e4ZEg9BJDRaSalGm2z8vvrPONt0XWG0/tXpmzYTf+dM= 340 | github.com/hashicorp/terraform-json v0.27.1 h1:zWhEracxJW6lcjt/JvximOYyc12pS/gaKSy/wzzE7nY= 341 | github.com/hashicorp/terraform-json v0.27.1/go.mod h1:GzPLJ1PLdUG5xL6xn1OXWIjteQRT2CNT9o/6A9mi9hE= 342 | github.com/hashicorp/terraform-plugin-docs v0.21.0 h1:yoyA/Y719z9WdFJAhpUkI1jRbKP/nteVNBaI3hW7iQ8= 343 | github.com/hashicorp/terraform-plugin-docs v0.21.0/go.mod h1:J4Wott1J2XBKZPp/NkQv7LMShJYOcrqhQ2myXBcu64s= 344 | github.com/hashicorp/terraform-plugin-go v0.29.0 h1:1nXKl/nSpaYIUBU1IG/EsDOX0vv+9JxAltQyDMpq5mU= 345 | github.com/hashicorp/terraform-plugin-go v0.29.0/go.mod h1:vYZbIyvxyy0FWSmDHChCqKvI40cFTDGSb3D8D70i9GM= 346 | github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0= 347 | github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow= 348 | github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1 h1:mlAq/OrMlg04IuJT7NpefI1wwtdpWudnEmjuQs04t/4= 349 | github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1/go.mod h1:GQhpKVvvuwzD79e8/NZ+xzj+ZpWovdPAe8nfV/skwNU= 350 | github.com/hashicorp/terraform-registry-address v0.4.0 h1:S1yCGomj30Sao4l5BMPjTGZmCNzuv7/GDTDX99E9gTk= 351 | github.com/hashicorp/terraform-registry-address v0.4.0/go.mod h1:LRS1Ay0+mAiRkUyltGT+UHWkIqTFvigGn/LbMshfflE= 352 | github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ= 353 | github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc= 354 | github.com/hashicorp/vault/api v1.16.0 h1:nbEYGJiAPGzT9U4oWgaaB0g+Rj8E59QuHKyA5LhwQN4= 355 | github.com/hashicorp/vault/api v1.16.0/go.mod h1:KhuUhzOD8lDSk29AtzNjgAu2kxRA9jL9NAbkFlqvkBA= 356 | github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= 357 | github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= 358 | github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef h1:A9HsByNhogrvm9cWb28sjiS3i7tcKCkflWFEkHfuAgM= 359 | github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= 360 | github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= 361 | github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= 362 | github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= 363 | github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= 364 | github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= 365 | github.com/in-toto/attestation v1.1.1 h1:QD3d+oATQ0dFsWoNh5oT0udQ3tUrOsZZ0Fc3tSgWbzI= 366 | github.com/in-toto/attestation v1.1.1/go.mod h1:Dcq1zVwA2V7Qin8I7rgOi+i837wEf/mOZwRm047Sjys= 367 | github.com/in-toto/in-toto-golang v0.9.0 h1:tHny7ac4KgtsfrG6ybU8gVOZux2H8jN05AXJ9EBM1XU= 368 | github.com/in-toto/in-toto-golang v0.9.0/go.mod h1:xsBVrVsHNsB61++S6Dy2vWosKhuA3lUTQd+eF9HdeMo= 369 | github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= 370 | github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= 371 | github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 h1:Dj0L5fhJ9F82ZJyVOmBx6msDp/kfd1t9GRfny/mfJA0= 372 | github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds= 373 | github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= 374 | github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= 375 | github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= 376 | github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= 377 | github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI= 378 | github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= 379 | github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= 380 | github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= 381 | github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= 382 | github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= 383 | github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7 h1:FWpSWRD8FbVkKQu8M1DM9jF5oXFLyE+XpisIYfdzbic= 384 | github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7/go.mod h1:BMxO138bOokdgt4UaxZiEfypcSHX0t6SIFimVP1oRfk= 385 | github.com/jellydator/ttlcache/v3 v3.3.0 h1:BdoC9cE81qXfrxeb9eoJi9dWrdhSuwXMAnHTbnBm4Wc= 386 | github.com/jellydator/ttlcache/v3 v3.3.0/go.mod h1:bj2/e0l4jRnQdrnSTaGTsh4GSXvMjQcy41i7th0GVGw= 387 | github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94= 388 | github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8= 389 | github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY= 390 | github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= 391 | github.com/jmhodges/clock v1.2.0 h1:eq4kys+NI0PLngzaHEe7AmPT90XMGIEySD1JfV1PDIs= 392 | github.com/jmhodges/clock v1.2.0/go.mod h1:qKjhA7x7u/lQpPB1XAqX1b1lCI/w3/fNuYpI/ZjLynI= 393 | github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= 394 | github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= 395 | github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= 396 | github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= 397 | github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= 398 | github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= 399 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 400 | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= 401 | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 402 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 403 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 404 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 405 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 406 | github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= 407 | github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= 408 | github.com/letsencrypt/boulder v0.0.0-20250411005613-d800055fe666 h1:ndfLOJNaxu0fX358UKxtq2bU8IMASWi87Hn0Nv/TIoY= 409 | github.com/letsencrypt/boulder v0.0.0-20250411005613-d800055fe666/go.mod h1:WGXwLq/jKt0kng727wv6a0h0q7TVC+MwS2S75rcqL+4= 410 | github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= 411 | github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= 412 | github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= 413 | github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= 414 | github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= 415 | github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= 416 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 417 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= 418 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 419 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 420 | github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= 421 | github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 422 | github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= 423 | github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= 424 | github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= 425 | github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= 426 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 427 | github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= 428 | github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= 429 | github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= 430 | github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= 431 | github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= 432 | github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 433 | github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= 434 | github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= 435 | github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= 436 | github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= 437 | github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= 438 | github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= 439 | github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= 440 | github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= 441 | github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= 442 | github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= 443 | github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= 444 | github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= 445 | github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= 446 | github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= 447 | github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 448 | github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= 449 | github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= 450 | github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= 451 | github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= 452 | github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= 453 | github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= 454 | github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= 455 | github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= 456 | github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= 457 | github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= 458 | github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= 459 | github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= 460 | github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= 461 | github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= 462 | github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= 463 | github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= 464 | github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= 465 | github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= 466 | github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= 467 | github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= 468 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 469 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 470 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 471 | github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= 472 | github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 473 | github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= 474 | github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= 475 | github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk= 476 | github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= 477 | github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= 478 | github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= 479 | github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= 480 | github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= 481 | github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= 482 | github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= 483 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 484 | github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= 485 | github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 486 | github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= 487 | github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= 488 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 489 | github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= 490 | github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= 491 | github.com/sagikazarmark/locafero v0.9.0 h1:GbgQGNtTrEmddYDSAH9QLRyfAHY12md+8YFTqyMTC9k= 492 | github.com/sagikazarmark/locafero v0.9.0/go.mod h1:UBUyz37V+EdMS3hDF3QWIiVr/2dPrx49OMO0Bn0hJqk= 493 | github.com/sassoftware/relic v7.2.1+incompatible h1:Pwyh1F3I0r4clFJXkSI8bOyJINGqpgjJU3DYAZeI05A= 494 | github.com/sassoftware/relic v7.2.1+incompatible/go.mod h1:CWfAxv73/iLZ17rbyhIEq3K9hs5w6FpNMdUT//qR+zk= 495 | github.com/sassoftware/relic/v7 v7.6.2 h1:rS44Lbv9G9eXsukknS4mSjIAuuX+lMq/FnStgmZlUv4= 496 | github.com/sassoftware/relic/v7 v7.6.2/go.mod h1:kjmP0IBVkJZ6gXeAu35/KCEfca//+PKM6vTAsyDPY+k= 497 | github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= 498 | github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= 499 | github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= 500 | github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= 501 | github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= 502 | github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= 503 | github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= 504 | github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= 505 | github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= 506 | github.com/sigstore/cosign/v2 v2.5.0 h1:1aRfPgRQHHlODI3Mvs/JkPBS9dJT9bRLCuHZgnHxFt8= 507 | github.com/sigstore/cosign/v2 v2.5.0/go.mod h1:2V2hmo+jjFNnDb5Q5VL6PXvLU9Vujio7T5yldrpNTRw= 508 | github.com/sigstore/protobuf-specs v0.4.1 h1:5SsMqZbdkcO/DNHudaxuCUEjj6x29tS2Xby1BxGU7Zc= 509 | github.com/sigstore/protobuf-specs v0.4.1/go.mod h1:+gXR+38nIa2oEupqDdzg4qSBT0Os+sP7oYv6alWewWc= 510 | github.com/sigstore/rekor v1.3.9 h1:sUjRpKVh/hhgqGMs0t+TubgYsksArZ6poLEC3MsGAzU= 511 | github.com/sigstore/rekor v1.3.9/go.mod h1:xThNUhm6eNEmkJ/SiU/FVU7pLY2f380fSDZFsdDWlcM= 512 | github.com/sigstore/sigstore v1.9.3 h1:y2qlTj+vh+Or3ictKuR3JUFawZPdDxAjrWkeFhon0OQ= 513 | github.com/sigstore/sigstore v1.9.3/go.mod h1:VwYkiw0G0dRtwL25KSs04hCyVFF6CYMd/qvNeYrl7EQ= 514 | github.com/sigstore/sigstore-go v0.7.1 h1:lyzi3AjO6+BHc5zCf9fniycqPYOt3RaC08M/FRmQhVY= 515 | github.com/sigstore/sigstore-go v0.7.1/go.mod h1:AIRj4I3LC82qd07VFm3T2zXYiddxeBV1k/eoS8nTz0E= 516 | github.com/sigstore/sigstore/pkg/signature/kms/aws v1.9.1 h1:/YcNq687WnXpIRXl04nLfJX741G4iW+w+7Nem2Zy0f4= 517 | github.com/sigstore/sigstore/pkg/signature/kms/aws v1.9.1/go.mod h1:ApL9RpKsi7gkSYN0bMNdm/3jZ9EefxMmfYHfUmq2ZYM= 518 | github.com/sigstore/sigstore/pkg/signature/kms/azure v1.9.1 h1:FnusXyTIInnwfIOzzl5PFilRm1I97dxMSOcCkZBu9Kc= 519 | github.com/sigstore/sigstore/pkg/signature/kms/azure v1.9.1/go.mod h1:d5m5LOa/69a+t2YC9pDPwS1n2i/PhqB4cUKbpVDlKKE= 520 | github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.9.1 h1:LFiYK1DEWQ6Hf/nroFzBMM+s5rVSjVL45Alpb5Ctl5A= 521 | github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.9.1/go.mod h1:GFyFmDsE2wDuIHZD+4+JErGpA0S4zJsKNz5l2JVJd8s= 522 | github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.9.1 h1:sIW6xe4yU5eIMH8fve2C78d+r29KmHnIb+7po+80bsY= 523 | github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.9.1/go.mod h1:3pNf99GnK9eu3XUa5ebHzgEQSVYf9hqAoPFwbwD6O6M= 524 | github.com/sigstore/timestamp-authority v1.2.5 h1:W22JmwRv1Salr/NFFuP7iJuhytcZszQjldoB8GiEdnw= 525 | github.com/sigstore/timestamp-authority v1.2.5/go.mod h1:gWPKWq4HMWgPCETre0AakgBzcr9DRqHrsgbrRqsigOs= 526 | github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= 527 | github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 528 | github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= 529 | github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= 530 | github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= 531 | github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= 532 | github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= 533 | github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= 534 | github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= 535 | github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= 536 | github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= 537 | github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= 538 | github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= 539 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 540 | github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= 541 | github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 542 | github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= 543 | github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= 544 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 545 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 546 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 547 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 548 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 549 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 550 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 551 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 552 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 553 | github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= 554 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 555 | github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 556 | github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= 557 | github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 558 | github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= 559 | github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= 560 | github.com/theupdateframework/go-tuf v0.7.0 h1:CqbQFrWo1ae3/I0UCblSbczevCCbS31Qvs5LdxRWqRI= 561 | github.com/theupdateframework/go-tuf v0.7.0/go.mod h1:uEB7WSY+7ZIugK6R1hiBMBjQftaFzn7ZCDJcp1tCUug= 562 | github.com/theupdateframework/go-tuf/v2 v2.0.2 h1:PyNnjV9BJNzN1ZE6BcWK+5JbF+if370jjzO84SS+Ebo= 563 | github.com/theupdateframework/go-tuf/v2 v2.0.2/go.mod h1:baB22nBHeHBCeuGZcIlctNq4P61PcOdyARlplg5xmLA= 564 | github.com/tink-crypto/tink-go-awskms/v2 v2.1.0 h1:N9UxlsOzu5mttdjhxkDLbzwtEecuXmlxZVo/ds7JKJI= 565 | github.com/tink-crypto/tink-go-awskms/v2 v2.1.0/go.mod h1:PxSp9GlOkKL9rlybW804uspnHuO9nbD98V/fDX4uSis= 566 | github.com/tink-crypto/tink-go-gcpkms/v2 v2.2.0 h1:3B9i6XBXNTRspfkTC0asN5W0K6GhOSgcujNiECNRNb0= 567 | github.com/tink-crypto/tink-go-gcpkms/v2 v2.2.0/go.mod h1:jY5YN2BqD/KSCHM9SqZPIpJNG/u3zwfLXHgws4x2IRw= 568 | github.com/tink-crypto/tink-go/v2 v2.3.0 h1:4/TA0lw0lA/iVKBL9f8R5eP7397bfc4antAMXF5JRhs= 569 | github.com/tink-crypto/tink-go/v2 v2.3.0/go.mod h1:kfPOtXIadHlekBTeBtJrHWqoGL+Fm3JQg0wtltPuxLU= 570 | github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0= 571 | github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs= 572 | github.com/transparency-dev/merkle v0.0.2 h1:Q9nBoQcZcgPamMkGn7ghV8XiTZ/kRxn1yCG81+twTK4= 573 | github.com/transparency-dev/merkle v0.0.2/go.mod h1:pqSy+OXefQ1EDUVmAJ8MUhHB9TXGuzVAT58PqBoHz1A= 574 | github.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CPa4= 575 | github.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= 576 | github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= 577 | github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI= 578 | github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= 579 | github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= 580 | github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= 581 | github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= 582 | github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= 583 | github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= 584 | github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= 585 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 586 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 587 | github.com/yuin/goldmark v1.7.7 h1:5m9rrB1sW3JUMToKFQfb+FGt1U7r57IHu5GrYrG2nqU= 588 | github.com/yuin/goldmark v1.7.7/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= 589 | github.com/yuin/goldmark-meta v1.1.0 h1:pWw+JLHGZe8Rk0EGsMVssiNb/AaPMHfSRszZeUeiOUc= 590 | github.com/yuin/goldmark-meta v1.1.0/go.mod h1:U4spWENafuA7Zyg+Lj5RqK/MF+ovMYtBvXi1lBb2VP0= 591 | github.com/zalando/go-keyring v0.2.3 h1:v9CUu9phlABObO4LPWycf+zwMG7nlbb3t/B5wa97yms= 592 | github.com/zalando/go-keyring v0.2.3/go.mod h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk= 593 | github.com/zclconf/go-cty v1.17.0 h1:seZvECve6XX4tmnvRzWtJNHdscMtYEx5R7bnnVyd/d0= 594 | github.com/zclconf/go-cty v1.17.0/go.mod h1:wqFzcImaLTI6A5HfsRwB0nj5n0MRZFwmey8YoFPPs3U= 595 | github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= 596 | github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= 597 | go.abhg.dev/goldmark/frontmatter v0.2.0 h1:P8kPG0YkL12+aYk2yU3xHv4tcXzeVnN+gU0tJ5JnxRw= 598 | go.abhg.dev/goldmark/frontmatter v0.2.0/go.mod h1:XqrEkZuM57djk7zrlRUB02x8I5J0px76YjkOzhB4YlU= 599 | go.mongodb.org/mongo-driver v1.17.3 h1:TQyXhnsWfWtgAhMtOgtYHMTkZIfBTpMTsMnd9ZBeHxQ= 600 | go.mongodb.org/mongo-driver v1.17.3/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= 601 | go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= 602 | go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= 603 | go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= 604 | go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= 605 | go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= 606 | go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= 607 | go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= 608 | go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= 609 | go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA= 610 | go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI= 611 | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0 h1:wpMfgF8E1rkrT1Z6meFh1NDtownE9Ii3n3X2GJYjsaU= 612 | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0/go.mod h1:wAy0T/dUbs468uOlkT31xjvqQgEVXv58BRFWEgn5v/0= 613 | go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= 614 | go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= 615 | go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= 616 | go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= 617 | go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= 618 | go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= 619 | go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= 620 | go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= 621 | go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= 622 | go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= 623 | go.step.sm/crypto v0.60.0 h1:UgSw8DFG5xUOGB3GUID17UA32G4j1iNQ4qoMhBmsVFw= 624 | go.step.sm/crypto v0.60.0/go.mod h1:Ep83Lv818L4gV0vhFTdPWRKnL6/5fRMpi8SaoP5ArSw= 625 | go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= 626 | go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= 627 | go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= 628 | go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= 629 | go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= 630 | go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= 631 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 632 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 633 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 634 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 635 | golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= 636 | golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= 637 | golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= 638 | golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU= 639 | golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc= 640 | golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= 641 | golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= 642 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 643 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 644 | golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 645 | golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= 646 | golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= 647 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 648 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 649 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 650 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 651 | golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 652 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 653 | golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= 654 | golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 655 | golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 656 | golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= 657 | golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= 658 | golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= 659 | golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= 660 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 661 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 662 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 663 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 664 | golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 665 | golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= 666 | golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= 667 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 668 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 669 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 670 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 671 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 672 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 673 | golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 674 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 675 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 676 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 677 | golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 678 | golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 679 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 680 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 681 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 682 | golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 683 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 684 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 685 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 686 | golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 687 | golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= 688 | golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= 689 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 690 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 691 | golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= 692 | golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 693 | golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= 694 | golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= 695 | golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= 696 | golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= 697 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 698 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 699 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 700 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 701 | golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= 702 | golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 703 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 704 | golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 705 | golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 706 | golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= 707 | golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= 708 | golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= 709 | golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= 710 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 711 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 712 | golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= 713 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 714 | golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 715 | golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= 716 | golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= 717 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 718 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 719 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 720 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 721 | gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= 722 | gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= 723 | google.golang.org/api v0.227.0 h1:QvIHF9IuyG6d6ReE+BNd11kIB8hZvjN8Z5xY5t21zYc= 724 | google.golang.org/api v0.227.0/go.mod h1:EIpaG6MbTgQarWF5xJvX0eOJPK9n/5D4Bynb9j2HXvQ= 725 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 726 | google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= 727 | google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= 728 | google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb h1:ITgPrl429bc6+2ZraNSzMDk3I95nmQln2fuPstKwFDE= 729 | google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= 730 | google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= 731 | google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= 732 | google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= 733 | google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= 734 | google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI= 735 | google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= 736 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 737 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 738 | google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= 739 | google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= 740 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 741 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 742 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= 743 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 744 | gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= 745 | gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= 746 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 747 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 748 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 749 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 750 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 751 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 752 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 753 | gotest.tools/v3 v3.1.0 h1:rVV8Tcg/8jHUkPUorwjaMTtemIMVXfIPKiOqnhEhakk= 754 | gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= 755 | k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= 756 | k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= 757 | sigs.k8s.io/kind v0.27.0 h1:PQ3f0iAWNIj66LYkZ1ivhEg/+Zb6UPMbO+qVei/INZA= 758 | sigs.k8s.io/kind v0.27.0/go.mod h1:RZVFmy6qcwlSWwp6xeIUv7kXCPF3i8MXsEXxW/J+gJY= 759 | sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= 760 | sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= 761 | software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k= 762 | software.sslmate.com/src/go-pkcs12 v0.4.0/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI= 763 | --------------------------------------------------------------------------------