From 49d5711a49636f30f3739cfe6d208938261292f4 Mon Sep 17 00:00:00 2001 From: Louis Ruch Date: Wed, 22 Sep 2021 11:01:51 -0700 Subject: [PATCH 01/18] fix (service): corrects permission bug in hostset service (#1549) * fix (service): corrects permission bug in hostset service * fixup! fix (service): corrects permission bug in hostset service --- CHANGELOG.md | 8 ++++++++ .../controller/handlers/host_sets/host_set_service.go | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb5dfe30a..a80d2dec9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ Canonical reference for changes, improvements, and bugfixes for Boundary. ### Deprecations/Changes +* permissions: Fix bug in _Host Sets_ service that authenticated requests + againist incorrect grant actions. This bug affects the _SetHosts_, _AddHosts_ + and _RemoveHosts_ paths that do not have wildcard (`*`) action grants. + If affected, please update grant actions as follows: +* * `set-host-sets` -> `set-hosts` +* * `add-host-sets` -> `add-hosts` +* * `remove-host-sets` -> `remove-hosts` + ([PR](https://github.com/hashicorp/boundary/pull/1549)). * Removes support for the `auth-methods/:authenticate:login` action that was deprecated in [Boundary 0.2.0](#020-20210414), please use `auth-methods/:authenticate` instead. diff --git a/internal/servers/controller/handlers/host_sets/host_set_service.go b/internal/servers/controller/handlers/host_sets/host_set_service.go index a251efaca..0b354560d 100644 --- a/internal/servers/controller/handlers/host_sets/host_set_service.go +++ b/internal/servers/controller/handlers/host_sets/host_set_service.go @@ -267,7 +267,7 @@ func (s Service) AddHostSetHosts(ctx context.Context, req *pbs.AddHostSetHostsRe if err := validateAddRequest(req); err != nil { return nil, err } - _, authResults := s.parentAndAuthResult(ctx, req.GetId(), action.AddHostSets) + _, authResults := s.parentAndAuthResult(ctx, req.GetId(), action.AddHosts) if authResults.Error != nil { return nil, authResults.Error } @@ -305,7 +305,7 @@ func (s Service) SetHostSetHosts(ctx context.Context, req *pbs.SetHostSetHostsRe if err := validateSetRequest(req); err != nil { return nil, err } - _, authResults := s.parentAndAuthResult(ctx, req.GetId(), action.SetHostSets) + _, authResults := s.parentAndAuthResult(ctx, req.GetId(), action.SetHosts) if authResults.Error != nil { return nil, authResults.Error } @@ -342,7 +342,7 @@ func (s Service) RemoveHostSetHosts(ctx context.Context, req *pbs.RemoveHostSetH if err := validateRemoveRequest(req); err != nil { return nil, err } - _, authResults := s.parentAndAuthResult(ctx, req.GetId(), action.RemoveHostSets) + _, authResults := s.parentAndAuthResult(ctx, req.GetId(), action.RemoveHosts) if authResults.Error != nil { return nil, authResults.Error } From 88b3c8358c0bdc344bc8094ac732f2b1c40f2603 Mon Sep 17 00:00:00 2001 From: Timothy Messier Date: Thu, 23 Sep 2021 12:22:20 -0400 Subject: [PATCH 02/18] feat(cmd): Include version metadata in output (#1560) If the VersionMetadata is set, include it in the output of the `boundary version` subcommand. --- internal/cmd/commands/version/version.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/cmd/commands/version/version.go b/internal/cmd/commands/version/version.go index cba5b4733..a615e9768 100644 --- a/internal/cmd/commands/version/version.go +++ b/internal/cmd/commands/version/version.go @@ -67,6 +67,9 @@ func (c *Command) Run(args []string) int { if verInfo.Version != "" { nonAttributeMap["Version Number"] = verInfo.VersionNumber() } + if verInfo.VersionMetadata != "" { + nonAttributeMap["Metadata"] = verInfo.VersionMetadata + } maxLength := base.MaxAttributesLength(nonAttributeMap, nil, nil) From aab46370aa2e05477c89e610d946529339c6f977 Mon Sep 17 00:00:00 2001 From: Robin Beck Date: Thu, 23 Sep 2021 11:23:06 -0600 Subject: [PATCH 03/18] Docs: redirect Desktop install links to Learn (#1556) * point install Desktop redirect to Learn * hide /api-concepts/desktop and redirect to Learn * add permanent redirect for /api-clients/desktop to Learn --- website/content/docs/getting-started/index.mdx | 3 +-- website/data/docs-nav-data.json | 5 +++++ website/redirects.js | 6 ++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/website/content/docs/getting-started/index.mdx b/website/content/docs/getting-started/index.mdx index 3d891f85d..c3ad7f31e 100644 --- a/website/content/docs/getting-started/index.mdx +++ b/website/content/docs/getting-started/index.mdx @@ -15,8 +15,7 @@ The examples in Getting Started all revolve around running in `dev mode`. There 1. [Docker](https://docs.docker.com/get-docker/) is installed 1. A route to download the [Postgres Docker image](https://hub.docker.com/_/postgres) is available or a local image cache is available 1. A [Boundary binary](https://www.boundaryproject.io/downloads) in your `$PATH` -1. Optionally, an [installation of Boundary Desktop](/docs/api-clients/desktop#install-boundary-desktop) if you want to use the - desktop examples +1. Optionally, an [installation of Boundary Desktop](https://learn.hashicorp.com/tutorials/boundary/getting-started-desktop-app) if you want to use the desktop examples ## What is Dev Mode? diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json index eb4fb0faf..f7164abb7 100644 --- a/website/data/docs-nav-data.json +++ b/website/data/docs-nav-data.json @@ -76,7 +76,12 @@ }, { "title": "Desktop", + "hidden": true, "path": "api-clients/desktop" + }, + { + "title": "Desktop", + "href": "https://learn.hashicorp.com/tutorials/boundary/getting-started-desktop-app" } ] }, diff --git a/website/redirects.js b/website/redirects.js index 91848ed79..a1326a120 100644 --- a/website/redirects.js +++ b/website/redirects.js @@ -29,6 +29,12 @@ module.exports = [ destination: '/docs/api-clients/desktop#connect', permanent: false, }, + { + source: '/docs/api-clients/desktop', + destination: + 'https://learn.hashicorp.com/tutorials/boundary/getting-started-desktop-app', + permanent: true, + }, ///////////////////////////////// // DOMAIN MODEL CONCEPTS From 0eb1ab16983e1f84cd55c48d2f55e0509bb44e3a Mon Sep 17 00:00:00 2001 From: Randall Morey Date: Mon, 27 Sep 2021 14:28:36 -0400 Subject: [PATCH 04/18] chore: bump UI commit (#1565) --- internal/ui/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/ui/VERSION b/internal/ui/VERSION index aa12903fd..ca661c4ef 100644 --- a/internal/ui/VERSION +++ b/internal/ui/VERSION @@ -1,4 +1,4 @@ -1321df32659b2b808ca889f053b09bee4504a368 Merge pull request #751 from hashicorp/chore-create-without-read-host +f29a6bc5d9475ee57327f4ca21aa213908bbfd01 Merge pull request #771 from hashicorp/chore-nth-check-resolutions # This file determines the version of the UI to embed in the boundary binary. # Update this file by running 'make update-ui-version' from the root of this repo. # Set UI_COMMITISH when running the above target to update to a specific version. From 350b79be2d61b7f03ca18f370328567086849573 Mon Sep 17 00:00:00 2001 From: Jim Date: Mon, 27 Sep 2021 16:24:00 -0400 Subject: [PATCH 05/18] chore: Update go:build tags to new fmt --- internal/cmd/base/internal/docker/supported.go | 1 + internal/cmd/base/profiling_off.go | 1 + internal/cmd/base/profiling_on.go | 1 + internal/cmd/commands_nonwindows.go | 1 + internal/cmd/commands_windows.go | 1 + internal/credential/vault/supported.go | 1 + internal/servers/controller/handler_ui.go | 1 + internal/servers/controller/handler_ui_test.go | 1 + internal/ui/assets.go | 1 + internal/ui/dummy.go | 1 + tools/tools.go | 1 + version/cgo.go | 1 + 12 files changed, 12 insertions(+) diff --git a/internal/cmd/base/internal/docker/supported.go b/internal/cmd/base/internal/docker/supported.go index 172ba2088..55867a8e2 100644 --- a/internal/cmd/base/internal/docker/supported.go +++ b/internal/cmd/base/internal/docker/supported.go @@ -1,3 +1,4 @@ +//go:build linux || darwin || windows // +build linux darwin windows package docker diff --git a/internal/cmd/base/profiling_off.go b/internal/cmd/base/profiling_off.go index 9b8d341e6..63ce61254 100644 --- a/internal/cmd/base/profiling_off.go +++ b/internal/cmd/base/profiling_off.go @@ -1,3 +1,4 @@ +//go:build !memprofiler // +build !memprofiler package base diff --git a/internal/cmd/base/profiling_on.go b/internal/cmd/base/profiling_on.go index 8a39367b5..666c089d6 100644 --- a/internal/cmd/base/profiling_on.go +++ b/internal/cmd/base/profiling_on.go @@ -1,3 +1,4 @@ +//go:build memprofiler // +build memprofiler package base diff --git a/internal/cmd/commands_nonwindows.go b/internal/cmd/commands_nonwindows.go index 51fe5f1b7..183719973 100644 --- a/internal/cmd/commands_nonwindows.go +++ b/internal/cmd/commands_nonwindows.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package cmd diff --git a/internal/cmd/commands_windows.go b/internal/cmd/commands_windows.go index 78a215f39..60634e54a 100644 --- a/internal/cmd/commands_windows.go +++ b/internal/cmd/commands_windows.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows package cmd diff --git a/internal/credential/vault/supported.go b/internal/credential/vault/supported.go index b71c29048..206bee5f9 100644 --- a/internal/credential/vault/supported.go +++ b/internal/credential/vault/supported.go @@ -1,3 +1,4 @@ +//go:build linux || darwin || windows // +build linux darwin windows package vault diff --git a/internal/servers/controller/handler_ui.go b/internal/servers/controller/handler_ui.go index 94cd9e7aa..9d660c0c1 100644 --- a/internal/servers/controller/handler_ui.go +++ b/internal/servers/controller/handler_ui.go @@ -1,3 +1,4 @@ +//go:build ui // +build ui package controller diff --git a/internal/servers/controller/handler_ui_test.go b/internal/servers/controller/handler_ui_test.go index f885783f9..f87154b17 100644 --- a/internal/servers/controller/handler_ui_test.go +++ b/internal/servers/controller/handler_ui_test.go @@ -1,3 +1,4 @@ +//go:build ui // +build ui package controller diff --git a/internal/ui/assets.go b/internal/ui/assets.go index e2beca9db..3e3f698c7 100644 --- a/internal/ui/assets.go +++ b/internal/ui/assets.go @@ -1,3 +1,4 @@ +//go:build ui // +build ui package ui diff --git a/internal/ui/dummy.go b/internal/ui/dummy.go index 584080c66..ae0d78b9c 100644 --- a/internal/ui/dummy.go +++ b/internal/ui/dummy.go @@ -1,3 +1,4 @@ +//go:build !ui // +build !ui package ui diff --git a/tools/tools.go b/tools/tools.go index 3d29c1a44..a93a46d55 100644 --- a/tools/tools.go +++ b/tools/tools.go @@ -1,3 +1,4 @@ +//go:build tools // +build tools // This file ensures tool dependencies are kept in sync. This is the diff --git a/version/cgo.go b/version/cgo.go index 2ed493a1f..91d3dd97b 100644 --- a/version/cgo.go +++ b/version/cgo.go @@ -1,3 +1,4 @@ +//go:build cgo // +build cgo package version From 6c7333cbe043118c1c39ce5b83dd42567858b305 Mon Sep 17 00:00:00 2001 From: Jim Date: Mon, 27 Sep 2021 16:28:51 -0400 Subject: [PATCH 06/18] chore: Update sdk dep --- api/go.mod | 2 +- api/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/go.mod b/api/go.mod index 0474b4ee1..83b9febd2 100644 --- a/api/go.mod +++ b/api/go.mod @@ -5,7 +5,7 @@ go 1.15 require ( github.com/fatih/structs v1.1.0 github.com/hashicorp/go-cleanhttp v0.5.2 - github.com/hashicorp/go-kms-wrapping v0.6.5 + github.com/hashicorp/go-kms-wrapping v0.6.6 github.com/hashicorp/go-retryablehttp v0.6.8 github.com/hashicorp/go-rootcerts v1.0.2 github.com/hashicorp/go-secure-stdlib/parseutil v0.1.1 diff --git a/api/go.sum b/api/go.sum index 36e924555..590577ce9 100644 --- a/api/go.sum +++ b/api/go.sum @@ -191,8 +191,8 @@ github.com/hashicorp/go-hclog v0.16.2 h1:K4ev2ib4LdQETX5cSZBG0DVLk1jwGqSPXBjdah3 github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-kms-wrapping v0.6.5 h1:iKcwiqpm2dvkMLymEyJQpbazwR70l7XINUPFduLdbAs= -github.com/hashicorp/go-kms-wrapping v0.6.5/go.mod h1:9aLqFi2fqK1WMCyTe9bVjB0X6XxCxD+oINL1ovxpgJE= +github.com/hashicorp/go-kms-wrapping v0.6.6 h1:S2lw/8CFAw5kcztPD9iABG8ekjOs5san9C2oZrY6Syw= +github.com/hashicorp/go-kms-wrapping v0.6.6/go.mod h1:9aLqFi2fqK1WMCyTe9bVjB0X6XxCxD+oINL1ovxpgJE= github.com/hashicorp/go-kms-wrapping/entropy v0.1.0/go.mod h1:d1g9WGtAunDNpek8jUIEJnBlbgKS1N2Q61QkHiZyR1g= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= From f9c043c866231920b712af109d7f1c7a4fbee585 Mon Sep 17 00:00:00 2001 From: Jim Date: Mon, 27 Sep 2021 16:32:42 -0400 Subject: [PATCH 07/18] chore: Update sdk and api deps --- go.mod | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 31692c8de..b2353a82f 100644 --- a/go.mod +++ b/go.mod @@ -18,8 +18,8 @@ require ( github.com/golang/protobuf v1.5.2 github.com/google/go-cmp v0.5.6 github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0 - github.com/hashicorp/boundary/api v0.0.18 - github.com/hashicorp/boundary/sdk v0.0.10 + github.com/hashicorp/boundary/api v0.0.19 + github.com/hashicorp/boundary/sdk v0.0.11 github.com/hashicorp/cap v0.1.1 github.com/hashicorp/dawdle v0.4.0 github.com/hashicorp/dbassert v0.0.0-20210708202608-ecf920cf1ed8 From 07c5c00f557ccc6d58ac065fa6c267f576860ac2 Mon Sep 17 00:00:00 2001 From: Jim Date: Mon, 27 Sep 2021 16:38:06 -0400 Subject: [PATCH 08/18] chore: Update version to 0.6.2 --- .circleci/config.yml | 278 +++++------ .circleci/config/@build-release.yml | 278 +++++------ CHANGELOG.md | 2 + Makefile | 2 +- ci/goinstall.sh | 2 +- docker/Release.dockerfile | 2 +- packages-oss.lock/layers/layers.mk | 64 +-- packages-oss.lock/pkgs.yml | 740 ++++++++++++++-------------- packages-oss.yml | 6 +- 9 files changed, 688 insertions(+), 686 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 13db096d3..94cbfd7b4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -29,49 +29,49 @@ jobs: command: mkdir -p .buildcache && echo "*" > .buildcache/.gitignore name: Ignore .buildcache - restore_cache: - key: package-ddd70200153c0e65302afe88a629b4440e8eebfa-{{checksum ".buildcache/cache-keys/package-ddd70200153c0e65302afe88a629b4440e8eebfa"}} + key: package-2bb9488232c945d6800cc3a4a461d9b17503bccc-{{checksum ".buildcache/cache-keys/package-2bb9488232c945d6800cc3a4a461d9b17503bccc"}} name: Restore package cache - restore_cache: - key: package-dca0ba02c8e7351c77442c86523f121a8c83039e-{{checksum ".buildcache/cache-keys/package-dca0ba02c8e7351c77442c86523f121a8c83039e"}} + key: package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2-{{checksum ".buildcache/cache-keys/package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2"}} name: Restore package cache - restore_cache: - key: package-72b242aa7004a2a706bd894df71c002671e8e425-{{checksum ".buildcache/cache-keys/package-72b242aa7004a2a706bd894df71c002671e8e425"}} + key: package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5-{{checksum ".buildcache/cache-keys/package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5"}} name: Restore package cache - restore_cache: - key: package-2409a41c5c5a434b5dbf77d29deb31a24c825dea-{{checksum ".buildcache/cache-keys/package-2409a41c5c5a434b5dbf77d29deb31a24c825dea"}} + key: package-822b1aa9954becb7a9cb480784ff9f99783a8d23-{{checksum ".buildcache/cache-keys/package-822b1aa9954becb7a9cb480784ff9f99783a8d23"}} name: Restore package cache - restore_cache: - key: package-1439f62f659d115a6675bef8de63d7a576370da6-{{checksum ".buildcache/cache-keys/package-1439f62f659d115a6675bef8de63d7a576370da6"}} + key: package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a-{{checksum ".buildcache/cache-keys/package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a"}} name: Restore package cache - restore_cache: - key: package-192814968c68e1c819d216b95925afb4099aaa07-{{checksum ".buildcache/cache-keys/package-192814968c68e1c819d216b95925afb4099aaa07"}} + key: package-03d32b4b7349ceac506ca889be4772fe8239ecd8-{{checksum ".buildcache/cache-keys/package-03d32b4b7349ceac506ca889be4772fe8239ecd8"}} name: Restore package cache - restore_cache: - key: package-b734ede0c13f22ffc1835626300d3b3226acaf53-{{checksum ".buildcache/cache-keys/package-b734ede0c13f22ffc1835626300d3b3226acaf53"}} + key: package-ab3b6922ce2bd0fab200dddd6127544427b89fef-{{checksum ".buildcache/cache-keys/package-ab3b6922ce2bd0fab200dddd6127544427b89fef"}} name: Restore package cache - restore_cache: - key: package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa-{{checksum ".buildcache/cache-keys/package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa"}} + key: package-7f1216479517d6c6122fd8928ff44c046eb3a377-{{checksum ".buildcache/cache-keys/package-7f1216479517d6c6122fd8928ff44c046eb3a377"}} name: Restore package cache - restore_cache: - key: package-b9d9cc299dc96f89f71285c520b4cd244879207a-{{checksum ".buildcache/cache-keys/package-b9d9cc299dc96f89f71285c520b4cd244879207a"}} + key: package-7fae91402a49def23c2453fe147c262f1377eac3-{{checksum ".buildcache/cache-keys/package-7fae91402a49def23c2453fe147c262f1377eac3"}} name: Restore package cache - restore_cache: - key: package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d-{{checksum ".buildcache/cache-keys/package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d"}} + key: package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8-{{checksum ".buildcache/cache-keys/package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8"}} name: Restore package cache - restore_cache: - key: package-489303d43b63583b456fef92eeef9806a25ef98d-{{checksum ".buildcache/cache-keys/package-489303d43b63583b456fef92eeef9806a25ef98d"}} + key: package-b0201f2d2d1b04f519e0d091fbe23997252c5f70-{{checksum ".buildcache/cache-keys/package-b0201f2d2d1b04f519e0d091fbe23997252c5f70"}} name: Restore package cache - restore_cache: - key: package-394f426443d3ce6446a86a2982253a2637c061e0-{{checksum ".buildcache/cache-keys/package-394f426443d3ce6446a86a2982253a2637c061e0"}} + key: package-51ea70d1d613481fac829f239f1f081c5ad6c88b-{{checksum ".buildcache/cache-keys/package-51ea70d1d613481fac829f239f1f081c5ad6c88b"}} name: Restore package cache - restore_cache: - key: package-e13e5614c5583baf504ebe29fbf99c21f9447926-{{checksum ".buildcache/cache-keys/package-e13e5614c5583baf504ebe29fbf99c21f9447926"}} + key: package-19efae459acdaea98d804c26c554640ab3544553-{{checksum ".buildcache/cache-keys/package-19efae459acdaea98d804c26c554640ab3544553"}} name: Restore package cache - restore_cache: - key: package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9-{{checksum ".buildcache/cache-keys/package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9"}} + key: package-44f600485ac3823fa4e0dbba45763d932187225a-{{checksum ".buildcache/cache-keys/package-44f600485ac3823fa4e0dbba45763d932187225a"}} name: Restore package cache - restore_cache: - key: package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8-{{checksum ".buildcache/cache-keys/package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8"}} + key: package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5-{{checksum ".buildcache/cache-keys/package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5"}} name: Restore package cache - run: command: make package-meta-all @@ -83,20 +83,20 @@ jobs: command: ls -lahR .buildcache name: List Build Cache - run: - command: cp packages*.lock/pkgs.yml lockfile-fd66eb9f99de501d.yml + command: cp packages*.lock/pkgs.yml lockfile-645fb387fb0a87de.yml name: Update Lockfile Name - run: - command: tar -czf packages-fd66eb9f99de501d.tar.gz .buildcache/packages lockfile-fd66eb9f99de501d.yml + command: tar -czf packages-645fb387fb0a87de.tar.gz .buildcache/packages lockfile-645fb387fb0a87de.yml name: Create Raw Package Tarball - run: - command: tar -czf meta-fd66eb9f99de501d.tar.gz .buildcache/packages/store/*.json lockfile-fd66eb9f99de501d.yml + command: tar -czf meta-645fb387fb0a87de.tar.gz .buildcache/packages/store/*.json lockfile-645fb387fb0a87de.yml name: Create Metadata Tarball - store_artifacts: - path: lockfile-fd66eb9f99de501d.yml + path: lockfile-645fb387fb0a87de.yml - store_artifacts: - path: packages-fd66eb9f99de501d.tar.gz + path: packages-645fb387fb0a87de.tar.gz - store_artifacts: - path: meta-fd66eb9f99de501d.tar.gz + path: meta-645fb387fb0a87de.tar.gz - store_artifacts: path: .buildcache/packages environment: @@ -111,7 +111,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: ddd70200153c0e65302afe88a629b4440e8eebfa + - PACKAGE_SPEC_ID: 2bb9488232c945d6800cc3a4a461d9b17503bccc steps: - setup_remote_docker: docker_layer_caching: false @@ -125,7 +125,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-ddd70200153c0e65302afe88a629b4440e8eebfa-{{checksum ".buildcache/cache-keys/package-ddd70200153c0e65302afe88a629b4440e8eebfa"}} + key: package-2bb9488232c945d6800cc3a4a461d9b17503bccc-{{checksum ".buildcache/cache-keys/package-2bb9488232c945d6800cc3a4a461d9b17503bccc"}} name: Restore package cache - run: command: |2 @@ -141,11 +141,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -171,7 +171,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-ddd70200153c0e65302afe88a629b4440e8eebfa-{{checksum ".buildcache/cache-keys/package-ddd70200153c0e65302afe88a629b4440e8eebfa"}} + key: package-2bb9488232c945d6800cc3a4a461d9b17503bccc-{{checksum ".buildcache/cache-keys/package-2bb9488232c945d6800cc3a4a461d9b17503bccc"}} name: Save package cache paths: - .buildcache/packages/store @@ -183,7 +183,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: 3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9 + - PACKAGE_SPEC_ID: 44f600485ac3823fa4e0dbba45763d932187225a steps: - setup_remote_docker: docker_layer_caching: false @@ -197,7 +197,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9-{{checksum ".buildcache/cache-keys/package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9"}} + key: package-44f600485ac3823fa4e0dbba45763d932187225a-{{checksum ".buildcache/cache-keys/package-44f600485ac3823fa4e0dbba45763d932187225a"}} name: Restore package cache - run: command: |2 @@ -213,11 +213,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -243,7 +243,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9-{{checksum ".buildcache/cache-keys/package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9"}} + key: package-44f600485ac3823fa4e0dbba45763d932187225a-{{checksum ".buildcache/cache-keys/package-44f600485ac3823fa4e0dbba45763d932187225a"}} name: Save package cache paths: - .buildcache/packages/store @@ -272,14 +272,14 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Layer Cache: copy-source' - run: - command: LAYER_SPEC_ID=03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 make -C packages*.lock load-builder-cache + command: LAYER_SPEC_ID=03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 make -C packages*.lock load-builder-cache name: Load whatever builder cache we have (if any) into the Docker daemon - run: command: |2- @@ -295,7 +295,7 @@ jobs: echo " attempts to directly clone private repositories." fi - make -f packages*.lock/layer.mk 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16-image + make -f packages*.lock/layer.mk 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c-image name: Build base layer - run: command: |2- @@ -311,7 +311,7 @@ jobs: echo " attempts to directly clone private repositories." fi - make -f packages*.lock/layer.mk 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a-image + make -f packages*.lock/layer.mk 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1-image name: Build ui layer - run: command: |2- @@ -327,7 +327,7 @@ jobs: echo " attempts to directly clone private repositories." fi - make -f packages*.lock/layer.mk 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3-image + make -f packages*.lock/layer.mk 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e-image name: Build go-modules layer - run: command: |2- @@ -343,7 +343,7 @@ jobs: echo " attempts to directly clone private repositories." fi - make -f packages*.lock/layer.mk 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1-image + make -f packages*.lock/layer.mk 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7-image name: Build copy-source layer - run: command: |2- @@ -359,13 +359,13 @@ jobs: echo " attempts to directly clone private repositories." fi - make -f packages*.lock/layer.mk 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1-save + make -f packages*.lock/layer.mk 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7-save name: Build copy-source layer - save_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} name: 'Save Layer Cache: copy-source' paths: - - .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + - .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz environment: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain @@ -378,7 +378,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: a1ae7292c28d5e629eea144b2fafb6f234ca4ffa + - PACKAGE_SPEC_ID: 7f1216479517d6c6122fd8928ff44c046eb3a377 steps: - setup_remote_docker: docker_layer_caching: false @@ -392,7 +392,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa-{{checksum ".buildcache/cache-keys/package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa"}} + key: package-7f1216479517d6c6122fd8928ff44c046eb3a377-{{checksum ".buildcache/cache-keys/package-7f1216479517d6c6122fd8928ff44c046eb3a377"}} name: Restore package cache - run: command: |2 @@ -408,11 +408,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -438,7 +438,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa-{{checksum ".buildcache/cache-keys/package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa"}} + key: package-7f1216479517d6c6122fd8928ff44c046eb3a377-{{checksum ".buildcache/cache-keys/package-7f1216479517d6c6122fd8928ff44c046eb3a377"}} name: Save package cache paths: - .buildcache/packages/store @@ -450,7 +450,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: b734ede0c13f22ffc1835626300d3b3226acaf53 + - PACKAGE_SPEC_ID: ab3b6922ce2bd0fab200dddd6127544427b89fef steps: - setup_remote_docker: docker_layer_caching: false @@ -464,7 +464,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-b734ede0c13f22ffc1835626300d3b3226acaf53-{{checksum ".buildcache/cache-keys/package-b734ede0c13f22ffc1835626300d3b3226acaf53"}} + key: package-ab3b6922ce2bd0fab200dddd6127544427b89fef-{{checksum ".buildcache/cache-keys/package-ab3b6922ce2bd0fab200dddd6127544427b89fef"}} name: Restore package cache - run: command: |2 @@ -480,11 +480,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -510,7 +510,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-b734ede0c13f22ffc1835626300d3b3226acaf53-{{checksum ".buildcache/cache-keys/package-b734ede0c13f22ffc1835626300d3b3226acaf53"}} + key: package-ab3b6922ce2bd0fab200dddd6127544427b89fef-{{checksum ".buildcache/cache-keys/package-ab3b6922ce2bd0fab200dddd6127544427b89fef"}} name: Save package cache paths: - .buildcache/packages/store @@ -533,7 +533,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: 1439f62f659d115a6675bef8de63d7a576370da6 + - PACKAGE_SPEC_ID: 7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a steps: - setup_remote_docker: docker_layer_caching: false @@ -547,7 +547,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-1439f62f659d115a6675bef8de63d7a576370da6-{{checksum ".buildcache/cache-keys/package-1439f62f659d115a6675bef8de63d7a576370da6"}} + key: package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a-{{checksum ".buildcache/cache-keys/package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a"}} name: Restore package cache - run: command: |2 @@ -563,11 +563,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -593,7 +593,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-1439f62f659d115a6675bef8de63d7a576370da6-{{checksum ".buildcache/cache-keys/package-1439f62f659d115a6675bef8de63d7a576370da6"}} + key: package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a-{{checksum ".buildcache/cache-keys/package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a"}} name: Save package cache paths: - .buildcache/packages/store @@ -605,7 +605,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: dca0ba02c8e7351c77442c86523f121a8c83039e + - PACKAGE_SPEC_ID: e9f9d34c2c14f59f68c31469b7bfa994074a48c2 steps: - setup_remote_docker: docker_layer_caching: false @@ -619,7 +619,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-dca0ba02c8e7351c77442c86523f121a8c83039e-{{checksum ".buildcache/cache-keys/package-dca0ba02c8e7351c77442c86523f121a8c83039e"}} + key: package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2-{{checksum ".buildcache/cache-keys/package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2"}} name: Restore package cache - run: command: |2 @@ -635,11 +635,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -665,7 +665,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-dca0ba02c8e7351c77442c86523f121a8c83039e-{{checksum ".buildcache/cache-keys/package-dca0ba02c8e7351c77442c86523f121a8c83039e"}} + key: package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2-{{checksum ".buildcache/cache-keys/package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2"}} name: Save package cache paths: - .buildcache/packages/store @@ -677,7 +677,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: 72b242aa7004a2a706bd894df71c002671e8e425 + - PACKAGE_SPEC_ID: 3e2a1075872eae7608bf8be4b74f7291ca88d5b5 steps: - setup_remote_docker: docker_layer_caching: false @@ -691,7 +691,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-72b242aa7004a2a706bd894df71c002671e8e425-{{checksum ".buildcache/cache-keys/package-72b242aa7004a2a706bd894df71c002671e8e425"}} + key: package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5-{{checksum ".buildcache/cache-keys/package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5"}} name: Restore package cache - run: command: |2 @@ -707,11 +707,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -737,7 +737,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-72b242aa7004a2a706bd894df71c002671e8e425-{{checksum ".buildcache/cache-keys/package-72b242aa7004a2a706bd894df71c002671e8e425"}} + key: package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5-{{checksum ".buildcache/cache-keys/package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5"}} name: Save package cache paths: - .buildcache/packages/store @@ -749,7 +749,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: 489303d43b63583b456fef92eeef9806a25ef98d + - PACKAGE_SPEC_ID: b0201f2d2d1b04f519e0d091fbe23997252c5f70 steps: - setup_remote_docker: docker_layer_caching: false @@ -763,7 +763,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-489303d43b63583b456fef92eeef9806a25ef98d-{{checksum ".buildcache/cache-keys/package-489303d43b63583b456fef92eeef9806a25ef98d"}} + key: package-b0201f2d2d1b04f519e0d091fbe23997252c5f70-{{checksum ".buildcache/cache-keys/package-b0201f2d2d1b04f519e0d091fbe23997252c5f70"}} name: Restore package cache - run: command: |2 @@ -779,11 +779,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -809,7 +809,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-489303d43b63583b456fef92eeef9806a25ef98d-{{checksum ".buildcache/cache-keys/package-489303d43b63583b456fef92eeef9806a25ef98d"}} + key: package-b0201f2d2d1b04f519e0d091fbe23997252c5f70-{{checksum ".buildcache/cache-keys/package-b0201f2d2d1b04f519e0d091fbe23997252c5f70"}} name: Save package cache paths: - .buildcache/packages/store @@ -821,7 +821,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: 192814968c68e1c819d216b95925afb4099aaa07 + - PACKAGE_SPEC_ID: 03d32b4b7349ceac506ca889be4772fe8239ecd8 steps: - setup_remote_docker: docker_layer_caching: false @@ -835,7 +835,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-192814968c68e1c819d216b95925afb4099aaa07-{{checksum ".buildcache/cache-keys/package-192814968c68e1c819d216b95925afb4099aaa07"}} + key: package-03d32b4b7349ceac506ca889be4772fe8239ecd8-{{checksum ".buildcache/cache-keys/package-03d32b4b7349ceac506ca889be4772fe8239ecd8"}} name: Restore package cache - run: command: |2 @@ -851,11 +851,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -881,7 +881,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-192814968c68e1c819d216b95925afb4099aaa07-{{checksum ".buildcache/cache-keys/package-192814968c68e1c819d216b95925afb4099aaa07"}} + key: package-03d32b4b7349ceac506ca889be4772fe8239ecd8-{{checksum ".buildcache/cache-keys/package-03d32b4b7349ceac506ca889be4772fe8239ecd8"}} name: Save package cache paths: - .buildcache/packages/store @@ -903,7 +903,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: e13e5614c5583baf504ebe29fbf99c21f9447926 + - PACKAGE_SPEC_ID: 19efae459acdaea98d804c26c554640ab3544553 steps: - setup_remote_docker: docker_layer_caching: false @@ -917,7 +917,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-e13e5614c5583baf504ebe29fbf99c21f9447926-{{checksum ".buildcache/cache-keys/package-e13e5614c5583baf504ebe29fbf99c21f9447926"}} + key: package-19efae459acdaea98d804c26c554640ab3544553-{{checksum ".buildcache/cache-keys/package-19efae459acdaea98d804c26c554640ab3544553"}} name: Restore package cache - run: command: |2 @@ -933,11 +933,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -963,7 +963,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-e13e5614c5583baf504ebe29fbf99c21f9447926-{{checksum ".buildcache/cache-keys/package-e13e5614c5583baf504ebe29fbf99c21f9447926"}} + key: package-19efae459acdaea98d804c26c554640ab3544553-{{checksum ".buildcache/cache-keys/package-19efae459acdaea98d804c26c554640ab3544553"}} name: Save package cache paths: - .buildcache/packages/store @@ -1125,7 +1125,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: 744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d + - PACKAGE_SPEC_ID: c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8 steps: - setup_remote_docker: docker_layer_caching: false @@ -1139,7 +1139,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d-{{checksum ".buildcache/cache-keys/package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d"}} + key: package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8-{{checksum ".buildcache/cache-keys/package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8"}} name: Restore package cache - run: command: |2 @@ -1155,11 +1155,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -1185,7 +1185,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d-{{checksum ".buildcache/cache-keys/package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d"}} + key: package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8-{{checksum ".buildcache/cache-keys/package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8"}} name: Save package cache paths: - .buildcache/packages/store @@ -1197,7 +1197,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: 394f426443d3ce6446a86a2982253a2637c061e0 + - PACKAGE_SPEC_ID: 51ea70d1d613481fac829f239f1f081c5ad6c88b steps: - setup_remote_docker: docker_layer_caching: false @@ -1211,7 +1211,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-394f426443d3ce6446a86a2982253a2637c061e0-{{checksum ".buildcache/cache-keys/package-394f426443d3ce6446a86a2982253a2637c061e0"}} + key: package-51ea70d1d613481fac829f239f1f081c5ad6c88b-{{checksum ".buildcache/cache-keys/package-51ea70d1d613481fac829f239f1f081c5ad6c88b"}} name: Restore package cache - run: command: |2 @@ -1227,11 +1227,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -1257,7 +1257,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-394f426443d3ce6446a86a2982253a2637c061e0-{{checksum ".buildcache/cache-keys/package-394f426443d3ce6446a86a2982253a2637c061e0"}} + key: package-51ea70d1d613481fac829f239f1f081c5ad6c88b-{{checksum ".buildcache/cache-keys/package-51ea70d1d613481fac829f239f1f081c5ad6c88b"}} name: Save package cache paths: - .buildcache/packages/store @@ -1269,7 +1269,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: b9d9cc299dc96f89f71285c520b4cd244879207a + - PACKAGE_SPEC_ID: 7fae91402a49def23c2453fe147c262f1377eac3 steps: - setup_remote_docker: docker_layer_caching: false @@ -1283,7 +1283,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-b9d9cc299dc96f89f71285c520b4cd244879207a-{{checksum ".buildcache/cache-keys/package-b9d9cc299dc96f89f71285c520b4cd244879207a"}} + key: package-7fae91402a49def23c2453fe147c262f1377eac3-{{checksum ".buildcache/cache-keys/package-7fae91402a49def23c2453fe147c262f1377eac3"}} name: Restore package cache - run: command: |2 @@ -1299,11 +1299,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -1329,7 +1329,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-b9d9cc299dc96f89f71285c520b4cd244879207a-{{checksum ".buildcache/cache-keys/package-b9d9cc299dc96f89f71285c520b4cd244879207a"}} + key: package-7fae91402a49def23c2453fe147c262f1377eac3-{{checksum ".buildcache/cache-keys/package-7fae91402a49def23c2453fe147c262f1377eac3"}} name: Save package cache paths: - .buildcache/packages/store @@ -1341,7 +1341,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: 2409a41c5c5a434b5dbf77d29deb31a24c825dea + - PACKAGE_SPEC_ID: 822b1aa9954becb7a9cb480784ff9f99783a8d23 steps: - setup_remote_docker: docker_layer_caching: false @@ -1355,7 +1355,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-2409a41c5c5a434b5dbf77d29deb31a24c825dea-{{checksum ".buildcache/cache-keys/package-2409a41c5c5a434b5dbf77d29deb31a24c825dea"}} + key: package-822b1aa9954becb7a9cb480784ff9f99783a8d23-{{checksum ".buildcache/cache-keys/package-822b1aa9954becb7a9cb480784ff9f99783a8d23"}} name: Restore package cache - run: command: |2 @@ -1371,11 +1371,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -1401,7 +1401,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-2409a41c5c5a434b5dbf77d29deb31a24c825dea-{{checksum ".buildcache/cache-keys/package-2409a41c5c5a434b5dbf77d29deb31a24c825dea"}} + key: package-822b1aa9954becb7a9cb480784ff9f99783a8d23-{{checksum ".buildcache/cache-keys/package-822b1aa9954becb7a9cb480784ff9f99783a8d23"}} name: Save package cache paths: - .buildcache/packages/store @@ -1413,7 +1413,7 @@ jobs: - AUTO_INSTALL_TOOLS: 'YES' - BUILDKIT_PROGRESS: plain - PRODUCT_REVISION: '' - - PACKAGE_SPEC_ID: 7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8 + - PACKAGE_SPEC_ID: d10bc84044e1ad705f48cd51591b05ee5e1e7dd5 steps: - setup_remote_docker: docker_layer_caching: false @@ -1427,7 +1427,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8-{{checksum ".buildcache/cache-keys/package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8"}} + key: package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5-{{checksum ".buildcache/cache-keys/package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5"}} name: Restore package cache - run: command: |2 @@ -1443,11 +1443,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -1473,7 +1473,7 @@ jobs: command: ls -lahR .buildcache/packages name: List packages - save_cache: - key: package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8-{{checksum ".buildcache/cache-keys/package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8"}} + key: package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5-{{checksum ".buildcache/cache-keys/package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5"}} name: Save package cache paths: - .buildcache/packages/store @@ -1488,7 +1488,7 @@ jobs: name: Run SQL PgTap Tests working_directory: ~/boundary workflows: - build-fd66eb9f99de501d: + build-645fb387fb0a87de: jobs: - build-common-layers - darwin_amd64_package: diff --git a/.circleci/config/@build-release.yml b/.circleci/config/@build-release.yml index 2464aff7a..7432efd84 100644 --- a/.circleci/config/@build-release.yml +++ b/.circleci/config/@build-release.yml @@ -30,14 +30,14 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Layer Cache: copy-source' - run: - command: LAYER_SPEC_ID=03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 make -C packages*.lock load-builder-cache + command: LAYER_SPEC_ID=03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 make -C packages*.lock load-builder-cache name: Load whatever builder cache we have (if any) into the Docker daemon - run: command: |2- @@ -53,7 +53,7 @@ jobs: echo " attempts to directly clone private repositories." fi - make -f packages*.lock/layer.mk 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16-image + make -f packages*.lock/layer.mk 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c-image name: Build base layer - run: command: |2- @@ -69,7 +69,7 @@ jobs: echo " attempts to directly clone private repositories." fi - make -f packages*.lock/layer.mk 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a-image + make -f packages*.lock/layer.mk 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1-image name: Build ui layer - run: command: |2- @@ -85,7 +85,7 @@ jobs: echo " attempts to directly clone private repositories." fi - make -f packages*.lock/layer.mk 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3-image + make -f packages*.lock/layer.mk 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e-image name: Build go-modules layer - run: command: |2- @@ -101,7 +101,7 @@ jobs: echo " attempts to directly clone private repositories." fi - make -f packages*.lock/layer.mk 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1-image + make -f packages*.lock/layer.mk 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7-image name: Build copy-source layer - run: command: |2- @@ -117,12 +117,12 @@ jobs: echo " attempts to directly clone private repositories." fi - make -f packages*.lock/layer.mk 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1-save + make -f packages*.lock/layer.mk 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7-save name: Build copy-source layer - save_cache: paths: - - .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + - .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} name: 'Save Layer Cache: copy-source' bundle-releases: executor: builder @@ -136,49 +136,49 @@ jobs: command: mkdir -p .buildcache && echo "*" > .buildcache/.gitignore name: Ignore .buildcache - restore_cache: - key: package-ddd70200153c0e65302afe88a629b4440e8eebfa-{{checksum ".buildcache/cache-keys/package-ddd70200153c0e65302afe88a629b4440e8eebfa"}} + key: package-2bb9488232c945d6800cc3a4a461d9b17503bccc-{{checksum ".buildcache/cache-keys/package-2bb9488232c945d6800cc3a4a461d9b17503bccc"}} name: Restore package cache - restore_cache: - key: package-dca0ba02c8e7351c77442c86523f121a8c83039e-{{checksum ".buildcache/cache-keys/package-dca0ba02c8e7351c77442c86523f121a8c83039e"}} + key: package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2-{{checksum ".buildcache/cache-keys/package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2"}} name: Restore package cache - restore_cache: - key: package-72b242aa7004a2a706bd894df71c002671e8e425-{{checksum ".buildcache/cache-keys/package-72b242aa7004a2a706bd894df71c002671e8e425"}} + key: package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5-{{checksum ".buildcache/cache-keys/package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5"}} name: Restore package cache - restore_cache: - key: package-2409a41c5c5a434b5dbf77d29deb31a24c825dea-{{checksum ".buildcache/cache-keys/package-2409a41c5c5a434b5dbf77d29deb31a24c825dea"}} + key: package-822b1aa9954becb7a9cb480784ff9f99783a8d23-{{checksum ".buildcache/cache-keys/package-822b1aa9954becb7a9cb480784ff9f99783a8d23"}} name: Restore package cache - restore_cache: - key: package-1439f62f659d115a6675bef8de63d7a576370da6-{{checksum ".buildcache/cache-keys/package-1439f62f659d115a6675bef8de63d7a576370da6"}} + key: package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a-{{checksum ".buildcache/cache-keys/package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a"}} name: Restore package cache - restore_cache: - key: package-192814968c68e1c819d216b95925afb4099aaa07-{{checksum ".buildcache/cache-keys/package-192814968c68e1c819d216b95925afb4099aaa07"}} + key: package-03d32b4b7349ceac506ca889be4772fe8239ecd8-{{checksum ".buildcache/cache-keys/package-03d32b4b7349ceac506ca889be4772fe8239ecd8"}} name: Restore package cache - restore_cache: - key: package-b734ede0c13f22ffc1835626300d3b3226acaf53-{{checksum ".buildcache/cache-keys/package-b734ede0c13f22ffc1835626300d3b3226acaf53"}} + key: package-ab3b6922ce2bd0fab200dddd6127544427b89fef-{{checksum ".buildcache/cache-keys/package-ab3b6922ce2bd0fab200dddd6127544427b89fef"}} name: Restore package cache - restore_cache: - key: package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa-{{checksum ".buildcache/cache-keys/package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa"}} + key: package-7f1216479517d6c6122fd8928ff44c046eb3a377-{{checksum ".buildcache/cache-keys/package-7f1216479517d6c6122fd8928ff44c046eb3a377"}} name: Restore package cache - restore_cache: - key: package-b9d9cc299dc96f89f71285c520b4cd244879207a-{{checksum ".buildcache/cache-keys/package-b9d9cc299dc96f89f71285c520b4cd244879207a"}} + key: package-7fae91402a49def23c2453fe147c262f1377eac3-{{checksum ".buildcache/cache-keys/package-7fae91402a49def23c2453fe147c262f1377eac3"}} name: Restore package cache - restore_cache: - key: package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d-{{checksum ".buildcache/cache-keys/package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d"}} + key: package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8-{{checksum ".buildcache/cache-keys/package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8"}} name: Restore package cache - restore_cache: - key: package-489303d43b63583b456fef92eeef9806a25ef98d-{{checksum ".buildcache/cache-keys/package-489303d43b63583b456fef92eeef9806a25ef98d"}} + key: package-b0201f2d2d1b04f519e0d091fbe23997252c5f70-{{checksum ".buildcache/cache-keys/package-b0201f2d2d1b04f519e0d091fbe23997252c5f70"}} name: Restore package cache - restore_cache: - key: package-394f426443d3ce6446a86a2982253a2637c061e0-{{checksum ".buildcache/cache-keys/package-394f426443d3ce6446a86a2982253a2637c061e0"}} + key: package-51ea70d1d613481fac829f239f1f081c5ad6c88b-{{checksum ".buildcache/cache-keys/package-51ea70d1d613481fac829f239f1f081c5ad6c88b"}} name: Restore package cache - restore_cache: - key: package-e13e5614c5583baf504ebe29fbf99c21f9447926-{{checksum ".buildcache/cache-keys/package-e13e5614c5583baf504ebe29fbf99c21f9447926"}} + key: package-19efae459acdaea98d804c26c554640ab3544553-{{checksum ".buildcache/cache-keys/package-19efae459acdaea98d804c26c554640ab3544553"}} name: Restore package cache - restore_cache: - key: package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9-{{checksum ".buildcache/cache-keys/package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9"}} + key: package-44f600485ac3823fa4e0dbba45763d932187225a-{{checksum ".buildcache/cache-keys/package-44f600485ac3823fa4e0dbba45763d932187225a"}} name: Restore package cache - restore_cache: - key: package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8-{{checksum ".buildcache/cache-keys/package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8"}} + key: package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5-{{checksum ".buildcache/cache-keys/package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5"}} name: Restore package cache - run: command: make package-meta-all @@ -190,20 +190,20 @@ jobs: command: ls -lahR .buildcache name: List Build Cache - run: - command: cp packages*.lock/pkgs.yml lockfile-fd66eb9f99de501d.yml + command: cp packages*.lock/pkgs.yml lockfile-645fb387fb0a87de.yml name: Update Lockfile Name - run: - command: tar -czf packages-fd66eb9f99de501d.tar.gz .buildcache/packages lockfile-fd66eb9f99de501d.yml + command: tar -czf packages-645fb387fb0a87de.tar.gz .buildcache/packages lockfile-645fb387fb0a87de.yml name: Create Raw Package Tarball - run: - command: tar -czf meta-fd66eb9f99de501d.tar.gz .buildcache/packages/store/*.json lockfile-fd66eb9f99de501d.yml + command: tar -czf meta-645fb387fb0a87de.tar.gz .buildcache/packages/store/*.json lockfile-645fb387fb0a87de.yml name: Create Metadata Tarball - store_artifacts: - path: lockfile-fd66eb9f99de501d.yml + path: lockfile-645fb387fb0a87de.yml - store_artifacts: - path: packages-fd66eb9f99de501d.tar.gz + path: packages-645fb387fb0a87de.tar.gz - store_artifacts: - path: meta-fd66eb9f99de501d.tar.gz + path: meta-645fb387fb0a87de.tar.gz - store_artifacts: path: .buildcache/packages darwin_amd64_package: @@ -221,7 +221,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-ddd70200153c0e65302afe88a629b4440e8eebfa-{{checksum ".buildcache/cache-keys/package-ddd70200153c0e65302afe88a629b4440e8eebfa"}} + key: package-2bb9488232c945d6800cc3a4a461d9b17503bccc-{{checksum ".buildcache/cache-keys/package-2bb9488232c945d6800cc3a4a461d9b17503bccc"}} name: Restore package cache - run: command: |2 @@ -237,11 +237,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -269,10 +269,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-ddd70200153c0e65302afe88a629b4440e8eebfa-{{checksum ".buildcache/cache-keys/package-ddd70200153c0e65302afe88a629b4440e8eebfa"}} + key: package-2bb9488232c945d6800cc3a4a461d9b17503bccc-{{checksum ".buildcache/cache-keys/package-2bb9488232c945d6800cc3a4a461d9b17503bccc"}} name: Save package cache environment: - PACKAGE_SPEC_ID: ddd70200153c0e65302afe88a629b4440e8eebfa + PACKAGE_SPEC_ID: 2bb9488232c945d6800cc3a4a461d9b17503bccc freebsd_386_package: executor: builder steps: @@ -288,7 +288,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-dca0ba02c8e7351c77442c86523f121a8c83039e-{{checksum ".buildcache/cache-keys/package-dca0ba02c8e7351c77442c86523f121a8c83039e"}} + key: package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2-{{checksum ".buildcache/cache-keys/package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2"}} name: Restore package cache - run: command: |2 @@ -304,11 +304,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -336,10 +336,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-dca0ba02c8e7351c77442c86523f121a8c83039e-{{checksum ".buildcache/cache-keys/package-dca0ba02c8e7351c77442c86523f121a8c83039e"}} + key: package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2-{{checksum ".buildcache/cache-keys/package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2"}} name: Save package cache environment: - PACKAGE_SPEC_ID: dca0ba02c8e7351c77442c86523f121a8c83039e + PACKAGE_SPEC_ID: e9f9d34c2c14f59f68c31469b7bfa994074a48c2 freebsd_amd64_package: executor: builder steps: @@ -355,7 +355,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-72b242aa7004a2a706bd894df71c002671e8e425-{{checksum ".buildcache/cache-keys/package-72b242aa7004a2a706bd894df71c002671e8e425"}} + key: package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5-{{checksum ".buildcache/cache-keys/package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5"}} name: Restore package cache - run: command: |2 @@ -371,11 +371,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -403,10 +403,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-72b242aa7004a2a706bd894df71c002671e8e425-{{checksum ".buildcache/cache-keys/package-72b242aa7004a2a706bd894df71c002671e8e425"}} + key: package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5-{{checksum ".buildcache/cache-keys/package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5"}} name: Save package cache environment: - PACKAGE_SPEC_ID: 72b242aa7004a2a706bd894df71c002671e8e425 + PACKAGE_SPEC_ID: 3e2a1075872eae7608bf8be4b74f7291ca88d5b5 freebsd_arm_package: executor: builder steps: @@ -422,7 +422,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-2409a41c5c5a434b5dbf77d29deb31a24c825dea-{{checksum ".buildcache/cache-keys/package-2409a41c5c5a434b5dbf77d29deb31a24c825dea"}} + key: package-822b1aa9954becb7a9cb480784ff9f99783a8d23-{{checksum ".buildcache/cache-keys/package-822b1aa9954becb7a9cb480784ff9f99783a8d23"}} name: Restore package cache - run: command: |2 @@ -438,11 +438,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -470,10 +470,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-2409a41c5c5a434b5dbf77d29deb31a24c825dea-{{checksum ".buildcache/cache-keys/package-2409a41c5c5a434b5dbf77d29deb31a24c825dea"}} + key: package-822b1aa9954becb7a9cb480784ff9f99783a8d23-{{checksum ".buildcache/cache-keys/package-822b1aa9954becb7a9cb480784ff9f99783a8d23"}} name: Save package cache environment: - PACKAGE_SPEC_ID: 2409a41c5c5a434b5dbf77d29deb31a24c825dea + PACKAGE_SPEC_ID: 822b1aa9954becb7a9cb480784ff9f99783a8d23 linux_386_package: executor: builder steps: @@ -489,7 +489,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-1439f62f659d115a6675bef8de63d7a576370da6-{{checksum ".buildcache/cache-keys/package-1439f62f659d115a6675bef8de63d7a576370da6"}} + key: package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a-{{checksum ".buildcache/cache-keys/package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a"}} name: Restore package cache - run: command: |2 @@ -505,11 +505,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -537,10 +537,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-1439f62f659d115a6675bef8de63d7a576370da6-{{checksum ".buildcache/cache-keys/package-1439f62f659d115a6675bef8de63d7a576370da6"}} + key: package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a-{{checksum ".buildcache/cache-keys/package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a"}} name: Save package cache environment: - PACKAGE_SPEC_ID: 1439f62f659d115a6675bef8de63d7a576370da6 + PACKAGE_SPEC_ID: 7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a linux_amd64_package: executor: builder steps: @@ -556,7 +556,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-192814968c68e1c819d216b95925afb4099aaa07-{{checksum ".buildcache/cache-keys/package-192814968c68e1c819d216b95925afb4099aaa07"}} + key: package-03d32b4b7349ceac506ca889be4772fe8239ecd8-{{checksum ".buildcache/cache-keys/package-03d32b4b7349ceac506ca889be4772fe8239ecd8"}} name: Restore package cache - run: command: |2 @@ -572,11 +572,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -604,10 +604,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-192814968c68e1c819d216b95925afb4099aaa07-{{checksum ".buildcache/cache-keys/package-192814968c68e1c819d216b95925afb4099aaa07"}} + key: package-03d32b4b7349ceac506ca889be4772fe8239ecd8-{{checksum ".buildcache/cache-keys/package-03d32b4b7349ceac506ca889be4772fe8239ecd8"}} name: Save package cache environment: - PACKAGE_SPEC_ID: 192814968c68e1c819d216b95925afb4099aaa07 + PACKAGE_SPEC_ID: 03d32b4b7349ceac506ca889be4772fe8239ecd8 linux_arm_package: executor: builder steps: @@ -623,7 +623,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-b734ede0c13f22ffc1835626300d3b3226acaf53-{{checksum ".buildcache/cache-keys/package-b734ede0c13f22ffc1835626300d3b3226acaf53"}} + key: package-ab3b6922ce2bd0fab200dddd6127544427b89fef-{{checksum ".buildcache/cache-keys/package-ab3b6922ce2bd0fab200dddd6127544427b89fef"}} name: Restore package cache - run: command: |2 @@ -639,11 +639,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -671,10 +671,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-b734ede0c13f22ffc1835626300d3b3226acaf53-{{checksum ".buildcache/cache-keys/package-b734ede0c13f22ffc1835626300d3b3226acaf53"}} + key: package-ab3b6922ce2bd0fab200dddd6127544427b89fef-{{checksum ".buildcache/cache-keys/package-ab3b6922ce2bd0fab200dddd6127544427b89fef"}} name: Save package cache environment: - PACKAGE_SPEC_ID: b734ede0c13f22ffc1835626300d3b3226acaf53 + PACKAGE_SPEC_ID: ab3b6922ce2bd0fab200dddd6127544427b89fef linux_arm64_package: executor: builder steps: @@ -690,7 +690,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa-{{checksum ".buildcache/cache-keys/package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa"}} + key: package-7f1216479517d6c6122fd8928ff44c046eb3a377-{{checksum ".buildcache/cache-keys/package-7f1216479517d6c6122fd8928ff44c046eb3a377"}} name: Restore package cache - run: command: |2 @@ -706,11 +706,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -738,10 +738,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa-{{checksum ".buildcache/cache-keys/package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa"}} + key: package-7f1216479517d6c6122fd8928ff44c046eb3a377-{{checksum ".buildcache/cache-keys/package-7f1216479517d6c6122fd8928ff44c046eb3a377"}} name: Save package cache environment: - PACKAGE_SPEC_ID: a1ae7292c28d5e629eea144b2fafb6f234ca4ffa + PACKAGE_SPEC_ID: 7f1216479517d6c6122fd8928ff44c046eb3a377 netbsd_386_package: executor: builder steps: @@ -757,7 +757,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-b9d9cc299dc96f89f71285c520b4cd244879207a-{{checksum ".buildcache/cache-keys/package-b9d9cc299dc96f89f71285c520b4cd244879207a"}} + key: package-7fae91402a49def23c2453fe147c262f1377eac3-{{checksum ".buildcache/cache-keys/package-7fae91402a49def23c2453fe147c262f1377eac3"}} name: Restore package cache - run: command: |2 @@ -773,11 +773,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -805,10 +805,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-b9d9cc299dc96f89f71285c520b4cd244879207a-{{checksum ".buildcache/cache-keys/package-b9d9cc299dc96f89f71285c520b4cd244879207a"}} + key: package-7fae91402a49def23c2453fe147c262f1377eac3-{{checksum ".buildcache/cache-keys/package-7fae91402a49def23c2453fe147c262f1377eac3"}} name: Save package cache environment: - PACKAGE_SPEC_ID: b9d9cc299dc96f89f71285c520b4cd244879207a + PACKAGE_SPEC_ID: 7fae91402a49def23c2453fe147c262f1377eac3 netbsd_amd64_package: executor: builder steps: @@ -824,7 +824,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d-{{checksum ".buildcache/cache-keys/package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d"}} + key: package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8-{{checksum ".buildcache/cache-keys/package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8"}} name: Restore package cache - run: command: |2 @@ -840,11 +840,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -872,10 +872,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d-{{checksum ".buildcache/cache-keys/package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d"}} + key: package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8-{{checksum ".buildcache/cache-keys/package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8"}} name: Save package cache environment: - PACKAGE_SPEC_ID: 744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d + PACKAGE_SPEC_ID: c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8 openbsd_386_package: executor: builder steps: @@ -891,7 +891,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-489303d43b63583b456fef92eeef9806a25ef98d-{{checksum ".buildcache/cache-keys/package-489303d43b63583b456fef92eeef9806a25ef98d"}} + key: package-b0201f2d2d1b04f519e0d091fbe23997252c5f70-{{checksum ".buildcache/cache-keys/package-b0201f2d2d1b04f519e0d091fbe23997252c5f70"}} name: Restore package cache - run: command: |2 @@ -907,11 +907,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -939,10 +939,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-489303d43b63583b456fef92eeef9806a25ef98d-{{checksum ".buildcache/cache-keys/package-489303d43b63583b456fef92eeef9806a25ef98d"}} + key: package-b0201f2d2d1b04f519e0d091fbe23997252c5f70-{{checksum ".buildcache/cache-keys/package-b0201f2d2d1b04f519e0d091fbe23997252c5f70"}} name: Save package cache environment: - PACKAGE_SPEC_ID: 489303d43b63583b456fef92eeef9806a25ef98d + PACKAGE_SPEC_ID: b0201f2d2d1b04f519e0d091fbe23997252c5f70 openbsd_amd64_package: executor: builder steps: @@ -958,7 +958,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-394f426443d3ce6446a86a2982253a2637c061e0-{{checksum ".buildcache/cache-keys/package-394f426443d3ce6446a86a2982253a2637c061e0"}} + key: package-51ea70d1d613481fac829f239f1f081c5ad6c88b-{{checksum ".buildcache/cache-keys/package-51ea70d1d613481fac829f239f1f081c5ad6c88b"}} name: Restore package cache - run: command: |2 @@ -974,11 +974,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -1006,10 +1006,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-394f426443d3ce6446a86a2982253a2637c061e0-{{checksum ".buildcache/cache-keys/package-394f426443d3ce6446a86a2982253a2637c061e0"}} + key: package-51ea70d1d613481fac829f239f1f081c5ad6c88b-{{checksum ".buildcache/cache-keys/package-51ea70d1d613481fac829f239f1f081c5ad6c88b"}} name: Save package cache environment: - PACKAGE_SPEC_ID: 394f426443d3ce6446a86a2982253a2637c061e0 + PACKAGE_SPEC_ID: 51ea70d1d613481fac829f239f1f081c5ad6c88b solaris_amd64_package: executor: builder steps: @@ -1025,7 +1025,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-e13e5614c5583baf504ebe29fbf99c21f9447926-{{checksum ".buildcache/cache-keys/package-e13e5614c5583baf504ebe29fbf99c21f9447926"}} + key: package-19efae459acdaea98d804c26c554640ab3544553-{{checksum ".buildcache/cache-keys/package-19efae459acdaea98d804c26c554640ab3544553"}} name: Restore package cache - run: command: |2 @@ -1041,11 +1041,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -1073,10 +1073,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-e13e5614c5583baf504ebe29fbf99c21f9447926-{{checksum ".buildcache/cache-keys/package-e13e5614c5583baf504ebe29fbf99c21f9447926"}} + key: package-19efae459acdaea98d804c26c554640ab3544553-{{checksum ".buildcache/cache-keys/package-19efae459acdaea98d804c26c554640ab3544553"}} name: Save package cache environment: - PACKAGE_SPEC_ID: e13e5614c5583baf504ebe29fbf99c21f9447926 + PACKAGE_SPEC_ID: 19efae459acdaea98d804c26c554640ab3544553 windows_386_package: executor: builder steps: @@ -1092,7 +1092,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9-{{checksum ".buildcache/cache-keys/package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9"}} + key: package-44f600485ac3823fa4e0dbba45763d932187225a-{{checksum ".buildcache/cache-keys/package-44f600485ac3823fa4e0dbba45763d932187225a"}} name: Restore package cache - run: command: |2 @@ -1108,11 +1108,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -1140,10 +1140,10 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9-{{checksum ".buildcache/cache-keys/package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9"}} + key: package-44f600485ac3823fa4e0dbba45763d932187225a-{{checksum ".buildcache/cache-keys/package-44f600485ac3823fa4e0dbba45763d932187225a"}} name: Save package cache environment: - PACKAGE_SPEC_ID: 3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9 + PACKAGE_SPEC_ID: 44f600485ac3823fa4e0dbba45763d932187225a windows_amd64_package: executor: builder steps: @@ -1159,7 +1159,7 @@ jobs: command: make -C packages*.lock write-package-cache-key name: Write package cache key - restore_cache: - key: package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8-{{checksum ".buildcache/cache-keys/package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8"}} + key: package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5-{{checksum ".buildcache/cache-keys/package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5"}} name: Restore package cache - run: command: |2 @@ -1175,11 +1175,11 @@ jobs: command: make -C packages*.lock write-builder-cache-keys name: Write builder layer cache keys - restore_cache: - key: copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} + key: copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} keys: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} name: 'Restore Builder Image Cache: copy-source' - run: command: make -C packages*.lock load-builder-cache @@ -1207,12 +1207,12 @@ jobs: - save_cache: paths: - .buildcache/packages/store - key: package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8-{{checksum ".buildcache/cache-keys/package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8"}} + key: package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5-{{checksum ".buildcache/cache-keys/package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5"}} name: Save package cache environment: - PACKAGE_SPEC_ID: 7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8 + PACKAGE_SPEC_ID: d10bc84044e1ad705f48cd51591b05ee5e1e7dd5 workflows: - build-fd66eb9f99de501d: + build-645fb387fb0a87de: jobs: - build-common-layers: {} - darwin_amd64_package: diff --git a/CHANGELOG.md b/CHANGELOG.md index a80d2dec9..d6b8de7b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Canonical reference for changes, improvements, and bugfixes for Boundary. ## Next +## 0.6.2 (2021/09/27) + ### Deprecations/Changes * permissions: Fix bug in _Host Sets_ service that authenticated requests diff --git a/Makefile b/Makefile index a6f49ce05..7f0c5321d 100644 --- a/Makefile +++ b/Makefile @@ -178,7 +178,7 @@ install-go: # Docker build and publish variables and targets REGISTRY_NAME?=docker.io/hashicorp IMAGE_NAME=boundary -VERSION?=0.6.1 +VERSION?=0.6.2 IMAGE_TAG=$(REGISTRY_NAME)/$(IMAGE_NAME):$(VERSION) IMAGE_TAG_DEV=$(REGISTRY_NAME)/$(IMAGE_NAME):latest-$(shell git rev-parse --short HEAD) DOCKER_DIR=./docker diff --git a/ci/goinstall.sh b/ci/goinstall.sh index 1a4281d7a..41fe00c30 100755 --- a/ci/goinstall.sh +++ b/ci/goinstall.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -VERSION="1.16.7" +VERSION="1.17.1" [ -z "$GOROOT" ] && GOROOT="$HOME/.go" [ -z "$GOPATH" ] && GOPATH="$HOME/go" diff --git a/docker/Release.dockerfile b/docker/Release.dockerfile index 2a52c965f..5213ea63a 100644 --- a/docker/Release.dockerfile +++ b/docker/Release.dockerfile @@ -1,6 +1,6 @@ FROM docker.mirror.hashicorp.services/alpine:3.13.6 -ARG VERSION=0.6.1 +ARG VERSION=0.6.2 LABEL name="Boundary" \ maintainer="HashiCorp Boundary Team " \ diff --git a/packages-oss.lock/layers/layers.mk b/packages-oss.lock/layers/layers.mk index 79f896c99..033224407 100755 --- a/packages-oss.lock/layers/layers.mk +++ b/packages-oss.lock/layers/layers.mk @@ -2,38 +2,38 @@ # WARNING: Do not EDIT or MERGE this file, it is generated by packagespec. # *** -LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_ID := 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 -LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_TYPE := base -LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_BASE_LAYER := -LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_SOURCE_INCLUDE := -LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_SOURCE_EXCLUDE := -LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_CACHE_KEY_FILE := .buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16 -LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_ARCHIVE_FILE := .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz -$(eval $(call LAYER,$(LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_ID),$(LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_TYPE),$(LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_BASE_LAYER),$(LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_SOURCE_INCLUDE),$(LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_SOURCE_EXCLUDE),$(LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_CACHE_KEY_FILE),$(LAYER_00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16_ARCHIVE_FILE))) +LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_ID := 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c +LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_TYPE := base +LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_BASE_LAYER := +LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_SOURCE_INCLUDE := +LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_SOURCE_EXCLUDE := +LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_CACHE_KEY_FILE := .buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c +LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_ARCHIVE_FILE := .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz +$(eval $(call LAYER,$(LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_ID),$(LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_TYPE),$(LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_BASE_LAYER),$(LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_SOURCE_INCLUDE),$(LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_SOURCE_EXCLUDE),$(LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_CACHE_KEY_FILE),$(LAYER_00-base-2017dceda969e0eab6fd00cab602c9a05538de9c_ARCHIVE_FILE))) -LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_ID := 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a -LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_TYPE := ui -LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_BASE_LAYER := 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 -LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_SOURCE_INCLUDE := internal/ui/VERSION -LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_SOURCE_EXCLUDE := -LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_CACHE_KEY_FILE := .buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a -LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_ARCHIVE_FILE := .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz -$(eval $(call LAYER,$(LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_ID),$(LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_TYPE),$(LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_BASE_LAYER),$(LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_SOURCE_INCLUDE),$(LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_SOURCE_EXCLUDE),$(LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_CACHE_KEY_FILE),$(LAYER_01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a_ARCHIVE_FILE))) +LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_ID := 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 +LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_TYPE := ui +LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_BASE_LAYER := 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c +LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_SOURCE_INCLUDE := internal/ui/VERSION +LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_SOURCE_EXCLUDE := +LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_CACHE_KEY_FILE := .buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 +LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_ARCHIVE_FILE := .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz +$(eval $(call LAYER,$(LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_ID),$(LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_TYPE),$(LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_BASE_LAYER),$(LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_SOURCE_INCLUDE),$(LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_SOURCE_EXCLUDE),$(LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_CACHE_KEY_FILE),$(LAYER_01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1_ARCHIVE_FILE))) -LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_ID := 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 -LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_TYPE := go-modules -LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_BASE_LAYER := 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a -LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_SOURCE_INCLUDE := go.mod go.sum */go.mod */go.sum -LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_SOURCE_EXCLUDE := -LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_CACHE_KEY_FILE := .buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 -LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_ARCHIVE_FILE := .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz -$(eval $(call LAYER,$(LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_ID),$(LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_TYPE),$(LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_BASE_LAYER),$(LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_SOURCE_INCLUDE),$(LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_SOURCE_EXCLUDE),$(LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_CACHE_KEY_FILE),$(LAYER_02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3_ARCHIVE_FILE))) +LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_ID := 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e +LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_TYPE := go-modules +LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_BASE_LAYER := 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 +LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_SOURCE_INCLUDE := go.mod go.sum */go.mod */go.sum +LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_SOURCE_EXCLUDE := +LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_CACHE_KEY_FILE := .buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e +LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_ARCHIVE_FILE := .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz +$(eval $(call LAYER,$(LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_ID),$(LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_TYPE),$(LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_BASE_LAYER),$(LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_SOURCE_INCLUDE),$(LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_SOURCE_EXCLUDE),$(LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_CACHE_KEY_FILE),$(LAYER_02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e_ARCHIVE_FILE))) -LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_ID := 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 -LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_TYPE := copy-source -LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_BASE_LAYER := 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 -LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_SOURCE_INCLUDE := *.go -LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_SOURCE_EXCLUDE := -LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 -LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_ARCHIVE_FILE := .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz -$(eval $(call LAYER,$(LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_ID),$(LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_TYPE),$(LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_BASE_LAYER),$(LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_SOURCE_INCLUDE),$(LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_SOURCE_EXCLUDE),$(LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_CACHE_KEY_FILE),$(LAYER_03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1_ARCHIVE_FILE))) +LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_ID := 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 +LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_TYPE := copy-source +LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_BASE_LAYER := 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e +LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_SOURCE_INCLUDE := *.go +LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_SOURCE_EXCLUDE := +LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 +LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_ARCHIVE_FILE := .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz +$(eval $(call LAYER,$(LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_ID),$(LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_TYPE),$(LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_BASE_LAYER),$(LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_SOURCE_INCLUDE),$(LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_SOURCE_EXCLUDE),$(LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_CACHE_KEY_FILE),$(LAYER_03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7_ARCHIVE_FILE))) diff --git a/packages-oss.lock/pkgs.yml b/packages-oss.lock/pkgs.yml index fa197ab48..8a21e83b1 100644 --- a/packages-oss.lock/pkgs.yml +++ b/packages-oss.lock/pkgs.yml @@ -1,11 +1,11 @@ # *** # WARNING: Do not EDIT or MERGE this file, it is generated by packagespec. # *** -lockid: fd66eb9f99de501d +lockid: 645fb387fb0a87de packagespec-version: 0.2.6 cache-version: 10 packages: - - packagespecid: ddd70200153c0e65302afe88a629b4440e8eebfa + - packagespecid: 2bb9488232c945d6800cc3a4a461d9b17503bccc inputs: BINARY_NAME: boundary BUILD_TAGS: ui @@ -13,42 +13,42 @@ packages: GOARCH: amd64 GOOS: darwin PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: darwin_amd64_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-ddd70200153c0e65302afe88a629b4440e8eebfa + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-2bb9488232c945d6800cc3a4a461d9b17503bccc POST_PROCESSORS: apple-notarize av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-ddd70200153c0e65302afe88a629b4440e8eebfa-{{checksum ".buildcache/cache-keys/package-ddd70200153c0e65302afe88a629b4440e8eebfa"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-2bb9488232c945d6800cc3a4a461d9b17503bccc-{{checksum ".buildcache/cache-keys/package-2bb9488232c945d6800cc3a4a461d9b17503bccc"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary aliases: - type: local - path: boundary_0.6.1_darwin_amd64.zip + path: boundary_0.6.2_darwin_amd64.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_darwin_amd64.zip - - packagespecid: dca0ba02c8e7351c77442c86523f121a8c83039e + path: boundary/boundary_0.6.2/boundary_0.6.2_darwin_amd64.zip + - packagespecid: e9f9d34c2c14f59f68c31469b7bfa994074a48c2 inputs: BINARY_NAME: boundary BUILD_TAGS: ui @@ -56,42 +56,42 @@ packages: GOARCH: "386" GOOS: freebsd PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: freebsd_386_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-dca0ba02c8e7351c77442c86523f121a8c83039e + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2 POST_PROCESSORS: av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-dca0ba02c8e7351c77442c86523f121a8c83039e-{{checksum ".buildcache/cache-keys/package-dca0ba02c8e7351c77442c86523f121a8c83039e"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2-{{checksum ".buildcache/cache-keys/package-e9f9d34c2c14f59f68c31469b7bfa994074a48c2"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary aliases: - type: local - path: boundary_0.6.1_freebsd_386.zip + path: boundary_0.6.2_freebsd_386.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_freebsd_386.zip - - packagespecid: 72b242aa7004a2a706bd894df71c002671e8e425 + path: boundary/boundary_0.6.2/boundary_0.6.2_freebsd_386.zip + - packagespecid: 3e2a1075872eae7608bf8be4b74f7291ca88d5b5 inputs: BINARY_NAME: boundary BUILD_TAGS: ui @@ -99,42 +99,42 @@ packages: GOARCH: amd64 GOOS: freebsd PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: freebsd_amd64_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-72b242aa7004a2a706bd894df71c002671e8e425 + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5 POST_PROCESSORS: av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-72b242aa7004a2a706bd894df71c002671e8e425-{{checksum ".buildcache/cache-keys/package-72b242aa7004a2a706bd894df71c002671e8e425"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5-{{checksum ".buildcache/cache-keys/package-3e2a1075872eae7608bf8be4b74f7291ca88d5b5"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary aliases: - type: local - path: boundary_0.6.1_freebsd_amd64.zip + path: boundary_0.6.2_freebsd_amd64.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_freebsd_amd64.zip - - packagespecid: 2409a41c5c5a434b5dbf77d29deb31a24c825dea + path: boundary/boundary_0.6.2/boundary_0.6.2_freebsd_amd64.zip + - packagespecid: 822b1aa9954becb7a9cb480784ff9f99783a8d23 inputs: BINARY_NAME: boundary BUILD_TAGS: ui @@ -142,42 +142,42 @@ packages: GOARCH: arm GOOS: freebsd PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: freebsd_arm_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-2409a41c5c5a434b5dbf77d29deb31a24c825dea + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-822b1aa9954becb7a9cb480784ff9f99783a8d23 POST_PROCESSORS: av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-2409a41c5c5a434b5dbf77d29deb31a24c825dea-{{checksum ".buildcache/cache-keys/package-2409a41c5c5a434b5dbf77d29deb31a24c825dea"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-822b1aa9954becb7a9cb480784ff9f99783a8d23-{{checksum ".buildcache/cache-keys/package-822b1aa9954becb7a9cb480784ff9f99783a8d23"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary aliases: - type: local - path: boundary_0.6.1_freebsd_arm.zip + path: boundary_0.6.2_freebsd_arm.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_freebsd_arm.zip - - packagespecid: 1439f62f659d115a6675bef8de63d7a576370da6 + path: boundary/boundary_0.6.2/boundary_0.6.2_freebsd_arm.zip + - packagespecid: 7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a inputs: BINARY_NAME: boundary BUILD_TAGS: ui @@ -185,42 +185,42 @@ packages: GOARCH: "386" GOOS: linux PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: linux_386_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-1439f62f659d115a6675bef8de63d7a576370da6 + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a POST_PROCESSORS: av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-1439f62f659d115a6675bef8de63d7a576370da6-{{checksum ".buildcache/cache-keys/package-1439f62f659d115a6675bef8de63d7a576370da6"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a-{{checksum ".buildcache/cache-keys/package-7fd6bd8ba41907a8ad8d09a9ed3c43fb94801f2a"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary aliases: - type: local - path: boundary_0.6.1_linux_386.zip + path: boundary_0.6.2_linux_386.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_linux_386.zip - - packagespecid: 192814968c68e1c819d216b95925afb4099aaa07 + path: boundary/boundary_0.6.2/boundary_0.6.2_linux_386.zip + - packagespecid: 03d32b4b7349ceac506ca889be4772fe8239ecd8 inputs: BINARY_NAME: boundary BUILD_TAGS: ui @@ -228,42 +228,42 @@ packages: GOARCH: amd64 GOOS: linux PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: linux_amd64_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-192814968c68e1c819d216b95925afb4099aaa07 + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-03d32b4b7349ceac506ca889be4772fe8239ecd8 POST_PROCESSORS: av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-192814968c68e1c819d216b95925afb4099aaa07-{{checksum ".buildcache/cache-keys/package-192814968c68e1c819d216b95925afb4099aaa07"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-03d32b4b7349ceac506ca889be4772fe8239ecd8-{{checksum ".buildcache/cache-keys/package-03d32b4b7349ceac506ca889be4772fe8239ecd8"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary aliases: - type: local - path: boundary_0.6.1_linux_amd64.zip + path: boundary_0.6.2_linux_amd64.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_linux_amd64.zip - - packagespecid: b734ede0c13f22ffc1835626300d3b3226acaf53 + path: boundary/boundary_0.6.2/boundary_0.6.2_linux_amd64.zip + - packagespecid: ab3b6922ce2bd0fab200dddd6127544427b89fef inputs: BINARY_NAME: boundary BUILD_TAGS: ui @@ -271,42 +271,42 @@ packages: GOARCH: arm GOOS: linux PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: linux_arm_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-b734ede0c13f22ffc1835626300d3b3226acaf53 + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-ab3b6922ce2bd0fab200dddd6127544427b89fef POST_PROCESSORS: av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-b734ede0c13f22ffc1835626300d3b3226acaf53-{{checksum ".buildcache/cache-keys/package-b734ede0c13f22ffc1835626300d3b3226acaf53"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-ab3b6922ce2bd0fab200dddd6127544427b89fef-{{checksum ".buildcache/cache-keys/package-ab3b6922ce2bd0fab200dddd6127544427b89fef"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary aliases: - type: local - path: boundary_0.6.1_linux_arm.zip + path: boundary_0.6.2_linux_arm.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_linux_arm.zip - - packagespecid: a1ae7292c28d5e629eea144b2fafb6f234ca4ffa + path: boundary/boundary_0.6.2/boundary_0.6.2_linux_arm.zip + - packagespecid: 7f1216479517d6c6122fd8928ff44c046eb3a377 inputs: BINARY_NAME: boundary BUILD_TAGS: ui @@ -314,42 +314,42 @@ packages: GOARCH: arm64 GOOS: linux PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: linux_arm64_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-7f1216479517d6c6122fd8928ff44c046eb3a377 POST_PROCESSORS: av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa-{{checksum ".buildcache/cache-keys/package-a1ae7292c28d5e629eea144b2fafb6f234ca4ffa"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-7f1216479517d6c6122fd8928ff44c046eb3a377-{{checksum ".buildcache/cache-keys/package-7f1216479517d6c6122fd8928ff44c046eb3a377"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary aliases: - type: local - path: boundary_0.6.1_linux_arm64.zip + path: boundary_0.6.2_linux_arm64.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_linux_arm64.zip - - packagespecid: b9d9cc299dc96f89f71285c520b4cd244879207a + path: boundary/boundary_0.6.2/boundary_0.6.2_linux_arm64.zip + - packagespecid: 7fae91402a49def23c2453fe147c262f1377eac3 inputs: BINARY_NAME: boundary BUILD_TAGS: ui @@ -357,42 +357,42 @@ packages: GOARCH: "386" GOOS: netbsd PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: netbsd_386_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-b9d9cc299dc96f89f71285c520b4cd244879207a + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-7fae91402a49def23c2453fe147c262f1377eac3 POST_PROCESSORS: av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-b9d9cc299dc96f89f71285c520b4cd244879207a-{{checksum ".buildcache/cache-keys/package-b9d9cc299dc96f89f71285c520b4cd244879207a"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-7fae91402a49def23c2453fe147c262f1377eac3-{{checksum ".buildcache/cache-keys/package-7fae91402a49def23c2453fe147c262f1377eac3"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary aliases: - type: local - path: boundary_0.6.1_netbsd_386.zip + path: boundary_0.6.2_netbsd_386.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_netbsd_386.zip - - packagespecid: 744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d + path: boundary/boundary_0.6.2/boundary_0.6.2_netbsd_386.zip + - packagespecid: c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8 inputs: BINARY_NAME: boundary BUILD_TAGS: ui @@ -400,42 +400,42 @@ packages: GOARCH: amd64 GOOS: netbsd PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: netbsd_amd64_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8 POST_PROCESSORS: av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d-{{checksum ".buildcache/cache-keys/package-744fe90a3f2bd01206fbf95ad9d8a8db6b66d84d"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8-{{checksum ".buildcache/cache-keys/package-c9b8b9c5b6a1ab2f53599efe3792f7ebbd43a6b8"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary aliases: - type: local - path: boundary_0.6.1_netbsd_amd64.zip + path: boundary_0.6.2_netbsd_amd64.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_netbsd_amd64.zip - - packagespecid: 489303d43b63583b456fef92eeef9806a25ef98d + path: boundary/boundary_0.6.2/boundary_0.6.2_netbsd_amd64.zip + - packagespecid: b0201f2d2d1b04f519e0d091fbe23997252c5f70 inputs: BINARY_NAME: boundary BUILD_TAGS: ui @@ -443,42 +443,42 @@ packages: GOARCH: "386" GOOS: openbsd PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: openbsd_386_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-489303d43b63583b456fef92eeef9806a25ef98d + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-b0201f2d2d1b04f519e0d091fbe23997252c5f70 POST_PROCESSORS: av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-489303d43b63583b456fef92eeef9806a25ef98d-{{checksum ".buildcache/cache-keys/package-489303d43b63583b456fef92eeef9806a25ef98d"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-b0201f2d2d1b04f519e0d091fbe23997252c5f70-{{checksum ".buildcache/cache-keys/package-b0201f2d2d1b04f519e0d091fbe23997252c5f70"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary aliases: - type: local - path: boundary_0.6.1_openbsd_386.zip + path: boundary_0.6.2_openbsd_386.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_openbsd_386.zip - - packagespecid: 394f426443d3ce6446a86a2982253a2637c061e0 + path: boundary/boundary_0.6.2/boundary_0.6.2_openbsd_386.zip + - packagespecid: 51ea70d1d613481fac829f239f1f081c5ad6c88b inputs: BINARY_NAME: boundary BUILD_TAGS: ui @@ -486,42 +486,42 @@ packages: GOARCH: amd64 GOOS: openbsd PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: openbsd_amd64_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-394f426443d3ce6446a86a2982253a2637c061e0 + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-51ea70d1d613481fac829f239f1f081c5ad6c88b POST_PROCESSORS: av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-394f426443d3ce6446a86a2982253a2637c061e0-{{checksum ".buildcache/cache-keys/package-394f426443d3ce6446a86a2982253a2637c061e0"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-51ea70d1d613481fac829f239f1f081c5ad6c88b-{{checksum ".buildcache/cache-keys/package-51ea70d1d613481fac829f239f1f081c5ad6c88b"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary aliases: - type: local - path: boundary_0.6.1_openbsd_amd64.zip + path: boundary_0.6.2_openbsd_amd64.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_openbsd_amd64.zip - - packagespecid: e13e5614c5583baf504ebe29fbf99c21f9447926 + path: boundary/boundary_0.6.2/boundary_0.6.2_openbsd_amd64.zip + - packagespecid: 19efae459acdaea98d804c26c554640ab3544553 inputs: BINARY_NAME: boundary BUILD_TAGS: ui @@ -529,42 +529,42 @@ packages: GOARCH: amd64 GOOS: solaris PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: solaris_amd64_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-e13e5614c5583baf504ebe29fbf99c21f9447926 + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-19efae459acdaea98d804c26c554640ab3544553 POST_PROCESSORS: av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-e13e5614c5583baf504ebe29fbf99c21f9447926-{{checksum ".buildcache/cache-keys/package-e13e5614c5583baf504ebe29fbf99c21f9447926"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-19efae459acdaea98d804c26c554640ab3544553-{{checksum ".buildcache/cache-keys/package-19efae459acdaea98d804c26c554640ab3544553"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary aliases: - type: local - path: boundary_0.6.1_solaris_amd64.zip + path: boundary_0.6.2_solaris_amd64.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_solaris_amd64.zip - - packagespecid: 3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9 + path: boundary/boundary_0.6.2/boundary_0.6.2_solaris_amd64.zip + - packagespecid: 44f600485ac3823fa4e0dbba45763d932187225a inputs: BINARY_NAME: boundary.exe BUILD_TAGS: ui @@ -572,42 +572,42 @@ packages: GOARCH: "386" GOOS: windows PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: windows_386_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9 + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-44f600485ac3823fa4e0dbba45763d932187225a POST_PROCESSORS: microsoft-notarize av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9-{{checksum ".buildcache/cache-keys/package-3fc99d62bf311ae70f4e4d9fd3f2a063691f00b9"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary.exe ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary.exe + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-44f600485ac3823fa4e0dbba45763d932187225a-{{checksum ".buildcache/cache-keys/package-44f600485ac3823fa4e0dbba45763d932187225a"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary.exe ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary.exe aliases: - type: local - path: boundary_0.6.1_windows_386.zip + path: boundary_0.6.2_windows_386.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_windows_386.zip - - packagespecid: 7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8 + path: boundary/boundary_0.6.2/boundary_0.6.2_windows_386.zip + - packagespecid: d10bc84044e1ad705f48cd51591b05ee5e1e7dd5 inputs: BINARY_NAME: boundary.exe BUILD_TAGS: ui @@ -615,58 +615,58 @@ packages: GOARCH: amd64 GOOS: windows PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 - PRODUCT_VERSION_MMP: 0.6.1 + PRODUCT_VERSION: 0.6.2 + PRODUCT_VERSION_MMP: 0.6.2 PRODUCT_VERSION_PRE: "" meta: BUILD_JOB_NAME: windows_amd64_package - BUNDLE_NAME: boundary_0.6.1 + BUNDLE_NAME: boundary_0.6.2 builtin: BUILD_LAYERS: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz - PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8 + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz + PACKAGE_CACHE_KEY_FILE: .buildcache/cache-keys/package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5 POST_PROCESSORS: microsoft-notarize av-scan circleci: BUILDER_CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} - PACKAGE_CACHE_KEY: package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8-{{checksum ".buildcache/cache-keys/package-7f7bcfc7f39c7e62aeba7d94b345a3ebdf2ab7f8"}} - build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.1 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary.exe ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary.exe + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} + PACKAGE_CACHE_KEY: package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5-{{checksum ".buildcache/cache-keys/package-d10bc84044e1ad705f48cd51591b05ee5e1e7dd5"}} + build-command: VERSION_PKG_PATH=github.com/hashicorp/boundary/version; unset GOPATH; go build -v -tags 'ui' -ldflags "-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID -X $VERSION_PKG_PATH.Version=0.6.2 -X $VERSION_PKG_PATH.VersionPrerelease=" -o $OUTPUT_DIR/boundary.exe ./cmd/boundary && cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME boundary.exe aliases: - type: local - path: boundary_0.6.1_windows_amd64.zip + path: boundary_0.6.2_windows_amd64.zip - type: public-hc-releases - path: boundary/boundary_0.6.1/boundary_0.6.1_windows_amd64.zip -base-image: docker.mirror.hashicorp.services/golang@sha256:448a13037d13401ad9b31fabf91d6b8a3c5c35d336cc8af760b2ab4ed85d4155 + path: boundary/boundary_0.6.2/boundary_0.6.2_windows_amd64.zip +base-image: docker.mirror.hashicorp.services/golang@sha256:2a0bd53951c1b1746c5adab10e1db1495cc6f2da0a3d21818466265e34a78597 layers: - depth: 0 final: false type: base - id: ec5342e30fcbfeb5947252a8ea679fb281052d16 - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 + id: 2017dceda969e0eab6fd00cab602c9a05538de9c + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c parentname: "" parenttype: "" parentid: "" - cachekeyfile: .buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16 + cachekeyfile: .buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c sourceinclude: "" sourceexclude: "" - archivefile: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz + archivefile: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz dockerfile: | # syntax=docker.mirror.hashicorp.services/docker/dockerfile:1.1.7-experimental - FROM docker.mirror.hashicorp.services/golang@sha256:448a13037d13401ad9b31fabf91d6b8a3c5c35d336cc8af760b2ab4ed85d4155 + FROM docker.mirror.hashicorp.services/golang@sha256:2a0bd53951c1b1746c5adab10e1db1495cc6f2da0a3d21818466265e34a78597 COPY . ./ ENV \ GOPATH= \ @@ -687,24 +687,24 @@ layers: builtin: LAYER_LIST: - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz circleci: CACHE_KEY_PREFIX_LIST: - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} childcount: 1 - depth: 1 final: false type: ui - id: 8f7be629bbc1c7ec7af40fb527b15c30d590b13a - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - parentname: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 + id: f43e20c1d27527cddb9fa2f5a08420e5058396f1 + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + parentname: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c parenttype: base - parentid: ec5342e30fcbfeb5947252a8ea679fb281052d16 - cachekeyfile: .buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a + parentid: 2017dceda969e0eab6fd00cab602c9a05538de9c + cachekeyfile: .buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 sourceinclude: internal/ui/VERSION sourceexclude: "" - archivefile: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + archivefile: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz dockerfile: | # syntax=docker.mirror.hashicorp.services/docker/dockerfile:1.1.7-experimental ARG BASE_IMAGE @@ -724,28 +724,28 @@ layers: builtin: LAYER_LIST: - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz circleci: CACHE_KEY_PREFIX_LIST: - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} childcount: 1 - depth: 2 final: false type: go-modules - id: daaedd9766787e3ce8f199fada1cb849024e6ca3 - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - parentname: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a + id: 0542ebe70aa49ea525c7cd85313d5ba08f90441e + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + parentname: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 parenttype: ui - parentid: 8f7be629bbc1c7ec7af40fb527b15c30d590b13a - cachekeyfile: .buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 + parentid: f43e20c1d27527cddb9fa2f5a08420e5058396f1 + cachekeyfile: .buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e sourceinclude: go.mod go.sum */go.mod */go.sum sourceexclude: "" - archivefile: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + archivefile: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz dockerfile: | # syntax=docker.mirror.hashicorp.services/docker/dockerfile:1.1.7-experimental ARG BASE_IMAGE @@ -756,32 +756,32 @@ layers: builtin: LAYER_LIST: - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz circleci: CACHE_KEY_PREFIX_LIST: - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} childcount: 1 - depth: 3 final: true type: copy-source - id: 869b67a2513a6ba3e9d2991876cfaed368594ba1 - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - parentname: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 + id: 5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + parentname: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e parenttype: go-modules - parentid: daaedd9766787e3ce8f199fada1cb849024e6ca3 - cachekeyfile: .buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 + parentid: 0542ebe70aa49ea525c7cd85313d5ba08f90441e + cachekeyfile: .buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 sourceinclude: '*.go' sourceexclude: "" - archivefile: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + archivefile: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz dockerfile: | # syntax=docker.mirror.hashicorp.services/docker/dockerfile:1.1.7-experimental ARG BASE_IMAGE @@ -791,21 +791,21 @@ layers: builtin: LAYER_LIST: - type: copy-source - name: 03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1 - archive: .buildcache/archives/03-copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1.tar.gz + name: 03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7 + archive: .buildcache/archives/03-copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7.tar.gz - type: go-modules - name: 02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3 - archive: .buildcache/archives/02-go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3.tar.gz + name: 02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e + archive: .buildcache/archives/02-go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e.tar.gz - type: ui - name: 01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a - archive: .buildcache/archives/01-ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a.tar.gz + name: 01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1 + archive: .buildcache/archives/01-ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1.tar.gz - type: base - name: 00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16 - archive: .buildcache/archives/00-base-ec5342e30fcbfeb5947252a8ea679fb281052d16.tar.gz + name: 00-base-2017dceda969e0eab6fd00cab602c9a05538de9c + archive: .buildcache/archives/00-base-2017dceda969e0eab6fd00cab602c9a05538de9c.tar.gz circleci: CACHE_KEY_PREFIX_LIST: - - copy-source_869b_{{checksum ".buildcache/cache-keys/copy-source-869b67a2513a6ba3e9d2991876cfaed368594ba1"}} - - go-modules_daae_{{checksum ".buildcache/cache-keys/go-modules-daaedd9766787e3ce8f199fada1cb849024e6ca3"}} - - ui_8f7b_{{checksum ".buildcache/cache-keys/ui-8f7be629bbc1c7ec7af40fb527b15c30d590b13a"}} - - base_ec53_{{checksum ".buildcache/cache-keys/base-ec5342e30fcbfeb5947252a8ea679fb281052d16"}} + - copy-source_5f13_{{checksum ".buildcache/cache-keys/copy-source-5f13b2247825f6b1ba38bb75dd62a7a15469efe7"}} + - go-modules_0542_{{checksum ".buildcache/cache-keys/go-modules-0542ebe70aa49ea525c7cd85313d5ba08f90441e"}} + - ui_f43e_{{checksum ".buildcache/cache-keys/ui-f43e20c1d27527cddb9fa2f5a08420e5058396f1"}} + - base_2017_{{checksum ".buildcache/cache-keys/base-2017dceda969e0eab6fd00cab602c9a05538de9c"}} childcount: 0 diff --git a/packages-oss.yml b/packages-oss.yml index f40201554..28b2445ed 100644 --- a/packages-oss.yml +++ b/packages-oss.yml @@ -10,7 +10,7 @@ config: inputs: defaults: PRODUCT_NAME: boundary - PRODUCT_VERSION: 0.6.1 + PRODUCT_VERSION: 0.6.2 BUILD_TAGS: ui CGO_ENABLED: 0 @@ -50,8 +50,8 @@ package-aliases: template: >- boundary/{{.BUNDLE_NAME}}/{{.BUNDLE_NAME}}_{{.GOOS}}_{{.GOARCH}}.zip -# golang:1.16.7-buster -base-image: "docker.mirror.hashicorp.services/golang@sha256:448a13037d13401ad9b31fabf91d6b8a3c5c35d336cc8af760b2ab4ed85d4155" +# golang:1.17.1-buster +base-image: "docker.mirror.hashicorp.services/golang@sha256:2a0bd53951c1b1746c5adab10e1db1495cc6f2da0a3d21818466265e34a78597" layers: - name: base From c2948a2257f48b88f3e6a0ab1af5c9db5e36ccac Mon Sep 17 00:00:00 2001 From: Noel Quiles <3746694+EnMod@users.noreply.github.com> Date: Mon, 27 Sep 2021 17:47:36 -0400 Subject: [PATCH 09/18] =?UTF-8?q?Update=C2=A0alert=C2=A0banner=C2=A0for?= =?UTF-8?q?=C2=A0HashiConf=C2=A0Global=C2=A02021=20(#1566)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update alert banner for HashiConf Global 2021 * Proper formatting --- website/data/alert-banner.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/website/data/alert-banner.js b/website/data/alert-banner.js index 62ffbfca2..2fe3f3bad 100644 --- a/website/data/alert-banner.js +++ b/website/data/alert-banner.js @@ -2,11 +2,12 @@ export const ALERT_BANNER_ACTIVE = true // https://github.com/hashicorp/web-components/tree/master/packages/alert-banner export default { - tag: 'Event', - url: 'https://hashiconf.com/global/?utm_campaign=22Q3_WW_HASHICONFGLOBAL_EVENT-USER&utm_source=CorpBanner&utm_medium=EVT&utm_offer=EVENT-USER', - text: 'Join us for HashiConf Global - product updates, technical sessions, workshops & more', - linkText: 'Register now', - // Set the expirationDate prop with a datetime string (e.g. '2020-01-31T12:00:00-07:00') - // if you'd like the component to stop showing at or after a certain date - expirationDate: '2021-10-01T12:00:00-07:00', + tag: 'Oct 19-21', + url: + 'https://hashiconf.com/global/?utm_campaign=22Q3_WW_HASHICONFGLOBAL_EVENT-USER&utm_source=CorpBanner&utm_medium=EVT&utm_offer=EVENT-USER', + text: 'The countdown to HashiConf Global is on. View the full schedule now.', + linkText: 'View Schedule', + // Set the expirationDate prop with a datetime string (e.g. '2020-01-31T12:00:00-07:00') + // if you'd like the component to stop showing at or after a certain date + expirationDate: '2021-10-19T12:00:00-07:00', } From 744e08aaefc5c2a23b18b632168aeda566c4b0ae Mon Sep 17 00:00:00 2001 From: Jim Date: Tue, 28 Sep 2021 15:28:14 -0400 Subject: [PATCH 10/18] chore: Update website version --- website/data/version.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/data/version.js b/website/data/version.js index 737e4d1f5..0a61b90f5 100644 --- a/website/data/version.js +++ b/website/data/version.js @@ -1,2 +1,2 @@ -export const VERSION = '0.6.1' +export const VERSION = '0.6.2' export const DESKTOP_VERSION = '1.3.0' From 136ac00b496795689c02a6fc126d2a06709fbcb5 Mon Sep 17 00:00:00 2001 From: Jim Date: Thu, 30 Sep 2021 08:47:34 -0400 Subject: [PATCH 11/18] refact: Changes required for gorm v2 (#1528) --- Makefile | 1 + go.mod | 11 +- go.sum | 185 +++++++++++++++++- internal/auth/db_test.go | 21 +- internal/auth/oidc/repository_account_test.go | 4 +- internal/auth/oidc/repository_auth_method.go | 30 +-- .../oidc/repository_managed_group_test.go | 4 +- internal/auth/oidc/testing.go | 2 +- internal/auth/password/account.go | 2 +- internal/auth/password/argon2_test.go | 2 +- internal/auth/password/query.go | 6 +- .../auth/password/repository_account_test.go | 4 +- .../password/repository_authmethod_test.go | 4 +- .../auth/password/repository_configuration.go | 3 +- internal/auth/password/repository_password.go | 4 +- internal/auth/password/store/password.pb.go | 4 +- internal/auth/password/testing.go | 2 +- internal/authtoken/store/authtoken.pb.go | 12 +- internal/authtoken/testing.go | 2 +- internal/cmd/base/dev.go | 3 +- internal/cmd/base/servers.go | 34 +++- internal/cmd/commands/database/init.go | 6 +- internal/cmd/commands/server/server.go | 7 +- .../credential/vault/client_certificate.go | 11 +- internal/credential/vault/credential.go | 27 +-- internal/credential/vault/credential_test.go | 2 +- internal/credential/vault/jobs_test.go | 43 ++-- internal/credential/vault/private_library.go | 12 +- internal/credential/vault/query.go | 64 +++--- .../repository_credential_library_test.go | 4 +- .../vault/repository_credential_store_test.go | 16 +- internal/credential/vault/testing.go | 3 +- internal/credential/vault/vault_token.go | 15 +- internal/db/README.md | 7 +- internal/db/assert/asserts_test.go | 96 ++++++--- internal/db/common/update.go | 2 +- internal/db/common/update_test.go | 2 +- internal/db/db.go | 52 ++--- internal/db/db_test.go | 14 +- internal/db/domains_test.go | 67 ++++--- internal/db/read_writer.go | 81 ++++++-- internal/db/read_writer_test.go | 8 +- .../postgres/14/warehouse_user_dim_test.go | 6 +- .../16/warehouse_credential_dim_test.go | 7 +- .../migrations/postgres/2/07_iam_test.go | 6 +- .../postgres/8/08_connection_test.go | 5 +- .../postgres/9/managed_group_test.go | 91 +++++---- internal/db/testing.go | 15 +- internal/db/timestamp/scanners.go | 18 ++ internal/errors/error.go | 26 +-- internal/errors/error_test.go | 10 +- internal/errors/is.go | 26 +-- internal/errors/is_test.go | 54 ++--- internal/host/static/host_catalog_test.go | 2 +- internal/host/static/host_set_test.go | 4 +- internal/host/static/host_test.go | 3 +- internal/host/static/query.go | 2 +- .../static/repository_host_catalog_test.go | 4 +- .../host/static/repository_host_set_member.go | 17 +- .../host/static/repository_host_set_test.go | 4 +- internal/host/static/repository_host_test.go | 4 +- internal/host/static/testing.go | 2 +- internal/iam/account_test.go | 4 +- internal/iam/group_test.go | 4 +- internal/iam/immutable_fields_test.go | 4 +- internal/iam/query.go | 10 +- internal/iam/repository_group.go | 7 +- internal/iam/repository_group_test.go | 4 +- internal/iam/repository_role_grant.go | 4 +- internal/iam/repository_role_test.go | 4 +- internal/iam/repository_scope.go | 2 +- internal/iam/repository_user.go | 9 +- internal/iam/repository_user_iam_pkg_test.go | 6 +- internal/iam/repository_user_test.go | 10 +- internal/iam/role_grant_test.go | 10 +- internal/iam/role_test.go | 4 +- internal/iam/store/user.pb.go | 16 +- internal/iam/testing.go | 13 +- internal/iam/testing_test.go | 11 ++ internal/kms/testing.go | 2 +- internal/oplog/oplog.go | 5 +- internal/oplog/oplog_test.go | 36 +++- internal/oplog/oplog_test/db.go | 9 +- internal/oplog/testing.go | 6 +- internal/oplog/ticketer.go | 4 +- internal/oplog/writer.go | 48 +++-- internal/oplog/writer_test.go | 10 +- .../local/controller/servers/v1/servers.proto | 1 + .../auth/password/store/v1/password.proto | 2 +- .../authtoken/store/v1/authtoken.proto | 6 +- .../storage/iam/store/v1/user.proto | 8 +- .../controller/storage/job/store/v1/job.proto | 2 +- .../job/additional_verification_test.go | 37 ++-- internal/scheduler/job/query.go | 23 ++- internal/scheduler/job/repository_job.go | 14 +- internal/scheduler/job/repository_run_test.go | 4 +- internal/scheduler/job/store/job.pb.go | 4 +- internal/scheduler/job/testing.go | 2 +- internal/scheduler/testing.go | 2 +- .../handlers/authmethods/oidc_test.go | 2 +- .../host_sets/host_set_service_test.go | 12 ++ .../handlers/targets/target_service_test.go | 2 +- internal/servers/controller/testing.go | 2 +- internal/servers/query.go | 12 +- internal/servers/repository.go | 13 +- internal/servers/repository_test.go | 1 + internal/servers/servers.pb.go | 3 +- internal/session/query.go | 40 ++-- internal/session/repository_connection.go | 13 +- .../session/repository_connection_test.go | 6 +- internal/session/repository_session.go | 34 +++- internal/session/repository_session_test.go | 10 +- internal/session/testing.go | 2 +- internal/target/query.go | 2 +- .../target/repository_credential_source.go | 11 +- internal/target/repository_tcp_target_test.go | 4 +- internal/target/tcp_target_test.go | 4 +- internal/target/testing.go | 2 +- 118 files changed, 1127 insertions(+), 580 deletions(-) diff --git a/Makefile b/Makefile index 7f0c5321d..a02bdf8dd 100644 --- a/Makefile +++ b/Makefile @@ -136,6 +136,7 @@ protobuild: @protoc-go-inject-tag -input=./internal/scheduler/job/store/job.pb.go @protoc-go-inject-tag -input=./internal/credential/store/credential.pb.go @protoc-go-inject-tag -input=./internal/credential/vault/store/vault.pb.go + @protoc-go-inject-tag -input=./internal/servers/servers.pb.go # these protos, services and openapi artifacts are purely for testing purposes @protoc-go-inject-tag -input=./internal/gen/testing/event/event.pb.go diff --git a/go.mod b/go.mod index b2353a82f..e62f65e4f 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,10 @@ replace github.com/hashicorp/boundary/api => ./api replace github.com/hashicorp/boundary/sdk => ./sdk +// tmp use of local clone as we understand any required upstream PRs to +// compatibility. +replace gorm.io/gorm => github.com/hashicorp/gorm v0.0.2 + require ( github.com/armon/go-metrics v0.3.9 github.com/bufbuild/buf v0.37.0 @@ -45,10 +49,11 @@ require ( github.com/hashicorp/go-uuid v1.0.2 github.com/hashicorp/hcl v1.0.0 github.com/hashicorp/vault/api v1.1.1 + github.com/hashicorp/vault/sdk v0.2.1 github.com/iancoleman/strcase v0.2.0 + github.com/jackc/pgconn v1.10.0 github.com/jefferai/keyring v1.1.7-0.20210105022822-8749b3d9ce79 - github.com/jinzhu/gorm v1.9.16 - github.com/jinzhu/now v1.1.1 // indirect + github.com/jinzhu/gorm v1.9.12 github.com/json-iterator/go v1.1.10 // indirect github.com/kr/pretty v0.3.0 github.com/kr/text v0.2.0 @@ -81,6 +86,8 @@ require ( google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 google.golang.org/protobuf v1.27.1 gopkg.in/yaml.v2 v2.4.0 // indirect + gorm.io/driver/postgres v1.1.0 + gorm.io/gorm v1.21.14 mvdan.cc/gofumpt v0.1.1 nhooyr.io/websocket v1.8.7 ) diff --git a/go.sum b/go.sum index d145070bd..625890ad7 100644 --- a/go.sum +++ b/go.sum @@ -76,12 +76,14 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ClickHouse/clickhouse-go v1.3.12/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.0.3 h1:znjIyLfpXEDQjOIEWh+ehwpTU14UzUPub3c3sm36u14= github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= @@ -94,7 +96,10 @@ github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61 github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -103,9 +108,10 @@ github.com/alexbrainman/sspi v0.0.0-20180613141037-e580b900e9f5/go.mod h1:976q2E github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190620160927-9418d7b0cd0f h1:oRD16bhpKNAanfcDDVU+J0NXqsgHIvGbbe/sy+r6Rs0= github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190620160927-9418d7b0cd0f/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ= github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= -github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apex/log v1.9.0 h1:FHtw/xuaM8AgmvDDTI9fiwoAL25Sq2cxojnZICUU8l0= github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA= github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= @@ -120,11 +126,15 @@ github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.30.27 h1:9gPjZWVDSoQrBO2AvqrWObS6KAZByfEJxQoCYo4ZfK0= github.com/aws/aws-sdk-go v1.30.27/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -141,6 +151,9 @@ github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dR github.com/bufbuild/buf v0.37.0 h1:11zJVA0D4uJVGOC9h+oOVHrKKoBgMYIqJJ0d1Xt6oeQ= github.com/bufbuild/buf v0.37.0/go.mod h1:lQ1m2HkIaGOFba6w/aC3KYBHhKEOESP3gaAEpS3dAFM= github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3eG1c= github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= @@ -154,13 +167,17 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go v0.0.0-20190925194419-606b3d062051/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= @@ -182,9 +199,12 @@ github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkE github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-oidc/v3 v3.0.0 h1:/mAA0XMgYJw2Uqm7WKGCsKnjitE/+A0FFbOmiRJm7LQ= github.com/coreos/go-oidc/v3 v3.0.0/go.mod h1:rEJ/idjfUyfkBit1eI1fvyr+64/g9dcKpAm8MJMesvo= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= @@ -227,7 +247,12 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b h1:HBah4D48ypg3J7Np4N+HY/ZR76fx3HEUGxDU6Uk39oQ= github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -245,6 +270,8 @@ github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/favadi/protoc-go-inject-tag v1.3.0 h1:JPrmsmc/uBShG85uY5xGZIa5WJ0IaNZn6LZhQR9tIQE= github.com/favadi/protoc-go-inject-tag v1.3.0/go.mod h1:SSkUBgfqw2IJ2p7NPNKWk0Idwxt/qIt2LQgFPUgRGtc= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.10.0 h1:Gfh+GAJZOAoKZsIZeZbdn2JF10kN1XHNvjsvQK8gVkE= github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -261,11 +288,13 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8= github.com/go-ldap/ldap/v3 v3.1.10/go.mod h1:5Zun81jBTabRaI8lzN7E1JjyEl1g6zI6u9pd8luAK4Q= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= @@ -296,9 +325,12 @@ github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -311,6 +343,7 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -342,6 +375,7 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -374,6 +408,7 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -390,12 +425,15 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0 h1:rgxjzoDmDXw5q8HONgyHhBas4to0/XWRo/gPpJhsUNQ= @@ -404,7 +442,9 @@ github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMW github.com/hashicorp/cap v0.1.1 h1:GjO4+9+H0wv/89YoEsxeVc2jIizL19r5v5l2lpaH8Kg= github.com/hashicorp/cap v0.1.1/go.mod h1:VfBvK2ULRyqsuqAnjgZl7HJ7/CGMC7ro4H5eXiZuun8= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/dawdle v0.4.0 h1:nAE+aCoAmVulgCPPPrp6oGOykjPhxEe4VUNms/mTKeA= github.com/hashicorp/dawdle v0.4.0/go.mod h1:gOBY8rFXpW4Rw39up1FIacw/1pG/fO779LfchCY3KUw= github.com/hashicorp/dbassert v0.0.0-20210708202608-ecf920cf1ed8 h1:/3iubtqEdLgdXB6ue+WAKvbcpn313jjL5mQvU5ByymE= @@ -496,6 +536,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/gorm v0.0.2 h1:yxEp0og8mswtQVSEnxEsU+d3QIvYDqU+P5ABAm0B9n4= +github.com/hashicorp/gorm v0.0.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -517,6 +559,7 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huaweicloud/golangsdk v0.0.0-20200304081349-45ec0797f2a4/go.mod h1:WQBcHRNX9shz3928lWEvstQJtAtYI7ks6XlgtRT9Tcw= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -525,30 +568,66 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= github.com/jackc/pgconn v1.3.2/go.mod h1:LvCquS3HbBKwgl7KbX9KyqEIumJAbm1UMcTvGaIf3bM= +github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= +github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.8.1/go.mod h1:JV6m6b6jhjdmzchES0drzCcYcAHS1OPD5xu3OZ/lE2g= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.10.0 h1:4EYhlDVEMsJ30nNj0mmgwIUXoq7e9sMJrVC2ED6QlCU= +github.com/jackc/pgconn v1.10.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1 h1:7PQ/4gLoqnl87ZxL7xjO0DR5gYuviDCZxQJsUlFW1eI= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= +github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= +github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= +github.com/jackc/pgtype v1.7.0 h1:6f4kVsW01QftE38ufBYxKciO6gyioXSC0ABIRLcZrGs= +github.com/jackc/pgtype v1.7.0/go.mod h1:ZnHF+rMePVqDKaOfJVI4Q8IVvAQMryDlDkZnKOI75BE= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= +github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= +github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= +github.com/jackc/pgx/v4 v4.11.0 h1:J86tSWd3Y7nKjwT/43xZBvpi04keQWx8gNC2YkdJhZI= +github.com/jackc/pgx/v4 v4.11.0/go.mod h1:i62xJgdrtVDsnL3U8ekyrQXEwGNTRoG7/8r+CIdYfcc= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= @@ -563,14 +642,13 @@ github.com/jefferai/keyring v1.1.7-0.20210105022822-8749b3d9ce79 h1:7opZgeTbZEBf github.com/jefferai/keyring v1.1.7-0.20210105022822-8749b3d9ce79/go.mod h1:Y6M+VPkRv4aOcVNvvSWma4aMRLY+xvPhzZX3tDmPoPY= github.com/jhump/protoreflect v1.8.1 h1:z7Ciiz3Bz37zSd485fbiTW8ABafIasyOWZI0N9EUUdo= github.com/jhump/protoreflect v1.8.1/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= +github.com/jinzhu/gorm v1.9.12 h1:Drgk1clyWT9t9ERbzHza6Mj/8FY/CqMyVzOiHviMo6Q= github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs= -github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o= -github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E= -github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI= +github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= @@ -579,6 +657,8 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22 github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -626,10 +706,14 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.6.0/go.mod h1:4vXEAYvW1fRQ2/FhZ78H73A60MHw1geSm145z2mdY1g= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.3 h1:v9QZf2Sn6AmjXtQeFpdoq/eaNtYP6IN+7lcrygsIAtg= github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -640,17 +724,19 @@ github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw= github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -705,19 +791,31 @@ github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ib github.com/mutecomm/go-sqlcipher/v4 v4.4.0/go.mod h1:PyN04SaWalavxRGH9E8ZftG6Ju7rsPrGmQRjrEaVpiY= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcLuHrG+/sUeP8gI= github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/oligot/go-mod-upgrade v0.6.1 h1:AZnCiEAOxOMxpKZWjFWFNm/i6QjZVBozuKjuB8EzRCk= github.com/oligot/go-mod-upgrade v0.6.1/go.mod h1:5Gyau3jUXqXrGhYxGkGqrxxgR90Lzd1yt/9YQp9sn1w= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= @@ -729,17 +827,29 @@ github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59P github.com/opencontainers/runc v1.0.0-rc9 h1:/k06BMULKF5hidyoZymkoDCzdJzltZpz/UU4LguQVtc= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/oracle/oci-go-sdk v12.5.0+incompatible h1:pr08ECoaDKHWO9tnzJB1YqClEs7ZK1CFOez2DQocH14= github.com/oracle/oci-go-sdk v12.5.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= github.com/ory/dockertest/v3 v3.6.0/go.mod h1:4ZOpj8qBUmh8fcBSVzkH2bws2s91JdGvHUqan4GHEuQ= github.com/ory/dockertest/v3 v3.7.0 h1:Bijzonc69Ont3OU0a3TWKJ1Rzlh3TsDXP1JrTAkSmsM= github.com/ory/dockertest/v3 v3.7.0/go.mod h1:PvCCgnP7AfBZeVrzwiUTjZx/IUXlGLC1zQlUQrLIlUE= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.5.2+incompatible h1:WCjObylUIOlKy/+7Abdn34TLIkXiA4UWUMhxq9m9ZXI= github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -751,6 +861,7 @@ github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/profile v1.5.0 h1:042Buzk+NhDI+DeSAA62RwJL8VAuZUMQZUjCsRz1Mug= github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -760,25 +871,33 @@ github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXq github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -796,10 +915,13 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc h1:jUIKcSPO9MoMJBbEoyE/RJoE8vz7Mb8AjvifMMwSyvY= +github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -820,19 +942,25 @@ github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4S github.com/snowflakedb/glog v0.0.0-20180824191149-f5055e6f21ce/go.mod h1:EB/w24pR5VKI60ecFnKqXzxX3dOorz1rnVicQTQrGM0= github.com/snowflakedb/gosnowflake v1.3.5/go.mod h1:13Ky+lxzIm3VqNDZJdyvu9MCGy+WgRdYFdXp96UcLZU= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.1-0.20201006035406-b97b5ead31f7/go.mod h1:yk5b0mALVusDL5fMM6Rd1wgnoO5jUPhwsQ6LQAJTidQ= github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= @@ -857,6 +985,7 @@ github.com/tj/go-buffer v1.1.0/go.mod h1:iyiJpfFcR2B9sXu7KvjbT9fpM4mOelRSDTbntVj github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchtv/twirp v7.1.0+incompatible h1:3fNSDoSPyq+fTrifIvGue9XM/tptzuhiGY83rxPVNUg= @@ -865,8 +994,10 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5 h1:MCfT24H3f//U5+UCrZp1/riVO3B50BovxtDiNn0XKkk= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= @@ -893,7 +1024,11 @@ github.com/zalando/go-keyring v0.1.1/go.mod h1:OIC+OZ28XbmwFxU/Rp9V7eKzZjamBJwRz github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -904,6 +1039,7 @@ go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= @@ -911,12 +1047,14 @@ go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.0.0 h1:qsup4IcBdlmsnGfqyLl4Ntn3C2XCCuKAE7DwHpScyUo= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -932,17 +1070,22 @@ golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -991,6 +1134,7 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190225153610-fe579d43d832/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1060,6 +1204,7 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1076,12 +1221,14 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1114,6 +1261,7 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210916214954-140adaaadfaf h1:Ihq/mm/suC88gF8WFcVwk+OV6Tq+wyA1O0E5UEvDglI= golang.org/x/term v0.0.0-20210916214954-140adaaadfaf/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1123,9 +1271,11 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1133,6 +1283,7 @@ golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1164,6 +1315,7 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1201,6 +1353,7 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1220,6 +1373,7 @@ google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.0.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1233,6 +1387,7 @@ google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1267,10 +1422,14 @@ google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83 h1:3V2dxSZpz4zozWWUq36vUxXEKnSYitEH2LdsAx+RUmg= google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -1314,9 +1473,11 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= @@ -1333,6 +1494,7 @@ gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76 gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1348,10 +1510,13 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.1.0 h1:afBljg7PtJ5lA6YUWluV2+xovIPhS+YiInuL3kUjrbk= +gorm.io/driver/postgres v1.1.0/go.mod h1:hXQIwafeRjJvUm+OMxcFWyswJ/vevcpPLlGocwAwuqw= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2 h1:kG1BFyqVHuQoVQiR1bWGnfz/fmHvvuiSPIV7rvl360E= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1379,3 +1544,5 @@ nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/internal/auth/db_test.go b/internal/auth/db_test.go index ad20ca967..3a63e1491 100644 --- a/internal/auth/db_test.go +++ b/internal/auth/db_test.go @@ -2,6 +2,7 @@ package auth import ( "context" + "database/sql" "testing" "github.com/hashicorp/boundary/internal/db" @@ -23,7 +24,7 @@ create table if not exists test_auth_method ( insert into test_auth_method (public_id, scope_id) values - ($1, $2); + (@public_id, @scoped_id); ` addTriggers = ` create trigger @@ -33,10 +34,10 @@ insert on test_auth_method for each row execute procedure insert_auth_method_subtype(); ` baseTableQuery = ` -select count(*) from auth_method where public_id = $1; +select count(*) from auth_method where public_id = @public_id ` testTableQuery = ` -select count(*) from test_auth_method where public_id = $1; +select count(*) from test_auth_method where public_id = @public_id ` ) @@ -55,7 +56,7 @@ select count(*) from test_auth_method where public_id = $1; org, _ := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper)) id := "l1Ocw0TpHn800CekIxIXlmQqRDgFDfYl" - inserted, err := rw.Exec(ctx, insert, []interface{}{id, org.GetPublicId()}) + inserted, err := rw.Exec(ctx, insert, []interface{}{sql.Named("public_id", id), sql.Named("scoped_id", org.GetPublicId())}) require.NoError(err) require.Equal(1, inserted) @@ -63,7 +64,7 @@ select count(*) from test_auth_method where public_id = $1; Count int } var count c - rows, err := rw.Query(ctx, baseTableQuery, []interface{}{id}) + rows, err := rw.Query(ctx, baseTableQuery, []interface{}{sql.Named("public_id", id)}) require.NoError(err) defer rows.Close() for rows.Next() { @@ -73,7 +74,7 @@ select count(*) from test_auth_method where public_id = $1; assert.Equal(1, count.Count) count.Count = 0 - rows, err = rw.Query(ctx, testTableQuery, []interface{}{id}) + rows, err = rw.Query(ctx, testTableQuery, []interface{}{sql.Named("public_id", id)}) require.NoError(err) defer rows.Close() for rows.Next() { @@ -96,7 +97,7 @@ create table if not exists test_auth_account ( insert into test_auth_account (public_id, auth_method_id) values - ($1, $2); + (?, ?); ` addTriggers = ` create trigger @@ -106,16 +107,16 @@ insert on test_auth_account for each row execute procedure insert_auth_account_subtype(); ` baseTableQuery = ` -select count(*) from auth_account where public_id = $1; +select count(*) from auth_account where public_id = ?; ` testTableQuery = ` -select count(*) from test_auth_account where public_id = $1; +select count(*) from test_auth_account where public_id = ?; ` insertAuthMethod = ` insert into auth_method (public_id, scope_id) values - ($1, $2); + (?, ?); ` ) diff --git a/internal/auth/oidc/repository_account_test.go b/internal/auth/oidc/repository_account_test.go index 443462d33..11a22ac64 100644 --- a/internal/auth/oidc/repository_account_test.go +++ b/internal/auth/oidc/repository_account_test.go @@ -1160,7 +1160,9 @@ func TestRepository_UpdateAccount(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.AuthMethodId, got.AuthMethodId) - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { dbassert.IsNull(got, "name") return diff --git a/internal/auth/oidc/repository_auth_method.go b/internal/auth/oidc/repository_auth_method.go index 3b3e3e879..da8dbb569 100644 --- a/internal/auth/oidc/repository_auth_method.go +++ b/internal/auth/oidc/repository_auth_method.go @@ -2,6 +2,7 @@ package oidc import ( "context" + "database/sql" "encoding/json" "fmt" "net/url" @@ -73,7 +74,12 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC } columns := []string{"public_id", "auth_method_id", "issuer", "subject"} - values := []interface{}{pubId, am.PublicId, iss, sub} + values := []interface{}{ + sql.Named("1", pubId), + sql.Named("2", am.PublicId), + sql.Named("3", iss), + sql.Named("4", sub), + } var conflictClauses, fieldMasks, nullMasks []string { @@ -81,8 +87,8 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC if err != nil { return nil, errors.Wrap(ctx, err, op) } - columns, values = append(columns, "token_claims"), append(values, string(marshaledTokenClaims)) - conflictClauses = append(conflictClauses, fmt.Sprintf("token_claims = $%d", len(values))) + columns, values = append(columns, "token_claims"), append(values, sql.Named(fmt.Sprintf("%d", len(values)+1), string(marshaledTokenClaims))) + conflictClauses = append(conflictClauses, fmt.Sprintf("token_claims = @%d", len(values))) fieldMasks = append(fieldMasks, TokenClaimsField) } { @@ -90,8 +96,8 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC if err != nil { return nil, errors.Wrap(ctx, err, op) } - columns, values = append(columns, "userinfo_claims"), append(values, string(marshaledAccessTokenClaims)) - conflictClauses = append(conflictClauses, fmt.Sprintf("userinfo_claims = $%d", len(values))) + columns, values = append(columns, "userinfo_claims"), append(values, sql.Named(fmt.Sprintf("%d", len(values)+1), string(marshaledAccessTokenClaims))) + conflictClauses = append(conflictClauses, fmt.Sprintf("userinfo_claims = @%d", len(values))) fieldMasks = append(fieldMasks, UserinfoClaimsField) } @@ -108,14 +114,14 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC switch { case AccessTokenClaims[fromName] != nil: foundName = AccessTokenClaims[fromName] - columns, values = append(columns, "full_name"), append(values, foundName) + columns, values = append(columns, "full_name"), append(values, sql.Named(fmt.Sprintf("%d", len(values)+1), foundName)) case IdTokenClaims[fromName] != nil: foundName = IdTokenClaims[fromName] - columns, values = append(columns, "full_name"), append(values, foundName) + columns, values = append(columns, "full_name"), append(values, sql.Named(fmt.Sprintf("%d", len(values)+1), foundName)) } if foundName != nil { acctForOplog.FullName = foundName.(string) - conflictClauses = append(conflictClauses, fmt.Sprintf("full_name = $%d", len(values))) + conflictClauses = append(conflictClauses, fmt.Sprintf("full_name = @%d", len(values))) fieldMasks = append(fieldMasks, NameField) } else { conflictClauses = append(conflictClauses, "full_name = NULL") @@ -126,14 +132,14 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC switch { case AccessTokenClaims[fromEmail] != nil: foundEmail = AccessTokenClaims[fromEmail] - columns, values = append(columns, "email"), append(values, foundEmail) + columns, values = append(columns, "email"), append(values, sql.Named(fmt.Sprintf("%d", len(values)+1), foundEmail)) case IdTokenClaims[fromEmail] != nil: foundEmail = IdTokenClaims[fromEmail] - columns, values = append(columns, "email"), append(values, foundEmail) + columns, values = append(columns, "email"), append(values, sql.Named(fmt.Sprintf("%d", len(values)+1), foundEmail)) } if foundEmail != nil { acctForOplog.Email = foundEmail.(string) - conflictClauses = append(conflictClauses, fmt.Sprintf("email = $%d", len(values))) + conflictClauses = append(conflictClauses, fmt.Sprintf("email = @%d", len(values))) fieldMasks = append(fieldMasks, "Email") } else { conflictClauses = append(conflictClauses, "email = NULL") @@ -142,7 +148,7 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC placeHolders := make([]string, 0, len(columns)) for colNum := range columns { - placeHolders = append(placeHolders, fmt.Sprintf("$%d", colNum+1)) + placeHolders = append(placeHolders, fmt.Sprintf("@%d", colNum+1)) } query := fmt.Sprintf(acctUpsertQuery, strings.Join(columns, ", "), strings.Join(placeHolders, ", "), strings.Join(conflictClauses, ", ")) diff --git a/internal/auth/oidc/repository_managed_group_test.go b/internal/auth/oidc/repository_managed_group_test.go index bf8d88a6b..e7600db3a 100644 --- a/internal/auth/oidc/repository_managed_group_test.go +++ b/internal/auth/oidc/repository_managed_group_test.go @@ -952,7 +952,9 @@ func TestRepository_UpdateManagedGroup(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.AuthMethodId, got.AuthMethodId) - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { dbassert.IsNull(got, "name") return diff --git a/internal/auth/oidc/testing.go b/internal/auth/oidc/testing.go index 2548cc975..4fc07d8fb 100644 --- a/internal/auth/oidc/testing.go +++ b/internal/auth/oidc/testing.go @@ -29,9 +29,9 @@ import ( "github.com/hashicorp/boundary/internal/kms" "github.com/hashicorp/cap/oidc" wrapping "github.com/hashicorp/go-kms-wrapping" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/timestamppb" + "gorm.io/gorm" ) const TestFakeManagedGroupFilter = `"/foo" == "bar"` diff --git a/internal/auth/password/account.go b/internal/auth/password/account.go index c4ef1ca1d..5aefb08c2 100644 --- a/internal/auth/password/account.go +++ b/internal/auth/password/account.go @@ -14,7 +14,7 @@ type Account struct { // CredentialId is included when Authenticate or ChangePassword is // called. A new CredentialId is generated when a password is changed. - CredentialId string `gorm:"-"` + CredentialId string `gorm:"->"` } func allocAccount() *Account { diff --git a/internal/auth/password/argon2_test.go b/internal/auth/password/argon2_test.go index a970e0345..0a81f2bc5 100644 --- a/internal/auth/password/argon2_test.go +++ b/internal/auth/password/argon2_test.go @@ -8,9 +8,9 @@ import ( "github.com/hashicorp/boundary/internal/db" "github.com/hashicorp/boundary/internal/errors" "github.com/hashicorp/boundary/internal/iam" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gorm.io/gorm" ) func TestArgon2Configuration_New(t *testing.T) { diff --git a/internal/auth/password/query.go b/internal/auth/password/query.go index 5bfbae9be..737f64b70 100644 --- a/internal/auth/password/query.go +++ b/internal/auth/password/query.go @@ -25,8 +25,8 @@ select acct.name, -- Account.Name auth_password_argon2_conf conf, auth_password_account acct, auth_password_method meth - where acct.auth_method_id = $1 - and acct.login_name = $2 + where acct.auth_method_id = @auth_method_id + and acct.login_name = @login_name and cred.password_conf_id = conf.private_id and cred.password_account_id = acct.public_id and acct.auth_method_id = meth.public_id ; @@ -38,7 +38,7 @@ select * in ( select auth_method_id from auth_password_account - where public_id = $1 + where public_id = @public_id ); ` ) diff --git a/internal/auth/password/repository_account_test.go b/internal/auth/password/repository_account_test.go index 0040cd720..031d5efb3 100644 --- a/internal/auth/password/repository_account_test.go +++ b/internal/auth/password/repository_account_test.go @@ -949,7 +949,9 @@ func TestRepository_UpdateAccount(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.AuthMethodId, got.AuthMethodId) - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { dbassert.IsNull(got, "name") return diff --git a/internal/auth/password/repository_authmethod_test.go b/internal/auth/password/repository_authmethod_test.go index e43a8e9cb..33783b0e6 100644 --- a/internal/auth/password/repository_authmethod_test.go +++ b/internal/auth/password/repository_authmethod_test.go @@ -769,7 +769,9 @@ func TestRepository_UpdateAuthMethod(t *testing.T) { require.NoError(err) assert.Empty(cmp.Diff(updatedAM, foundAuthMethod, protocmp.Transform())) - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) if amToUpdate.Name == "" && contains(tt.args.fieldMaskPaths, "name") { dbassert.IsNull(foundAuthMethod, "name") } diff --git a/internal/auth/password/repository_configuration.go b/internal/auth/password/repository_configuration.go index 8f79deed5..2cffa5841 100644 --- a/internal/auth/password/repository_configuration.go +++ b/internal/auth/password/repository_configuration.go @@ -2,6 +2,7 @@ package password import ( "context" + "database/sql" "github.com/hashicorp/boundary/internal/auth/password/store" "github.com/hashicorp/boundary/internal/db" @@ -143,7 +144,7 @@ func (r *Repository) currentConfigForAccount(ctx context.Context, accountId stri const op = "password.(Repository).currentConfigForAccount" var confs []currentConfig - rows, err := r.reader.Query(ctx, currentConfigForAccountQuery, []interface{}{accountId}) + rows, err := r.reader.Query(ctx, currentConfigForAccountQuery, []interface{}{sql.Named("public_id", accountId)}) if err != nil { return nil, errors.Wrap(ctx, err, op) } diff --git a/internal/auth/password/repository_password.go b/internal/auth/password/repository_password.go index 69ecfced0..1ebbc18a4 100644 --- a/internal/auth/password/repository_password.go +++ b/internal/auth/password/repository_password.go @@ -3,6 +3,7 @@ package password import ( "context" "crypto/subtle" + "database/sql" "fmt" "github.com/hashicorp/boundary/internal/db" @@ -213,7 +214,8 @@ func (r *Repository) authenticate(ctx context.Context, scopeId, authMethodId, lo const op = "password.(Repository).authenticate" var accts []authAccount - rows, err := r.reader.Query(ctx, authenticateQuery, []interface{}{authMethodId, loginName}) + rows, err := r.reader.Query(ctx, authenticateQuery, []interface{}{sql.Named("auth_method_id", authMethodId), sql.Named("login_name", loginName)}) + if err != nil { return nil, errors.Wrap(ctx, err, op) } diff --git a/internal/auth/password/store/password.pb.go b/internal/auth/password/store/password.pb.go index 992547d7d..7a52921a8 100644 --- a/internal/auth/password/store/password.pb.go +++ b/internal/auth/password/store/password.pb.go @@ -56,8 +56,8 @@ type AuthMethod struct { MinPasswordLength uint32 `protobuf:"varint,10,opt,name=min_password_length,json=minPasswordLength,proto3" json:"min_password_length,omitempty" gorm:"default:null"` // is_primary_auth_method is a read-only output field which indicates if the // auth method is set as the scope's primary auth method. - // @inject_tag: `gorm:"-"` - IsPrimaryAuthMethod bool `protobuf:"varint,20,opt,name=is_primary_auth_method,json=isPrimaryAuthMethod,proto3" json:"is_primary_auth_method,omitempty" gorm:"-"` + // @inject_tag: `gorm:"->"` + IsPrimaryAuthMethod bool `protobuf:"varint,20,opt,name=is_primary_auth_method,json=isPrimaryAuthMethod,proto3" json:"is_primary_auth_method,omitempty" gorm:"->"` } func (x *AuthMethod) Reset() { diff --git a/internal/auth/password/testing.go b/internal/auth/password/testing.go index 8b71bda3f..1f6995403 100644 --- a/internal/auth/password/testing.go +++ b/internal/auth/password/testing.go @@ -6,9 +6,9 @@ import ( "testing" "github.com/hashicorp/boundary/internal/db" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gorm.io/gorm" ) // TestAuthMethod creates a password auth methods to the provided DB with the diff --git a/internal/authtoken/store/authtoken.pb.go b/internal/authtoken/store/authtoken.pb.go index 8a51ac5c9..53ee69e32 100644 --- a/internal/authtoken/store/authtoken.pb.go +++ b/internal/authtoken/store/authtoken.pb.go @@ -55,14 +55,14 @@ type AuthToken struct { // @inject_tag: `gorm:"default:not_null"` AuthAccountId string `protobuf:"bytes,10,opt,name=auth_account_id,json=authAccountId,proto3" json:"auth_account_id,omitempty" gorm:"default:not_null"` // scope_id is not stored in the backing DB but it derived from the linked to auth account. - // @inject_tag: gorm:"-" - ScopeId string `protobuf:"bytes,11,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty" gorm:"-"` + // @inject_tag: gorm:"->" + ScopeId string `protobuf:"bytes,11,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty" gorm:"->"` // auth_method_id is not stored in the backing DB but it derived from the linked to auth account. - // @inject_tag: gorm:"-" - AuthMethodId string `protobuf:"bytes,12,opt,name=auth_method_id,json=authMethodId,proto3" json:"auth_method_id,omitempty" gorm:"-"` + // @inject_tag: gorm:"->" + AuthMethodId string `protobuf:"bytes,12,opt,name=auth_method_id,json=authMethodId,proto3" json:"auth_method_id,omitempty" gorm:"->"` // iam_user_id is not stored in the backing DB but it derived from the linked to auth account. - // @inject_tag: gorm:"-" - IamUserId string `protobuf:"bytes,13,opt,name=iam_user_id,json=iamUserId,proto3" json:"iam_user_id,omitempty" gorm:"-"` + // @inject_tag: gorm:"->" + IamUserId string `protobuf:"bytes,13,opt,name=iam_user_id,json=iamUserId,proto3" json:"iam_user_id,omitempty" gorm:"->"` // key_id is the key ID that was used for the encryption operation. It can be // used to identify a specific version of the key needed to decrypt the value, // which is useful for caching purposes. diff --git a/internal/authtoken/testing.go b/internal/authtoken/testing.go index 5f8f5fbb4..2b95e00c4 100644 --- a/internal/authtoken/testing.go +++ b/internal/authtoken/testing.go @@ -8,8 +8,8 @@ import ( "github.com/hashicorp/boundary/internal/db" "github.com/hashicorp/boundary/internal/iam" "github.com/hashicorp/boundary/internal/kms" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/require" + "gorm.io/gorm" ) func TestAuthToken(t *testing.T, conn *gorm.DB, kms *kms.Kms, scopeId string, opt ...Option) *AuthToken { diff --git a/internal/cmd/base/dev.go b/internal/cmd/base/dev.go index 90db26906..5db90e915 100644 --- a/internal/cmd/base/dev.go +++ b/internal/cmd/base/dev.go @@ -20,6 +20,7 @@ import ( "github.com/hashicorp/boundary/testing/dbtest" capoidc "github.com/hashicorp/cap/oidc" "github.com/hashicorp/go-multierror" + "gorm.io/gorm/logger" ) func (b *Server) CreateDevDatabase(ctx context.Context, opt ...Option) error { @@ -100,7 +101,7 @@ func (b *Server) CreateDevDatabase(ctx context.Context, opt ...Option) error { return err } - b.Database.LogMode(true) + b.Database.Config.Logger.LogMode(logger.Info) if err := b.CreateGlobalKmsKeys(ctx); err != nil { if c != nil { diff --git a/internal/cmd/base/servers.go b/internal/cmd/base/servers.go index 9f8309bdf..e9edaf369 100644 --- a/internal/cmd/base/servers.go +++ b/internal/cmd/base/servers.go @@ -37,9 +37,10 @@ import ( "github.com/hashicorp/go-secure-stdlib/parseutil" "github.com/hashicorp/go-secure-stdlib/reloadutil" "github.com/hashicorp/go-secure-stdlib/strutil" - "github.com/jinzhu/gorm" "github.com/mitchellh/cli" "google.golang.org/grpc/grpclog" + "gorm.io/gorm" + "gorm.io/gorm/logger" ) const ( @@ -548,20 +549,37 @@ func (b *Server) RunShutdownFuncs() error { } func (b *Server) ConnectToDatabase(dialect string) error { - dbase, err := gorm.Open(dialect, b.DatabaseUrl) + dbType, err := db.StringToDbType(dialect) + if err != nil { + return fmt.Errorf("unable to create db object with dialect %s: %w", dialect, err) + } + dbase, err := db.Open(dbType, b.DatabaseUrl) if err != nil { return fmt.Errorf("unable to create db object with dialect %s: %w", dialect, err) } if b.DatabaseMaxOpenConnections == 1 { return fmt.Errorf("unable to create db object with dialect %s: %s", dialect, "max_open_connections must be unlimited by setting 0 or at least 2") } else { - dbase.DB().SetMaxOpenConns(b.DatabaseMaxOpenConnections) + underlyingDB, err := dbase.DB() + if err != nil { + return fmt.Errorf("unable retreive db: %w", err) + } + underlyingDB.SetMaxOpenConns(b.DatabaseMaxOpenConnections) } b.Database = dbase if os.Getenv("BOUNDARY_DISABLE_GORM_FORMATTER") == "" { - gorm.LogFormatter = db.GetGormLogFormatter(b.Logger) - b.Database.SetLogger(db.GetGormLogger(b.Logger)) + newLogger := logger.New( + db.GetGormLogger(b.Logger), + logger.Config{ + LogLevel: logger.Error, // Log level + Colorful: false, // Disable color + }, + ) + dbase = dbase.Session(&gorm.Session{Logger: newLogger}) } + + b.Database = dbase + return nil } @@ -602,7 +620,11 @@ func (b *Server) CreateGlobalKmsKeys(ctx context.Context) error { func (b *Server) DestroyDevDatabase() error { if b.Database != nil { - b.Database.Close() + underlyingDB, err := b.Database.DB() + if err != nil { + return err + } + underlyingDB.Close() } if b.DevDatabaseCleanupFunc != nil { return b.DevDatabaseCleanupFunc() diff --git a/internal/cmd/commands/database/init.go b/internal/cmd/commands/database/init.go index ac5799355..47c40cd48 100644 --- a/internal/cmd/commands/database/init.go +++ b/internal/cmd/commands/database/init.go @@ -493,7 +493,11 @@ func (c *InitCommand) ParseFlagsAndConfig(args []string) int { func (c *InitCommand) verifyOplogIsEmpty() error { const op = "database.(InitCommand).verifyOplogIsEmpty" - r := c.srv.Database.DB().QueryRowContext(c.Context, "select not exists(select 1 from oplog_entry limit 1)") + underlyingDB, err := c.srv.Database.DB() + if err != nil { + return errors.NewDeprecated(errors.Internal, op, "unable to retreive db", errors.WithWrap(err)) + } + r := underlyingDB.QueryRowContext(c.Context, "select not exists(select 1 from oplog_entry limit 1)") if r.Err() != nil { return r.Err() } diff --git a/internal/cmd/commands/server/server.go b/internal/cmd/commands/server/server.go index 1d48c0f1e..1139573a9 100644 --- a/internal/cmd/commands/server/server.go +++ b/internal/cmd/commands/server/server.go @@ -394,7 +394,12 @@ func (c *Command) Run(args []string) int { return base.CommandCliError } - sMan, err := schema.NewManager(c.Context, "postgres", c.Database.DB()) + underlyingDB, err := c.Database.DB() + if err != nil { + c.UI.Error(fmt.Errorf("Can't get db: %w.", err).Error()) + return base.CommandCliError + } + sMan, err := schema.NewManager(c.Context, "postgres", underlyingDB) if err != nil { c.UI.Error(fmt.Errorf("Can't get schema manager: %w.", err).Error()) return base.CommandCliError diff --git a/internal/credential/vault/client_certificate.go b/internal/credential/vault/client_certificate.go index 82f83e515..b368c7d72 100644 --- a/internal/credential/vault/client_certificate.go +++ b/internal/credential/vault/client_certificate.go @@ -5,6 +5,7 @@ import ( "crypto/ed25519" "crypto/hmac" "crypto/sha256" + "database/sql" "github.com/hashicorp/boundary/internal/credential/vault/store" "github.com/hashicorp/boundary/internal/db" @@ -119,11 +120,11 @@ func (c *ClientCertificate) hmacCertificateKey(ctx context.Context, cipher wrapp func (c *ClientCertificate) insertQuery() (query string, queryValues []interface{}) { query = upsertClientCertQuery queryValues = []interface{}{ - c.StoreId, - c.Certificate, - c.CtCertificateKey, - c.CertificateKeyHmac, - c.KeyId, + sql.Named("store_id", c.StoreId), + sql.Named("certificate", c.Certificate), + sql.Named("certificate_key", c.CtCertificateKey), + sql.Named("certificate_key_hmac", c.CertificateKeyHmac), + sql.Named("key_id", c.KeyId), } return } diff --git a/internal/credential/vault/credential.go b/internal/credential/vault/credential.go index 4d4f4b707..a3e9178f7 100644 --- a/internal/credential/vault/credential.go +++ b/internal/credential/vault/credential.go @@ -1,6 +1,7 @@ package vault import ( + "database/sql" "time" "github.com/hashicorp/boundary/internal/credential" @@ -118,31 +119,31 @@ func (c *Credential) oplog(op oplog.OpType) oplog.Metadata { func (c *Credential) insertQuery() (query string, queryValues []interface{}) { queryValues = []interface{}{ - c.PublicId, - c.LibraryId, - c.SessionId, - c.TokenHmac, - c.ExternalId, - c.IsRenewable, - c.Status, - "now()", + sql.Named("public_id", c.PublicId), + sql.Named("library_id", c.LibraryId), + sql.Named("session_id", c.SessionId), + sql.Named("token_hmac", c.TokenHmac), + sql.Named("external_id", c.ExternalId), + sql.Named("is_renewable", c.IsRenewable), + sql.Named("status", c.Status), + sql.Named("last_renewal_time", "now()"), } switch { case c.expiration == 0: query = insertCredentialWithInfiniteExpirationQuery default: query = insertCredentialWithExpirationQuery - queryValues = append(queryValues, int(c.expiration.Round(time.Second).Seconds())) + queryValues = append(queryValues, sql.Named("expiration_time", int(c.expiration.Round(time.Second).Seconds()))) } return } func (c *Credential) updateSessionQuery(purpose credential.Purpose) (query string, queryValues []interface{}) { queryValues = []interface{}{ - c.PublicId, - c.LibraryId, - c.SessionId, - string(purpose), + sql.Named("public_id", c.PublicId), + sql.Named("library_id", c.LibraryId), + sql.Named("session_id", c.SessionId), + sql.Named("purpose", string(purpose)), } query = updateSessionCredentialQuery return diff --git a/internal/credential/vault/credential_test.go b/internal/credential/vault/credential_test.go index 280598dc5..07b6e795b 100644 --- a/internal/credential/vault/credential_test.go +++ b/internal/credential/vault/credential_test.go @@ -132,7 +132,7 @@ func TestCredential_New(t *testing.T) { SessionId: session.GetPublicId(), ExternalId: "some/vault/credential", TokenHmac: token.GetTokenHmac(), - ExpirationTime: timestamp.New(db.PositiveInfinityTS), + ExpirationTime: timestamp.New(timestamp.PositiveInfinityTS), Status: string(ActiveCredential), }, }, diff --git a/internal/credential/vault/jobs_test.go b/internal/credential/vault/jobs_test.go index 3dfc1c24c..35f963c98 100644 --- a/internal/credential/vault/jobs_test.go +++ b/internal/credential/vault/jobs_test.go @@ -2,6 +2,7 @@ package vault import ( "context" + "database/sql" "path" "strings" "testing" @@ -18,9 +19,9 @@ import ( "github.com/hashicorp/boundary/internal/target" wrapping "github.com/hashicorp/go-kms-wrapping" vault "github.com/hashicorp/vault/api" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gorm.io/gorm" ) const testUpdateTokenStatusExpirationQuery = ` @@ -55,23 +56,23 @@ func testVaultToken(t *testing.T, query := insertTokenQuery queryValues := []interface{}{ - inToken.TokenHmac, - inToken.CtToken, - inToken.StoreId, - inToken.KeyId, - inToken.Status, + sql.Named("1", inToken.TokenHmac), + sql.Named("2", inToken.CtToken), + sql.Named("3", inToken.StoreId), + sql.Named("4", inToken.KeyId), + sql.Named("5", inToken.Status), } expire := int(expiration.Seconds()) if expire < 0 { // last_renewal_time must be before expiration_time, if we are testing a expiration // in the past set last_renewal_time to 1 second before that query = strings.Replace(query, - "$6, -- last_renewal_time", - "wt_add_seconds_to_now($6), -- last_renewal_time", + "@6, -- last_renewal_time", + "wt_add_seconds_to_now(@6), -- last_renewal_time", -1) - queryValues = append(queryValues, expire-1, expire) + queryValues = append(queryValues, expire-1, sql.Named("6", expire)) } else { - queryValues = append(queryValues, "now()", expire) + queryValues = append(queryValues, sql.Named("6", "now()"), sql.Named("7", expire)) } numRows, err := rw.Exec(context.Background(), query, queryValues) @@ -114,25 +115,25 @@ func testVaultCred(t *testing.T, query := insertCredentialWithExpirationQuery queryValues := []interface{}{ - id, - cl.GetPublicId(), - sess.GetPublicId(), - token.GetTokenHmac(), - secret.LeaseID, - true, - status, + sql.Named("public_id", id), + sql.Named("library_id", cl.GetPublicId()), + sql.Named("session_id", sess.GetPublicId()), + sql.Named("token_hmac", token.GetTokenHmac()), + sql.Named("external_id", secret.LeaseID), + sql.Named("is_renewable", true), + sql.Named("status", status), } expire := int(expiration.Seconds()) if expire < 0 { // last_renewal_time must be before expiration_time, if we are testing a expiration // in the past set last_renewal_time to 1 second before that query = strings.Replace(query, - "$8, -- last_renewal_time", - "wt_add_seconds_to_now($8), -- last_renewal_time", + "@last_renewal_time, -- last_renewal_time", + "wt_add_seconds_to_now(@last_renewal_time), -- last_renewal_time", -1) - queryValues = append(queryValues, expire-1, expire) + queryValues = append(queryValues, sql.Named("last_renewal_time", expire-1), sql.Named("expiration_time", expire)) } else { - queryValues = append(queryValues, "now()", expire) + queryValues = append(queryValues, sql.Named("last_renewal_time", "now()"), sql.Named("expiration_time", expire)) } numRows, err := rw.Exec(context.Background(), query, queryValues) diff --git a/internal/credential/vault/private_library.go b/internal/credential/vault/private_library.go index af52c4555..12a27f203 100644 --- a/internal/credential/vault/private_library.go +++ b/internal/credential/vault/private_library.go @@ -2,6 +2,7 @@ package vault import ( "context" + "database/sql" "fmt" "strings" @@ -170,14 +171,17 @@ func (r *Repository) getPrivateLibraries(ctx context.Context, requests []credent } libIds := mapper.libIds() - - inClause := strings.TrimSuffix(strings.Repeat("?,", len(libIds)), ",") + var inClauseSpots []string + for i := 1; i < len(libIds)+1; i++ { + inClauseSpots = append(inClauseSpots, fmt.Sprintf("@%d", i)) + } + inClause := strings.Join(inClauseSpots, ",") query := fmt.Sprintf(selectPrivateLibrariesQuery, inClause) var params []interface{} - for _, v := range libIds { - params = append(params, v) + for idx, v := range libIds { + params = append(params, sql.Named(fmt.Sprintf("%d", idx+1), v)) } rows, err := r.reader.Query(ctx, query, params) if err != nil { diff --git a/internal/credential/vault/query.go b/internal/credential/vault/query.go index 0a783b488..3346a71af 100644 --- a/internal/credential/vault/query.go +++ b/internal/credential/vault/query.go @@ -11,13 +11,13 @@ insert into credential_vault_token ( last_renewal_time, -- $6 expiration_time -- $7 ) values ( - $1, -- token_hmac - $2, -- token - $3, -- store_id - $4, -- key_id - $5, -- status - $6, -- last_renewal_time - wt_add_seconds_to_now($7) -- expiration_time + @1, -- token_hmac + @2, -- token + @3, -- store_id + @4, -- key_id + @5, -- status + @6, -- last_renewal_time + wt_add_seconds_to_now(@7) -- expiration_time ); ` @@ -33,15 +33,15 @@ insert into credential_vault_credential ( last_renewal_time, -- $8 expiration_time -- $9 ) values ( - $1, -- public_id - $2, -- library_id - $3, -- session_id - $4, -- token_hmac - $5, -- external_id - $6, -- is_renewable - $7, -- status - $8, -- last_renewal_time - wt_add_seconds_to_now($9) -- expiration_time + @public_id, -- public_id + @library_id, -- library_id + @session_id, -- session_id + @token_hmac, -- token_hmac + @external_id, -- external_id + @is_renewable, -- is_renewable + @status, -- status + @last_renewal_time, -- last_renewal_time + wt_add_seconds_to_now(@expiration_time) -- expiration_time ); ` @@ -57,14 +57,14 @@ insert into credential_vault_credential ( last_renewal_time, -- $8 expiration_time -- infinity ) values ( - $1, -- public_id - $2, -- library_id - $3, -- session_id - $4, -- token_hmac - $5, -- external_id - $6, -- is_renewable - $7, -- status - $8, -- last_renewal_time + @public_id, -- public_id + @library_id, -- library_id + @session_id, -- session_id + @token_hmac, -- token_hmac + @external_id, -- external_id + @is_renewable, -- is_renewable + @status, -- status + @last_renewal_time, -- last_renewal_time 'infinity' -- expiration_time ); ` @@ -73,7 +73,7 @@ insert into credential_vault_credential ( insert into credential_vault_client_certificate (store_id, certificate, certificate_key, certificate_key_hmac, key_id) values - ($1, $2, $3, $4, $5) + (@store_id, @certificate, @certificate_key, @certificate_key_hmac, @key_id) on conflict (store_id) do update set certificate = excluded.certificate, certificate_key = excluded.certificate_key, @@ -84,7 +84,7 @@ returning *; deleteClientCertQuery = ` delete from credential_vault_client_certificate - where store_id = $1; + where store_id = ?; ` selectPrivateLibrariesQuery = ` @@ -95,10 +95,10 @@ select * updateSessionCredentialQuery = ` update session_credential_dynamic - set credential_id = $1 - where library_id = $2 - and session_id = $3 - and credential_purpose = $4 + set credential_id = @public_id + where library_id = @library_id + and session_id = @session_id + and credential_purpose = @purpose and credential_id is null returning *; ` @@ -129,7 +129,7 @@ select extract(epoch from (last_renewal_time + (expiration_time - last_renewal_t revokeCredentialsQuery = ` update credential_vault_credential set status = 'revoke' - where session_id = $1 + where session_id = ? and status = 'active'; ` @@ -166,7 +166,7 @@ update credential_vault_credential softDeleteStoreQuery = ` update credential_vault_store set delete_time = now() - where public_id = $1 + where public_id = ? and delete_time is null returning *; ` diff --git a/internal/credential/vault/repository_credential_library_test.go b/internal/credential/vault/repository_credential_library_test.go index ba9dbe52f..6a1e9320f 100644 --- a/internal/credential/vault/repository_credential_library_test.go +++ b/internal/credential/vault/repository_credential_library_test.go @@ -795,7 +795,9 @@ func TestRepository_UpdateCredentialLibrary(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.StoreId, got.StoreId) - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { dbassert.IsNull(got, "name") return diff --git a/internal/credential/vault/repository_credential_store_test.go b/internal/credential/vault/repository_credential_store_test.go index 3ce3530fb..e44b0bde7 100644 --- a/internal/credential/vault/repository_credential_store_test.go +++ b/internal/credential/vault/repository_credential_store_test.go @@ -20,10 +20,10 @@ import ( "github.com/hashicorp/boundary/internal/oplog" "github.com/hashicorp/boundary/internal/scheduler" wrapping "github.com/hashicorp/go-kms-wrapping" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/protobuf/testing/protocmp" + "gorm.io/gorm" ) func TestRepository_CreateCredentialStoreResource(t *testing.T) { @@ -234,6 +234,7 @@ func TestRepository_LookupCredentialStore(t *testing.T) { csWithoutClientCert := stores[1] ccert := allocClientCertificate() + ccert.StoreId = csWithoutClientCert.GetPublicId() rows, err := rw.Delete(context.Background(), ccert, db.WithWhere("store_id = ?", csWithoutClientCert.GetPublicId())) require.NoError(t, err) require.Equal(t, 1, rows) @@ -755,7 +756,9 @@ func TestRepository_UpdateCredentialStore_Attributes(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.ScopeId, got.ScopeId) - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { dbassert.IsNull(got, "name") } else { @@ -884,8 +887,9 @@ func TestRepository_UpdateCredentialStore_Attributes(t *testing.T) { assert.Equal(1, gotCount2, "count of updated records") require.NotNil(got2) assert.Nil(got2.CaCert) - - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) dbassert.IsNull(got2, "CaCert") }) @@ -1306,7 +1310,7 @@ func TestRepository_DeleteCredentialStore(t *testing.T) { const query = ` update credential_vault_token set status = 'revoked' - where store_id = $1 + where store_id = ? and status = 'current'; ` t.Helper() @@ -1328,7 +1332,7 @@ update credential_vault_token const query = ` update credential_vault_token set status = 'expired' - where store_id = $1 + where store_id = ? and status = 'current'; ` t.Helper() diff --git a/internal/credential/vault/testing.go b/internal/credential/vault/testing.go index 858e1b6ac..bc9bb2741 100644 --- a/internal/credential/vault/testing.go +++ b/internal/credential/vault/testing.go @@ -26,10 +26,9 @@ import ( "github.com/hashicorp/boundary/internal/scheduler" wrapping "github.com/hashicorp/go-kms-wrapping" vault "github.com/hashicorp/vault/api" - "github.com/jinzhu/gorm" - _ "github.com/lib/pq" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gorm.io/gorm" ) // TestCredentialStore creates a vault credential store in the provided DB with diff --git a/internal/credential/vault/vault_token.go b/internal/credential/vault/vault_token.go index 8836f3b98..5e7321f65 100644 --- a/internal/credential/vault/vault_token.go +++ b/internal/credential/vault/vault_token.go @@ -4,6 +4,7 @@ import ( "context" "crypto/hmac" "crypto/sha256" + "database/sql" "time" "github.com/hashicorp/boundary/internal/credential/vault/store" @@ -139,13 +140,13 @@ func (t *Token) insertQuery() (query string, queryValues []interface{}) { exp := int(t.expiration.Round(time.Second).Seconds()) queryValues = []interface{}{ - t.TokenHmac, - t.CtToken, - t.StoreId, - t.KeyId, - t.Status, - "now()", - exp, + sql.Named("1", t.TokenHmac), + sql.Named("2", t.CtToken), + sql.Named("3", t.StoreId), + sql.Named("4", t.KeyId), + sql.Named("5", t.Status), + sql.Named("6", "now()"), + sql.Named("7", exp), } return } diff --git a/internal/db/README.md b/internal/db/README.md index f29d1d272..120bcc162 100644 --- a/internal/db/README.md +++ b/internal/db/README.md @@ -4,7 +4,12 @@ Just some high-level usage highlights to get you started. Read the godocs for a complete list of capabilities and their documentation. ```go - conn, _ := gorm.Open("postgres", url) + dialect = postgres.New(postgres.Config{ + DSN: connectionUrl}, + ) + conn, _ := gorm.Open(dialect, &gorm.Config{ + ConvertNullToZeroValues: true, + }) // Db implements both the Reader and Writer interfaces rw := Db{Tx: conn} diff --git a/internal/db/assert/asserts_test.go b/internal/db/assert/asserts_test.go index 3e37ba93e..fff28927f 100644 --- a/internal/db/assert/asserts_test.go +++ b/internal/db/assert/asserts_test.go @@ -3,11 +3,14 @@ package dbassert import ( "testing" + "github.com/hashicorp/boundary/internal/db" dbassert "github.com/hashicorp/dbassert" gormAssert "github.com/hashicorp/dbassert/gorm" + "github.com/hashicorp/vault/sdk/helper/base62" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gorm.io/gorm" ) func Test_FieldDomain(t *testing.T) { @@ -56,23 +59,18 @@ func Test_FieldNullable(t *testing.T) { func Test_FieldIsNull(t *testing.T) { t.Parallel() - cleanup, conn, _ := dbassert.TestSetup(t, "postgres") - defer func() { - if err := cleanup(); err != nil { - t.Error(err) - } - if err := conn.Close(); err != nil { - t.Error(err) - } - }() assert := assert.New(t) - gormDb, err := gorm.Open("postgres", conn) + conn, _ := db.TestSetup(t, "postgres") + initStore(t, conn) + require := require.New(t) + underlyingDB, err := conn.DB() + require.NoError(err) assert.NoError(err) mockery := new(dbassert.MockTesting) - dbassert := New(mockery, conn) + dbassert := New(mockery, underlyingDB) v := 1 - m := gormAssert.CreateTestModel(t, gormDb, nil, &v) + m := createTestModel(t, conn, nil, &v) dbassert.IsNull(&m, "Nullable") mockery.AssertNoError(t) @@ -84,23 +82,16 @@ func Test_FieldIsNull(t *testing.T) { func Test_FieldNotNull(t *testing.T) { t.Parallel() - cleanup, conn, _ := dbassert.TestSetup(t, "postgres") - defer func() { - if err := cleanup(); err != nil { - t.Error(err) - } - if err := conn.Close(); err != nil { - t.Error(err) - } - }() - assert := assert.New(t) - gormDb, err := gorm.Open("postgres", conn) - assert.NoError(err) + conn, _ := db.TestSetup(t, "postgres") + initStore(t, conn) + require := require.New(t) + underlyingDB, err := conn.DB() + require.NoError(err) mockery := new(dbassert.MockTesting) - dbassert := New(mockery, conn) + dbassert := New(mockery, underlyingDB) v := 1 - m := gormAssert.CreateTestModel(t, gormDb, nil, &v) + m := createTestModel(t, conn, nil, &v) dbassert.NotNull(&m, "Nullable") mockery.AssertError(t) @@ -109,3 +100,54 @@ func Test_FieldNotNull(t *testing.T) { dbassert.NotNull(&m, "typeint") mockery.AssertNoError(t) } + +type testModel struct { + Id int `gorm:"primary_key"` + PublicId string + Nullable *string + TypeInt *int +} + +// TableName is required by Gorm to define the model's table name when it +// doesn't match the model's Go type name. +func (*testModel) TableName() string { return "test_table_dbasserts" } + +// CreateTestModel is a helper that creates a testModel in the DB. +func createTestModel(t dbassert.TestingT, db *gorm.DB, nullable *string, typeInt *int) *testModel { + publicId, err := base62.Random(12) + assert.NoError(t, err) + m := testModel{ + PublicId: publicId, + Nullable: nullable, + TypeInt: typeInt, + } + err = db.Create(&m).Error + assert.NoError(t, err) + return &m +} + +func initStore(t *testing.T, db *gorm.DB) { + t.Helper() + const ( + createDomainType = ` +create domain dbasserts_public_id as text +check( + length(trim(value)) > 10 +); +comment on domain dbasserts_public_id is +'dbasserts test domain type'; +` + createTable = ` +create table if not exists test_table_dbasserts ( + id bigint generated always as identity primary key, + public_id dbasserts_public_id not null, + nullable text, + type_int int +); +comment on table test_table_dbasserts is +'dbasserts test table' +` + ) + require.NoError(t, db.Exec(createDomainType).Error) + require.NoError(t, db.Exec(createTable).Error) +} diff --git a/internal/db/common/update.go b/internal/db/common/update.go index fd40ee2ac..71b11e3fd 100644 --- a/internal/db/common/update.go +++ b/internal/db/common/update.go @@ -9,7 +9,7 @@ import ( "strings" "github.com/hashicorp/boundary/internal/errors" - "github.com/jinzhu/gorm" + "gorm.io/gorm" ) // UpdateFields will create a map[string]interface of the update values to be diff --git a/internal/db/common/update_test.go b/internal/db/common/update_test.go index 41d41b3c7..4da3a16c6 100644 --- a/internal/db/common/update_test.go +++ b/internal/db/common/update_test.go @@ -6,8 +6,8 @@ import ( "github.com/hashicorp/boundary/internal/db/db_test" "github.com/hashicorp/go-secure-stdlib/base62" "github.com/hashicorp/go-uuid" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" + "gorm.io/gorm" ) func Test_intersection(t *testing.T) { diff --git a/internal/db/db.go b/internal/db/db.go index f506c9845..6331a08dd 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -4,24 +4,14 @@ import ( "context" stderrors "errors" "fmt" - "math" - "time" "github.com/hashicorp/boundary/internal/observability/event" "github.com/hashicorp/go-hclog" - "github.com/jinzhu/gorm" - "github.com/lib/pq" + "github.com/jackc/pgconn" + "gorm.io/driver/postgres" + "gorm.io/gorm" ) -var ( - NegativeInfinityTS = time.Date(math.MinInt32, time.January, 1, 0, 0, 0, 0, time.UTC) - PositiveInfinityTS = time.Date(math.MaxInt32, time.December, 31, 23, 59, 59, 1e9-1, time.UTC) -) - -func init() { - pq.EnableInfinityTs(NegativeInfinityTS, PositiveInfinityTS) -} - type DbType int const ( @@ -35,11 +25,30 @@ func (db DbType) String() string { "postgres", }[db] } +func StringToDbType(dialect string) (DbType, error) { + switch dialect { + case "postgres": + return Postgres, nil + default: + return UnknownDB, fmt.Errorf("%s is an unknown dialect", dialect) + } +} // Open a database connection which is long-lived. // You need to call Close() on the returned gorm.DB func Open(dbType DbType, connectionUrl string) (*gorm.DB, error) { - db, err := gorm.Open(dbType.String(), connectionUrl) + var dialect gorm.Dialector + switch dbType { + case Postgres: + dialect = postgres.New(postgres.Config{ + DSN: connectionUrl}, + ) + default: + return nil, fmt.Errorf("unable to open %s database type", dbType) + } + db, err := gorm.Open(dialect, &gorm.Config{ + ConvertNullToZeroValues: true, + }) if err != nil { return nil, fmt.Errorf("unable to open database: %w", err) } @@ -52,7 +61,7 @@ func GetGormLogFormatter(log hclog.Logger) func(values ...interface{}) (messages return func(values ...interface{}) (messages []interface{}) { if len(values) > 2 && values[0].(string) == "log" { switch values[2].(type) { - case *pq.Error: + case *pgconn.PgError: if log.IsTrace() { event.WriteError(ctx, op, stderrors.New("error from database adapter"), event.WithInfo("error", values[2], "location", values[1])) } @@ -67,14 +76,13 @@ type gormLogger struct { logger hclog.Logger } -func (g gormLogger) Print(values ...interface{}) { - formatted := gorm.LogFormatter(values...) - if formatted == nil { - return +func (g gormLogger) Printf(msg string, values ...interface{}) { + if len(values) > 1 { + switch values[1].(type) { + case *pgconn.PgError: + g.logger.Trace("error from database adapter", "location", values[0], "error", values[1]) + } } - // Our formatter should elide anything we don't want so this should never - // happen, panic if so so we catch/fix - panic("unhandled error case") } func GetGormLogger(log hclog.Logger) gormLogger { diff --git a/internal/db/db_test.go b/internal/db/db_test.go index 7329ceb17..915da9e26 100644 --- a/internal/db/db_test.go +++ b/internal/db/db_test.go @@ -4,8 +4,7 @@ import ( "testing" "github.com/hashicorp/boundary/testing/dbtest" - "github.com/lib/pq" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestOpen(t *testing.T) { @@ -49,7 +48,10 @@ func TestOpen(t *testing.T) { got, err := Open(tt.args.dbType, tt.args.connectionUrl) defer func() { if err == nil { - got.Close() + sqlDB, err := got.DB() + require.NoError(t, err) + err = sqlDB.Close() + require.NoError(t, err) } }() if (err != nil) != tt.wantErr { @@ -62,9 +64,3 @@ func TestOpen(t *testing.T) { }) } } - -func TestPostgresInfinity(t *testing.T) { - assert.Panics(t, func() { - pq.EnableInfinityTs(NegativeInfinityTS, PositiveInfinityTS) - }) -} diff --git a/internal/db/domains_test.go b/internal/db/domains_test.go index be5b5b6a5..bd99618da 100644 --- a/internal/db/domains_test.go +++ b/internal/db/domains_test.go @@ -26,7 +26,8 @@ returning id; ) conn, _ := TestSetup(t, "postgres") - db := conn.DB() + db, err := conn.DB() + require.NoError(t, err) for _, typ := range []string{"public", "private", "role", "scope"} { createTable := strings.Replace(createTableBase, "{{rep}}", typ, -1) @@ -108,7 +109,8 @@ values ($1); ) conn, _ := TestSetup(t, "postgres") - db := conn.DB() + db, err := conn.DB() + require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { t.Fatalf("query: \n%s\n error: %s", createTable, err) @@ -179,7 +181,8 @@ values ($1); ) conn, _ := TestSetup(t, "postgres") - db := conn.DB() + db, err := conn.DB() + require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { t.Fatalf("query: \n%s\n error: %s", createTable, err) @@ -254,7 +257,8 @@ returning id; ) conn, _ := TestSetup(t, "postgres") - db := conn.DB() + db, err := conn.DB() + require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { t.Fatalf("query: \n%s\n error: %s", createTable, err) } @@ -320,8 +324,9 @@ set update_time = null; ) conn, _ := TestSetup(t, "postgres") - db := conn.DB() - _, err := db.Exec(createTable) + db, err := conn.DB() + require.NoError(t, err) + _, err = db.Exec(createTable) assert.NoError(err) _, err = db.Exec(addTriggers) @@ -392,8 +397,10 @@ returning public_id; conn, _ := TestSetup(t, "postgres") assert, require := assert.New(t), require.New(t) - db := conn.DB() - _, err := db.Exec(createTable) + db, err := conn.DB() + require.NoError(err) + + _, err = db.Exec(createTable) require.NoError(err) _, err = db.Exec(addTrigger) @@ -451,8 +458,10 @@ returning private_id; conn, _ := TestSetup(t, "postgres") assert, require := assert.New(t), require.New(t) - db := conn.DB() - _, err := db.Exec(createTable) + db, err := conn.DB() + require.NoError(err) + + _, err = db.Exec(createTable) require.NoError(err) _, err = db.Exec(addTrigger) @@ -483,8 +492,8 @@ returning private_id; func TestDomain_DefaultUsersExist(t *testing.T) { conn, _ := TestSetup(t, "postgres") - db := conn.DB() - + db, err := conn.DB() + require.NoError(t, err) for _, val := range []string{"u_anon", "u_auth"} { rows, err := db.Query(`select from iam_user where public_id = $1`, val) require.NoError(t, err) @@ -572,8 +581,9 @@ set id = null; } conn, _ := TestSetup(t, "postgres") - db := conn.DB() - _, err := db.Exec(createTable) + db, err := conn.DB() + require.NoError(t, err) + _, err = db.Exec(createTable) assert.NoError(t, err) _, err = db.Exec(addTriggers) @@ -658,7 +668,7 @@ set id = null; _, err = db.Exec(update_updatable) require.Error(err) - assert.Containsf(err.Error(), `pq: column "bad_column_name" not found`, "unexpected error msg: %s", err.Error()) + assert.Containsf(err.Error(), `SQLSTATE 42703`, "unexpected error msg: %s", err.Error()) var found rowData err = db.QueryRow(query, id).Scan(&found.Id, &found.Name, &found.CreateTime, &found.Updatable) @@ -685,7 +695,8 @@ returning id; ) conn, _ := TestSetup(t, "postgres") - db := conn.DB() + db, err := conn.DB() + require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { t.Fatalf("query: \n%s\n error: %s", createTable, err) @@ -732,7 +743,8 @@ returning id; ) conn, _ := TestSetup(t, "postgres") - db := conn.DB() + db, err := conn.DB() + require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { t.Fatalf("query: \n%s\n error: %s", createTable, err) @@ -778,7 +790,8 @@ returning id; ) conn, _ := TestSetup(t, "postgres") - db := conn.DB() + db, err := conn.DB() + require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { t.Fatalf("query: \n%s\n error: %s", createTable, err) @@ -824,7 +837,8 @@ returning id; ) conn, _ := TestSetup(t, "postgres") - db := conn.DB() + db, err := conn.DB() + require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { t.Fatalf("query: \n%s\n error: %s", createTable, err) @@ -870,7 +884,8 @@ returning id; ) conn, _ := TestSetup(t, "postgres") - db := conn.DB() + db, err := conn.DB() + require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { t.Fatalf("query: \n%s\n error: %s", createTable, err) @@ -916,7 +931,8 @@ returning id; ) conn, _ := TestSetup(t, "postgres") - db := conn.DB() + db, err := conn.DB() + require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { t.Fatalf("query: \n%s\n error: %s", createTable, err) @@ -966,7 +982,8 @@ select wt_is_sentinel($1); ) conn, _ := TestSetup(t, "postgres") - db := conn.DB() + db, err := conn.DB() + require.NoError(t, err) tests := []struct { name string @@ -1028,8 +1045,10 @@ insert on test_not_null_columns ) conn, _ := TestSetup(t, "postgres") - db := conn.DB() - _, err := db.Exec(createTable) + db, err := conn.DB() + assert.NoError(t, err) + + _, err = db.Exec(createTable) assert.NoError(t, err) tests := []struct { diff --git a/internal/db/read_writer.go b/internal/db/read_writer.go index 087962e43..f6946017b 100644 --- a/internal/db/read_writer.go +++ b/internal/db/read_writer.go @@ -13,8 +13,8 @@ import ( "github.com/hashicorp/boundary/internal/oplog" "github.com/hashicorp/boundary/internal/oplog/store" wrapping "github.com/hashicorp/go-kms-wrapping" - "github.com/jinzhu/gorm" "google.golang.org/protobuf/proto" + "gorm.io/gorm" ) const ( @@ -438,16 +438,26 @@ func (rw *Db) Update(ctx context.Context, i interface{}, fieldMaskPaths []string return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("no fields matched using fieldMaskPaths %s", fieldMaskPaths)) } - // This is not a boundary scope, but rather a gorm Scope: - // https://godoc.org/github.com/jinzhu/gorm#DB.NewScope - scope := rw.underlying.NewScope(i) - if scope.PrimaryKeyZero() { - return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "primary key is not set") + names, isZero, err := rw.primaryFieldsAreZero(ctx, i) + if err != nil { + return NoRowsAffected, errors.Wrap(ctx, err, op) + } + if isZero { + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("primary key is not set for: %s", names), errors.WithoutEvent()) } - for _, f := range scope.PrimaryFields() { - if contains(fieldMaskPaths, f.Name) { - return NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, fmt.Sprintf("not allowed on primary key field %s", f.Name)) + mDb := rw.underlying.Model(i) + err = mDb.Statement.Parse(i) + if err != nil || mDb.Statement.Schema == nil { + return NoRowsAffected, errors.New(ctx, errors.Unknown, op, "internal error: unable to parse stmt", errors.WithWrap(err)) + } + reflectValue := reflect.Indirect(reflect.ValueOf(i)) + for _, pf := range mDb.Statement.Schema.PrimaryFields { + if _, isZero := pf.ValueOf(reflectValue); isZero { + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("primary key %s is not set", pf.Name)) + } + if contains(fieldMaskPaths, pf.Name) { + return NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, fmt.Sprintf("not allowed on primary key field %s", pf.Name)) } } @@ -482,8 +492,14 @@ func (rw *Db) Update(ctx context.Context, i interface{}, fieldMaskPaths []string if *opts.WithVersion == 0 { return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "with version option is zero") } - if _, ok := scope.FieldByName("version"); !ok { - return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s does not have a version field", scope.TableName())) + mDb := rw.underlying.Model(i) + err = mDb.Statement.Parse(i) + if err != nil && mDb.Statement.Schema == nil { + return NoRowsAffected, errors.New(ctx, errors.Unknown, op, "internal error: unable to parse stmt", errors.WithWrap(err)) + } + if !contains(mDb.Statement.Schema.DBNames, "version") { + // if _, ok := stmt.Schema.FieldsByName["version"]; !ok { + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s does not have a version field", mDb.Statement.Schema.Table)) } where, args = append(where, "version = ?"), append(args, opts.WithVersion) } @@ -554,14 +570,19 @@ func (rw *Db) Delete(ctx context.Context, i interface{}, opt ...Option) (int, er if withOplog && opts.newOplogMsg != nil { return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "both WithOplog and NewOplogMsg options have been specified") } - // This is not a boundary scope, but rather a gorm Scope: - // https://godoc.org/github.com/jinzhu/gorm#DB.NewScope - scope := rw.underlying.NewScope(i) - if opts.withWhereClause == "" { - if scope.PrimaryKeyZero() { - return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "primary key is not set") + + mDb := rw.underlying.Model(i) + err := mDb.Statement.Parse(i) + if err == nil && mDb.Statement.Schema == nil { + return NoRowsAffected, errors.New(ctx, errors.Unknown, op, "internal error: unable to parse stmt", errors.WithWrap(err)) + } + reflectValue := reflect.Indirect(reflect.ValueOf(i)) + for _, pf := range mDb.Statement.Schema.PrimaryFields { + if _, isZero := pf.ValueOf(reflectValue); isZero { + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("primary key %s is not set", pf.Name)) } } + if withOplog { _, err := validateOplogArgs(ctx, i, opts) if err != nil { @@ -923,7 +944,8 @@ func (w *Db) DoTx(ctx context.Context, retries uint, backOff Backoff, Handler Tx } // step one of this, start a transaction... - newTx := w.underlying.BeginTx(ctx, nil) + newTx := w.underlying.WithContext(ctx) + newTx = newTx.Begin() rw := &Db{newTx} if err := Handler(rw, rw); err != nil { @@ -1036,8 +1058,10 @@ func (rw *Db) SearchWhere(ctx context.Context, resources interface{}, where stri return errors.New(ctx, errors.InvalidParameter, op, "interface parameter must to be a pointer") } var err error - db := rw.underlying.Order(opts.withOrder) - + db := rw.underlying.WithContext(ctx) + if opts.withOrder != "" { + db = db.Order(opts.withOrder) + } // Perform limiting switch { case opts.WithLimit < 0: // any negative number signals unlimited results @@ -1060,6 +1084,23 @@ func (rw *Db) SearchWhere(ctx context.Context, resources interface{}, where stri return nil } +func (rw *Db) primaryFieldsAreZero(ctx context.Context, i interface{}) ([]string, bool, error) { + const op = "db.primaryFieldsAreZero" + var fieldNames []string + tx := rw.underlying.Model(i) + if err := tx.Statement.Parse(i); err != nil { + return nil, false, errors.Wrap(ctx, err, op, errors.WithoutEvent()) + } + for _, f := range tx.Statement.Schema.PrimaryFields { + if f.PrimaryKey { + if _, isZero := f.ValueOf(reflect.ValueOf(i)); isZero { + fieldNames = append(fieldNames, f.Name) + } + } + } + return fieldNames, len(fieldNames) > 0, nil +} + // filterPaths will filter out non-updatable fields func filterPaths(paths []string) []string { if len(paths) == 0 { diff --git a/internal/db/read_writer_test.go b/internal/db/read_writer_test.go index 8f7a615ae..9efedb326 100644 --- a/internal/db/read_writer_test.go +++ b/internal/db/read_writer_test.go @@ -18,11 +18,11 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-secure-stdlib/base62" "github.com/hashicorp/go-uuid" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" + "gorm.io/gorm" ) func TestDb_UpdateUnsetField(t *testing.T) { @@ -44,7 +44,7 @@ func TestDb_UpdateUnsetField(t *testing.T) { cnt, err := rw.Update(context.Background(), updatedTu, []string{"Name"}, nil) require.NoError(t, err) assert.Equal(t, 1, cnt) - assert.Equal(t, "ignore", updatedTu.Email) + assert.Equal(t, "", updatedTu.Email) assert.Equal(t, "updated", updatedTu.Name) } @@ -1463,7 +1463,7 @@ func TestDb_ScanRows(t *testing.T) { err = w.Create(context.Background(), user) require.NoError(err) assert.NotEmpty(user.Id) - where := "select * from db_test_user where name in ($1, $2)" + where := "select * from db_test_user where name in (?, ?)" rows, err := w.Query(context.Background(), where, []interface{}{"alice", "bob"}) require.NoError(err) defer func() { err := rows.Close(); assert.NoError(err) }() @@ -1493,7 +1493,7 @@ func TestDb_Query(t *testing.T) { assert.NotEmpty(user.Id) assert.Equal("alice", user.Name) - where := "select * from db_test_user where name in ($1, $2)" + where := "select * from db_test_user where name in (?, ?)" rows, err := rw.Query(context.Background(), where, []interface{}{"alice", "bob"}) require.NoError(err) defer func() { err := rows.Close(); assert.NoError(err) }() diff --git a/internal/db/schema/migrations/postgres/14/warehouse_user_dim_test.go b/internal/db/schema/migrations/postgres/14/warehouse_user_dim_test.go index 1b40812f2..9b82f9eb8 100644 --- a/internal/db/schema/migrations/postgres/14/warehouse_user_dim_test.go +++ b/internal/db/schema/migrations/postgres/14/warehouse_user_dim_test.go @@ -16,9 +16,9 @@ import ( "github.com/hashicorp/boundary/internal/target" "github.com/hashicorp/boundary/testing/dbtest" wrapping "github.com/hashicorp/go-kms-wrapping" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gorm.io/gorm" ) func TestMigrations_UserDimension(t *testing.T) { @@ -55,7 +55,9 @@ func TestMigrations_UserDimension(t *testing.T) { assert.False(state.Dirty) // okay, now we can seed the database with test data - conn, err := gorm.Open(dialect, u) + dbType, err := db.StringToDbType(dialect) + require.NoError(err) + conn, err := db.Open(dbType, u) require.NoError(err) rw := db.New(conn) diff --git a/internal/db/schema/migrations/postgres/16/warehouse_credential_dim_test.go b/internal/db/schema/migrations/postgres/16/warehouse_credential_dim_test.go index ef20f7fad..cb51f4856 100644 --- a/internal/db/schema/migrations/postgres/16/warehouse_credential_dim_test.go +++ b/internal/db/schema/migrations/postgres/16/warehouse_credential_dim_test.go @@ -18,9 +18,9 @@ import ( "github.com/hashicorp/boundary/internal/target" "github.com/hashicorp/boundary/testing/dbtest" wrapping "github.com/hashicorp/go-kms-wrapping" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gorm.io/gorm" ) func TestMigrations_CredentialDimension(t *testing.T) { @@ -56,8 +56,11 @@ func TestMigrations_CredentialDimension(t *testing.T) { assert.Equal(priorMigration, state.DatabaseSchemaVersion) assert.False(state.Dirty) + dbType, err := db.StringToDbType(dialect) + require.NoError(err) + // okay, now we can seed the database with test data - conn, err := gorm.Open(dialect, u) + conn, err := db.Open(dbType, u) require.NoError(err) rw := db.New(conn) diff --git a/internal/db/schema/migrations/postgres/2/07_iam_test.go b/internal/db/schema/migrations/postgres/2/07_iam_test.go index e24549b33..c52be8e2a 100644 --- a/internal/db/schema/migrations/postgres/2/07_iam_test.go +++ b/internal/db/schema/migrations/postgres/2/07_iam_test.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/boundary/internal/db/schema" "github.com/hashicorp/boundary/internal/iam" "github.com/hashicorp/boundary/testing/dbtest" - "github.com/jinzhu/gorm" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -56,7 +56,9 @@ func Test_PrimaryAuthMethodChanges(t *testing.T) { assert.False(state.Dirty) // okay, now we can seed the database with test data - conn, err := gorm.Open(dialect, u) + dbType, err := db.StringToDbType(dialect) + require.NoError(err) + conn, err := db.Open(dbType, u) require.NoError(err) rootWrapper := db.TestWrapper(t) iamRepo := iam.TestRepo(t, conn, rootWrapper) diff --git a/internal/db/schema/migrations/postgres/8/08_connection_test.go b/internal/db/schema/migrations/postgres/8/08_connection_test.go index 35367ce9f..0556c8de5 100644 --- a/internal/db/schema/migrations/postgres/8/08_connection_test.go +++ b/internal/db/schema/migrations/postgres/8/08_connection_test.go @@ -39,8 +39,9 @@ func TestMigration(t *testing.T) { ) conn, _ := db.TestSetup(t, "postgres", db.WithTemplate("template1")) - db := conn.DB() - _, err := db.Exec(createTables) + db, err := conn.DB() + require.NoError(err) + _, err = db.Exec(createTables) require.NoError(err) tests := []struct { diff --git a/internal/db/schema/migrations/postgres/9/managed_group_test.go b/internal/db/schema/migrations/postgres/9/managed_group_test.go index b6060519a..d39cc1d14 100644 --- a/internal/db/schema/migrations/postgres/9/managed_group_test.go +++ b/internal/db/schema/migrations/postgres/9/managed_group_test.go @@ -1,10 +1,13 @@ package migration import ( + "context" + "database/sql" "fmt" "testing" "time" + "github.com/hashicorp/boundary/internal/db" "github.com/hashicorp/boundary/internal/servers/controller" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -15,8 +18,7 @@ func Test_ManagedGroupTable(t *testing.T) { tc := controller.NewTestController(t, nil) defer tc.Shutdown() - db := tc.DbConn().DB() - var err error + rw := db.New(tc.DbConn()) managedGroupId := "a_bcdefghijk" defaultPasswordAuthMethodId := "ampw_1234567890" @@ -44,9 +46,12 @@ func Test_ManagedGroupTable(t *testing.T) { for _, tt := range insertTests { t.Run("insert: "+tt.testName, func(t *testing.T) { require := require.New(t) - _, err = db.Exec("insert into auth_managed_group values ($1, $2)", - tt.publicId, - tt.authMethodId) + + _, err := rw.Exec(context.Background(), "insert into auth_managed_group values (@public_id, @auth_method_id)", + []interface{}{ + sql.Named("public_id", tt.publicId), + sql.Named("auth_method_id", tt.authMethodId), + }) require.True(tt.wantErr == (err != nil)) }) } @@ -76,7 +81,11 @@ func Test_ManagedGroupTable(t *testing.T) { for _, tt := range updateTests { t.Run("update: "+tt.testName, func(t *testing.T) { assert := assert.New(t) - _, err = db.Exec(fmt.Sprintf("update auth_managed_group set %s = $1 where public_id = $2", tt.column), tt.value, tt.publicId) + _, err := rw.Exec(context.Background(), fmt.Sprintf("update auth_managed_group set %s = @value where public_id = @public_id", tt.column), + []interface{}{ + sql.Named("value", tt.value), + sql.Named("public_id", tt.publicId), + }) assert.True(tt.wantErr == (err != nil)) }) } @@ -87,8 +96,8 @@ func Test_OidcManagedGroupTable(t *testing.T) { tc := controller.NewTestController(t, nil) defer tc.Shutdown() - db := tc.DbConn().DB() - var err error + ctx := context.Background() + rw := db.New(tc.DbConn()) managedGroupId := "a_bcdefghijk" defaultPasswordAuthMethodId := "ampw_1234567890" @@ -150,18 +159,20 @@ func Test_OidcManagedGroupTable(t *testing.T) { for _, tt := range insertTests { t.Run("insert: "+tt.testName, func(t *testing.T) { require := require.New(t) - _, err = db.Exec("insert into auth_oidc_managed_group (public_id, auth_method_id, name, filter) values ($1, $2, $3, $4)", - tt.publicId, - tt.authMethodId, - tt.name, - tt.filter) + _, err := rw.Exec(ctx, "insert into auth_oidc_managed_group (public_id, auth_method_id, name, filter) values (@public_id, @auth_method_id, @name, @filter)", + []interface{}{ + sql.Named("public_id", tt.publicId), + sql.Named("auth_method_id", tt.authMethodId), + sql.Named("name", tt.name), + sql.Named("filter", tt.filter), + }) require.True(tt.wantErr == (err != nil)) }) } } // Read some values to validate that things were set automatically - rows, err := db.Query("select create_time, update_time, version from auth_oidc_managed_group") + rows, err := rw.Query(ctx, "select create_time, update_time, version from auth_oidc_managed_group", nil) require.NoError(t, err) require.True(t, rows.Next()) var create_time, update_time time.Time @@ -207,14 +218,17 @@ func Test_OidcManagedGroupTable(t *testing.T) { for _, tt := range updateTests { t.Run("update: "+tt.testName, func(t *testing.T) { require := require.New(t) - _, err = db.Exec(fmt.Sprintf("update auth_oidc_managed_group set %s = $1 where public_id = $2", tt.column), tt.value, managedGroupId) + _, err = rw.Exec(ctx, fmt.Sprintf("update auth_oidc_managed_group set %s = @value where public_id = @public_id", tt.column), + []interface{}{ + sql.Named("value", tt.value), sql.Named("public_id", managedGroupId), + }) require.True(tt.wantErr == (err != nil)) }) } } // Read values again to validate that things were updated automatically - rows, err = db.Query("select create_time, update_time, version from auth_oidc_managed_group") + rows, err = rw.Query(ctx, "select create_time, update_time, version from auth_oidc_managed_group", nil) require.NoError(t, err) require.True(t, rows.Next()) var updated_create_time, updated_update_time time.Time @@ -224,7 +238,7 @@ func Test_OidcManagedGroupTable(t *testing.T) { assert.Equal(t, 2, version) // Read values from auth_managed_group to ensure it was populated automatically - rows, err = db.Query("select public_id, auth_method_id from auth_managed_group") + rows, err = rw.Query(ctx, "select public_id, auth_method_id from auth_managed_group", nil) require.NoError(t, err) require.True(t, rows.Next()) var public_id, auth_method_id string @@ -233,14 +247,11 @@ func Test_OidcManagedGroupTable(t *testing.T) { assert.Equal(t, defaultOidcAuthMethodId, auth_method_id) // Delete the value from the subtype table - res, err := db.Exec("delete from auth_oidc_managed_group where public_id = $1", managedGroupId) - require.NoError(t, err) - affected, err := res.RowsAffected() - require.NoError(t, err) + affected, err := rw.Exec(ctx, "delete from auth_oidc_managed_group where public_id = @public_id", []interface{}{sql.Named("public_id", managedGroupId)}) require.EqualValues(t, 1, affected) // It should no longer be in the base table - rows, err = db.Query("select public_id, auth_method_id from auth_managed_group") + rows, err = rw.Query(ctx, "select public_id, auth_method_id from auth_managed_group", nil) require.NoError(t, err) require.False(t, rows.Next()) } @@ -250,8 +261,8 @@ func Test_AuthManagedOidcGroupMemberAccountTable(t *testing.T) { tc := controller.NewTestController(t, nil) defer tc.Shutdown() - db := tc.DbConn().DB() - var err error + ctx := context.Background() + rw := db.New(tc.DbConn()) managedGroupId := "a_bcdefghijk" defaultOidcAuthMethodId := "amoidc_1234567890" @@ -259,15 +270,17 @@ func Test_AuthManagedOidcGroupMemberAccountTable(t *testing.T) { filter := "this is a filter" // Insert valid data in auth_oidc_managed_group to use for the following tests - _, err = db.Exec("insert into auth_oidc_managed_group (public_id, auth_method_id, name, filter) values ($1, $2, $3, $4)", - managedGroupId, - defaultOidcAuthMethodId, - name, - filter) + _, err := rw.Exec(ctx, "insert into auth_oidc_managed_group (public_id, auth_method_id, name, filter) values (@public_id, @auth_method_id, @name, @filter)", + []interface{}{ + sql.Named("public_id", managedGroupId), + sql.Named("auth_method_id", defaultOidcAuthMethodId), + sql.Named("name", name), + sql.Named("filter", filter), + }) require.NoError(t, err) // Fetch a valid (oidc) account ID to use in insertion - rows, err := db.Query("select public_id from auth_oidc_account limit 1") + rows, err := rw.Query(ctx, "select public_id from auth_oidc_account limit 1", nil) require.NoError(t, err) require.True(t, rows.Next()) var accountId string @@ -310,16 +323,18 @@ func Test_AuthManagedOidcGroupMemberAccountTable(t *testing.T) { for _, tt := range insertTests { t.Run("insert: "+tt.testName, func(t *testing.T) { assert := assert.New(t) - _, err = db.Exec("insert into auth_oidc_managed_group_member_account (managed_group_id, member_id) values ($1, $2)", - tt.managedGroupId, - tt.memberId) + _, err = rw.Exec(ctx, "insert into auth_oidc_managed_group_member_account (managed_group_id, member_id) values (@group_id, @member_id)", + []interface{}{ + sql.Named("group_id", tt.managedGroupId), + sql.Named("member_id", tt.memberId), + }) assert.True(tt.wantErr == (err != nil)) }) } } // Read some values to validate that things were set automatically - rows, err = db.Query("select create_time, managed_group_id, member_id from auth_oidc_managed_group_member_account") + rows, err = rw.Query(ctx, "select create_time, managed_group_id, member_id from auth_oidc_managed_group_member_account", nil) require.NoError(t, err) require.True(t, rows.Next()) var create_time time.Time @@ -357,14 +372,18 @@ func Test_AuthManagedOidcGroupMemberAccountTable(t *testing.T) { for _, tt := range updateTests { t.Run("update: "+tt.testName, func(t *testing.T) { assert := assert.New(t) - _, err = db.Exec(fmt.Sprintf("update auth_managed_group_member_account set %s = $1 where managed_group_id = $2 and member_id = $3", tt.column), managedGroupId, accountId) + _, err = rw.Exec(ctx, fmt.Sprintf("update auth_managed_group_member_account set %s = ? where managed_group_id = @group_id and member_id = @member_id", tt.column), + []interface{}{ + sql.Named("group_id", managedGroupId), + sql.Named("member_id", accountId), + }) assert.True(tt.wantErr == (err != nil)) }) } } // Read from the view to ensure we see it there - rows, err = db.Query("select create_time, managed_group_id, member_id from auth_managed_group_member_account") + rows, err = rw.Query(ctx, "select create_time, managed_group_id, member_id from auth_managed_group_member_account", nil) require.NoError(t, err) require.True(t, rows.Next()) var view_create_time time.Time diff --git a/internal/db/testing.go b/internal/db/testing.go index 915695103..f95b3694c 100644 --- a/internal/db/testing.go +++ b/internal/db/testing.go @@ -16,8 +16,9 @@ import ( "github.com/hashicorp/boundary/testing/dbtest" wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-kms-wrapping/wrappers/aead" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" + "gorm.io/gorm" + "gorm.io/gorm/logger" ) // setup the tests (initialize the database one-time and intialized testDatabaseURL). Do not close the returned db. @@ -46,13 +47,19 @@ func TestSetup(t *testing.T, dialect string, opt ...TestOption) (*gorm.DB, strin if err != nil { t.Fatalf("Couldn't init store on existing db: %v", err) } - - db, err := gorm.Open(dialect, url) + dbType, err := StringToDbType(dialect) if err != nil { t.Fatal(err) } + db, err := Open(dbType, url) + if err != nil { + t.Fatal(err) + } + db.Logger.LogMode(logger.Error) t.Cleanup(func() { - assert.NoError(t, db.Close(), "Got error closing gorm db.") + sqlDB, err := db.DB() + assert.NoError(t, err) + assert.NoError(t, sqlDB.Close(), "Got error closing gorm db.") }) return db, url } diff --git a/internal/db/timestamp/scanners.go b/internal/db/timestamp/scanners.go index 8f7674dc4..0cf43129a 100644 --- a/internal/db/timestamp/scanners.go +++ b/internal/db/timestamp/scanners.go @@ -3,16 +3,29 @@ package timestamp import ( "database/sql/driver" "errors" + "math" "time" "google.golang.org/protobuf/types/known/timestamppb" ) +var ( + NegativeInfinityTS = time.Date(math.MinInt32, time.January, 1, 0, 0, 0, 0, time.UTC) + PositiveInfinityTS = time.Date(math.MaxInt32, time.December, 31, 23, 59, 59, 1e9-1, time.UTC) +) + // Scan implements sql.Scanner for protobuf Timestamp. func (ts *Timestamp) Scan(value interface{}) error { switch t := value.(type) { case time.Time: ts.Timestamp = timestamppb.New(t) // google proto version + case string: + switch value { + case "-infinity": + ts.Timestamp = timestamppb.New(NegativeInfinityTS) + case "infinity": + ts.Timestamp = timestamppb.New(PositiveInfinityTS) + } default: return errors.New("Not a protobuf Timestamp") } @@ -26,3 +39,8 @@ func (ts *Timestamp) Value() (driver.Value, error) { } return ts.Timestamp.AsTime(), nil } + +// GormDataType gorm common data type (required) +func (ts *Timestamp) GormDataType() string { + return "timestamp" +} diff --git a/internal/errors/error.go b/internal/errors/error.go index 73f0f396a..c729f9e80 100644 --- a/internal/errors/error.go +++ b/internal/errors/error.go @@ -8,7 +8,7 @@ import ( "strings" "github.com/hashicorp/boundary/internal/observability/event" - "github.com/lib/pq" + "github.com/jackc/pgconn" ) // Op represents an operation (package.function). @@ -192,29 +192,29 @@ func Convert(e error) *Err { if err, ok := e.(*Err); ok { return err } - var pqError *pq.Error - if As(e, &pqError) { - if pqError.Code.Class() == "23" { // class of integrity constraint violations - switch pqError.Code { + var pgxError *pgconn.PgError + if As(e, &pgxError) { + if pgxError.Code[0:2] == "23" { // class of integrity constraint violations + switch pgxError.Code { case "23505": // unique_violation - return E(ctx, WithoutEvent(), WithMsg(pqError.Message), WithWrap(E(ctx, WithoutEvent(), WithCode(NotUnique), WithMsg("unique constraint violation")))).(*Err) + return E(ctx, WithoutEvent(), WithMsg(pgxError.Message), WithWrap(E(ctx, WithoutEvent(), WithCode(NotUnique), WithMsg("unique constraint violation")))).(*Err) case "23502": // not_null_violation - msg := fmt.Sprintf("%s must not be empty", pqError.Column) + msg := fmt.Sprintf("%s must not be empty", pgxError.ColumnName) return E(ctx, WithoutEvent(), WithMsg(msg), WithWrap(E(ctx, WithoutEvent(), WithCode(NotNull), WithMsg("not null constraint violated")))).(*Err) case "23514": // check_violation - msg := fmt.Sprintf("%s constraint failed", pqError.Constraint) + msg := fmt.Sprintf("%s constraint failed", pgxError.ConstraintName) return E(ctx, WithoutEvent(), WithMsg(msg), WithWrap(E(ctx, WithoutEvent(), WithCode(CheckConstraint), WithMsg("check constraint violated")))).(*Err) default: - return E(ctx, WithoutEvent(), WithCode(NotSpecificIntegrity), WithMsg(pqError.Message)).(*Err) + return E(ctx, WithoutEvent(), WithCode(NotSpecificIntegrity), WithMsg(pgxError.Message)).(*Err) } } - switch pqError.Code { + switch pgxError.Code { case "42P01": - return E(ctx, WithoutEvent(), WithCode(MissingTable), WithMsg(pqError.Message)).(*Err) + return E(ctx, WithoutEvent(), WithCode(MissingTable), WithMsg(pgxError.Message)).(*Err) case "42703": - return E(ctx, WithoutEvent(), WithCode(ColumnNotFound), WithMsg(pqError.Message)).(*Err) + return E(ctx, WithoutEvent(), WithCode(ColumnNotFound), WithMsg(pgxError.Message)).(*Err) case "P0001": - return E(ctx, WithoutEvent(), WithCode(Exception), WithMsg(pqError.Message)).(*Err) + return E(ctx, WithoutEvent(), WithCode(Exception), WithMsg(pgxError.Message)).(*Err) } } // unfortunately, we can't help. diff --git a/internal/errors/error_test.go b/internal/errors/error_test.go index 138ca8256..91101bfef 100644 --- a/internal/errors/error_test.go +++ b/internal/errors/error_test.go @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/boundary/internal/db" "github.com/hashicorp/boundary/internal/errors" - "github.com/lib/pq" + "github.com/jackc/pgconn" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -254,8 +254,8 @@ func Test_WrapError(t *testing.T) { }, { name: "NotSpecificIntegrity", - err: &pq.Error{ - Code: pq.ErrorCode("23001"), + err: &pgconn.PgError{ + Code: "23001", Message: "test msg", }, want: &errors.Err{ @@ -449,8 +449,8 @@ func TestConvertError(t *testing.T) { }, { name: "NotSpecificIntegrity", - e: &pq.Error{ - Code: pq.ErrorCode("23001"), + e: &pgconn.PgError{ + Code: "23001", }, wantErr: errors.EDeprecated(errors.WithCode(errors.NotSpecificIntegrity)), }, diff --git a/internal/errors/is.go b/internal/errors/is.go index 1bad741a1..01bc22f22 100644 --- a/internal/errors/is.go +++ b/internal/errors/is.go @@ -3,7 +3,7 @@ package errors import ( "errors" - "github.com/lib/pq" + "github.com/jackc/pgconn" ) // IsUniqueError returns a boolean indicating whether the error is known to @@ -17,9 +17,9 @@ func IsUniqueError(err error) bool { return true } - var pqError *pq.Error - if errors.As(err, &pqError) { - if pqError.Code == "23505" { // unique_violation + var pgxError *pgconn.PgError + if errors.As(err, &pgxError) { + if pgxError.Code == "23505" { // unique_violation return true } } @@ -38,9 +38,9 @@ func IsCheckConstraintError(err error) bool { return true } - var pqError *pq.Error - if errors.As(err, &pqError) { - if pqError.Code == "23514" { // check_violation + var pgxError *pgconn.PgError + if errors.As(err, &pgxError) { + if pgxError.Code == "23514" { // check_violation return true } } @@ -59,9 +59,9 @@ func IsNotNullError(err error) bool { return true } - var pqError *pq.Error - if errors.As(err, &pqError) { - if pqError.Code == "23502" { // not_null_violation + var pgxError *pgconn.PgError + if errors.As(err, &pgxError) { + if pgxError.Code == "23502" { // not_null_violation return true } } @@ -72,9 +72,9 @@ func IsNotNullError(err error) bool { // IsMissingTableError returns a boolean indicating whether the error is known // to report a undefined/missing table violation. func IsMissingTableError(err error) bool { - var pqError *pq.Error - if errors.As(err, &pqError) { - if pqError.Code == "42P01" { + var pgxError *pgconn.PgError + if errors.As(err, &pgxError) { + if pgxError.Code == "42P01" { return true } } diff --git a/internal/errors/is_test.go b/internal/errors/is_test.go index ad76af9a9..f142b7210 100644 --- a/internal/errors/is_test.go +++ b/internal/errors/is_test.go @@ -7,7 +7,7 @@ import ( "github.com/hashicorp/boundary/internal/db" "github.com/hashicorp/boundary/internal/errors" - "github.com/lib/pq" + "github.com/jackc/pgconn" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -26,15 +26,15 @@ func TestError_IsUnique(t *testing.T) { }, { name: "postgres-not-unique", - in: &pq.Error{ - Code: pq.ErrorCode("23503"), + in: &pgconn.PgError{ + Code: "23503", }, want: false, }, { name: "postgres-is-unique2", - in: &pq.Error{ - Code: pq.ErrorCode("23505"), + in: &pgconn.PgError{ + Code: "23505", }, want: true, }, @@ -47,8 +47,8 @@ func TestError_IsUnique(t *testing.T) { name: "wrapped-pq-is-unique", in: errors.E( context.TODO(), - errors.WithWrap(&pq.Error{ - Code: pq.ErrorCode("23505"), + errors.WithWrap(&pgconn.PgError{ + Code: "23505", }), ), want: true, @@ -89,15 +89,15 @@ func TestError_IsCheckConstraint(t *testing.T) { }, { name: "postgres-not-check-constraint", - in: &pq.Error{ - Code: pq.ErrorCode("23505"), + in: &pgconn.PgError{ + Code: "23505", }, want: false, }, { name: "postgres-is-check-constraint", - in: &pq.Error{ - Code: pq.ErrorCode("23514"), + in: &pgconn.PgError{ + Code: "23514", }, want: true, }, @@ -109,8 +109,8 @@ func TestError_IsCheckConstraint(t *testing.T) { { name: "wrapped-pq-is-check-constraint", in: errors.E(context.TODO(), errors.WithCode(errors.CheckConstraint), - errors.WithWrap(&pq.Error{ - Code: pq.ErrorCode("23514"), + errors.WithWrap(&pgconn.PgError{ + Code: "23514", }), ), want: true, @@ -151,22 +151,22 @@ func TestError_IsNotNullError(t *testing.T) { }, { name: "postgres-is-unique-not-not-null", - in: &pq.Error{ - Code: pq.ErrorCode("23505"), + in: &pgconn.PgError{ + Code: "23505", }, want: false, }, { name: "postgres-is-check-constraint-not-not-null", - in: &pq.Error{ - Code: pq.ErrorCode("23514"), + in: &pgconn.PgError{ + Code: "23514", }, want: false, }, { name: "postgres-is-not-null", - in: &pq.Error{ - Code: pq.ErrorCode("23502"), + in: &pgconn.PgError{ + Code: "23502", }, want: true, }, @@ -178,8 +178,8 @@ func TestError_IsNotNullError(t *testing.T) { { name: "wrapped-pq-is-not-null", in: errors.E(context.TODO(), errors.WithCode(errors.NotNull), - errors.WithWrap(&pq.Error{ - Code: pq.ErrorCode("23502"), + errors.WithWrap(&pgconn.PgError{ + Code: "23502", }), ), want: true, @@ -219,22 +219,22 @@ func TestError_IsMissingTableError(t *testing.T) { }, { name: "postgres-is-unique-not-not-null", - in: &pq.Error{ - Code: pq.ErrorCode("23505"), + in: &pgconn.PgError{ + Code: "23505", }, want: false, }, { name: "postgres-is-check-constraint-not-not-null", - in: &pq.Error{ - Code: pq.ErrorCode("23514"), + in: &pgconn.PgError{ + Code: "23514", }, want: false, }, { name: "postgres-is-missing-table", - in: &pq.Error{ - Code: pq.ErrorCode("42P01"), + in: &pgconn.PgError{ + Code: "42P01", }, want: true, }, diff --git a/internal/host/static/host_catalog_test.go b/internal/host/static/host_catalog_test.go index f44992bd8..292020d2d 100644 --- a/internal/host/static/host_catalog_test.go +++ b/internal/host/static/host_catalog_test.go @@ -4,9 +4,9 @@ import ( "context" "testing" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gorm.io/gorm" "github.com/hashicorp/boundary/internal/db" "github.com/hashicorp/boundary/internal/host/static/store" diff --git a/internal/host/static/host_set_test.go b/internal/host/static/host_set_test.go index e0c746805..d52fbd484 100644 --- a/internal/host/static/host_set_test.go +++ b/internal/host/static/host_set_test.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/boundary/internal/iam" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gorm.io/gorm/logger" ) func TestHostSet_New(t *testing.T) { @@ -16,8 +17,7 @@ func TestHostSet_New(t *testing.T) { wrapper := db.TestWrapper(t) _, prj := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper)) cat := testCatalog(t, conn, prj.PublicId) - - conn.LogMode(false) + conn.Logger.LogMode(logger.Silent) type args struct { catalogId string opts []Option diff --git a/internal/host/static/host_test.go b/internal/host/static/host_test.go index c3a437382..4176f506b 100644 --- a/internal/host/static/host_test.go +++ b/internal/host/static/host_test.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/boundary/internal/iam" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gorm.io/gorm/logger" ) func TestHost_New(t *testing.T) { @@ -17,7 +18,7 @@ func TestHost_New(t *testing.T) { _, prj := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper)) cat := testCatalog(t, conn, prj.PublicId) - conn.LogMode(false) + conn.Logger.LogMode(logger.Silent) type args struct { catalogId string opts []Option diff --git a/internal/host/static/query.go b/internal/host/static/query.go index 0aca0a882..3618d4b75 100644 --- a/internal/host/static/query.go +++ b/internal/host/static/query.go @@ -13,7 +13,7 @@ current_hosts (host_id) as ( -- returns the current list select host_id from static_host_set_member - where set_id = $1 + where set_id = @1 -- this trailing space is needed by gorm ), keep_hosts (host_id) as ( -- returns the KEEP list diff --git a/internal/host/static/repository_host_catalog_test.go b/internal/host/static/repository_host_catalog_test.go index 96a999ae2..4af721d32 100644 --- a/internal/host/static/repository_host_catalog_test.go +++ b/internal/host/static/repository_host_catalog_test.go @@ -461,7 +461,9 @@ func TestRepository_UpdateCatalog(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.ScopeId, got.ScopeId) - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(t, err) + dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { dbassert.IsNull(got, "name") return diff --git a/internal/host/static/repository_host_set_member.go b/internal/host/static/repository_host_set_member.go index a7dae0527..dead39500 100644 --- a/internal/host/static/repository_host_set_member.go +++ b/internal/host/static/repository_host_set_member.go @@ -2,6 +2,7 @@ package static import ( "context" + "database/sql" "fmt" "strings" @@ -121,14 +122,14 @@ func getHosts(ctx context.Context, reader db.Reader, setId string, limit int) ([ const whereNoLimit = `public_id in ( select host_id from static_host_set_member - where set_id = $1 + where set_id = ? )` const whereLimit = `public_id in ( select host_id from static_host_set_member - where set_id = $1 - limit $2 + where set_id = ? + limit ? )` params := []interface{}{setId} @@ -328,9 +329,9 @@ type change struct { func (r *Repository) changes(ctx context.Context, setId string, hostIds []string) ([]*change, error) { const op = "static.(Repository).changes" var inClauseSpots []string - // starts at 2 because there is already a $1 in the query + // starts at 2 because there is already a @1 in the query for i := 2; i < len(hostIds)+2; i++ { - inClauseSpots = append(inClauseSpots, fmt.Sprintf("$%d", i)) + inClauseSpots = append(inClauseSpots, fmt.Sprintf("@%d", i)) } inClause := strings.Join(inClauseSpots, ",") if inClause == "" { @@ -339,9 +340,9 @@ func (r *Repository) changes(ctx context.Context, setId string, hostIds []string query := fmt.Sprintf(setChangesQuery, inClause) var params []interface{} - params = append(params, setId) - for _, v := range hostIds { - params = append(params, v) + params = append(params, sql.Named("1", setId)) + for idx, v := range hostIds { + params = append(params, sql.Named(fmt.Sprintf("%d", idx+2), v)) } rows, err := r.reader.Query(ctx, query, params) if err != nil { diff --git a/internal/host/static/repository_host_set_test.go b/internal/host/static/repository_host_set_test.go index 894636d52..3e118cbf9 100644 --- a/internal/host/static/repository_host_set_test.go +++ b/internal/host/static/repository_host_set_test.go @@ -493,7 +493,9 @@ func TestRepository_UpdateSet(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.CatalogId, got.CatalogId) - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { dbassert.IsNull(got, "name") return diff --git a/internal/host/static/repository_host_test.go b/internal/host/static/repository_host_test.go index ff8212b72..0f699375c 100644 --- a/internal/host/static/repository_host_test.go +++ b/internal/host/static/repository_host_test.go @@ -620,7 +620,9 @@ func TestRepository_UpdateHost(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.CatalogId, got.CatalogId) - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { dbassert.IsNull(got, "name") return diff --git a/internal/host/static/testing.go b/internal/host/static/testing.go index 1cc0c6847..3d3a94d3a 100644 --- a/internal/host/static/testing.go +++ b/internal/host/static/testing.go @@ -6,8 +6,8 @@ import ( "testing" "github.com/hashicorp/boundary/internal/db" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" + "gorm.io/gorm" ) // TestCatalogs creates count number of static host catalogs to the provided DB diff --git a/internal/iam/account_test.go b/internal/iam/account_test.go index 973acbd51..c6ac60eac 100644 --- a/internal/iam/account_test.go +++ b/internal/iam/account_test.go @@ -83,7 +83,9 @@ func TestAccount_Clone(t *testing.T) { authMethodPublicId := testAuthMethod(t, conn, org.PublicId) acct := testAccount(t, conn, org.PublicId, authMethodPublicId, u.PublicId) acct2 := testAccount(t, conn, org.PublicId, authMethodPublicId, "") - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(t, err) + dbassert := dbassert.New(t, underlyingDB) dbassert.IsNull(acct2, "IamUserId") cp := acct.Clone() assert.True(!proto.Equal(cp.(*authAccount).Account, acct2.Account)) diff --git a/internal/iam/group_test.go b/internal/iam/group_test.go index 50228616d..be6720d95 100644 --- a/internal/iam/group_test.go +++ b/internal/iam/group_test.go @@ -351,7 +351,9 @@ func Test_GroupUpdate(t *testing.T) { require.NoError(err) assert.True(proto.Equal(updateGrp, foundGrp)) if len(tt.args.nullPaths) != 0 { - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) for _, f := range tt.args.nullPaths { dbassert.IsNull(&foundGrp, f) } diff --git a/internal/iam/immutable_fields_test.go b/internal/iam/immutable_fields_test.go index 2284ae3e3..cecfb4e38 100644 --- a/internal/iam/immutable_fields_test.go +++ b/internal/iam/immutable_fields_test.go @@ -95,8 +95,8 @@ func TestConcreteScope_ImmutableFields(t *testing.T) { conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) repo := TestRepo(t, conn, wrapper) - db := conn.DB() - + db, err := conn.DB() + require.NoError(t, err) org, proj := TestScopes(t, repo) tests := []struct { diff --git a/internal/iam/query.go b/internal/iam/query.go index 665c9d907..4a06c6cc7 100644 --- a/internal/iam/query.go +++ b/internal/iam/query.go @@ -12,15 +12,15 @@ const ( on iam_user_acct_info.public_id = auth_account.iam_user_id where iam_user_acct_info.scope_id = auth_account.scope_id and - auth_account.public_id = $1` + auth_account.public_id = ?` // whereValidAuthMethod - determine if an auth method public_id within a scope_id // is valid by returning a count of matching rows. - whereValidAuthMethod = `select count(*) from auth_method where public_id = $1 and scope_id = $2` + whereValidAuthMethod = `select count(*) from auth_method where public_id = $1 and scope_id = $2` // raw query // insertAuthMethod - insert a row directly into auth_method (TODO - this // should be replaced with calls to the auth method repo). - insertAuthMethod = `insert into auth_method (public_id, scope_id) values ($1, $2)` + insertAuthMethod = `insert into auth_method (public_id, scope_id) values (?, ?)` accountChangesQuery = ` with @@ -34,7 +34,7 @@ const ( -- returns the current list select public_id from auth_account - where iam_user_id = $1 + where iam_user_id = ? ), keep_accounts (account_id) as ( -- returns the KEEP list @@ -78,7 +78,7 @@ const ( -- returns the current list select member_id from iam_group_member - where group_id = $1 + where group_id = ? ), keep_members (member_id) as ( -- returns the KEEP list diff --git a/internal/iam/repository_group.go b/internal/iam/repository_group.go index e14b7e3d7..44ca3e1e9 100644 --- a/internal/iam/repository_group.go +++ b/internal/iam/repository_group.go @@ -497,9 +497,9 @@ func (r *Repository) SetGroupMembers(ctx context.Context, groupId string, groupV func groupMemberChanges(ctx context.Context, reader db.Reader, groupId string, userIds []string) ([]interface{}, []interface{}, error) { const op = "iam.groupMemberChanges" var inClauseSpots []string - // starts at 2 because there is already a $1 in the query + // starts at 2 because there is already a ? in the query for i := 2; i < len(userIds)+2; i++ { - inClauseSpots = append(inClauseSpots, fmt.Sprintf("$%d", i)) + inClauseSpots = append(inClauseSpots, "?") } inClause := strings.Join(inClauseSpots, ",") if inClause == "" { @@ -508,10 +508,11 @@ func groupMemberChanges(ctx context.Context, reader db.Reader, groupId string, u query := fmt.Sprintf(grpMemberChangesQuery, inClause) var params []interface{} - params = append(params, groupId) for _, v := range userIds { params = append(params, v) } + params = append(params, groupId) + rows, err := reader.Query(ctx, query, params) if err != nil { return nil, nil, errors.Wrap(ctx, err, op) diff --git a/internal/iam/repository_group_test.go b/internal/iam/repository_group_test.go index 7b5d0dd44..4c5d1bb44 100644 --- a/internal/iam/repository_group_test.go +++ b/internal/iam/repository_group_test.go @@ -450,7 +450,9 @@ func TestRepository_UpdateGroup(t *testing.T) { foundGrp, _, err := repo.LookupGroup(context.Background(), u.PublicId) require.NoError(err) assert.True(proto.Equal(groupAfterUpdate, foundGrp)) - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) if tt.args.name == "" { dbassert.IsNull(foundGrp, "name") } diff --git a/internal/iam/repository_role_grant.go b/internal/iam/repository_role_grant.go index 923cce7de..0bb39d82f 100644 --- a/internal/iam/repository_role_grant.go +++ b/internal/iam/repository_role_grant.go @@ -392,8 +392,8 @@ func (r *Repository) GrantsForUser(ctx context.Context, userId string, _ ...Opti } const ( - anonUser = `where public_id in ($1)` - authUser = `where public_id in ('u_anon', 'u_auth', $1)` + anonUser = `where public_id in (?)` + authUser = `where public_id in ('u_anon', 'u_auth', ?)` grantsQuery = ` with users (id) as ( diff --git a/internal/iam/repository_role_test.go b/internal/iam/repository_role_test.go index f2344c270..da1ebec39 100644 --- a/internal/iam/repository_role_test.go +++ b/internal/iam/repository_role_test.go @@ -447,7 +447,9 @@ func TestRepository_UpdateRole(t *testing.T) { foundRole, _, _, err := repo.LookupRole(context.Background(), r.PublicId) assert.NoError(err) assert.True(proto.Equal(roleAfterUpdate, foundRole)) - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) if tt.args.name == "" { assert.Equal(foundRole.Name, "") dbassert.IsNull(foundRole, "name") diff --git a/internal/iam/repository_scope.go b/internal/iam/repository_scope.go index ddfc149f3..b5b89c3bc 100644 --- a/internal/iam/repository_scope.go +++ b/internal/iam/repository_scope.go @@ -394,7 +394,7 @@ func (r *Repository) UpdateScope(ctx context.Context, scope *Scope, version uint map[string]interface{}{ "name": scope.Name, "description": scope.Description, - "primaryAuthMethodId": scope.PrimaryAuthMethodId, + "PrimaryAuthMethodId": scope.PrimaryAuthMethodId, // gorm: it's important that the field start with a capital letter. }, fieldMaskPaths, nil, diff --git a/internal/iam/repository_user.go b/internal/iam/repository_user.go index 6ed4dc2ef..f22e87758 100644 --- a/internal/iam/repository_user.go +++ b/internal/iam/repository_user.go @@ -782,10 +782,12 @@ func dissociateUserFromAccounts(ctx context.Context, repoKms *kms.Kms, reader db // associationChanges returns two slices: accounts to associate and disassociate func associationChanges(ctx context.Context, reader db.Reader, userId string, accountIds []string) ([]string, []string, error) { const op = "iam.associationChanges" + var inClauseSpots []string - // starts at 2 because there is already a $1 in the query + // starts at 2 because there is already a ? in the query for i := 2; i < len(accountIds)+2; i++ { - inClauseSpots = append(inClauseSpots, fmt.Sprintf("$%d", i)) + // inClauseSpots = append(inClauseSpots, fmt.Sprintf("$%d", i)) + inClauseSpots = append(inClauseSpots, "?") } inClause := strings.Join(inClauseSpots, ",") if inClause == "" { @@ -794,10 +796,11 @@ func associationChanges(ctx context.Context, reader db.Reader, userId string, ac query := fmt.Sprintf(accountChangesQuery, inClause) var params []interface{} - params = append(params, userId) for _, v := range accountIds { params = append(params, v) } + params = append(params, userId) + rows, err := reader.Query(ctx, query, params) if err != nil { return nil, nil, errors.Wrap(ctx, err, op) diff --git a/internal/iam/repository_user_iam_pkg_test.go b/internal/iam/repository_user_iam_pkg_test.go index 3abb3c562..f537db9af 100644 --- a/internal/iam/repository_user_iam_pkg_test.go +++ b/internal/iam/repository_user_iam_pkg_test.go @@ -309,8 +309,10 @@ func TestRepository_dissociateUserWithAccount(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - dbassert := dbassert.New(t, conn.DB()) - err := dissociateUserFromAccounts(context.Background(), kms, rw, rw, tt.args.Ids.user, tt.args.Ids.accts, tt.args.opt...) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) + err = dissociateUserFromAccounts(context.Background(), kms, rw, rw, tt.args.Ids.user, tt.args.Ids.accts, tt.args.opt...) if tt.wantErr { require.Error(err) assert.Truef(errors.Match(errors.T(tt.wantErrCode), err), "unexpected error %s", err) diff --git a/internal/iam/repository_user_test.go b/internal/iam/repository_user_test.go index 052610fc8..da777bfc5 100644 --- a/internal/iam/repository_user_test.go +++ b/internal/iam/repository_user_test.go @@ -475,8 +475,9 @@ func TestRepository_UpdateUser(t *testing.T) { assert.True(proto.Equal(userAfterUpdate, foundUser)) sort.Strings(foundAccountIds) assert.Equal(accountIds, foundAccountIds) - - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) if tt.args.name == "" { dbassert.IsNull(foundUser, "name") } @@ -846,8 +847,9 @@ func TestRepository_LookupUserWithLogin(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - dbassert := dbassert.New(t, conn.DB()) - + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) got, err := repo.LookupUserWithLogin(context.Background(), tt.args.withAccountId, tt.args.opt...) if tt.wantErr { require.Error(err) diff --git a/internal/iam/role_grant_test.go b/internal/iam/role_grant_test.go index ca8bbddc2..7e24eee99 100644 --- a/internal/iam/role_grant_test.go +++ b/internal/iam/role_grant_test.go @@ -2,7 +2,6 @@ package iam import ( "context" - "strings" "testing" "github.com/hashicorp/boundary/internal/db" @@ -162,7 +161,7 @@ func TestRoleGrant_Delete(t *testing.T) { grant: "id=*;type=*;actions=*", }, wantErr: true, - wantsErrStr: "primary key is not set", + wantsErrStr: "is not set", }, { name: "nil-grant", @@ -170,9 +169,8 @@ func TestRoleGrant_Delete(t *testing.T) { roleId: projRole.PublicId, grant: "", }, - // Note: Gorm's primary key checking is only for what it considers - // the main primary key field, hence this doesn't error as the above - // case does + wantErr: true, + wantsErrStr: "is not set", }, { name: "invalid", @@ -211,7 +209,7 @@ func TestRoleGrant_Delete(t *testing.T) { deleted, err := rw.Delete(context.Background(), rg) if tt.wantErr { require.Error(err) - assert.True(strings.Contains(err.Error(), tt.wantsErrStr)) + assert.Contains(err.Error(), tt.wantsErrStr) return } require.NoError(err) diff --git a/internal/iam/role_test.go b/internal/iam/role_test.go index 0c6cbca94..9af79e7c6 100644 --- a/internal/iam/role_test.go +++ b/internal/iam/role_test.go @@ -440,7 +440,9 @@ func Test_RoleUpdate(t *testing.T) { } assert.True(proto.Equal(updateRole, foundRole)) if len(tt.args.nullPaths) != 0 { - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) for _, f := range tt.args.nullPaths { dbassert.IsNull(&foundRole, f) } diff --git a/internal/iam/store/user.pb.go b/internal/iam/store/user.pb.go index 62c31dae8..16370e7e0 100644 --- a/internal/iam/store/user.pb.go +++ b/internal/iam/store/user.pb.go @@ -51,20 +51,20 @@ type User struct { Version uint32 `protobuf:"varint,70,opt,name=version,proto3" json:"version,omitempty" gorm:"default:null"` // Output only. login_name is a string that maps to the user's account "login // name" from the scope's primary auth method - // @inject_tag: `gorm:"-"` - LoginName string `protobuf:"bytes,90,opt,name=login_name,proto3" json:"login_name,omitempty" gorm:"-"` + // @inject_tag: `gorm:"->"` + LoginName string `protobuf:"bytes,90,opt,name=login_name,proto3" json:"login_name,omitempty" gorm:"->"` // Output only. full_name is a string that maps to the user's account name // from the scope's primary auth method - // @inject_tag: `gorm:"-"` - FullName string `protobuf:"bytes,100,opt,name=full_name,proto3" json:"full_name,omitempty" gorm:"-"` + // @inject_tag: `gorm:"->"` + FullName string `protobuf:"bytes,100,opt,name=full_name,proto3" json:"full_name,omitempty" gorm:"->"` // Output only. email is a string that maps to the user's account email from // the scope's primary auth method - // @inject_tag: `gorm:"-"` - Email string `protobuf:"bytes,110,opt,name=email,proto3" json:"email,omitempty" gorm:"-"` + // @inject_tag: `gorm:"->"` + Email string `protobuf:"bytes,110,opt,name=email,proto3" json:"email,omitempty" gorm:"->"` // Output only. primary_account_id is a string that maps to the user's account // public_id from the scope's primary auth method - // @inject_tag: `gorm:"-"` - PrimaryAccountId string `protobuf:"bytes,120,opt,name=primary_account_id,proto3" json:"primary_account_id,omitempty" gorm:"-"` + // @inject_tag: `gorm:"->"` + PrimaryAccountId string `protobuf:"bytes,120,opt,name=primary_account_id,proto3" json:"primary_account_id,omitempty" gorm:"->"` } func (x *User) Reset() { diff --git a/internal/iam/testing.go b/internal/iam/testing.go index 68babe53d..a0f7197be 100644 --- a/internal/iam/testing.go +++ b/internal/iam/testing.go @@ -12,8 +12,8 @@ import ( "github.com/hashicorp/boundary/internal/types/scope" wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-uuid" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/require" + "gorm.io/gorm" ) // TestRepo creates a repo that can be used for various purposes. Crucially, it @@ -277,7 +277,9 @@ func testAccount(t *testing.T, conn *gorm.DB, scopeId, authMethodId, userId stri } var count int - err := conn.DB().QueryRow(whereValidAuthMethod, authMethodId, scopeId).Scan(&count) + underlyingDB, err := conn.DB() + require.NoError(err) + err = underlyingDB.QueryRow(whereValidAuthMethod, authMethodId, scopeId).Scan(&count) require.NoError(err) require.Equal(1, count) @@ -297,7 +299,9 @@ func testAccount(t *testing.T, conn *gorm.DB, scopeId, authMethodId, userId stri require.NotEmpty(acct.PublicId) if userId == "" { - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) dbassert.IsNull(acct, "IamUserId") } return acct @@ -316,7 +320,8 @@ func testAuthMethod(t *testing.T, conn *gorm.DB, scopeId string) string { id, err := db.NewPublicId(authMethodPrefix) require.NoError(err) - _, err = conn.DB().Exec(insertAuthMethod, id, scopeId) + rw := db.New(conn) + _, err = rw.Exec(context.Background(), insertAuthMethod, []interface{}{id, scopeId}) require.NoError(err) return id } diff --git a/internal/iam/testing_test.go b/internal/iam/testing_test.go index 5d6ca27d8..57a771164 100644 --- a/internal/iam/testing_test.go +++ b/internal/iam/testing_test.go @@ -216,3 +216,14 @@ func Test_TestGroupMember(t *testing.T) { require.Equal(pg.PublicId, gm.GroupId) require.Equal(u.PublicId, gm.MemberId) } + +func Test_testAccount(t *testing.T) { + require := require.New(t) + conn, _ := db.TestSetup(t, "postgres") + wrapper := db.TestWrapper(t) + repo := TestRepo(t, conn, wrapper) + org, _ := TestScopes(t, repo) + authMethodId := testAuthMethod(t, conn, org.PublicId) + acct := testAccount(t, conn, org.PublicId, authMethodId, "") + require.Equal(acct.ScopeId, org.PublicId) +} diff --git a/internal/kms/testing.go b/internal/kms/testing.go index f949622d6..e05759772 100644 --- a/internal/kms/testing.go +++ b/internal/kms/testing.go @@ -7,8 +7,8 @@ import ( "github.com/hashicorp/boundary/internal/db" wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-kms-wrapping/wrappers/aead" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/require" + "gorm.io/gorm" ) func TestRootKey(t *testing.T, conn *gorm.DB, scopeId string) *RootKey { diff --git a/internal/oplog/oplog.go b/internal/oplog/oplog.go index 2236d5820..aa6c0a2a1 100644 --- a/internal/oplog/oplog.go +++ b/internal/oplog/oplog.go @@ -10,7 +10,6 @@ import ( "github.com/hashicorp/boundary/internal/oplog/store" wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-kms-wrapping/structwrapping" - _ "github.com/lib/pq" "google.golang.org/protobuf/proto" ) @@ -29,8 +28,8 @@ type Message struct { // Entry represents an oplog entry type Entry struct { *store.Entry - Cipherer wrapping.Wrapper `sql:"-"` - Ticketer Ticketer `sql:"-"` + Cipherer wrapping.Wrapper `gorm:"-"` + Ticketer Ticketer `gorm:"-"` } // Metadata provides meta information about the Entry diff --git a/internal/oplog/oplog_test.go b/internal/oplog/oplog_test.go index 0c28c00fc..c7fc4c8a1 100644 --- a/internal/oplog/oplog_test.go +++ b/internal/oplog/oplog_test.go @@ -8,9 +8,10 @@ import ( dbassert "github.com/hashicorp/dbassert/gorm" "github.com/hashicorp/boundary/internal/oplog/oplog_test" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gorm.io/driver/postgres" + "gorm.io/gorm" _ "github.com/golang-migrate/migrate/v4/database/postgres" _ "github.com/golang-migrate/migrate/v4/source/file" @@ -22,12 +23,38 @@ func setup(t *testing.T) (func() error, *gorm.DB) { require := require.New(t) cleanup, url, err := testInitDbInDocker(t) require.NoError(err) - db, err := gorm.Open("postgres", url) + db, err := testOpen("postgres", url) + require.NoError(err) + oplog_test.Init(db) + t.Cleanup(func() { + sqlDB, err := db.DB() + assert.NoError(t, err) + assert.NoError(t, sqlDB.Close(), "Got error closing gorm db.") + }) require.NoError(err) oplog_test.Init(db) return cleanup, db } +func testOpen(dbType string, connectionUrl string) (*gorm.DB, error) { + var dialect gorm.Dialector + switch dbType { + case "postgres": + dialect = postgres.New(postgres.Config{ + DSN: connectionUrl}, + ) + default: + return nil, fmt.Errorf("unable to open %s database type", dbType) + } + db, err := gorm.Open(dialect, &gorm.Config{ + ConvertNullToZeroValues: true, + }) + if err != nil { + return nil, fmt.Errorf("unable to open database: %w", err) + } + return db, nil +} + // Test_BasicOplog provides some basic unit tests for oplogs func Test_BasicOplog(t *testing.T) { cleanup, db := setup(t) @@ -228,6 +255,7 @@ func Test_UnmarshalData(t *testing.T) { // now let's us optimistic locking via a ticketing system for a serialized oplog ticketer, err := NewGormTicketer(db, WithAggregateNames(true)) + require.NoError(t, err) types, err := NewTypeCatalog(Type{new(oplog_test.TestUser), "user"}) require.NoError(t, err) @@ -390,7 +418,9 @@ func Test_Replay(t *testing.T) { } err = tx.Model(&userUpdate).Updates(map[string]interface{}{"PhoneNumber": "867-5309", "Name": gorm.Expr("NULL")}).Error require.NoError(err) - dbassert := dbassert.New(t, tx.DB(), "postgres") + underlyingDB, err := tx.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB, tx.Dialector.Name()) dbassert.IsNull(&userUpdate, "Name") foundCreateUser := testFindUser(t, tx, userCreate.Id) diff --git a/internal/oplog/oplog_test/db.go b/internal/oplog/oplog_test/db.go index 7fad2f8e2..f3a6ea4b6 100644 --- a/internal/oplog/oplog_test/db.go +++ b/internal/oplog/oplog_test/db.go @@ -1,7 +1,7 @@ // Package oplog_test provides some gorm helper funcs for testing oplog database integrations package oplog_test -import "github.com/jinzhu/gorm" +import "gorm.io/gorm" const ( defaultTestUserTableName = "oplog_test_user" @@ -18,9 +18,10 @@ func Init(db *gorm.DB) { // Reinit will use gorm to drop then init tables for test models func Reinit(db *gorm.DB) { - db.DropTableIfExists(&TestUser{}) - db.DropTableIfExists(&TestCar{}) - db.DropTableIfExists(&TestRental{}) + // Migrator.DropTable is actually "drop table if exists" + _ = db.Migrator().DropTable(&TestUser{}) + _ = db.Migrator().DropTable(&TestCar{}) + _ = db.Migrator().DropTable(&TestRental{}) Init(db) } diff --git a/internal/oplog/testing.go b/internal/oplog/testing.go index 5476b6b91..f8d7bdc17 100644 --- a/internal/oplog/testing.go +++ b/internal/oplog/testing.go @@ -12,16 +12,18 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-kms-wrapping/wrappers/aead" "github.com/hashicorp/go-uuid" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gorm.io/gorm" ) func testCleanup(t *testing.T, cleanupFunc func() error, db *gorm.DB) { t.Helper() err := cleanupFunc() assert.NoError(t, err) - err = db.Close() + sqlDB, err := db.DB() + assert.NoError(t, err) + err = sqlDB.Close() assert.NoError(t, err) } diff --git a/internal/oplog/ticketer.go b/internal/oplog/ticketer.go index 3fb19cb6a..744096a91 100644 --- a/internal/oplog/ticketer.go +++ b/internal/oplog/ticketer.go @@ -3,7 +3,7 @@ package oplog import ( "github.com/hashicorp/boundary/internal/errors" "github.com/hashicorp/boundary/internal/oplog/store" - "github.com/jinzhu/gorm" + "gorm.io/gorm" ) const DefaultAggregateName = "global" @@ -53,7 +53,7 @@ func (ticketer *GormTicketer) GetTicket(aggregateName string) (*store.Ticket, er } ticket := store.Ticket{} if err := ticketer.tx.First(&ticket, store.Ticket{Name: name}).Error; err != nil { - if gorm.IsRecordNotFoundError(err) { + if errors.Is(err, gorm.ErrRecordNotFound) { return nil, errors.NewDeprecated(errors.TicketNotFound, op, "ticket not found") } return nil, errors.WrapDeprecated(err, op, errors.WithMsg("error retrieving ticket from storage")) diff --git a/internal/oplog/writer.go b/internal/oplog/writer.go index 4fbb5d00a..d175ce7f6 100644 --- a/internal/oplog/writer.go +++ b/internal/oplog/writer.go @@ -4,8 +4,10 @@ import ( "fmt" "github.com/hashicorp/boundary/internal/db/common" + "github.com/hashicorp/boundary/internal/errors" - "github.com/jinzhu/gorm" + "gorm.io/gorm" + "gorm.io/gorm/schema" ) // Writer interface for Entries @@ -47,8 +49,15 @@ func (w *GormWriter) Create(i interface{}) error { if i == nil { return errors.NewDeprecated(errors.InvalidParameter, op, "nil interface") } - if err := w.Tx.Create(i).Error; err != nil { - return errors.WrapDeprecated(err, op) + + if tabler, ok := i.(schema.Tabler); ok { + if err := w.Tx.Table(tabler.TableName()).Create(i).Error; err != nil { + return errors.WrapDeprecated(err, op) + } + } else { + if err := w.Tx.Create(i).Error; err != nil { + return errors.WrapDeprecated(err, op) + } } return nil } @@ -73,8 +82,15 @@ func (w *GormWriter) Update(i interface{}, fieldMaskPaths, setToNullPaths []stri if err != nil { return errors.WrapDeprecated(err, op, errors.WithMsg("unable to build update fields")) } - if err := w.Tx.Model(i).Updates(updateFields).Error; err != nil { - return errors.WrapDeprecated(err, op) + + if tabler, ok := i.(schema.Tabler); ok { + if err := w.Tx.Table(tabler.TableName()).Model(i).Updates(updateFields).Error; err != nil { + return errors.WrapDeprecated(err, op) + } + } else { + if err := w.Tx.Model(i).Updates(updateFields).Error; err != nil { + return errors.WrapDeprecated(err, op) + } } return nil } @@ -88,8 +104,14 @@ func (w *GormWriter) Delete(i interface{}) error { if i == nil { return errors.NewDeprecated(errors.InvalidParameter, op, "nil interface") } - if err := w.Tx.Delete(i).Error; err != nil { - return errors.WrapDeprecated(err, op) + if tabler, ok := i.(schema.Tabler); ok { + if err := w.Tx.Table(tabler.TableName()).Delete(i).Error; err != nil { + return errors.WrapDeprecated(err, op) + } + } else { + if err := w.Tx.Delete(i).Error; err != nil { + return errors.WrapDeprecated(err, op) + } } return nil } @@ -99,7 +121,7 @@ func (w *GormWriter) hasTable(tableName string) bool { if tableName == "" { return false } - return w.Tx.Dialect().HasTable(tableName) + return w.Tx.Migrator().HasTable(tableName) } // CreateTableLike will create a newTableName like the model's table @@ -112,10 +134,11 @@ func (w *GormWriter) createTableLike(existingTableName string, newTableName stri if newTableName == "" { return errors.NewDeprecated(errors.InvalidParameter, op, "missing new table name") } - existingTableName = w.Tx.Dialect().Quote(existingTableName) - newTableName = w.Tx.Dialect().Quote(newTableName) + + existingTableName = w.Tx.Statement.Quote(existingTableName) + newTableName = w.Tx.Statement.Quote(newTableName) var sql string - switch w.Tx.Dialect().GetName() { + switch w.Tx.Dialector.Name() { case "postgres": sql = fmt.Sprintf( `CREATE TABLE %s ( LIKE %s INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES );`, @@ -143,7 +166,8 @@ func (w *GormWriter) dropTableIfExists(tableName string) error { if tableName == "" { return errors.NewDeprecated(errors.InvalidParameter, op, "missing table name") } - err := w.Tx.DropTableIfExists(tableName).Error + // Migrator.DropTable uses an "if exists" clause + err := w.Tx.Migrator().DropTable(tableName) if err != nil { return errors.WrapDeprecated(err, op) } diff --git a/internal/oplog/writer_test.go b/internal/oplog/writer_test.go index 72c482243..f3930d722 100644 --- a/internal/oplog/writer_test.go +++ b/internal/oplog/writer_test.go @@ -5,9 +5,10 @@ import ( "github.com/hashicorp/boundary/internal/oplog/oplog_test" dbassert "github.com/hashicorp/dbassert/gorm" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + _ "gorm.io/driver/postgres" + "gorm.io/gorm" ) // Test_GormWriterCreate provides unit tests for GormWriter Create @@ -290,7 +291,10 @@ func TestGormWriter_Update(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - assert, require, dbassert := assert.New(t), require.New(t), dbassert.New(t, db.DB(), "postgres") + assert, require := assert.New(t), require.New(t) + underlyingDB, err := db.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB, db.Dialector.Name()) w := &GormWriter{ Tx: tt.Tx, @@ -299,7 +303,7 @@ func TestGormWriter_Update(t *testing.T) { u.Name = tt.args.user.Name u.Email = tt.args.user.Email u.PhoneNumber = tt.args.user.PhoneNumber - err := w.Update(tt.args.user, tt.args.fieldMaskPaths, tt.args.setToNullPaths) + err = w.Update(u, tt.args.fieldMaskPaths, tt.args.setToNullPaths) if tt.wantErr { require.Error(err) return diff --git a/internal/proto/local/controller/servers/v1/servers.proto b/internal/proto/local/controller/servers/v1/servers.proto index cc02349f3..7adf4bbb3 100644 --- a/internal/proto/local/controller/servers/v1/servers.proto +++ b/internal/proto/local/controller/servers/v1/servers.proto @@ -32,6 +32,7 @@ message Server { storage.timestamp.v1.Timestamp update_time = 70; // Tags for workers + // @inject_tag: `gorm:"-"` map tags = 80; } diff --git a/internal/proto/local/controller/storage/auth/password/store/v1/password.proto b/internal/proto/local/controller/storage/auth/password/store/v1/password.proto index 5d1e1e0f1..25adc39cc 100644 --- a/internal/proto/local/controller/storage/auth/password/store/v1/password.proto +++ b/internal/proto/local/controller/storage/auth/password/store/v1/password.proto @@ -45,7 +45,7 @@ message AuthMethod { // is_primary_auth_method is a read-only output field which indicates if the // auth method is set as the scope's primary auth method. - // @inject_tag: `gorm:"-"` + // @inject_tag: `gorm:"->"` bool is_primary_auth_method = 20; } diff --git a/internal/proto/local/controller/storage/authtoken/store/v1/authtoken.proto b/internal/proto/local/controller/storage/authtoken/store/v1/authtoken.proto index 412748994..d4ab6982b 100644 --- a/internal/proto/local/controller/storage/authtoken/store/v1/authtoken.proto +++ b/internal/proto/local/controller/storage/authtoken/store/v1/authtoken.proto @@ -43,15 +43,15 @@ message AuthToken { string auth_account_id = 10; // scope_id is not stored in the backing DB but it derived from the linked to auth account. - // @inject_tag: gorm:"-" + // @inject_tag: gorm:"->" string scope_id = 11; // auth_method_id is not stored in the backing DB but it derived from the linked to auth account. - // @inject_tag: gorm:"-" + // @inject_tag: gorm:"->" string auth_method_id = 12; // iam_user_id is not stored in the backing DB but it derived from the linked to auth account. - // @inject_tag: gorm:"-" + // @inject_tag: gorm:"->" string iam_user_id = 13; // key_id is the key ID that was used for the encryption operation. It can be diff --git a/internal/proto/local/controller/storage/iam/store/v1/user.proto b/internal/proto/local/controller/storage/iam/store/v1/user.proto index 8b454ad8b..e85f0ccca 100644 --- a/internal/proto/local/controller/storage/iam/store/v1/user.proto +++ b/internal/proto/local/controller/storage/iam/store/v1/user.proto @@ -38,21 +38,21 @@ message User { // Output only. login_name is a string that maps to the user's account "login // name" from the scope's primary auth method - // @inject_tag: `gorm:"-"` + // @inject_tag: `gorm:"->"` string login_name = 90 [json_name = "login_name"]; // Output only. full_name is a string that maps to the user's account name // from the scope's primary auth method - // @inject_tag: `gorm:"-"` + // @inject_tag: `gorm:"->"` string full_name = 100 [json_name = "full_name"]; // Output only. email is a string that maps to the user's account email from // the scope's primary auth method - // @inject_tag: `gorm:"-"` + // @inject_tag: `gorm:"->"` string email = 110 [json_name = "email"]; // Output only. primary_account_id is a string that maps to the user's account // public_id from the scope's primary auth method - // @inject_tag: `gorm:"-"` + // @inject_tag: `gorm:"->"` string primary_account_id = 120 [json_name = "primary_account_id"]; } \ No newline at end of file diff --git a/internal/proto/local/controller/storage/job/store/v1/job.proto b/internal/proto/local/controller/storage/job/store/v1/job.proto index ee110bf06..7adcfee31 100644 --- a/internal/proto/local/controller/storage/job/store/v1/job.proto +++ b/internal/proto/local/controller/storage/job/store/v1/job.proto @@ -26,7 +26,7 @@ message Job { message JobRun { // private_id is used to access the job run but not intended to be available via the API - // @inject_tag: `gorm:"primary_key"` + // @inject_tag: `gorm:"primary_key;default:null"` string private_id = 1; // The job_plugin_id is the id of the plugin that owns the job. diff --git a/internal/scheduler/job/additional_verification_test.go b/internal/scheduler/job/additional_verification_test.go index 420ff74f0..7d5474e4a 100644 --- a/internal/scheduler/job/additional_verification_test.go +++ b/internal/scheduler/job/additional_verification_test.go @@ -2,6 +2,7 @@ package job import ( "context" + "database/sql" "testing" "time" @@ -100,24 +101,24 @@ func TestPlugin(t *testing.T) { rw := db.New(conn) rows, err := rw.Query(context.Background(), createJobQuery, []interface{}{ - defaultPluginId, - "same-job-name", - "description", - 0, + sql.Named("plugin_id", defaultPluginId), + sql.Named("name", "same-job-name"), + sql.Named("description", "description"), + sql.Named("next_scheduled_run", 0), }) require.NoError(err) _ = rows.Close() // Creating a job with same name and pluginId should return a unique constraint error rows, err = rw.Query(context.Background(), createJobQuery, []interface{}{ - defaultPluginId, - "same-job-name", - "description", - 0, + sql.Named("plugin_id", defaultPluginId), + sql.Named("name", "same-job-name"), + sql.Named("description", "description"), + sql.Named("next_scheduled_run", 0), }) require.Error(err) assert.Nil(rows) - assert.Equal("pq: duplicate key value violates unique constraint \"job_pkey\"", err.Error()) + assert.Contains(err.Error(), "duplicate key value violates unique constraint \"job_pkey\"") // Create test plugin id testPluginId := "pi_test1234" @@ -127,24 +128,24 @@ func TestPlugin(t *testing.T) { // Creating the a job with the same name and different pluginId should succeed rows, err = rw.Query(context.Background(), createJobQuery, []interface{}{ - testPluginId, - "same-job-name", - "description", - 0, + sql.Named("plugin_id", testPluginId), + sql.Named("name", "same-job-name"), + sql.Named("description", "description"), + sql.Named("next_scheduled_run", 0), }) assert.NoError(err) _ = rows.Close() // Creating a job with same name and pluginId should again return a unique constraint error rows, err = rw.Query(context.Background(), createJobQuery, []interface{}{ - testPluginId, - "same-job-name", - "description", - 0, + sql.Named("plugin_id", testPluginId), + sql.Named("name", "same-job-name"), + sql.Named("description", "description"), + sql.Named("next_scheduled_run", 0), }) require.Error(err) assert.Nil(rows) - assert.Equal("pq: duplicate key value violates unique constraint \"job_pkey\"", err.Error()) + assert.Contains(err.Error(), "duplicate key value violates unique constraint \"job_pkey\"") }) t.Run("plugin-id-immutable", func(t *testing.T) { assert, require := assert.New(t), require.New(t) diff --git a/internal/scheduler/job/query.go b/internal/scheduler/job/query.go index fc057d4c3..7a20a70ad 100644 --- a/internal/scheduler/job/query.go +++ b/internal/scheduler/job/query.go @@ -14,15 +14,15 @@ const runJobsQuery = ` const createJobQuery = ` insert into job ( - plugin_id, -- $1 - name, -- $2 - description, -- $3 - next_scheduled_run -- $4 + plugin_id, + name, + description, + next_scheduled_run ) values ( - $1, -- plugin_id - $2, -- name - $3, -- description - wt_add_seconds_to_now($4) -- next_scheduled_run + @plugin_id, -- plugin_id + @name, -- name + @description, -- description + wt_add_seconds_to_now(@next_scheduled_run) -- next_scheduled_run ) returning *; ` @@ -101,3 +101,10 @@ const interruptRunsQuery = ` %s returning *; ` + +const deleteJobByName = ` + delete + from job + where + name = ? +` diff --git a/internal/scheduler/job/repository_job.go b/internal/scheduler/job/repository_job.go index 73aceb2f8..8ef11d117 100644 --- a/internal/scheduler/job/repository_job.go +++ b/internal/scheduler/job/repository_job.go @@ -2,6 +2,7 @@ package job import ( "context" + "database/sql" "fmt" "strings" "time" @@ -28,14 +29,16 @@ func (r *Repository) CreateJob(ctx context.Context, name, description string, op opts := getOpts(opt...) + defaultId := defaultPluginId + j := allocJob() _, err := r.writer.DoTx(ctx, db.StdRetryCnt, db.ExpBackoff{}, func(r db.Reader, w db.Writer) error { rows, err := r.Query(ctx, createJobQuery, []interface{}{ - defaultPluginId, - name, - description, - int(opts.withNextRunIn.Round(time.Second).Seconds()), + sql.Named("plugin_id", defaultId), + sql.Named("name", name), + sql.Named("description", description), + sql.Named("next_scheduled_run", int(opts.withNextRunIn.Round(time.Second).Seconds())), }) if err != nil { return errors.Wrap(ctx, err, op, errors.WithoutEvent()) @@ -171,12 +174,11 @@ func (r *Repository) deleteJob(ctx context.Context, name string, _ ...Option) (i return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing name") } - j := allocJob() var rowsDeleted int _, err := r.writer.DoTx( ctx, db.StdRetryCnt, db.ExpBackoff{}, func(_ db.Reader, w db.Writer) (err error) { - rowsDeleted, err = w.Delete(ctx, j, db.WithWhere("name = ?", []interface{}{name})) + rowsDeleted, err = w.Exec(ctx, deleteJobByName, []interface{}{name}) if err != nil { return errors.Wrap(ctx, err, op) } diff --git a/internal/scheduler/job/repository_run_test.go b/internal/scheduler/job/repository_run_test.go index 879963630..8cd810298 100644 --- a/internal/scheduler/job/repository_run_test.go +++ b/internal/scheduler/job/repository_run_test.go @@ -542,7 +542,7 @@ func TestRepository_CompleteRun(t *testing.T) { var privateId string if tt.orig != nil { err = rw.Create(context.Background(), tt.orig) - assert.NoError(err) + require.NoError(err) assert.Empty(tt.orig.EndTime) privateId = tt.orig.PrivateId } @@ -1112,7 +1112,7 @@ func TestRepository_DuplicateJobRun(t *testing.T) { run, err = testRun(conn, job1.PluginId, job1.Name, server.PrivateId) require.Error(err) require.Nil(run) - assert.Equal("pq: duplicate key value violates unique constraint \"job_run_status_constraint\"", err.Error()) + assert.Contains(err.Error(), "duplicate key value violates unique constraint \"job_run_status_constraint\"") // Creating a new job with a different name, the associated run should not conflict with the previous run job2 := testJob(t, conn, "job2", "description", wrapper) diff --git a/internal/scheduler/job/store/job.pb.go b/internal/scheduler/job/store/job.pb.go index 087eb8df3..a4b84ba81 100644 --- a/internal/scheduler/job/store/job.pb.go +++ b/internal/scheduler/job/store/job.pb.go @@ -108,8 +108,8 @@ type JobRun struct { unknownFields protoimpl.UnknownFields // private_id is used to access the job run but not intended to be available via the API - // @inject_tag: `gorm:"primary_key"` - PrivateId string `protobuf:"bytes,1,opt,name=private_id,json=privateId,proto3" json:"private_id,omitempty" gorm:"primary_key"` + // @inject_tag: `gorm:"primary_key;default:null"` + PrivateId string `protobuf:"bytes,1,opt,name=private_id,json=privateId,proto3" json:"private_id,omitempty" gorm:"primary_key;default:null"` // The job_plugin_id is the id of the plugin that owns the job. // @inject_tag: `gorm:"not_null"` JobPluginId string `protobuf:"bytes,2,opt,name=job_plugin_id,json=jobPluginId,proto3" json:"job_plugin_id,omitempty" gorm:"not_null"` diff --git a/internal/scheduler/job/testing.go b/internal/scheduler/job/testing.go index e63d60c25..69552c4b3 100644 --- a/internal/scheduler/job/testing.go +++ b/internal/scheduler/job/testing.go @@ -11,8 +11,8 @@ import ( "github.com/hashicorp/boundary/internal/servers" wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-uuid" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/require" + "gorm.io/gorm" ) func testJob(t *testing.T, conn *gorm.DB, name, description string, wrapper wrapping.Wrapper, opt ...Option) *Job { diff --git a/internal/scheduler/testing.go b/internal/scheduler/testing.go index 8de49b3ce..d28e556ba 100644 --- a/internal/scheduler/testing.go +++ b/internal/scheduler/testing.go @@ -13,8 +13,8 @@ import ( "github.com/hashicorp/boundary/internal/servers" wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-uuid" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/require" + "gorm.io/gorm" ) // TestScheduler creates a mock controller and a new Scheduler attached to that controller id. diff --git a/internal/servers/controller/handlers/authmethods/oidc_test.go b/internal/servers/controller/handlers/authmethods/oidc_test.go index 16648390f..2f6ed2ca4 100644 --- a/internal/servers/controller/handlers/authmethods/oidc_test.go +++ b/internal/servers/controller/handlers/authmethods/oidc_test.go @@ -32,7 +32,6 @@ import ( scopepb "github.com/hashicorp/boundary/sdk/pbs/controller/api/resources/scopes" capoidc "github.com/hashicorp/cap/oidc" wrapping "github.com/hashicorp/go-kms-wrapping" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/genproto/protobuf/field_mask" @@ -42,6 +41,7 @@ import ( "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/wrapperspb" + "gorm.io/gorm" ) type setup struct { diff --git a/internal/servers/controller/handlers/host_sets/host_set_service_test.go b/internal/servers/controller/handlers/host_sets/host_set_service_test.go index 298a54e17..c08efc732 100644 --- a/internal/servers/controller/handlers/host_sets/host_set_service_test.go +++ b/internal/servers/controller/handlers/host_sets/host_set_service_test.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "sort" "strings" "testing" @@ -827,6 +828,17 @@ func TestUpdate(t *testing.T) { if tc.res != nil { tc.res.Item.Version = version + 1 } + if tc.res != nil { + sort.Slice(tc.res.GetItem().HostIds, func(i, j int) bool { + return tc.res.GetItem().HostIds[i] < tc.res.GetItem().HostIds[j] + }) + } + if got != nil && got.Item != nil { + sort.Slice(got.GetItem().HostIds, func(i, j int) bool { + return got.GetItem().HostIds[i] < got.GetItem().HostIds[j] + }) + } + assert.Empty(cmp.Diff(got, tc.res, protocmp.Transform()), "UpdateHostSet(%q) got response %q, wanted %q", req, got, tc.res) }) } diff --git a/internal/servers/controller/handlers/targets/target_service_test.go b/internal/servers/controller/handlers/targets/target_service_test.go index 19f9ac908..777a815db 100644 --- a/internal/servers/controller/handlers/targets/target_service_test.go +++ b/internal/servers/controller/handlers/targets/target_service_test.go @@ -37,7 +37,6 @@ import ( "github.com/hashicorp/boundary/sdk/pbs/controller/api/resources/scopes" pb "github.com/hashicorp/boundary/sdk/pbs/controller/api/resources/targets" wrapping "github.com/hashicorp/go-kms-wrapping" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/genproto/protobuf/field_mask" @@ -48,6 +47,7 @@ import ( "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/wrapperspb" + "gorm.io/gorm" ) var testAuthorizedActions = []string{ diff --git a/internal/servers/controller/testing.go b/internal/servers/controller/testing.go index 79bfa0ed1..f458efcac 100644 --- a/internal/servers/controller/testing.go +++ b/internal/servers/controller/testing.go @@ -26,7 +26,7 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-secure-stdlib/base62" "github.com/hashicorp/go-secure-stdlib/strutil" - "github.com/jinzhu/gorm" + "gorm.io/gorm" ) const ( diff --git a/internal/servers/query.go b/internal/servers/query.go index afc44040f..1e814a853 100644 --- a/internal/servers/query.go +++ b/internal/servers/query.go @@ -5,14 +5,14 @@ const ( insert into server (private_id, type, description, address, update_time) values - ($1, $2, $3, $4, now()) + (@private_id, @type, @description, @address, now()) on conflict on constraint server_pkey do update set - type = $2, - description = $3, - address = $4, + type = @type, + description = @description, + address = @address, update_time = now(); ` - deleteWhereCreateTimeSql = `create_time < $1` - deleteTagsSql = `server_id = $1` + deleteWhereCreateTimeSql = `create_time < ?` + deleteTagsSql = `server_id = ?` ) diff --git a/internal/servers/repository.go b/internal/servers/repository.go index 3ca3784d7..2634e87a7 100644 --- a/internal/servers/repository.go +++ b/internal/servers/repository.go @@ -2,6 +2,7 @@ package servers import ( "context" + "database/sql" "fmt" "time" @@ -80,9 +81,9 @@ func (r *Repository) listServersWithReader(ctx context.Context, reader db.Reader var where string if liveness > 0 { - where = fmt.Sprintf("type = $1 and update_time > now() - interval '%d seconds'", uint32(liveness.Seconds())) + where = fmt.Sprintf("type = ? and update_time > now() - interval '%d seconds'", uint32(liveness.Seconds())) } else { - where = "type = $1" + where = "type = ?" } var servers []*Server @@ -148,10 +149,10 @@ func (r *Repository) UpsertServer(ctx context.Context, server *Server, opt ...Op rowsUpdated, err = w.Exec(ctx, serverUpsertQuery, []interface{}{ - server.PrivateId, - server.Type, - server.Description, - server.Address, + sql.Named("private_id", server.PrivateId), + sql.Named("type", server.Type), + sql.Named("description", server.Description), + sql.Named("address", server.Address), }) if err != nil { return errors.Wrap(ctx, err, op+":Upsert") diff --git a/internal/servers/repository_test.go b/internal/servers/repository_test.go index 8dda2a7bb..30ed1c8ed 100644 --- a/internal/servers/repository_test.go +++ b/internal/servers/repository_test.go @@ -102,6 +102,7 @@ func TestTagUpdatingListing(t *testing.T) { }, }, } + _, _, err := repo.UpsertServer(tc.Context(), srv, servers.WithUpdateTags(true)) require.NoError(err) diff --git a/internal/servers/servers.pb.go b/internal/servers/servers.pb.go index cb1012f11..b5fad0c29 100644 --- a/internal/servers/servers.pb.go +++ b/internal/servers/servers.pb.go @@ -47,7 +47,8 @@ type Server struct { // Last time there was an update UpdateTime *timestamp.Timestamp `protobuf:"bytes,70,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` // Tags for workers - Tags map[string]*TagValues `protobuf:"bytes,80,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // @inject_tag: `gorm:"-"` + Tags map[string]*TagValues `protobuf:"bytes,80,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3" gorm:"-"` } func (x *Server) Reset() { diff --git a/internal/session/query.go b/internal/session/query.go index 476bd0e2d..8218e43f5 100644 --- a/internal/session/query.go +++ b/internal/session/query.go @@ -16,9 +16,9 @@ with not_active as ( where s.public_id = ss.session_id and ss.state = 'pending' and - ss.session_id = $1 and - s.version = $2 and - s.public_id not in(select session_id from session_state where session_id = $1 and state = 'active') + ss.session_id = @session_id and + s.version = @version and + s.public_id not in(select session_id from session_state where session_id = @session_id and state = 'active') ) select * from not_active; ` @@ -29,11 +29,11 @@ select * from not_active; updateSessionState = ` insert into session_state(session_id, state) select - $1::text, $2 + @session_id, @status from session s where - s.public_id = $1::text and + s.public_id = @session_id and s.public_id not in ( select session_id @@ -42,8 +42,8 @@ where where -- already in the updated state ( - session_id = $1::text and - state = $2 + session_id = @session_id and + state = @status ) or -- already terminated session_id in ( @@ -52,7 +52,7 @@ where from session_state where - session_id = $1::text and + session_id = @session_id and state = 'terminated' ) ) @@ -65,7 +65,7 @@ with terminated as ( from session s where - s.version = $2 and + s.version = @version and s.public_id in ( -- sessions without any connections select s.public_id @@ -74,7 +74,7 @@ with terminated as ( left join session_connection sc on sc.session_id = s.public_id where sc.session_id is null - and s.public_id = $1 + and s.public_id = @session_id union -- sessions where all connections are closed select s.public_id @@ -86,7 +86,7 @@ with terminated as ( s.public_id = c.session_id and c.public_id = cs.connection_id and cs.state = 'closed' and - s.public_id = $1 + s.public_id = @session_id ) ) select * from terminated; @@ -99,9 +99,9 @@ insert into session_connection ( ) with active_session as ( select - $1 as session_id, - $2 as public_id, - $3 as server_id + @session_id as session_id, + @public_id as public_id, + @worker_id as server_id from session s where @@ -111,7 +111,7 @@ with active_session as ( ( s.connection_limit = -1 or - s.connection_limit > (select count(*) from session_connection sc where sc.session_id = $1) + s.connection_limit > (select count(*) from session_connection sc where sc.session_id = @session_id) ) and -- check that there's a state of active s.public_id in ( @@ -120,7 +120,7 @@ with active_session as ( from session_state ss where - ss.session_id = $1 and + ss.session_id = @session_id and ss.state = 'active' and -- if there's no end_time, then this is the current state. ss.end_time is null @@ -136,7 +136,7 @@ session_connection_count(current_connection_count) as ( from session_connection sc where - sc.session_id = $1 + sc.session_id = @session_id ), session_connection_limit(expiration_time, connection_limit) as ( select @@ -145,7 +145,7 @@ session_connection_limit(expiration_time, connection_limit) as ( from session s where - s.public_id = $1 + s.public_id = @session_id ) select expiration_time, connection_limit, current_connection_count from @@ -269,7 +269,7 @@ with from session_connection where -- Related to the worker that just reported to us - server_id = $1 + server_id = ? and -- These are connection IDs that just got reported to us by the given -- worker, so they should not be considered closed. @@ -302,7 +302,7 @@ with dead_servers (server_id, last_update_time) as ( select private_id, update_time from server - where update_time < wt_sub_seconds_from_now($1) + where update_time < wt_sub_seconds_from_now(?) ), closed_connections (connection_id, server_id) as ( update session_connection diff --git a/internal/session/repository_connection.go b/internal/session/repository_connection.go index 8ea77e728..c86d6297e 100644 --- a/internal/session/repository_connection.go +++ b/internal/session/repository_connection.go @@ -2,6 +2,7 @@ package session import ( "context" + "database/sql" "fmt" "strings" "time" @@ -128,8 +129,8 @@ func (r *Repository) CloseDeadConnectionsForWorker(ctx context.Context, serverId publicIdStr = `public_id not in (%s) and` params := make([]string, len(foundConns)) for i, connId := range foundConns { - params[i] = fmt.Sprintf("$%d", i+2) // Add one for server ID, and offsets start at 1 - args = append(args, connId) + params[i] = fmt.Sprintf("@%d", i+2) // Add one for server ID, and offsets start at 1 + args = append(args, sql.Named(fmt.Sprintf("%d", i+2), connId)) } publicIdStr = fmt.Sprintf(publicIdStr, strings.Join(params, ",")) } @@ -224,8 +225,8 @@ func (r *Repository) ShouldCloseConnectionsOnWorker(ctx context.Context, foundCo // foundConns first connsParams := make([]string, len(foundConns)) for i, connId := range foundConns { - connsParams[i] = fmt.Sprintf("$%d", i+1) - args = append(args, connId) + connsParams[i] = fmt.Sprintf("@%d", i+1) + args = append(args, sql.Named(fmt.Sprintf("%d", i+1), connId)) } connsStr := strings.Join(connsParams, ",") @@ -235,8 +236,8 @@ func (r *Repository) ShouldCloseConnectionsOnWorker(ctx context.Context, foundCo offset := len(foundConns) + 1 sessionsParams := make([]string, len(filterSessions)) for i, sessionId := range filterSessions { - sessionsParams[i] = fmt.Sprintf("$%d", i+offset) - args = append(args, sessionId) + sessionsParams[i] = fmt.Sprintf("@%d", i+offset) + args = append(args, sql.Named(fmt.Sprintf("%d", i+offset), sessionId)) } const sessionIdFmtStr = `and session_id not in (%s)` diff --git a/internal/session/repository_connection_test.go b/internal/session/repository_connection_test.go index 106ab50b3..7e51ba65f 100644 --- a/internal/session/repository_connection_test.go +++ b/internal/session/repository_connection_test.go @@ -503,9 +503,9 @@ func TestRepository_CloseConnectionsForDeadWorkers(t *testing.T) { // CloseConnectionsForDeadWorkersResult. timestampPbAsUTC := func(t *testing.T, tm time.Time) time.Time { t.Helper() - utcLoc, err := time.LoadLocation("Etc/UTC") - require.NoError(err) - return tm.In(utcLoc) + // utcLoc, err := time.LoadLocation("Etc/UTC") + // require.NoError(err) + return tm.In(time.Local) } // Now try some scenarios. diff --git a/internal/session/repository_session.go b/internal/session/repository_session.go index 7eaf0da80..f324be3b6 100644 --- a/internal/session/repository_session.go +++ b/internal/session/repository_session.go @@ -4,6 +4,7 @@ import ( "context" "crypto/ed25519" "crypto/subtle" + "database/sql" "fmt" "strings" @@ -206,31 +207,31 @@ func (r *Repository) ListSessions(ctx context.Context, opt ...Option) ([]*Sessio switch len(opts.withScopeIds) { case 1: inClauseCnt += 1 - where, args = append(where, fmt.Sprintf("scope_id = $%d", inClauseCnt)), append(args, opts.withScopeIds[0]) + where, args = append(where, fmt.Sprintf("scope_id = @%d", inClauseCnt)), append(args, sql.Named("1", opts.withScopeIds[0])) default: idsInClause := make([]string, 0, len(opts.withScopeIds)) for _, id := range opts.withScopeIds { inClauseCnt += 1 - idsInClause, args = append(idsInClause, fmt.Sprintf("$%d", inClauseCnt)), append(args, id) + idsInClause, args = append(idsInClause, fmt.Sprintf("@%d", inClauseCnt)), append(args, sql.Named(fmt.Sprintf("%d", inClauseCnt), id)) } where = append(where, fmt.Sprintf("scope_id in (%s)", strings.Join(idsInClause, ","))) } } if opts.withUserId != "" { inClauseCnt += 1 - where, args = append(where, fmt.Sprintf("user_id = $%d", inClauseCnt)), append(args, opts.withUserId) + where, args = append(where, fmt.Sprintf("user_id = @%d", inClauseCnt)), append(args, sql.Named(fmt.Sprintf("%d", inClauseCnt), opts.withUserId)) } if len(opts.withSessionIds) > 0 { idsInClause := make([]string, 0, len(opts.withSessionIds)) for _, id := range opts.withSessionIds { inClauseCnt += 1 - idsInClause, args = append(idsInClause, fmt.Sprintf("$%d", inClauseCnt)), append(args, id) + idsInClause, args = append(idsInClause, fmt.Sprintf("@%d", inClauseCnt)), append(args, sql.Named(fmt.Sprintf("%d", inClauseCnt), id)) } where = append(where, fmt.Sprintf("s.public_id in (%s)", strings.Join(idsInClause, ","))) } if opts.withServerId != "" { inClauseCnt += 1 - where, args = append(where, fmt.Sprintf("server_id = $%d", inClauseCnt)), append(args, opts.withServerId) + where, args = append(where, fmt.Sprintf("server_id = @%d", inClauseCnt)), append(args, sql.Named(fmt.Sprintf("%d", inClauseCnt), opts.withServerId)) } var limit string @@ -360,7 +361,10 @@ func (r *Repository) TerminateSession(ctx context.Context, sessionId string, ses db.StdRetryCnt, db.ExpBackoff{}, func(reader db.Reader, w db.Writer) error { - rowsAffected, err := w.Exec(ctx, terminateSessionCte, []interface{}{sessionId, sessionVersion}) + rowsAffected, err := w.Exec(ctx, terminateSessionCte, []interface{}{ + sql.Named("version", sessionVersion), + sql.Named("session_id", sessionId), + }) if err != nil { return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to terminate session %s", sessionId))) } @@ -441,7 +445,11 @@ func (r *Repository) AuthorizeConnection(ctx context.Context, sessionId, workerI db.StdRetryCnt, db.ExpBackoff{}, func(reader db.Reader, w db.Writer) error { - rowsAffected, err := w.Exec(ctx, authorizeConnectionCte, []interface{}{sessionId, connectionId, workerId}) + rowsAffected, err := w.Exec(ctx, authorizeConnectionCte, []interface{}{ + sql.Named("session_id", sessionId), + sql.Named("public_id", connectionId), + sql.Named("worker_id", workerId), + }) if err != nil { return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to authorize connection %s", sessionId))) } @@ -476,7 +484,7 @@ type ConnectionAuthzSummary struct { func (r *Repository) sessionAuthzSummary(ctx context.Context, sessionId string) (*ConnectionAuthzSummary, error) { const op = "session.(Repository).sessionAuthzSummary" - rows, err := r.reader.Query(ctx, remainingConnectionsCte, []interface{}{sessionId}) + rows, err := r.reader.Query(ctx, remainingConnectionsCte, []interface{}{sql.Named("session_id", sessionId)}) if err != nil { return nil, errors.Wrap(ctx, err, op) } @@ -645,7 +653,10 @@ func (r *Repository) ActivateSession(ctx context.Context, sessionId string, sess db.StdRetryCnt, db.ExpBackoff{}, func(reader db.Reader, w db.Writer) error { - rowsAffected, err := w.Exec(ctx, activateStateCte, []interface{}{sessionId, sessionVersion}) + rowsAffected, err := w.Exec(ctx, activateStateCte, []interface{}{ + sql.Named("session_id", sessionId), + sql.Named("version", sessionVersion), + }) if err != nil { return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to activate session %s", sessionId))) } @@ -742,7 +753,10 @@ func (r *Repository) updateState(ctx context.Context, sessionId string, sessionV updatedSession.CtTofuToken = nil } - rowsAffected, err = w.Exec(ctx, updateSessionState, []interface{}{sessionId, s.String()}) + rowsAffected, err = w.Exec(ctx, updateSessionState, []interface{}{ + sql.Named("session_id", sessionId), + sql.Named("status", s.String()), + }) if err != nil { return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to update session %s state to %s", sessionId, s.String()))) } diff --git a/internal/session/repository_session_test.go b/internal/session/repository_session_test.go index 1ccae8c59..9ea29d3d4 100644 --- a/internal/session/repository_session_test.go +++ b/internal/session/repository_session_test.go @@ -17,9 +17,9 @@ import ( "github.com/hashicorp/boundary/internal/target" targetStore "github.com/hashicorp/boundary/internal/target/store" wrapping "github.com/hashicorp/go-kms-wrapping" - "github.com/jinzhu/gorm" - "github.com/lib/pq" + "github.com/jackc/pgconn" "google.golang.org/protobuf/types/known/timestamppb" + "gorm.io/gorm" "github.com/hashicorp/boundary/internal/errors" "github.com/hashicorp/boundary/internal/iam" @@ -1408,13 +1408,13 @@ func TestRepository_CancelSessionViaFKNull(t *testing.T) { rowsDeleted, err := rw.Delete(context.Background(), tt.cancelFk.fkType) if err != nil { - var pqError *pq.Error + var pqError *pgconn.PgError if errors.As(err, &pqError) { t.Log(pqError.Message) t.Log(pqError.Detail) t.Log(pqError.Where) - t.Log(pqError.Constraint) - t.Log(pqError.Table) + t.Log(pqError.ConstraintName) + t.Log(pqError.TableName) } } require.NoError(err) diff --git a/internal/session/testing.go b/internal/session/testing.go index 8a67e19e4..445ff499e 100644 --- a/internal/session/testing.go +++ b/internal/session/testing.go @@ -18,9 +18,9 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-secure-stdlib/base62" "github.com/hashicorp/go-uuid" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/timestamppb" + "gorm.io/gorm" ) // TestConnection creates a test connection for the sessionId in the repository. diff --git a/internal/target/query.go b/internal/target/query.go index afc3b4d81..7dc5c09a4 100644 --- a/internal/target/query.go +++ b/internal/target/query.go @@ -13,7 +13,7 @@ current_libraries (library_id) as ( -- returns the current list select credential_library_id from target_credential_library - where target_id = $1 + where target_id = @target_id ), keep_libraries (library_id) as ( -- returns the KEEP list diff --git a/internal/target/repository_credential_source.go b/internal/target/repository_credential_source.go index d4f0a7ca0..2ebb5449f 100644 --- a/internal/target/repository_credential_source.go +++ b/internal/target/repository_credential_source.go @@ -2,6 +2,7 @@ package target import ( "context" + "database/sql" "fmt" "strings" @@ -353,9 +354,9 @@ type change struct { func (r *Repository) changes(ctx context.Context, targetId string, clIds []string) ([]*change, error) { const op = "target.(Repository).changes" var inClauseSpots []string - // starts at 2 because there is already a $1 in the query + // starts at 2 because there is already a @1 in the query for i := 2; i < len(clIds)+2; i++ { - inClauseSpots = append(inClauseSpots, fmt.Sprintf("$%d", i)) + inClauseSpots = append(inClauseSpots, fmt.Sprintf("@%d", i)) } inClause := strings.Join(inClauseSpots, ",") if inClause == "" { @@ -364,9 +365,9 @@ func (r *Repository) changes(ctx context.Context, targetId string, clIds []strin query := fmt.Sprintf(setChangesQuery, inClause) var params []interface{} - params = append(params, targetId) - for _, id := range clIds { - params = append(params, id) + params = append(params, sql.Named("target_id", targetId)) + for idx, id := range clIds { + params = append(params, sql.Named(fmt.Sprintf("%d", idx+2), id)) } rows, err := r.reader.Query(ctx, query, params) if err != nil { diff --git a/internal/target/repository_tcp_target_test.go b/internal/target/repository_tcp_target_test.go index 36274d029..02b3bfd65 100644 --- a/internal/target/repository_tcp_target_test.go +++ b/internal/target/repository_tcp_target_test.go @@ -491,7 +491,9 @@ func TestRepository_UpdateTcpTarget(t *testing.T) { foundTarget, _, _, err := repo.LookupTarget(context.Background(), target.PublicId) assert.NoError(err) assert.True(proto.Equal(targetAfterUpdate.((*TcpTarget)), foundTarget.((*TcpTarget)))) - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) if tt.args.description == "" { assert.Equal(foundTarget.GetDescription(), "") dbassert.IsNull(foundTarget, "description") diff --git a/internal/target/tcp_target_test.go b/internal/target/tcp_target_test.go index 1b2d4964a..e0890e55e 100644 --- a/internal/target/tcp_target_test.go +++ b/internal/target/tcp_target_test.go @@ -279,7 +279,9 @@ func TestTcpTarget_Update(t *testing.T) { require.NoError(err) assert.True(proto.Equal(updateTarget, foundTarget)) if len(tt.args.nullPaths) != 0 { - dbassert := dbassert.New(t, conn.DB()) + underlyingDB, err := conn.DB() + require.NoError(err) + dbassert := dbassert.New(t, underlyingDB) for _, f := range tt.args.nullPaths { dbassert.IsNull(&foundTarget, f) } diff --git a/internal/target/testing.go b/internal/target/testing.go index 6be140c5f..38b35d6e8 100644 --- a/internal/target/testing.go +++ b/internal/target/testing.go @@ -7,8 +7,8 @@ import ( "github.com/hashicorp/boundary/internal/db" "github.com/hashicorp/go-uuid" - "github.com/jinzhu/gorm" "github.com/stretchr/testify/require" + "gorm.io/gorm" ) func TestTcpTarget(t *testing.T, conn *gorm.DB, scopeId, name string, opt ...Option) *TcpTarget { From 8d6dee09a92eeb2646978b8231041d4bfe3c8c95 Mon Sep 17 00:00:00 2001 From: Jim Date: Thu, 30 Sep 2021 09:17:27 -0400 Subject: [PATCH 12/18] refact: Add db.DB wrapper and refact all test fixtures to use it. (#1535) * refact: Changes required for gorm v2 * refact: Add db.DB wrapper and refact all test fixtures to use it Stop leaking the gorm abstraction within our unit tests. * refact: Migrate direct calls to pq to pgx driver The refactor will remove the remaining direct dependencies on the pq driver which has been deprecated in favor of the pgx driver. It includes the addition of common.SqlOpen which is a wrapper around sql.Open, which is needed to deal with the driver name changing from "postgres" to "pgx" but in our code base the dialect and driver are synonyms. --- depowners.md | 3 + go.mod | 3 +- go.sum | 3 +- internal/auth/oidc/repository_account_test.go | 2 +- .../oidc/repository_managed_group_test.go | 2 +- internal/auth/oidc/testing.go | 9 ++- internal/auth/password/argon2_test.go | 3 +- .../auth/password/repository_account_test.go | 3 +- .../password/repository_authmethod_test.go | 2 +- internal/auth/password/testing.go | 9 ++- internal/authtoken/testing.go | 3 +- internal/cmd/base/dev.go | 2 +- .../cmd/base/internal/docker/supported.go | 7 +- internal/cmd/base/servers.go | 42 +++-------- internal/cmd/commands/database/funcs.go | 4 +- internal/cmd/commands/database/funcs_test.go | 20 +++--- internal/cmd/commands/database/init.go | 10 +-- internal/cmd/commands/dev/dev.go | 2 +- internal/cmd/commands/server/server.go | 4 +- internal/credential/vault/jobs_test.go | 5 +- .../repository_credential_library_test.go | 2 +- .../vault/repository_credential_store_test.go | 31 ++++---- internal/credential/vault/supported.go | 7 +- internal/credential/vault/testing.go | 17 +++-- internal/db/assert/asserts_test.go | 12 ++-- internal/db/common/db.go | 15 ++++ internal/db/db.go | 70 +++++++++++++++++-- internal/db/db_test.go | 4 +- internal/db/domains_test.go | 67 ++++++++++-------- internal/db/option.go | 20 ++++++ internal/db/option_test.go | 27 +++++++ internal/db/read_writer.go | 22 +++--- internal/db/read_writer_test.go | 21 +++--- internal/db/schema/manager_test.go | 23 +++--- .../postgres/11/01_server_type_enum_test.go | 7 +- .../12/01_timestamp_sub_funcs_test.go | 3 +- .../postgres/14/warehouse_user_dim_test.go | 7 +- .../16/warehouse_credential_dim_test.go | 5 +- .../migrations/postgres/2/07_iam_test.go | 4 +- .../postgres/8/08_connection_test.go | 5 +- internal/db/schema/postgres/postgres.go | 27 +++---- internal/db/schema/postgres/postgres_test.go | 2 +- internal/db/schema/postgres/testing.go | 4 +- internal/db/schema/schema.go | 4 +- internal/db/schema/schema_test.go | 4 +- internal/db/testing.go | 5 +- internal/errors/is_test.go | 6 +- internal/host/static/host_catalog_test.go | 3 +- .../static/repository_host_catalog_test.go | 3 +- .../host/static/repository_host_set_test.go | 3 +- internal/host/static/repository_host_test.go | 3 +- internal/host/static/testing.go | 9 ++- internal/iam/account_test.go | 3 +- internal/iam/group_test.go | 3 +- internal/iam/immutable_fields_test.go | 3 +- internal/iam/repository_group_test.go | 3 +- internal/iam/repository_role_test.go | 3 +- internal/iam/repository_user_iam_pkg_test.go | 3 +- internal/iam/repository_user_test.go | 6 +- internal/iam/role_test.go | 3 +- internal/iam/testing.go | 27 +++---- internal/kms/testing.go | 27 ++++--- internal/oplog/testing.go | 4 +- internal/oplog/testing_test.go | 4 +- internal/scheduler/job/testing.go | 9 ++- internal/scheduler/testing.go | 3 +- .../handlers/authmethods/oidc_test.go | 3 +- .../handlers/targets/target_service_test.go | 3 +- internal/servers/controller/testing.go | 10 +-- internal/session/repository_session_test.go | 17 +++-- internal/session/testing.go | 15 ++-- internal/target/repository_tcp_target_test.go | 3 +- internal/target/tcp_target_test.go | 3 +- internal/target/testing.go | 5 +- testing/dbtest/docs.go | 2 +- testing/dbtest/template.go | 14 ++-- testing/dbtest/template_test.go | 6 +- 77 files changed, 441 insertions(+), 321 deletions(-) create mode 100644 internal/db/common/db.go diff --git a/depowners.md b/depowners.md index de75af9e1..089092798 100644 --- a/depowners.md +++ b/depowners.md @@ -86,6 +86,9 @@ the first place. * github.com/kr/pretty * Jeff * github.com/lib/pq + * Jim + * Mike +* github.com/jackc/pgx * Jim * Mike * github.com/mattn/go-colorable diff --git a/go.mod b/go.mod index e62f65e4f..c89dffc48 100644 --- a/go.mod +++ b/go.mod @@ -52,12 +52,11 @@ require ( github.com/hashicorp/vault/sdk v0.2.1 github.com/iancoleman/strcase v0.2.0 github.com/jackc/pgconn v1.10.0 + github.com/jackc/pgx/v4 v4.11.0 github.com/jefferai/keyring v1.1.7-0.20210105022822-8749b3d9ce79 - github.com/jinzhu/gorm v1.9.12 github.com/json-iterator/go v1.1.10 // indirect github.com/kr/pretty v0.3.0 github.com/kr/text v0.2.0 - github.com/lib/pq v1.10.3 github.com/mattn/go-colorable v0.1.8 github.com/mattn/go-isatty v0.0.13 // indirect github.com/mitchellh/cli v1.1.2 diff --git a/go.sum b/go.sum index 625890ad7..d1e9edf79 100644 --- a/go.sum +++ b/go.sum @@ -708,9 +708,8 @@ github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.6.0/go.mod h1:4vXEAYvW1fRQ2/FhZ78H73A60MHw1geSm145z2mdY1g= +github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.3 h1:v9QZf2Sn6AmjXtQeFpdoq/eaNtYP6IN+7lcrygsIAtg= -github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= diff --git a/internal/auth/oidc/repository_account_test.go b/internal/auth/oidc/repository_account_test.go index 11a22ac64..62dc111da 100644 --- a/internal/auth/oidc/repository_account_test.go +++ b/internal/auth/oidc/repository_account_test.go @@ -1160,7 +1160,7 @@ func TestRepository_UpdateAccount(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.AuthMethodId, got.AuthMethodId) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { diff --git a/internal/auth/oidc/repository_managed_group_test.go b/internal/auth/oidc/repository_managed_group_test.go index e7600db3a..12cbc8db9 100644 --- a/internal/auth/oidc/repository_managed_group_test.go +++ b/internal/auth/oidc/repository_managed_group_test.go @@ -952,7 +952,7 @@ func TestRepository_UpdateManagedGroup(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.AuthMethodId, got.AuthMethodId) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { diff --git a/internal/auth/oidc/testing.go b/internal/auth/oidc/testing.go index 4fc07d8fb..d46ff8c6d 100644 --- a/internal/auth/oidc/testing.go +++ b/internal/auth/oidc/testing.go @@ -31,7 +31,6 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/timestamppb" - "gorm.io/gorm" ) const TestFakeManagedGroupFilter = `"/foo" == "bar"` @@ -41,7 +40,7 @@ const TestFakeManagedGroupFilter = `"/foo" == "bar"` // WithSigningAlgs options are supported. func TestAuthMethod( t *testing.T, - conn *gorm.DB, + conn *db.DB, databaseWrapper wrapping.Wrapper, scopeId string, state AuthMethodState, @@ -158,7 +157,7 @@ func TestSortAuthMethods(t *testing.T, methods []*AuthMethod) { } // TestAccount creates a test oidc auth account. -func TestAccount(t *testing.T, conn *gorm.DB, am *AuthMethod, subject string, opt ...Option) *Account { +func TestAccount(t *testing.T, conn *db.DB, am *AuthMethod, subject string, opt ...Option) *Account { t.Helper() require := require.New(t) rw := db.New(conn) @@ -179,7 +178,7 @@ func TestAccount(t *testing.T, conn *gorm.DB, am *AuthMethod, subject string, op } // TestManagedGroup creates a test oidc managed group. -func TestManagedGroup(t *testing.T, conn *gorm.DB, am *AuthMethod, filter string, opt ...Option) *ManagedGroup { +func TestManagedGroup(t *testing.T, conn *db.DB, am *AuthMethod, filter string, opt ...Option) *ManagedGroup { t.Helper() require := require.New(t) rw := db.New(conn) @@ -197,7 +196,7 @@ func TestManagedGroup(t *testing.T, conn *gorm.DB, am *AuthMethod, filter string } // TestManagedGroupMember adds given account IDs to a managed group -func TestManagedGroupMember(t *testing.T, conn *gorm.DB, managedGroupId, memberId string, opt ...Option) *ManagedGroupMemberAccount { +func TestManagedGroupMember(t *testing.T, conn *db.DB, managedGroupId, memberId string, opt ...Option) *ManagedGroupMemberAccount { t.Helper() require := require.New(t) rw := db.New(conn) diff --git a/internal/auth/password/argon2_test.go b/internal/auth/password/argon2_test.go index 0a81f2bc5..f53fb4534 100644 --- a/internal/auth/password/argon2_test.go +++ b/internal/auth/password/argon2_test.go @@ -10,7 +10,6 @@ import ( "github.com/hashicorp/boundary/internal/iam" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gorm.io/gorm" ) func TestArgon2Configuration_New(t *testing.T) { @@ -289,7 +288,7 @@ func TestArgon2Configuration_Validate(t *testing.T) { } } -func testArgon2Confs(t *testing.T, conn *gorm.DB, authMethodId string, count int) []*Argon2Configuration { +func testArgon2Confs(t *testing.T, conn *db.DB, authMethodId string, count int) []*Argon2Configuration { t.Helper() assert, require := assert.New(t), require.New(t) rw := db.New(conn) diff --git a/internal/auth/password/repository_account_test.go b/internal/auth/password/repository_account_test.go index 031d5efb3..13ee140a7 100644 --- a/internal/auth/password/repository_account_test.go +++ b/internal/auth/password/repository_account_test.go @@ -589,6 +589,7 @@ func TestRepository_UpdateAccount(t *testing.T) { wrapper := db.TestWrapper(t) kms := kms.TestKms(t, conn, wrapper) iamRepo := iam.TestRepo(t, conn, wrapper) + ctx := context.Background() changeLoginName := func(s string) func(*Account) *Account { return func(a *Account) *Account { @@ -949,7 +950,7 @@ func TestRepository_UpdateAccount(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.AuthMethodId, got.AuthMethodId) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { diff --git a/internal/auth/password/repository_authmethod_test.go b/internal/auth/password/repository_authmethod_test.go index 33783b0e6..1c5a073a6 100644 --- a/internal/auth/password/repository_authmethod_test.go +++ b/internal/auth/password/repository_authmethod_test.go @@ -769,7 +769,7 @@ func TestRepository_UpdateAuthMethod(t *testing.T) { require.NoError(err) assert.Empty(cmp.Diff(updatedAM, foundAuthMethod, protocmp.Transform())) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) if amToUpdate.Name == "" && contains(tt.args.fieldMaskPaths, "name") { diff --git a/internal/auth/password/testing.go b/internal/auth/password/testing.go index 1f6995403..975ed4cb9 100644 --- a/internal/auth/password/testing.go +++ b/internal/auth/password/testing.go @@ -8,13 +8,12 @@ import ( "github.com/hashicorp/boundary/internal/db" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gorm.io/gorm" ) // TestAuthMethod creates a password auth methods to the provided DB with the // provided scope id. If any errors are encountered during the creation of the // auth methods, the test will fail. -func TestAuthMethod(t *testing.T, conn *gorm.DB, scopeId string, opt ...Option) *AuthMethod { +func TestAuthMethod(t *testing.T, conn *db.DB, scopeId string, opt ...Option) *AuthMethod { t.Helper() assert, require := assert.New(t), require.New(t) w := db.New(conn) @@ -48,7 +47,7 @@ func TestAuthMethod(t *testing.T, conn *gorm.DB, scopeId string, opt ...Option) // TestAuthMethods creates count number of password auth methods to the provided DB // with the provided scope id. If any errors are encountered during the creation of // the auth methods, the test will fail. -func TestAuthMethods(t *testing.T, conn *gorm.DB, scopeId string, count int) []*AuthMethod { +func TestAuthMethods(t *testing.T, conn *db.DB, scopeId string, count int) []*AuthMethod { t.Helper() var auts []*AuthMethod for i := 0; i < count; i++ { @@ -60,7 +59,7 @@ func TestAuthMethods(t *testing.T, conn *gorm.DB, scopeId string, count int) []* // TestMultipleAccounts creates count number of password account to the provided DB // with the provided auth method id. The auth method must have been created previously. // If any errors are encountered during the creation of the account, the test will fail. -func TestMultipleAccounts(t *testing.T, conn *gorm.DB, authMethodId string, count int) []*Account { +func TestMultipleAccounts(t *testing.T, conn *db.DB, authMethodId string, count int) []*Account { t.Helper() var auts []*Account for i := 0; i < count; i++ { @@ -73,7 +72,7 @@ func TestMultipleAccounts(t *testing.T, conn *gorm.DB, authMethodId string, coun // auth method id and loginName. The auth method must have been created // previously. See password.NewAccount(...) for a list of supported options. // If any errors are encountered during the creation of the account, the test will fail. -func TestAccount(t *testing.T, conn *gorm.DB, authMethodId, loginName string, opt ...Option) *Account { +func TestAccount(t *testing.T, conn *db.DB, authMethodId, loginName string, opt ...Option) *Account { t.Helper() assert, require := assert.New(t), require.New(t) require.NotEmpty(loginName) diff --git a/internal/authtoken/testing.go b/internal/authtoken/testing.go index 2b95e00c4..b34cded2f 100644 --- a/internal/authtoken/testing.go +++ b/internal/authtoken/testing.go @@ -9,10 +9,9 @@ import ( "github.com/hashicorp/boundary/internal/iam" "github.com/hashicorp/boundary/internal/kms" "github.com/stretchr/testify/require" - "gorm.io/gorm" ) -func TestAuthToken(t *testing.T, conn *gorm.DB, kms *kms.Kms, scopeId string, opt ...Option) *AuthToken { +func TestAuthToken(t *testing.T, conn *db.DB, kms *kms.Kms, scopeId string, opt ...Option) *AuthToken { t.Helper() authMethod := password.TestAuthMethods(t, conn, scopeId, 1)[0] // auth account is only used to join auth method to user. diff --git a/internal/cmd/base/dev.go b/internal/cmd/base/dev.go index 5db90e915..58185f21e 100644 --- a/internal/cmd/base/dev.go +++ b/internal/cmd/base/dev.go @@ -94,7 +94,7 @@ func (b *Server) CreateDevDatabase(ctx context.Context, opt ...Option) error { b.Info["dev database container"] = strings.TrimPrefix(container, "/") } - if err := b.ConnectToDatabase(dialect); err != nil { + if err := b.ConnectToDatabase(ctx, dialect); err != nil { if c != nil { err = multierror.Append(err, c()) } diff --git a/internal/cmd/base/internal/docker/supported.go b/internal/cmd/base/internal/docker/supported.go index 55867a8e2..50460fc18 100644 --- a/internal/cmd/base/internal/docker/supported.go +++ b/internal/cmd/base/internal/docker/supported.go @@ -4,11 +4,12 @@ package docker import ( - "database/sql" "fmt" "os" "strings" + "github.com/hashicorp/boundary/internal/db/common" + _ "github.com/jackc/pgx/v4/stdlib" "github.com/ory/dockertest/v3" ) @@ -37,7 +38,7 @@ func startDbInDockerSupported(dialect string, opt ...Option) (cleanup func() err } switch dialect { - case "postgres": + case "postgres", "pgx": switch { case os.Getenv("BOUNDARY_TESTING_PG_URL") != "": url = os.Getenv("BOUNDARY_TESTING_PG_URL") @@ -68,7 +69,7 @@ func startDbInDockerSupported(dialect string, opt ...Option) (cleanup func() err } if err := pool.Retry(func() error { - db, err := sql.Open(dialect, url) + db, err := common.SqlOpen(dialect, url) if err != nil { return fmt.Errorf("error opening %s dev container: %w", dialect, err) } diff --git a/internal/cmd/base/servers.go b/internal/cmd/base/servers.go index e9edaf369..90d7671b3 100644 --- a/internal/cmd/base/servers.go +++ b/internal/cmd/base/servers.go @@ -39,8 +39,6 @@ import ( "github.com/hashicorp/go-secure-stdlib/strutil" "github.com/mitchellh/cli" "google.golang.org/grpc/grpclog" - "gorm.io/gorm" - "gorm.io/gorm/logger" ) const ( @@ -120,7 +118,7 @@ type Server struct { DatabaseMaxOpenConnections int DevDatabaseCleanupFunc func() error - Database *gorm.DB + Database *db.DB // StatusGracePeriodDuration represents the period of time (as a // duration) that the controller will wait before marking @@ -548,38 +546,22 @@ func (b *Server) RunShutdownFuncs() error { return mErr.ErrorOrNil() } -func (b *Server) ConnectToDatabase(dialect string) error { +func (b *Server) ConnectToDatabase(ctx context.Context, dialect string) error { dbType, err := db.StringToDbType(dialect) if err != nil { return fmt.Errorf("unable to create db object with dialect %s: %w", dialect, err) } - dbase, err := db.Open(dbType, b.DatabaseUrl) + opts := []db.Option{ + db.WithMaxOpenConnections(b.DatabaseMaxOpenConnections), + } + if os.Getenv("BOUNDARY_DISABLE_GORM_FORMATTER") == "" { + opts = append(opts, db.WithGormFormatter(b.Logger)) + } + dbase, err := db.Open(dbType, b.DatabaseUrl, opts...) if err != nil { return fmt.Errorf("unable to create db object with dialect %s: %w", dialect, err) } - if b.DatabaseMaxOpenConnections == 1 { - return fmt.Errorf("unable to create db object with dialect %s: %s", dialect, "max_open_connections must be unlimited by setting 0 or at least 2") - } else { - underlyingDB, err := dbase.DB() - if err != nil { - return fmt.Errorf("unable retreive db: %w", err) - } - underlyingDB.SetMaxOpenConns(b.DatabaseMaxOpenConnections) - } b.Database = dbase - if os.Getenv("BOUNDARY_DISABLE_GORM_FORMATTER") == "" { - newLogger := logger.New( - db.GetGormLogger(b.Logger), - logger.Config{ - LogLevel: logger.Error, // Log level - Colorful: false, // Disable color - }, - ) - dbase = dbase.Session(&gorm.Session{Logger: newLogger}) - } - - b.Database = dbase - return nil } @@ -618,13 +600,11 @@ func (b *Server) CreateGlobalKmsKeys(ctx context.Context) error { return nil } -func (b *Server) DestroyDevDatabase() error { +func (b *Server) DestroyDevDatabase(ctx context.Context) error { if b.Database != nil { - underlyingDB, err := b.Database.DB() - if err != nil { + if err := b.Database.Close(ctx); err != nil { return err } - underlyingDB.Close() } if b.DevDatabaseCleanupFunc != nil { return b.DevDatabaseCleanupFunc() diff --git a/internal/cmd/commands/database/funcs.go b/internal/cmd/commands/database/funcs.go index f1ea8d486..9438b8725 100644 --- a/internal/cmd/commands/database/funcs.go +++ b/internal/cmd/commands/database/funcs.go @@ -2,10 +2,10 @@ package database import ( "context" - "database/sql" "fmt" "github.com/hashicorp/boundary/internal/cmd/base" + "github.com/hashicorp/boundary/internal/db/common" "github.com/hashicorp/boundary/internal/db/schema" "github.com/hashicorp/boundary/internal/errors" "github.com/mitchellh/cli" @@ -20,7 +20,7 @@ func migrateDatabase(ctx context.Context, ui cli.Ui, dialect, u string, initiali noop := func() {} // This database is used to keep an exclusive lock on the database for the // remainder of the command - dBase, err := sql.Open(dialect, u) + dBase, err := common.SqlOpen(dialect, u) if err != nil { ui.Error(fmt.Errorf("Error establishing db connection: %w", err).Error()) return noop, 2 diff --git a/internal/cmd/commands/database/funcs_test.go b/internal/cmd/commands/database/funcs_test.go index fe41b4656..6ad2dd1b5 100644 --- a/internal/cmd/commands/database/funcs_test.go +++ b/internal/cmd/commands/database/funcs_test.go @@ -2,10 +2,10 @@ package database import ( "context" - "database/sql" "testing" "github.com/hashicorp/boundary/internal/cmd/base" + "github.com/hashicorp/boundary/internal/db/common" "github.com/hashicorp/boundary/internal/db/schema" "github.com/hashicorp/boundary/testing/dbtest" "github.com/mitchellh/cli" @@ -49,7 +49,7 @@ func TestMigrateDatabase(t *testing.T) { require.NoError(t, c()) }) - dBase, err := sql.Open(dialect, u) + dBase, err := common.SqlOpen(dialect, u) require.NoError(t, err) earlyMigrationVersion := 2000 @@ -75,7 +75,7 @@ func TestMigrateDatabase(t *testing.T) { require.NoError(t, c()) }) - dBase, err := sql.Open(dialect, u) + dBase, err := common.SqlOpen(dialect, u) require.NoError(t, err) earlyMigrationVersion := 2000 @@ -100,7 +100,7 @@ func TestMigrateDatabase(t *testing.T) { t.Cleanup(func() { require.NoError(t, c()) }) - dBase, err := sql.Open(dialect, u) + dBase, err := common.SqlOpen(dialect, u) require.NoError(t, err) createStmt := `create table if not exists schema_migrations (version bigint primary key, dirty boolean not null)` @@ -120,7 +120,7 @@ func TestMigrateDatabase(t *testing.T) { t.Cleanup(func() { require.NoError(t, c()) }) - dBase, err := sql.Open(dialect, u) + dBase, err := common.SqlOpen(dialect, u) require.NoError(t, err) createStmt := `create table if not exists schema_migrations (version bigint primary key, dirty boolean not null)` @@ -154,7 +154,7 @@ func TestMigrateDatabase(t *testing.T) { t.Cleanup(func() { require.NoError(t, c()) }) - dBase, err := sql.Open(dialect, u) + dBase, err := common.SqlOpen(dialect, u) require.NoError(t, err) man, err := schema.NewManager(ctx, dialect, dBase) @@ -177,7 +177,7 @@ func TestMigrateDatabase(t *testing.T) { t.Cleanup(func() { require.NoError(t, c()) }) - dBase, err := sql.Open(dialect, u) + dBase, err := common.SqlOpen(dialect, u) require.NoError(t, err) man, err := schema.NewManager(ctx, dialect, dBase) @@ -217,7 +217,7 @@ func TestVerifyOplogIsEmpty(t *testing.T) { }) _ = c - dBase, err := sql.Open(dialect, u) + dBase, err := common.SqlOpen(dialect, u) require.NoError(t, err) man, err := schema.NewManager(ctx, dialect, dBase) @@ -228,7 +228,7 @@ func TestVerifyOplogIsEmpty(t *testing.T) { cmd.srv = base.NewServer(&base.Command{UI: cmd.UI}) cmd.srv.DatabaseUrl = u - require.NoError(t, cmd.srv.ConnectToDatabase(dialect)) + require.NoError(t, cmd.srv.ConnectToDatabase(ctx, dialect)) - assert.NoError(t, cmd.verifyOplogIsEmpty()) + assert.NoError(t, cmd.verifyOplogIsEmpty(ctx)) } diff --git a/internal/cmd/commands/database/init.go b/internal/cmd/commands/database/init.go index 47c40cd48..6c8a81abf 100644 --- a/internal/cmd/commands/database/init.go +++ b/internal/cmd/commands/database/init.go @@ -1,6 +1,7 @@ package database import ( + "context" "fmt" "github.com/hashicorp/boundary/internal/cmd/base" @@ -164,6 +165,7 @@ func (c *InitCommand) AutocompleteFlags() complete.Flags { } func (c *InitCommand) Run(args []string) (retCode int) { + ctx := context.Background() if result := c.ParseFlagsAndConfig(args); result > 0 { return result } @@ -277,11 +279,11 @@ func (c *InitCommand) Run(args []string) (retCode int) { return base.CommandUserError } // Everything after is done with normal database URL and is affecting actual data - if err := c.srv.ConnectToDatabase(dialect); err != nil { + if err := c.srv.ConnectToDatabase(ctx, dialect); err != nil { c.UI.Error(fmt.Errorf("Error connecting to database after migrations: %w", err).Error()) return base.CommandCliError } - if err := c.verifyOplogIsEmpty(); err != nil { + if err := c.verifyOplogIsEmpty(ctx); err != nil { c.UI.Error(fmt.Sprintf("The database appears to have already been initialized: %v", err)) return base.CommandCliError } @@ -491,9 +493,9 @@ func (c *InitCommand) ParseFlagsAndConfig(args []string) int { return base.CommandSuccess } -func (c *InitCommand) verifyOplogIsEmpty() error { +func (c *InitCommand) verifyOplogIsEmpty(ctx context.Context) error { const op = "database.(InitCommand).verifyOplogIsEmpty" - underlyingDB, err := c.srv.Database.DB() + underlyingDB, err := c.srv.Database.SqlDB(ctx) if err != nil { return errors.NewDeprecated(errors.Internal, op, "unable to retreive db", errors.WithWrap(err)) } diff --git a/internal/cmd/commands/dev/dev.go b/internal/cmd/commands/dev/dev.go index 6cb3934f6..8df71fd6c 100644 --- a/internal/cmd/commands/dev/dev.go +++ b/internal/cmd/commands/dev/dev.go @@ -556,7 +556,7 @@ func (c *Command) Run(args []string) int { } if !c.flagDisableDatabaseDestruction { - c.ShutdownFuncs = append(c.ShutdownFuncs, c.DestroyDevDatabase) + c.ShutdownFuncs = append(c.ShutdownFuncs, func() error { return c.DestroyDevDatabase(ctx) }) } default: c.DatabaseUrl, err = parseutil.ParsePath(c.flagDatabaseUrl) diff --git a/internal/cmd/commands/server/server.go b/internal/cmd/commands/server/server.go index 1139573a9..a2851a79d 100644 --- a/internal/cmd/commands/server/server.go +++ b/internal/cmd/commands/server/server.go @@ -389,12 +389,12 @@ func (c *Command) Run(args []string) int { } c.DatabaseMaxOpenConnections = c.Config.Controller.Database.MaxOpenConnections - if err := c.ConnectToDatabase("postgres"); err != nil { + if err := c.ConnectToDatabase(ctx, "postgres"); err != nil { c.UI.Error(fmt.Errorf("Error connecting to database: %w", err).Error()) return base.CommandCliError } - underlyingDB, err := c.Database.DB() + underlyingDB, err := c.Database.SqlDB(ctx) if err != nil { c.UI.Error(fmt.Errorf("Can't get db: %w.", err).Error()) return base.CommandCliError diff --git a/internal/credential/vault/jobs_test.go b/internal/credential/vault/jobs_test.go index 35f963c98..3ceeaadf2 100644 --- a/internal/credential/vault/jobs_test.go +++ b/internal/credential/vault/jobs_test.go @@ -21,7 +21,6 @@ import ( vault "github.com/hashicorp/vault/api" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gorm.io/gorm" ) const testUpdateTokenStatusExpirationQuery = ` @@ -33,7 +32,7 @@ update credential_vault_token ` func testVaultToken(t *testing.T, - conn *gorm.DB, + conn *db.DB, wrapper wrapping.Wrapper, v *TestVaultServer, cs *CredentialStore, @@ -87,7 +86,7 @@ func testVaultToken(t *testing.T, } func testVaultCred(t *testing.T, - conn *gorm.DB, + conn *db.DB, v *TestVaultServer, cl *CredentialLibrary, sess *session.Session, diff --git a/internal/credential/vault/repository_credential_library_test.go b/internal/credential/vault/repository_credential_library_test.go index 6a1e9320f..039675242 100644 --- a/internal/credential/vault/repository_credential_library_test.go +++ b/internal/credential/vault/repository_credential_library_test.go @@ -795,7 +795,7 @@ func TestRepository_UpdateCredentialLibrary(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.StoreId, got.StoreId) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { diff --git a/internal/credential/vault/repository_credential_store_test.go b/internal/credential/vault/repository_credential_store_test.go index e44b0bde7..2b7f72484 100644 --- a/internal/credential/vault/repository_credential_store_test.go +++ b/internal/credential/vault/repository_credential_store_test.go @@ -23,7 +23,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/protobuf/testing/protocmp" - "gorm.io/gorm" ) func TestRepository_CreateCredentialStoreResource(t *testing.T) { @@ -756,7 +755,7 @@ func TestRepository_UpdateCredentialStore_Attributes(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.ScopeId, got.ScopeId) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { @@ -887,7 +886,7 @@ func TestRepository_UpdateCredentialStore_Attributes(t *testing.T) { assert.Equal(1, gotCount2, "count of updated records") require.NotNil(got2) assert.Nil(got2.CaCert) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) dbassert.IsNull(got2, "CaCert") @@ -1270,9 +1269,9 @@ func TestRepository_DeleteCredentialStore(t *testing.T) { type tokenMap map[string]*tokenCount - type setupFn func(t *testing.T, conn *gorm.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) + type setupFn func(t *testing.T, conn *db.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) - baseSetup := func(t *testing.T, conn *gorm.DB) (wrapper wrapping.Wrapper, repo *Repository, scopeId string) { + baseSetup := func(t *testing.T, conn *db.DB) (wrapper wrapping.Wrapper, repo *Repository, scopeId string) { wrapper = db.TestWrapper(t) kms := kms.TestKms(t, conn, wrapper) sche := scheduler.TestScheduler(t, conn, wrapper) @@ -1286,7 +1285,7 @@ func TestRepository_DeleteCredentialStore(t *testing.T) { return } - testStores := func(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, tokens tokenMap, scopeId string, count int) ([]*CredentialStore, tokenMap) { + testStores := func(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, tokens tokenMap, scopeId string, count int) ([]*CredentialStore, tokenMap) { if tokens == nil { tokens = make(tokenMap) } @@ -1299,13 +1298,13 @@ func TestRepository_DeleteCredentialStore(t *testing.T) { return css, tokens } - makeMaintainingTokens := func(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, tokens tokenMap, scopeId, storeId string, count int) tokenMap { + makeMaintainingTokens := func(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, tokens tokenMap, scopeId, storeId string, count int) tokenMap { testTokens(t, conn, wrapper, scopeId, storeId, count) tokens[storeId].maintaining = count return tokens } - makeRevokedTokens := func(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, tokens tokenMap, scopeId, storeId string, count int) tokenMap { + makeRevokedTokens := func(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, tokens tokenMap, scopeId, storeId string, count int) tokenMap { require.NotNil(t, tokens) const query = ` update credential_vault_token @@ -1327,7 +1326,7 @@ update credential_vault_token return tokens } - makeExpiredTokens := func(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, tokens tokenMap, scopeId, storeId string, count int) tokenMap { + makeExpiredTokens := func(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, tokens tokenMap, scopeId, storeId string, count int) tokenMap { require.NotNil(t, tokens) const query = ` update credential_vault_token @@ -1349,7 +1348,7 @@ update credential_vault_token return tokens } - assertTokens := func(t *testing.T, conn *gorm.DB, want tokenMap) { + assertTokens := func(t *testing.T, conn *db.DB, want tokenMap) { const query = ` select store_id, status, count(token_hmac) from credential_vault_token @@ -1399,7 +1398,7 @@ group by store_id, status; }{ { name: "simple", - setup: func(t *testing.T, conn *gorm.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) { + setup: func(t *testing.T, conn *db.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) { wrapper, repo, scopeId := baseSetup(t, conn) css, tokens := testStores(t, conn, wrapper, nil, scopeId, 1) cs := css[0] @@ -1409,7 +1408,7 @@ group by store_id, status; }, { name: "with-libraries", - setup: func(t *testing.T, conn *gorm.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) { + setup: func(t *testing.T, conn *db.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) { wrapper, repo, scopeId := baseSetup(t, conn) css, tokens := testStores(t, conn, wrapper, nil, scopeId, 1) cs := css[0] @@ -1421,7 +1420,7 @@ group by store_id, status; }, { name: "with-maintaining-tokens", - setup: func(t *testing.T, conn *gorm.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) { + setup: func(t *testing.T, conn *db.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) { wrapper, repo, scopeId := baseSetup(t, conn) css, tokens := testStores(t, conn, wrapper, nil, scopeId, 1) cs := css[0] @@ -1434,7 +1433,7 @@ group by store_id, status; }, { name: "with-revoked-tokens", - setup: func(t *testing.T, conn *gorm.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) { + setup: func(t *testing.T, conn *db.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) { wrapper, repo, scopeId := baseSetup(t, conn) css, tokens := testStores(t, conn, wrapper, nil, scopeId, 1) cs := css[0] @@ -1447,7 +1446,7 @@ group by store_id, status; }, { name: "with-expired-tokens", - setup: func(t *testing.T, conn *gorm.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) { + setup: func(t *testing.T, conn *db.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) { wrapper, repo, scopeId := baseSetup(t, conn) css, tokens := testStores(t, conn, wrapper, nil, scopeId, 1) cs := css[0] @@ -1460,7 +1459,7 @@ group by store_id, status; }, { name: "with-all-token-statuses", - setup: func(t *testing.T, conn *gorm.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) { + setup: func(t *testing.T, conn *db.DB) (storeId string, libs []*CredentialLibrary, tokens tokenMap, repo *Repository) { wrapper, repo, scopeId := baseSetup(t, conn) css, tokens := testStores(t, conn, wrapper, nil, scopeId, 1) cs := css[0] diff --git a/internal/credential/vault/supported.go b/internal/credential/vault/supported.go index 206bee5f9..1cfcf95ac 100644 --- a/internal/credential/vault/supported.go +++ b/internal/credential/vault/supported.go @@ -5,7 +5,6 @@ package vault import ( "crypto/tls" - "database/sql" "fmt" "io/ioutil" "net/http" @@ -16,8 +15,10 @@ import ( "testing" "time" + "github.com/hashicorp/boundary/internal/db/common" "github.com/hashicorp/go-rootcerts" vault "github.com/hashicorp/vault/api" + _ "github.com/jackc/pgx/v4/stdlib" "github.com/ory/dockertest/v3" "github.com/stretchr/testify/require" ) @@ -224,7 +225,7 @@ func gotMountDatabase(t *testing.T, v *TestVaultServer, opt ...TestOption) *Test dburl := fmt.Sprintf(dbUrlTemplate, "postgres", "password") err = pool.Retry(func() error { var err error - db, err := sql.Open("postgres", dburl) + db, err := common.SqlOpen("postgres", dburl) if err != nil { return err } @@ -244,7 +245,7 @@ func gotMountDatabase(t *testing.T, v *TestVaultServer, opt ...TestOption) *Test grantClosedRole = `grant select, insert, update, delete on boundary_closed to closed_role` ) - db, err := sql.Open("postgres", dburl) + db, err := common.SqlOpen("postgres", dburl) require.NoError(err) defer db.Close() diff --git a/internal/credential/vault/testing.go b/internal/credential/vault/testing.go index bc9bb2741..53042d626 100644 --- a/internal/credential/vault/testing.go +++ b/internal/credential/vault/testing.go @@ -7,7 +7,6 @@ import ( "crypto/rand" "crypto/x509" "crypto/x509/pkix" - "database/sql" "encoding/pem" "fmt" "math/big" @@ -19,6 +18,7 @@ import ( "testing" "time" + "github.com/hashicorp/boundary/internal/db/common" "github.com/hashicorp/boundary/internal/errors" "github.com/hashicorp/boundary/internal/db" @@ -28,14 +28,13 @@ import ( vault "github.com/hashicorp/vault/api" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gorm.io/gorm" ) // TestCredentialStore creates a vault credential store in the provided DB with // the provided scope, vault address, token, and accessor and any values passed // in through the Options vargs. If any errors are encountered during the // creation of the store, the test will fail. -func TestCredentialStore(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, scopeId, vaultAddr, vaultToken, accessor string, opts ...Option) *CredentialStore { +func TestCredentialStore(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, scopeId, vaultAddr, vaultToken, accessor string, opts ...Option) *CredentialStore { t.Helper() ctx := context.Background() kmsCache := kms.TestKms(t, conn, wrapper) @@ -76,7 +75,7 @@ func TestCredentialStore(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, // the provided DB with the provided scope id. If any errors are // encountered during the creation of the credential stores, the test will // fail. -func TestCredentialStores(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, scopeId string, count int) []*CredentialStore { +func TestCredentialStores(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, scopeId string, count int) []*CredentialStore { t.Helper() ctx := context.Background() kmsCache := kms.TestKms(t, conn, wrapper) @@ -114,7 +113,7 @@ func TestCredentialStores(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, // libraries in the provided DB with the provided store id. If any errors // are encountered during the creation of the credential libraries, the // test will fail. -func TestCredentialLibraries(t *testing.T, conn *gorm.DB, _ wrapping.Wrapper, storeId string, count int) []*CredentialLibrary { +func TestCredentialLibraries(t *testing.T, conn *db.DB, _ wrapping.Wrapper, storeId string, count int) []*CredentialLibrary { t.Helper() assert, require := assert.New(t), require.New(t) w := db.New(conn) @@ -145,7 +144,7 @@ func TestCredentialLibraries(t *testing.T, conn *gorm.DB, _ wrapping.Wrapper, st // TestCredentials creates count number of vault credentials in the provided DB with // the provided library id and session id. If any errors are encountered // during the creation of the credentials, the test will fail. -func TestCredentials(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, libraryId, sessionId string, count int) []*Credential { +func TestCredentials(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, libraryId, sessionId string, count int) []*Credential { t.Helper() assert, require := assert.New(t), require.New(t) rw := db.New(conn) @@ -189,7 +188,7 @@ func TestCredentials(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, libr return credentials } -func createTestToken(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, scopeId, storeId, token, accessor string) *Token { +func createTestToken(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, scopeId, storeId, token, accessor string) *Token { t.Helper() w := db.New(conn) ctx := context.Background() @@ -211,7 +210,7 @@ func createTestToken(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, scop return inToken } -func testTokens(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, scopeId, storeId string, count int) []*Token { +func testTokens(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, scopeId, storeId string, count int) []*Token { t.Helper() assert, require := assert.New(t), require.New(t) w := db.New(conn) @@ -871,7 +870,7 @@ func (d *TestDatabase) ValidateCredential(t *testing.T, s *vault.Secret) error { require := require.New(t) require.NotNil(s) dburl := d.URL.Encode(t, s) - db, err := sql.Open("postgres", dburl) + db, err := common.SqlOpen("postgres", dburl) if err != nil { return err } diff --git a/internal/db/assert/asserts_test.go b/internal/db/assert/asserts_test.go index fff28927f..e19c2ca0a 100644 --- a/internal/db/assert/asserts_test.go +++ b/internal/db/assert/asserts_test.go @@ -1,6 +1,7 @@ package dbassert import ( + "context" "testing" "github.com/hashicorp/boundary/internal/db" @@ -10,7 +11,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gorm.io/gorm" ) func Test_FieldDomain(t *testing.T) { @@ -59,11 +59,12 @@ func Test_FieldNullable(t *testing.T) { func Test_FieldIsNull(t *testing.T) { t.Parallel() + ctx := context.Background() assert := assert.New(t) conn, _ := db.TestSetup(t, "postgres") initStore(t, conn) require := require.New(t) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) assert.NoError(err) mockery := new(dbassert.MockTesting) @@ -82,10 +83,11 @@ func Test_FieldIsNull(t *testing.T) { func Test_FieldNotNull(t *testing.T) { t.Parallel() + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") initStore(t, conn) require := require.New(t) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) mockery := new(dbassert.MockTesting) dbassert := New(mockery, underlyingDB) @@ -113,7 +115,7 @@ type testModel struct { func (*testModel) TableName() string { return "test_table_dbasserts" } // CreateTestModel is a helper that creates a testModel in the DB. -func createTestModel(t dbassert.TestingT, db *gorm.DB, nullable *string, typeInt *int) *testModel { +func createTestModel(t dbassert.TestingT, db *db.DB, nullable *string, typeInt *int) *testModel { publicId, err := base62.Random(12) assert.NoError(t, err) m := testModel{ @@ -126,7 +128,7 @@ func createTestModel(t dbassert.TestingT, db *gorm.DB, nullable *string, typeInt return &m } -func initStore(t *testing.T, db *gorm.DB) { +func initStore(t *testing.T, db *db.DB) { t.Helper() const ( createDomainType = ` diff --git a/internal/db/common/db.go b/internal/db/common/db.go new file mode 100644 index 000000000..0a166f632 --- /dev/null +++ b/internal/db/common/db.go @@ -0,0 +1,15 @@ +package common + +import ( + "database/sql" + + _ "github.com/jackc/pgx/v4" +) + +func SqlOpen(driverName, dataSourceName string) (*sql.DB, error) { + switch driverName { + case "postgres", "pgx": + driverName = "pgx" + } + return sql.Open(driverName, dataSourceName) +} diff --git a/internal/db/db.go b/internal/db/db.go index 6331a08dd..2f5ff3d6d 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -2,14 +2,18 @@ package db import ( "context" + "database/sql" stderrors "errors" "fmt" + "github.com/hashicorp/boundary/internal/errors" "github.com/hashicorp/boundary/internal/observability/event" "github.com/hashicorp/go-hclog" "github.com/jackc/pgconn" + _ "github.com/jackc/pgx/v4" "gorm.io/driver/postgres" "gorm.io/gorm" + "gorm.io/gorm/logger" ) type DbType int @@ -34,9 +38,44 @@ func StringToDbType(dialect string) (DbType, error) { } } -// Open a database connection which is long-lived. -// You need to call Close() on the returned gorm.DB -func Open(dbType DbType, connectionUrl string) (*gorm.DB, error) { +// DB is a wrapper around the ORM +type DB struct { + *gorm.DB +} + +// SqlDB returns the underlying sql.DB +// +// Note: This func is not named DB(), because our choice of ORM (gorm) which is +// embedded for various reasons, already exports a DB() func and it's base type +// is also an export DB type +func (d *DB) SqlDB(ctx context.Context) (*sql.DB, error) { + const op = "db.(DB).SqlDB" + if d.DB == nil { + return nil, errors.New(ctx, errors.Internal, op, "missing underlying database") + } + return d.DB.DB() +} + +// Close the underlying sql.DB +func (d *DB) Close(ctx context.Context) error { + const op = "db.(DB).Close" + if d.DB == nil { + return errors.New(ctx, errors.Internal, op, "missing underlying database") + } + underlying, err := d.DB.DB() + if err != nil { + return errors.Wrap(ctx, err, op) + } + return underlying.Close() +} + +// Open a database connection which is long-lived. The options of +// WithGormFormatter and WithMaxOpenConnections are supported. +// +// Note: Consider if you need to call Close() on the returned DB. Typically the +// answer is no, but there are occasions when it's necessary. See the sql.DB +// docs for more information. +func Open(dbType DbType, connectionUrl string, opt ...Option) (*DB, error) { var dialect gorm.Dialector switch dbType { case Postgres: @@ -52,7 +91,28 @@ func Open(dbType DbType, connectionUrl string) (*gorm.DB, error) { if err != nil { return nil, fmt.Errorf("unable to open database: %w", err) } - return db, nil + opts := GetOpts(opt...) + if opts.withGormFormatter != nil { + newLogger := logger.New( + getGormLogger(opts.withGormFormatter), + logger.Config{ + LogLevel: logger.Error, // Log level + Colorful: false, // Disable color + }, + ) + db = db.Session(&gorm.Session{Logger: newLogger}) + } + if opts.withMaxOpenConnections > 0 { + if dialect.Name() == "postgres" && opts.withMaxOpenConnections == 1 { + return nil, fmt.Errorf("unable to create db object with dialect %s: %s", dialect, "max_open_connections must be unlimited by setting 0 or at least 2") + } + underlyingDB, err := db.DB() + if err != nil { + return nil, fmt.Errorf("unable retreive db: %w", err) + } + underlyingDB.SetMaxOpenConns(opts.withMaxOpenConnections) + } + return &DB{db}, nil } func GetGormLogFormatter(log hclog.Logger) func(values ...interface{}) (messages []interface{}) { @@ -85,6 +145,6 @@ func (g gormLogger) Printf(msg string, values ...interface{}) { } } -func GetGormLogger(log hclog.Logger) gormLogger { +func getGormLogger(log hclog.Logger) gormLogger { return gormLogger{logger: log} } diff --git a/internal/db/db_test.go b/internal/db/db_test.go index 915da9e26..d0730c790 100644 --- a/internal/db/db_test.go +++ b/internal/db/db_test.go @@ -1,6 +1,7 @@ package db import ( + "context" "testing" "github.com/hashicorp/boundary/testing/dbtest" @@ -8,6 +9,7 @@ import ( ) func TestOpen(t *testing.T) { + ctx := context.Background() cleanup, url, _, err := dbtest.StartUsingTemplate(dbtest.Postgres) if err != nil { t.Fatal(err) @@ -48,7 +50,7 @@ func TestOpen(t *testing.T) { got, err := Open(tt.args.dbType, tt.args.connectionUrl) defer func() { if err == nil { - sqlDB, err := got.DB() + sqlDB, err := got.SqlDB(ctx) require.NoError(t, err) err = sqlDB.Close() require.NoError(t, err) diff --git a/internal/db/domains_test.go b/internal/db/domains_test.go index bd99618da..bf6adc467 100644 --- a/internal/db/domains_test.go +++ b/internal/db/domains_test.go @@ -1,6 +1,7 @@ package db import ( + "context" "strings" "testing" "time" @@ -25,8 +26,10 @@ returning id; ` ) + ctx := context.Background() + conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) for _, typ := range []string{"public", "private", "role", "scope"} { @@ -107,9 +110,9 @@ insert into test_table values ($1); ` ) - + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { @@ -179,9 +182,9 @@ insert into test_table values ($1); ` ) - + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { @@ -256,8 +259,9 @@ returning id; ` ) + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { t.Fatalf("query: \n%s\n error: %s", createTable, err) @@ -322,9 +326,9 @@ update test_update_time_column set update_time = null; ` ) - + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) _, err = db.Exec(createTable) assert.NoError(err) @@ -396,8 +400,8 @@ returning public_id; ) conn, _ := TestSetup(t, "postgres") assert, require := assert.New(t), require.New(t) - - db, err := conn.DB() + ctx := context.Background() + db, err := conn.SqlDB(ctx) require.NoError(err) _, err = db.Exec(createTable) @@ -457,8 +461,8 @@ returning private_id; ) conn, _ := TestSetup(t, "postgres") assert, require := assert.New(t), require.New(t) - - db, err := conn.DB() + ctx := context.Background() + db, err := conn.SqlDB(ctx) require.NoError(err) _, err = db.Exec(createTable) @@ -491,8 +495,9 @@ returning private_id; } func TestDomain_DefaultUsersExist(t *testing.T) { + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) for _, val := range []string{"u_anon", "u_auth"} { rows, err := db.Query(`select from iam_user where public_id = $1`, val) @@ -579,9 +584,9 @@ set id = null; Name string Updatable string } - + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) _, err = db.Exec(createTable) assert.NoError(t, err) @@ -693,9 +698,9 @@ values ($1) returning id; ` ) - + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { @@ -741,9 +746,9 @@ values ($1) returning id; ` ) - + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { @@ -788,9 +793,9 @@ values ($1) returning id; ` ) - + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { @@ -835,9 +840,9 @@ values ($1) returning id; ` ) - + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { @@ -882,9 +887,9 @@ values ($1) returning id; ` ) - + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { @@ -929,9 +934,9 @@ values ($1) returning id; ` ) - + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) if _, err := db.Exec(createTable); err != nil { @@ -980,9 +985,9 @@ func TestDomain_wt_is_sentinel(t *testing.T) { select wt_is_sentinel($1); ` ) - + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) tests := []struct { @@ -1043,9 +1048,9 @@ insert on test_not_null_columns ` dropTriggers = `drop trigger test_insert_not_null_columns on test_not_null_columns` ) - + ctx := context.Background() conn, _ := TestSetup(t, "postgres") - db, err := conn.DB() + db, err := conn.SqlDB(ctx) assert.NoError(t, err) _, err = db.Exec(createTable) diff --git a/internal/db/option.go b/internal/db/option.go index 1547bab9a..32b50dcc4 100644 --- a/internal/db/option.go +++ b/internal/db/option.go @@ -2,6 +2,7 @@ package db import ( "github.com/hashicorp/boundary/internal/oplog" + "github.com/hashicorp/go-hclog" wrapping "github.com/hashicorp/go-kms-wrapping" ) @@ -43,6 +44,9 @@ type Options struct { // withPrngValues is used to switch the ID generation to a pseudo-random mode withPrngValues []string + + withGormFormatter hclog.Logger + withMaxOpenConnections int } type oplogOpts struct { @@ -165,3 +169,19 @@ func WithPrngValues(withPrngValues []string) Option { o.withPrngValues = withPrngValues } } + +// WithGormFormatter specifies an optional hclog to use for gorm's log +// formmater +func WithGormFormatter(l hclog.Logger) Option { + return func(o *Options) { + o.withGormFormatter = l + } +} + +// WithMaxOpenConnections specifices and optional max open connections for the +// database +func WithMaxOpenConnections(max int) Option { + return func(o *Options) { + o.withMaxOpenConnections = max + } +} diff --git a/internal/db/option_test.go b/internal/db/option_test.go index 8a1abda47..963b9d008 100644 --- a/internal/db/option_test.go +++ b/internal/db/option_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/hashicorp/boundary/internal/oplog" + "github.com/hashicorp/go-hclog" "github.com/stretchr/testify/assert" ) @@ -175,4 +176,30 @@ func Test_getOpts(t *testing.T) { testOpts.withOrder = "version desc" assert.Equal(opts, testOpts) }) + t.Run("WithGormFormatter", func(t *testing.T) { + assert := assert.New(t) + // test default of false + opts := GetOpts() + testOpts := getDefaultOptions() + assert.Equal(opts, testOpts) + + testLogger := hclog.New(&hclog.LoggerOptions{}) + + // try setting to false + opts = GetOpts(WithGormFormatter(testLogger)) + testOpts.withGormFormatter = testLogger + assert.Equal(opts, testOpts) + }) + t.Run("WithMaxOpenConnections", func(t *testing.T) { + assert := assert.New(t) + // test default of false + opts := GetOpts() + testOpts := getDefaultOptions() + assert.Equal(opts, testOpts) + + // try setting to false + opts = GetOpts(WithMaxOpenConnections(22)) + testOpts.withMaxOpenConnections = 22 + assert.Equal(opts, testOpts) + }) } diff --git a/internal/db/read_writer.go b/internal/db/read_writer.go index f6946017b..119bb8f42 100644 --- a/internal/db/read_writer.go +++ b/internal/db/read_writer.go @@ -190,7 +190,7 @@ type VetForWriter interface { // Db uses a gorm DB connection for read/write type Db struct { - underlying *gorm.DB + underlying *DB } // ensure that Db implements the interfaces of: Reader and Writer @@ -199,7 +199,7 @@ var ( _ Writer = (*Db)(nil) ) -func New(underlying *gorm.DB) *Db { +func New(underlying *DB) *Db { return &Db{underlying: underlying} } @@ -597,7 +597,7 @@ func (rw *Db) Delete(ctx context.Context, i interface{}, opt ...Option) (int, er return NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } } - db := rw.underlying + db := rw.underlying.DB if opts.withWhereClause != "" { db = db.Where(opts.withWhereClause, opts.withWhereClauseArgs...) } @@ -713,7 +713,7 @@ func (rw *Db) getTicketFor(aggregateName string) (*store.Ticket, error) { if rw.underlying == nil { return nil, errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("%s: underlying db missing", aggregateName), errors.WithoutEvent()) } - ticketer, err := oplog.NewGormTicketer(rw.underlying, oplog.WithAggregateNames(true)) + ticketer, err := oplog.NewGormTicketer(rw.underlying.DB, oplog.WithAggregateNames(true)) if err != nil { return nil, errors.WrapDeprecated(err, op, errors.WithMsg(fmt.Sprintf("%s: unable to get Ticketer", aggregateName)), errors.WithoutEvent()) } @@ -793,7 +793,7 @@ func (rw *Db) addOplogForItems(ctx context.Context, opType OpType, opts Options, if err != nil { return errors.Wrap(ctx, err, op, errors.WithMsg("oplog validation failed"), errors.WithoutEvent()) } - ticketer, err := oplog.NewGormTicketer(rw.underlying, oplog.WithAggregateNames(true)) + ticketer, err := oplog.NewGormTicketer(rw.underlying.DB, oplog.WithAggregateNames(true)) if err != nil { return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get Ticketer"), errors.WithoutEvent()) } @@ -808,7 +808,7 @@ func (rw *Db) addOplogForItems(ctx context.Context, opType OpType, opts Options, } if err := entry.WriteEntryWith( ctx, - &oplog.GormWriter{Tx: rw.underlying}, + &oplog.GormWriter{Tx: rw.underlying.DB}, ticket, oplogMsgs..., ); err != nil { @@ -827,7 +827,7 @@ func (rw *Db) addOplog(ctx context.Context, opType OpType, opts Options, ticket if ticket == nil { return errors.New(ctx, errors.InvalidParameter, op, "missing ticket", errors.WithoutEvent()) } - ticketer, err := oplog.NewGormTicketer(rw.underlying, oplog.WithAggregateNames(true)) + ticketer, err := oplog.NewGormTicketer(rw.underlying.DB, oplog.WithAggregateNames(true)) if err != nil { return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get Ticketer"), errors.WithoutEvent()) } @@ -846,7 +846,7 @@ func (rw *Db) addOplog(ctx context.Context, opType OpType, opts Options, ticket } err = entry.WriteEntryWith( ctx, - &oplog.GormWriter{Tx: rw.underlying}, + &oplog.GormWriter{Tx: rw.underlying.DB}, ticket, msg, ) @@ -876,7 +876,7 @@ func (rw *Db) WriteOplogEntryWith(ctx context.Context, wrapper wrapping.Wrapper, return errors.New(ctx, errors.InvalidParameter, op, "missing metadata") } - ticketer, err := oplog.NewGormTicketer(rw.underlying, oplog.WithAggregateNames(true)) + ticketer, err := oplog.NewGormTicketer(rw.underlying.DB, oplog.WithAggregateNames(true)) if err != nil { return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get Ticketer")) } @@ -892,7 +892,7 @@ func (rw *Db) WriteOplogEntryWith(ctx context.Context, wrapper wrapping.Wrapper, } err = entry.WriteEntryWith( ctx, - &oplog.GormWriter{Tx: rw.underlying}, + &oplog.GormWriter{Tx: rw.underlying.DB}, ticket, msgs..., ) @@ -947,7 +947,7 @@ func (w *Db) DoTx(ctx context.Context, retries uint, backOff Backoff, Handler Tx newTx := w.underlying.WithContext(ctx) newTx = newTx.Begin() - rw := &Db{newTx} + rw := &Db{underlying: &DB{newTx}} if err := Handler(rw, rw); err != nil { if err := newTx.Rollback().Error; err != nil { return info, errors.Wrap(ctx, err, op, errors.WithoutEvent()) diff --git a/internal/db/read_writer_test.go b/internal/db/read_writer_test.go index 9efedb326..14404793c 100644 --- a/internal/db/read_writer_test.go +++ b/internal/db/read_writer_test.go @@ -22,7 +22,6 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" - "gorm.io/gorm" ) func TestDb_UpdateUnsetField(t *testing.T) { @@ -1270,7 +1269,7 @@ func TestDb_Delete(t *testing.T) { } tests := []struct { name string - underlying *gorm.DB + underlying *DB wrapper wrapping.Wrapper args args want int @@ -1540,7 +1539,7 @@ func TestDb_CreateItems(t *testing.T) { } tests := []struct { name string - underlying *gorm.DB + underlying *DB args args wantOplogId string wantOplogMsgs bool @@ -1741,7 +1740,7 @@ func TestDb_DeleteItems(t *testing.T) { } tests := []struct { name string - underlying *gorm.DB + underlying *DB args args wantRowsDeleted int wantOplogId string @@ -1914,7 +1913,7 @@ func TestDb_DeleteItems(t *testing.T) { } } -func testUser(t *testing.T, conn *gorm.DB, name, email, phoneNumber string) *db_test.TestUser { +func testUser(t *testing.T, conn *DB, name, email, phoneNumber string) *db_test.TestUser { t.Helper() require := require.New(t) @@ -1935,7 +1934,7 @@ func testUser(t *testing.T, conn *gorm.DB, name, email, phoneNumber string) *db_ return u } -func testCar(t *testing.T, conn *gorm.DB, name, model string, mpg int32) *db_test.TestCar { +func testCar(t *testing.T, conn *DB, name, model string, mpg int32) *db_test.TestCar { t.Helper() require := require.New(t) @@ -1964,7 +1963,7 @@ func testId(t *testing.T) string { return id } -func testScooter(t *testing.T, conn *gorm.DB, model string, mpg int32) *db_test.TestScooter { +func testScooter(t *testing.T, conn *DB, model string, mpg int32) *db_test.TestScooter { t.Helper() require := require.New(t) @@ -1995,7 +1994,7 @@ func TestDb_LookupById(t *testing.T) { } tests := []struct { name string - underlying *gorm.DB + underlying *DB args args wantErr bool want proto.Message @@ -2095,7 +2094,7 @@ func TestDb_GetTicket(t *testing.T) { type notReplayable struct{} tests := []struct { name string - underlying *gorm.DB + underlying *DB aggregateType interface{} wantErr bool wantErrIs errors.Code @@ -2181,7 +2180,7 @@ func TestDb_WriteOplogEntryWith(t *testing.T) { } tests := []struct { name string - underlying *gorm.DB + underlying *DB args args wantErr bool wantErrIs errors.Code @@ -2889,7 +2888,7 @@ func TestDb_lookupAfterWrite(t *testing.T) { } tests := []struct { name string - underlying *gorm.DB + underlying *DB args args wantErr bool want proto.Message diff --git a/internal/db/schema/manager_test.go b/internal/db/schema/manager_test.go index 84b522d56..ea58b0fb1 100644 --- a/internal/db/schema/manager_test.go +++ b/internal/db/schema/manager_test.go @@ -7,6 +7,7 @@ import ( "strings" "testing" + "github.com/hashicorp/boundary/internal/db/common" "github.com/hashicorp/boundary/internal/db/schema/postgres" "github.com/hashicorp/boundary/internal/errors" "github.com/hashicorp/boundary/testing/dbtest" @@ -22,7 +23,7 @@ func TestNewManager(t *testing.T) { t.Cleanup(func() { require.NoError(t, c()) }) - d, err := sql.Open(dialect, u) + d, err := common.SqlOpen(dialect, u) require.NoError(t, err) ctx := context.Background() @@ -47,7 +48,7 @@ func TestCurrentState(t *testing.T) { }) require.NoError(t, err) ctx := context.Background() - d, err := sql.Open(dialect, u) + d, err := common.SqlOpen(dialect, u) require.NoError(t, err) m, err := NewManager(ctx, dialect, d) @@ -83,7 +84,7 @@ func TestRollForward(t *testing.T) { t.Cleanup(func() { require.NoError(t, c()) }) - d, err := sql.Open(dialect, u) + d, err := common.SqlOpen(dialect, u) require.NoError(t, err) ctx := context.Background() @@ -112,7 +113,7 @@ func TestRollForward_NotFromFresh(t *testing.T) { t.Cleanup(func() { require.NoError(t, c()) }) - d, err := sql.Open(dialect, u) + d, err := common.SqlOpen(dialect, u) require.NoError(t, err) // Initialize the DB with only a portion of the current sql scripts. @@ -146,7 +147,7 @@ func TestRunMigration_canceledContext(t *testing.T) { t.Cleanup(func() { require.NoError(t, c()) }) - d, err := sql.Open(dialect, u) + d, err := common.SqlOpen(dialect, u) require.NoError(t, err) ctx := context.Background() @@ -174,7 +175,7 @@ func TestRollForward_BadSQL(t *testing.T) { t.Cleanup(func() { require.NoError(t, c()) }) - d, err := sql.Open(dialect, u) + d, err := common.SqlOpen(dialect, u) require.NoError(t, err) // Initialize the DB with only a portion of the current sql scripts. @@ -198,12 +199,12 @@ func TestManager_ExclusiveLock(t *testing.T) { t.Cleanup(func() { require.NoError(t, c()) }) - d1, err := sql.Open(dialect, u) + d1, err := common.SqlOpen(dialect, u) require.NoError(t, err) m1, err := NewManager(ctx, dialect, d1) require.NoError(t, err) - d2, err := sql.Open(dialect, u) + d2, err := common.SqlOpen(dialect, u) require.NoError(t, err) m2, err := NewManager(ctx, dialect, d2) require.NoError(t, err) @@ -223,12 +224,12 @@ func TestManager_SharedLock(t *testing.T) { t.Cleanup(func() { require.NoError(t, c()) }) - d1, err := sql.Open("postgres", u) + d1, err := common.SqlOpen("postgres", u) require.NoError(t, err) m1, err := NewManager(ctx, "postgres", d1) require.NoError(t, err) - d2, err := sql.Open("postgres", u) + d2, err := common.SqlOpen("postgres", u) require.NoError(t, err) m2, err := NewManager(ctx, "postgres", d2) require.NoError(t, err) @@ -252,7 +253,7 @@ func Test_GetMigrationLog(t *testing.T) { t.Cleanup(func() { require.NoError(t, c()) }) - d, err := sql.Open("postgres", u) + d, err := common.SqlOpen("postgres", u) require.NoError(t, err) m, err := NewManager(ctx, "postgres", d) require.NoError(t, err) diff --git a/internal/db/schema/migrations/postgres/11/01_server_type_enum_test.go b/internal/db/schema/migrations/postgres/11/01_server_type_enum_test.go index 6d8779519..4f3c675b2 100644 --- a/internal/db/schema/migrations/postgres/11/01_server_type_enum_test.go +++ b/internal/db/schema/migrations/postgres/11/01_server_type_enum_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + "github.com/hashicorp/boundary/internal/db/common" "github.com/hashicorp/boundary/internal/db/schema" "github.com/hashicorp/boundary/testing/dbtest" "github.com/stretchr/testify/require" @@ -14,8 +15,8 @@ import ( const ( insertServerQuery = "insert into server (private_id, type, address) values ($1, $2, $3)" selectServerQuery = "select * from server where private_id = $1" - expectEnumConstraintErr = `pq: new row for relation "server_type_enm" violates check constraint "only_predefined_server_types_allowed"` - expectServerConstraintErr = `pq: insert or update on table "server" violates foreign key constraint "server_type_enm_fkey"` + expectEnumConstraintErr = `ERROR: new row for relation "server_type_enm" violates check constraint "only_predefined_server_types_allowed" (SQLSTATE 23514)` + expectServerConstraintErr = `ERROR: insert or update on table "server" violates foreign key constraint "server_type_enm_fkey" (SQLSTATE 23503)` ) type testServer struct { @@ -48,7 +49,7 @@ func Test_ServerEnumChanges(t *testing.T) { t.Cleanup(func() { require.NoError(c()) }) - d, err := sql.Open(dialect, u) + d, err := common.SqlOpen(dialect, u) require.NoError(err) // migration to the prior migration (before the one we want to test) diff --git a/internal/db/schema/migrations/postgres/12/01_timestamp_sub_funcs_test.go b/internal/db/schema/migrations/postgres/12/01_timestamp_sub_funcs_test.go index eb9fac8d7..7519b73ab 100644 --- a/internal/db/schema/migrations/postgres/12/01_timestamp_sub_funcs_test.go +++ b/internal/db/schema/migrations/postgres/12/01_timestamp_sub_funcs_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + "github.com/hashicorp/boundary/internal/db/common" "github.com/hashicorp/boundary/internal/db/schema" "github.com/hashicorp/boundary/testing/dbtest" "github.com/stretchr/testify/require" @@ -41,7 +42,7 @@ func testSetupDb(ctx context.Context, t *testing.T) *sql.DB { t.Cleanup(func() { require.NoError(c()) }) - d, err := sql.Open(dialect, u) + d, err := common.SqlOpen(dialect, u) require.NoError(err) oState := schema.TestCloneMigrationStates(t) diff --git a/internal/db/schema/migrations/postgres/14/warehouse_user_dim_test.go b/internal/db/schema/migrations/postgres/14/warehouse_user_dim_test.go index 9b82f9eb8..749190bbe 100644 --- a/internal/db/schema/migrations/postgres/14/warehouse_user_dim_test.go +++ b/internal/db/schema/migrations/postgres/14/warehouse_user_dim_test.go @@ -2,12 +2,12 @@ package migration import ( "context" - "database/sql" "testing" "github.com/hashicorp/boundary/internal/auth/oidc" "github.com/hashicorp/boundary/internal/authtoken" "github.com/hashicorp/boundary/internal/db" + "github.com/hashicorp/boundary/internal/db/common" "github.com/hashicorp/boundary/internal/db/schema" "github.com/hashicorp/boundary/internal/host/static" "github.com/hashicorp/boundary/internal/iam" @@ -18,7 +18,6 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gorm.io/gorm" ) func TestMigrations_UserDimension(t *testing.T) { @@ -37,7 +36,7 @@ func TestMigrations_UserDimension(t *testing.T) { t.Cleanup(func() { require.NoError(c()) }) - d, err := sql.Open(dialect, u) + d, err := common.SqlOpen(dialect, u) require.NoError(err) // migration to the prior migration (before the one we want to test) @@ -139,7 +138,7 @@ func TestMigrations_UserDimension(t *testing.T) { assert.False(state.Dirty) } -func testOidcAuthToken(t *testing.T, conn *gorm.DB, kms *kms.Kms, wrapper wrapping.Wrapper, scopeId string) *authtoken.AuthToken { +func testOidcAuthToken(t *testing.T, conn *db.DB, kms *kms.Kms, wrapper wrapping.Wrapper, scopeId string) *authtoken.AuthToken { t.Helper() authMethod := oidc.TestAuthMethod( diff --git a/internal/db/schema/migrations/postgres/16/warehouse_credential_dim_test.go b/internal/db/schema/migrations/postgres/16/warehouse_credential_dim_test.go index cb51f4856..2f82503f0 100644 --- a/internal/db/schema/migrations/postgres/16/warehouse_credential_dim_test.go +++ b/internal/db/schema/migrations/postgres/16/warehouse_credential_dim_test.go @@ -20,7 +20,6 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gorm.io/gorm" ) func TestMigrations_CredentialDimension(t *testing.T) { @@ -144,7 +143,7 @@ func TestMigrations_CredentialDimension(t *testing.T) { assert.False(state.Dirty) } -func testOidcAuthToken(t *testing.T, conn *gorm.DB, kms *kms.Kms, wrapper wrapping.Wrapper, scopeId string) *authtoken.AuthToken { +func testOidcAuthToken(t *testing.T, conn *db.DB, kms *kms.Kms, wrapper wrapping.Wrapper, scopeId string) *authtoken.AuthToken { t.Helper() authMethod := oidc.TestAuthMethod( @@ -171,7 +170,7 @@ func testOidcAuthToken(t *testing.T, conn *gorm.DB, kms *kms.Kms, wrapper wrappi return at } -func testSessionCredentialParams(t *testing.T, conn *gorm.DB, kms *kms.Kms, wrapper wrapping.Wrapper, tar *target.TcpTarget) []*session.DynamicCredential { +func testSessionCredentialParams(t *testing.T, conn *db.DB, kms *kms.Kms, wrapper wrapping.Wrapper, tar *target.TcpTarget) []*session.DynamicCredential { t.Helper() rw := db.New(conn) diff --git a/internal/db/schema/migrations/postgres/2/07_iam_test.go b/internal/db/schema/migrations/postgres/2/07_iam_test.go index c52be8e2a..04e76927b 100644 --- a/internal/db/schema/migrations/postgres/2/07_iam_test.go +++ b/internal/db/schema/migrations/postgres/2/07_iam_test.go @@ -2,11 +2,11 @@ package migration import ( "context" - "database/sql" "testing" "github.com/hashicorp/boundary/internal/auth/password" "github.com/hashicorp/boundary/internal/db" + "github.com/hashicorp/boundary/internal/db/common" "github.com/hashicorp/boundary/internal/db/schema" "github.com/hashicorp/boundary/internal/iam" "github.com/hashicorp/boundary/testing/dbtest" @@ -38,7 +38,7 @@ func Test_PrimaryAuthMethodChanges(t *testing.T) { t.Cleanup(func() { require.NoError(c()) }) - d, err := sql.Open(dialect, u) + d, err := common.SqlOpen(dialect, u) require.NoError(err) // migration to the prior migration (before the one we want to test) diff --git a/internal/db/schema/migrations/postgres/8/08_connection_test.go b/internal/db/schema/migrations/postgres/8/08_connection_test.go index 0556c8de5..9de3eb8d3 100644 --- a/internal/db/schema/migrations/postgres/8/08_connection_test.go +++ b/internal/db/schema/migrations/postgres/8/08_connection_test.go @@ -1,6 +1,7 @@ package migration import ( + "context" "database/sql" "testing" @@ -37,9 +38,9 @@ func TestMigration(t *testing.T) { ` selectQuery = `select session_id, server_id from session_connection_testing order by session_id` ) - + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres", db.WithTemplate("template1")) - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(err) _, err = db.Exec(createTables) require.NoError(err) diff --git a/internal/db/schema/postgres/postgres.go b/internal/db/schema/postgres/postgres.go index 1c30af45e..8a038abca 100644 --- a/internal/db/schema/postgres/postgres.go +++ b/internal/db/schema/postgres/postgres.go @@ -34,12 +34,11 @@ import ( "fmt" "io" "io/ioutil" - "strconv" "strings" "github.com/hashicorp/boundary/internal/errors" "github.com/hashicorp/go-multierror" - "github.com/lib/pq" + "github.com/jackc/pgconn" ) // schemaAccessLockId is a Lock key used to ensure a single boundary binary is operating @@ -232,14 +231,12 @@ func (p *Postgres) Run(ctx context.Context, migration io.Reader, version int) er if rollbackErr := rollback(); rollbackErr != nil { err = multierror.Append(err, rollbackErr) } - if pgErr, ok := err.(*pq.Error); ok { + if pgErr, ok := err.(*pgconn.PgError); ok { var line uint var col uint var lineColOK bool - if pgErr.Position != "" { - if pos, err := strconv.ParseUint(pgErr.Position, 10, 64); err == nil { - line, col, lineColOK = computeLineFromPos(query, int(pos)) - } + if pgErr.Position != 0 { + line, col, lineColOK = computeLineFromPos(query, int(pgErr.Position)) } message := "migration failed" if lineColOK { @@ -308,8 +305,7 @@ func (p *Postgres) setVersion(ctx context.Context, version int, dirty bool) erro defer func() { p.tx = nil }() return tx.Rollback() } - - query := `truncate ` + pq.QuoteIdentifier(defaultMigrationsTable) + query := `truncate ` + quoteIdentifier(defaultMigrationsTable) if _, err := tx.ExecContext(ctx, query); err != nil { if errRollback := rollback(); errRollback != nil { err = multierror.Append(err, errRollback) @@ -321,7 +317,7 @@ func (p *Postgres) setVersion(ctx context.Context, version int, dirty bool) erro // empty schema Version for failed down migration on the first migration // See: https://github.com/golang-migrate/migrate/issues/330 if version >= 0 || (version == nilVersion && dirty) { - query = `insert into ` + pq.QuoteIdentifier(defaultMigrationsTable) + + query = `insert into ` + quoteIdentifier(defaultMigrationsTable) + ` (version, dirty) values ($1, $2)` if _, err := tx.ExecContext(ctx, query, version, dirty); err != nil { if errRollback := rollback(); errRollback != nil { @@ -368,7 +364,7 @@ func (p *Postgres) CurrentState(ctx context.Context) (version int, previouslyRan return nilVersion, previouslyRan, dirty, errors.New(ctx, errors.MigrationIntegrity, op, "both old and new migration tables exist") } - query := `select version, dirty from ` + pq.QuoteIdentifier(tableName) + query := `select version, dirty from ` + quoteIdentifier(tableName) results, err := p.conn.QueryContext(ctx, query) if err != nil { return nilVersion, previouslyRan, dirty, errors.Wrap(ctx, err, op) @@ -420,7 +416,7 @@ func (p *Postgres) drop(ctx context.Context) (err error) { if len(tableNames) > 0 { // delete one by one ... for _, t := range tableNames { - query = `drop table if exists ` + pq.QuoteIdentifier(t) + ` cascade` + query = `drop table if exists ` + quoteIdentifier(t) + ` cascade` if _, err := p.conn.ExecContext(ctx, query); err != nil { return errors.Wrap(ctx, err, op) } @@ -464,7 +460,7 @@ func (p *Postgres) EnsureVersionTable(ctx context.Context) (err error) { return errors.Wrap(ctx, err, op) } - createStmt := `create table if not exists ` + pq.QuoteIdentifier(defaultMigrationsTable) + ` (version bigint primary key, dirty boolean not null)` + createStmt := `create table if not exists ` + quoteIdentifier(defaultMigrationsTable) + ` (version bigint primary key, dirty boolean not null)` if _, err = extr.ExecContext(ctx, createStmt); err != nil { if wpErr := rollback(); wpErr != nil { err = multierror.Append(err, wpErr) @@ -474,3 +470,8 @@ func (p *Postgres) EnsureVersionTable(ctx context.Context) (err error) { return nil } + +func quoteIdentifier(input string) (output string) { + output = `"` + strings.Replace(input, `"`, `""`, -1) + `"` + return +} diff --git a/internal/db/schema/postgres/postgres_test.go b/internal/db/schema/postgres/postgres_test.go index 2b16c7317..185e9f3f9 100644 --- a/internal/db/schema/postgres/postgres_test.go +++ b/internal/db/schema/postgres/postgres_test.go @@ -28,7 +28,7 @@ package postgres -// error codes https://github.com/lib/pq/blob/master/error.go +// errors: https://pkg.go.dev/github.com/jackc/pgconn#PgError import ( "bytes" diff --git a/internal/db/schema/postgres/testing.go b/internal/db/schema/postgres/testing.go index 42d978d24..854495a36 100644 --- a/internal/db/schema/postgres/testing.go +++ b/internal/db/schema/postgres/testing.go @@ -31,11 +31,11 @@ package postgres import ( "bytes" "context" - "database/sql" "testing" "time" "github.com/golang-migrate/migrate/v4/database" + "github.com/hashicorp/boundary/internal/db/common" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -123,7 +123,7 @@ func testSetVersion(t *testing.T, d *Postgres) { func open(t *testing.T, ctx context.Context, u string) (*Postgres, error) { t.Helper() - db, err := sql.Open("postgres", u) + db, err := common.SqlOpen("postgres", u) require.NoError(t, err) px, err := New(ctx, db) diff --git a/internal/db/schema/schema.go b/internal/db/schema/schema.go index f300c7308..c33bd505d 100644 --- a/internal/db/schema/schema.go +++ b/internal/db/schema/schema.go @@ -2,8 +2,8 @@ package schema import ( "context" - "database/sql" + "github.com/hashicorp/boundary/internal/db/common" "github.com/hashicorp/boundary/internal/errors" ) @@ -13,7 +13,7 @@ import ( func MigrateStore(ctx context.Context, dialect string, url string, opt ...Option) (bool, error) { const op = "schema.MigrateStore" - d, err := sql.Open(dialect, url) + d, err := common.SqlOpen(dialect, url) if err != nil { return false, errors.Wrap(ctx, err, op) } diff --git a/internal/db/schema/schema_test.go b/internal/db/schema/schema_test.go index 634e881ef..ad2d354c9 100644 --- a/internal/db/schema/schema_test.go +++ b/internal/db/schema/schema_test.go @@ -2,9 +2,9 @@ package schema import ( "context" - "database/sql" "testing" + "github.com/hashicorp/boundary/internal/db/common" "github.com/hashicorp/boundary/testing/dbtest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -53,7 +53,7 @@ func Test_MigrateStore_WithMigrationStates(t *testing.T) { t.Cleanup(func() { require.NoError(c()) }) - d, err := sql.Open(dialect, u) + d, err := common.SqlOpen(dialect, u) require.NoError(err) // migration to the prior migration (before the one we want to test) diff --git a/internal/db/testing.go b/internal/db/testing.go index f95b3694c..c8b76a293 100644 --- a/internal/db/testing.go +++ b/internal/db/testing.go @@ -17,12 +17,11 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-kms-wrapping/wrappers/aead" "github.com/stretchr/testify/assert" - "gorm.io/gorm" "gorm.io/gorm/logger" ) // setup the tests (initialize the database one-time and intialized testDatabaseURL). Do not close the returned db. -func TestSetup(t *testing.T, dialect string, opt ...TestOption) (*gorm.DB, string) { +func TestSetup(t *testing.T, dialect string, opt ...TestOption) (*DB, string) { var cleanup func() error var url string var err error @@ -57,7 +56,7 @@ func TestSetup(t *testing.T, dialect string, opt ...TestOption) (*gorm.DB, strin } db.Logger.LogMode(logger.Error) t.Cleanup(func() { - sqlDB, err := db.DB() + sqlDB, err := db.SqlDB(ctx) assert.NoError(t, err) assert.NoError(t, sqlDB.Close(), "Got error closing gorm db.") }) diff --git a/internal/errors/is_test.go b/internal/errors/is_test.go index f142b7210..beb98c6c8 100644 --- a/internal/errors/is_test.go +++ b/internal/errors/is_test.go @@ -44,7 +44,7 @@ func TestError_IsUnique(t *testing.T) { want: true, }, { - name: "wrapped-pq-is-unique", + name: "wrapped-pg-is-unique", in: errors.E( context.TODO(), errors.WithWrap(&pgconn.PgError{ @@ -107,7 +107,7 @@ func TestError_IsCheckConstraint(t *testing.T) { want: true, }, { - name: "wrapped-pq-is-check-constraint", + name: "wrapped-pg-is-check-constraint", in: errors.E(context.TODO(), errors.WithCode(errors.CheckConstraint), errors.WithWrap(&pgconn.PgError{ Code: "23514", @@ -176,7 +176,7 @@ func TestError_IsNotNullError(t *testing.T) { want: true, }, { - name: "wrapped-pq-is-not-null", + name: "wrapped-pg-is-not-null", in: errors.E(context.TODO(), errors.WithCode(errors.NotNull), errors.WithWrap(&pgconn.PgError{ Code: "23502", diff --git a/internal/host/static/host_catalog_test.go b/internal/host/static/host_catalog_test.go index 292020d2d..0dba8443e 100644 --- a/internal/host/static/host_catalog_test.go +++ b/internal/host/static/host_catalog_test.go @@ -6,7 +6,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gorm.io/gorm" "github.com/hashicorp/boundary/internal/db" "github.com/hashicorp/boundary/internal/host/static/store" @@ -109,7 +108,7 @@ func TestHostCatalog_New(t *testing.T) { } } -func testCatalog(t *testing.T, conn *gorm.DB, scopeId string) *HostCatalog { +func testCatalog(t *testing.T, conn *db.DB, scopeId string) *HostCatalog { t.Helper() cats := TestCatalogs(t, conn, scopeId, 1) return cats[0] diff --git a/internal/host/static/repository_host_catalog_test.go b/internal/host/static/repository_host_catalog_test.go index 4af721d32..3a733193f 100644 --- a/internal/host/static/repository_host_catalog_test.go +++ b/internal/host/static/repository_host_catalog_test.go @@ -179,6 +179,7 @@ func TestRepository_UpdateCatalog(t *testing.T) { conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) + ctx := context.Background() changeName := func(s string) func(*HostCatalog) *HostCatalog { return func(c *HostCatalog) *HostCatalog { @@ -461,7 +462,7 @@ func TestRepository_UpdateCatalog(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.ScopeId, got.ScopeId) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(t, err) dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { diff --git a/internal/host/static/repository_host_set_test.go b/internal/host/static/repository_host_set_test.go index 3e118cbf9..05f3eb43a 100644 --- a/internal/host/static/repository_host_set_test.go +++ b/internal/host/static/repository_host_set_test.go @@ -202,6 +202,7 @@ func TestRepository_CreateSet(t *testing.T) { } func TestRepository_UpdateSet(t *testing.T) { + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -493,7 +494,7 @@ func TestRepository_UpdateSet(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.CatalogId, got.CatalogId) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { diff --git a/internal/host/static/repository_host_test.go b/internal/host/static/repository_host_test.go index 0f699375c..aebf419b7 100644 --- a/internal/host/static/repository_host_test.go +++ b/internal/host/static/repository_host_test.go @@ -251,6 +251,7 @@ func TestRepository_CreateHost(t *testing.T) { } func TestRepository_UpdateHost(t *testing.T) { + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -620,7 +621,7 @@ func TestRepository_UpdateHost(t *testing.T) { assert.Equal(tt.wantCount, gotCount, "row count") assert.NotSame(tt.orig, got) assert.Equal(tt.orig.CatalogId, got.CatalogId) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) if tt.want.Name == "" { diff --git a/internal/host/static/testing.go b/internal/host/static/testing.go index 3d3a94d3a..8dbca5444 100644 --- a/internal/host/static/testing.go +++ b/internal/host/static/testing.go @@ -7,13 +7,12 @@ import ( "github.com/hashicorp/boundary/internal/db" "github.com/stretchr/testify/assert" - "gorm.io/gorm" ) // TestCatalogs creates count number of static host catalogs to the provided DB // with the provided scope id. If any errors are encountered during the creation of // the host catalog, the test will fail. -func TestCatalogs(t *testing.T, conn *gorm.DB, scopeId string, count int) []*HostCatalog { +func TestCatalogs(t *testing.T, conn *db.DB, scopeId string, count int) []*HostCatalog { t.Helper() assert := assert.New(t) var cats []*HostCatalog @@ -37,7 +36,7 @@ func TestCatalogs(t *testing.T, conn *gorm.DB, scopeId string, count int) []*Hos // TestHosts creates count number of static hosts to the provided DB // with the provided catalog id. The catalog must have been created previously. // If any errors are encountered during the creation of the host, the test will fail. -func TestHosts(t *testing.T, conn *gorm.DB, catalogId string, count int) []*Host { +func TestHosts(t *testing.T, conn *db.DB, catalogId string, count int) []*Host { t.Helper() assert := assert.New(t) var hosts []*Host @@ -63,7 +62,7 @@ func TestHosts(t *testing.T, conn *gorm.DB, catalogId string, count int) []*Host // TestSets creates count number of static host sets in the provided DB // with the provided catalog id. The catalog must have been created // previously. The test will fail if any errors are encountered. -func TestSets(t *testing.T, conn *gorm.DB, catalogId string, count int) []*HostSet { +func TestSets(t *testing.T, conn *db.DB, catalogId string, count int) []*HostSet { t.Helper() assert := assert.New(t) var sets []*HostSet @@ -88,7 +87,7 @@ func TestSets(t *testing.T, conn *gorm.DB, catalogId string, count int) []*HostS // TestSetMembers adds hosts to the specified setId in the provided DB. // The set and hosts must have been created previously and belong to the // same catalog. The test will fail if any errors are encountered. -func TestSetMembers(t *testing.T, conn *gorm.DB, setId string, hosts []*Host) []*HostSetMember { +func TestSetMembers(t *testing.T, conn *db.DB, setId string, hosts []*Host) []*HostSetMember { t.Helper() assert := assert.New(t) diff --git a/internal/iam/account_test.go b/internal/iam/account_test.go index c6ac60eac..76cee0902 100644 --- a/internal/iam/account_test.go +++ b/internal/iam/account_test.go @@ -65,6 +65,7 @@ func TestAccount_GetScope(t *testing.T) { func TestAccount_Clone(t *testing.T) { t.Parallel() + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) repo := TestRepo(t, conn, wrapper) @@ -83,7 +84,7 @@ func TestAccount_Clone(t *testing.T) { authMethodPublicId := testAuthMethod(t, conn, org.PublicId) acct := testAccount(t, conn, org.PublicId, authMethodPublicId, u.PublicId) acct2 := testAccount(t, conn, org.PublicId, authMethodPublicId, "") - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(t, err) dbassert := dbassert.New(t, underlyingDB) dbassert.IsNull(acct2, "IamUserId") diff --git a/internal/iam/group_test.go b/internal/iam/group_test.go index be6720d95..d08e9b4c7 100644 --- a/internal/iam/group_test.go +++ b/internal/iam/group_test.go @@ -206,6 +206,7 @@ func Test_GroupCreate(t *testing.T) { func Test_GroupUpdate(t *testing.T) { t.Parallel() + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) repo := TestRepo(t, conn, wrapper) @@ -351,7 +352,7 @@ func Test_GroupUpdate(t *testing.T) { require.NoError(err) assert.True(proto.Equal(updateGrp, foundGrp)) if len(tt.args.nullPaths) != 0 { - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) for _, f := range tt.args.nullPaths { diff --git a/internal/iam/immutable_fields_test.go b/internal/iam/immutable_fields_test.go index cecfb4e38..7bffd66a6 100644 --- a/internal/iam/immutable_fields_test.go +++ b/internal/iam/immutable_fields_test.go @@ -92,10 +92,11 @@ func TestConcreteScope_ImmutableFields(t *testing.T) { update = `update {{rep}} set scope_id = $1 where scope_id = $2;` ) t.Parallel() + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) repo := TestRepo(t, conn, wrapper) - db, err := conn.DB() + db, err := conn.SqlDB(ctx) require.NoError(t, err) org, proj := TestScopes(t, repo) diff --git a/internal/iam/repository_group_test.go b/internal/iam/repository_group_test.go index 4c5d1bb44..5ea3b4b53 100644 --- a/internal/iam/repository_group_test.go +++ b/internal/iam/repository_group_test.go @@ -173,6 +173,7 @@ func TestRepository_CreateGroup(t *testing.T) { func TestRepository_UpdateGroup(t *testing.T) { t.Parallel() + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") a := assert.New(t) rw := db.New(conn) @@ -450,7 +451,7 @@ func TestRepository_UpdateGroup(t *testing.T) { foundGrp, _, err := repo.LookupGroup(context.Background(), u.PublicId) require.NoError(err) assert.True(proto.Equal(groupAfterUpdate, foundGrp)) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) if tt.args.name == "" { diff --git a/internal/iam/repository_role_test.go b/internal/iam/repository_role_test.go index da1ebec39..f1551334c 100644 --- a/internal/iam/repository_role_test.go +++ b/internal/iam/repository_role_test.go @@ -174,6 +174,7 @@ func TestRepository_CreateRole(t *testing.T) { func TestRepository_UpdateRole(t *testing.T) { t.Parallel() + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -447,7 +448,7 @@ func TestRepository_UpdateRole(t *testing.T) { foundRole, _, _, err := repo.LookupRole(context.Background(), r.PublicId) assert.NoError(err) assert.True(proto.Equal(roleAfterUpdate, foundRole)) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) if tt.args.name == "" { diff --git a/internal/iam/repository_user_iam_pkg_test.go b/internal/iam/repository_user_iam_pkg_test.go index f537db9af..690441d2d 100644 --- a/internal/iam/repository_user_iam_pkg_test.go +++ b/internal/iam/repository_user_iam_pkg_test.go @@ -184,6 +184,7 @@ func TestRepository_associateUserWithAccounts(t *testing.T) { func TestRepository_dissociateUserWithAccount(t *testing.T) { t.Parallel() + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -309,7 +310,7 @@ func TestRepository_dissociateUserWithAccount(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) err = dissociateUserFromAccounts(context.Background(), kms, rw, rw, tt.args.Ids.user, tt.args.Ids.accts, tt.args.opt...) diff --git a/internal/iam/repository_user_test.go b/internal/iam/repository_user_test.go index da777bfc5..88d8c5240 100644 --- a/internal/iam/repository_user_test.go +++ b/internal/iam/repository_user_test.go @@ -198,6 +198,7 @@ func TestRepository_LookupUser_WithDifferentPrimaryAuthMethods(t *testing.T) { func TestRepository_UpdateUser(t *testing.T) { t.Parallel() + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -475,7 +476,7 @@ func TestRepository_UpdateUser(t *testing.T) { assert.True(proto.Equal(userAfterUpdate, foundUser)) sort.Strings(foundAccountIds) assert.Equal(accountIds, foundAccountIds) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) if tt.args.name == "" { @@ -710,6 +711,7 @@ func TestRepository_ListUsers_Multiple_Scopes(t *testing.T) { func TestRepository_LookupUserWithLogin(t *testing.T) { t.Parallel() + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -847,7 +849,7 @@ func TestRepository_LookupUserWithLogin(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) got, err := repo.LookupUserWithLogin(context.Background(), tt.args.withAccountId, tt.args.opt...) diff --git a/internal/iam/role_test.go b/internal/iam/role_test.go index 9af79e7c6..749f9da18 100644 --- a/internal/iam/role_test.go +++ b/internal/iam/role_test.go @@ -206,6 +206,7 @@ func Test_RoleCreate(t *testing.T) { func Test_RoleUpdate(t *testing.T) { t.Parallel() + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) repo := TestRepo(t, conn, wrapper) @@ -440,7 +441,7 @@ func Test_RoleUpdate(t *testing.T) { } assert.True(proto.Equal(updateRole, foundRole)) if len(tt.args.nullPaths) != 0 { - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) for _, f := range tt.args.nullPaths { diff --git a/internal/iam/testing.go b/internal/iam/testing.go index a0f7197be..3e693a9a5 100644 --- a/internal/iam/testing.go +++ b/internal/iam/testing.go @@ -13,12 +13,11 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-uuid" "github.com/stretchr/testify/require" - "gorm.io/gorm" ) // TestRepo creates a repo that can be used for various purposes. Crucially, it // ensures that the global scope contains a valid root key. -func TestRepo(t *testing.T, conn *gorm.DB, rootWrapper wrapping.Wrapper, opt ...Option) *Repository { +func TestRepo(t *testing.T, conn *db.DB, rootWrapper wrapping.Wrapper, opt ...Option) *Repository { require := require.New(t) rw := db.New(conn) kmsCache := kms.TestKms(t, conn, rootWrapper) @@ -156,7 +155,7 @@ func TestUser(t *testing.T, repo *Repository, scopeId string, opt ...Option) *Us } // TestRole creates a role suitable for testing. -func TestRole(t *testing.T, conn *gorm.DB, scopeId string, opt ...Option) *Role { +func TestRole(t *testing.T, conn *db.DB, scopeId string, opt ...Option) *Role { t.Helper() require := require.New(t) rw := db.New(conn) @@ -176,7 +175,7 @@ func TestRole(t *testing.T, conn *gorm.DB, scopeId string, opt ...Option) *Role return role } -func TestRoleGrant(t *testing.T, conn *gorm.DB, roleId, grant string, opt ...Option) *RoleGrant { +func TestRoleGrant(t *testing.T, conn *db.DB, roleId, grant string, opt ...Option) *RoleGrant { t.Helper() require := require.New(t) rw := db.New(conn) @@ -189,7 +188,7 @@ func TestRoleGrant(t *testing.T, conn *gorm.DB, roleId, grant string, opt ...Opt } // TestGroup creates a group suitable for testing. -func TestGroup(t *testing.T, conn *gorm.DB, scopeId string, opt ...Option) *Group { +func TestGroup(t *testing.T, conn *db.DB, scopeId string, opt ...Option) *Group { t.Helper() require := require.New(t) rw := db.New(conn) @@ -205,7 +204,7 @@ func TestGroup(t *testing.T, conn *gorm.DB, scopeId string, opt ...Option) *Grou return grp } -func TestGroupMember(t *testing.T, conn *gorm.DB, groupId, userId string, opt ...Option) *GroupMemberUser { +func TestGroupMember(t *testing.T, conn *db.DB, groupId, userId string, opt ...Option) *GroupMemberUser { t.Helper() require := require.New(t) rw := db.New(conn) @@ -218,7 +217,7 @@ func TestGroupMember(t *testing.T, conn *gorm.DB, groupId, userId string, opt .. return gm } -func TestUserRole(t *testing.T, conn *gorm.DB, roleId, userId string, opt ...Option) *UserRole { +func TestUserRole(t *testing.T, conn *db.DB, roleId, userId string, opt ...Option) *UserRole { t.Helper() require := require.New(t) rw := db.New(conn) @@ -230,7 +229,7 @@ func TestUserRole(t *testing.T, conn *gorm.DB, roleId, userId string, opt ...Opt return r } -func TestGroupRole(t *testing.T, conn *gorm.DB, roleId, grpId string, opt ...Option) *GroupRole { +func TestGroupRole(t *testing.T, conn *db.DB, roleId, grpId string, opt ...Option) *GroupRole { t.Helper() require := require.New(t) rw := db.New(conn) @@ -242,7 +241,7 @@ func TestGroupRole(t *testing.T, conn *gorm.DB, roleId, grpId string, opt ...Opt return r } -func TestManagedGroupRole(t *testing.T, conn *gorm.DB, roleId, managedGrpId string, opt ...Option) *ManagedGroupRole { +func TestManagedGroupRole(t *testing.T, conn *db.DB, roleId, managedGrpId string, opt ...Option) *ManagedGroupRole { t.Helper() require := require.New(t) rw := db.New(conn) @@ -257,11 +256,13 @@ func TestManagedGroupRole(t *testing.T, conn *gorm.DB, roleId, managedGrpId stri // testAccount is a temporary test function. TODO - replace with an auth // subsystem testAccount function. If userId is zero value, then an auth // account will be created with a null IamUserId -func testAccount(t *testing.T, conn *gorm.DB, scopeId, authMethodId, userId string) *authAccount { +func testAccount(t *testing.T, conn *db.DB, scopeId, authMethodId, userId string) *authAccount { const ( accountPrefix = "aa_" ) t.Helper() + ctx := context.Background() + rw := db.New(conn) require := require.New(t) require.NotNil(conn) @@ -277,7 +278,7 @@ func testAccount(t *testing.T, conn *gorm.DB, scopeId, authMethodId, userId stri } var count int - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) err = underlyingDB.QueryRow(whereValidAuthMethod, authMethodId, scopeId).Scan(&count) require.NoError(err) @@ -299,7 +300,7 @@ func testAccount(t *testing.T, conn *gorm.DB, scopeId, authMethodId, userId stri require.NotEmpty(acct.PublicId) if userId == "" { - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) dbassert.IsNull(acct, "IamUserId") @@ -309,7 +310,7 @@ func testAccount(t *testing.T, conn *gorm.DB, scopeId, authMethodId, userId stri // testAuthMethod is a temporary test function. TODO - replace with an auth // subsystem testAuthMethod function. -func testAuthMethod(t *testing.T, conn *gorm.DB, scopeId string) string { +func testAuthMethod(t *testing.T, conn *db.DB, scopeId string) string { const ( authMethodPrefix = "am_" ) diff --git a/internal/kms/testing.go b/internal/kms/testing.go index e05759772..37ec6da7e 100644 --- a/internal/kms/testing.go +++ b/internal/kms/testing.go @@ -8,10 +8,9 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-kms-wrapping/wrappers/aead" "github.com/stretchr/testify/require" - "gorm.io/gorm" ) -func TestRootKey(t *testing.T, conn *gorm.DB, scopeId string) *RootKey { +func TestRootKey(t *testing.T, conn *db.DB, scopeId string) *RootKey { t.Helper() require := require.New(t) rw := db.New(conn) @@ -26,7 +25,7 @@ func TestRootKey(t *testing.T, conn *gorm.DB, scopeId string) *RootKey { return k } -func TestRootKeyVersion(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, rootId string) (kv *RootKeyVersion, kvWrapper wrapping.Wrapper) { +func TestRootKeyVersion(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, rootId string) (kv *RootKeyVersion, kvWrapper wrapping.Wrapper) { t.Helper() require := require.New(t) rw := db.New(conn) @@ -48,7 +47,7 @@ func TestRootKeyVersion(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, r return k, rootKeyVersionWrapper } -func TestKms(t *testing.T, conn *gorm.DB, rootWrapper wrapping.Wrapper) *Kms { +func TestKms(t *testing.T, conn *db.DB, rootWrapper wrapping.Wrapper) *Kms { t.Helper() require := require.New(t) rw := db.New(conn) @@ -61,7 +60,7 @@ func TestKms(t *testing.T, conn *gorm.DB, rootWrapper wrapping.Wrapper) *Kms { return kms } -func TestDatabaseKey(t *testing.T, conn *gorm.DB, rootKeyId string) *DatabaseKey { +func TestDatabaseKey(t *testing.T, conn *db.DB, rootKeyId string) *DatabaseKey { t.Helper() require := require.New(t) rw := db.New(conn) @@ -77,7 +76,7 @@ func TestDatabaseKey(t *testing.T, conn *gorm.DB, rootKeyId string) *DatabaseKey return k } -func TestDatabaseKeyVersion(t *testing.T, conn *gorm.DB, rootKeyVersionWrapper wrapping.Wrapper, databaseKeyId string, key []byte) *DatabaseKeyVersion { +func TestDatabaseKeyVersion(t *testing.T, conn *db.DB, rootKeyVersionWrapper wrapping.Wrapper, databaseKeyId string, key []byte) *DatabaseKeyVersion { t.Helper() require := require.New(t) rw := db.New(conn) @@ -95,7 +94,7 @@ func TestDatabaseKeyVersion(t *testing.T, conn *gorm.DB, rootKeyVersionWrapper w return k } -func TestOplogKey(t *testing.T, conn *gorm.DB, rootKeyId string) *OplogKey { +func TestOplogKey(t *testing.T, conn *db.DB, rootKeyId string) *OplogKey { t.Helper() require := require.New(t) rw := db.New(conn) @@ -111,7 +110,7 @@ func TestOplogKey(t *testing.T, conn *gorm.DB, rootKeyId string) *OplogKey { return k } -func TestOplogKeyVersion(t *testing.T, conn *gorm.DB, rootKeyVersionWrapper wrapping.Wrapper, oplogKeyId string, key []byte) *OplogKeyVersion { +func TestOplogKeyVersion(t *testing.T, conn *db.DB, rootKeyVersionWrapper wrapping.Wrapper, oplogKeyId string, key []byte) *OplogKeyVersion { t.Helper() require := require.New(t) rw := db.New(conn) @@ -129,7 +128,7 @@ func TestOplogKeyVersion(t *testing.T, conn *gorm.DB, rootKeyVersionWrapper wrap return k } -func TestTokenKey(t *testing.T, conn *gorm.DB, rootKeyId string) *TokenKey { +func TestTokenKey(t *testing.T, conn *db.DB, rootKeyId string) *TokenKey { t.Helper() require := require.New(t) rw := db.New(conn) @@ -145,7 +144,7 @@ func TestTokenKey(t *testing.T, conn *gorm.DB, rootKeyId string) *TokenKey { return k } -func TestTokenKeyVersion(t *testing.T, conn *gorm.DB, rootKeyVersionWrapper wrapping.Wrapper, tokenKeyId string, key []byte) *TokenKeyVersion { +func TestTokenKeyVersion(t *testing.T, conn *db.DB, rootKeyVersionWrapper wrapping.Wrapper, tokenKeyId string, key []byte) *TokenKeyVersion { t.Helper() require := require.New(t) rw := db.New(conn) @@ -163,7 +162,7 @@ func TestTokenKeyVersion(t *testing.T, conn *gorm.DB, rootKeyVersionWrapper wrap return k } -func TestSessionKey(t *testing.T, conn *gorm.DB, rootKeyId string) *SessionKey { +func TestSessionKey(t *testing.T, conn *db.DB, rootKeyId string) *SessionKey { t.Helper() require := require.New(t) rw := db.New(conn) @@ -179,7 +178,7 @@ func TestSessionKey(t *testing.T, conn *gorm.DB, rootKeyId string) *SessionKey { return k } -func TestSessionKeyVersion(t *testing.T, conn *gorm.DB, rootKeyVersionWrapper wrapping.Wrapper, sessionKeyId string, key []byte) *SessionKeyVersion { +func TestSessionKeyVersion(t *testing.T, conn *db.DB, rootKeyVersionWrapper wrapping.Wrapper, sessionKeyId string, key []byte) *SessionKeyVersion { t.Helper() require := require.New(t) rw := db.New(conn) @@ -197,7 +196,7 @@ func TestSessionKeyVersion(t *testing.T, conn *gorm.DB, rootKeyVersionWrapper wr return k } -func TestOidcKey(t *testing.T, conn *gorm.DB, rootKeyId string) *OidcKey { +func TestOidcKey(t *testing.T, conn *db.DB, rootKeyId string) *OidcKey { t.Helper() require := require.New(t) rw := db.New(conn) @@ -213,7 +212,7 @@ func TestOidcKey(t *testing.T, conn *gorm.DB, rootKeyId string) *OidcKey { return k } -func TestOidcKeyVersion(t *testing.T, conn *gorm.DB, rootKeyVersionWrapper wrapping.Wrapper, oidcKeyId string, key []byte) *OidcKeyVersion { +func TestOidcKeyVersion(t *testing.T, conn *db.DB, rootKeyVersionWrapper wrapping.Wrapper, oidcKeyId string, key []byte) *OidcKeyVersion { t.Helper() require := require.New(t) rw := db.New(conn) diff --git a/internal/oplog/testing.go b/internal/oplog/testing.go index f8d7bdc17..dac8f502c 100644 --- a/internal/oplog/testing.go +++ b/internal/oplog/testing.go @@ -3,9 +3,9 @@ package oplog import ( "context" "crypto/rand" - "database/sql" "testing" + "github.com/hashicorp/boundary/internal/db/common" "github.com/hashicorp/boundary/internal/db/schema" "github.com/hashicorp/boundary/internal/oplog/oplog_test" "github.com/hashicorp/boundary/testing/dbtest" @@ -86,7 +86,7 @@ func testInitStore(t *testing.T, cleanup func() error, url string) { ctx := context.Background() dialect := "postgres" - d, err := sql.Open(dialect, url) + d, err := common.SqlOpen(dialect, url) require.NoError(t, err) sm, err := schema.NewManager(ctx, dialect, d) require.NoError(t, err) diff --git a/internal/oplog/testing_test.go b/internal/oplog/testing_test.go index b5d1030a5..93436e7c1 100644 --- a/internal/oplog/testing_test.go +++ b/internal/oplog/testing_test.go @@ -1,9 +1,9 @@ package oplog import ( - "database/sql" "testing" + "github.com/hashicorp/boundary/internal/db/common" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -77,7 +77,7 @@ func Test_testInitStore(t *testing.T) { const query = ` select count(*) from information_schema."tables" t where table_name = 'db_test_user'; ` - db, err := sql.Open("postgres", url) + db, err := common.SqlOpen("postgres", url) require.NoError(err) var cnt int diff --git a/internal/scheduler/job/testing.go b/internal/scheduler/job/testing.go index 69552c4b3..bd192c93e 100644 --- a/internal/scheduler/job/testing.go +++ b/internal/scheduler/job/testing.go @@ -12,10 +12,9 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-uuid" "github.com/stretchr/testify/require" - "gorm.io/gorm" ) -func testJob(t *testing.T, conn *gorm.DB, name, description string, wrapper wrapping.Wrapper, opt ...Option) *Job { +func testJob(t *testing.T, conn *db.DB, name, description string, wrapper wrapping.Wrapper, opt ...Option) *Job { t.Helper() require := require.New(t) rw := db.New(conn) @@ -31,7 +30,7 @@ func testJob(t *testing.T, conn *gorm.DB, name, description string, wrapper wrap return job } -func testRun(conn *gorm.DB, pluginId, name, cId string) (*Run, error) { +func testRun(conn *db.DB, pluginId, name, cId string) (*Run, error) { query := ` insert into job_run ( job_plugin_id, job_name, server_id @@ -59,7 +58,7 @@ func testRun(conn *gorm.DB, pluginId, name, cId string) (*Run, error) { return run, nil } -func testRunWithUpdateTime(conn *gorm.DB, pluginId, name, cId string, updateTime time.Time) (*Run, error) { +func testRunWithUpdateTime(conn *db.DB, pluginId, name, cId string, updateTime time.Time) (*Run, error) { query := ` insert into job_run ( job_plugin_id, job_name, server_id, update_time @@ -87,7 +86,7 @@ func testRunWithUpdateTime(conn *gorm.DB, pluginId, name, cId string, updateTime return run, nil } -func testController(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper) *servers.Server { +func testController(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper) *servers.Server { t.Helper() rw := db.New(conn) kms := kms.TestKms(t, conn, wrapper) diff --git a/internal/scheduler/testing.go b/internal/scheduler/testing.go index d28e556ba..71646d7d0 100644 --- a/internal/scheduler/testing.go +++ b/internal/scheduler/testing.go @@ -14,7 +14,6 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-uuid" "github.com/stretchr/testify/require" - "gorm.io/gorm" ) // TestScheduler creates a mock controller and a new Scheduler attached to that controller id. @@ -22,7 +21,7 @@ import ( // // WithRunJobsLimit, WithRunJobsInterval, WithMonitorInterval and WithInterruptThreshold are // the only valid options. -func TestScheduler(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, opt ...Option) *Scheduler { +func TestScheduler(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, opt ...Option) *Scheduler { t.Helper() rw := db.New(conn) diff --git a/internal/servers/controller/handlers/authmethods/oidc_test.go b/internal/servers/controller/handlers/authmethods/oidc_test.go index 2f6ed2ca4..d843c4603 100644 --- a/internal/servers/controller/handlers/authmethods/oidc_test.go +++ b/internal/servers/controller/handlers/authmethods/oidc_test.go @@ -41,12 +41,11 @@ import ( "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/wrapperspb" - "gorm.io/gorm" ) type setup struct { ctx context.Context - conn *gorm.DB + conn *db.DB rw *db.Db rootWrapper wrapping.Wrapper kmsCache *kms.Kms diff --git a/internal/servers/controller/handlers/targets/target_service_test.go b/internal/servers/controller/handlers/targets/target_service_test.go index 777a815db..29b185fa3 100644 --- a/internal/servers/controller/handlers/targets/target_service_test.go +++ b/internal/servers/controller/handlers/targets/target_service_test.go @@ -47,7 +47,6 @@ import ( "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/wrapperspb" - "gorm.io/gorm" ) var testAuthorizedActions = []string{ @@ -67,7 +66,7 @@ var testAuthorizedActions = []string{ "authorize-session", } -func testService(t *testing.T, conn *gorm.DB, kms *kms.Kms, wrapper wrapping.Wrapper) (targets.Service, error) { +func testService(t *testing.T, conn *db.DB, kms *kms.Kms, wrapper wrapping.Wrapper) (targets.Service, error) { rw := db.New(conn) sche := scheduler.TestScheduler(t, conn, wrapper) repoFn := func() (*target.Repository, error) { diff --git a/internal/servers/controller/testing.go b/internal/servers/controller/testing.go index f458efcac..85c62ace7 100644 --- a/internal/servers/controller/testing.go +++ b/internal/servers/controller/testing.go @@ -16,6 +16,7 @@ import ( "github.com/hashicorp/boundary/internal/authtoken" "github.com/hashicorp/boundary/internal/cmd/base" "github.com/hashicorp/boundary/internal/cmd/config" + "github.com/hashicorp/boundary/internal/db" "github.com/hashicorp/boundary/internal/db/schema" "github.com/hashicorp/boundary/internal/iam" "github.com/hashicorp/boundary/internal/intglobals" @@ -26,7 +27,6 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-secure-stdlib/base62" "github.com/hashicorp/go-secure-stdlib/strutil" - "gorm.io/gorm" ) const ( @@ -126,7 +126,7 @@ func (tc *TestController) ClusterAddrs() []string { return tc.addrs("cluster") } -func (tc *TestController) DbConn() *gorm.DB { +func (tc *TestController) DbConn() *db.DB { return tc.b.Database } @@ -272,8 +272,8 @@ func (tc *TestController) Shutdown() { tc.t.Error(err) } if !tc.opts.DisableDatabaseDestruction { - if tc.b.DestroyDevDatabase() != nil { - if err := tc.b.DestroyDevDatabase(); err != nil { + if tc.b.DestroyDevDatabase(tc.ctx) != nil { + if err := tc.b.DestroyDevDatabase(tc.ctx); err != nil { tc.t.Error(err) } } @@ -536,7 +536,7 @@ func NewTestController(t *testing.T, opts *TestControllerOpts) *TestController { if _, err := schema.MigrateStore(ctx, "postgres", tc.b.DatabaseUrl); err != nil { t.Fatal(err) } - if err := tc.b.ConnectToDatabase("postgres"); err != nil { + if err := tc.b.ConnectToDatabase(tc.ctx, "postgres"); err != nil { t.Fatal(err) } if !opts.DisableKmsKeyCreation { diff --git a/internal/session/repository_session_test.go b/internal/session/repository_session_test.go index 9ea29d3d4..890e5b260 100644 --- a/internal/session/repository_session_test.go +++ b/internal/session/repository_session_test.go @@ -19,7 +19,6 @@ import ( wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/jackc/pgconn" "google.golang.org/protobuf/types/known/timestamppb" - "gorm.io/gorm" "github.com/hashicorp/boundary/internal/errors" "github.com/hashicorp/boundary/internal/iam" @@ -1408,13 +1407,13 @@ func TestRepository_CancelSessionViaFKNull(t *testing.T) { rowsDeleted, err := rw.Delete(context.Background(), tt.cancelFk.fkType) if err != nil { - var pqError *pgconn.PgError - if errors.As(err, &pqError) { - t.Log(pqError.Message) - t.Log(pqError.Detail) - t.Log(pqError.Where) - t.Log(pqError.ConstraintName) - t.Log(pqError.TableName) + var pgError *pgconn.PgError + if errors.As(err, &pgError) { + t.Log(pgError.Message) + t.Log(pgError.Detail) + t.Log(pgError.Where) + t.Log(pgError.ConstraintName) + t.Log(pgError.TableName) } } require.NoError(err) @@ -1642,7 +1641,7 @@ func TestRepository_DeleteSession(t *testing.T) { } } -func testSessionCredentialParams(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, iamRepo *iam.Repository) ComposedOf { +func testSessionCredentialParams(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, iamRepo *iam.Repository) ComposedOf { t.Helper() params := TestSessionParams(t, conn, wrapper, iamRepo) require := require.New(t) diff --git a/internal/session/testing.go b/internal/session/testing.go index 445ff499e..652f5ac98 100644 --- a/internal/session/testing.go +++ b/internal/session/testing.go @@ -20,11 +20,10 @@ import ( "github.com/hashicorp/go-uuid" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/timestamppb" - "gorm.io/gorm" ) // TestConnection creates a test connection for the sessionId in the repository. -func TestConnection(t *testing.T, conn *gorm.DB, sessionId, clientTcpAddr string, clientTcpPort uint32, endpointTcpAddr string, endpointTcpPort uint32) *Connection { +func TestConnection(t *testing.T, conn *db.DB, sessionId, clientTcpAddr string, clientTcpPort uint32, endpointTcpAddr string, endpointTcpPort uint32) *Connection { t.Helper() require := require.New(t) rw := db.New(conn) @@ -44,7 +43,7 @@ func TestConnection(t *testing.T, conn *gorm.DB, sessionId, clientTcpAddr string } // TestConnectionState creates a test connection state for the connectionId in the repository. -func TestConnectionState(t *testing.T, conn *gorm.DB, connectionId string, state ConnectionStatus) *ConnectionState { +func TestConnectionState(t *testing.T, conn *db.DB, connectionId string, state ConnectionStatus) *ConnectionState { t.Helper() require := require.New(t) rw := db.New(conn) @@ -56,7 +55,7 @@ func TestConnectionState(t *testing.T, conn *gorm.DB, connectionId string, state } // TestState creates a test state for the sessionId in the repository. -func TestState(t *testing.T, conn *gorm.DB, sessionId string, state Status) *State { +func TestState(t *testing.T, conn *db.DB, sessionId string, state Status) *State { t.Helper() require := require.New(t) rw := db.New(conn) @@ -69,7 +68,7 @@ func TestState(t *testing.T, conn *gorm.DB, sessionId string, state Status) *Sta // TestSession creates a test session composed of c in the repository. Options // are passed into New, and withServerId is handled locally. -func TestSession(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, c ComposedOf, opt ...Option) *Session { +func TestSession(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, c ComposedOf, opt ...Option) *Session { t.Helper() ctx := context.Background() opts := getOpts(opt...) @@ -110,7 +109,7 @@ func TestSession(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, c Compos } // TestDefaultSession creates a test session in the repository using defaults. -func TestDefaultSession(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, iamRepo *iam.Repository, opt ...Option) *Session { +func TestDefaultSession(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, iamRepo *iam.Repository, opt ...Option) *Session { t.Helper() composedOf := TestSessionParams(t, conn, wrapper, iamRepo) future := timestamppb.New(time.Now().Add(time.Hour)) @@ -120,7 +119,7 @@ func TestDefaultSession(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, i // TestSessionParams returns an initialized ComposedOf which can be used to // create a session in the repository. -func TestSessionParams(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, iamRepo *iam.Repository) ComposedOf { +func TestSessionParams(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, iamRepo *iam.Repository) ComposedOf { t.Helper() ctx := context.Background() @@ -176,7 +175,7 @@ func TestTofu(t *testing.T) []byte { // TestWorker inserts a worker into the db to satisfy foreign key constraints. // Supports the WithServerId option. -func TestWorker(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, opt ...Option) *servers.Server { +func TestWorker(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, opt ...Option) *servers.Server { t.Helper() rw := db.New(conn) kms := kms.TestKms(t, conn, wrapper) diff --git a/internal/target/repository_tcp_target_test.go b/internal/target/repository_tcp_target_test.go index 02b3bfd65..89b34dfce 100644 --- a/internal/target/repository_tcp_target_test.go +++ b/internal/target/repository_tcp_target_test.go @@ -219,6 +219,7 @@ func TestRepository_CreateTcpTarget(t *testing.T) { func TestRepository_UpdateTcpTarget(t *testing.T) { t.Parallel() + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -491,7 +492,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) { foundTarget, _, _, err := repo.LookupTarget(context.Background(), target.PublicId) assert.NoError(err) assert.True(proto.Equal(targetAfterUpdate.((*TcpTarget)), foundTarget.((*TcpTarget)))) - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) if tt.args.description == "" { diff --git a/internal/target/tcp_target_test.go b/internal/target/tcp_target_test.go index e0890e55e..faa059033 100644 --- a/internal/target/tcp_target_test.go +++ b/internal/target/tcp_target_test.go @@ -146,6 +146,7 @@ func TestTcpTarget_Delete(t *testing.T) { func TestTcpTarget_Update(t *testing.T) { t.Parallel() id := testId(t) + ctx := context.Background() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -279,7 +280,7 @@ func TestTcpTarget_Update(t *testing.T) { require.NoError(err) assert.True(proto.Equal(updateTarget, foundTarget)) if len(tt.args.nullPaths) != 0 { - underlyingDB, err := conn.DB() + underlyingDB, err := conn.SqlDB(ctx) require.NoError(err) dbassert := dbassert.New(t, underlyingDB) for _, f := range tt.args.nullPaths { diff --git a/internal/target/testing.go b/internal/target/testing.go index 38b35d6e8..a1761a659 100644 --- a/internal/target/testing.go +++ b/internal/target/testing.go @@ -8,10 +8,9 @@ import ( "github.com/hashicorp/boundary/internal/db" "github.com/hashicorp/go-uuid" "github.com/stretchr/testify/require" - "gorm.io/gorm" ) -func TestTcpTarget(t *testing.T, conn *gorm.DB, scopeId, name string, opt ...Option) *TcpTarget { +func TestTcpTarget(t *testing.T, conn *db.DB, scopeId, name string, opt ...Option) *TcpTarget { t.Helper() opt = append(opt, WithName(name)) opts := getOpts(opt...) @@ -62,7 +61,7 @@ func testId(t *testing.T) string { // TestCredentialLibrary creates a CredentialLibrary for targetId and // libraryId. -func TestCredentialLibrary(t *testing.T, conn *gorm.DB, targetId, libraryId string) *CredentialLibrary { +func TestCredentialLibrary(t *testing.T, conn *db.DB, targetId, libraryId string) *CredentialLibrary { t.Helper() require := require.New(t) rw := db.New(conn) diff --git a/testing/dbtest/docs.go b/testing/dbtest/docs.go index ada0d0321..546d004b4 100644 --- a/testing/dbtest/docs.go +++ b/testing/dbtest/docs.go @@ -12,7 +12,7 @@ // require.NoError(t, c()) // }) // // use u to get a connection to the new database -// dBase, err := sql.Open("postgres", u) +// dBase, err := common.SqlOpen("postgres", u) // // By default this uses a template that already has all of the boundary // migrations run. If a test needs a database without any migrations, like in diff --git a/testing/dbtest/template.go b/testing/dbtest/template.go index d7ecd88da..5a3a9892e 100644 --- a/testing/dbtest/template.go +++ b/testing/dbtest/template.go @@ -1,14 +1,15 @@ package dbtest import ( - "database/sql" "fmt" "math/rand" "os" "time" // postgres dialect - _ "github.com/lib/pq" + + "github.com/hashicorp/boundary/internal/db/common" + _ "github.com/jackc/pgx/v4/stdlib" ) var testDBPort = "5432" @@ -75,7 +76,10 @@ func startUsingTemplate(dialect string, opt ...Option) (cleanup func() error, re return func() error { return nil }, "", "", fmt.Errorf("unsupported dialect: %s", dialect) } - db, err := sql.Open(dialect, fmt.Sprintf("postgres://boundary:boundary@127.0.0.1:%s/boundary?sslmode=disable", testDBPort)) + if dialect == "postgres" { + dialect = "pgx" + } + db, err := common.SqlOpen(dialect, fmt.Sprintf("postgres://boundary:boundary@127.0.0.1:%s/boundary?sslmode=disable", testDBPort)) if err != nil { return func() error { return nil }, "", "", fmt.Errorf("could not connect to source database: %w", err) } @@ -103,7 +107,7 @@ func startUsingTemplate(dialect string, opt ...Option) (cleanup func() error, re return dropDatabase(dialect, dbname) } - tdb, err := sql.Open(dialect, url) + tdb, err := common.SqlOpen(dialect, url) if err != nil { return func() error { return nil }, "", "", fmt.Errorf("could not create test database: %w", err) } @@ -130,7 +134,7 @@ func dropDatabase(dialect, dbname string) error { return fmt.Errorf("empty dbname") } - db, err := sql.Open(dialect, fmt.Sprintf("postgres://boundary:boundary@127.0.0.1:%s/boundary?sslmode=disable", testDBPort)) + db, err := common.SqlOpen(dialect, fmt.Sprintf("postgres://boundary:boundary@127.0.0.1:%s/boundary?sslmode=disable", testDBPort)) if err != nil { return err } diff --git a/testing/dbtest/template_test.go b/testing/dbtest/template_test.go index dcf305199..786edceae 100644 --- a/testing/dbtest/template_test.go +++ b/testing/dbtest/template_test.go @@ -1,10 +1,10 @@ package dbtest_test import ( - "database/sql" "errors" "testing" + "github.com/hashicorp/boundary/internal/db/common" "github.com/hashicorp/boundary/testing/dbtest" "github.com/stretchr/testify/require" ) @@ -56,7 +56,7 @@ func TestStartUsingTemplate(t *testing.T) { } else { require.NoError(t, err) - db, err := sql.Open(tt.dialect, u) + db, err := common.SqlOpen(tt.dialect, u) require.NoError(t, err) require.NoError(t, db.Ping()) db.Close() @@ -64,7 +64,7 @@ func TestStartUsingTemplate(t *testing.T) { require.NoError(t, c()) // ensure that database is gone after calling c - db, _ = sql.Open(tt.dialect, u) + db, _ = common.SqlOpen(tt.dialect, u) require.Error(t, db.Ping()) } }) From c8b29ded1c5696150e290f799f1100f666fb3433 Mon Sep 17 00:00:00 2001 From: Jim Date: Thu, 30 Sep 2021 12:55:47 -0400 Subject: [PATCH 13/18] Events: Add outbound detail protobufs, request status code, and update event encrypt filter. (#1569) * feat (events): Add status code to audit events * feat (events): Add the resp proto msg to every audit event * chore (events): Update eventlogger dep This latest version will redact any map and/or map field which isn't explicitly classified via a Taggable interface * feat (events): Begin to add tagging to response proto msgs --- Makefile | 6 + go.mod | 5 +- go.sum | 9 +- .../api/services/auth_method_service.pb.go | 6 +- .../services/auth_method_service_taggable.go | 63 ++++++ .../auth_method_service_taggable_test.go | 97 +++++++++ internal/observability/event/context_test.go | 32 ++- internal/observability/event/event_audit.go | 29 ++- .../authmethods/v1/auth_method.proto | 23 +- .../api/resources/scopes/v1/scope.proto | 36 +-- .../api/services/v1/auth_method_service.proto | 6 +- internal/servers/common/handler.go | 2 +- internal/servers/common/handler_test.go | 6 +- .../handlers/outgoing_interceptor.go | 11 +- sdk/go.mod | 26 +++ sdk/go.sum | 206 +++++++++++++++--- .../resources/authmethods/auth_method.pb.go | 22 +- .../authmethods/auth_method_taggable.go | 98 +++++++++ .../authmethods/auth_method_taggable_test.go | 183 ++++++++++++++++ .../api/resources/scopes/scope.pb.go | 30 +-- .../api/resources/scopes/scope_taggable.go | 20 ++ .../resources/scopes/scope_taggable_test.go | 94 ++++++++ sdk/wrapper/testing.go | 33 +++ 23 files changed, 914 insertions(+), 129 deletions(-) create mode 100644 internal/gen/controller/api/services/auth_method_service_taggable.go create mode 100644 internal/gen/controller/api/services/auth_method_service_taggable_test.go create mode 100644 sdk/pbs/controller/api/resources/authmethods/auth_method_taggable.go create mode 100644 sdk/pbs/controller/api/resources/authmethods/auth_method_taggable_test.go create mode 100644 sdk/pbs/controller/api/resources/scopes/scope_taggable.go create mode 100644 sdk/pbs/controller/api/resources/scopes/scope_taggable_test.go create mode 100644 sdk/wrapper/testing.go diff --git a/Makefile b/Makefile index a02bdf8dd..37500b858 100644 --- a/Makefile +++ b/Makefile @@ -138,6 +138,12 @@ protobuild: @protoc-go-inject-tag -input=./internal/credential/vault/store/vault.pb.go @protoc-go-inject-tag -input=./internal/servers/servers.pb.go + // inject classification tags (see: https://github.com/hashicorp/go-eventlogger/tree/main/filters/encrypt) + @protoc-go-inject-tag -input=./internal/gen/controller/api/services/auth_method_service.pb.go + @protoc-go-inject-tag -input=./sdk/pbs/controller/api/resources/authmethods/auth_method.pb.go + @protoc-go-inject-tag -input=./sdk/pbs/controller/api/resources/scopes/scope.pb.go + + # these protos, services and openapi artifacts are purely for testing purposes @protoc-go-inject-tag -input=./internal/gen/testing/event/event.pb.go @protoc --proto_path=internal/proto/local --proto_path=internal/proto/third_party --openapiv2_out=json_names_for_fields=false,logtostderr=true,disable_default_errors=true,include_package_in_tags=true,fqn_for_openapi_name=true,allow_merge,merge_file_name=testing:internal/gen/testing/event/. internal/proto/local/testing/event/v1/*.proto diff --git a/go.mod b/go.mod index c89dffc48..b3aa79c1b 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/hashicorp/dawdle v0.4.0 github.com/hashicorp/dbassert v0.0.0-20210708202608-ecf920cf1ed8 github.com/hashicorp/eventlogger v0.1.0 - github.com/hashicorp/eventlogger/filters/encrypt v0.1.3 + github.com/hashicorp/eventlogger/filters/encrypt v0.1.4-0.20210928205053-80364fba97eb github.com/hashicorp/go-bexpr v0.1.10 github.com/hashicorp/go-cleanhttp v0.5.2 github.com/hashicorp/go-hclog v0.16.2 @@ -54,11 +54,9 @@ require ( github.com/jackc/pgconn v1.10.0 github.com/jackc/pgx/v4 v4.11.0 github.com/jefferai/keyring v1.1.7-0.20210105022822-8749b3d9ce79 - github.com/json-iterator/go v1.1.10 // indirect github.com/kr/pretty v0.3.0 github.com/kr/text v0.2.0 github.com/mattn/go-colorable v0.1.8 - github.com/mattn/go-isatty v0.0.13 // indirect github.com/mitchellh/cli v1.1.2 github.com/mitchellh/copystructure v1.2.0 github.com/mitchellh/go-wordwrap v1.0.1 @@ -84,7 +82,6 @@ require ( google.golang.org/grpc v1.40.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 google.golang.org/protobuf v1.27.1 - gopkg.in/yaml.v2 v2.4.0 // indirect gorm.io/driver/postgres v1.1.0 gorm.io/gorm v1.21.14 mvdan.cc/gofumpt v0.1.1 diff --git a/go.sum b/go.sum index d1e9edf79..f6431760e 100644 --- a/go.sum +++ b/go.sum @@ -257,6 +257,7 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= @@ -454,8 +455,9 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/eventlogger v0.1.0 h1:S6xc4gZVzewuDUP4R4Ngko419h/CGDuV/b4ADL3XLik= github.com/hashicorp/eventlogger v0.1.0/go.mod h1:a3IXf1aEJfpCPzseTOrwKj4fVW/Qn3oEmpQeaIznzH0= -github.com/hashicorp/eventlogger/filters/encrypt v0.1.3 h1:RKYUGplnpDoE/Cj2vupQqUJS/wWBVvmpxEYeEpGL88s= github.com/hashicorp/eventlogger/filters/encrypt v0.1.3/go.mod h1:8rcez7Kw1zanB0/074qnOuGu7zxmNh9Xr2ZI+K4xVIA= +github.com/hashicorp/eventlogger/filters/encrypt v0.1.4-0.20210928205053-80364fba97eb h1:AhprXfDoXGI8hP5fUCyCB29jpfd01Ck996ErqG0nVGk= +github.com/hashicorp/eventlogger/filters/encrypt v0.1.4-0.20210928205053-80364fba97eb/go.mod h1:8rcez7Kw1zanB0/074qnOuGu7zxmNh9Xr2ZI+K4xVIA= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -689,6 +691,7 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -1183,6 +1186,7 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f h1:Qmd2pbz05z7z6lm0DrgQVVPuBm92jqujBKMHMOlOQEw= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1342,6 +1346,7 @@ golang.org/x/tools v0.0.0-20200818005847-188abfa75333/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6 h1:SIasE1FVIQOWz2GEAHFOmoW7xchJcqlucjSULTL0Ag4= golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= @@ -1418,6 +1423,7 @@ google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200911024640-645f7a48b24f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201030142918-24207fddd1c3/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83 h1:3V2dxSZpz4zozWWUq36vUxXEKnSYitEH2LdsAx+RUmg= google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -1445,6 +1451,7 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.35.0-dev.0.20201218190559-666aea1fb34c/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= diff --git a/internal/gen/controller/api/services/auth_method_service.pb.go b/internal/gen/controller/api/services/auth_method_service.pb.go index 62ca568e2..a22b7cb26 100644 --- a/internal/gen/controller/api/services/auth_method_service.pb.go +++ b/internal/gen/controller/api/services/auth_method_service.pb.go @@ -873,14 +873,14 @@ type AuthenticateRequest struct { unknownFields protoimpl.UnknownFields // The ID of the Auth Method in the system that should be used for authentication. - AuthMethodId string `protobuf:"bytes,1,opt,name=auth_method_id,proto3" json:"auth_method_id,omitempty"` + AuthMethodId string `protobuf:"bytes,1,opt,name=auth_method_id,proto3" json:"auth_method_id,omitempty" class:"public"` // @gotags: `class:"public"` // This can be "cookie" or "token". If not provided, "token" will be used. "cookie" activates a split-cookie method where the token is split partially between http-only and regular cookies in order // to keep it safe from rogue JS in the browser. TokenType string `protobuf:"bytes,2,opt,name=token_type,proto3" json:"token_type,omitempty"` // Attributes are passed to the Auth Method; the valid keys and values depend on the type of Auth Method as well as the command. Attributes *structpb.Struct `protobuf:"bytes,4,opt,name=attributes,proto3" json:"attributes,omitempty"` // The command to perform. - Command string `protobuf:"bytes,5,opt,name=command,proto3" json:"command,omitempty"` + Command string `protobuf:"bytes,5,opt,name=command,proto3" json:"command,omitempty" class:"public"` // @gotags: `class:"public"` } func (x *AuthenticateRequest) Reset() { @@ -951,7 +951,7 @@ type AuthenticateResponse struct { // Valid keys and values depend on the type of Auth Method as well as the command. Attributes *structpb.Struct `protobuf:"bytes,4,opt,name=attributes,proto3" json:"attributes,omitempty"` // The command that was performed. - Command string `protobuf:"bytes,5,opt,name=command,proto3" json:"command,omitempty"` + Command string `protobuf:"bytes,5,opt,name=command,proto3" json:"command,omitempty" class:"public"` // @gotags: `class:"public"` } func (x *AuthenticateResponse) Reset() { diff --git a/internal/gen/controller/api/services/auth_method_service_taggable.go b/internal/gen/controller/api/services/auth_method_service_taggable.go new file mode 100644 index 000000000..7359eaf3d --- /dev/null +++ b/internal/gen/controller/api/services/auth_method_service_taggable.go @@ -0,0 +1,63 @@ +package services + +import "github.com/hashicorp/eventlogger/filters/encrypt" + +// Tags implements the encrypt.Taggable interface which allows +// AuthenticateResponse Attributes to be classified for the encrypt filter. +func (req *AuthenticateResponse) Tags() ([]encrypt.PointerTag, error) { + if req.Attributes == nil { + return nil, nil + } + return []encrypt.PointerTag{ + // public fields + { + Pointer: "/Attributes/Fields/account_id", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/approximate_last_used_time", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/auth_method_id", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/authorized_actions", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/created_time", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/expiration_time", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/id", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/scope", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/token_type", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/updated_time", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/user_id", + Classification: encrypt.PublicClassification, + }, + // secret fields + { + Pointer: "/Attributes/Fields/token", + Classification: encrypt.SecretClassification, + }, + }, nil +} diff --git a/internal/gen/controller/api/services/auth_method_service_taggable_test.go b/internal/gen/controller/api/services/auth_method_service_taggable_test.go new file mode 100644 index 000000000..aee0e8602 --- /dev/null +++ b/internal/gen/controller/api/services/auth_method_service_taggable_test.go @@ -0,0 +1,97 @@ +package services + +import ( + "context" + "encoding/json" + "testing" + "time" + + "github.com/hashicorp/boundary/sdk/wrapper" + "github.com/hashicorp/eventlogger" + "github.com/hashicorp/eventlogger/filters/encrypt" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + structpb "google.golang.org/protobuf/types/known/structpb" +) + +func TestScope_Tags(t *testing.T) { + ctx := context.Background() + now := time.Now() + wrapper := wrapper.TestWrapper(t) + testEncryptingFilter := &encrypt.Filter{ + Wrapper: wrapper, + HmacSalt: []byte("salt"), + HmacInfo: []byte("info"), + } + + tests := []struct { + name string + testEvent *eventlogger.Event + wantEvent *eventlogger.Event + }{ + { + name: "validate-filtering", + testEvent: &eventlogger.Event{ + Type: "test", + CreatedAt: now, + Payload: &AuthenticateResponse{ + Command: "public-command", + Attributes: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "account_id": structpb.NewStringValue("public-account_id"), + "approximate_last_used_time": structpb.NewStringValue("public-approximate_last_used_time"), + "auth_method_id": structpb.NewStringValue("public-auth_method_id"), + "authorized_actions": structpb.NewStringValue("public-authorized_actions"), + "created_time": structpb.NewStringValue("public-created_time"), + "expiration_time": structpb.NewStringValue("public-expiration_time"), + "id": structpb.NewStringValue("public-id"), + "scope": structpb.NewStringValue("public-scope"), + "token_type": structpb.NewStringValue("public-token_type"), + "updated_time": structpb.NewStringValue("public-updated_time"), + "user_id": structpb.NewStringValue("public-user_id"), + "token": structpb.NewStringValue("secret-token"), + }, + }, + }, + }, + wantEvent: &eventlogger.Event{ + Type: "test", + CreatedAt: now, + Payload: &AuthenticateResponse{ + Command: "public-command", + Attributes: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "account_id": structpb.NewStringValue("public-account_id"), + "approximate_last_used_time": structpb.NewStringValue("public-approximate_last_used_time"), + "auth_method_id": structpb.NewStringValue("public-auth_method_id"), + "authorized_actions": structpb.NewStringValue("public-authorized_actions"), + "created_time": structpb.NewStringValue("public-created_time"), + "expiration_time": structpb.NewStringValue("public-expiration_time"), + "id": structpb.NewStringValue("public-id"), + "scope": structpb.NewStringValue("public-scope"), + "token_type": structpb.NewStringValue("public-token_type"), + "updated_time": structpb.NewStringValue("public-updated_time"), + "user_id": structpb.NewStringValue("public-user_id"), + "token": structpb.NewStringValue(""), + }, + }, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert, require := assert.New(t), require.New(t) + got, err := testEncryptingFilter.Process(ctx, tt.testEvent) + require.NoError(err) + require.NotNil(got) + actualJson, err := json.Marshal(got) + require.NoError(err) + t.Log(string(actualJson)) + + wantJson, err := json.Marshal(tt.wantEvent) + require.NoError(err) + assert.JSONEq(string(wantJson), string(actualJson)) + }) + } +} diff --git a/internal/observability/event/context_test.go b/internal/observability/event/context_test.go index 66f04577d..f8a1c1555 100644 --- a/internal/observability/event/context_test.go +++ b/internal/observability/event/context_test.go @@ -30,16 +30,15 @@ const ( ) type testAudit struct { - Id string `json:"id"` // std audit/boundary field - Version string `json:"version"` // std audit/boundary field - Type string `json:"type"` // std audit field - Timestamp time.Time `json:"timestamp"` // std audit field - RequestInfo *event.RequestInfo `json:"request_info,omitempty"` // boundary field - Auth *event.Auth `json:"auth,omitempty"` // std audit field - Request *event.Request `json:"request,omitempty"` // std audit field - Response *event.Response `json:"response,omitempty"` // std audit field - SerializedHMAC string `json:"serialized_hmac"` // boundary field - Flush bool `json:"-"` + Id string `json:"id"` // std audit/boundary field + Version string `json:"version"` // std audit/boundary field + Type string `json:"type"` // std audit field + Timestamp time.Time `json:"timestamp"` // std audit field + RequestInfo *event.RequestInfo `json:"request_info,omitempty"` // boundary field + Auth *event.Auth `json:"auth,omitempty"` // std audit field + Request *event.Request `json:"request,omitempty"` // std audit field + Response *event.Response `json:"response,omitempty"` // std audit field + Flush bool `json:"-"` } func Test_NewRequestInfoContext(t *testing.T) { @@ -922,13 +921,12 @@ func Test_WriteAudit(t *testing.T) { Time: gotAudit.Time, Type: "audit", Data: map[string]interface{}{ - "auth": tt.wantAudit.Auth, - "id": gotAudit.Data.(map[string]interface{})["id"], - "timestamp": now, - "request": tt.wantAudit.Request, - "serialized_hmac": "", - "type": apiRequest, - "version": testAuditVersion, + "auth": tt.wantAudit.Auth, + "id": gotAudit.Data.(map[string]interface{})["id"], + "timestamp": now, + "request": tt.wantAudit.Request, + "type": apiRequest, + "version": testAuditVersion, }, } if tt.wantAudit.Id != "" { diff --git a/internal/observability/event/event_audit.go b/internal/observability/event/event_audit.go index 1175bb657..48e6d38de 100644 --- a/internal/observability/event/event_audit.go +++ b/internal/observability/event/event_audit.go @@ -19,16 +19,15 @@ const ( // audit defines the data of audit events type audit struct { - Id string `json:"id"` // std audit/boundary field - Version string `json:"version"` // std audit/boundary field - Type string `json:"type"` // std audit field - Timestamp time.Time `json:"timestamp"` // std audit field - RequestInfo *RequestInfo `json:"request_info,omitempty"` // boundary field - Auth *Auth `json:"auth,omitempty"` // std audit field - Request *Request `json:"request,omitempty"` // std audit field - Response *Response `json:"response,omitempty"` // std audit field - SerializedHMAC string `json:"serialized_hmac"` // boundary field - Flush bool `json:"-"` + Id string `json:"id"` // std audit/boundary field + Version string `json:"version"` // std audit/boundary field + Type string `json:"type"` // std audit field + Timestamp time.Time `json:"timestamp"` // std audit field + RequestInfo *RequestInfo `json:"request_info,omitempty"` // boundary field + Auth *Auth `json:"auth,omitempty"` // std audit field + Request *Request `json:"request,omitempty"` // std audit field + Response *Response `json:"response,omitempty"` // std audit field + Flush bool `json:"-"` } func newAudit(fromOperation Op, opt ...Option) (*audit, error) { @@ -133,7 +132,15 @@ func (a *audit) ComposeFrom(events []*eventlogger.Event) (eventlogger.EventType, payload.Request = gated.Request } if gated.Response != nil { - payload.Response = gated.Response + if payload.Response == nil { + payload.Response = &Response{} + } + if gated.Response.StatusCode != 0 { + payload.Response.StatusCode = gated.Response.StatusCode + } + if gated.Response.Details != nil { + payload.Response.Details = gated.Response.Details + } } if !gated.Timestamp.IsZero() { payload.Timestamp = gated.Timestamp diff --git a/internal/proto/local/controller/api/resources/authmethods/v1/auth_method.proto b/internal/proto/local/controller/api/resources/authmethods/v1/auth_method.proto index ff222abd3..a34480a4e 100644 --- a/internal/proto/local/controller/api/resources/authmethods/v1/auth_method.proto +++ b/internal/proto/local/controller/api/resources/authmethods/v1/auth_method.proto @@ -13,42 +13,43 @@ import "controller/custom_options/v1/options.proto"; // AuthMethod contains all fields related to an Auth Method resource message AuthMethod { // Output only. The ID of the Auth Method. - string id = 10; + string id = 10; // @gotags: `class:"public"` // The ID of the Scope of which this Auth Method is a part. - string scope_id = 20 [json_name = "scope_id"]; + string scope_id = 20 [json_name = "scope_id"]; // @gotags: `class:"public"` // Output only. Scope information for this Auth method. - resources.scopes.v1.ScopeInfo scope = 30; + resources.scopes.v1.ScopeInfo scope = 30; // @gotags: `class:"public"` // Optional name for identification purposes. - google.protobuf.StringValue name = 40 [(custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = { this: "name" that: "Name" }]; + google.protobuf.StringValue name = 40 [(custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = { this: "name" that: "Name" }]; // @gotags: `class:"public"` // Optional user-set description for identification purposes. - google.protobuf.StringValue description = 50 [(custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = { this: "description" that: "Description" }]; + google.protobuf.StringValue description = 50 + [(custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = { this: "description" that: "Description" }]; // @gotags: `class:"public"` // Output only. The time this resource was created. - google.protobuf.Timestamp created_time = 60 [json_name = "created_time"]; + google.protobuf.Timestamp created_time = 60 [json_name = "created_time"]; // @gotags: `class:"public"` // Output only. The time this resource was last updated. - google.protobuf.Timestamp updated_time = 70 [json_name = "updated_time"]; + google.protobuf.Timestamp updated_time = 70 [json_name = "updated_time"]; // @gotags: `class:"public"` // Version is used in mutation requests, after the initial creation, to ensure this resource has not changed. // The mutation will fail if the version does not match the latest known good version. - uint32 version = 80; + uint32 version = 80; // @gotags: `class:"public"` // The Auth Method type. - string type = 90; + string type = 90; // @gotags: `class:"public"` // The attributes that are applicable for the specific Auth Method type. google.protobuf.Struct attributes = 100 [(custom_options.v1.generate_sdk_option) = true]; // Output only. Whether this auth method is the primary auth method for it's scope. // To change this value update the primary_auth_method_id field on the scope. - bool is_primary = 110 [json_name = "is_primary"]; + bool is_primary = 110 [json_name = "is_primary"]; // @gotags: `class:"public"` // Output only. The available actions on this resource for this user. - repeated string authorized_actions = 300 [json_name = "authorized_actions"]; + repeated string authorized_actions = 300 [json_name = "authorized_actions"]; // @gotags: `class:"public"` // Output only. The authorized actions for the scope's collections. map authorized_collection_actions = 310 [json_name = "authorized_collection_actions"]; diff --git a/internal/proto/local/controller/api/resources/scopes/v1/scope.proto b/internal/proto/local/controller/api/resources/scopes/v1/scope.proto index 3ab3d4b76..b320741a4 100644 --- a/internal/proto/local/controller/api/resources/scopes/v1/scope.proto +++ b/internal/proto/local/controller/api/resources/scopes/v1/scope.proto @@ -11,58 +11,62 @@ import "controller/custom_options/v1/options.proto"; message ScopeInfo { // Output only. The ID of the Scope. - string id = 1; + string id = 1; // @gotags: `class:"public"` // Output only. The type of the Scope. - string type = 2; + string type = 2; // @gotags: `class:"public"` // Output only. The name of the Scope, if any. - string name = 3; + string name = 3; // @gotags: `class:"public"` // Output only. The description of the Scope, if any. - string description = 4; + string description = 4; // @gotags: `class:"public"` // Output only. The ID of the parent Scope, if any. This field will be empty if this is the "global" scope. - string parent_scope_id = 5 [json_name = "parent_scope_id"]; + string parent_scope_id = 5 [json_name = "parent_scope_id"]; // @gotags: `class:"public"` } // Scope contains all fields related to a Scope resource message Scope { // Output only. The ID of the Scope. - string id = 10; + string id = 10; // @gotags: `class:"public"` // The ID of the Scope this resource is in. If this is the "global" Scope this field will be empty. - string scope_id = 20 [json_name = "scope_id"]; + string scope_id = 20 [json_name = "scope_id"]; // @gotags: `class:"public"` // Output only. Scope information for this resource. ScopeInfo scope = 30; // Optional name for identification purposes. - google.protobuf.StringValue name = 40 [(custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = { this: "name" that: "name" }]; + google.protobuf.StringValue name = 40 [(custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = { this: "name" that: "name" }]; // @gotags: `class:"public"` // Optional user-set descripton for identification purposes. - google.protobuf.StringValue description = 50 [(custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = { this: "description" that: "description" }]; + google.protobuf.StringValue description = 50 + [(custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = { this: "description" that: "description" }]; // @gotags: `class:"public"` // Output only. The time this resource was created. - google.protobuf.Timestamp created_time = 60 [json_name = "created_time"]; + google.protobuf.Timestamp created_time = 60 [json_name = "created_time"]; // @gotags: `class:"public"` // Output only. The time this resource was last updated. - google.protobuf.Timestamp updated_time = 70 [json_name = "updated_time"]; + google.protobuf.Timestamp updated_time = 70 [json_name = "updated_time"]; // @gotags: `class:"public"` // Version is used in mutation requests, after the initial creation, to ensure this resource has not changed. // The mutation will fail if the version does not match the latest known good version. - uint32 version = 80; + uint32 version = 80; // @gotags: `class:"public"` // The type of the resource. - string type = 90; + string type = 90; // @gotags: `class:"public"` // The ID of the primary auth method for this scope. A primary auth method // is allowed to vivify users when new accounts are created and is the source for the users account info - google.protobuf.StringValue primary_auth_method_id = 100 - [json_name = "primary_auth_method_id", (custom_options.v1.generate_sdk_option) = true, (custom_options.v1.mask_mapping) = { this: "primary_auth_method_id" that: "PrimaryAuthMethodId" }]; + google.protobuf.StringValue primary_auth_method_id = 100 [ + json_name = "primary_auth_method_id", + (custom_options.v1.generate_sdk_option) = true, + (custom_options.v1.mask_mapping) = { this: "primary_auth_method_id" that: "PrimaryAuthMethodId" } + ]; // @gotags: `class:"public"` // Output only. The available actions on this resource for this user. - repeated string authorized_actions = 300 [json_name = "authorized_actions"]; + repeated string authorized_actions = 300 [json_name = "authorized_actions"]; // @gotags: `class:"public"` // Output only. The authorized actions for the scope's collections. map authorized_collection_actions = 310 [json_name = "authorized_collection_actions"]; diff --git a/internal/proto/local/controller/api/services/v1/auth_method_service.proto b/internal/proto/local/controller/api/services/v1/auth_method_service.proto index 0284b0574..c66e0ec96 100644 --- a/internal/proto/local/controller/api/services/v1/auth_method_service.proto +++ b/internal/proto/local/controller/api/services/v1/auth_method_service.proto @@ -200,14 +200,14 @@ message OidcTokenAttributes { message AuthenticateRequest { // The ID of the Auth Method in the system that should be used for authentication. - string auth_method_id = 1 [json_name = "auth_method_id"]; + string auth_method_id = 1 [json_name = "auth_method_id"]; // @gotags: `class:"public"` // This can be "cookie" or "token". If not provided, "token" will be used. "cookie" activates a split-cookie method where the token is split partially between http-only and regular cookies in order // to keep it safe from rogue JS in the browser. string token_type = 2 [json_name = "token_type"]; // Attributes are passed to the Auth Method; the valid keys and values depend on the type of Auth Method as well as the command. google.protobuf.Struct attributes = 4 [json_name = "attributes"]; // The command to perform. - string command = 5 [json_name = "command"]; + string command = 5 [json_name = "command"]; // @gotags: `class:"public"` // Deprecated fields reserved "credentials"; @@ -220,5 +220,5 @@ message AuthenticateResponse { // Valid keys and values depend on the type of Auth Method as well as the command. google.protobuf.Struct attributes = 4 [json_name = "attributes"]; // The command that was performed. - string command = 5 [json_name = "command"]; + string command = 5 [json_name = "command"]; // @gotags: `class:"public"` } diff --git a/internal/servers/common/handler.go b/internal/servers/common/handler.go index 53864388a..ffc42d614 100644 --- a/internal/servers/common/handler.go +++ b/internal/servers/common/handler.go @@ -216,7 +216,7 @@ func flushGatedEvents(ctx context.Context, method, url string, statusCode int, s if err != nil { return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write and flush observation event")) } - err = event.WriteAudit(ctx, "handler", event.WithFlush()) + err = event.WriteAudit(ctx, "handler", event.WithFlush(), event.WithResponse(&event.Response{StatusCode: statusCode})) if err != nil { return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write and flush audit event")) } diff --git a/internal/servers/common/handler_test.go b/internal/servers/common/handler_test.go index 449c261ec..ecd288035 100644 --- a/internal/servers/common/handler_test.go +++ b/internal/servers/common/handler_test.go @@ -332,9 +332,9 @@ func Test_WrapWithEventsHandler(t *testing.T) { Id: got.Data.(map[string]interface{})["request_info"].(map[string]interface{})["id"].(string), } hdr := map[string]interface{}{ - "id": got.Data.(map[string]interface{})["id"].(string), - "timestamp": got.Data.(map[string]interface{})["timestamp"].(string), - "serialized_hmac": got.Data.(map[string]interface{})["serialized_hmac"].(string), + "id": got.Data.(map[string]interface{})["id"].(string), + "timestamp": got.Data.(map[string]interface{})["timestamp"].(string), + "response": got.Data.(map[string]interface{})["response"].(map[string]interface{}), } wantJson := testJson(t, event.AuditType, &info, event.Op(tt.name), got, hdr, nil) assert.JSONEq(string(wantJson), string(actualJson)) diff --git a/internal/servers/controller/handlers/outgoing_interceptor.go b/internal/servers/controller/handlers/outgoing_interceptor.go index a97abfee9..2814c2b10 100644 --- a/internal/servers/controller/handlers/outgoing_interceptor.go +++ b/internal/servers/controller/handlers/outgoing_interceptor.go @@ -7,6 +7,7 @@ import ( "strings" pbs "github.com/hashicorp/boundary/internal/gen/controller/api/services" + "github.com/hashicorp/boundary/internal/observability/event" authtokenpb "github.com/hashicorp/boundary/sdk/pbs/controller/api/resources/authtokens" "google.golang.org/protobuf/proto" @@ -20,13 +21,21 @@ const ( statusField = "status" ) -func OutgoingInterceptor(_ context.Context, w http.ResponseWriter, m proto.Message) error { +func OutgoingInterceptor(ctx context.Context, w http.ResponseWriter, m proto.Message) error { + const op = "handlers.OutgoingInterceptor" m = m.ProtoReflect().Interface() if !m.ProtoReflect().IsValid() { // This would be the case if it's a nil pointer w.WriteHeader(http.StatusNoContent) return nil } + + // add the outgoing resp proto. See: common.flushGatedEvents is where the + // event.Response.StatusCode is added. + if err := event.WriteAudit(ctx, op, event.WithResponse(&event.Response{Details: m})); err != nil { + return fmt.Errorf("%s: unable to write audit event: %w", op, err) + } + switch m := m.(type) { case *pbs.AuthenticateResponse: if m.GetAttributes() == nil || m.GetAttributes().GetFields() == nil { diff --git a/sdk/go.mod b/sdk/go.mod index 46a26b3d1..30ef008c5 100644 --- a/sdk/go.mod +++ b/sdk/go.mod @@ -3,9 +3,35 @@ module github.com/hashicorp/boundary/sdk go 1.15 require ( + github.com/fatih/color v1.12.0 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/go-cmp v0.5.6 // indirect + github.com/hashicorp/eventlogger v0.1.0 + github.com/hashicorp/eventlogger/filters/encrypt v0.1.3 + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-kms-wrapping v0.6.6 + github.com/hashicorp/go-retryablehttp v0.7.0 // indirect github.com/hashicorp/go-secure-stdlib/configutil v0.1.2 github.com/hashicorp/go-secure-stdlib/strutil v0.1.1 + github.com/json-iterator/go v1.1.10 // indirect + github.com/kr/pretty v0.2.1 // indirect + github.com/mattn/go-isatty v0.0.13 // indirect + github.com/posener/complete v1.2.3 // indirect + github.com/smartystreets/assertions v1.0.0 // indirect + github.com/smartystreets/goconvey v1.6.4 // indirect + github.com/stretchr/objx v0.2.0 // indirect github.com/stretchr/testify v1.7.0 + go.opencensus.io v0.22.6 // indirect + golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect + golang.org/x/net v0.0.0-20210510120150-4163338589ed // indirect + golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93 // indirect + golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect + golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect + golang.org/x/tools v0.1.3 // indirect + google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6 // indirect + google.golang.org/grpc v1.38.0 // indirect google.golang.org/protobuf v1.27.1 + gopkg.in/ini.v1 v1.51.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/sdk/go.sum b/sdk/go.sum index 2d95fcea9..08db5d8e0 100644 --- a/sdk/go.sum +++ b/sdk/go.sum @@ -9,19 +9,29 @@ cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.56.0 h1:WRz29PgAsVEyPSDHyk+0fpEkwEFyfhHn+JbksT6gIL4= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v36.2.0+incompatible h1:09cv2WoH0g6jl6m2iT+R9qcIPZKhXEL0sbmLhxP895s= github.com/Azure/azure-sdk-for-go v36.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= @@ -98,6 +108,7 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= @@ -125,9 +136,11 @@ github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:Htrtb github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= +github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/frankban/quicktest v1.10.0 h1:Gfh+GAJZOAoKZsIZeZbdn2JF10kN1XHNvjsvQK8gVkE= github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= @@ -146,8 +159,9 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-test/deep v1.0.2 h1:onZX1rnHT3Wv6cqNgYyFOOlgVKJrksuCMCRvJStbMYw= github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho= +github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -162,11 +176,14 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -175,8 +192,10 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -185,16 +204,24 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= @@ -208,9 +235,14 @@ github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/eventlogger v0.1.0 h1:S6xc4gZVzewuDUP4R4Ngko419h/CGDuV/b4ADL3XLik= +github.com/hashicorp/eventlogger v0.1.0/go.mod h1:a3IXf1aEJfpCPzseTOrwKj4fVW/Qn3oEmpQeaIznzH0= +github.com/hashicorp/eventlogger/filters/encrypt v0.1.3 h1:RKYUGplnpDoE/Cj2vupQqUJS/wWBVvmpxEYeEpGL88s= +github.com/hashicorp/eventlogger/filters/encrypt v0.1.3/go.mod h1:8rcez7Kw1zanB0/074qnOuGu7zxmNh9Xr2ZI+K4xVIA= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= @@ -220,6 +252,7 @@ github.com/hashicorp/go-hclog v0.16.2 h1:K4ev2ib4LdQETX5cSZBG0DVLk1jwGqSPXBjdah3 github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-kms-wrapping v0.6.4/go.mod h1:pRK4UPSmNLEAjLE2qVz7nvS4NTZyyypQCn2G4q7vkps= github.com/hashicorp/go-kms-wrapping v0.6.5/go.mod h1:9aLqFi2fqK1WMCyTe9bVjB0X6XxCxD+oINL1ovxpgJE= github.com/hashicorp/go-kms-wrapping v0.6.6 h1:S2lw/8CFAw5kcztPD9iABG8ekjOs5san9C2oZrY6Syw= github.com/hashicorp/go-kms-wrapping v0.6.6/go.mod h1:9aLqFi2fqK1WMCyTe9bVjB0X6XxCxD+oINL1ovxpgJE= @@ -231,13 +264,16 @@ github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9 github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY= -github.com/hashicorp/go-retryablehttp v0.6.6 h1:HJunrbHTDDbBb/ay4kxa1n+dLmttUlnP3V9oNE4hmsM= github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.7.0 h1:eu1EI/mbirUgP5C8hVsTNaGZreBDlYiwC1FZWkvQPQ4= +github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-secure-stdlib/awsutil v0.1.1/go.mod h1:QRJZ7siKie+SZJB9jLbfKrs0Gd0yPWMtbneg0iU1PrY= github.com/hashicorp/go-secure-stdlib/awsutil v0.1.2 h1:AEcLbDoaRC9JMmtZXsuCykztH53rvHsQFnwhoKtpNQM= github.com/hashicorp/go-secure-stdlib/awsutil v0.1.2/go.mod h1:QRJZ7siKie+SZJB9jLbfKrs0Gd0yPWMtbneg0iU1PrY= +github.com/hashicorp/go-secure-stdlib/base62 v0.1.1/go.mod h1:EdWO6czbmthiwZ3/PUsDV+UD1D5IRU4ActiaWGwt0Yw= github.com/hashicorp/go-secure-stdlib/configutil v0.1.2 h1:ai0P91rxlyGWkYUH/zFr7mduW2Q+2FMrXawkLM8e7NU= github.com/hashicorp/go-secure-stdlib/configutil v0.1.2/go.mod h1:EN1DJMjv9y5e/uRAuP2WPibAox5KHEiq2BjZl00aNPQ= github.com/hashicorp/go-secure-stdlib/listenerutil v0.1.1 h1:HlTofNQN49DTzPCMVDppp+AVxMNVWaHUElpUYC0TRRE= @@ -284,8 +320,9 @@ github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2 github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= @@ -297,27 +334,31 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= +github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.2 h1:PvH+lL2B7IQ101xQL63Of8yFS2y+aDlsFcsqNc+u/Kw= github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4= -github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= @@ -327,8 +368,11 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -361,8 +405,9 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= @@ -380,6 +425,7 @@ github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= @@ -388,17 +434,20 @@ github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvH github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs= +github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -412,12 +461,20 @@ github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ github.com/yandex-cloud/go-genproto v0.0.0-20200722140432-762fe965ce77/go.mod h1:HEUYX/p8966tMUHHT+TsS0hF/Ca/NYwqprC5WXSDMfE= github.com/yandex-cloud/go-sdk v0.0.0-20200722140627-2194e5077f13/go.mod h1:LEdAMqa1v/7KYe4b13ALLkonuDxLph57ibUb50ctvJk= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.6 h1:BdkrbWrzDlV9dnbzoP7sfN+dHheJ4J9JOaYxcUDL+ok= +go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/goleak v1.0.0 h1:qsup4IcBdlmsnGfqyLl4Ntn3C2XCCuKAE7DwHpScyUo= +go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -427,8 +484,10 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -450,6 +509,7 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -458,6 +518,10 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -472,6 +536,7 @@ golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -480,16 +545,30 @@ golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210510120150-4163338589ed h1:p9UgmWI9wKpfYmgaV/IZKGdXc5qEK45tDwwwDyjS26I= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93 h1:alLDrZkL34Y2bnGHfvC1CYBRBXCXgx8AC2vY4MRtYX4= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -497,6 +576,9 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -526,20 +608,37 @@ golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -560,6 +659,7 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -574,11 +674,25 @@ golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.3 h1:L69ShwSZEyCsLKoAxDKeMvLDZkumEe8gXUZAjab0tX8= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -588,15 +702,21 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0 h1:cG03eaksBzhfSIk7JRGctfp3lanklcOM/mTGvow7BbQ= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -614,10 +734,21 @@ google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6 h1:4Xw2NwItrJOFR5s6PnK98PI6Bgw1LhMP1j/rO5WP0S4= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -630,8 +761,12 @@ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -640,8 +775,10 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= @@ -653,8 +790,9 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/ini.v1 v1.42.0 h1:7N3gPTt50s8GuLortA00n8AqRTk75qOP98+mTPpgzRk= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -664,10 +802,12 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -676,6 +816,8 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/sdk/pbs/controller/api/resources/authmethods/auth_method.pb.go b/sdk/pbs/controller/api/resources/authmethods/auth_method.pb.go index c5a8220a3..24176d980 100644 --- a/sdk/pbs/controller/api/resources/authmethods/auth_method.pb.go +++ b/sdk/pbs/controller/api/resources/authmethods/auth_method.pb.go @@ -32,31 +32,31 @@ type AuthMethod struct { unknownFields protoimpl.UnknownFields // Output only. The ID of the Auth Method. - Id string `protobuf:"bytes,10,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,10,opt,name=id,proto3" json:"id,omitempty" class:"public"` // @gotags: `class:"public"` // The ID of the Scope of which this Auth Method is a part. - ScopeId string `protobuf:"bytes,20,opt,name=scope_id,proto3" json:"scope_id,omitempty"` + ScopeId string `protobuf:"bytes,20,opt,name=scope_id,proto3" json:"scope_id,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. Scope information for this Auth method. - Scope *scopes.ScopeInfo `protobuf:"bytes,30,opt,name=scope,proto3" json:"scope,omitempty"` + Scope *scopes.ScopeInfo `protobuf:"bytes,30,opt,name=scope,proto3" json:"scope,omitempty" class:"public"` // @gotags: `class:"public"` // Optional name for identification purposes. - Name *wrapperspb.StringValue `protobuf:"bytes,40,opt,name=name,proto3" json:"name,omitempty"` + Name *wrapperspb.StringValue `protobuf:"bytes,40,opt,name=name,proto3" json:"name,omitempty" class:"public"` // @gotags: `class:"public"` // Optional user-set description for identification purposes. - Description *wrapperspb.StringValue `protobuf:"bytes,50,opt,name=description,proto3" json:"description,omitempty"` + Description *wrapperspb.StringValue `protobuf:"bytes,50,opt,name=description,proto3" json:"description,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The time this resource was created. - CreatedTime *timestamppb.Timestamp `protobuf:"bytes,60,opt,name=created_time,proto3" json:"created_time,omitempty"` + CreatedTime *timestamppb.Timestamp `protobuf:"bytes,60,opt,name=created_time,proto3" json:"created_time,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The time this resource was last updated. - UpdatedTime *timestamppb.Timestamp `protobuf:"bytes,70,opt,name=updated_time,proto3" json:"updated_time,omitempty"` + UpdatedTime *timestamppb.Timestamp `protobuf:"bytes,70,opt,name=updated_time,proto3" json:"updated_time,omitempty" class:"public"` // @gotags: `class:"public"` // Version is used in mutation requests, after the initial creation, to ensure this resource has not changed. // The mutation will fail if the version does not match the latest known good version. - Version uint32 `protobuf:"varint,80,opt,name=version,proto3" json:"version,omitempty"` + Version uint32 `protobuf:"varint,80,opt,name=version,proto3" json:"version,omitempty" class:"public"` // @gotags: `class:"public"` // The Auth Method type. - Type string `protobuf:"bytes,90,opt,name=type,proto3" json:"type,omitempty"` + Type string `protobuf:"bytes,90,opt,name=type,proto3" json:"type,omitempty" class:"public"` // @gotags: `class:"public"` // The attributes that are applicable for the specific Auth Method type. Attributes *structpb.Struct `protobuf:"bytes,100,opt,name=attributes,proto3" json:"attributes,omitempty"` // Output only. Whether this auth method is the primary auth method for it's scope. // To change this value update the primary_auth_method_id field on the scope. - IsPrimary bool `protobuf:"varint,110,opt,name=is_primary,proto3" json:"is_primary,omitempty"` + IsPrimary bool `protobuf:"varint,110,opt,name=is_primary,proto3" json:"is_primary,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The available actions on this resource for this user. - AuthorizedActions []string `protobuf:"bytes,300,rep,name=authorized_actions,proto3" json:"authorized_actions,omitempty"` + AuthorizedActions []string `protobuf:"bytes,300,rep,name=authorized_actions,proto3" json:"authorized_actions,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The authorized actions for the scope's collections. AuthorizedCollectionActions map[string]*structpb.ListValue `protobuf:"bytes,310,rep,name=authorized_collection_actions,proto3" json:"authorized_collection_actions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } diff --git a/sdk/pbs/controller/api/resources/authmethods/auth_method_taggable.go b/sdk/pbs/controller/api/resources/authmethods/auth_method_taggable.go new file mode 100644 index 000000000..26c729eac --- /dev/null +++ b/sdk/pbs/controller/api/resources/authmethods/auth_method_taggable.go @@ -0,0 +1,98 @@ +package authmethods + +import ( + "fmt" + + "github.com/hashicorp/eventlogger/filters/encrypt" +) + +// Tags implements the encrypt.Taggable interface which allows +// AuthMethod map fields to be classified for the encrypt filter. +func (req *AuthMethod) Tags() ([]encrypt.PointerTag, error) { + tags := make([]encrypt.PointerTag, 0, len(req.AuthorizedCollectionActions)) + for k := range req.AuthorizedCollectionActions { + tags = append(tags, encrypt.PointerTag{ + Pointer: fmt.Sprintf("/AuthorizedCollectionActions/%s", k), + Classification: encrypt.PublicClassification, + }) + } + if req.Attributes != nil { + switch req.Type { + case "oidc": + oidcTags := []encrypt.PointerTag{ + // public fields + { + Pointer: "/Attributes/Fields/state", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/issuer", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/client_id", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/client_secret_hmac", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/max_age", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/signing_algorithms", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/api_url_prefix", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/callback_url", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/allowed_audiences", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/claims_scopes", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/account_claim_maps", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/disable_discovered_config_validation", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/dry_run", + Classification: encrypt.PublicClassification, + }, + // secrets + { + Pointer: "/Attributes/Fields/client_secret", + Classification: encrypt.SecretClassification, + }, + } + tags = append(tags, oidcTags...) + case "password": + pwTags := []encrypt.PointerTag{ + { + Pointer: "/Attributes/Fields/min_login_name_length", + Classification: encrypt.PublicClassification, + }, + { + Pointer: "/Attributes/Fields/min_password_length", + Classification: encrypt.PublicClassification, + }, + } + tags = append(tags, pwTags...) + } + } + return tags, nil +} diff --git a/sdk/pbs/controller/api/resources/authmethods/auth_method_taggable_test.go b/sdk/pbs/controller/api/resources/authmethods/auth_method_taggable_test.go new file mode 100644 index 000000000..865deab88 --- /dev/null +++ b/sdk/pbs/controller/api/resources/authmethods/auth_method_taggable_test.go @@ -0,0 +1,183 @@ +package authmethods + +import ( + "context" + "encoding/json" + "testing" + "time" + + "github.com/hashicorp/boundary/sdk/wrapper" + "github.com/hashicorp/eventlogger" + "github.com/hashicorp/eventlogger/filters/encrypt" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" + "google.golang.org/protobuf/types/known/wrapperspb" +) + +func TestAuthMethod_Tags(t *testing.T) { + ctx := context.Background() + now := time.Now() + wrapper := wrapper.TestWrapper(t) + testEncryptingFilter := &encrypt.Filter{ + Wrapper: wrapper, + HmacSalt: []byte("salt"), + HmacInfo: []byte("info"), + } + + tests := []struct { + name string + testEvent *eventlogger.Event + wantEvent *eventlogger.Event + }{ + { + name: "validate-oidc-filtering", + testEvent: &eventlogger.Event{ + Type: "test", + CreatedAt: now, + Payload: &AuthMethod{ + Id: "id", + ScopeId: "scope-id", + Name: &wrapperspb.StringValue{Value: "name"}, + Description: &wrapperspb.StringValue{Value: "description"}, + Type: "oidc", + Attributes: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "state": structpb.NewStringValue("public-state"), + "issuer": structpb.NewStringValue("public-issuer"), + "client_id": structpb.NewStringValue("public-client_id"), + "client_secret_hmac": structpb.NewStringValue("public-client_secret_hmac"), + "max_age": structpb.NewStringValue("public-max_age"), + "signing_algorithms": structpb.NewStringValue("public-signing_algorithms"), + "api_url_prefix": structpb.NewStringValue("public-api_url_prefix"), + "callback_url": structpb.NewStringValue("public-callback_url"), + "allowed_audiences": structpb.NewStringValue("public-allowed_audiences"), + "claims_scopes": structpb.NewStringValue("public-claims_scopes"), + "account_claim_maps": structpb.NewStringValue("public-account_claim_maps"), + "disable_discovered_config_validation": structpb.NewStringValue("public-disable_discovered_config_validation"), + "dry_run": structpb.NewStringValue("public-dry_run"), + "client_secret": structpb.NewStringValue("secret-client_secret"), + }, + }, + AuthorizedActions: []string{"action-1", "action-2"}, + AuthorizedCollectionActions: map[string]*structpb.ListValue{ + "auth-methods": { + Values: []*structpb.Value{ + structpb.NewStringValue("create"), + structpb.NewStringValue("list"), + }, + }, + }, + }, + }, + wantEvent: &eventlogger.Event{ + Type: "test", + CreatedAt: now, + Payload: &AuthMethod{ + Id: "id", + ScopeId: "scope-id", + Name: &wrapperspb.StringValue{Value: "name"}, + Description: &wrapperspb.StringValue{Value: "description"}, + Type: "oidc", + Attributes: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "state": structpb.NewStringValue("public-state"), + "issuer": structpb.NewStringValue("public-issuer"), + "client_id": structpb.NewStringValue("public-client_id"), + "client_secret_hmac": structpb.NewStringValue("public-client_secret_hmac"), + "max_age": structpb.NewStringValue("public-max_age"), + "signing_algorithms": structpb.NewStringValue("public-signing_algorithms"), + "api_url_prefix": structpb.NewStringValue("public-api_url_prefix"), + "callback_url": structpb.NewStringValue("public-callback_url"), + "allowed_audiences": structpb.NewStringValue("public-allowed_audiences"), + "claims_scopes": structpb.NewStringValue("public-claims_scopes"), + "account_claim_maps": structpb.NewStringValue("public-account_claim_maps"), + "disable_discovered_config_validation": structpb.NewStringValue("public-disable_discovered_config_validation"), + "dry_run": structpb.NewStringValue("public-dry_run"), + "client_secret": structpb.NewStringValue(""), + }, + }, + AuthorizedActions: []string{"action-1", "action-2"}, + AuthorizedCollectionActions: map[string]*structpb.ListValue{ + "auth-methods": { + Values: []*structpb.Value{ + structpb.NewStringValue("create"), + structpb.NewStringValue("list"), + }, + }, + }, + }, + }, + }, + { + name: "validate-password-filtering", + testEvent: &eventlogger.Event{ + Type: "test", + CreatedAt: now, + Payload: &AuthMethod{ + Id: "id", + ScopeId: "scope-id", + Name: &wrapperspb.StringValue{Value: "name"}, + Description: &wrapperspb.StringValue{Value: "description"}, + Type: "oidc", + Attributes: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "min_login_name_length": structpb.NewStringValue("public-min_login_name_length"), + "min_password_length": structpb.NewStringValue("public-min_password_length"), + }, + }, + AuthorizedActions: []string{"action-1", "action-2"}, + AuthorizedCollectionActions: map[string]*structpb.ListValue{ + "auth-methods": { + Values: []*structpb.Value{ + structpb.NewStringValue("create"), + structpb.NewStringValue("list"), + }, + }, + }, + }, + }, + wantEvent: &eventlogger.Event{ + Type: "test", + CreatedAt: now, + Payload: &AuthMethod{ + Id: "id", + ScopeId: "scope-id", + Name: &wrapperspb.StringValue{Value: "name"}, + Description: &wrapperspb.StringValue{Value: "description"}, + Type: "oidc", + Attributes: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "min_login_name_length": structpb.NewStringValue("public-min_login_name_length"), + "min_password_length": structpb.NewStringValue("public-min_password_length"), + }, + }, + AuthorizedActions: []string{"action-1", "action-2"}, + AuthorizedCollectionActions: map[string]*structpb.ListValue{ + "auth-methods": { + Values: []*structpb.Value{ + structpb.NewStringValue("create"), + structpb.NewStringValue("list"), + }, + }, + }, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert, require := assert.New(t), require.New(t) + got, err := testEncryptingFilter.Process(ctx, tt.testEvent) + require.NoError(err) + require.NotNil(got) + actualJson, err := json.Marshal(got) + require.NoError(err) + t.Log(string(actualJson)) + + wantJson, err := json.Marshal(tt.wantEvent) + require.NoError(err) + assert.JSONEq(string(wantJson), string(actualJson)) + }) + } +} diff --git a/sdk/pbs/controller/api/resources/scopes/scope.pb.go b/sdk/pbs/controller/api/resources/scopes/scope.pb.go index f9765e66b..9cb8291b1 100644 --- a/sdk/pbs/controller/api/resources/scopes/scope.pb.go +++ b/sdk/pbs/controller/api/resources/scopes/scope.pb.go @@ -30,15 +30,15 @@ type ScopeInfo struct { unknownFields protoimpl.UnknownFields // Output only. The ID of the Scope. - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The type of the Scope. - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The name of the Scope, if any. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The description of the Scope, if any. - Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The ID of the parent Scope, if any. This field will be empty if this is the "global" scope. - ParentScopeId string `protobuf:"bytes,5,opt,name=parent_scope_id,proto3" json:"parent_scope_id,omitempty"` + ParentScopeId string `protobuf:"bytes,5,opt,name=parent_scope_id,proto3" json:"parent_scope_id,omitempty" class:"public"` // @gotags: `class:"public"` } func (x *ScopeInfo) Reset() { @@ -115,29 +115,29 @@ type Scope struct { unknownFields protoimpl.UnknownFields // Output only. The ID of the Scope. - Id string `protobuf:"bytes,10,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,10,opt,name=id,proto3" json:"id,omitempty" class:"public"` // @gotags: `class:"public"` // The ID of the Scope this resource is in. If this is the "global" Scope this field will be empty. - ScopeId string `protobuf:"bytes,20,opt,name=scope_id,proto3" json:"scope_id,omitempty"` + ScopeId string `protobuf:"bytes,20,opt,name=scope_id,proto3" json:"scope_id,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. Scope information for this resource. Scope *ScopeInfo `protobuf:"bytes,30,opt,name=scope,proto3" json:"scope,omitempty"` // Optional name for identification purposes. - Name *wrapperspb.StringValue `protobuf:"bytes,40,opt,name=name,proto3" json:"name,omitempty"` + Name *wrapperspb.StringValue `protobuf:"bytes,40,opt,name=name,proto3" json:"name,omitempty" class:"public"` // @gotags: `class:"public"` // Optional user-set descripton for identification purposes. - Description *wrapperspb.StringValue `protobuf:"bytes,50,opt,name=description,proto3" json:"description,omitempty"` + Description *wrapperspb.StringValue `protobuf:"bytes,50,opt,name=description,proto3" json:"description,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The time this resource was created. - CreatedTime *timestamppb.Timestamp `protobuf:"bytes,60,opt,name=created_time,proto3" json:"created_time,omitempty"` + CreatedTime *timestamppb.Timestamp `protobuf:"bytes,60,opt,name=created_time,proto3" json:"created_time,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The time this resource was last updated. - UpdatedTime *timestamppb.Timestamp `protobuf:"bytes,70,opt,name=updated_time,proto3" json:"updated_time,omitempty"` + UpdatedTime *timestamppb.Timestamp `protobuf:"bytes,70,opt,name=updated_time,proto3" json:"updated_time,omitempty" class:"public"` // @gotags: `class:"public"` // Version is used in mutation requests, after the initial creation, to ensure this resource has not changed. // The mutation will fail if the version does not match the latest known good version. - Version uint32 `protobuf:"varint,80,opt,name=version,proto3" json:"version,omitempty"` + Version uint32 `protobuf:"varint,80,opt,name=version,proto3" json:"version,omitempty" class:"public"` // @gotags: `class:"public"` // The type of the resource. - Type string `protobuf:"bytes,90,opt,name=type,proto3" json:"type,omitempty"` + Type string `protobuf:"bytes,90,opt,name=type,proto3" json:"type,omitempty" class:"public"` // @gotags: `class:"public"` // The ID of the primary auth method for this scope. A primary auth method // is allowed to vivify users when new accounts are created and is the source for the users account info - PrimaryAuthMethodId *wrapperspb.StringValue `protobuf:"bytes,100,opt,name=primary_auth_method_id,proto3" json:"primary_auth_method_id,omitempty"` + PrimaryAuthMethodId *wrapperspb.StringValue `protobuf:"bytes,100,opt,name=primary_auth_method_id,proto3" json:"primary_auth_method_id,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The available actions on this resource for this user. - AuthorizedActions []string `protobuf:"bytes,300,rep,name=authorized_actions,proto3" json:"authorized_actions,omitempty"` + AuthorizedActions []string `protobuf:"bytes,300,rep,name=authorized_actions,proto3" json:"authorized_actions,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The authorized actions for the scope's collections. AuthorizedCollectionActions map[string]*structpb.ListValue `protobuf:"bytes,310,rep,name=authorized_collection_actions,proto3" json:"authorized_collection_actions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } diff --git a/sdk/pbs/controller/api/resources/scopes/scope_taggable.go b/sdk/pbs/controller/api/resources/scopes/scope_taggable.go new file mode 100644 index 000000000..06271a2c4 --- /dev/null +++ b/sdk/pbs/controller/api/resources/scopes/scope_taggable.go @@ -0,0 +1,20 @@ +package scopes + +import ( + "fmt" + + "github.com/hashicorp/eventlogger/filters/encrypt" +) + +// Tags implements the encrypt.Taggable interface which allows +// Scope map fields to be classified for the encrypt filter. +func (req *Scope) Tags() ([]encrypt.PointerTag, error) { + tags := make([]encrypt.PointerTag, 0, len(req.AuthorizedCollectionActions)) + for k := range req.AuthorizedCollectionActions { + tags = append(tags, encrypt.PointerTag{ + Pointer: fmt.Sprintf("/AuthorizedCollectionActions/%s", k), + Classification: encrypt.PublicClassification, + }) + } + return tags, nil +} diff --git a/sdk/pbs/controller/api/resources/scopes/scope_taggable_test.go b/sdk/pbs/controller/api/resources/scopes/scope_taggable_test.go new file mode 100644 index 000000000..fdb31b0b8 --- /dev/null +++ b/sdk/pbs/controller/api/resources/scopes/scope_taggable_test.go @@ -0,0 +1,94 @@ +package scopes + +import ( + "context" + "encoding/json" + "testing" + "time" + + "github.com/hashicorp/boundary/sdk/wrapper" + "github.com/hashicorp/eventlogger" + "github.com/hashicorp/eventlogger/filters/encrypt" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" + "google.golang.org/protobuf/types/known/wrapperspb" +) + +func TestScope_Tags(t *testing.T) { + ctx := context.Background() + now := time.Now() + wrapper := wrapper.TestWrapper(t) + testEncryptingFilter := &encrypt.Filter{ + Wrapper: wrapper, + HmacSalt: []byte("salt"), + HmacInfo: []byte("info"), + } + + tests := []struct { + name string + testEvent *eventlogger.Event + wantEvent *eventlogger.Event + }{ + { + name: "validate-filtering", + testEvent: &eventlogger.Event{ + Type: "test", + CreatedAt: now, + Payload: &Scope{ + Id: "id", + ScopeId: "scope-id", + Name: &wrapperspb.StringValue{Value: "name"}, + Description: &wrapperspb.StringValue{Value: "description"}, + Type: "type", + PrimaryAuthMethodId: &wrapperspb.StringValue{Value: "primary-auth-method-id"}, + AuthorizedActions: []string{"action-1", "action-2"}, + AuthorizedCollectionActions: map[string]*structpb.ListValue{ + "auth-methods": { + Values: []*structpb.Value{ + structpb.NewStringValue("create"), + structpb.NewStringValue("list"), + }, + }, + }, + }, + }, + wantEvent: &eventlogger.Event{ + Type: "test", + CreatedAt: now, + Payload: &Scope{ + Id: "id", + ScopeId: "scope-id", + Name: &wrapperspb.StringValue{Value: "name"}, + Description: &wrapperspb.StringValue{Value: "description"}, + Type: "type", + PrimaryAuthMethodId: &wrapperspb.StringValue{Value: "primary-auth-method-id"}, + AuthorizedActions: []string{"action-1", "action-2"}, + AuthorizedCollectionActions: map[string]*structpb.ListValue{ + "auth-methods": { + Values: []*structpb.Value{ + structpb.NewStringValue("create"), + structpb.NewStringValue("list"), + }, + }, + }, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert, require := assert.New(t), require.New(t) + got, err := testEncryptingFilter.Process(ctx, tt.testEvent) + require.NoError(err) + require.NotNil(got) + actualJson, err := json.Marshal(got) + require.NoError(err) + t.Log(string(actualJson)) + + wantJson, err := json.Marshal(tt.wantEvent) + require.NoError(err) + assert.JSONEq(string(wantJson), string(actualJson)) + }) + } +} diff --git a/sdk/wrapper/testing.go b/sdk/wrapper/testing.go new file mode 100644 index 000000000..f44b2921d --- /dev/null +++ b/sdk/wrapper/testing.go @@ -0,0 +1,33 @@ +package wrapper + +import ( + "crypto/rand" + "encoding/base64" + "testing" + + wrapping "github.com/hashicorp/go-kms-wrapping" + "github.com/hashicorp/go-kms-wrapping/wrappers/aead" +) + +// TestWrapper initializes an AEAD wrapping.Wrapper for testing +func TestWrapper(t *testing.T) wrapping.Wrapper { + rootKey := make([]byte, 32) + n, err := rand.Read(rootKey) + if err != nil { + t.Fatal(err) + } + if n != 32 { + t.Fatal(n) + } + root := aead.NewWrapper(nil) + _, err = root.SetConfig(map[string]string{ + "key_id": base64.StdEncoding.EncodeToString(rootKey), + }) + if err != nil { + t.Fatal(err) + } + if err := root.SetAESGCMKeyBytes(rootKey); err != nil { + t.Fatal(err) + } + return root +} From ebb4d4e99f1a0ca1b81ec020ba8408fc556becf7 Mon Sep 17 00:00:00 2001 From: Alex Carpenter Date: Thu, 30 Sep 2021 13:54:51 -0400 Subject: [PATCH 14/18] [Assembly] homepage refresh (#1558) * Updates * Add section * Add section * Updates content * Adjust content * Update section * Content updates * Update icon directory * Update how it works title * Removes extra grid container * Adds lang attribute to document * Fix heading level usage * Content updates * Remove secure * Captialize works * Content update * Update use case links * Update background * CTA text * Convert ssh to svg * Convert to SVG * Coming soon to feature block --- .../branded-cta/branded-cta.module.css | 16 +- .../components/branded-cta/img/bg-pattern.svg | 1 - website/components/branded-cta/index.jsx | 1 + .../homepage-hero/HomepageHero.module.css | 4 +- .../components/how-boundary-works/index.jsx | 28 + .../how-boundary-works/style.module.css | 70 ++ .../how-it-works/feature/feature.module.css | 5 + .../components/how-it-works/feature/index.jsx | 2 +- .../how-it-works/feature/logo-list/index.jsx | 6 +- .../how-boundary-works-diagram.module.css | 200 +---- .../how-boundary-works-diagram/index.jsx | 717 +++++++++++------- .../how-it-works/how-it-works.module.css | 111 ++- website/components/how-it-works/index.jsx | 9 +- website/components/why-boundary/index.jsx | 22 + .../components/why-boundary/style.module.css | 33 + website/pages/_document.js | 2 +- website/pages/home/img/how-boundary-works.svg | 103 +++ website/pages/home/img/icons/activity.svg | 4 + website/pages/home/img/icons/code-white.svg | 4 + .../{features => icons}/config-as-code.svg | 0 .../identity-based-access.svg | 0 website/pages/home/img/icons/layers-white.svg | 4 + website/pages/home/img/icons/layers.svg | 5 + website/pages/home/img/icons/lock.svg | 5 + .../managing-dynamic-environments.svg | 0 .../platform-agnosticity.svg | 0 .../pages/home/img/icons/refresh-white.svg | 5 + .../session-management.svg | 0 .../session-visibility.svg | 0 website/pages/home/img/icons/star.svg | 4 + website/pages/home/img/icons/terminal.svg | 6 + website/pages/home/img/icons/user.svg | 5 + website/pages/home/img/logos/custom.svg | 6 + website/pages/home/img/logos/github-black.svg | 3 + website/pages/home/img/logos/mongo-db.svg | 29 + website/pages/home/img/logos/my-sql-color.svg | 5 + website/pages/home/img/logos/postgresql.png | Bin 0 -> 5924 bytes website/pages/home/img/logos/ssh.svg | 3 + website/pages/home/img/logos/unknown.svg | 4 + .../home/img/red-usecase-accessprivileges.png | Bin 24909 -> 0 bytes .../red-usecase-compliancewithoutoverhead.png | Bin 0 -> 31686 bytes .../home/img/red-usecase-integratedsystem.png | Bin 0 -> 22703 bytes .../img/red-usecase-sessionvisibility.png | Bin 31353 -> 0 bytes website/pages/home/index.jsx | 302 +++++--- website/pages/home/style.css | 16 +- website/public/img/cta-bg.svg | 22 + website/public/img/hero-pattern.svg | 57 +- 47 files changed, 1178 insertions(+), 641 deletions(-) delete mode 100644 website/components/branded-cta/img/bg-pattern.svg create mode 100644 website/components/how-boundary-works/index.jsx create mode 100644 website/components/how-boundary-works/style.module.css create mode 100644 website/components/why-boundary/index.jsx create mode 100644 website/components/why-boundary/style.module.css create mode 100644 website/pages/home/img/how-boundary-works.svg create mode 100644 website/pages/home/img/icons/activity.svg create mode 100644 website/pages/home/img/icons/code-white.svg rename website/pages/home/img/{features => icons}/config-as-code.svg (100%) rename website/pages/home/img/{features => icons}/identity-based-access.svg (100%) create mode 100644 website/pages/home/img/icons/layers-white.svg create mode 100644 website/pages/home/img/icons/layers.svg create mode 100644 website/pages/home/img/icons/lock.svg rename website/pages/home/img/{features => icons}/managing-dynamic-environments.svg (100%) rename website/pages/home/img/{features => icons}/platform-agnosticity.svg (100%) create mode 100644 website/pages/home/img/icons/refresh-white.svg rename website/pages/home/img/{features => icons}/session-management.svg (100%) rename website/pages/home/img/{features => icons}/session-visibility.svg (100%) create mode 100644 website/pages/home/img/icons/star.svg create mode 100644 website/pages/home/img/icons/terminal.svg create mode 100644 website/pages/home/img/icons/user.svg create mode 100644 website/pages/home/img/logos/custom.svg create mode 100644 website/pages/home/img/logos/github-black.svg create mode 100644 website/pages/home/img/logos/mongo-db.svg create mode 100644 website/pages/home/img/logos/my-sql-color.svg create mode 100644 website/pages/home/img/logos/postgresql.png create mode 100644 website/pages/home/img/logos/ssh.svg create mode 100644 website/pages/home/img/logos/unknown.svg delete mode 100644 website/pages/home/img/red-usecase-accessprivileges.png create mode 100644 website/pages/home/img/red-usecase-compliancewithoutoverhead.png create mode 100644 website/pages/home/img/red-usecase-integratedsystem.png delete mode 100644 website/pages/home/img/red-usecase-sessionvisibility.png create mode 100644 website/public/img/cta-bg.svg diff --git a/website/components/branded-cta/branded-cta.module.css b/website/components/branded-cta/branded-cta.module.css index 8a5a56de1..2ef985706 100644 --- a/website/components/branded-cta/branded-cta.module.css +++ b/website/components/branded-cta/branded-cta.module.css @@ -1,20 +1,16 @@ .brandedCta { padding: 88px 0; + background-image: url('/img/cta-bg.svg'); background-color: var(--boundary-secondary); - background-image: url('./img/bg-pattern.svg'); - background-position: bottom right; + background-position: bottom right -350px; background-repeat: no-repeat; - @media (--small) { - background-position: bottom 0 right -130px; + @media (--medium-up) { + background-position: bottom right -250px; } - @media (438px <= width < 600px) { - background-position: bottom 0 right -260px; - } - - @media (width < 438px) { - background-position: bottom 0 right -170px; + @media (--large) { + background-position: bottom right -150px; } } diff --git a/website/components/branded-cta/img/bg-pattern.svg b/website/components/branded-cta/img/bg-pattern.svg deleted file mode 100644 index ba1b8d186..000000000 --- a/website/components/branded-cta/img/bg-pattern.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/components/branded-cta/index.jsx b/website/components/branded-cta/index.jsx index 45153a47e..1d4318072 100644 --- a/website/components/branded-cta/index.jsx +++ b/website/components/branded-cta/index.jsx @@ -34,6 +34,7 @@ export default function BrandedCta({ heading, content, links }) { }} title={link.text} url={link.url} + icon={link.icon} /> ) })} diff --git a/website/components/homepage-hero/HomepageHero.module.css b/website/components/homepage-hero/HomepageHero.module.css index 1ff791961..9cc49d3e6 100644 --- a/website/components/homepage-hero/HomepageHero.module.css +++ b/website/components/homepage-hero/HomepageHero.module.css @@ -3,11 +3,11 @@ background-repeat: no-repeat; background-color: var(--boundary-secondary); background-image: url(/img/hero-pattern.svg); - background-position: bottom right; + background-position: bottom -50px right -100px; @media (max-width: 767px) { padding: 88px 0; - background-position: bottom 0 right -130px; + background-position: bottom -130px right -130px; } & :global(.g-hero) { diff --git a/website/components/how-boundary-works/index.jsx b/website/components/how-boundary-works/index.jsx new file mode 100644 index 000000000..8286c7f0a --- /dev/null +++ b/website/components/how-boundary-works/index.jsx @@ -0,0 +1,28 @@ +import s from './style.module.css' + +export default function HowBoundaryWorks({ heading, description, items, img }) { + return ( +
+
+
+

{heading}

+

{description}

+
    + {items.map((item, index) => { + // Index is stable + // eslint-disable-next-line react/no-array-index-key + return ( +
  • + {item} +
  • + ) + })} +
+
+
+ {img.alt} +
+
+
+ ) +} diff --git a/website/components/how-boundary-works/style.module.css b/website/components/how-boundary-works/style.module.css new file mode 100644 index 000000000..76d3e2c15 --- /dev/null +++ b/website/components/how-boundary-works/style.module.css @@ -0,0 +1,70 @@ +.root { + composes: g-grid-container from global; +} + +.inner { + --columns: 1; + + display: grid; + grid-template-columns: repeat(var(--columns), minmax(0, 1fr)); + grid-gap: 48px 32px; + padding: 48px 32px; + background-color: var(--white); + box-shadow: 0 8px 12px rgba(37, 38, 45, 0.08); + border-radius: 1px; + + @media (--medium-up) { + --columns: 2; + + padding: 100px 75px; + } +} + +.heading { + margin: 0; + composes: g-type-display-3 from global; +} + +.description { + margin: 32px 0 0; + composes: g-type-body-small from global; +} + +.items { + list-style: none; + margin: 15px 0 0; + padding: 0; +} + +.item { + position: relative; + display: flex; + align-items: center; + padding-top: 24px; + padding-bottom: 24px; + color: var(--gray-2); + composes: g-type-display-5 from global; + + &::before { + content: ''; + flex-shrink: 0; + display: block; + margin-right: 20px; + width: 8px; + height: 8px; + border-radius: 9999px; + background-color: #c4c4c4; + } + + & + .item { + border-top: 2px solid var(--gray-6); + } +} + +.media { + align-self: center; + justify-self: center; + & img { + max-width: 100%; + } +} diff --git a/website/components/how-it-works/feature/feature.module.css b/website/components/how-it-works/feature/feature.module.css index a3edf3dd7..b841a38b1 100644 --- a/website/components/how-it-works/feature/feature.module.css +++ b/website/components/how-it-works/feature/feature.module.css @@ -6,4 +6,9 @@ & > p { margin-bottom: 32px; } + + & a { + color: inherit; + text-decoration: underline; + } } diff --git a/website/components/how-it-works/feature/index.jsx b/website/components/how-it-works/feature/index.jsx index 43b0d195d..79e621c5e 100644 --- a/website/components/how-it-works/feature/index.jsx +++ b/website/components/how-it-works/feature/index.jsx @@ -18,7 +18,7 @@ export default function Feature({ return (
-

{title}

+

{title}

{description}

{logos ? : null}
diff --git a/website/components/how-it-works/feature/logo-list/index.jsx b/website/components/how-it-works/feature/logo-list/index.jsx index 5d354906c..2e2d284c6 100644 --- a/website/components/how-it-works/feature/logo-list/index.jsx +++ b/website/components/how-it-works/feature/logo-list/index.jsx @@ -9,14 +9,10 @@ export default function LogoList({ logos }) { // eslint-disable-next-line react/no-array-index-key key={stableIdx} > - {logo.alt} + {logo.alt} ))} - -

- Integrations coming soon -

) } diff --git a/website/components/how-it-works/how-boundary-works-diagram/how-boundary-works-diagram.module.css b/website/components/how-it-works/how-boundary-works-diagram/how-boundary-works-diagram.module.css index b621dd0ff..3cfa91d9e 100644 --- a/website/components/how-it-works/how-boundary-works-diagram/how-boundary-works-diagram.module.css +++ b/website/components/how-it-works/how-boundary-works-diagram/how-boundary-works-diagram.module.css @@ -1,190 +1,32 @@ .root { - --transition-time: 0.7s; + display: grid; @media (--medium-up) { position: sticky; top: calc(50vh - (249px)); } + & > * { + grid-area: 1 / 1; + opacity: 0; + transition: opacity ease-in 0.5s; + + &:last-child { + opacity: 1; + } + } + + @media (--medium-up) { + & > *:last-child { + opacity: 0; + } + + & > *.active { + opacity: 1; + } + } + & > svg { width: 100%; } - - & .boundaryLetter, - & .spacer, - & .iconBg { - fill: var(--white); - } - - & .iconLines, - & .iconBg { - stroke-linecap: round; - stroke-width: 1.5px; - stroke-linejoin: round; - } - - & .boundaryFill, - & .arrowHead { - fill: var(--boundary, #ec585d); - } - - & .arrowHead, - & .arrowSegment, - & .spacer { - transition: var(--transition-time) ease; - transition-property: opacity; - } - - & .arrowSegment { - stroke-width: 2px; - stroke: var(--boundary, #ec585d); - stroke-miterlimit: 10; - stroke-linecap: round; - fill: none; - } - - & .dropShadow { - opacity: 0.08; - mix-blend-mode: multiply; - } - - & .iconLines { - stroke: var(--white); - fill: none; - transition: var(--transition-time) ease; - transition-property: stroke; - } - - & .subtitle { - fill: #b6b8c3; - } - - & .iconBg { - stroke: #e5e6ec; - stroke-width: 1px; - transition: var(--transition-time) ease; - transition-property: fill, stroke; - } - - & .authenticate { - & .iconBg { - fill: var(--white); - } - - & .iconLines { - stroke: #e5e6ec; - stroke-width: 1px; - } - } - - & .authorize { - & .spacer { - opacity: 0; - } - - & .iconBg { - fill: var(--black); - stroke: var(--black); - } - - & .iconLines { - stroke: #e5e6ec; - } - } - - & .access { - & .spacer { - opacity: 0; - } - - & .iconBg { - fill: var(--black); - stroke: var(--black); - } - - & .vaultIcon { - fill: var(--white); - } - } - - & .hostsAndServices { - opacity: 1; - transform: translate(0, 0); - transition: var(--transition-time) ease; - transition-property: opacity, transform; - - & .leadingLine { - fill: none; - stroke-linecap: round; - stroke-miterlimit: 10; - stroke-width: 1.5px; - stroke: var(--black); - } - } - - & .arrowOne .arrowHead, - & .arrowTwo .arrowHead { - @media (--small) { - opacity: 0; - } - } - - & .inactive { - & .arrowHead, - & .arrowSegment, - & .spacer { - @media (--medium-up) { - opacity: 0; - } - } - - &.authorize { - & .spacer { - @media (--medium-up) { - opacity: 1; - } - } - - & .iconBg { - @media (--medium-up) { - fill: var(--white); - stroke: #e5e6ec; - } - } - - & .iconLines { - @media (--medium-up) { - stroke: #b6b8c3; - } - } - } - - &.access { - & .spacer { - @media (--medium-up) { - opacity: 1; - } - } - - & .iconBg { - @media (--medium-up) { - fill: var(--white); - stroke: var(--white); - } - } - - & .vaultIcon { - @media (--medium-up) { - fill: var(--black); - } - } - } - - &.hostsAndServices { - @media (--medium-up) { - opacity: 0; - transform: translate(0, 10px); - } - } - } } diff --git a/website/components/how-it-works/how-boundary-works-diagram/index.jsx b/website/components/how-it-works/how-boundary-works-diagram/index.jsx index c33faf3e2..04ead2f35 100644 --- a/website/components/how-it-works/how-boundary-works-diagram/index.jsx +++ b/website/components/how-it-works/how-boundary-works-diagram/index.jsx @@ -3,291 +3,442 @@ import classnames from 'classnames' export default function HowBoundaryWorksDiagram({ activeExampleIndex }) { return ( -
- - - - +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + - {/* Hosts & Services */} - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - {/* Top-right arrow segment, always active */} - - - {/* Arrow (Example 1) */} - - - - - - - {/* Arrow (Example 2) */} - - - - - - - - {/* Arrow (Example 3) */} - - - - - - - - {/* Boundary logo */} - - - - - - - - {/* Users */} - - - - - - - - - - {/* Authenticate */} - - - - - - - - - - - - - - {/* Authorize */} - - - - - - - - - - - {/* Access */} - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + +
) diff --git a/website/components/how-it-works/how-it-works.module.css b/website/components/how-it-works/how-it-works.module.css index 77dfc1a9c..89a190f4f 100644 --- a/website/components/how-it-works/how-it-works.module.css +++ b/website/components/how-it-works/how-it-works.module.css @@ -1,60 +1,89 @@ .root { - padding: 88px 0; + composes: g-grid-container from global; + padding-top: 88px; + padding-bottom: 88px; - & .headerWrapper { - & h2 { - text-align: center; - margin-top: 0; - margin-bottom: 32px; - @media (--small) { - margin-bottom: 0; - } - } + @media (--medium-up) { + padding-top: 160px; + padding-bottom: 160px; + } +} - & p { - max-width: 818px; - text-align: center; - margin-left: auto; - margin-right: auto; - color: var(--gray-2); - } +.intro { + --columns: 1; + + padding-top: 88px; + padding-bottom: 88px; + border-top: 1px solid var(--gray-6); + display: grid; + column-gap: 32px; + grid-template-columns: repeat(var(--columns), minmax(0, 1fr)); + row-gap: 32px; + + @media (--medium-up) { + --columns: 12; + + padding-top: 140px; + padding-bottom: 140px; + } +} + +.introTitle { + margin: 0; + grid-column: 1 / -1; + composes: g-type-display-2 from global; + + @media (--medium-up) { + grid-column: 1 / 6; + } +} + +.introDescription { + grid-column: 1 / -1; + composes: g-type-body-large from global; + + @media (--medium-up) { + grid-column: 7 / -1; + } + + & :first-child { + margin-top: 0; + } + + & :last-child { + margin-bottom: 0; } } .contentContainer { - display: flex; - justify-content: space-between; + --columns: 1; + position: relative; + display: grid; + grid-template-columns: repeat(var(--columns), minmax(0, 1fr)); + grid-gap: 32px; - @media (--small) { - flex-direction: column; - } - - & > ul { - max-width: 470px; - margin-left: 128px; - padding: 0; - - @media (width < 1120px) { - margin-left: 64px; - } - - @media (width < 1024px) { - margin-left: 40px; - } - - @media (--small) { - margin-left: 0; - } + @media (--medium-up) { + --columns: 12; } } .diagram { - width: 591px; - max-width: 100%; + grid-column: 1 / -1; + + @media (--medium-up) { + grid-column: 1 / 6; + } } .features { + padding: 0; + grid-column: 1 / -1; + + @media (--medium-up) { + grid-column: 7 / -1; + } + & > li { list-style: none; diff --git a/website/components/how-it-works/index.jsx b/website/components/how-it-works/index.jsx index 8ca3c736b..6bddfa0ed 100644 --- a/website/components/how-it-works/index.jsx +++ b/website/components/how-it-works/index.jsx @@ -1,5 +1,4 @@ import s from './how-it-works.module.css' -import classNames from 'classnames' import HowBoundaryWorksDiagram from './how-boundary-works-diagram' import Feature from './feature' import { useState } from 'react' @@ -12,11 +11,11 @@ export default function HowItWorks({ title, description, features }) { return (
-
-

{title}

-

{description}

+
+

{title}

+
{description}
-
+
diff --git a/website/components/why-boundary/index.jsx b/website/components/why-boundary/index.jsx new file mode 100644 index 000000000..68856c364 --- /dev/null +++ b/website/components/why-boundary/index.jsx @@ -0,0 +1,22 @@ +import s from './style.module.css' + +export default function WhyBoundary({ heading, items }) { + return ( +
+

{heading}

+
    + {items.map((item, index) => { + return ( + // Index is stable + // eslint-disable-next-line react/no-array-index-key +
  • + {item.heading} +

    {item.heading}

    +

    {item.description}

    +
  • + ) + })} +
+
+ ) +} diff --git a/website/components/why-boundary/style.module.css b/website/components/why-boundary/style.module.css new file mode 100644 index 000000000..06be9dcb4 --- /dev/null +++ b/website/components/why-boundary/style.module.css @@ -0,0 +1,33 @@ +.root { + composes: g-grid-container from global; +} + +.heading { + margin: 0; + composes: g-type-display-2 from global; +} + +.items { + --columns: 1; + + list-style: none; + padding: 0; + margin: 90px 0 0; + display: grid; + grid-template-columns: repeat(var(--columns), minmax(0, 1fr)); + grid-gap: 48px 32px; + + @media (--medium-up) { + --columns: 3; + } +} + +.itemHeading { + margin: 38px 0 0; + composes: g-type-display-4 from global; +} + +.itemDescription { + margin: 12px 0 0; + composes: g-type-body from global; +} diff --git a/website/pages/_document.js b/website/pages/_document.js index c96c2d8ff..9f061de14 100644 --- a/website/pages/_document.js +++ b/website/pages/_document.js @@ -9,7 +9,7 @@ export default class MyDocument extends Document { render() { return ( - + diff --git a/website/pages/home/img/how-boundary-works.svg b/website/pages/home/img/how-boundary-works.svg new file mode 100644 index 000000000..39a1539d0 --- /dev/null +++ b/website/pages/home/img/how-boundary-works.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/pages/home/img/icons/activity.svg b/website/pages/home/img/icons/activity.svg new file mode 100644 index 000000000..c55b7ef36 --- /dev/null +++ b/website/pages/home/img/icons/activity.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/website/pages/home/img/icons/code-white.svg b/website/pages/home/img/icons/code-white.svg new file mode 100644 index 000000000..d487e25ff --- /dev/null +++ b/website/pages/home/img/icons/code-white.svg @@ -0,0 +1,4 @@ + + + + diff --git a/website/pages/home/img/features/config-as-code.svg b/website/pages/home/img/icons/config-as-code.svg similarity index 100% rename from website/pages/home/img/features/config-as-code.svg rename to website/pages/home/img/icons/config-as-code.svg diff --git a/website/pages/home/img/features/identity-based-access.svg b/website/pages/home/img/icons/identity-based-access.svg similarity index 100% rename from website/pages/home/img/features/identity-based-access.svg rename to website/pages/home/img/icons/identity-based-access.svg diff --git a/website/pages/home/img/icons/layers-white.svg b/website/pages/home/img/icons/layers-white.svg new file mode 100644 index 000000000..a358a32d1 --- /dev/null +++ b/website/pages/home/img/icons/layers-white.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/website/pages/home/img/icons/layers.svg b/website/pages/home/img/icons/layers.svg new file mode 100644 index 000000000..b63c1eab4 --- /dev/null +++ b/website/pages/home/img/icons/layers.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/website/pages/home/img/icons/lock.svg b/website/pages/home/img/icons/lock.svg new file mode 100644 index 000000000..9c8aec7af --- /dev/null +++ b/website/pages/home/img/icons/lock.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/website/pages/home/img/features/managing-dynamic-environments.svg b/website/pages/home/img/icons/managing-dynamic-environments.svg similarity index 100% rename from website/pages/home/img/features/managing-dynamic-environments.svg rename to website/pages/home/img/icons/managing-dynamic-environments.svg diff --git a/website/pages/home/img/features/platform-agnosticity.svg b/website/pages/home/img/icons/platform-agnosticity.svg similarity index 100% rename from website/pages/home/img/features/platform-agnosticity.svg rename to website/pages/home/img/icons/platform-agnosticity.svg diff --git a/website/pages/home/img/icons/refresh-white.svg b/website/pages/home/img/icons/refresh-white.svg new file mode 100644 index 000000000..11c0ef427 --- /dev/null +++ b/website/pages/home/img/icons/refresh-white.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/website/pages/home/img/features/session-management.svg b/website/pages/home/img/icons/session-management.svg similarity index 100% rename from website/pages/home/img/features/session-management.svg rename to website/pages/home/img/icons/session-management.svg diff --git a/website/pages/home/img/features/session-visibility.svg b/website/pages/home/img/icons/session-visibility.svg similarity index 100% rename from website/pages/home/img/features/session-visibility.svg rename to website/pages/home/img/icons/session-visibility.svg diff --git a/website/pages/home/img/icons/star.svg b/website/pages/home/img/icons/star.svg new file mode 100644 index 000000000..131b23c0f --- /dev/null +++ b/website/pages/home/img/icons/star.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/website/pages/home/img/icons/terminal.svg b/website/pages/home/img/icons/terminal.svg new file mode 100644 index 000000000..4e096dc5b --- /dev/null +++ b/website/pages/home/img/icons/terminal.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/website/pages/home/img/icons/user.svg b/website/pages/home/img/icons/user.svg new file mode 100644 index 000000000..77adbbb1d --- /dev/null +++ b/website/pages/home/img/icons/user.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/website/pages/home/img/logos/custom.svg b/website/pages/home/img/logos/custom.svg new file mode 100644 index 000000000..ba422144c --- /dev/null +++ b/website/pages/home/img/logos/custom.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/website/pages/home/img/logos/github-black.svg b/website/pages/home/img/logos/github-black.svg new file mode 100644 index 000000000..ae48cb8c8 --- /dev/null +++ b/website/pages/home/img/logos/github-black.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/website/pages/home/img/logos/mongo-db.svg b/website/pages/home/img/logos/mongo-db.svg new file mode 100644 index 000000000..c86870e4e --- /dev/null +++ b/website/pages/home/img/logos/mongo-db.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/pages/home/img/logos/my-sql-color.svg b/website/pages/home/img/logos/my-sql-color.svg new file mode 100644 index 000000000..af973e341 --- /dev/null +++ b/website/pages/home/img/logos/my-sql-color.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/website/pages/home/img/logos/postgresql.png b/website/pages/home/img/logos/postgresql.png new file mode 100644 index 0000000000000000000000000000000000000000..21fc2eafabc59bdccdffb8f1f4c8b3e7b374e56c GIT binary patch literal 5924 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 + + \ No newline at end of file diff --git a/website/pages/home/img/logos/unknown.svg b/website/pages/home/img/logos/unknown.svg new file mode 100644 index 000000000..a76989238 --- /dev/null +++ b/website/pages/home/img/logos/unknown.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/website/pages/home/img/red-usecase-accessprivileges.png b/website/pages/home/img/red-usecase-accessprivileges.png deleted file mode 100644 index 511292dfe77afdae8318eb98de5981b487219a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24909 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 z 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 z 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 SuVMJ_-Bn*|DOD&~zW*OPO`g{P diff --git a/website/pages/home/img/red-usecase-compliancewithoutoverhead.png b/website/pages/home/img/red-usecase-compliancewithoutoverhead.png new file mode 100644 index 0000000000000000000000000000000000000000..c96c53bc675b348d047c36bd5ef6c03a00f32968 GIT binary patch literal 31686 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 literal 0 HcmV?d00001 diff --git a/website/pages/home/img/red-usecase-integratedsystem.png b/website/pages/home/img/red-usecase-integratedsystem.png new file mode 100644 index 0000000000000000000000000000000000000000..a46b4c62e7fa4d8791482aa51bc2a8b3394fc8a2 GIT binary patch literal 22703 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 Z{|9t5a;n^{v627)002ovPDHLkV1mOX=Vbr@ literal 0 HcmV?d00001 diff --git a/website/pages/home/img/red-usecase-sessionvisibility.png b/website/pages/home/img/red-usecase-sessionvisibility.png deleted file mode 100644 index a0cba5f6fe95d3322bcb384a1455d2cfe1333298..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31353 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

Yz3K$tvu|Gi; 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 diff --git a/website/pages/home/index.jsx b/website/pages/home/index.jsx index 5c0b5ff5c..e65e42e2e 100644 --- a/website/pages/home/index.jsx +++ b/website/pages/home/index.jsx @@ -1,7 +1,8 @@ import BrandedCta from 'components/branded-cta' import HomepageHero from 'components/homepage-hero' import HowItWorks from 'components/how-it-works' -import SectionBreakCta from 'components/section-break-cta' +import HowBoundaryWorks from 'components/how-boundary-works' +import WhyBoundary from 'components/why-boundary' import ProductFeaturesList from '@hashicorp/react-product-features-list' import UseCases from '@hashicorp/react-use-cases' @@ -44,21 +45,33 @@ export default function HomePage() { /> +

+ In the shift to the cloud, organizations need secure access to + targets beyond their own perimeter. +

+

+ Boundary provides a secure way to access hosts and critical + systems without having to manage credentials or expose your + network, and is entirely open source. +

+ + } features={[ { - title: 'Authenticate', + title: 'Authenticate & authorize', description: - 'Authenticate with any trusted identity provider you are already using. No need to distribute new credentials and manage them.', + 'Authenticate with any trusted identity provider you are already using and authorize access based on granular, logical roles and services.', logos: [ { alt: 'GitHub', - url: require('./img/logos/github-gray.svg?url'), + url: require('./img/logos/github-black.svg?url'), }, { alt: 'AWS', - url: require('./img/logos/aws-gray.svg?url'), + url: require('./img/logos/aws-color.svg?url'), }, { alt: 'Microsoft Azure', @@ -78,14 +91,14 @@ export default function HomePage() { }, { alt: 'More integrations', - url: require('./img/logos/more-gray.svg?url'), + url: require('./img/logos/custom.svg?url'), }, ], }, { - title: 'Authorize', + title: 'Connect', description: - 'Authorize access based on logical roles and services, instead of physical IP addresses. Manage dynamic infrastructure and integrate service registries so hosts and service catalogs are kept up-to-date.', + 'Manage dynamic infrastructure and integrate service registries so hosts and service catalogs are kept up-to-date.', logos: [ { alt: 'Consul', @@ -112,78 +125,102 @@ export default function HomePage() { url: require('./img/logos/kubernetes-color.svg?url'), }, { - url: require('./img/logos/more-gray.svg?url'), alt: 'More integrations', + url: require('./img/logos/custom.svg?url'), }, ], }, { title: 'Access', - description: - 'Automate credential injection to securely access services and hosts with HashiCorp Vault. Reduce risk of leaking credentials with dynamic secrets and just-in-time credentials.', + description: ( + <> + Reduce risk of leaking credentials with dynamic secrets and + just-in-time credentials. Automate credential injection to + securely access services and hosts with{' '} + + HashiCorp Vault + + . + + ), + logos: [ + { + alt: 'Postgresql', + url: require('./img/logos/postgresql.png?url'), + width: 36, + }, + { + alt: 'SSH', + url: require('./img/logos/ssh.svg?url'), + width: 42, + }, + { + alt: 'Mongo DB', + url: require('./img/logos/mongo-db.svg?url'), + }, + { + alt: 'AWS', + url: require('./img/logos/aws-color.svg?url'), + }, + { + alt: 'Unknown', + url: require('./img/logos/unknown.svg?url'), + }, + { + alt: 'MySQL', + url: require('./img/logos/my-sql-color.svg?url'), + }, + { + alt: 'More integrations', + url: require('./img/logos/custom.svg?url'), + }, + ], }, ]} /> -
-
-

Use cases

- -
-
+
+ +
-
- + -
+
+
+
+

Use cases

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/public/img/hero-pattern.svg b/website/public/img/hero-pattern.svg index 2fadb6b29..0f266be7b 100644 --- a/website/public/img/hero-pattern.svg +++ b/website/public/img/hero-pattern.svg @@ -1 +1,56 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 291d80136c4cd535b5a7c7e8bcd0846ec53171ed Mon Sep 17 00:00:00 2001 From: jweissig Date: Fri, 1 Oct 2021 10:19:48 -0700 Subject: [PATCH 15/18] website: fix wording (#1572) Minor wording tweak. --- website/pages/home/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/pages/home/index.jsx b/website/pages/home/index.jsx index e65e42e2e..9255356a3 100644 --- a/website/pages/home/index.jsx +++ b/website/pages/home/index.jsx @@ -135,7 +135,7 @@ export default function HomePage() { description: ( <> Reduce risk of leaking credentials with dynamic secrets and - just-in-time credentials. Automate credential injection to + just-in-time credentials. Automate credential brokering to securely access services and hosts with{' '} HashiCorp Vault From 50ad0f9396315cbdaae8b1ca61c2068629189cdc Mon Sep 17 00:00:00 2001 From: Jimmy Merritello <7191639+jmfury@users.noreply.github.com> Date: Sat, 2 Oct 2021 17:00:02 -0500 Subject: [PATCH 16/18] Fix broken downloads link url (#1575) --- website/pages/home/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/pages/home/index.jsx b/website/pages/home/index.jsx index 9255356a3..7d446f624 100644 --- a/website/pages/home/index.jsx +++ b/website/pages/home/index.jsx @@ -349,7 +349,7 @@ export default function HomePage() { links={[ { text: 'Download', - url: '/download', + url: '/downloads', type: 'download', icon: { position: 'right', isAnimated: true }, }, From 2ee2c50ba3ebf05557d022f197d6e6831e224743 Mon Sep 17 00:00:00 2001 From: Jim Date: Mon, 4 Oct 2021 13:37:07 -0400 Subject: [PATCH 17/18] fix (Makefile): Add proper comment delimiter (#1577) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 37500b858..14187654c 100644 --- a/Makefile +++ b/Makefile @@ -138,7 +138,7 @@ protobuild: @protoc-go-inject-tag -input=./internal/credential/vault/store/vault.pb.go @protoc-go-inject-tag -input=./internal/servers/servers.pb.go - // inject classification tags (see: https://github.com/hashicorp/go-eventlogger/tree/main/filters/encrypt) + # inject classification tags (see: https://github.com/hashicorp/go-eventlogger/tree/main/filters/encrypt) @protoc-go-inject-tag -input=./internal/gen/controller/api/services/auth_method_service.pb.go @protoc-go-inject-tag -input=./sdk/pbs/controller/api/resources/authmethods/auth_method.pb.go @protoc-go-inject-tag -input=./sdk/pbs/controller/api/resources/scopes/scope.pb.go From 111f3906e8b2ade71afaed949c6eb1a522061a2e Mon Sep 17 00:00:00 2001 From: Timothy Messier Date: Tue, 5 Oct 2021 15:15:08 -0400 Subject: [PATCH 18/18] ci: Consolidate some circle configuration with executors (#1578) --- .circleci/config.yml | 16 ++++++++++------ .circleci/config/executors/@executors.yml | 10 ++++++++++ .circleci/config/jobs/build.yml | 5 +---- .circleci/config/jobs/test-sql.yml | 4 +--- .../config/workflows/{default.yml => ci.yml} | 0 5 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 .circleci/config/executors/@executors.yml rename .circleci/config/workflows/{default.yml => ci.yml} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 94cbfd7b4..54e711bdd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,13 +8,14 @@ jobs: test-sql-13-alpine: machine: image: ubuntu-2004:202107-02 + resource_class: medium + working_directory: ~/boundary steps: - checkout - run: command: | make test-sql POSTGRES_DOCKER_IMAGE_BASE=docker.mirror.hashicorp.services/postgres PG_DOCKER_TAG=13-alpine name: Run SQL PgTap Tests - working_directory: ~/boundary bundle-releases: docker: - image: docker.mirror.hashicorp.services/circleci/buildpack-deps @@ -250,13 +251,14 @@ jobs: test-sql-11-alpine: machine: image: ubuntu-2004:202107-02 + resource_class: medium + working_directory: ~/boundary steps: - checkout - run: command: | make test-sql POSTGRES_DOCKER_IMAGE_BASE=docker.mirror.hashicorp.services/postgres PG_DOCKER_TAG=11-alpine name: Run SQL PgTap Tests - working_directory: ~/boundary build-common-layers: machine: image: ubuntu-1604:202007-01 @@ -888,13 +890,14 @@ jobs: test-sql-12-alpine: machine: image: ubuntu-2004:202107-02 + resource_class: medium + working_directory: ~/boundary steps: - checkout - run: command: | make test-sql POSTGRES_DOCKER_IMAGE_BASE=docker.mirror.hashicorp.services/postgres PG_DOCKER_TAG=12-alpine name: Run SQL PgTap Tests - working_directory: ~/boundary solaris_amd64_package: docker: - image: docker.mirror.hashicorp.services/circleci/buildpack-deps @@ -971,6 +974,7 @@ jobs: machine: image: ubuntu-2004:202107-02 resource_class: large + working_directory: ~/boundary steps: - checkout - run: @@ -1116,7 +1120,6 @@ jobs: name: Slack - Sending Status Alert shell: /bin/bash when: always - working_directory: ~/boundary netbsd_amd64_package: docker: - image: docker.mirror.hashicorp.services/circleci/buildpack-deps @@ -1480,13 +1483,14 @@ jobs: test-sql-latest: machine: image: ubuntu-2004:202107-02 + resource_class: medium + working_directory: ~/boundary steps: - checkout - run: command: | make test-sql POSTGRES_DOCKER_IMAGE_BASE=docker.mirror.hashicorp.services/postgres PG_DOCKER_TAG=latest name: Run SQL PgTap Tests - working_directory: ~/boundary workflows: build-645fb387fb0a87de: jobs: @@ -1553,7 +1557,7 @@ workflows: - windows_amd64_package: requires: - build-common-layers - default: + ci: jobs: - build - test-sql-latest diff --git a/.circleci/config/executors/@executors.yml b/.circleci/config/executors/@executors.yml new file mode 100644 index 000000000..7e95bd3c5 --- /dev/null +++ b/.circleci/config/executors/@executors.yml @@ -0,0 +1,10 @@ +go-machine: + machine: + image: 'ubuntu-2004:202107-02' + resource_class: large + working_directory: ~/boundary +go-machine-medium: + machine: + image: 'ubuntu-2004:202107-02' + resource_class: medium + working_directory: ~/boundary diff --git a/.circleci/config/jobs/build.yml b/.circleci/config/jobs/build.yml index 87a76947a..9efbe0e0c 100644 --- a/.circleci/config/jobs/build.yml +++ b/.circleci/config/jobs/build.yml @@ -1,7 +1,4 @@ -resource_class: large -machine: - image: 'ubuntu-2004:202107-02' -working_directory: ~/boundary +executor: go-machine steps: - checkout - run: diff --git a/.circleci/config/jobs/test-sql.yml b/.circleci/config/jobs/test-sql.yml index f82933aa1..671be2394 100644 --- a/.circleci/config/jobs/test-sql.yml +++ b/.circleci/config/jobs/test-sql.yml @@ -1,6 +1,4 @@ -machine: - image: 'ubuntu-2004:202107-02' -working_directory: ~/boundary +executor: go-machine-medium parameters: postgres-version: type: string diff --git a/.circleci/config/workflows/default.yml b/.circleci/config/workflows/ci.yml similarity index 100% rename from .circleci/config/workflows/default.yml rename to .circleci/config/workflows/ci.yml