From d088f9d74c7568dd896425b486114612fdbbe7a8 Mon Sep 17 00:00:00 2001 From: derailed Date: Sun, 19 Jan 2025 09:54:20 -0700 Subject: [PATCH 1/9] misc cleanups --- internal/config/data/helpers.go | 10 ------- internal/config/data/helpers_test.go | 3 ++- internal/config/data/ns.go | 5 ++-- internal/config/helpers.go | 13 --------- internal/config/helpers_test.go | 40 ---------------------------- internal/view/dir.go | 4 +-- 6 files changed, 7 insertions(+), 68 deletions(-) delete mode 100644 internal/config/helpers_test.go diff --git a/internal/config/data/helpers.go b/internal/config/data/helpers.go index de2d7c7c1b..bff321a0ff 100644 --- a/internal/config/data/helpers.go +++ b/internal/config/data/helpers.go @@ -45,16 +45,6 @@ func defaultFGNodeShell() bool { return false } -// InList check if string is in a collection of strings. -func InList(ll []string, n string) bool { - for _, l := range ll { - if l == n { - return true - } - } - return false -} - // EnsureDirPath ensures a directory exist from the given path. func EnsureDirPath(path string, mod os.FileMode) error { return EnsureFullPath(filepath.Dir(path), mod) diff --git a/internal/config/data/helpers_test.go b/internal/config/data/helpers_test.go index db95f28af1..1c6db37e21 100644 --- a/internal/config/data/helpers_test.go +++ b/internal/config/data/helpers_test.go @@ -6,6 +6,7 @@ package data_test import ( "os" "path/filepath" + "slices" "testing" "github.com/derailed/k9s/internal/config/data" @@ -57,7 +58,7 @@ func TestHelperInList(t *testing.T) { } for _, u := range uu { - assert.Equal(t, u.expected, data.InList(u.list, u.item)) + assert.Equal(t, u.expected, slices.Contains(u.list, u.item)) } } diff --git a/internal/config/data/ns.go b/internal/config/data/ns.go index 8702e88cae..9b0d5ebf17 100644 --- a/internal/config/data/ns.go +++ b/internal/config/data/ns.go @@ -4,6 +4,7 @@ package data import ( + "slices" "sync" "github.com/derailed/k9s/internal/client" @@ -47,7 +48,7 @@ func (n *Namespace) merge(old *Namespace) { return } for _, fav := range old.Favorites { - if InList(n.Favorites, fav) { + if slices.Contains(n.Favorites, fav) { continue } n.Favorites = append(n.Favorites, fav) @@ -100,7 +101,7 @@ func (n *Namespace) isAllNamespaces() bool { } func (n *Namespace) addFavNS(ns string) { - if InList(n.Favorites, ns) { + if slices.Contains(n.Favorites, ns) { return } diff --git a/internal/config/helpers.go b/internal/config/helpers.go index 53627cfa79..165885d288 100644 --- a/internal/config/helpers.go +++ b/internal/config/helpers.go @@ -8,9 +8,7 @@ import ( "os/user" "path/filepath" - "github.com/derailed/k9s/internal/config/data" "github.com/rs/zerolog/log" - v1 "k8s.io/api/core/v1" ) // IsBoolSet checks if a bool ptr is set. @@ -44,17 +42,6 @@ func UserTmpDir() (string, error) { return dir, nil } -// InNSList check if ns is in an ns collection. -func InNSList(nn []interface{}, ns string) bool { - ss := make([]string, len(nn)) - for i, n := range nn { - if nsp, ok := n.(v1.Namespace); ok { - ss[i] = nsp.Name - } - } - return data.InList(ss, ns) -} - // MustK9sUser establishes current user identity or fail. func MustK9sUser() string { usr, err := user.Current() diff --git a/internal/config/helpers_test.go b/internal/config/helpers_test.go deleted file mode 100644 index 2c29e2d8d1..0000000000 --- a/internal/config/helpers_test.go +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright Authors of K9s - -package config_test - -import ( - "testing" - - "github.com/derailed/k9s/internal/config" - "github.com/stretchr/testify/assert" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -func TestHelperInNSList(t *testing.T) { - uu := []struct { - item string - list []interface{} - expected bool - }{ - { - "fred", - []interface{}{ - v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "fred"}}, - }, - true, - }, - { - "blee", - []interface{}{ - v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "fred"}}, - }, - false, - }, - } - - for _, u := range uu { - assert.Equal(t, u.expected, config.InNSList(u.list, u.item)) - } -} diff --git a/internal/view/dir.go b/internal/view/dir.go index bb34f682d9..b45bfb26be 100644 --- a/internal/view/dir.go +++ b/internal/view/dir.go @@ -8,11 +8,11 @@ import ( "fmt" "os" "path" + "slices" "strings" "github.com/derailed/k9s/internal" "github.com/derailed/k9s/internal/client" - "github.com/derailed/k9s/internal/config/data" "github.com/derailed/k9s/internal/ui" "github.com/derailed/k9s/internal/ui/dialog" "github.com/derailed/tcell/v2" @@ -173,7 +173,7 @@ func isKustomized(sel string) bool { } kk := []string{kustomizeNoExt, kustomizeYAML, kustomizeYML} for _, f := range ff { - if data.InList(kk, f.Name()) { + if slices.Contains(kk, f.Name()) { return true } } From 009fb1e95dba4868bc4eb1eee4ea11290958b785 Mon Sep 17 00:00:00 2001 From: derailed Date: Sat, 1 Feb 2025 08:57:07 -0700 Subject: [PATCH 2/9] update vul scans --- go.mod | 54 +----- go.sum | 393 ---------------------------------------- internal/vul/scanner.go | 3 +- 3 files changed, 3 insertions(+), 447 deletions(-) diff --git a/go.mod b/go.mod index 042d69f8d8..7238ead1b2 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,7 @@ go 1.23.2 require ( github.com/adrg/xdg v0.5.3 - github.com/anchore/clio v0.0.0-20241115144204-29e89f9fa837 github.com/anchore/grype v0.86.1 - github.com/anchore/syft v1.19.0 github.com/atotto/clipboard v0.1.4 github.com/cenkalti/backoff/v4 v4.3.0 github.com/derailed/popeye v0.11.3 @@ -42,14 +40,6 @@ require ( ) require ( - cel.dev/expr v0.18.0 // indirect - cloud.google.com/go v0.116.0 // indirect - cloud.google.com/go/auth v0.13.0 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.6 // indirect - cloud.google.com/go/compute/metadata v0.6.0 // indirect - cloud.google.com/go/iam v1.2.2 // indirect - cloud.google.com/go/monitoring v1.21.2 // indirect - cloud.google.com/go/storage v1.49.0 // indirect dario.cat/mergo v1.0.1 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 // indirect @@ -57,9 +47,6 @@ require ( github.com/BurntSushi/toml v1.4.0 // indirect github.com/CycloneDX/cyclonedx-go v0.9.2 // indirect github.com/DataDog/zstd v1.5.5 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect @@ -68,11 +55,11 @@ require ( github.com/Masterminds/squirrel v1.5.4 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Microsoft/hcsshim v0.11.7 // indirect - github.com/OneOfOne/xxhash v1.2.8 // indirect github.com/ProtonMail/go-crypto v1.1.3 // indirect github.com/acobaugh/osrelease v0.1.0 // indirect github.com/agext/levenshtein v1.2.1 // indirect github.com/anchore/archiver/v3 v3.5.3-0.20241210171143-5b1d8d1c7c51 // indirect + github.com/anchore/clio v0.0.0-20241115144204-29e89f9fa837 // indirect github.com/anchore/fangs v0.0.0-20241014225144-4e1713cafd77 // indirect github.com/anchore/go-collections v0.0.0-20240216171411-9321230ce537 // indirect github.com/anchore/go-logger v0.0.0-20230725134548-c21dafa1ec5a // indirect @@ -81,26 +68,23 @@ require ( github.com/anchore/go-version v1.2.2-0.20210903204242-51efa5b487c4 // indirect github.com/anchore/packageurl-go v0.1.1-0.20250117185454-edf36a908b10 // indirect github.com/anchore/stereoscope v0.0.13 // indirect + github.com/anchore/syft v1.19.0 // indirect github.com/andybalholm/brotli v1.1.1 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/aquasecurity/go-pep440-version v0.0.1 // indirect github.com/aquasecurity/go-version v0.0.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go v1.44.288 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/becheran/wildmatch-go v1.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/bmatcuk/doublestar/v2 v2.0.4 // indirect github.com/bmatcuk/doublestar/v4 v4.8.0 // indirect - github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect github.com/charmbracelet/lipgloss v1.0.0 // indirect github.com/charmbracelet/x/ansi v0.4.5 // indirect github.com/cloudflare/circl v1.3.8 // indirect - github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/containerd/containerd v1.7.24 // indirect github.com/containerd/containerd/api v1.7.19 // indirect @@ -130,8 +114,6 @@ require ( github.com/elliotchance/phpserialize v1.4.0 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/envoyproxy/go-control-plane v0.13.1 // indirect - github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect github.com/evanphx/json-patch v5.9.0+incompatible // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/facebookincubator/nvdtools v0.1.5 // indirect @@ -142,8 +124,6 @@ require ( github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gdamore/encoding v1.0.1 // indirect github.com/github/go-spdx/v2 v2.3.2 // indirect - github.com/glebarez/go-sqlite v1.21.2 // indirect - github.com/glebarez/sqlite v1.11.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-git/go-git/v5 v5.13.1 // indirect @@ -154,7 +134,6 @@ require ( github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/go-restruct/restruct v1.2.0-alpha // indirect - github.com/go-test/deep v1.1.1 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -167,22 +146,15 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/google/licensecheck v0.3.1 // indirect github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect - github.com/google/s2a-go v0.1.8 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect - github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/gookit/color v1.5.4 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/gosuri/uitable v0.0.4 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect - github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b // indirect github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.6 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl/v2 v2.23.0 // indirect @@ -191,9 +163,6 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jinzhu/copier v0.4.0 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.5 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmoiron/sqlx v1.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -218,7 +187,6 @@ require ( github.com/microsoft/go-rustaudit v0.0.0-20220730194248-4b17361d90a5 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -238,7 +206,6 @@ require ( github.com/muesli/termenv v0.15.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect - github.com/ncruces/go-strftime v0.1.9 // indirect github.com/nwaples/rardecode v1.1.3 // indirect github.com/onsi/ginkgo v1.16.5 // indirect github.com/onsi/gomega v1.35.1 // indirect @@ -246,9 +213,6 @@ require ( github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runtime-spec v1.1.0 // indirect github.com/opencontainers/selinux v1.11.0 // indirect - github.com/openvex/go-vex v0.2.5 // indirect - github.com/owenrumney/go-sarif v1.1.2-0.20231003122901-1000f5e05554 // indirect - github.com/package-url/packageurl-go v0.1.1 // indirect github.com/pborman/indent v1.2.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect @@ -257,13 +221,11 @@ require ( github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pkg/profile v1.7.0 // indirect - github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.19.1 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rubenv/sql-migrate v1.7.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -293,7 +255,6 @@ require ( github.com/vbatts/tar-split v0.11.6 // indirect github.com/vifraa/gopom v1.0.0 // indirect github.com/wagoodman/go-partybus v0.0.0-20230516145632-8ccac152c651 // indirect - github.com/wagoodman/go-presenter v0.0.0-20211015174752-f9c01afc824b // indirect github.com/wagoodman/go-progress v0.0.0-20230925121702-07e42b3cdba0 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect @@ -305,13 +266,9 @@ require ( github.com/zclconf/go-cty v1.14.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.29.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect go.opentelemetry.io/otel v1.33.0 // indirect go.opentelemetry.io/otel/metric v1.33.0 // indirect - go.opentelemetry.io/otel/sdk v1.33.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.29.0 // indirect go.opentelemetry.io/otel/trace v1.33.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.32.0 // indirect @@ -325,9 +282,7 @@ require ( golang.org/x/time v0.8.0 // indirect golang.org/x/tools v0.29.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/api v0.215.0 // indirect google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8 // indirect google.golang.org/grpc v1.67.3 // indirect google.golang.org/protobuf v1.36.3 // indirect @@ -335,15 +290,10 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - gorm.io/gorm v1.25.12 // indirect k8s.io/apiserver v0.32.1 // indirect k8s.io/component-base v0.32.1 // indirect k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect - modernc.org/libc v1.55.3 // indirect - modernc.org/mathutil v1.6.0 // indirect - modernc.org/memory v1.8.0 // indirect - modernc.org/sqlite v1.34.5 // indirect oras.land/oras-go v1.2.5 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/kustomize/api v0.18.0 // indirect diff --git a/go.sum b/go.sum index 89ee0f95c4..6b9d091072 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -cel.dev/expr v0.18.0 h1:CJ6drgk+Hf96lkLikr4rFf19WrU0BOWEihyZnI2TAzo= -cel.dev/expr v0.18.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -29,175 +27,24 @@ cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= -cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/auth v0.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs= -cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q= -cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU= -cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= 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/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= -cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= 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/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= -cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= -cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= -cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= -cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= -cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= 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/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= 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= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.49.0 h1:zenOPBOWHCnojRd9aJZAyQXBYqkJkdQS42dxL55CIMw= -cloud.google.com/go/storage v1.49.0/go.mod h1:k1eHhhpLvrPjVGfo0mOUPEJ4Y2+a/Hv5PiwehZI9qGU= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= -cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -221,14 +68,6 @@ github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1 h1:oTX4vsorBZo/Zdum6OKPA4o7544hm6smoRv1QjpTwGo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1/go.mod h1:0wEl7vrAD8mehJyohS9HZy+WyEOaQO2mJx86Cvh93kM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= @@ -312,9 +151,6 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3d github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= -github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.44.288 h1:Ln7fIao/nl0ACtelgR1I4AiEw/GLNkKcXfCaHupUW5Q= -github.com/aws/aws-sdk-go v1.44.288/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/becheran/wildmatch-go v1.0.0 h1:mE3dGGkTmpKtT4Z+88t8RStG40yN9T+kFEGj2PZFSzA= @@ -323,8 +159,6 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= @@ -346,8 +180,6 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3 github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -365,7 +197,6 @@ github.com/charmbracelet/x/ansi v0.4.5 h1:LqK4vwBNaXw2AyGIICa5/29Sbdq58GbGdFngSe github.com/charmbracelet/x/ansi v0.4.5/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= -github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -384,8 +215,6 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= -github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/containerd/containerd v1.7.24 h1:zxszGrGjrra1yYJW/6rhm9cJ1ZQ8rkKBR48brqsa7nA= @@ -477,13 +306,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE= -github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= -github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= -github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= @@ -526,16 +350,8 @@ github.com/gdamore/encoding v1.0.1/go.mod h1:0Z0cMFinngz9kS1QfMjCP8TY7em3bZYeekl github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/github/go-spdx/v2 v2.3.2 h1:IfdyNHTqzs4zAJjXdVQfRnxt1XMfycXoHBE2Vsm1bjs= github.com/github/go-spdx/v2 v2.3.2/go.mod h1:2ZxKsOhvBp+OYBDlsGnUMcchLeo2mrpEBn2L1C+U3IQ= -github.com/gkampitakis/ciinfo v0.3.1 h1:lzjbemlGI4Q+XimPg64ss89x8Mf3xihJqy/0Mgagapo= -github.com/gkampitakis/ciinfo v0.3.1/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= -github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= -github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= -github.com/gkampitakis/go-snaps v0.5.8 h1:BB4ihcyXgJEVO/Pj/P+4bs7pFzsLcEjsfU2+mFdJh1c= -github.com/gkampitakis/go-snaps v0.5.8/go.mod h1:PcKmy8q5Se7p48ywpogN5Td13reipz1Iivah4wrTIvY= github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= -github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= -github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= @@ -584,8 +400,6 @@ github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-yaml v1.15.13 h1:Xd87Yddmr2rC1SLLTm2MNDcTjeO/GYo0JGiww6gSTDg= -github.com/goccy/go-yaml v1.15.13/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -647,8 +461,6 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -659,13 +471,10 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/licensecheck v0.3.1 h1:QoxgoDkaeC4nFrtGN1jV7IPmDCHFNIVh54e5hSt6sPs= github.com/google/licensecheck v0.3.1/go.mod h1:ORkR35t/JjW+emNKtfJDII0zlciG9JgbT7SmsohlHmY= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= 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/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= -github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= 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= @@ -684,31 +493,15 @@ github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8I github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= -github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= 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.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= -github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= -github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= @@ -726,8 +519,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b h1:wDUNC2eKiL35DbLvsDhiblTUXHxcOPwQSCzi7xpQUN4= -github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0= github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -735,10 +526,7 @@ 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/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 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-getter v1.7.6 h1:5jHuM+aH373XNtXl9TNTUH5Qd69Trve11tHIrB+6yj4= -github.com/hashicorp/go-getter v1.7.6/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -750,13 +538,10 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= -github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -790,14 +575,6 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= -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.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= -github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -818,7 +595,6 @@ github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= @@ -864,8 +640,6 @@ github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= -github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/masahiro331/go-mvn-version v0.0.0-20210429150710-d3157d602a08 h1:AevUBW4cc99rAF8q8vmddIP8qd/0J5s/UyltGbp66dg= github.com/masahiro331/go-mvn-version v0.0.0-20210429150710-d3157d602a08/go.mod h1:JOkBRrE1HvgTyjk6diFtNGgr8XJMtIfiBzkL5krqzVk= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -877,7 +651,6 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= 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.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.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= @@ -889,7 +662,6 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.2-0.20220822084749-2491eb6c1c75 h1:P8UmIzZMYDR+NGImiFvErt6VWfIRPuGM+vyjiEdkmIw= github.com/mattn/go-localereader v0.0.2-0.20220822084749-2491eb6c1c75/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -911,8 +683,6 @@ github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HK 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 v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= @@ -991,12 +761,6 @@ github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bl github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= -github.com/openvex/go-vex v0.2.5 h1:41utdp2rHgAGCsG+UbjmfMG5CWQxs15nGqir1eRgSrQ= -github.com/openvex/go-vex v0.2.5/go.mod h1:j+oadBxSUELkrKh4NfNb+BPo77U3q7gdKME88IO/0Wo= -github.com/owenrumney/go-sarif v1.1.2-0.20231003122901-1000f5e05554 h1:FvA4bwjKpPqik5WsQ8+4z4DKWgA1tO1RTTtNKr5oYNA= -github.com/owenrumney/go-sarif v1.1.2-0.20231003122901-1000f5e05554/go.mod h1:n73K/hcuJ50MiVznXyN4rde6fZY7naGKWBXOLFTyc94= -github.com/package-url/packageurl-go v0.1.1 h1:KTRE0bK3sKbFKAk3yy63DpeskU7Cvs/x/Da5l+RtzyU= -github.com/package-url/packageurl-go v0.1.1/go.mod h1:uQd4a7Rh3ZsVg5j0lNyAfyxIeGde9yrlhjF78GzeW0c= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/indent v1.2.1 h1:lFiviAbISHv3Rf0jcuh489bi06hj98JsVMtIDZQb9yM= @@ -1023,8 +787,6 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= -github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1161,17 +923,8 @@ github.com/terminalstatic/go-xsd-validate v0.1.6 h1:TenYeQ3eY631qNi1/cTmLH/s2slH github.com/terminalstatic/go-xsd-validate v0.1.6/go.mod h1:18lsvYFofBflqCrvo1umpABZ99+GneNTw2kEEc8UPJw= github.com/therootcompany/xz v1.0.1 h1:CmOtsn1CbtmyYiusbfmhmkpAAETj0wBIH6kCYaX+xzw= github.com/therootcompany/xz v1.0.1/go.mod h1:3K3UH1yCKgBneZYhuQUvJ9HPD19UEXEI0BWbMn8qNMY= -github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= -github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= -github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= -github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/vbatts/go-mtree v0.5.4 h1:OMAb8jaCyiFA7zXj0Zc/oARcxBDBoeu2LizjB8BVJl0= @@ -1180,12 +933,8 @@ github.com/vbatts/tar-split v0.11.6 h1:4SjTW5+PU11n6fZenf2IPoV8/tz3AaYHMWjf23env github.com/vbatts/tar-split v0.11.6/go.mod h1:dqKNtesIOr2j2Qv3W/cHjnvk9I8+G7oAkFDFN6TCBEI= github.com/vifraa/gopom v1.0.0 h1:L9XlKbyvid8PAIK8nr0lihMApJQg/12OBvMA28BcWh0= github.com/vifraa/gopom v1.0.0/go.mod h1:oPa1dcrGrtlO37WPDBm5SqHAT+wTgF8An1Q71Z6Vv4o= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/wagoodman/go-partybus v0.0.0-20230516145632-8ccac152c651 h1:jIVmlAFIqV3d+DOxazTR9v+zgj8+VYuQBzPgBZvWBHA= github.com/wagoodman/go-partybus v0.0.0-20230516145632-8ccac152c651/go.mod h1:b26F2tHLqaoRQf8DywqzVaV1MQ9yvjb0OMcNl7Nxu20= -github.com/wagoodman/go-presenter v0.0.0-20211015174752-f9c01afc824b h1:uWNQ0khA6RdFzODOMwKo9XXu7fuewnnkHykUtuKru8s= -github.com/wagoodman/go-presenter v0.0.0-20211015174752-f9c01afc824b/go.mod h1:ewlIKbKV8l+jCj8rkdXIs361ocR5x3qGyoCSca47Gx8= github.com/wagoodman/go-progress v0.0.0-20230925121702-07e42b3cdba0 h1:0KGbf+0SMg+UFy4e1A/CPVvXn21f1qtWdeJwxZFoQG8= github.com/wagoodman/go-progress v0.0.0-20230925121702-07e42b3cdba0/go.mod h1:jLXFoL31zFaHKAAyZUh+sxiTDFe1L1ZHrcK2T1itVKA= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= @@ -1237,10 +986,6 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/detectors/gcp v1.29.0 h1:TiaiXB4DpGD3sdzNlYQxruQngn5Apwzi1X0DRhuGvDQ= -go.opentelemetry.io/contrib/detectors/gcp v1.29.0/go.mod h1:GW2aWZNwR2ZxDLdv8OyC2G8zkRoQBuURgV7RPQgcPoU= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw= @@ -1249,14 +994,10 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9RO go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0 h1:wpMfgF8E1rkrT1Z6meFh1NDtownE9Ii3n3X2GJYjsaU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0/go.mod h1:wAy0T/dUbs468uOlkT31xjvqQgEVXv58BRFWEgn5v/0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ= go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= go.opentelemetry.io/otel/sdk v1.33.0 h1:iax7M131HuAm9QkZotNHEfstof92xM+N8sr3uHXc2IM= go.opentelemetry.io/otel/sdk v1.33.0/go.mod h1:A1Q5oi7/9XaMlIWzPSxLRWOI8nG3FnzHJNbiENQuihM= -go.opentelemetry.io/otel/sdk/metric v1.29.0 h1:K2CfmJohnRgvZ9UAj2/FhIf/okdWcNdBwe1m8xFXiSY= -go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ= go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s= go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= @@ -1370,18 +1111,7 @@ golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= @@ -1402,15 +1132,6 @@ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70= golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1424,9 +1145,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= @@ -1503,24 +1222,11 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1528,7 +1234,6 @@ golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= @@ -1541,9 +1246,7 @@ 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/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= @@ -1615,10 +1318,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -1653,26 +1352,6 @@ google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdr google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.215.0 h1:jdYF4qnyczlEz2ReWIsosNLDuzXyvFHJtI5gcr0J7t0= -google.golang.org/api v0.215.0/go.mod h1:fta3CVtuJYOEdugLNWm6WodzOS8KdFckABwN4I40hzY= 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= @@ -1719,7 +1398,6 @@ google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/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-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -1744,47 +1422,6 @@ google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk= google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q= @@ -1818,15 +1455,6 @@ google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.67.3 h1:OgPcDAFKHnH8X3O4WcO4XUc8GRDeKsKReqbQtiCj7N8= google.golang.org/grpc v1.67.3/go.mod h1:YGaHCc6Oap+FzBJTZLBzkGSYt/cvGPFTPxkn7QfSU8s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= @@ -1843,8 +1471,6 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba 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/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -1853,7 +1479,6 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= @@ -1880,8 +1505,6 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= -gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= helm.sh/helm/v3 v3.17.0 h1:DUD4AGdNVn7PSTYfxe1gmQG7s18QeWv/4jI9TubnhT0= @@ -1917,30 +1540,14 @@ k8s.io/metrics v0.32.1 h1:Ou4nrEtZS2vFf7OJCf9z3+2kr0A00kQzfoSwxg0gXps= k8s.io/metrics v0.32.1/go.mod h1:cLnai9XKYby1tNMX+xe8p9VLzTqrxYPcmqfCBoWObcM= k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ= -modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= -modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y= -modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s= -modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= -modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= -modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw= -modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U= modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= -modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= -modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= modernc.org/sqlite v1.34.5 h1:Bb6SR13/fjp15jt70CL4f18JIN7p7dnMExd+UFnF15g= modernc.org/sqlite v1.34.5/go.mod h1:YLuNmX9NKs8wRNK2ko1LW1NGYcc9FkBO69JOt1AR9JE= -modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= -modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= -modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/internal/vul/scanner.go b/internal/vul/scanner.go index d7c04aaceb..4cac816c99 100644 --- a/internal/vul/scanner.go +++ b/internal/vul/scanner.go @@ -13,7 +13,6 @@ import ( "github.com/anchore/clio" "github.com/anchore/grype/cmd/grype/cli/options" "github.com/anchore/grype/grype" - "github.com/anchore/grype/grype/db/legacy/distribution" v5 "github.com/anchore/grype/grype/db/v5" "github.com/anchore/grype/grype/db/v5/matcher" @@ -161,7 +160,7 @@ func (s *imageScanner) scanWorker(ctx context.Context, img string) { } } -func (s *imageScanner) scan(ctx context.Context, img string, sc *Scan) error { +func (s *imageScanner) scan(_ context.Context, img string, sc *Scan) error { defer func(t time.Time) { log.Debug().Msgf("ScanTime %q: %v", img, time.Since(t)) }(time.Now()) From 65cad0bb40a98d31d04b7d81924f958b617e3635 Mon Sep 17 00:00:00 2001 From: derailed Date: Sat, 1 Feb 2025 09:05:06 -0700 Subject: [PATCH 3/9] update deps --- go.mod | 54 +++++++- go.sum | 393 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 445 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 7238ead1b2..042d69f8d8 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,9 @@ go 1.23.2 require ( github.com/adrg/xdg v0.5.3 + github.com/anchore/clio v0.0.0-20241115144204-29e89f9fa837 github.com/anchore/grype v0.86.1 + github.com/anchore/syft v1.19.0 github.com/atotto/clipboard v0.1.4 github.com/cenkalti/backoff/v4 v4.3.0 github.com/derailed/popeye v0.11.3 @@ -40,6 +42,14 @@ require ( ) require ( + cel.dev/expr v0.18.0 // indirect + cloud.google.com/go v0.116.0 // indirect + cloud.google.com/go/auth v0.13.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.6 // indirect + cloud.google.com/go/compute/metadata v0.6.0 // indirect + cloud.google.com/go/iam v1.2.2 // indirect + cloud.google.com/go/monitoring v1.21.2 // indirect + cloud.google.com/go/storage v1.49.0 // indirect dario.cat/mergo v1.0.1 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 // indirect @@ -47,6 +57,9 @@ require ( github.com/BurntSushi/toml v1.4.0 // indirect github.com/CycloneDX/cyclonedx-go v0.9.2 // indirect github.com/DataDog/zstd v1.5.5 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect @@ -55,11 +68,11 @@ require ( github.com/Masterminds/squirrel v1.5.4 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Microsoft/hcsshim v0.11.7 // indirect + github.com/OneOfOne/xxhash v1.2.8 // indirect github.com/ProtonMail/go-crypto v1.1.3 // indirect github.com/acobaugh/osrelease v0.1.0 // indirect github.com/agext/levenshtein v1.2.1 // indirect github.com/anchore/archiver/v3 v3.5.3-0.20241210171143-5b1d8d1c7c51 // indirect - github.com/anchore/clio v0.0.0-20241115144204-29e89f9fa837 // indirect github.com/anchore/fangs v0.0.0-20241014225144-4e1713cafd77 // indirect github.com/anchore/go-collections v0.0.0-20240216171411-9321230ce537 // indirect github.com/anchore/go-logger v0.0.0-20230725134548-c21dafa1ec5a // indirect @@ -68,23 +81,26 @@ require ( github.com/anchore/go-version v1.2.2-0.20210903204242-51efa5b487c4 // indirect github.com/anchore/packageurl-go v0.1.1-0.20250117185454-edf36a908b10 // indirect github.com/anchore/stereoscope v0.0.13 // indirect - github.com/anchore/syft v1.19.0 // indirect github.com/andybalholm/brotli v1.1.1 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/aquasecurity/go-pep440-version v0.0.1 // indirect github.com/aquasecurity/go-version v0.0.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect + github.com/aws/aws-sdk-go v1.44.288 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/becheran/wildmatch-go v1.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/bmatcuk/doublestar/v2 v2.0.4 // indirect github.com/bmatcuk/doublestar/v4 v4.8.0 // indirect + github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect github.com/charmbracelet/lipgloss v1.0.0 // indirect github.com/charmbracelet/x/ansi v0.4.5 // indirect github.com/cloudflare/circl v1.3.8 // indirect + github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/containerd/containerd v1.7.24 // indirect github.com/containerd/containerd/api v1.7.19 // indirect @@ -114,6 +130,8 @@ require ( github.com/elliotchance/phpserialize v1.4.0 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect + github.com/envoyproxy/go-control-plane v0.13.1 // indirect + github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect github.com/evanphx/json-patch v5.9.0+incompatible // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/facebookincubator/nvdtools v0.1.5 // indirect @@ -124,6 +142,8 @@ require ( github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gdamore/encoding v1.0.1 // indirect github.com/github/go-spdx/v2 v2.3.2 // indirect + github.com/glebarez/go-sqlite v1.21.2 // indirect + github.com/glebarez/sqlite v1.11.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-git/go-git/v5 v5.13.1 // indirect @@ -134,6 +154,7 @@ require ( github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/go-restruct/restruct v1.2.0-alpha // indirect + github.com/go-test/deep v1.1.1 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -146,15 +167,22 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/google/licensecheck v0.3.1 // indirect github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect + github.com/google/s2a-go v0.1.8 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/gookit/color v1.5.4 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/gosuri/uitable v0.0.4 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect + github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b // indirect github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-getter v1.7.6 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl/v2 v2.23.0 // indirect @@ -163,6 +191,9 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jinzhu/copier v0.4.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmoiron/sqlx v1.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -187,6 +218,7 @@ require ( github.com/microsoft/go-rustaudit v0.0.0-20220730194248-4b17361d90a5 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -206,6 +238,7 @@ require ( github.com/muesli/termenv v0.15.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect github.com/nwaples/rardecode v1.1.3 // indirect github.com/onsi/ginkgo v1.16.5 // indirect github.com/onsi/gomega v1.35.1 // indirect @@ -213,6 +246,9 @@ require ( github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runtime-spec v1.1.0 // indirect github.com/opencontainers/selinux v1.11.0 // indirect + github.com/openvex/go-vex v0.2.5 // indirect + github.com/owenrumney/go-sarif v1.1.2-0.20231003122901-1000f5e05554 // indirect + github.com/package-url/packageurl-go v0.1.1 // indirect github.com/pborman/indent v1.2.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect @@ -221,11 +257,13 @@ require ( github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pkg/profile v1.7.0 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.19.1 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rubenv/sql-migrate v1.7.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -255,6 +293,7 @@ require ( github.com/vbatts/tar-split v0.11.6 // indirect github.com/vifraa/gopom v1.0.0 // indirect github.com/wagoodman/go-partybus v0.0.0-20230516145632-8ccac152c651 // indirect + github.com/wagoodman/go-presenter v0.0.0-20211015174752-f9c01afc824b // indirect github.com/wagoodman/go-progress v0.0.0-20230925121702-07e42b3cdba0 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect @@ -266,9 +305,13 @@ require ( github.com/zclconf/go-cty v1.14.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.29.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect go.opentelemetry.io/otel v1.33.0 // indirect go.opentelemetry.io/otel/metric v1.33.0 // indirect + go.opentelemetry.io/otel/sdk v1.33.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.29.0 // indirect go.opentelemetry.io/otel/trace v1.33.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.32.0 // indirect @@ -282,7 +325,9 @@ require ( golang.org/x/time v0.8.0 // indirect golang.org/x/tools v0.29.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/api v0.215.0 // indirect google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8 // indirect google.golang.org/grpc v1.67.3 // indirect google.golang.org/protobuf v1.36.3 // indirect @@ -290,10 +335,15 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect + gorm.io/gorm v1.25.12 // indirect k8s.io/apiserver v0.32.1 // indirect k8s.io/component-base v0.32.1 // indirect k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect + modernc.org/libc v1.55.3 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.8.0 // indirect + modernc.org/sqlite v1.34.5 // indirect oras.land/oras-go v1.2.5 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/kustomize/api v0.18.0 // indirect diff --git a/go.sum b/go.sum index 6b9d091072..89ee0f95c4 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +cel.dev/expr v0.18.0 h1:CJ6drgk+Hf96lkLikr4rFf19WrU0BOWEihyZnI2TAzo= +cel.dev/expr v0.18.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -27,24 +29,175 @@ cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= +cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/auth v0.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs= +cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q= +cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU= +cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= 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/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= +cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= 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/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= +cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= +cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= +cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= +cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= +cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= 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/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= 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= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.49.0 h1:zenOPBOWHCnojRd9aJZAyQXBYqkJkdQS42dxL55CIMw= +cloud.google.com/go/storage v1.49.0/go.mod h1:k1eHhhpLvrPjVGfo0mOUPEJ4Y2+a/Hv5PiwehZI9qGU= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= +cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -68,6 +221,14 @@ github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1 h1:oTX4vsorBZo/Zdum6OKPA4o7544hm6smoRv1QjpTwGo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1/go.mod h1:0wEl7vrAD8mehJyohS9HZy+WyEOaQO2mJx86Cvh93kM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= @@ -151,6 +312,9 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3d github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.44.288 h1:Ln7fIao/nl0ACtelgR1I4AiEw/GLNkKcXfCaHupUW5Q= +github.com/aws/aws-sdk-go v1.44.288/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/becheran/wildmatch-go v1.0.0 h1:mE3dGGkTmpKtT4Z+88t8RStG40yN9T+kFEGj2PZFSzA= @@ -159,6 +323,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= @@ -180,6 +346,8 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3 github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -197,6 +365,7 @@ github.com/charmbracelet/x/ansi v0.4.5 h1:LqK4vwBNaXw2AyGIICa5/29Sbdq58GbGdFngSe github.com/charmbracelet/x/ansi v0.4.5/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= +github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -215,6 +384,8 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/containerd/containerd v1.7.24 h1:zxszGrGjrra1yYJW/6rhm9cJ1ZQ8rkKBR48brqsa7nA= @@ -306,8 +477,13 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE= +github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= @@ -350,8 +526,16 @@ github.com/gdamore/encoding v1.0.1/go.mod h1:0Z0cMFinngz9kS1QfMjCP8TY7em3bZYeekl github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/github/go-spdx/v2 v2.3.2 h1:IfdyNHTqzs4zAJjXdVQfRnxt1XMfycXoHBE2Vsm1bjs= github.com/github/go-spdx/v2 v2.3.2/go.mod h1:2ZxKsOhvBp+OYBDlsGnUMcchLeo2mrpEBn2L1C+U3IQ= +github.com/gkampitakis/ciinfo v0.3.1 h1:lzjbemlGI4Q+XimPg64ss89x8Mf3xihJqy/0Mgagapo= +github.com/gkampitakis/ciinfo v0.3.1/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.8 h1:BB4ihcyXgJEVO/Pj/P+4bs7pFzsLcEjsfU2+mFdJh1c= +github.com/gkampitakis/go-snaps v0.5.8/go.mod h1:PcKmy8q5Se7p48ywpogN5Td13reipz1Iivah4wrTIvY= github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= +github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= +github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= @@ -400,6 +584,8 @@ github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-yaml v1.15.13 h1:Xd87Yddmr2rC1SLLTm2MNDcTjeO/GYo0JGiww6gSTDg= +github.com/goccy/go-yaml v1.15.13/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -461,6 +647,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -471,10 +659,13 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/licensecheck v0.3.1 h1:QoxgoDkaeC4nFrtGN1jV7IPmDCHFNIVh54e5hSt6sPs= github.com/google/licensecheck v0.3.1/go.mod h1:ORkR35t/JjW+emNKtfJDII0zlciG9JgbT7SmsohlHmY= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= 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/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= 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= @@ -493,15 +684,31 @@ github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8I github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= 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.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= +github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= @@ -519,6 +726,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b h1:wDUNC2eKiL35DbLvsDhiblTUXHxcOPwQSCzi7xpQUN4= +github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0= github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -526,7 +735,10 @@ 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/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 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-getter v1.7.6 h1:5jHuM+aH373XNtXl9TNTUH5Qd69Trve11tHIrB+6yj4= +github.com/hashicorp/go-getter v1.7.6/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -538,10 +750,13 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= +github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -575,6 +790,14 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= +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.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -595,6 +818,7 @@ github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= @@ -640,6 +864,8 @@ github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/masahiro331/go-mvn-version v0.0.0-20210429150710-d3157d602a08 h1:AevUBW4cc99rAF8q8vmddIP8qd/0J5s/UyltGbp66dg= github.com/masahiro331/go-mvn-version v0.0.0-20210429150710-d3157d602a08/go.mod h1:JOkBRrE1HvgTyjk6diFtNGgr8XJMtIfiBzkL5krqzVk= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -651,6 +877,7 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= 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.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.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= @@ -662,6 +889,7 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.2-0.20220822084749-2491eb6c1c75 h1:P8UmIzZMYDR+NGImiFvErt6VWfIRPuGM+vyjiEdkmIw= github.com/mattn/go-localereader v0.0.2-0.20220822084749-2491eb6c1c75/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -683,6 +911,8 @@ github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HK 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 v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= @@ -761,6 +991,12 @@ github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bl github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/openvex/go-vex v0.2.5 h1:41utdp2rHgAGCsG+UbjmfMG5CWQxs15nGqir1eRgSrQ= +github.com/openvex/go-vex v0.2.5/go.mod h1:j+oadBxSUELkrKh4NfNb+BPo77U3q7gdKME88IO/0Wo= +github.com/owenrumney/go-sarif v1.1.2-0.20231003122901-1000f5e05554 h1:FvA4bwjKpPqik5WsQ8+4z4DKWgA1tO1RTTtNKr5oYNA= +github.com/owenrumney/go-sarif v1.1.2-0.20231003122901-1000f5e05554/go.mod h1:n73K/hcuJ50MiVznXyN4rde6fZY7naGKWBXOLFTyc94= +github.com/package-url/packageurl-go v0.1.1 h1:KTRE0bK3sKbFKAk3yy63DpeskU7Cvs/x/Da5l+RtzyU= +github.com/package-url/packageurl-go v0.1.1/go.mod h1:uQd4a7Rh3ZsVg5j0lNyAfyxIeGde9yrlhjF78GzeW0c= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/indent v1.2.1 h1:lFiviAbISHv3Rf0jcuh489bi06hj98JsVMtIDZQb9yM= @@ -787,6 +1023,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -923,8 +1161,17 @@ github.com/terminalstatic/go-xsd-validate v0.1.6 h1:TenYeQ3eY631qNi1/cTmLH/s2slH github.com/terminalstatic/go-xsd-validate v0.1.6/go.mod h1:18lsvYFofBflqCrvo1umpABZ99+GneNTw2kEEc8UPJw= github.com/therootcompany/xz v1.0.1 h1:CmOtsn1CbtmyYiusbfmhmkpAAETj0wBIH6kCYaX+xzw= github.com/therootcompany/xz v1.0.1/go.mod h1:3K3UH1yCKgBneZYhuQUvJ9HPD19UEXEI0BWbMn8qNMY= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/vbatts/go-mtree v0.5.4 h1:OMAb8jaCyiFA7zXj0Zc/oARcxBDBoeu2LizjB8BVJl0= @@ -933,8 +1180,12 @@ github.com/vbatts/tar-split v0.11.6 h1:4SjTW5+PU11n6fZenf2IPoV8/tz3AaYHMWjf23env github.com/vbatts/tar-split v0.11.6/go.mod h1:dqKNtesIOr2j2Qv3W/cHjnvk9I8+G7oAkFDFN6TCBEI= github.com/vifraa/gopom v1.0.0 h1:L9XlKbyvid8PAIK8nr0lihMApJQg/12OBvMA28BcWh0= github.com/vifraa/gopom v1.0.0/go.mod h1:oPa1dcrGrtlO37WPDBm5SqHAT+wTgF8An1Q71Z6Vv4o= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/wagoodman/go-partybus v0.0.0-20230516145632-8ccac152c651 h1:jIVmlAFIqV3d+DOxazTR9v+zgj8+VYuQBzPgBZvWBHA= github.com/wagoodman/go-partybus v0.0.0-20230516145632-8ccac152c651/go.mod h1:b26F2tHLqaoRQf8DywqzVaV1MQ9yvjb0OMcNl7Nxu20= +github.com/wagoodman/go-presenter v0.0.0-20211015174752-f9c01afc824b h1:uWNQ0khA6RdFzODOMwKo9XXu7fuewnnkHykUtuKru8s= +github.com/wagoodman/go-presenter v0.0.0-20211015174752-f9c01afc824b/go.mod h1:ewlIKbKV8l+jCj8rkdXIs361ocR5x3qGyoCSca47Gx8= github.com/wagoodman/go-progress v0.0.0-20230925121702-07e42b3cdba0 h1:0KGbf+0SMg+UFy4e1A/CPVvXn21f1qtWdeJwxZFoQG8= github.com/wagoodman/go-progress v0.0.0-20230925121702-07e42b3cdba0/go.mod h1:jLXFoL31zFaHKAAyZUh+sxiTDFe1L1ZHrcK2T1itVKA= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= @@ -986,6 +1237,10 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/detectors/gcp v1.29.0 h1:TiaiXB4DpGD3sdzNlYQxruQngn5Apwzi1X0DRhuGvDQ= +go.opentelemetry.io/contrib/detectors/gcp v1.29.0/go.mod h1:GW2aWZNwR2ZxDLdv8OyC2G8zkRoQBuURgV7RPQgcPoU= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw= @@ -994,10 +1249,14 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9RO go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0 h1:wpMfgF8E1rkrT1Z6meFh1NDtownE9Ii3n3X2GJYjsaU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0/go.mod h1:wAy0T/dUbs468uOlkT31xjvqQgEVXv58BRFWEgn5v/0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ= go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= go.opentelemetry.io/otel/sdk v1.33.0 h1:iax7M131HuAm9QkZotNHEfstof92xM+N8sr3uHXc2IM= go.opentelemetry.io/otel/sdk v1.33.0/go.mod h1:A1Q5oi7/9XaMlIWzPSxLRWOI8nG3FnzHJNbiENQuihM= +go.opentelemetry.io/otel/sdk/metric v1.29.0 h1:K2CfmJohnRgvZ9UAj2/FhIf/okdWcNdBwe1m8xFXiSY= +go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ= go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s= go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= @@ -1111,7 +1370,18 @@ golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= @@ -1132,6 +1402,15 @@ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70= golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1145,7 +1424,9 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= @@ -1222,11 +1503,24 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1234,6 +1528,7 @@ golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= @@ -1246,7 +1541,9 @@ 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/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= @@ -1318,6 +1615,10 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -1352,6 +1653,26 @@ google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdr google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.215.0 h1:jdYF4qnyczlEz2ReWIsosNLDuzXyvFHJtI5gcr0J7t0= +google.golang.org/api v0.215.0/go.mod h1:fta3CVtuJYOEdugLNWm6WodzOS8KdFckABwN4I40hzY= 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= @@ -1398,6 +1719,7 @@ google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/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-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -1422,6 +1744,47 @@ google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk= google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q= @@ -1455,6 +1818,15 @@ google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.67.3 h1:OgPcDAFKHnH8X3O4WcO4XUc8GRDeKsKReqbQtiCj7N8= google.golang.org/grpc v1.67.3/go.mod h1:YGaHCc6Oap+FzBJTZLBzkGSYt/cvGPFTPxkn7QfSU8s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= @@ -1471,6 +1843,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba 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/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -1479,6 +1853,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= @@ -1505,6 +1880,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= +gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= helm.sh/helm/v3 v3.17.0 h1:DUD4AGdNVn7PSTYfxe1gmQG7s18QeWv/4jI9TubnhT0= @@ -1540,14 +1917,30 @@ k8s.io/metrics v0.32.1 h1:Ou4nrEtZS2vFf7OJCf9z3+2kr0A00kQzfoSwxg0gXps= k8s.io/metrics v0.32.1/go.mod h1:cLnai9XKYby1tNMX+xe8p9VLzTqrxYPcmqfCBoWObcM= k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ= +modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= +modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y= +modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s= +modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= +modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw= +modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U= modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= +modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= modernc.org/sqlite v1.34.5 h1:Bb6SR13/fjp15jt70CL4f18JIN7p7dnMExd+UFnF15g= modernc.org/sqlite v1.34.5/go.mod h1:YLuNmX9NKs8wRNK2ko1LW1NGYcc9FkBO69JOt1AR9JE= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= From 2cf99c9e51a822751402254667993eab471b4b22 Mon Sep 17 00:00:00 2001 From: derailed Date: Sat, 15 Feb 2025 13:37:09 -0700 Subject: [PATCH 4/9] [custv] config updates --- internal/config/views.go | 15 ++++++++------- internal/config/views_test.go | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/internal/config/views.go b/internal/config/views.go index 41c6b9b5e6..86b1ef3cc2 100644 --- a/internal/config/views.go +++ b/internal/config/views.go @@ -14,14 +14,14 @@ import ( "github.com/derailed/k9s/internal/config/data" "github.com/derailed/k9s/internal/config/json" - + "github.com/rs/zerolog/log" "gopkg.in/yaml.v2" ) // ViewConfigListener represents a view config listener. type ViewConfigListener interface { // ViewSettingsChanged notifies listener the view configuration changed. - ViewSettingsChanged(ViewSetting) + ViewSettingsChanged(*ViewSetting) } // ViewSetting represents a view configuration. @@ -35,7 +35,7 @@ func (v *ViewSetting) HasCols() bool { } func (v *ViewSetting) IsBlank() bool { - return v == nil || len(v.Columns) == 0 + return v == nil || (len(v.Columns) == 0 && v.SortColumn == "") } func (v *ViewSetting) SortCol() (string, bool, error) { @@ -52,7 +52,7 @@ func (v *ViewSetting) SortCol() (string, bool, error) { func (v *ViewSetting) Equals(vs *ViewSetting) bool { if v == nil || vs == nil { - return v == nil && vs == nil + return false } if c := slices.Compare(v.Columns, vs.Columns); c != 0 { return false @@ -116,10 +116,11 @@ func (v *CustomView) RemoveListener(gvr string) { func (v *CustomView) fireConfigChanged() { for gvr, list := range v.listeners { - if view, ok := v.Views[gvr]; ok { - list.ViewSettingsChanged(view) + if vs, ok := v.Views[gvr]; ok { + log.Debug().Msgf("Reloading custom view settings for %s", gvr) + list.ViewSettingsChanged(&vs) } else { - list.ViewSettingsChanged(ViewSetting{}) + list.ViewSettingsChanged(nil) } } } diff --git a/internal/config/views_test.go b/internal/config/views_test.go index 0764d2435e..902eda50c6 100644 --- a/internal/config/views_test.go +++ b/internal/config/views_test.go @@ -23,7 +23,7 @@ func TestViewSetting_Equals(t *testing.T) { v1, v2 *config.ViewSetting equals bool }{ - {nil, nil, true}, + {nil, nil, false}, {&config.ViewSetting{}, nil, false}, {nil, &config.ViewSetting{}, false}, {&config.ViewSetting{}, &config.ViewSetting{}, true}, From 1a368f47851fafa47ffb3a5d050b3a91b67e30fa Mon Sep 17 00:00:00 2001 From: derailed Date: Sat, 15 Feb 2025 13:37:31 -0700 Subject: [PATCH 5/9] [custv] dao updates --- internal/dao/dynamic.go | 145 +++++++++++++++++++++++++++++++++++ internal/dao/non_resource.go | 9 ++- internal/dao/registry.go | 22 +++--- internal/dao/types.go | 3 + 4 files changed, 165 insertions(+), 14 deletions(-) create mode 100644 internal/dao/dynamic.go diff --git a/internal/dao/dynamic.go b/internal/dao/dynamic.go new file mode 100644 index 0000000000..a1bd321fe8 --- /dev/null +++ b/internal/dao/dynamic.go @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Authors of K9s +package dao + +import ( + "context" + "errors" + "fmt" + "strings" + + "github.com/derailed/k9s/internal" + "github.com/derailed/k9s/internal/client" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/rest" + cmdutil "k8s.io/kubectl/pkg/cmd/util" +) + +type Dynamic struct { + Generic +} + +func (d *Dynamic) Get(ctx context.Context, path string) (runtime.Object, error) { + return nil, errors.New("Not implemented") +} + +func (d *Dynamic) List(ctx context.Context, ns string) ([]runtime.Object, error) { + strLabel, _ := ctx.Value(internal.KeyLabels).(string) + + allNS := client.IsAllNamespaces(ns) + flags := cmdutil.NewMatchVersionFlags(d.getFactory().Client().Config().Flags()) + f := cmdutil.NewFactory(flags) + b := f.NewBuilder(). + Unstructured(). + NamespaceParam(ns).DefaultNamespace().AllNamespaces(allNS). + LabelSelectorParam(strLabel). + FieldSelectorParam(""). + RequestChunksOf(0). + ResourceTypeOrNameArgs(true, d.gvr.R()). + ContinueOnError(). + Latest(). + Flatten(). + TransformRequests(d.transformRequests). + Do() + if err := b.Err(); err != nil { + return nil, err + } + + infos, err := b.Infos() + if err != nil { + return nil, err + } + + oo := make([]runtime.Object, 0, len(infos)) + for _, info := range infos { + o, err := decodeIntoTable(info.Object, allNS) + if err != nil { + return nil, err + } + oo = append(oo, o.(*metav1.Table)) + } + + return oo, nil +} + +var recognizedTableVersions = map[schema.GroupVersionKind]bool{ + metav1beta1.SchemeGroupVersion.WithKind("Table"): true, + metav1.SchemeGroupVersion.WithKind("Table"): true, +} + +func decodeIntoTable(obj runtime.Object, allNs bool) (runtime.Object, error) { + event, isEvent := obj.(*metav1.WatchEvent) + if isEvent { + obj = event.Object.Object + } + + if !recognizedTableVersions[obj.GetObjectKind().GroupVersionKind()] { + return nil, fmt.Errorf("attempt to decode non-Table object: %v", obj.GetObjectKind().GroupVersionKind()) + } + + u, ok := obj.(*unstructured.Unstructured) + if !ok { + return nil, fmt.Errorf("attempt to decode non-Unstructured object") + } + var table metav1.Table + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, &table); err != nil { + return nil, err + } + + if allNs { + defs := make([]metav1.TableColumnDefinition, 0, len(table.ColumnDefinitions)+1) + defs = append(defs, metav1.TableColumnDefinition{Name: "Namespace", Type: "string"}) + defs = append(defs, table.ColumnDefinitions...) + table.ColumnDefinitions = defs + } + + for i := range table.Rows { + row := &table.Rows[i] + if row.Object.Raw == nil || row.Object.Object != nil { + continue + } + converted, err := runtime.Decode(unstructured.UnstructuredJSONScheme, row.Object.Raw) + if err != nil { + return nil, err + } + row.Object.Object = converted + var m metav1.Object + if obj := row.Object.Object; obj != nil { + m, _ = meta.Accessor(obj) + } + var ns string + if m != nil { + ns = m.GetNamespace() + } + if allNs { + cells := make([]interface{}, 0, len(row.Cells)+1) + cells = append(cells, ns) + cells = append(cells, row.Cells...) + row.Cells = cells + } + } + + if isEvent { + event.Object.Object = &table + return event, nil + } + + return &table, nil +} + +func (d *Dynamic) transformRequests(req *rest.Request) { + req.SetHeader("Accept", strings.Join([]string{ + fmt.Sprintf("application/json;as=Table;v=%s;g=%s", metav1.SchemeGroupVersion.Version, metav1.GroupName), + fmt.Sprintf("application/json;as=Table;v=%s;g=%s", metav1beta1.SchemeGroupVersion.Version, metav1beta1.GroupName), + "application/json", + }, ",")) + + if d.includeObj { + req.Param("includeObject", "Object") + } +} diff --git a/internal/dao/non_resource.go b/internal/dao/non_resource.go index 0dc7208661..b7b1e6f341 100644 --- a/internal/dao/non_resource.go +++ b/internal/dao/non_resource.go @@ -16,8 +16,9 @@ import ( type NonResource struct { Factory - gvr client.GVR - mx sync.RWMutex + gvr client.GVR + mx sync.RWMutex + includeObj bool } // Init initializes the resource. @@ -29,6 +30,10 @@ func (n *NonResource) Init(f Factory, gvr client.GVR) { n.mx.Unlock() } +func (n *NonResource) SetIncludeObject(f bool) { + n.includeObj = f +} + func (n *NonResource) gvrStr() string { n.mx.RLock() defer n.mx.RUnlock() diff --git a/internal/dao/registry.go b/internal/dao/registry.go index d21a84f2ea..d7ac54ad66 100644 --- a/internal/dao/registry.go +++ b/internal/dao/registry.go @@ -89,8 +89,6 @@ func AccessorFor(f Factory, gvr client.GVR) (Accessor, error) { client.NewGVR("helm"): &HelmChart{}, client.NewGVR("helm-history"): &HelmHistory{}, client.NewGVR("apiextensions.k8s.io/v1/customresourcedefinitions"): &CustomResourceDefinition{}, - // !!BOZO!! Popeye - //client.NewGVR("popeye"): &Popeye{}, } r, ok := m[gvr] @@ -139,16 +137,6 @@ func (m *Meta) GVK2GVR(gv schema.GroupVersion, kind string) (client.GVR, bool, b return client.NoGVR, false, false } -// IsCRD checks if resource represents a CRD -func IsCRD(r metav1.APIResource) bool { - for _, c := range r.Categories { - if c == crdCat { - return true - } - } - return false -} - // MetaFor returns a resource metadata for a given gvr. func (m *Meta) MetaFor(gvr client.GVR) (metav1.APIResource, error) { m.mx.RLock() @@ -161,6 +149,16 @@ func (m *Meta) MetaFor(gvr client.GVR) (metav1.APIResource, error) { return meta, nil } +// IsCRD checks if resource represents a CRD +func IsCRD(r metav1.APIResource) bool { + for _, c := range r.Categories { + if c == crdCat { + return true + } + } + return false +} + // IsK8sMeta checks for non resource meta. func IsK8sMeta(m metav1.APIResource) bool { for _, c := range m.Categories { diff --git a/internal/dao/types.go b/internal/dao/types.go index 8afa480fdc..eaf9f6db50 100644 --- a/internal/dao/types.go +++ b/internal/dao/types.go @@ -79,6 +79,9 @@ type Accessor interface { // GVR returns a gvr a string. GVR() string + + // SetIncludeObject toggles object inclusion. + SetIncludeObject(bool) } // DrainOptions tracks drain attributes. From 703136a0b7864eb63ab7e9c17bfaea050ee91495 Mon Sep 17 00:00:00 2001 From: derailed Date: Sat, 15 Feb 2025 13:37:46 -0700 Subject: [PATCH 6/9] [custv] model updates --- internal/model/helpers.go | 31 +++++++++++++++++++++ internal/model/pulse_health.go | 2 +- internal/model/registry.go | 17 +++--------- internal/model/table.go | 25 ++++++++++++++++- internal/model/table_int_test.go | 2 ++ internal/model/tree.go | 2 +- internal/model/yaml.go | 27 ------------------ internal/model1/delta.go | 3 ++ internal/model1/header.go | 44 +++++++++++++++++++++++++++--- internal/model1/header_test.go | 30 ++++++++++---------- internal/model1/table_data.go | 24 ++++------------ internal/model1/table_data_test.go | 16 +++++------ internal/model1/types.go | 3 ++ 13 files changed, 137 insertions(+), 89 deletions(-) diff --git a/internal/model/helpers.go b/internal/model/helpers.go index 2173149472..cb65799745 100644 --- a/internal/model/helpers.go +++ b/internal/model/helpers.go @@ -5,14 +5,45 @@ package model import ( "context" + "fmt" "regexp" "time" "github.com/cenkalti/backoff/v4" + "github.com/derailed/k9s/internal" + "github.com/derailed/k9s/internal/client" + "github.com/derailed/k9s/internal/dao" + "github.com/derailed/k9s/internal/render" "github.com/sahilm/fuzzy" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +func getMeta(ctx context.Context, gvr client.GVR) (ResourceMeta, error) { + meta := resourceMeta(gvr) + factory, ok := ctx.Value(internal.KeyFactory).(dao.Factory) + if !ok { + return ResourceMeta{}, fmt.Errorf("expected Factory in context but got %T", ctx.Value(internal.KeyFactory)) + } + meta.DAO.Init(factory, gvr) + + return meta, nil +} + +func resourceMeta(gvr client.GVR) ResourceMeta { + meta, ok := Registry[gvr.String()] + if !ok { + meta = ResourceMeta{ + DAO: new(dao.Dynamic), + Renderer: new(render.Table), + } + } + if meta.DAO == nil { + meta.DAO = &dao.Resource{} + } + + return meta +} + // MetaFQN returns a fully qualified resource name. func MetaFQN(m metav1.ObjectMeta) string { return FQN(m.Namespace, m.Name) diff --git a/internal/model/pulse_health.go b/internal/model/pulse_health.go index 0f1891bb97..d2be69c9bb 100644 --- a/internal/model/pulse_health.go +++ b/internal/model/pulse_health.go @@ -105,7 +105,7 @@ func (h *PulseHealth) check(ctx context.Context, ns, gvr string) (*health.Check, if !ok { meta = ResourceMeta{ DAO: &dao.Table{}, - Renderer: &render.Generic{}, + Renderer: &render.Table{}, } } if meta.DAO == nil { diff --git a/internal/model/registry.go b/internal/model/registry.go index e2129c3bff..ab4bb7749e 100644 --- a/internal/model/registry.go +++ b/internal/model/registry.go @@ -82,23 +82,14 @@ var Registry = map[string]ResourceMeta{ DAO: &dao.Alias{}, Renderer: &render.Alias{}, }, - // !!BOZO!! Popeye - //"popeye": { - // DAO: &dao.Popeye{}, - // Renderer: &render.Popeye{}, - //}, - //"sanitizer": { - // DAO: &dao.Popeye{}, - // TreeRenderer: &xray.Section{}, - //}, // Core... - "v1/endpoints": { - Renderer: &render.Endpoints{}, - }, + // "v1/endpoints": { + // Renderer: &render.Endpoints{}, + // }, "v1/pods": { DAO: &dao.Pod{}, - Renderer: &render.Pod{}, + Renderer: render.NewPod(), TreeRenderer: &xray.Pod{}, }, "v1/namespaces": { diff --git a/internal/model/table.go b/internal/model/table.go index be1157b587..ab135c2461 100644 --- a/internal/model/table.go +++ b/internal/model/table.go @@ -13,6 +13,7 @@ import ( backoff "github.com/cenkalti/backoff/v4" "github.com/derailed/k9s/internal" "github.com/derailed/k9s/internal/client" + "github.com/derailed/k9s/internal/config" "github.com/derailed/k9s/internal/dao" "github.com/derailed/k9s/internal/model1" "github.com/rs/zerolog/log" @@ -41,6 +42,7 @@ type Table struct { instance string labelFilter string mx sync.RWMutex + vs *config.ViewSetting } // NewTable returns a new table model. @@ -52,6 +54,20 @@ func NewTable(gvr client.GVR) *Table { } } +func (t *Table) SetViewSetting(ctx context.Context, vs *config.ViewSetting) { + t.mx.Lock() + { + t.vs = vs + } + t.mx.Unlock() + + if ctx != context.Background() { + if err := t.reconcile(ctx); err != nil { + log.Err(err).Msgf("refresh failed for gvr: %s", t.gvr) + } + } +} + // SetLabelFilter sets the labels filter. func (t *Table) SetLabelFilter(f string) { t.mx.Lock() @@ -192,7 +208,11 @@ func (t *Table) updater(ctx context.Context) { case <-time.After(rate): rate = t.refreshRate err := backoff.Retry(func() error { - return t.refresh(ctx) + if err := t.refresh(ctx); err != nil { + log.Err(err).Msgf("refresh failed for gvr: %s", t.gvr) + return err + } + return nil }, backoff.WithContext(bf, ctx)) if err != nil { log.Warn().Err(err).Msgf("reconciler exited") @@ -247,6 +267,7 @@ func (t *Table) reconcile(ctx context.Context) error { err error ) meta := resourceMeta(t.gvr) + meta.DAO.SetIncludeObject(true) ctx = context.WithValue(ctx, internal.KeyLabels, t.labelFilter) if t.instance == "" { oo, err = t.list(ctx, meta.DAO) @@ -257,6 +278,8 @@ func (t *Table) reconcile(ctx context.Context) error { if err != nil { return err } + r := meta.Renderer + r.SetViewSetting(t.vs) return t.data.Reconcile(ctx, meta.Renderer, oo) } diff --git a/internal/model/table_int_test.go b/internal/model/table_int_test.go index e783b684c1..05ac605c73 100644 --- a/internal/model/table_int_test.go +++ b/internal/model/table_int_test.go @@ -173,6 +173,8 @@ type accessor struct { var _ dao.Accessor = (*accessor)(nil) +func (a *accessor) SetIncludeObject(bool) {} + func (a *accessor) List(ctx context.Context, ns string) ([]runtime.Object, error) { return []runtime.Object{&render.PodWithMetrics{Raw: mustLoad("p1")}}, nil } diff --git a/internal/model/tree.go b/internal/model/tree.go index c013238e85..6f32d13cf3 100644 --- a/internal/model/tree.go +++ b/internal/model/tree.go @@ -241,7 +241,7 @@ func (t *Tree) resourceMeta() ResourceMeta { if !ok { meta = ResourceMeta{ DAO: &dao.Table{}, - Renderer: &render.Generic{}, + Renderer: &render.Table{}, } } if meta.DAO == nil { diff --git a/internal/model/yaml.go b/internal/model/yaml.go index e476e27288..6ba1ff8604 100644 --- a/internal/model/yaml.go +++ b/internal/model/yaml.go @@ -15,7 +15,6 @@ import ( "github.com/derailed/k9s/internal" "github.com/derailed/k9s/internal/client" "github.com/derailed/k9s/internal/dao" - "github.com/derailed/k9s/internal/render" "github.com/rs/zerolog/log" "github.com/sahilm/fuzzy" ) @@ -208,29 +207,3 @@ func (y *YAML) ToYAML(ctx context.Context, gvr client.GVR, path string, showMana return desc.ToYAML(path, showManaged) } - -func getMeta(ctx context.Context, gvr client.GVR) (ResourceMeta, error) { - meta := resourceMeta(gvr) - factory, ok := ctx.Value(internal.KeyFactory).(dao.Factory) - if !ok { - return ResourceMeta{}, fmt.Errorf("expected Factory in context but got %T", ctx.Value(internal.KeyFactory)) - } - meta.DAO.Init(factory, gvr) - - return meta, nil -} - -func resourceMeta(gvr client.GVR) ResourceMeta { - meta, ok := Registry[gvr.String()] - if !ok { - meta = ResourceMeta{ - DAO: &dao.Table{}, - Renderer: &render.Generic{}, - } - } - if meta.DAO == nil { - meta.DAO = &dao.Resource{} - } - - return meta -} diff --git a/internal/model1/delta.go b/internal/model1/delta.go index 3d3e32dc84..b4a38e7751 100644 --- a/internal/model1/delta.go +++ b/internal/model1/delta.go @@ -12,6 +12,9 @@ type DeltaRow []string func NewDeltaRow(o, n Row, h Header) DeltaRow { deltas := make(DeltaRow, len(o.Fields)) for i, old := range o.Fields { + if i >= len(n.Fields) { + continue + } if old != "" && old != n.Fields[i] && !h.IsTimeCol(i) { deltas[i] = old } diff --git a/internal/model1/header.go b/internal/model1/header.go index d4f6d4c850..9e1ab6f255 100644 --- a/internal/model1/header.go +++ b/internal/model1/header.go @@ -4,6 +4,7 @@ package model1 import ( + "fmt" "reflect" "github.com/rs/zerolog/log" @@ -11,16 +12,52 @@ import ( const ageCol = "AGE" -// HeaderColumn represent a table header. -type HeaderColumn struct { - Name string +type Attrs struct { Align int Decorator DecoratorFunc Wide bool MX bool + MXC, MXM bool Time bool Capacity bool VS bool + Hide bool +} + +func (a Attrs) Merge(b Attrs) Attrs { + a.MX = b.MX + a.MXC = b.MXC + a.MXM = b.MXM + a.Decorator = b.Decorator + a.VS = b.VS + + if a.Align == 0 { + a.Align = b.Align + } + if !a.Wide { + a.Wide = b.Wide + } + if !a.Time { + a.Time = b.Time + } + if !a.Capacity { + a.Capacity = b.Capacity + } + if !a.Hide { + a.Hide = b.Hide + } + + return a +} + +// HeaderColumn represent a table header. +type HeaderColumn struct { + Attrs + Name string +} + +func (h HeaderColumn) String() string { + return fmt.Sprintf("%s [%d::%t::%t::%t]", h.Name, h.Align, h.Wide, h.MX, h.Time) } // Clone copies a header. @@ -106,7 +143,6 @@ func (h Header) Customize(cols []string, wide bool) Header { col.Wide = false cc = append(cc, col) } - if !wide { return cc } diff --git a/internal/model1/header_test.go b/internal/model1/header_test.go index 3d1d62f321..922656b4c1 100644 --- a/internal/model1/header_test.go +++ b/internal/model1/header_test.go @@ -104,7 +104,7 @@ func TestHeaderCustomize(t *testing.T) { "reverse": { h: model1.Header{ model1.HeaderColumn{Name: "A"}, - model1.HeaderColumn{Name: "B", Wide: true}, + model1.HeaderColumn{Name: "B", Attrs: model1.Attrs{Wide: true}}, model1.HeaderColumn{Name: "C"}, }, cols: []string{"C", "A"}, @@ -116,7 +116,7 @@ func TestHeaderCustomize(t *testing.T) { "reverse-wide": { h: model1.Header{ model1.HeaderColumn{Name: "A"}, - model1.HeaderColumn{Name: "B", Wide: true}, + model1.HeaderColumn{Name: "B", Attrs: model1.Attrs{Wide: true}}, model1.HeaderColumn{Name: "C"}, }, cols: []string{"C", "A"}, @@ -124,27 +124,27 @@ func TestHeaderCustomize(t *testing.T) { e: model1.Header{ model1.HeaderColumn{Name: "C"}, model1.HeaderColumn{Name: "A"}, - model1.HeaderColumn{Name: "B", Wide: true}, + model1.HeaderColumn{Name: "B", Attrs: model1.Attrs{Wide: true}}, }, }, "toggle-wide": { h: model1.Header{ model1.HeaderColumn{Name: "A"}, - model1.HeaderColumn{Name: "B", Wide: true}, + model1.HeaderColumn{Name: "B", Attrs: model1.Attrs{Wide: true}}, model1.HeaderColumn{Name: "C"}, }, cols: []string{"C", "B"}, wide: true, e: model1.Header{ model1.HeaderColumn{Name: "C"}, - model1.HeaderColumn{Name: "B", Wide: false}, - model1.HeaderColumn{Name: "A", Wide: true}, + model1.HeaderColumn{Name: "B", Attrs: model1.Attrs{Wide: false}}, + model1.HeaderColumn{Name: "A", Attrs: model1.Attrs{Wide: true}}, }, }, "missing": { h: model1.Header{ model1.HeaderColumn{Name: "A"}, - model1.HeaderColumn{Name: "B", Wide: true}, + model1.HeaderColumn{Name: "B", Attrs: model1.Attrs{Wide: true}}, model1.HeaderColumn{Name: "C"}, }, cols: []string{"BLEE", "A"}, @@ -152,8 +152,8 @@ func TestHeaderCustomize(t *testing.T) { e: model1.Header{ model1.HeaderColumn{Name: "BLEE"}, model1.HeaderColumn{Name: "A"}, - model1.HeaderColumn{Name: "B", Wide: true}, - model1.HeaderColumn{Name: "C", Wide: true}, + model1.HeaderColumn{Name: "B", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "C", Attrs: model1.Attrs{Wide: true}}, }, }, } @@ -183,7 +183,7 @@ func TestHeaderDiff(t *testing.T) { "differ-wide": { h1: model1.Header{ model1.HeaderColumn{Name: "A"}, - model1.HeaderColumn{Name: "B", Wide: true}, + model1.HeaderColumn{Name: "B", Attrs: model1.Attrs{Wide: true}}, model1.HeaderColumn{Name: "C"}, }, h2: model1.Header{ @@ -196,13 +196,13 @@ func TestHeaderDiff(t *testing.T) { "differ-order": { h1: model1.Header{ model1.HeaderColumn{Name: "A"}, - model1.HeaderColumn{Name: "B", Wide: true}, + model1.HeaderColumn{Name: "B", Attrs: model1.Attrs{Wide: true}}, model1.HeaderColumn{Name: "C"}, }, h2: model1.Header{ model1.HeaderColumn{Name: "A"}, model1.HeaderColumn{Name: "C"}, - model1.HeaderColumn{Name: "B", Wide: true}, + model1.HeaderColumn{Name: "B", Attrs: model1.Attrs{Wide: true}}, }, e: true, }, @@ -236,8 +236,8 @@ func TestHeaderHasAge(t *testing.T) { "age": { h: model1.Header{ model1.HeaderColumn{Name: "A"}, - model1.HeaderColumn{Name: "B", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "B", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, }, e: true, age: true, @@ -312,7 +312,7 @@ func TestHeaderClone(t *testing.T) { func makeHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "A"}, - model1.HeaderColumn{Name: "B", Wide: true}, + model1.HeaderColumn{Name: "B", Attrs: model1.Attrs{Wide: true}}, model1.HeaderColumn{Name: "C"}, } } diff --git a/internal/model1/table_data.go b/internal/model1/table_data.go index 702a86edc4..d6e5bc82e3 100644 --- a/internal/model1/table_data.go +++ b/internal/model1/table_data.go @@ -322,35 +322,21 @@ func (t *TableData) Labelize(labels []string) *TableData { } // Customize returns a new model with customized column layout. -func (t *TableData) Customize(vs *config.ViewSetting, sc SortColumn, manual, wide bool) (*TableData, SortColumn) { +func (t *TableData) Customize(vs *config.ViewSetting, sc SortColumn, manual bool) (*TableData, SortColumn) { if vs.IsBlank() { if sc.Name != "" { return t, sc } - psc, err := t.sortCol(vs) - if err == nil { + if psc, err := t.sortCol(vs); err == nil { return t, psc } return t, sc } - - cols := vs.Columns - cdata := TableData{ - gvr: t.gvr, - namespace: t.namespace, - header: t.header.Customize(cols, wide), - } - ids := t.header.MapIndices(cols, wide) - cdata.rowEvents = t.rowEvents.Customize(ids) - if manual || vs == nil { - return &cdata, sc - } - psc, err := cdata.sortCol(vs) - if err != nil { - return &cdata, sc + if s, asc, err := vs.SortCol(); err == nil { + return t, SortColumn{Name: s, ASC: asc} } - return &cdata, psc + return t, sc } func (t *TableData) sortCol(vs *config.ViewSetting) (SortColumn, error) { diff --git a/internal/model1/table_data_test.go b/internal/model1/table_data_test.go index fc338a5649..80237701b4 100644 --- a/internal/model1/table_data_test.go +++ b/internal/model1/table_data_test.go @@ -57,7 +57,7 @@ func TestTableDataCustomize(t *testing.T) { client.NewGVR("test"), Header{ HeaderColumn{Name: "A"}, - HeaderColumn{Name: "B", Wide: true}, + HeaderColumn{Name: "B", Attrs: Attrs{Wide: true}}, HeaderColumn{Name: "C"}, }, NewRowEventsWithEvts( @@ -71,7 +71,7 @@ func TestTableDataCustomize(t *testing.T) { client.NewGVR("test"), Header{ HeaderColumn{Name: "A"}, - HeaderColumn{Name: "B", Wide: false}, + HeaderColumn{Name: "B", Attrs: Attrs{Wide: true}}, HeaderColumn{Name: "C"}, }, NewRowEventsWithEvts( @@ -86,7 +86,7 @@ func TestTableDataCustomize(t *testing.T) { client.NewGVR("test"), Header{ HeaderColumn{Name: "A"}, - HeaderColumn{Name: "B", Wide: true}, + HeaderColumn{Name: "B", Attrs: Attrs{Wide: true}}, HeaderColumn{Name: "C"}, }, NewRowEventsWithEvts( @@ -101,13 +101,13 @@ func TestTableDataCustomize(t *testing.T) { client.NewGVR("test"), Header{ HeaderColumn{Name: "A"}, + HeaderColumn{Name: "B", Attrs: Attrs{Wide: true}}, HeaderColumn{Name: "C"}, - HeaderColumn{Name: "B", Wide: true}, }, NewRowEventsWithEvts( - RowEvent{Row: Row{ID: "A", Fields: Fields{"1", "3", "2"}}}, - RowEvent{Row: Row{ID: "B", Fields: Fields{"0", "3", "2"}}}, - RowEvent{Row: Row{ID: "C", Fields: Fields{"10", "3", "2"}}}, + RowEvent{Row: Row{ID: "A", Fields: Fields{"1", "2", "3"}}}, + RowEvent{Row: Row{ID: "B", Fields: Fields{"0", "2", "3"}}}, + RowEvent{Row: Row{ID: "C", Fields: Fields{"10", "2", "3"}}}, ), ), }, @@ -116,7 +116,7 @@ func TestTableDataCustomize(t *testing.T) { for k := range uu { u := uu[k] t.Run(k, func(t *testing.T) { - td, _ := u.t1.Customize(&u.vs, u.sc, u.manual, u.wide) + td, _ := u.t1.Customize(&u.vs, u.sc, u.manual) assert.Equal(t, u.e, td) }) } diff --git a/internal/model1/types.go b/internal/model1/types.go index 2fc32ad278..bd40b49fa9 100644 --- a/internal/model1/types.go +++ b/internal/model1/types.go @@ -4,6 +4,7 @@ package model1 import ( + "github.com/derailed/k9s/internal/config" "github.com/derailed/tcell/v2" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -46,6 +47,8 @@ type Renderer interface { // ColorerFunc returns a row colorer function. ColorerFunc() ColorerFunc + + SetViewSetting(vs *config.ViewSetting) } // Generic represents a generic resource. From 8ddda2dec42aa901f0bb3e4fcab76c118067d0a2 Mon Sep 17 00:00:00 2001 From: derailed Date: Sat, 15 Feb 2025 13:38:11 -0700 Subject: [PATCH 7/9] [custv] render updates --- internal/render/base.go | 40 ++- internal/render/benchmark.go | 10 +- internal/render/cm.go | 36 ++- internal/render/container.go | 57 +++-- internal/render/cr.go | 31 ++- internal/render/crb.go | 31 ++- internal/render/crd.go | 52 ++-- internal/render/cronjob.go | 42 ++- internal/render/cust_col.go | 104 ++++++++ internal/render/cust_col_test.go | 240 ++++++++++++++++++ internal/render/cust_cols.go | 224 ++++++++++++++++ internal/render/cust_cols_test.go | 235 +++++++++++++++++ internal/render/dir.go | 3 + internal/render/dp.go | 40 ++- internal/render/ds.go | 48 +++- internal/render/ep.go | 27 +- internal/render/ev.go | 9 +- internal/render/generic.go | 142 +++-------- internal/render/helm/chart.go | 7 +- internal/render/helm/history.go | 5 +- internal/render/helpers.go | 39 +-- internal/render/helpers_test.go | 20 +- internal/render/hpa.go | 2 +- internal/render/hpa_test.go | 8 +- internal/render/job.go | 50 ++-- internal/render/node.go | 73 ++++-- internal/render/np.go | 52 +++- internal/render/np_test.go | 2 +- internal/render/ns.go | 35 ++- internal/render/pdb.go | 43 +++- internal/render/pod.go | 73 ++++-- internal/render/pod_test.go | 6 +- internal/render/policy.go | 4 +- internal/render/portforward.go | 4 +- internal/render/pv.go | 38 ++- internal/render/pvc.go | 36 ++- internal/render/rbac.go | 2 +- internal/render/ro.go | 49 ++-- internal/render/rob.go | 49 ++-- internal/render/rs.go | 41 ++- internal/render/sa.go | 32 ++- internal/render/sc.go | 32 ++- internal/render/screen_dump.go | 4 +- internal/render/secret.go | 32 ++- internal/render/sts.go | 40 ++- internal/render/subject.go | 2 +- internal/render/svc.go | 37 ++- internal/render/table.go | 168 ++++++++++++ .../render/{generic_test.go => table_test.go} | 117 ++++++--- internal/render/workload.go | 4 +- 50 files changed, 1964 insertions(+), 513 deletions(-) create mode 100644 internal/render/cust_col.go create mode 100644 internal/render/cust_col_test.go create mode 100644 internal/render/cust_cols.go create mode 100644 internal/render/cust_cols_test.go create mode 100644 internal/render/table.go rename internal/render/{generic_test.go => table_test.go} (64%) diff --git a/internal/render/base.go b/internal/render/base.go index 003fe6a860..34bb5e3188 100644 --- a/internal/render/base.go +++ b/internal/render/base.go @@ -4,7 +4,9 @@ package render import ( + "github.com/derailed/k9s/internal/config" "github.com/derailed/k9s/internal/model1" + "github.com/rs/zerolog/log" ) // DecoratorFunc decorates a string. @@ -15,19 +17,49 @@ var AgeDecorator = func(a string) string { return toAgeHuman(a) } -type Base struct{} +type Base struct { + vs *config.ViewSetting + specs ColumnSpecs + includeObj bool +} + +func (b *Base) SetIncludeObject(f bool) { + b.includeObj = f +} // IsGeneric identifies a generic handler. -func (Base) IsGeneric() bool { +func (*Base) IsGeneric() bool { return false } +func (b *Base) doHeader(dh model1.Header) model1.Header { + if b.specs.isEmpty() { + return dh + } + + return b.specs.Header(dh) +} + +func (b *Base) SetViewSetting(vs *config.ViewSetting) { + var cols []string + b.vs = vs + if vs != nil { + cols = vs.Columns + } + specs, err := NewColsSpecs(cols...).parseSpecs() + if err != nil { + log.Error().Err(err).Msg("unable to grok custom columns") + return + } + b.specs = specs +} + // ColorerFunc colors a resource row. -func (Base) ColorerFunc() model1.ColorerFunc { +func (*Base) ColorerFunc() model1.ColorerFunc { return model1.DefaultColorer } // Happy returns true if resource is happy, false otherwise. -func (Base) Happy(string, *model1.Row) bool { +func (*Base) Happy(string, *model1.Row) bool { return true } diff --git a/internal/render/benchmark.go b/internal/render/benchmark.go index ded85e3170..c2cc433e7c 100644 --- a/internal/render/benchmark.go +++ b/internal/render/benchmark.go @@ -51,12 +51,12 @@ func (Benchmark) Header(ns string) model1.Header { model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "STATUS"}, model1.HeaderColumn{Name: "TIME"}, - model1.HeaderColumn{Name: "REQ/S", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "2XX", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "4XX/5XX", Align: tview.AlignRight}, + model1.HeaderColumn{Name: "REQ/S", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "2XX", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "4XX/5XX", Attrs: model1.Attrs{Align: tview.AlignRight}}, model1.HeaderColumn{Name: "REPORT"}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } diff --git a/internal/render/cm.go b/internal/render/cm.go index f6158efbeb..9811425a01 100644 --- a/internal/render/cm.go +++ b/internal/render/cm.go @@ -7,12 +7,11 @@ import ( "fmt" "strconv" - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - "github.com/derailed/k9s/internal/client" "github.com/derailed/k9s/internal/model1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" ) // ConfigMap renders a K8s ConfigMap to screen. @@ -20,19 +19,42 @@ type ConfigMap struct { Base } +// Header returns a header row. +func (m ConfigMap) Header(_ string) model1.Header { + return m.doHeader(m.defaultHeader()) +} + // Header returns a header rbw. -func (ConfigMap) Header(string) model1.Header { +func (ConfigMap) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "DATA"}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (n ConfigMap) Render(o interface{}, _ string, r *model1.Row) error { +func (m ConfigMap) Render(o interface{}, ns string, row *model1.Row) error { + if err := m.defaultRow(o, row); err != nil { + return err + } + if m.specs.isEmpty() { + return nil + } + + cols, err := m.specs.realize(o.(*unstructured.Unstructured), m.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +// Render renders a K8s resource to screen. +func (ConfigMap) defaultRow(o interface{}, r *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected ConfigMap, but got %T", o) diff --git a/internal/render/container.go b/internal/render/container.go index 95f3e834f4..37cd38cc78 100644 --- a/internal/render/container.go +++ b/internal/render/container.go @@ -70,7 +70,12 @@ func (c Container) ColorerFunc() model1.ColorerFunc { } // Header returns a header row. -func (Container) Header(ns string) model1.Header { +func (c Container) Header(_ string) model1.Header { + return c.defaultHeader() +} + +// Header returns a header row. +func (Container) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "IDX"}, model1.HeaderColumn{Name: "NAME"}, @@ -78,45 +83,49 @@ func (Container) Header(ns string) model1.Header { model1.HeaderColumn{Name: "IMAGE"}, model1.HeaderColumn{Name: "READY"}, model1.HeaderColumn{Name: "STATE"}, - model1.HeaderColumn{Name: "RESTARTS", Align: tview.AlignRight}, + model1.HeaderColumn{Name: "RESTARTS", Attrs: model1.Attrs{Align: tview.AlignRight}}, model1.HeaderColumn{Name: "PROBES(L:R:S)"}, - model1.HeaderColumn{Name: "CPU", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "MEM", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "CPU/R:L", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "MEM/R:L", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "%CPU/R", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "%CPU/L", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "%MEM/R", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "%MEM/L", Align: tview.AlignRight, MX: true}, + model1.HeaderColumn{Name: "CPU", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "MEM", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "CPU/R:L", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "MEM/R:L", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "%CPU/R", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "%CPU/L", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "%MEM/R", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "%MEM/L", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, model1.HeaderColumn{Name: "PORTS"}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (c Container) Render(o interface{}, name string, r *model1.Row) error { - co, ok := o.(ContainerRes) +func (c Container) Render(o interface{}, ns string, row *model1.Row) error { + cr, ok := o.(ContainerRes) if !ok { return fmt.Errorf("expected ContainerRes, but got %T", o) } - cur, res := gatherMetrics(co.Container, co.MX) + return c.defaultRow(cr, row) +} + +func (c Container) defaultRow(cr ContainerRes, r *model1.Row) error { + cur, res := gatherMetrics(cr.Container, cr.MX) ready, state, restarts := "false", MissingValue, "0" - if co.Status != nil { - ready, state, restarts = boolToStr(co.Status.Ready), ToContainerState(co.Status.State), strconv.Itoa(int(co.Status.RestartCount)) + if cr.Status != nil { + ready, state, restarts = boolToStr(cr.Status.Ready), ToContainerState(cr.Status.State), strconv.Itoa(int(cr.Status.RestartCount)) } - r.ID = co.Container.Name + r.ID = cr.Container.Name r.Fields = model1.Fields{ - co.Idx, - co.Container.Name, + cr.Idx, + cr.Container.Name, "โ—", - co.Container.Image, + cr.Container.Image, ready, state, restarts, - probe(co.Container.LivenessProbe) + ":" + probe(co.Container.ReadinessProbe) + ":" + probe(co.Container.StartupProbe), + probe(cr.Container.LivenessProbe) + ":" + probe(cr.Container.ReadinessProbe) + ":" + probe(cr.Container.StartupProbe), toMc(cur.cpu), toMi(cur.mem), toMc(res.cpu) + ":" + toMc(res.lcpu), @@ -125,9 +134,9 @@ func (c Container) Render(o interface{}, name string, r *model1.Row) error { client.ToPercentageStr(cur.cpu, res.lcpu), client.ToPercentageStr(cur.mem, res.mem), client.ToPercentageStr(cur.mem, res.lmem), - ToContainerPorts(co.Container.Ports), + ToContainerPorts(cr.Container.Ports), AsStatus(c.diagnose(state, ready)), - ToAge(co.Age), + ToAge(cr.Age), } return nil diff --git a/internal/render/cr.go b/internal/render/cr.go index a148fc70b5..4beba4620f 100644 --- a/internal/render/cr.go +++ b/internal/render/cr.go @@ -18,21 +18,44 @@ type ClusterRole struct { Base } +// Header returns a header row. +func (c ClusterRole) Header(_ string) model1.Header { + return c.doHeader(c.defaultHeader()) +} + // Header returns a header rbw. -func (ClusterRole) Header(string) model1.Header { +func (ClusterRole) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAME"}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (ClusterRole) Render(o interface{}, ns string, r *model1.Row) error { +func (p ClusterRole) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expecting clusterrole, but got %T", o) } + if err := p.defaultRow(raw, row); err != nil { + return err + } + if p.specs.isEmpty() { + return nil + } + + cols, err := p.specs.realize(raw, p.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +// Render renders a K8s resource to screen. +func (ClusterRole) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var cr rbacv1.ClusterRole err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &cr) if err != nil { diff --git a/internal/render/crb.go b/internal/render/crb.go index 8290973e6f..ff0582c06f 100644 --- a/internal/render/crb.go +++ b/internal/render/crb.go @@ -18,24 +18,47 @@ type ClusterRoleBinding struct { Base } +// Header returns a header row. +func (c ClusterRoleBinding) Header(_ string) model1.Header { + return c.doHeader(c.defaultHeader()) +} + // Header returns a header rbw. -func (ClusterRoleBinding) Header(string) model1.Header { +func (ClusterRoleBinding) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "CLUSTERROLE"}, model1.HeaderColumn{Name: "SUBJECT-KIND"}, model1.HeaderColumn{Name: "SUBJECTS"}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (ClusterRoleBinding) Render(o interface{}, ns string, r *model1.Row) error { +func (c ClusterRoleBinding) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected ClusterRoleBinding, but got %T", o) } + if err := c.defaultRow(raw, row); err != nil { + return err + } + if c.specs.isEmpty() { + return nil + } + + // !BOZO!! Call header 2 times + cols, err := c.specs.realize(raw, c.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (ClusterRoleBinding) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var crb rbacv1.ClusterRoleBinding err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &crb) if err != nil { diff --git a/internal/render/crd.go b/internal/render/crd.go index fddeec1973..efcb6af99a 100644 --- a/internal/render/crd.go +++ b/internal/render/crd.go @@ -21,28 +21,52 @@ type CustomResourceDefinition struct { Base } +// Header returns a header row. +func (c CustomResourceDefinition) Header(_ string) model1.Header { + return c.doHeader(c.defaultHeader()) +} + // Header returns a header rbw. -func (CustomResourceDefinition) Header(string) model1.Header { +func (CustomResourceDefinition) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "GROUP"}, model1.HeaderColumn{Name: "KIND"}, model1.HeaderColumn{Name: "VERSIONS"}, model1.HeaderColumn{Name: "SCOPE"}, - model1.HeaderColumn{Name: "ALIASES", Wide: true}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "ALIASES", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (c CustomResourceDefinition) Render(o interface{}, ns string, r *model1.Row) error { +func (c CustomResourceDefinition) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected CustomResourceDefinition, but got %T", o) } + if err := c.defaultRow(raw, row); err != nil { + return err + } + if c.specs.isEmpty() { + return nil + } + + // !BOZO!! Call header 2 times + cols, err := c.specs.realize(raw, c.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +// Render renders a K8s resource to screen. +func (c CustomResourceDefinition) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var crd v1.CustomResourceDefinition err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &crd) if err != nil { @@ -114,19 +138,3 @@ func (c CustomResourceDefinition) diagnose(n string, vv []v1.CustomResourceDefin return errors.New(strings.Join(errs, " - ")) } - -func extractMetaField(m map[string]interface{}, field string) string { - f, ok := m[field] - if !ok { - log.Error().Err(fmt.Errorf("failed to extract field from meta %s", field)) - return NAValue - } - - fs, ok := f.(string) - if !ok { - log.Error().Err(fmt.Errorf("failed to extract string from field %s", field)) - return NAValue - } - - return fs -} diff --git a/internal/render/cronjob.go b/internal/render/cronjob.go index bd1ce7c334..ca1cd1dcf5 100644 --- a/internal/render/cronjob.go +++ b/internal/render/cronjob.go @@ -22,30 +22,52 @@ type CronJob struct { } // Header returns a header row. -func (CronJob) Header(ns string) model1.Header { +func (c CronJob) Header(_ string) model1.Header { + return c.doHeader(c.defaultHeader()) +} + +func (CronJob) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, - model1.HeaderColumn{Name: "VS", VS: true}, + model1.HeaderColumn{Name: "VS", Attrs: model1.Attrs{VS: true}}, model1.HeaderColumn{Name: "SCHEDULE"}, model1.HeaderColumn{Name: "SUSPEND"}, model1.HeaderColumn{Name: "ACTIVE"}, - model1.HeaderColumn{Name: "LAST_SCHEDULE", Time: true}, - model1.HeaderColumn{Name: "SELECTOR", Wide: true}, - model1.HeaderColumn{Name: "CONTAINERS", Wide: true}, - model1.HeaderColumn{Name: "IMAGES", Wide: true}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "LAST_SCHEDULE", Attrs: model1.Attrs{Time: true}}, + model1.HeaderColumn{Name: "SELECTOR", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "CONTAINERS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "IMAGES", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (c CronJob) Render(o interface{}, ns string, r *model1.Row) error { +func (c CronJob) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected CronJob, but got %T", o) } + if err := c.defaultRow(raw, row); err != nil { + return err + } + if c.specs.isEmpty() { + return nil + } + + cols, err := c.specs.realize(raw, c.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +// Render renders a K8s resource to screen. +func (c CronJob) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var cj batchv1.CronJob err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &cj) if err != nil { diff --git a/internal/render/cust_col.go b/internal/render/cust_col.go new file mode 100644 index 0000000000..10075adc23 --- /dev/null +++ b/internal/render/cust_col.go @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Authors of K9s + +package render + +import ( + "fmt" + "regexp" + + "github.com/derailed/k9s/internal/model1" + "github.com/derailed/tview" + "k8s.io/kubectl/pkg/cmd/get" +) + +var fullRX = regexp.MustCompile(`\A([\w\s-]+)\:?([^\|]*)\|?([T|N|W|L|R|H]{0,3})\b`) + +type colAttr byte + +const ( + number colAttr = 'N' + age colAttr = 'T' + wide colAttr = 'W' + alignLeft colAttr = 'L' + alignRight colAttr = 'R' + hide colAttr = 'H' +) + +type colAttrs struct { + align int + mx bool + mxc bool + mxm bool + time bool + wide bool + hide bool + capacity bool +} + +func newColFlags(flags string) colAttrs { + c := colAttrs{ + align: tview.AlignLeft, + wide: false, + } + for _, b := range []byte(flags) { + switch colAttr(b) { + case hide: + c.hide = true + case wide: + c.wide = true + case alignLeft: + c.align = tview.AlignLeft + case alignRight: + c.align = tview.AlignRight + case age: + c.time = true + case number: + c.capacity, c.align = true, tview.AlignRight + } + } + + return c +} + +type colDef struct { + colAttrs + + name string + idx int + spec string +} + +func parse(s string) (colDef, error) { + mm := fullRX.FindStringSubmatch(s) + if len(mm) == 4 { + spec, err := get.RelaxedJSONPathExpression(mm[2]) + if err != nil { + return colDef{idx: -1}, err + } + return colDef{ + name: mm[1], + idx: -1, + spec: spec, + colAttrs: newColFlags(mm[3]), + }, nil + } + + return colDef{idx: -1}, fmt.Errorf("invalid column definition %q", s) +} + +func (c colDef) toHeaderCol() model1.HeaderColumn { + return model1.HeaderColumn{ + Name: c.name, + Attrs: model1.Attrs{ + Align: c.align, + Wide: c.wide, + Time: c.time, + MX: c.mx, + MXC: c.mxc, + MXM: c.mxm, + Hide: c.hide, + Capacity: c.capacity, + }, + } +} diff --git a/internal/render/cust_col_test.go b/internal/render/cust_col_test.go new file mode 100644 index 0000000000..adf316c54d --- /dev/null +++ b/internal/render/cust_col_test.go @@ -0,0 +1,240 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Authors of K9s + +package render + +import ( + "errors" + "testing" + + "github.com/derailed/tview" + "github.com/stretchr/testify/assert" +) + +func TestCustCol_parse(t *testing.T) { + uu := map[string]struct { + s string + err error + e colDef + }{ + "empty": { + err: errors.New(`invalid column definition ""`), + }, + + "plain": { + s: "fred", + e: colDef{ + name: "fred", + idx: -1, + colAttrs: colAttrs{ + align: tview.AlignLeft, + }, + }, + }, + + "plain-wide": { + s: "fred|W", + e: colDef{ + name: "fred", + idx: -1, + colAttrs: colAttrs{ + align: tview.AlignLeft, + wide: true, + }, + }, + }, + + "plain-hide": { + s: "fred|WH", + e: colDef{ + name: "fred", + idx: -1, + colAttrs: colAttrs{ + align: tview.AlignLeft, + wide: true, + hide: true, + }, + }, + }, + + "age": { + s: "AGE|TR", + e: colDef{ + name: "AGE", + idx: -1, + colAttrs: colAttrs{ + align: tview.AlignRight, + time: true, + }, + }, + }, + + "plain-wide-right": { + s: "fred|WR", + e: colDef{ + name: "fred", + idx: -1, + colAttrs: colAttrs{ + align: tview.AlignRight, + wide: true, + }, + }, + }, + + "complex": { + s: "BLEE:.spec.addresses[?(@.type == 'CiliumInternalIP')].ip", + e: colDef{ + name: "BLEE", + idx: -1, + spec: "{.spec.addresses[?(@.type == 'CiliumInternalIP')].ip}", + colAttrs: colAttrs{ + align: tview.AlignLeft, + }, + }, + }, + + "complex-wide": { + s: "BLEE:.spec.addresses[?(@.type == 'CiliumInternalIP')].ip|WR", + e: colDef{ + name: "BLEE", + idx: -1, + spec: "{.spec.addresses[?(@.type == 'CiliumInternalIP')].ip}", + colAttrs: colAttrs{ + align: tview.AlignRight, + wide: true, + }, + }, + }, + + "full-complex-wide": { + s: "BLEE:.spec.addresses[?(@.type == 'CiliumInternalIP')].ip|WR", + e: colDef{ + name: "BLEE", + idx: -1, + spec: "{.spec.addresses[?(@.type == 'CiliumInternalIP')].ip}", + colAttrs: colAttrs{ + align: tview.AlignRight, + wide: true, + }, + }, + }, + + "full-number-wide": { + s: "fred:.metadata.name|NW", + e: colDef{ + name: "fred", + idx: -1, + spec: "{.metadata.name}", + colAttrs: colAttrs{ + align: tview.AlignRight, + capacity: true, + wide: true, + }, + }, + }, + + "full-wide": { + s: "fred:.metadata.name|RW", + e: colDef{ + name: "fred", + idx: -1, + spec: "{.metadata.name}", + colAttrs: colAttrs{ + align: tview.AlignRight, + wide: true, + }, + }, + }, + + "partial-time-no-wide": { + s: "fred:.metadata.name|T", + e: colDef{ + name: "fred", + idx: -1, + spec: "{.metadata.name}", + colAttrs: colAttrs{ + align: tview.AlignLeft, + time: true, + }, + }, + }, + + "partial-no-type-no-wide": { + s: "fred:.metadata.name", + e: colDef{ + name: "fred", + idx: -1, + spec: "{.metadata.name}", + colAttrs: colAttrs{ + align: tview.AlignLeft, + }, + }, + }, + + "partial-no-type-wide": { + s: "fred:.metadata.name|W", + e: colDef{ + name: "fred", + idx: -1, + spec: "{.metadata.name}", + colAttrs: colAttrs{ + align: tview.AlignLeft, + wide: true, + }, + }, + }, + + "toast": { + s: "fred||.metadata.name|W", + e: colDef{ + name: "fred", + idx: -1, + colAttrs: colAttrs{ + align: tview.AlignLeft, + }, + }, + }, + + "toast-no-name": { + s: `:.metadata.name.fred|TW`, + err: errors.New(`invalid column definition ":.metadata.name.fred|TW"`), + }, + + "spec-column-typed": { + s: `fred:.metadata.name.k8s:fred\.blee|TW`, + e: colDef{ + name: "fred", + spec: `{.metadata.name.k8s:fred\.blee}`, + idx: -1, + colAttrs: colAttrs{ + align: tview.AlignLeft, + time: true, + wide: true, + }, + }, + }, + + "partial-no-spec-no-wide": { + s: "fred|T", + e: colDef{ + name: "fred", + idx: -1, + colAttrs: colAttrs{ + align: tview.AlignLeft, + time: true, + }, + }, + }, + } + + for k, u := range uu { + t.Run(k, func(t *testing.T) { + c, err := parse(u.s) + if err != nil { + assert.Equal(t, u.err, err) + } else { + assert.Equal(t, u.e, c) + } + }) + } +} diff --git a/internal/render/cust_cols.go b/internal/render/cust_cols.go new file mode 100644 index 0000000000..acf541edf8 --- /dev/null +++ b/internal/render/cust_cols.go @@ -0,0 +1,224 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Authors of K9s + +package render + +import ( + "fmt" + "reflect" + "strings" + "time" + + "github.com/derailed/k9s/internal/model1" + "github.com/rs/zerolog/log" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/util/jsonpath" +) + +type ColsSpecs []string + +func NewColsSpecs(cols ...string) ColsSpecs { + return ColsSpecs(cols) +} + +func (cc ColsSpecs) parseSpecs() (ColumnSpecs, error) { + specs := make(ColumnSpecs, 0, len(cc)) + + for _, c := range cc { + def, err := parse(c) + if err != nil { + return nil, err + } + specs = append(specs, ColumnSpec{ + Header: def.toHeaderCol(), + Spec: def.spec, + }) + } + + return specs, nil +} + +type RenderedCols []RenderedCol + +func (rr RenderedCols) hydrateRow(row *model1.Row) { + ff := make(model1.Fields, 0, len(row.Fields)) + for _, c := range rr { + ff = append(ff, c.Value) + } + row.Fields = ff +} + +func (rr RenderedCols) HasHeader(n string) bool { + for _, r := range rr { + if r.has(n) { + return true + } + } + + return false +} + +type RenderedCol struct { + Header model1.HeaderColumn + Value string +} + +func (r RenderedCol) has(n string) bool { + return r.Header.Name == n +} + +type ColumnSpec struct { + Header model1.HeaderColumn + Spec string +} + +type ColumnSpecs []ColumnSpec + +func (c ColumnSpecs) isEmpty() bool { + return len(c) == 0 +} + +func (cc ColumnSpecs) Header(rh model1.Header) model1.Header { + hh := make(model1.Header, 0, len(cc)) + for _, h := range cc { + hh = append(hh, h.Header) + } + + for _, h := range rh { + if idx, ok := hh.IndexOf(h.Name, true); ok { + hh[idx].Attrs = hh[idx].Attrs.Merge(h.Attrs) + continue + } + hh = append(hh, h) + } + + return hh +} + +func (cc ColumnSpecs) realize(o runtime.Object, rh model1.Header, row *model1.Row) (RenderedCols, error) { + parsers := make([]*jsonpath.JSONPath, len(cc)) + for ix := range cc { + if cc[ix].Spec == "" { + parsers[ix] = nil + continue + } + parsers[ix] = jsonpath.New( + fmt.Sprintf("column%d", ix), + ).AllowMissingKeys(true) + if err := parsers[ix].Parse(cc[ix].Spec); err != nil { + return nil, err + } + } + + vv, err := hydrate(o, cc, parsers, rh, row) + if err != nil { + return nil, err + } + for _, hc := range rh { + if vv.HasHeader(hc.Name) { + continue + } + if idx, ok := rh.IndexOf(hc.Name, true); ok { + rc := RenderedCol{Header: hc, Value: row.Fields[idx]} + rc.Header.Wide = true + vv = append(vv, rc) + } + } + + return vv, nil +} + +func hydrate(o runtime.Object, cc ColumnSpecs, parsers []*jsonpath.JSONPath, rh model1.Header, row *model1.Row) (RenderedCols, error) { + cols := make(RenderedCols, len(parsers)) + for idx := range parsers { + parser := parsers[idx] + if parser == nil { + ix, ok := rh.IndexOf(cc[idx].Header.Name, true) + if !ok { + cols[idx] = RenderedCol{ + Header: cc[idx].Header, + Value: NAValue, + } + log.Warn().Msgf("unable to find column %s", cc[idx].Header.Name) + continue + } + var v string + if ix >= len(row.Fields) { + v = NAValue + } else { + v = row.Fields[ix] + } + cols[idx] = RenderedCol{ + Header: rh[ix], + Value: v, + } + continue + } + + var ( + vals [][]reflect.Value + err error + ) + if unstructured, ok := o.(runtime.Unstructured); ok { + vals, err = parser.FindResults(unstructured.UnstructuredContent()) + } else { + vals, err = parser.FindResults(reflect.ValueOf(o).Elem().Interface()) + } + if err != nil { + return nil, err + } + values := make([]string, 0, len(vals)) + if len(vals) == 0 || len(vals[0]) == 0 { + values = append(values, MissingValue) + } + for i := range vals { + for j := range vals[i] { + var ( + strVal string + v = vals[i][j].Interface() + ) + switch { + case cc[idx].Header.MXC: + switch k := v.(type) { + case resource.Quantity: + strVal = toMc(k.MilliValue()) + case string: + if q, err := resource.ParseQuantity(k); err == nil { + strVal = toMc(q.MilliValue()) + } + } + case cc[idx].Header.MXM: + switch k := v.(type) { + case resource.Quantity: + strVal = toMi(k.MilliValue()) + case string: + if q, err := resource.ParseQuantity(k); err == nil { + strVal = toMi(q.MilliValue()) + } + } + case cc[idx].Header.Time: + switch k := v.(type) { + case string: + if t, err := time.Parse(time.RFC3339, k); err == nil { + strVal = ToAge(metav1.Time{Time: t}) + } + case metav1.Time: + strVal = ToAge(k) + } + } + if strVal == "" { + strVal = fmt.Sprintf("%v", v) + } + values = append(values, strVal) + } + } + cols[idx] = RenderedCol{ + Header: cc[idx].Header, + Value: strings.Join(values, ","), + } + } + + return cols, nil +} diff --git a/internal/render/cust_cols_test.go b/internal/render/cust_cols_test.go new file mode 100644 index 0000000000..bd1c0d2a01 --- /dev/null +++ b/internal/render/cust_cols_test.go @@ -0,0 +1,235 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Authors of K9s + +package render + +import ( + "errors" + "testing" + + "github.com/derailed/k9s/internal/model1" + "github.com/derailed/tview" + "github.com/stretchr/testify/assert" +) + +func TestParseSpecs(t *testing.T) { + uu := map[string]struct { + cols ColsSpecs + err error + e ColumnSpecs + }{ + "empty": { + e: ColumnSpecs{}, + }, + + "plain": { + cols: ColsSpecs{ + "a", + "b", + "c", + }, + e: ColumnSpecs{ + { + Header: model1.HeaderColumn{ + Name: "a", + }, + }, + { + Header: model1.HeaderColumn{ + Name: "b", + }, + }, + { + Header: model1.HeaderColumn{ + Name: "c", + }, + }, + }, + }, + + "with-spec-plain": { + cols: ColsSpecs{ + "a", + "b:.metadata.name", + "c", + }, + e: ColumnSpecs{ + { + Header: model1.HeaderColumn{ + Name: "a", + }, + }, + { + Header: model1.HeaderColumn{ + Name: "b", + }, + Spec: "{.metadata.name}", + }, + { + Header: model1.HeaderColumn{ + Name: "c", + }, + }, + }, + }, + + "with-spec-fq": { + cols: ColsSpecs{ + "a", + "b:.metadata.name|NW", + "c", + }, + e: ColumnSpecs{ + { + Header: model1.HeaderColumn{ + Name: "a", + }, + }, + { + Header: model1.HeaderColumn{ + Name: "b", + Attrs: model1.Attrs{ + Wide: true, + Capacity: true, + Align: tview.AlignRight, + }, + }, + Spec: "{.metadata.name}", + }, + { + Header: model1.HeaderColumn{ + Name: "c", + }, + }, + }, + }, + + "spec-type-no-wide": { + cols: ColsSpecs{ + "a", + "b:.metadata.name|T", + "c", + }, + e: ColumnSpecs{ + { + Header: model1.HeaderColumn{ + Name: "a", + }, + }, + { + Header: model1.HeaderColumn{ + Name: "b", + Attrs: model1.Attrs{ + Time: true, + }, + }, + Spec: "{.metadata.name}", + }, + { + Header: model1.HeaderColumn{ + Name: "c", + }, + }, + }, + }, + + "plain-wide": { + cols: ColsSpecs{ + "a", + "b|W", + "c", + }, + e: ColumnSpecs{ + { + Header: model1.HeaderColumn{ + Name: "a", + }, + }, + { + Header: model1.HeaderColumn{ + Name: "b", + Attrs: model1.Attrs{Wide: true}, + }, + }, + { + Header: model1.HeaderColumn{ + Name: "c", + }, + }, + }, + }, + + "no-spec-kind-wide": { + cols: ColsSpecs{ + "a", + "b|NW", + "c", + }, + e: ColumnSpecs{ + { + Header: model1.HeaderColumn{ + Name: "a", + }, + }, + { + Header: model1.HeaderColumn{ + Name: "b", + Attrs: model1.Attrs{ + Align: tview.AlignRight, + Capacity: true, + Wide: true, + }, + }, + }, + { + Header: model1.HeaderColumn{ + Name: "c", + }, + }, + }, + }, + + "toast-spec": { + cols: ColsSpecs{ + "a", + "b:{{crap.bozo}}|NW", + "c", + }, + err: errors.New(`unexpected path string, expected a 'name1.name2' or '.name1.name2' or '{name1.name2}' or '{.name1.name2}'`), + }, + + "no-spec": { + cols: ColsSpecs{ + "a", + "b|NW", + "c", + }, + e: ColumnSpecs{ + { + Header: model1.HeaderColumn{ + Name: "a", + }, + }, + { + Header: model1.HeaderColumn{ + Name: "b", + Attrs: model1.Attrs{Align: tview.AlignRight, Capacity: true, Wide: true}, + }, + }, + { + Header: model1.HeaderColumn{ + Name: "c", + }, + }, + }, + }, + } + + for k, u := range uu { + t.Run(k, func(t *testing.T) { + cols, err := u.cols.parseSpecs() + assert.Equal(t, u.err, err) + assert.Equal(t, u.e, cols) + }) + } +} diff --git a/internal/render/dir.go b/internal/render/dir.go index 8e076d4e2e..cfaa5e143e 100644 --- a/internal/render/dir.go +++ b/internal/render/dir.go @@ -7,6 +7,7 @@ import ( "fmt" "os" + "github.com/derailed/k9s/internal/config" "github.com/derailed/k9s/internal/model1" "github.com/derailed/tcell/v2" "k8s.io/apimachinery/pkg/runtime" @@ -28,6 +29,8 @@ func (Dir) ColorerFunc() model1.ColorerFunc { } } +func (Dir) SetViewSetting(*config.ViewSetting) {} + // Header returns a header row. func (Dir) Header(ns string) model1.Header { return model1.Header{ diff --git a/internal/render/dp.go b/internal/render/dp.go index 1444eeb99a..014f0bbc47 100644 --- a/internal/render/dp.go +++ b/internal/render/dp.go @@ -42,27 +42,49 @@ func (d Deployment) ColorerFunc() model1.ColorerFunc { } // Header returns a header row. -func (Deployment) Header(ns string) model1.Header { +func (d Deployment) Header(_ string) model1.Header { + return d.doHeader(d.defaultHeader()) +} + +func (Deployment) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, - model1.HeaderColumn{Name: "VS", VS: true}, - model1.HeaderColumn{Name: "READY", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "UP-TO-DATE", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "AVAILABLE", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "VS", Attrs: model1.Attrs{VS: true}}, + model1.HeaderColumn{Name: "READY", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "UP-TO-DATE", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "AVAILABLE", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (d Deployment) Render(o interface{}, ns string, r *model1.Row) error { +func (d Deployment) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected Deployment, but got %T", o) } + if err := d.defaultRow(raw, row); err != nil { + return err + } + if d.specs.isEmpty() { + return nil + } + // !BOZO!! Call header 2 times + cols, err := d.specs.realize(raw, d.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +// Render renders a K8s resource to screen. +func (d Deployment) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var dp appsv1.Deployment err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &dp) if err != nil { diff --git a/internal/render/ds.go b/internal/render/ds.go index b3f047aa7a..433b2a0047 100644 --- a/internal/render/ds.go +++ b/internal/render/ds.go @@ -21,28 +21,52 @@ type DaemonSet struct { } // Header returns a header row. -func (DaemonSet) Header(ns string) model1.Header { +func (d DaemonSet) Header(_ string) model1.Header { + return d.doHeader(d.defaultHeader()) +} + +// Header returns a header row. +func (DaemonSet) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, - model1.HeaderColumn{Name: "VS", VS: true}, - model1.HeaderColumn{Name: "DESIRED", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "CURRENT", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "READY", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "UP-TO-DATE", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "AVAILABLE", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "VS", Attrs: model1.Attrs{VS: true}}, + model1.HeaderColumn{Name: "DESIRED", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "CURRENT", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "READY", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "UP-TO-DATE", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "AVAILABLE", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (d DaemonSet) Render(o interface{}, ns string, r *model1.Row) error { +func (d DaemonSet) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { - return fmt.Errorf("expected DaemonSet, but got %T", o) + return fmt.Errorf("expected Deployment, but got %T", o) + } + if err := d.defaultRow(raw, row); err != nil { + return err + } + if d.specs.isEmpty() { + return nil } + + // !BOZO!! Call header 2 times + cols, err := d.specs.realize(raw, d.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +// Render renders a K8s resource to screen. +func (d DaemonSet) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var ds appsv1.DaemonSet err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &ds) if err != nil { diff --git a/internal/render/ep.go b/internal/render/ep.go index 9fa4bcc80d..70f404ad1d 100644 --- a/internal/render/ep.go +++ b/internal/render/ep.go @@ -21,17 +21,38 @@ type Endpoints struct { } // Header returns a header row. -func (Endpoints) Header(ns string) model1.Header { +func (e Endpoints) Header(_ string) model1.Header { + return e.doHeader(e.defaultHeader()) +} + +// Header returns a header row. +func (Endpoints) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "ENDPOINTS"}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (e Endpoints) Render(o interface{}, ns string, r *model1.Row) error { +func (e Endpoints) Render(o interface{}, ns string, row *model1.Row) error { + if err := e.defaultRow(o, ns, row); err != nil { + return err + } + if e.specs.isEmpty() { + return nil + } + cols, err := e.specs.realize(o.(*unstructured.Unstructured), e.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (e Endpoints) defaultRow(o interface{}, ns string, r *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected Endpoints, but got %T", o) diff --git a/internal/render/ev.go b/internal/render/ev.go index 28e04f7923..3157251c46 100644 --- a/internal/render/ev.go +++ b/internal/render/ev.go @@ -15,7 +15,7 @@ import ( // Event renders a K8s Event to screen. type Event struct { - Generic + Table } func (*Event) IsGeneric() bool { @@ -41,13 +41,15 @@ var ageCols = map[string]struct{}{ var wideCols = map[string]struct{}{ "SUBOBJECT": {}, + "COUNT": {}, "SOURCE": {}, "FIRST SEEN": {}, "NAME": {}, "MESSAGE": {}, } -func (e *Event) Header(ns string) model1.Header { +// Header returns a header row. +func (e *Event) Header(_ string) model1.Header { if e.table == nil { return model1.Header{} } @@ -78,9 +80,6 @@ func (e *Event) Render(o interface{}, ns string, r *model1.Row) error { return err } - if !ok { - return fmt.Errorf("expecting row 0 to be a string but got %T", row.Cells[0]) - } r.ID = client.FQN(nns, name) r.Fields = make(model1.Fields, 0, len(e.Header(ns))) r.Fields = append(r.Fields, nns) diff --git a/internal/render/generic.go b/internal/render/generic.go index 56f5523963..bb2a577834 100644 --- a/internal/render/generic.go +++ b/internal/render/generic.go @@ -4,141 +4,65 @@ package render import ( - "encoding/json" - "errors" "fmt" - "strings" "github.com/derailed/k9s/internal/client" "github.com/derailed/k9s/internal/model1" - "github.com/rs/zerolog/log" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" ) -const ageTableCol = "Age" - -// Generic renders a generic resource to screen. +// Generic renders a K8s generic resource to screen. type Generic struct { Base - table *metav1.Table - header model1.Header - ageIndex int -} - -func (*Generic) IsGeneric() bool { - return true -} - -// SetTable sets the tabular resource. -func (g *Generic) SetTable(ns string, t *metav1.Table) { - g.table = t - g.header = g.Header(ns) } -// ColorerFunc colors a resource row. -func (*Generic) ColorerFunc() model1.ColorerFunc { - return model1.DefaultColorer +// Header returns a header row. +func (m Generic) Header(_ string) model1.Header { + return m.doHeader(m.defaultHeader()) } -// Header returns a header row. -func (g *Generic) Header(ns string) model1.Header { - if g.header != nil { - return g.header - } - if g.table == nil { - return model1.Header{} - } - h := make(model1.Header, 0, len(g.table.ColumnDefinitions)) - if !client.IsClusterScoped(ns) { - h = append(h, model1.HeaderColumn{Name: "NAMESPACE"}) - } - for i, c := range g.table.ColumnDefinitions { - if c.Name == ageTableCol { - g.ageIndex = i - continue - } - h = append(h, model1.HeaderColumn{Name: strings.ToUpper(c.Name)}) +// Header returns a header rbw. +func (Generic) defaultHeader() model1.Header { + return model1.Header{ + model1.HeaderColumn{Name: "NAMESPACE"}, + model1.HeaderColumn{Name: "NAME"}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } - if g.ageIndex > 0 { - h = append(h, model1.HeaderColumn{Name: "AGE", Time: true}) - } - - return h } // Render renders a K8s resource to screen. -func (g *Generic) Render(o interface{}, ns string, r *model1.Row) error { - row, ok := o.(metav1.TableRow) +func (m Generic) Render(o interface{}, ns string, row *model1.Row) error { + raw, ok := o.(*unstructured.Unstructured) if !ok { - return fmt.Errorf("expecting a TableRow but got %T", o) - } - nns, name, err := resourceNS(row.Object.Raw) - if err != nil { - return err + return fmt.Errorf("expected *Unstructured, but got %T", o) } - if !ok { - return fmt.Errorf("expecting row 0 to be a string but got %T", row.Cells[0]) - } - r.ID = client.FQN(nns, name) - r.Fields = make(model1.Fields, 0, len(g.Header(ns))) - if !client.IsClusterScoped(ns) { - r.Fields = append(r.Fields, nns) - } - var duration interface{} - for i, c := range row.Cells { - if g.ageIndex > 0 && i == g.ageIndex { - duration = c - continue - } - if c == nil { - r.Fields = append(r.Fields, Blank) - continue - } - r.Fields = append(r.Fields, fmt.Sprintf("%v", c)) + if err := m.defaultRow(raw, row); err != nil { + return err } - if d, ok := duration.(string); ok { - r.Fields = append(r.Fields, d) - } else if g.ageIndex > 0 { - log.Warn().Msgf("No Duration detected on age field") - r.Fields = append(r.Fields, NAValue) + if m.specs.isEmpty() { + return nil } - return nil -} - -// ---------------------------------------------------------------------------- -// Helpers... - -func resourceNS(raw []byte) (string, string, error) { - var obj map[string]interface{} - var ns, name string - err := json.Unmarshal(raw, &obj) + cols, err := m.specs.realize(o.(*unstructured.Unstructured), m.defaultHeader(), row) if err != nil { - return ns, name, err + return err } + cols.hydrateRow(row) - meta, ok := obj["metadata"].(map[string]interface{}) - if !ok { - return ns, name, errors.New("no metadata found on generic resource") - } - ina, ok := meta["name"] - if !ok { - return ns, name, errors.New("unable to extract resource name") - } - name, ok = ina.(string) - if !ok { - return ns, name, fmt.Errorf("expecting name string type but got %T", ns) - } + return nil +} - ins, ok := meta["namespace"] - if !ok { - return client.ClusterScope, name, nil +// Render renders a K8s resource to screen. +func (Generic) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { + r.ID = client.FQN(raw.GetNamespace(), raw.GetName()) + r.Fields = model1.Fields{ + raw.GetNamespace(), + raw.GetName(), + "", + ToAge(raw.GetCreationTimestamp()), } - ns, ok = ins.(string) - if !ok { - return ns, name, fmt.Errorf("expecting namespace string type but got %T", ns) - } - return ns, name, nil + return nil } diff --git a/internal/render/helm/chart.go b/internal/render/helm/chart.go index 2225118eaa..fcfb145067 100644 --- a/internal/render/helm/chart.go +++ b/internal/render/helm/chart.go @@ -8,6 +8,7 @@ import ( "strconv" "github.com/derailed/k9s/internal/client" + "github.com/derailed/k9s/internal/config" "github.com/derailed/k9s/internal/model1" "github.com/derailed/k9s/internal/render" "helm.sh/helm/v3/pkg/release" @@ -24,6 +25,8 @@ func (Chart) IsGeneric() bool { return false } +func (Chart) SetViewSetting(*config.ViewSetting) {} + // ColorerFunc colors a resource row. func (Chart) ColorerFunc() model1.ColorerFunc { return model1.DefaultColorer @@ -38,8 +41,8 @@ func (Chart) Header(_ string) model1.Header { model1.HeaderColumn{Name: "STATUS"}, model1.HeaderColumn{Name: "CHART"}, model1.HeaderColumn{Name: "APP VERSION"}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } diff --git a/internal/render/helm/history.go b/internal/render/helm/history.go index cf0f118d33..c558e660d6 100644 --- a/internal/render/helm/history.go +++ b/internal/render/helm/history.go @@ -9,6 +9,7 @@ import ( "strconv" "github.com/derailed/k9s/internal/client" + "github.com/derailed/k9s/internal/config" "github.com/derailed/k9s/internal/model1" "github.com/derailed/k9s/internal/render" ) @@ -21,6 +22,8 @@ func (History) Healthy(ctx context.Context, o interface{}) error { return nil } +func (History) SetViewSetting(*config.ViewSetting) {} + // IsGeneric identifies a generic handler. func (History) IsGeneric() bool { return false @@ -39,7 +42,7 @@ func (History) Header(_ string) model1.Header { model1.HeaderColumn{Name: "CHART"}, model1.HeaderColumn{Name: "APP VERSION"}, model1.HeaderColumn{Name: "DESCRIPTION"}, - model1.HeaderColumn{Name: "VALID", Wide: true}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, } } diff --git a/internal/render/helpers.go b/internal/render/helpers.go index 522a6fdf71..92dce48aed 100644 --- a/internal/render/helpers.go +++ b/internal/render/helpers.go @@ -223,7 +223,7 @@ func mapToStr(m map[string]string) string { for i, k := range kk { bb = append(bb, k+"="+m[k]...) if i < len(kk)-1 { - bb = append(bb, ' ') + bb = append(bb, ',') } } @@ -292,16 +292,6 @@ func strPtrToStr(s *string) string { return *s } -// // Check if string is in a string list. -// func in(ll []string, s string) bool { -// for _, l := range ll { -// if l == s { -// return true -// } -// } -// return false -// } - // Pad a string up to the given length or truncates if greater than length. func Pad(s string, width int) string { if len(s) == width { @@ -314,30 +304,3 @@ func Pad(s string, width int) string { return s + strings.Repeat(" ", width-len(s)) } - -// // Converts labels string to map. -// func labelize(labels string) map[string]string { -// ll := strings.Split(labels, ",") -// data := make(map[string]string, len(ll)) - -// for _, l := range ll { -// tokens := strings.Split(l, "=") -// if len(tokens) == 2 { -// data[tokens[0]] = tokens[1] -// } -// } - -// return data -// } - -// func sortLabels(m map[string]string) (keys, vals []string) { -// for k := range m { -// keys = append(keys, k) -// } -// sort.Strings(keys) -// for _, k := range keys { -// vals = append(vals, m[k]) -// } - -// return -// } diff --git a/internal/render/helpers_test.go b/internal/render/helpers_test.go index d0ab311e6d..355d4e6eef 100644 --- a/internal/render/helpers_test.go +++ b/internal/render/helpers_test.go @@ -20,7 +20,7 @@ import ( ) func TestTableGenericHydrate(t *testing.T) { - raw := raw(t, "p1") + raw := load(t, "p1") tt := metav1beta1.Table{ ColumnDefinitions: []metav1beta1.TableColumnDefinition{ {Name: "c1"}, @@ -29,21 +29,21 @@ func TestTableGenericHydrate(t *testing.T) { Rows: []metav1beta1.TableRow{ { Cells: []interface{}{"fred", 10}, - Object: runtime.RawExtension{Raw: raw}, + Object: runtime.RawExtension{Object: raw}, }, { Cells: []interface{}{"blee", 20}, - Object: runtime.RawExtension{Raw: raw}, + Object: runtime.RawExtension{Object: raw}, }, }, } rr := make([]model1.Row, 2) - var re Generic + var re Table re.SetTable("blee", &tt) assert.Nil(t, model1.GenericHydrate("blee", &tt, rr, &re)) assert.Equal(t, 2, len(rr)) - assert.Equal(t, 3, len(rr[0].Fields)) + assert.Equal(t, 2, len(rr[0].Fields)) } func TestTableHydrate(t *testing.T) { @@ -52,7 +52,7 @@ func TestTableHydrate(t *testing.T) { } rr := make([]model1.Row, 1) - assert.Nil(t, model1.Hydrate("blee", oo, rr, Pod{})) + assert.Nil(t, model1.Hydrate("blee", oo, rr, NewPod())) assert.Equal(t, 1, len(rr)) assert.Equal(t, 25, len(rr[0].Fields)) } @@ -313,7 +313,7 @@ func TestMapToStr(t *testing.T) { i map[string]string e string }{ - {map[string]string{"blee": "duh", "aa": "bb"}, "aa=bb blee=duh"}, + {map[string]string{"blee": "duh", "aa": "bb"}, "aa=bb,blee=duh"}, {map[string]string{}, ""}, } for _, u := range uu { @@ -438,9 +438,3 @@ func load(t *testing.T, n string) *unstructured.Unstructured { assert.Nil(t, err) return &o } - -func raw(t *testing.T, n string) []byte { - raw, err := os.ReadFile(fmt.Sprintf("testdata/%s.json", n)) - assert.Nil(t, err) - return raw -} diff --git a/internal/render/hpa.go b/internal/render/hpa.go index e12df95dac..444003229a 100644 --- a/internal/render/hpa.go +++ b/internal/render/hpa.go @@ -13,7 +13,7 @@ import ( // HorizontalPodAutoscaler renders a K8s HorizontalPodAutoscaler to screen. type HorizontalPodAutoscaler struct { - Generic + Table } // ColorerFunc colors a resource row. diff --git a/internal/render/hpa_test.go b/internal/render/hpa_test.go index 21bb0855ba..21d5e7b387 100644 --- a/internal/render/hpa_test.go +++ b/internal/render/hpa_test.go @@ -18,10 +18,10 @@ func TestHorizontalPodAutoscalerColorer(t *testing.T) { model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "REFERENCE"}, model1.HeaderColumn{Name: "TARGETS%"}, - model1.HeaderColumn{Name: "MINPODS", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "MAXPODS", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "REPLICAS", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "MINPODS", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "MAXPODS", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "REPLICAS", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } uu := map[string]struct { diff --git a/internal/render/job.go b/internal/render/job.go index 7b25c49b17..d4be14e2c6 100644 --- a/internal/render/job.go +++ b/internal/render/job.go @@ -7,7 +7,6 @@ import ( "fmt" "strconv" "strings" - "time" "github.com/derailed/k9s/internal/client" "github.com/derailed/k9s/internal/model1" @@ -24,27 +23,48 @@ type Job struct { } // Header returns a header row. -func (Job) Header(ns string) model1.Header { +func (j Job) Header(_ string) model1.Header { + return j.doHeader(j.defaultHeader()) +} + +func (Job) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, - model1.HeaderColumn{Name: "VS", VS: true}, + model1.HeaderColumn{Name: "VS", Attrs: model1.Attrs{VS: true}}, model1.HeaderColumn{Name: "COMPLETIONS"}, model1.HeaderColumn{Name: "DURATION"}, - model1.HeaderColumn{Name: "SELECTOR", Wide: true}, - model1.HeaderColumn{Name: "CONTAINERS", Wide: true}, - model1.HeaderColumn{Name: "IMAGES", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "SELECTOR", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "CONTAINERS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "IMAGES", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (j Job) Render(o interface{}, ns string, r *model1.Row) error { +func (j Job) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected Job, but got %T", o) } + if err := j.defaultRow(raw, row); err != nil { + return err + } + if j.specs.isEmpty() { + return nil + } + + cols, err := j.specs.realize(raw, j.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (j Job) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var job batchv1.Job err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &job) if err != nil { @@ -128,17 +148,9 @@ func toCompletion(spec batchv1.JobSpec, status batchv1.JobStatus) (s string) { } func toDuration(status batchv1.JobStatus) string { - if status.StartTime == nil { + if status.StartTime == nil || status.CompletionTime == nil { return MissingValue } - var d time.Duration - switch { - case status.CompletionTime == nil: - d = time.Since(status.StartTime.Time) - default: - d = status.CompletionTime.Sub(status.StartTime.Time) - } - - return duration.HumanDuration(d) + return duration.HumanDuration(status.CompletionTime.Sub(status.StartTime.Time)) } diff --git a/internal/render/node.go b/internal/render/node.go index 353816de0b..94e2087a25 100644 --- a/internal/render/node.go +++ b/internal/render/node.go @@ -31,44 +31,61 @@ type Node struct { } // Header returns a header row. -func (Node) Header(string) model1.Header { +func (n Node) Header(_ string) model1.Header { + return n.doHeader(n.defaultHeader()) +} + +func (Node) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "STATUS"}, model1.HeaderColumn{Name: "ROLE"}, - model1.HeaderColumn{Name: "ARCH", Wide: true}, + model1.HeaderColumn{Name: "ARCH", Attrs: model1.Attrs{Wide: true}}, model1.HeaderColumn{Name: "TAINTS"}, model1.HeaderColumn{Name: "VERSION"}, - model1.HeaderColumn{Name: "OS-IMAGE", Wide: true}, - model1.HeaderColumn{Name: "KERNEL", Wide: true}, - model1.HeaderColumn{Name: "INTERNAL-IP", Wide: true}, - model1.HeaderColumn{Name: "EXTERNAL-IP", Wide: true}, - model1.HeaderColumn{Name: "PODS", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "CPU", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "MEM", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "%CPU", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "%MEM", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "CPU/A", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "MEM/A", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "OS-IMAGE", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "KERNEL", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "INTERNAL-IP", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "EXTERNAL-IP", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "PODS", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "CPU", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "MEM", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "%CPU", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "%MEM", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "CPU/A", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "MEM/A", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (n Node) Render(o interface{}, ns string, r *model1.Row) error { - oo, ok := o.(*NodeWithMetrics) +func (n Node) Render(o interface{}, ns string, row *model1.Row) error { + nwm, ok := o.(*NodeWithMetrics) if !ok { - return fmt.Errorf("expected *NodeAndMetrics, but got %T", o) + return fmt.Errorf("expected PodWithMetrics, but got %T", o) } - meta, ok := oo.Raw.Object["metadata"].(map[string]interface{}) - if !ok { - return fmt.Errorf("unable to extract meta") + if err := n.defaultRow(nwm, row); err != nil { + return err } - na := extractMetaField(meta, "name") + if n.specs.isEmpty() { + return nil + } + + cols, err := n.specs.realize(nwm.Raw, n.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +// Render renders a K8s resource to screen. +func (n Node) defaultRow(nwm *NodeWithMetrics, r *model1.Row) error { var no v1.Node - err := runtime.DefaultUnstructuredConverter.FromUnstructured(oo.Raw.Object, &no) + err := runtime.DefaultUnstructuredConverter.FromUnstructured(nwm.Raw.Object, &no) if err != nil { return err } @@ -76,7 +93,7 @@ func (n Node) Render(o interface{}, ns string, r *model1.Row) error { iIP, eIP := getIPs(no.Status.Addresses) iIP, eIP = missing(iIP), missing(eIP) - c, a := gatherNodeMX(&no, oo.MX) + c, a := gatherNodeMX(&no, nwm.MX) statuses := make(sort.StringSlice, 10) status(no.Status.Conditions, no.Spec.Unschedulable, statuses) sort.Sort(statuses) @@ -84,11 +101,11 @@ func (n Node) Render(o interface{}, ns string, r *model1.Row) error { nodeRoles(&no, roles) sort.Sort(roles) - podCount := strconv.Itoa(oo.PodCount) - if pc := oo.PodCount; pc == -1 { + podCount := strconv.Itoa(nwm.PodCount) + if pc := nwm.PodCount; pc == -1 { podCount = NAValue } - r.ID = client.FQN("", na) + r.ID = client.FQN("", no.Name) r.Fields = model1.Fields{ no.Name, join(statuses, ","), diff --git a/internal/render/np.go b/internal/render/np.go index 8f7bb24262..364261e8c9 100644 --- a/internal/render/np.go +++ b/internal/render/np.go @@ -21,28 +21,50 @@ type NetworkPolicy struct { } // Header returns a header row. -func (NetworkPolicy) Header(ns string) model1.Header { +func (p NetworkPolicy) Header(_ string) model1.Header { + return p.doHeader(p.defaultHeader()) +} + +func (NetworkPolicy) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, - model1.HeaderColumn{Name: "ING-SELECTOR", Wide: true}, - model1.HeaderColumn{Name: "ING-PORTS"}, - model1.HeaderColumn{Name: "ING-BLOCK"}, - model1.HeaderColumn{Name: "EGR-SELECTOR", Wide: true}, - model1.HeaderColumn{Name: "EGR-PORTS"}, - model1.HeaderColumn{Name: "EGR-BLOCK"}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "POD-SELECTOR"}, + model1.HeaderColumn{Name: "ING-SELECTOR", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "ING-PORTS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "ING-BLOCK", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "EGR-SELECTOR", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "EGR-PORTS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "EGR-BLOCK", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (n NetworkPolicy) Render(o interface{}, ns string, r *model1.Row) error { +func (p NetworkPolicy) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected NetworkPolicy, but got %T", o) } + if err := p.defaultRow(raw, row); err != nil { + return err + } + if p.specs.isEmpty() { + return nil + } + + cols, err := p.specs.realize(raw, p.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (n NetworkPolicy) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var np netv1.NetworkPolicy err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &np) if err != nil { @@ -52,10 +74,18 @@ func (n NetworkPolicy) Render(o interface{}, ns string, r *model1.Row) error { ip, is, ib := ingress(np.Spec.Ingress) ep, es, eb := egress(np.Spec.Egress) + var podSel string + if len(np.Spec.PodSelector.MatchLabels) > 0 { + podSel = mapToStr(np.Spec.PodSelector.MatchLabels) + } + if len(np.Spec.PodSelector.MatchExpressions) > 0 { + podSel += "::" + expToStr(np.Spec.PodSelector.MatchExpressions) + } r.ID = client.MetaFQN(np.ObjectMeta) r.Fields = model1.Fields{ np.Namespace, np.Name, + podSel, is, ip, ib, diff --git a/internal/render/np_test.go b/internal/render/np_test.go index bd371df453..28942782d8 100644 --- a/internal/render/np_test.go +++ b/internal/render/np_test.go @@ -17,5 +17,5 @@ func TestNetworkPolicyRender(t *testing.T) { assert.NoError(t, c.Render(load(t, "np"), "", &r)) assert.Equal(t, "default/fred", r.ID) - assert.Equal(t, model1.Fields{"default", "fred", "ns:app=blee,po:app=fred", "TCP:6379", "172.17.0.0/16[172.17.1.0/24,172.17.3.0/24...]", "", "TCP:5978", "10.0.0.0/24"}, r.Fields[:8]) + assert.Equal(t, model1.Fields{"default", "fred", "app=nginx", "ns:app=blee,po:app=fred", "TCP:6379", "172.17.0.0/16[172.17.1.0/24,172.17.3.0/24...]", "", "TCP:5978", "10.0.0.0/24"}, r.Fields[:9]) } diff --git a/internal/render/ns.go b/internal/render/ns.go index 4f9ecf81f6..6438c945f6 100644 --- a/internal/render/ns.go +++ b/internal/render/ns.go @@ -39,23 +39,44 @@ func (n Namespace) ColorerFunc() model1.ColorerFunc { } } -// Header returns a header rbw. -func (Namespace) Header(string) model1.Header { +// Header returns a header row. +func (n Namespace) Header(_ string) model1.Header { + return n.doHeader(n.defaultHeader()) +} + +func (Namespace) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "STATUS"}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (n Namespace) Render(o interface{}, _ string, r *model1.Row) error { +func (n Namespace) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { - return fmt.Errorf("expected Namespace, but got %T", o) + return fmt.Errorf("expected NetworkPolicy, but got %T", o) + } + if err := n.defaultRow(raw, row); err != nil { + return err } + if n.specs.isEmpty() { + return nil + } + + cols, err := n.specs.realize(raw, n.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (n Namespace) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var ns v1.Namespace err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &ns) if err != nil { diff --git a/internal/render/pdb.go b/internal/render/pdb.go index f80fb4eef7..f5ff6bc51e 100644 --- a/internal/render/pdb.go +++ b/internal/render/pdb.go @@ -22,28 +22,49 @@ type PodDisruptionBudget struct { } // Header returns a header row. -func (PodDisruptionBudget) Header(ns string) model1.Header { +func (p PodDisruptionBudget) Header(_ string) model1.Header { + return p.doHeader(p.defaultHeader()) +} + +func (PodDisruptionBudget) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, - model1.HeaderColumn{Name: "MIN AVAILABLE", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "MAX UNAVAILABLE", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "ALLOWED DISRUPTIONS", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "CURRENT", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "DESIRED", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "EXPECTED", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "MIN-AVAILABLE", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "MAX-UNAVAILABLE", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "ALLOWED-DISRUPTIONS", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "CURRENT", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "DESIRED", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "EXPECTED", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (p PodDisruptionBudget) Render(o interface{}, ns string, r *model1.Row) error { +func (p PodDisruptionBudget) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected PodDisruptionBudget, but got %T", o) } + if err := p.defaultRow(raw, row); err != nil { + return err + } + if p.specs.isEmpty() { + return nil + } + + cols, err := p.specs.realize(raw, p.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (p PodDisruptionBudget) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var pdb v1.PodDisruptionBudget err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &pdb) if err != nil { diff --git a/internal/render/pod.go b/internal/render/pod.go index a501cad6ce..bff3a716a3 100644 --- a/internal/render/pod.go +++ b/internal/render/pod.go @@ -8,6 +8,8 @@ import ( "strconv" "strings" + "github.com/derailed/k9s/internal/client" + "github.com/derailed/k9s/internal/model1" "github.com/derailed/tcell/v2" "github.com/derailed/tview" v1 "k8s.io/api/core/v1" @@ -17,9 +19,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" mv1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1" - - "github.com/derailed/k9s/internal/client" - "github.com/derailed/k9s/internal/model1" ) const ( @@ -49,7 +48,14 @@ const ( // Pod renders a K8s Pod to screen. type Pod struct { - Base + *Base +} + +// NewPod returns a new instance. +func NewPod() *Pod { + return &Pod{ + Base: new(Base), + } } // ColorerFunc colors a resource row. @@ -84,33 +90,37 @@ func (p Pod) ColorerFunc() model1.ColorerFunc { } // Header returns a header row. -func (p Pod) Header(ns string) model1.Header { +func (p Pod) Header(_ string) model1.Header { + return p.doHeader(p.defaultHeader()) +} + +func (Pod) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, - model1.HeaderColumn{Name: "VS", VS: true}, + model1.HeaderColumn{Name: "VS", Attrs: model1.Attrs{VS: true}}, model1.HeaderColumn{Name: "PF"}, model1.HeaderColumn{Name: "READY"}, model1.HeaderColumn{Name: "STATUS"}, - model1.HeaderColumn{Name: "RESTARTS", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "LAST RESTART", Align: tview.AlignRight, Time: true, Wide: true}, - model1.HeaderColumn{Name: "CPU", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "MEM", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "CPU/R:L", Align: tview.AlignRight, Wide: true}, - model1.HeaderColumn{Name: "MEM/R:L", Align: tview.AlignRight, Wide: true}, - model1.HeaderColumn{Name: "%CPU/R", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "%CPU/L", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "%MEM/R", Align: tview.AlignRight, MX: true}, - model1.HeaderColumn{Name: "%MEM/L", Align: tview.AlignRight, MX: true}, + model1.HeaderColumn{Name: "RESTARTS", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "LAST RESTART", Attrs: model1.Attrs{Align: tview.AlignRight, Time: true, Wide: true}}, + model1.HeaderColumn{Name: "CPU", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "MEM", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "CPU/R:L", Attrs: model1.Attrs{Align: tview.AlignRight, Wide: true}}, + model1.HeaderColumn{Name: "MEM/R:L", Attrs: model1.Attrs{Align: tview.AlignRight, Wide: true}}, + model1.HeaderColumn{Name: "%CPU/R", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "%CPU/L", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "%MEM/R", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, + model1.HeaderColumn{Name: "%MEM/L", Attrs: model1.Attrs{Align: tview.AlignRight, MX: true}}, model1.HeaderColumn{Name: "IP"}, model1.HeaderColumn{Name: "NODE"}, - model1.HeaderColumn{Name: "SERVICEACCOUNT", Wide: true}, - model1.HeaderColumn{Name: "NOMINATED NODE", Wide: true}, - model1.HeaderColumn{Name: "READINESS GATES", Wide: true}, - model1.HeaderColumn{Name: "QOS", Wide: true}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "SERVICE-ACCOUNT", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "NOMINATED NODE", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "READINESS GATES", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "QOS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } @@ -120,7 +130,24 @@ func (p Pod) Render(o interface{}, ns string, row *model1.Row) error { if !ok { return fmt.Errorf("expected PodWithMetrics, but got %T", o) } + if err := p.defaultRow(pwm, row); err != nil { + return err + } + if p.specs.isEmpty() { + return nil + } + + // !BOZO!! Call header 2 times + cols, err := p.specs.realize(pwm.Raw, p.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} +func (p Pod) defaultRow(pwm *PodWithMetrics, row *model1.Row) error { var po v1.Pod if err := runtime.DefaultUnstructuredConverter.FromUnstructured(pwm.Raw.Object, &po); err != nil { return err diff --git a/internal/render/pod_test.go b/internal/render/pod_test.go index 5b4da9792e..2c9c96c6cd 100644 --- a/internal/render/pod_test.go +++ b/internal/render/pod_test.go @@ -157,7 +157,7 @@ func TestPodRender(t *testing.T) { MX: makePodMX("nginx", "100m", "50Mi"), } - var po render.Pod + po := render.NewPod() r := model1.NewRow(14) err := po.Render(&pom, "", &r) assert.Nil(t, err) @@ -188,7 +188,7 @@ func TestPodInitRender(t *testing.T) { MX: makePodMX("nginx", "10m", "10Mi"), } - var po render.Pod + po := render.NewPod() r := model1.NewRow(14) err := po.Render(&pom, "", &r) assert.Nil(t, err) @@ -204,7 +204,7 @@ func TestPodSidecarRender(t *testing.T) { MX: makePodMX("sleep", "100m", "40Mi"), } - var po render.Pod + po := render.NewPod() r := model1.NewRow(14) err := po.Render(&pom, "", &r) assert.Nil(t, err) diff --git a/internal/render/policy.go b/internal/render/policy.go index 777ecfaafc..2bcd82a534 100644 --- a/internal/render/policy.go +++ b/internal/render/policy.go @@ -24,7 +24,7 @@ func rbacVerbHeader() model1.Header { model1.HeaderColumn{Name: "UPDATE"}, model1.HeaderColumn{Name: "DELETE"}, model1.HeaderColumn{Name: "DEL-LIST "}, - model1.HeaderColumn{Name: "EXTRAS", Wide: true}, + model1.HeaderColumn{Name: "EXTRAS", Attrs: model1.Attrs{Wide: true}}, } } @@ -49,7 +49,7 @@ func (Policy) Header(ns string) model1.Header { model1.HeaderColumn{Name: "BINDING"}, } h = append(h, rbacVerbHeader()...) - h = append(h, model1.HeaderColumn{Name: "VALID", Wide: true}) + h = append(h, model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}) return h } diff --git a/internal/render/portforward.go b/internal/render/portforward.go index 915e325b4b..c128c2f2ae 100644 --- a/internal/render/portforward.go +++ b/internal/render/portforward.go @@ -59,8 +59,8 @@ func (PortForward) Header(ns string) model1.Header { model1.HeaderColumn{Name: "URL"}, model1.HeaderColumn{Name: "C"}, model1.HeaderColumn{Name: "N"}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } diff --git a/internal/render/pv.go b/internal/render/pv.go index 9e42893725..3c66f656cd 100644 --- a/internal/render/pv.go +++ b/internal/render/pv.go @@ -47,30 +47,52 @@ func (p PersistentVolume) ColorerFunc() model1.ColorerFunc { } } -// Header returns a header rbw. -func (PersistentVolume) Header(string) model1.Header { +// Header returns a header row. +func (p PersistentVolume) Header(_ string) model1.Header { + return p.doHeader(p.defaultHeader()) +} + +func (PersistentVolume) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAME"}, - model1.HeaderColumn{Name: "CAPACITY", Capacity: true}, + model1.HeaderColumn{Name: "CAPACITY", Attrs: model1.Attrs{Capacity: true}}, model1.HeaderColumn{Name: "ACCESS MODES"}, model1.HeaderColumn{Name: "RECLAIM POLICY"}, model1.HeaderColumn{Name: "STATUS"}, model1.HeaderColumn{Name: "CLAIM"}, model1.HeaderColumn{Name: "STORAGECLASS"}, model1.HeaderColumn{Name: "REASON"}, - model1.HeaderColumn{Name: "VOLUMEMODE", Wide: true}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "VOLUMEMODE", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (p PersistentVolume) Render(o interface{}, ns string, r *model1.Row) error { +func (p PersistentVolume) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected PersistentVolume, but got %T", o) } + + if err := p.defaultRow(raw, row); err != nil { + return err + } + if p.specs.isEmpty() { + return nil + } + + cols, err := p.specs.realize(raw, p.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (p PersistentVolume) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var pv v1.PersistentVolume err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &pv) if err != nil { diff --git a/internal/render/pvc.go b/internal/render/pvc.go index 79678346bc..e4a272f24c 100644 --- a/internal/render/pvc.go +++ b/internal/render/pvc.go @@ -18,28 +18,50 @@ type PersistentVolumeClaim struct { Base } -// Header returns a header rbw. -func (PersistentVolumeClaim) Header(ns string) model1.Header { +// Header returns a header row. +func (p PersistentVolumeClaim) Header(_ string) model1.Header { + return p.doHeader(p.defaultHeader()) +} + +func (PersistentVolumeClaim) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "STATUS"}, model1.HeaderColumn{Name: "VOLUME"}, - model1.HeaderColumn{Name: "CAPACITY", Capacity: true}, + model1.HeaderColumn{Name: "CAPACITY", Attrs: model1.Attrs{Capacity: true}}, model1.HeaderColumn{Name: "ACCESS MODES"}, model1.HeaderColumn{Name: "STORAGECLASS"}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (p PersistentVolumeClaim) Render(o interface{}, ns string, r *model1.Row) error { +func (p PersistentVolumeClaim) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected PersistentVolumeClaim, but got %T", o) } + + if err := p.defaultRow(raw, row); err != nil { + return err + } + if p.specs.isEmpty() { + return nil + } + + cols, err := p.specs.realize(raw, p.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (p PersistentVolumeClaim) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var pvc v1.PersistentVolumeClaim err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &pvc) if err != nil { diff --git a/internal/render/rbac.go b/internal/render/rbac.go index 12ad96e7a5..8869ad6315 100644 --- a/internal/render/rbac.go +++ b/internal/render/rbac.go @@ -51,7 +51,7 @@ func (Rbac) Header(ns string) model1.Header { ) h = append(h, rbacVerbHeader()...) - return append(h, model1.HeaderColumn{Name: "VALID", Wide: true}) + return append(h, model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}) } // Render renders a K8s resource to screen. diff --git a/internal/render/ro.go b/internal/render/ro.go index 7b3ce31549..7bf0334900 100644 --- a/internal/render/ro.go +++ b/internal/render/ro.go @@ -19,26 +19,44 @@ type Role struct { } // Header returns a header row. -func (Role) Header(ns string) model1.Header { - var h model1.Header - if client.IsAllNamespaces(ns) { - h = append(h, model1.HeaderColumn{Name: "NAMESPACE"}) - } +func (r Role) Header(_ string) model1.Header { + return r.doHeader(r.defaultHeader()) +} - return append(h, +func (Role) defaultHeader() model1.Header { + return model1.Header{ + model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, - ) + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, + } } // Render renders a K8s resource to screen. -func (r Role) Render(o interface{}, ns string, row *model1.Row) error { +func (r Role) Render(o interface{}, _ string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected Role, but got %T", o) } + + if err := r.defaultRow(raw, row); err != nil { + return err + } + if r.specs.isEmpty() { + return nil + } + + cols, err := r.specs.realize(raw, r.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (r Role) defaultRow(raw *unstructured.Unstructured, row *model1.Row) error { var ro rbacv1.Role err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &ro) if err != nil { @@ -46,16 +64,13 @@ func (r Role) Render(o interface{}, ns string, row *model1.Row) error { } row.ID = client.MetaFQN(ro.ObjectMeta) - row.Fields = make(model1.Fields, 0, len(r.Header(ns))) - if client.IsAllNamespaces(ns) { - row.Fields = append(row.Fields, ro.Namespace) - } - row.Fields = append(row.Fields, + row.Fields = model1.Fields{ + ro.Namespace, ro.Name, mapToStr(ro.Labels), "", ToAge(ro.GetCreationTimestamp()), - ) + } return nil } diff --git a/internal/render/rob.go b/internal/render/rob.go index 1f58fd609c..0f025541ed 100644 --- a/internal/render/rob.go +++ b/internal/render/rob.go @@ -19,22 +19,22 @@ type RoleBinding struct { Base } -// Header returns a header rbw. -func (RoleBinding) Header(ns string) model1.Header { - var h model1.Header - if client.IsAllNamespaces(ns) { - h = append(h, model1.HeaderColumn{Name: "NAMESPACE"}) - } +// Header returns a header row. +func (r RoleBinding) Header(_ string) model1.Header { + return r.doHeader(r.defaultHeader()) +} - return append(h, +func (RoleBinding) defaultHeader() model1.Header { + return model1.Header{ + model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "ROLE"}, model1.HeaderColumn{Name: "KIND"}, model1.HeaderColumn{Name: "SUBJECTS"}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, - ) + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, + } } // Render renders a K8s resource to screen. @@ -43,6 +43,24 @@ func (r RoleBinding) Render(o interface{}, ns string, row *model1.Row) error { if !ok { return fmt.Errorf("expected RoleBinding, but got %T", o) } + + if err := r.defaultRow(raw, row); err != nil { + return err + } + if r.specs.isEmpty() { + return nil + } + + cols, err := r.specs.realize(raw, r.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (r RoleBinding) defaultRow(raw *unstructured.Unstructured, row *model1.Row) error { var rb rbacv1.RoleBinding err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &rb) if err != nil { @@ -52,11 +70,8 @@ func (r RoleBinding) Render(o interface{}, ns string, row *model1.Row) error { kind, ss := renderSubjects(rb.Subjects) row.ID = client.MetaFQN(rb.ObjectMeta) - row.Fields = make(model1.Fields, 0, len(r.Header(ns))) - if client.IsAllNamespaces(ns) { - row.Fields = append(row.Fields, rb.Namespace) - } - row.Fields = append(row.Fields, + row.Fields = model1.Fields{ + rb.Namespace, rb.Name, rb.RoleRef.Name, kind, @@ -64,7 +79,7 @@ func (r RoleBinding) Render(o interface{}, ns string, row *model1.Row) error { mapToStr(rb.Labels), "", ToAge(rb.GetCreationTimestamp()), - ) + } return nil } diff --git a/internal/render/rs.go b/internal/render/rs.go index 1046014f9d..45f1bd1bff 100644 --- a/internal/render/rs.go +++ b/internal/render/rs.go @@ -27,19 +27,23 @@ func (r ReplicaSet) ColorerFunc() model1.ColorerFunc { } // Header returns a header row. -func (ReplicaSet) Header(ns string) model1.Header { +func (r ReplicaSet) Header(_ string) model1.Header { + return r.doHeader(r.defaultHeader()) +} + +func (ReplicaSet) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, - model1.HeaderColumn{Name: "VS", VS: true}, - model1.HeaderColumn{Name: "DESIRED", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "CURRENT", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "READY", Align: tview.AlignRight}, - model1.HeaderColumn{Name: "CONTAINERS", Wide: true}, - model1.HeaderColumn{Name: "IMAGES", Wide: true}, - model1.HeaderColumn{Name: "SELECTOR", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "VS", Attrs: model1.Attrs{VS: true}}, + model1.HeaderColumn{Name: "DESIRED", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "CURRENT", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "READY", Attrs: model1.Attrs{Align: tview.AlignRight}}, + model1.HeaderColumn{Name: "CONTAINERS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "IMAGES", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "SELECTOR", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } @@ -50,6 +54,23 @@ func (r ReplicaSet) Render(o interface{}, ns string, row *model1.Row) error { return fmt.Errorf("expected ReplicaSet, but got %T", o) } + if err := r.defaultRow(raw, row); err != nil { + return err + } + if r.specs.isEmpty() { + return nil + } + + cols, err := r.specs.realize(raw, r.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (r ReplicaSet) defaultRow(raw *unstructured.Unstructured, row *model1.Row) error { var rs appsv1.ReplicaSet err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &rs) if err != nil { diff --git a/internal/render/sa.go b/internal/render/sa.go index 1f463a4e34..c6c801f0e8 100644 --- a/internal/render/sa.go +++ b/internal/render/sa.go @@ -20,23 +20,45 @@ type ServiceAccount struct { } // Header returns a header row. -func (ServiceAccount) Header(ns string) model1.Header { +func (s ServiceAccount) Header(_ string) model1.Header { + return s.doHeader(s.defaultHeader()) +} + +func (ServiceAccount) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "SECRET"}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (s ServiceAccount) Render(o interface{}, ns string, r *model1.Row) error { +func (s ServiceAccount) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected ServiceAccount, but got %T", o) } + + if err := s.defaultRow(raw, row); err != nil { + return err + } + if s.specs.isEmpty() { + return nil + } + + cols, err := s.specs.realize(raw, s.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (s ServiceAccount) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var sa v1.ServiceAccount err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &sa) if err != nil { diff --git a/internal/render/sc.go b/internal/render/sc.go index f805fb1000..5af82581b2 100644 --- a/internal/render/sc.go +++ b/internal/render/sc.go @@ -21,25 +21,47 @@ type StorageClass struct { } // Header returns a header row. -func (StorageClass) Header(ns string) model1.Header { +func (s StorageClass) Header(_ string) model1.Header { + return s.doHeader(s.defaultHeader()) +} + +func (StorageClass) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "PROVISIONER"}, model1.HeaderColumn{Name: "RECLAIMPOLICY"}, model1.HeaderColumn{Name: "VOLUMEBINDINGMODE"}, model1.HeaderColumn{Name: "ALLOWVOLUMEEXPANSION"}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (s StorageClass) Render(o interface{}, ns string, r *model1.Row) error { +func (s StorageClass) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected StorageClass, but got %T", o) } + + if err := s.defaultRow(raw, row); err != nil { + return err + } + if s.specs.isEmpty() { + return nil + } + + cols, err := s.specs.realize(raw, s.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (s StorageClass) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var sc storagev1.StorageClass err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &sc) if err != nil { diff --git a/internal/render/screen_dump.go b/internal/render/screen_dump.go index 8193c612dc..6558616ef5 100644 --- a/internal/render/screen_dump.go +++ b/internal/render/screen_dump.go @@ -33,8 +33,8 @@ func (ScreenDump) Header(ns string) model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "DIR"}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } diff --git a/internal/render/secret.go b/internal/render/secret.go index d1d3aad9b0..c35cfc6873 100644 --- a/internal/render/secret.go +++ b/internal/render/secret.go @@ -20,24 +20,46 @@ type Secret struct { Base } -// Header returns a header rbw. -func (Secret) Header(string) model1.Header { +// Header returns a header row. +func (s Secret) Header(_ string) model1.Header { + return s.doHeader(s.defaultHeader()) +} + +func (Secret) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "TYPE"}, model1.HeaderColumn{Name: "DATA"}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (n Secret) Render(o interface{}, _ string, r *model1.Row) error { +func (s Secret) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected Secret, but got %T", o) } + + if err := s.defaultRow(raw, row); err != nil { + return err + } + if s.specs.isEmpty() { + return nil + } + + cols, err := s.specs.realize(raw, s.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (n Secret) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var sec v1.Secret err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &sec) if err != nil { diff --git a/internal/render/sts.go b/internal/render/sts.go index c83ffa7ba6..45dd6bc660 100644 --- a/internal/render/sts.go +++ b/internal/render/sts.go @@ -20,28 +20,50 @@ type StatefulSet struct { } // Header returns a header row. -func (StatefulSet) Header(ns string) model1.Header { +func (s StatefulSet) Header(_ string) model1.Header { + return s.doHeader(s.defaultHeader()) +} + +func (StatefulSet) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, - model1.HeaderColumn{Name: "VS", VS: true}, + model1.HeaderColumn{Name: "VS", Attrs: model1.Attrs{VS: true}}, model1.HeaderColumn{Name: "READY"}, - model1.HeaderColumn{Name: "SELECTOR", Wide: true}, + model1.HeaderColumn{Name: "SELECTOR", Attrs: model1.Attrs{Wide: true}}, model1.HeaderColumn{Name: "SERVICE"}, - model1.HeaderColumn{Name: "CONTAINERS", Wide: true}, - model1.HeaderColumn{Name: "IMAGES", Wide: true}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "CONTAINERS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "IMAGES", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (s StatefulSet) Render(o interface{}, ns string, r *model1.Row) error { +func (s StatefulSet) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected StatefulSet, but got %T", o) } + + if err := s.defaultRow(raw, row); err != nil { + return err + } + if s.specs.isEmpty() { + return nil + } + + cols, err := s.specs.realize(raw, s.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (s StatefulSet) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var sts appsv1.StatefulSet err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &sts) if err != nil { diff --git a/internal/render/subject.go b/internal/render/subject.go index af3c0a6173..bb0f1b9a62 100644 --- a/internal/render/subject.go +++ b/internal/render/subject.go @@ -30,7 +30,7 @@ func (Subject) Header(ns string) model1.Header { model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "KIND"}, model1.HeaderColumn{Name: "FIRST LOCATION"}, - model1.HeaderColumn{Name: "VALID", Wide: true}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, } } diff --git a/internal/render/svc.go b/internal/render/svc.go index 73081cadf0..c01454de62 100644 --- a/internal/render/svc.go +++ b/internal/render/svc.go @@ -22,27 +22,50 @@ type Service struct { } // Header returns a header row. -func (Service) Header(ns string) model1.Header { +func (s Service) Header(_ string) model1.Header { + return s.doHeader(s.defaultHeader()) +} + +// Header returns a header row. +func (Service) defaultHeader() model1.Header { return model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "TYPE"}, model1.HeaderColumn{Name: "CLUSTER-IP"}, model1.HeaderColumn{Name: "EXTERNAL-IP"}, - model1.HeaderColumn{Name: "SELECTOR", Wide: true}, - model1.HeaderColumn{Name: "PORTS", Wide: false}, - model1.HeaderColumn{Name: "LABELS", Wide: true}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "SELECTOR", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "PORTS", Attrs: model1.Attrs{Wide: false}}, + model1.HeaderColumn{Name: "LABELS", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } // Render renders a K8s resource to screen. -func (s Service) Render(o interface{}, ns string, r *model1.Row) error { +func (s Service) Render(o interface{}, ns string, row *model1.Row) error { raw, ok := o.(*unstructured.Unstructured) if !ok { return fmt.Errorf("expected Service, but got %T", o) } + + if err := s.defaultRow(raw, row); err != nil { + return err + } + if s.specs.isEmpty() { + return nil + } + + cols, err := s.specs.realize(raw, s.defaultHeader(), row) + if err != nil { + return err + } + cols.hydrateRow(row) + + return nil +} + +func (s Service) defaultRow(raw *unstructured.Unstructured, r *model1.Row) error { var svc v1.Service err := runtime.DefaultUnstructuredConverter.FromUnstructured(raw.Object, &svc) if err != nil { diff --git a/internal/render/table.go b/internal/render/table.go new file mode 100644 index 0000000000..2b8f52edb5 --- /dev/null +++ b/internal/render/table.go @@ -0,0 +1,168 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Authors of K9s + +package render + +import ( + "encoding/json" + "errors" + "fmt" + "strings" + + "github.com/derailed/k9s/internal/client" + "github.com/derailed/k9s/internal/model1" + "github.com/rs/zerolog/log" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +const ageTableCol = "Age" + +// Table renders a tabular resource to screen. +type Table struct { + Base + table *metav1.Table + header model1.Header + ageIndex int +} + +func (*Table) IsGeneric() bool { + return true +} + +// SetTable sets the tabular resource. +func (t *Table) SetTable(ns string, table *metav1.Table) { + t.table = table + t.header = t.Header(ns) +} + +// ColorerFunc colors a resource row. +func (*Table) ColorerFunc() model1.ColorerFunc { + return model1.DefaultColorer +} + +// Header returns a header row. +func (t *Table) Header(ns string) model1.Header { + return t.doHeader(t.defaultHeader()) +} + +// Header returns a header row. +func (t *Table) defaultHeader() model1.Header { + if t.table == nil { + return model1.Header{} + } + h := make(model1.Header, 0, len(t.table.ColumnDefinitions)) + for i, c := range t.table.ColumnDefinitions { + if c.Name == ageTableCol { + t.ageIndex = i + continue + } + h = append(h, model1.HeaderColumn{Name: strings.ToUpper(c.Name)}) + } + if t.ageIndex > 0 { + h = append(h, model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}) + } + + return h +} + +// Render renders a K8s resource to screen. +func (t *Table) Render(o any, ns string, r *model1.Row) error { + row, ok := o.(metav1.TableRow) + if !ok { + return fmt.Errorf("expected Table, but got %T", o) + } + + if err := t.defaultRow(&row, ns, r); err != nil { + return err + } + if t.specs.isEmpty() { + return nil + } + + cols, err := t.specs.realize(row.Object.Object, t.defaultHeader(), r) + if err != nil { + return err + } + cols.hydrateRow(r) + + return nil +} + +func (t *Table) defaultRow(row *metav1.TableRow, ns string, r *model1.Row) error { + th := t.defaultHeader() + ons, name := ns, UnknownValue + if row.Object.Object != nil { + m, _ := meta.Accessor(row.Object.Object) + if m != nil { + ons, name = m.GetNamespace(), m.GetName() + } + } else if idx, ok := th.IndexOf("NAME", true); ok && idx >= 0 { + name = row.Cells[idx].(string) + if idx, ok := th.IndexOf("NAMESPACE", true); ok && idx >= 0 { + ons = row.Cells[idx].(string) + } + } else { + } + if client.IsClusterWide(ons) { + ons = client.ClusterScope + } + r.ID = client.FQN(ons, name) + r.Fields = make(model1.Fields, 0, len(th)) + var age any + for i, c := range row.Cells { + if t.ageIndex > 0 && i == t.ageIndex { + age = c + continue + } + if c == nil { + r.Fields = append(r.Fields, Blank) + continue + } + r.Fields = append(r.Fields, fmt.Sprintf("%v", c)) + } + if d, ok := age.(string); ok { + r.Fields = append(r.Fields, d) + } else if t.ageIndex > 0 { + log.Warn().Msgf("No Duration detected on age field") + r.Fields = append(r.Fields, NAValue) + } + + return nil +} + +// ---------------------------------------------------------------------------- +// Helpers... + +func resourceNS(raw []byte) (string, string, error) { + var obj map[string]interface{} + var ns, name string + err := json.Unmarshal(raw, &obj) + if err != nil { + return ns, name, err + } + + meta, ok := obj["metadata"].(map[string]interface{}) + if !ok { + return ns, name, errors.New("no metadata found on generic resource") + } + ina, ok := meta["name"] + if !ok { + return ns, name, errors.New("unable to extract resource name") + } + name, ok = ina.(string) + if !ok { + return ns, name, fmt.Errorf("expecting name string type but got %T", ns) + } + + ins, ok := meta["namespace"] + if !ok { + return client.ClusterScope, name, nil + } + + ns, ok = ins.(string) + if !ok { + return ns, name, fmt.Errorf("expecting namespace string type but got %T", ns) + } + return ns, name, nil +} diff --git a/internal/render/generic_test.go b/internal/render/table_test.go similarity index 64% rename from internal/render/generic_test.go rename to internal/render/table_test.go index a71807622d..add7b484e7 100644 --- a/internal/render/generic_test.go +++ b/internal/render/table_test.go @@ -7,9 +7,11 @@ import ( "testing" "github.com/derailed/k9s/internal/client" + cfg "github.com/derailed/k9s/internal/config" "github.com/derailed/k9s/internal/model1" "github.com/derailed/k9s/internal/render" "github.com/stretchr/testify/assert" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" "k8s.io/apimachinery/pkg/runtime" ) @@ -34,6 +36,7 @@ func TestGenericRender(t *testing.T) { model1.HeaderColumn{Name: "C"}, }, }, + "all": { ns: client.NamespaceAll, table: makeNSGeneric(), @@ -46,18 +49,7 @@ func TestGenericRender(t *testing.T) { model1.HeaderColumn{Name: "C"}, }, }, - "allNS": { - ns: client.NamespaceAll, - table: makeNSGeneric(), - eID: "ns1/fred", - eFields: model1.Fields{"ns1", "c1", "c2", "c3"}, - eHeader: model1.Header{ - model1.HeaderColumn{Name: "NAMESPACE"}, - model1.HeaderColumn{Name: "A"}, - model1.HeaderColumn{Name: "B"}, - model1.HeaderColumn{Name: "C"}, - }, - }, + "clusterWide": { ns: client.ClusterScope, table: makeNoNSGeneric(), @@ -69,6 +61,7 @@ func TestGenericRender(t *testing.T) { model1.HeaderColumn{Name: "C"}, }, }, + "age": { ns: client.ClusterScope, table: makeAgeGeneric(), @@ -77,13 +70,13 @@ func TestGenericRender(t *testing.T) { eHeader: model1.Header{ model1.HeaderColumn{Name: "A"}, model1.HeaderColumn{Name: "C"}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, }, }, } for k := range uu { - var re render.Generic + var re render.Table u := uu[k] t.Run(k, func(t *testing.T) { var r model1.Row @@ -97,12 +90,60 @@ func TestGenericRender(t *testing.T) { } } +func TestGenericCustRender(t *testing.T) { + uu := map[string]struct { + ns string + table *metav1beta1.Table + vs cfg.ViewSetting + eID string + eFields model1.Fields + eHeader model1.Header + }{ + "spec": { + ns: "ns1", + table: makeNSGeneric(), + vs: cfg.ViewSetting{ + Columns: []string{ + "NAMESPACE", + "BLEE:.metadata.name", + "ZORG:.metadata.namespace", + }, + }, + eID: "ns1/fred", + eFields: model1.Fields{"ns1", "fred", "ns1", "c1", "c2", "c3"}, + eHeader: model1.Header{ + model1.HeaderColumn{Name: "NAMESPACE"}, + model1.HeaderColumn{Name: "BLEE"}, + model1.HeaderColumn{Name: "ZORG"}, + model1.HeaderColumn{Name: "A"}, + model1.HeaderColumn{Name: "B"}, + model1.HeaderColumn{Name: "C"}, + }, + }, + } + + for k, u := range uu { + var re render.Table + re.SetViewSetting(&u.vs) + t.Run(k, func(t *testing.T) { + var r model1.Row + re.SetTable(u.ns, u.table) + + assert.Equal(t, u.eHeader, re.Header(u.ns)) + assert.Nil(t, re.Render(u.table.Rows[0], u.ns, &r)) + assert.Equal(t, u.eID, r.ID) + assert.Equal(t, u.eFields, r.Fields) + }) + } +} + // ---------------------------------------------------------------------------- // Helpers... func makeNSGeneric() *metav1beta1.Table { return &metav1beta1.Table{ ColumnDefinitions: []metav1beta1.TableColumnDefinition{ + {Name: "NAMESPACE"}, {Name: "a"}, {Name: "b"}, {Name: "c"}, @@ -110,15 +151,19 @@ func makeNSGeneric() *metav1beta1.Table { Rows: []metav1beta1.TableRow{ { Object: runtime.RawExtension{ - Raw: []byte(`{ - "kind": "fred", - "apiVersion": "v1", - "metadata": { - "namespace": "ns1", - "name": "fred" - }}`), + Object: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "kind": "fred", + "apiVersion": "v1", + "metadata": map[string]interface{}{ + "namespace": "ns1", + "name": "fred", + }, + }, + }, }, Cells: []interface{}{ + "ns1", "c1", "c2", "c3", @@ -138,12 +183,15 @@ func makeNoNSGeneric() *metav1beta1.Table { Rows: []metav1beta1.TableRow{ { Object: runtime.RawExtension{ - Raw: []byte(`{ - "kind": "fred", - "apiVersion": "v1", - "metadata": { - "name": "fred" - }}`), + Object: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "kind": "fred", + "apiVersion": "v1", + "metadata": map[string]interface{}{ + "name": "fred", + }, + }, + }, }, Cells: []interface{}{ "c1", @@ -165,12 +213,15 @@ func makeAgeGeneric() *metav1beta1.Table { Rows: []metav1beta1.TableRow{ { Object: runtime.RawExtension{ - Raw: []byte(`{ - "kind": "fred", - "apiVersion": "v1", - "metadata": { - "name": "fred" - }}`), + Object: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "kind": "fred", + "apiVersion": "v1", + "metadata": map[string]interface{}{ + "name": "fred", + }, + }, + }, }, Cells: []interface{}{ "c1", diff --git a/internal/render/workload.go b/internal/render/workload.go index 7a3a2645ec..b06e730025 100644 --- a/internal/render/workload.go +++ b/internal/render/workload.go @@ -45,8 +45,8 @@ func (Workload) Header(string) model1.Header { model1.HeaderColumn{Name: "NAME"}, model1.HeaderColumn{Name: "STATUS"}, model1.HeaderColumn{Name: "READY"}, - model1.HeaderColumn{Name: "VALID", Wide: true}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "VALID", Attrs: model1.Attrs{Wide: true}}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, } } From 4da3596c41071e1ac7a051ca8edd7dafd183d0ed Mon Sep 17 00:00:00 2001 From: derailed Date: Sat, 15 Feb 2025 13:38:25 -0700 Subject: [PATCH 8/9] [custv] ui updates --- internal/ui/table.go | 55 +++++++++++++++++++++------------ internal/ui/table_test.go | 31 ++++++++++--------- internal/ui/types.go | 4 +++ internal/view/alias_test.go | 40 ++++++++++++------------ internal/view/registrar.go | 4 --- internal/view/table.go | 6 +++- internal/view/table_int_test.go | 39 +++++++++++------------ 7 files changed, 101 insertions(+), 78 deletions(-) diff --git a/internal/ui/table.go b/internal/ui/table.go index a1cd7365ef..f9ef53e832 100644 --- a/internal/ui/table.go +++ b/internal/ui/table.go @@ -11,6 +11,7 @@ import ( "github.com/derailed/k9s/internal" "github.com/derailed/k9s/internal/client" "github.com/derailed/k9s/internal/config" + "github.com/derailed/k9s/internal/dao" "github.com/derailed/k9s/internal/model" "github.com/derailed/k9s/internal/model1" "github.com/derailed/k9s/internal/render" @@ -37,12 +38,12 @@ type ( // Table represents tabular data. type Table struct { - gvr client.GVR - sortCol model1.SortColumn - manualSort bool - Path string - Extras string *SelectTable + gvr client.GVR + sortCol model1.SortColumn + manualSort bool + Path string + Extras string actions *KeyActions cmdBuff *model.FishBuff styles *config.Styles @@ -64,6 +65,7 @@ func NewTable(gvr client.GVR) *Table { model: model.NewTable(gvr), marks: make(map[string]struct{}), }, + ctx: context.Background(), gvr: gvr, actions: NewKeyActions(), cmdBuff: model.NewFishBuff('/', model.FilterBuffer), @@ -106,19 +108,20 @@ func (t *Table) getMSort() bool { return t.manualSort } -func (t *Table) setVs(vs *config.ViewSetting) bool { +func (t *Table) setViewSetting(vs *config.ViewSetting) bool { t.mx.Lock() defer t.mx.Unlock() if !t.viewSetting.Equals(vs) { t.viewSetting = vs + t.model.SetViewSetting(t.ctx, vs) return true } return false } -func (t *Table) getVs() *config.ViewSetting { +func (t *Table) getViewSetting() *config.ViewSetting { t.mx.RLock() defer t.mx.RUnlock() @@ -143,9 +146,6 @@ func (t *Table) Init(ctx context.Context) { t.SetSelectionChangedFunc(t.selectionChanged) t.SetBackgroundColor(tcell.ColorDefault) t.Select(1, 0) - if cfg, ok := ctx.Value(internal.KeyViewConfig).(*config.CustomView); ok && cfg != nil { - cfg.AddListener(t.GVR().String(), t) - } t.styles = mustExtractStyles(ctx) t.StylesChanged(t.styles) } @@ -154,8 +154,11 @@ func (t *Table) Init(ctx context.Context) { func (t *Table) GVR() client.GVR { return t.gvr } // ViewSettingsChanged notifies listener the view configuration changed. -func (t *Table) ViewSettingsChanged(vs config.ViewSetting) { - if t.setVs(&vs) { +func (t *Table) ViewSettingsChanged(vs *config.ViewSetting) { + if t.setViewSetting(vs) { + if vs == nil { + t.setSortCol(model1.SortColumn{}) + } t.setMSort(false) t.Refresh() } @@ -274,7 +277,7 @@ func (t *Table) doUpdate(data *model1.TableData) *model1.TableData { t.actions.Delete(KeyShiftP) } - cdata, sortCol := data.Customize(t.getVs(), t.getSortCol(), t.getMSort(), true) + cdata, sortCol := data.Customize(t.getViewSetting(), t.getSortCol(), t.getMSort()) t.setSortCol(sortCol) return cdata @@ -285,12 +288,17 @@ func (t *Table) UpdateUI(cdata, data *model1.TableData) { fg := t.styles.Table().Header.FgColor.Color() bg := t.styles.Table().Header.BgColor.Color() + var isNamespaced bool + if m, err := dao.MetaAccess.MetaFor(t.GVR()); err == nil { + isNamespaced = m.Namespaced + } + var col int for _, h := range cdata.Header() { - if !t.wide && h.Wide { + if h.Hide || (!t.wide && h.Wide) { continue } - if h.Name == "NAMESPACE" && !t.GetModel().ClusterWide() { + if h.Name == "NAMESPACE" && (!t.GetModel().ClusterWide() || !isNamespaced) { continue } if h.MX && !t.hasMetrics { @@ -316,7 +324,7 @@ func (t *Table) UpdateUI(cdata, data *model1.TableData) { log.Error().Msgf("unable to find original re: %q", re.Row.ID) return true } - t.buildRow(row+1, re, ore, cdata.Header(), pads) + t.buildRow(row+1, re, ore, cdata.Header(), pads, isNamespaced) return true }) @@ -325,7 +333,7 @@ func (t *Table) UpdateUI(cdata, data *model1.TableData) { t.UpdateTitle() } -func (t *Table) buildRow(r int, re, ore model1.RowEvent, h model1.Header, pads MaxyPad) { +func (t *Table) buildRow(r int, re, ore model1.RowEvent, h model1.Header, pads MaxyPad, isNamespaced bool) { color := model1.DefaultColorer if t.colorerFn != nil { color = t.colorerFn @@ -339,11 +347,11 @@ func (t *Table) buildRow(r int, re, ore model1.RowEvent, h model1.Header, pads M log.Error().Msgf("field/header overflow detected for %q -- %d::%d. Check your mappings!", t.GVR(), c, len(h)) continue } - if !t.wide && h[c].Wide { + if h[c].Hide || (!t.wide && h[c].Wide) { continue } - if h[c].Name == "NAMESPACE" && !t.GetModel().ClusterWide() { + if h[c].Name == "NAMESPACE" && (!t.GetModel().ClusterWide() || !isNamespaced) { continue } if h[c].MX && !t.hasMetrics { @@ -354,7 +362,14 @@ func (t *Table) buildRow(r int, re, ore model1.RowEvent, h model1.Header, pads M } if !re.Deltas.IsBlank() && !h.IsTimeCol(c) { - field += Deltas(re.Deltas[c], field) + var old string + if c < len(ore.Deltas) { + old = ore.Deltas[c] + } + if c < len(re.Deltas) { + old = re.Deltas[c] + } + field += Deltas(old, field) } if h[c].Decorator != nil { diff --git a/internal/ui/table_test.go b/internal/ui/table_test.go index 9b604d84a9..bd967c7428 100644 --- a/internal/ui/table_test.go +++ b/internal/ui/table_test.go @@ -70,21 +70,22 @@ type mockModel struct{} var _ ui.Tabular = &mockModel{} -func (t *mockModel) SetInstance(string) {} -func (t *mockModel) SetLabelFilter(string) {} -func (t *mockModel) GetLabelFilter() string { return "" } -func (t *mockModel) Empty() bool { return false } -func (t *mockModel) RowCount() int { return 1 } -func (t *mockModel) HasMetrics() bool { return true } -func (t *mockModel) Peek() *model1.TableData { return makeTableData() } -func (t *mockModel) Refresh(context.Context) error { return nil } -func (t *mockModel) ClusterWide() bool { return false } -func (t *mockModel) GetNamespace() string { return "blee" } -func (t *mockModel) SetNamespace(string) {} -func (t *mockModel) ToggleToast() {} -func (t *mockModel) AddListener(model.TableListener) {} -func (t *mockModel) RemoveListener(model.TableListener) {} -func (t *mockModel) Watch(context.Context) error { return nil } +func (t *mockModel) SetViewSetting(context.Context, *config.ViewSetting) {} +func (t *mockModel) SetInstance(string) {} +func (t *mockModel) SetLabelFilter(string) {} +func (t *mockModel) GetLabelFilter() string { return "" } +func (t *mockModel) Empty() bool { return false } +func (t *mockModel) RowCount() int { return 1 } +func (t *mockModel) HasMetrics() bool { return true } +func (t *mockModel) Peek() *model1.TableData { return makeTableData() } +func (t *mockModel) Refresh(context.Context) error { return nil } +func (t *mockModel) ClusterWide() bool { return false } +func (t *mockModel) GetNamespace() string { return "blee" } +func (t *mockModel) SetNamespace(string) {} +func (t *mockModel) ToggleToast() {} +func (t *mockModel) AddListener(model.TableListener) {} +func (t *mockModel) RemoveListener(model.TableListener) {} +func (t *mockModel) Watch(context.Context) error { return nil } func (t *mockModel) Get(ctx context.Context, path string) (runtime.Object, error) { return nil, nil } diff --git a/internal/ui/types.go b/internal/ui/types.go index 534d084e29..4f4222f1c1 100644 --- a/internal/ui/types.go +++ b/internal/ui/types.go @@ -7,6 +7,7 @@ import ( "context" "time" + "github.com/derailed/k9s/internal/config" "github.com/derailed/k9s/internal/dao" "github.com/derailed/k9s/internal/model" "github.com/derailed/k9s/internal/model1" @@ -75,4 +76,7 @@ type Tabular interface { // Delete a resource. Delete(context.Context, string, *metav1.DeletionPropagation, dao.Grace) error + + // SetViewSetting injects custom cols specification. + SetViewSetting(context.Context, *config.ViewSetting) } diff --git a/internal/view/alias_test.go b/internal/view/alias_test.go index 6deba28983..ad16d4124a 100644 --- a/internal/view/alias_test.go +++ b/internal/view/alias_test.go @@ -10,6 +10,7 @@ import ( "github.com/derailed/k9s/internal" "github.com/derailed/k9s/internal/client" + "github.com/derailed/k9s/internal/config" "github.com/derailed/k9s/internal/config/mock" "github.com/derailed/k9s/internal/dao" "github.com/derailed/k9s/internal/model" @@ -85,25 +86,26 @@ var ( _ ui.Suggester = (*mockModel)(nil) ) -func (t *mockModel) CurrentSuggestion() (string, bool) { return "", false } -func (t *mockModel) NextSuggestion() (string, bool) { return "", false } -func (t *mockModel) PrevSuggestion() (string, bool) { return "", false } -func (t *mockModel) ClearSuggestions() {} -func (t *mockModel) SetInstance(string) {} -func (t *mockModel) SetLabelFilter(string) {} -func (t *mockModel) GetLabelFilter() string { return "" } -func (t *mockModel) Empty() bool { return false } -func (t *mockModel) RowCount() int { return 1 } -func (t *mockModel) HasMetrics() bool { return true } -func (t *mockModel) Peek() *model1.TableData { return makeTableData() } -func (t *mockModel) ClusterWide() bool { return false } -func (t *mockModel) GetNamespace() string { return "blee" } -func (t *mockModel) SetNamespace(string) {} -func (t *mockModel) ToggleToast() {} -func (t *mockModel) AddListener(model.TableListener) {} -func (t *mockModel) RemoveListener(model.TableListener) {} -func (t *mockModel) Watch(context.Context) error { return nil } -func (t *mockModel) Refresh(context.Context) error { return nil } +func (t *mockModel) SetViewSetting(context.Context, *config.ViewSetting) {} +func (t *mockModel) CurrentSuggestion() (string, bool) { return "", false } +func (t *mockModel) NextSuggestion() (string, bool) { return "", false } +func (t *mockModel) PrevSuggestion() (string, bool) { return "", false } +func (t *mockModel) ClearSuggestions() {} +func (t *mockModel) SetInstance(string) {} +func (t *mockModel) SetLabelFilter(string) {} +func (t *mockModel) GetLabelFilter() string { return "" } +func (t *mockModel) Empty() bool { return false } +func (t *mockModel) RowCount() int { return 1 } +func (t *mockModel) HasMetrics() bool { return true } +func (t *mockModel) Peek() *model1.TableData { return makeTableData() } +func (t *mockModel) ClusterWide() bool { return false } +func (t *mockModel) GetNamespace() string { return "blee" } +func (t *mockModel) SetNamespace(string) {} +func (t *mockModel) ToggleToast() {} +func (t *mockModel) AddListener(model.TableListener) {} +func (t *mockModel) RemoveListener(model.TableListener) {} +func (t *mockModel) Watch(context.Context) error { return nil } +func (t *mockModel) Refresh(context.Context) error { return nil } func (t *mockModel) Get(context.Context, string) (runtime.Object, error) { return nil, nil } diff --git a/internal/view/registrar.go b/internal/view/registrar.go index d199a44988..daee09440b 100644 --- a/internal/view/registrar.go +++ b/internal/view/registrar.go @@ -90,10 +90,6 @@ func miscViewers(vv MetaViewers) { vv[client.NewGVR("pulses")] = MetaViewer{ viewerFn: NewPulse, } - // !!BOZO!! Popeye - // vv[client.NewGVR("popeye")] = MetaViewer{ - // viewerFn: NewPopeye, - // } vv[client.NewGVR("sanitizer")] = MetaViewer{ viewerFn: NewSanitizer, } diff --git a/internal/view/table.go b/internal/view/table.go index 2fbeda468f..0956f6255e 100644 --- a/internal/view/table.go +++ b/internal/view/table.go @@ -47,7 +47,9 @@ func (t *Table) Init(ctx context.Context) (err error) { if t.app.Conn() != nil { ctx = context.WithValue(ctx, internal.KeyHasMetrics, t.app.Conn().HasMetrics()) } - t.app.CustomView = config.NewCustomView() + if t.app.CustomView == nil { + t.app.CustomView = config.NewCustomView() + } ctx = context.WithValue(ctx, internal.KeyStyles, t.app.Styles) ctx = context.WithValue(ctx, internal.KeyViewConfig, t.app.CustomView) t.Table.Init(ctx) @@ -142,12 +144,14 @@ func (t *Table) Start() { t.Stop() t.CmdBuff().AddListener(t) t.Styles().AddListener(t.Table) + t.App().CustomView.AddListener(t.Table.GVR().String(), t.Table) } // Stop terminates the component. func (t *Table) Stop() { t.CmdBuff().RemoveListener(t) t.Styles().RemoveListener(t.Table) + t.App().CustomView.RemoveListener(t.GVR().String()) } // SetEnterFn specifies the default enter behavior. diff --git a/internal/view/table_int_test.go b/internal/view/table_int_test.go index 38231eaee4..e4a3b1fa9f 100644 --- a/internal/view/table_int_test.go +++ b/internal/view/table_int_test.go @@ -48,9 +48,9 @@ func TestTableNew(t *testing.T) { client.NewGVR("test"), model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, - model1.HeaderColumn{Name: "NAME", Align: tview.AlignRight}, + model1.HeaderColumn{Name: "NAME", Attrs: model1.Attrs{Align: tview.AlignRight}}, model1.HeaderColumn{Name: "FRED"}, - model1.HeaderColumn{Name: "AGE", Time: true, Decorator: render.AgeDecorator}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true, Decorator: render.AgeDecorator}}, }, model1.NewRowEventsWithEvts( model1.RowEvent{ @@ -132,21 +132,22 @@ type mockTableModel struct{} var _ ui.Tabular = (*mockTableModel)(nil) -func (t *mockTableModel) SetInstance(string) {} -func (t *mockTableModel) SetLabelFilter(string) {} -func (t *mockTableModel) GetLabelFilter() string { return "" } -func (t *mockTableModel) Empty() bool { return false } -func (t *mockTableModel) RowCount() int { return 1 } -func (t *mockTableModel) HasMetrics() bool { return true } -func (t *mockTableModel) Peek() *model1.TableData { return makeTableData() } -func (t *mockTableModel) Refresh(context.Context) error { return nil } -func (t *mockTableModel) ClusterWide() bool { return false } -func (t *mockTableModel) GetNamespace() string { return "blee" } -func (t *mockTableModel) SetNamespace(string) {} -func (t *mockTableModel) ToggleToast() {} -func (t *mockTableModel) AddListener(model.TableListener) {} -func (t *mockTableModel) RemoveListener(model.TableListener) {} -func (t *mockTableModel) Watch(context.Context) error { return nil } +func (t *mockTableModel) SetViewSetting(context.Context, *config.ViewSetting) {} +func (t *mockTableModel) SetInstance(string) {} +func (t *mockTableModel) SetLabelFilter(string) {} +func (t *mockTableModel) GetLabelFilter() string { return "" } +func (t *mockTableModel) Empty() bool { return false } +func (t *mockTableModel) RowCount() int { return 1 } +func (t *mockTableModel) HasMetrics() bool { return true } +func (t *mockTableModel) Peek() *model1.TableData { return makeTableData() } +func (t *mockTableModel) Refresh(context.Context) error { return nil } +func (t *mockTableModel) ClusterWide() bool { return false } +func (t *mockTableModel) GetNamespace() string { return "blee" } +func (t *mockTableModel) SetNamespace(string) {} +func (t *mockTableModel) ToggleToast() {} +func (t *mockTableModel) AddListener(model.TableListener) {} +func (t *mockTableModel) RemoveListener(model.TableListener) {} +func (t *mockTableModel) Watch(context.Context) error { return nil } func (t *mockTableModel) Get(context.Context, string) (runtime.Object, error) { return nil, nil } @@ -171,9 +172,9 @@ func makeTableData() *model1.TableData { client.NewGVR("test"), model1.Header{ model1.HeaderColumn{Name: "NAMESPACE"}, - model1.HeaderColumn{Name: "NAME", Align: tview.AlignRight}, + model1.HeaderColumn{Name: "NAME", Attrs: model1.Attrs{Align: tview.AlignRight}}, model1.HeaderColumn{Name: "FRED"}, - model1.HeaderColumn{Name: "AGE", Time: true}, + model1.HeaderColumn{Name: "AGE", Attrs: model1.Attrs{Time: true}}, }, model1.NewRowEventsWithEvts( model1.RowEvent{ From 35c2b6c509a3c4cb0d6aabc94e4c13eb53ef740d Mon Sep 17 00:00:00 2001 From: derailed Date: Sat, 15 Feb 2025 13:36:28 -0700 Subject: [PATCH 9/9] rel notes --- .gitignore | 1 + Makefile | 2 +- README.md | 26 ++++- change_logs/release_v0.40.md | 177 +++++++++++++++++++++++++++++++++++ snap/snapcraft.yaml | 2 +- 5 files changed, 204 insertions(+), 4 deletions(-) create mode 100644 change_logs/release_v0.40.md diff --git a/.gitignore b/.gitignore index 80b1e5a991..25be190a10 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ demos kind *.snap /stresser +__debug_bin* \ No newline at end of file diff --git a/Makefile b/Makefile index 63f85e86aa..ae69cd8bf9 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ DATE ?= $(shell TZ=UTC date -j -f "%s" ${SOURCE_DATE_EPOCH} +"%Y-%m-%dT%H: else DATE ?= $(shell date -u -d @${SOURCE_DATE_EPOCH} +"%Y-%m-%dT%H:%M:%SZ") endif -VERSION ?= v0.32.7 +VERSION ?= v0.40.0 IMG_NAME := derailed/k9s IMAGE := ${IMG_NAME}:${VERSION} diff --git a/README.md b/README.md index af360d9f80..7505bea0d9 100644 --- a/README.md +++ b/README.md @@ -627,7 +627,25 @@ The annotation value must specify a container to forward to as well as a local p You can change which columns shows up for a given resource via custom views. To surface this feature, you will need to create a new configuration file, namely `$XDG_CONFIG_HOME/k9s/views.yaml`. This file leverages GVR (Group/Version/Resource) to configure the associated table view columns. If no GVR is found for a view the default rendering will take over (ie what we have now). Going wide will add all the remaining columns that are available on the given resource after your custom columns. To boot, you can edit your views config file and tune your resources views live! -> NOTE: This is experimental and will most likely change as we iron this out! +๐Ÿ“ข ๐ŸŽ‰ As of `release v0.40.0` you can specify json parse expressions to further customize your resources rendering. + +The new column syntax is as follows: + +> COLUMN_NAME<:json_parse_expression><|column_attributes> + +Where `:json_parse_expression` represents an expression to pull a specific snippet out of the resource manifest. +Similar to `kubectl -o custom-columns` command. This expression is optional. + +Additionally, you can specify column attributes to further tailor the column rendering. +To use this you will need to add a `|` indicator followed by your rendering bits. +You can have one or more of the following attributes: + +* `T` -> time column indicator +* `N` -> number column indicator +* `W` -> turns on wide column aka only shows while in wide mode. Defaults to the standard resource definition when present. +* `H` -> Hides the column +* `L` -> Left align (default) +* `R` -> Right align Here is a sample views configuration that customize a pods and services views. @@ -637,7 +655,9 @@ views: v1/pods: columns: - AGE - - NAMESPACE + - NAMESPACE|WR # => ๐ŸŒš Specifies the NAMESPACE column to be right aligned and only visible while in wide mode + - ZORG:.metadata.labels.fred\.io\.kubernetes\.blee # => ๐ŸŒš extract fred.io.kubernetes.blee label into it's own column + - BLEE:.metadata.annotations.blee|R # => ๐ŸŒš extract annotation blee into it's own column and right align it - NAME - IP - NODE @@ -652,6 +672,8 @@ views: - CLUSTER-IP ``` +> ๐Ÿฉป NOTE: This is experimental and will most likely change as we iron this out! + --- ## Plugins diff --git a/change_logs/release_v0.40.md b/change_logs/release_v0.40.md new file mode 100644 index 0000000000..d03c27f546 --- /dev/null +++ b/change_logs/release_v0.40.md @@ -0,0 +1,177 @@ + + +# Release v0.40.0 + +## Notes + +Thank you to all that contributed with flushing out issues and enhancements for K9s! +I'll try to mark some of these issues as fixed. But if you don't mind grab the latest rev +and see if we're happier with some of the fixes! +If you've filed an issue please help me verify and close. + +Your support, kindness and awesome suggestions to make K9s better are, as ever, very much noted and appreciated! +Also big thanks to all that have allocated their own time to help others on both slack and on this repo!! + +As you may know, K9s is not pimped out by corps with deep pockets, thus if you feel K9s is helping your Kubernetes journey, +please consider joining our [sponsorship program](https://github.com/sponsors/derailed) and/or make some noise on social! [@kitesurfer](https://twitter.com/kitesurfer) + +On Slack? Please join us [K9slackers](https://join.slack.com/t/k9sers/shared_invite/enQtOTA5MDEyNzI5MTU0LWQ1ZGI3MzliYzZhZWEyNzYxYzA3NjE0YTk1YmFmNzViZjIyNzhkZGI0MmJjYzhlNjdlMGJhYzE2ZGU1NjkyNTM) + +--- + +## โ™ซ Sounds Behind The Release โ™ญ + +* [Glory Box - Portishead](https://www.youtube.com/watch?v=4qQyUi4zfDs) +* [Hit Me With Your Rhythm Stick - Ian Dury And The BlockHeads](https://www.youtube.com/watch?v=0WGVgfjnLqc) +* [Cupidon s'en fout! - George Brassens](https://www.youtube.com/watch?v=a-RlZLfIeKM) +* [Shipbuilding - Elvis Costello](https://www.youtube.com/watch?v=dVhjRqBM5uw) +* [Low Sun - Hermanos Gutierrez](https://www.youtube.com/watch?v=ubaJbw7hkeQ) + +--- + +## A Word From Our Sponsors... + +To all the good folks below that opted to `pay it forward` and join our sponsorship program, I salute you!! + +* [Panfactum](https://github.com/Panfactum) +* [Bastian Pรคtzold](https://github.com/bastianpaetzold) +* [Mikita Vazhnik](https://github.com/Vazhnik) +* [Jacob Salway](https://github.com/jacobsalway) +* [Eckard Mรผhlich](https://github.com/eckardnet) +* [Luke](https://github.com/lukepatrick) +* [tomasbanet](https://github.com/tomasbanet) +* [Robin Opletal](https://github.com/fourstepper) +* [Euroblaze](https://github.com/euroblaze) +* [Jack Daniels](https://github.com/dkr91) +* [decafcode](https://github.com/decafcode) +* [Guillaume Copin](https://github.com/GuillaumeCo) +* [Lokalise](https://github.com/lokalise) +* [Gustavo Bini](https://github.com/gustavobini) +* [JMSwag](https://github.com/JMSwag) +* [Daniel Gospodinow](https://github.com/danielgospodinow) +* [Klaviyo](https://github.com/klaviyo) +* [Paul Farver](https://github.com/PaulFarver) + +> Sponsorship cancellations since the last release: **12!** ๐Ÿฅน + +## ๐ŸŽ‰ Feature Release code name: Colon Blow! ๐ŸŽˆ + +We are pretty stocked about this drop (hopefully...) as we've fully enabled custom columns support in K9s! +Historically, one could customize the view for a given resource by adding a definition in `views.yaml`. +From there one could change sort order and re-arrange the standard column layout. +Several folks voiced the need to add a column for a given label/annotation or any other fields available on a resource. +To date, this wasn't possible ๐Ÿ˜ณ + +So... without further ado, let see what we can now do with `Custom Views` ding dang deal! +It all starts with a few new directives available in `views.yaml` + +### A Refresher... + +Customize a pod view and ensure age, ns and name appear first and sort by age descending. + +> NOTE! You no longer need to list out all columns. +> The remaining columns will be automatically filled from the standard columns. + +```yaml +# Usual biz... +views: + v1/pods: # specify the gvr you want to customize aka group/version/resource + sortColumn: AGE:desc # set the default ordering to ascending (asc) or descending (desc) + columns: # tell the view which columns to display and in which order + - AGE # ensure age, ns and name are the first 3 cols and backfill the rest + - NAMESPACE + - NAME + - READY|H # => NEW! Do not display the READY column + - NODE|W # => NEW! Show node column only on wide + - IP|WR # => NEW! Pull the ip column and right align it in wide mode only +``` + +## Colon Blow! + +Say your pods comes standard with a label `blee` and you want to show it while in pod view. + +```yaml +# Pull labels/annotations +views: + v3/freds: + sortColumn: NAMESPACE:dsc + columns: + - NAMESPACE + - NAME + - BLEE:.metadata.labels.blee # => NEW! Pull values from a label or an annotation using json parser + # expression similar mechanic as kubectl -o custom-columns + - ZORG:.spec.zips[?(@.type == 'zorg')].ip|WR # => NEW! Same deal with a json exp + but align right and show wide only +``` + +## TLDR... + +As you can see the CustomView feature adds a few new semantics on this drop. + +You can now use the following shape for columns definition `COL_NAME<:json_parse_expression><|column attributes>` + +The `:json_parse_expression` is optional. + +The column attributes are as follows: + +* `T` -> time column indicator +* `N` -> number column indicator +* `W` -> turns on wide column aka only shows while in wide mode. Defaults to the standard resource definition when present. +* `H` -> Hides the column +* `L` -> Left align (default) +* `R` -> Right align + +When certain columns are not present in the custom view, K9s will pull the standard column definition and merge the columns. +This allows user to specify and order which columns they want to see first without having to define every single columns from the default resource representation. If you do not wish to see all these columns you can add them to your custom view definition and either specify `|W` or `|H` to `wide` it or `hide` it. + +> ๐Ÿ“ข Still work in progress so your mileage may vary! +> This feature will likely need additional TLC. +> Your feedback on this will be much appreciated and we will iterate as usual to ensure it vorks as prescribed... ๐Ÿ™€ + +--- + +## Videos Are In The Can! + +Please dial [K9s Channel](https://www.youtube.com/channel/UC897uwPygni4QIjkPCpgjmw) for up coming content... + +* [K9s v0.40.0 Colon Blow Sneak peek](https://youtu.be/iy6RDozAM4A) +* [K9s v0.31.0 Configs+Sneak peek](https://youtu.be/X3444KfjguE) +* [K9s v0.30.0 Sneak peek](https://youtu.be/mVBc1XneRJ4) +* [Vulnerability Scans](https://youtu.be/ULkl0MsaidU) + +--- + +## Resolved Issues + +* [#3064](https://github.com/derailed/k9s/issues/3064) Question: brew formula k9s vs derailed/k9s/k9s +* [#3061](https://github.com/derailed/k9s/issues/3061) k9s not opening active namespace or namespace specified via -n +* [#3044](https://github.com/derailed/k9s/issues/3044) CRDs are loaded incorrectly into metadata registry, cause sporadic "Jump Owner" issues +* [#2995](https://github.com/derailed/k9s/issues/2995) Latest image on quay.io contains "failed" kubectl binary + +--- + +## Contributed PRs + +Please be sure to give `Big Thanks!` and `ATTA Girls/Boys!` to all the fine contributors for making K9s better for all of us!! + +* [#3065](https://github.com/derailed/k9s/pull/3065) Fixed trimming of favorite namespaces in Config +* [#3063](https://github.com/derailed/k9s/pull/3063) Updating CVE dependencies +* [#3062](https://github.com/derailed/k9s/pull/3062) feat: use kubectl events for plugin watch-events +* [#3060](https://github.com/derailed/k9s/pull/3060) Rename "delete local data" checkbox description in drain dialog +* [#3046](https://github.com/derailed/k9s/pull/3046) Strict unmarshal for plugin files +* [#3045](https://github.com/derailed/k9s/pull/3045) fix: CRD loading: trim group suffix from CRD name +* [#3043](https://github.com/derailed/k9s/pull/3043) Fix K9S_EDITOR +* [#3041](https://github.com/derailed/k9s/pull/3041) Fix Flux trace plugin command +* [#3038](https://github.com/derailed/k9s/pull/2038) fix check e != nil but return a nil value error err +* [#3026](https://github.com/derailed/k9s/pull/3026) Fix typos +* [#3018](https://github.com/derailed/k9s/pull/3018) fix: coloring of rose-pine for values of log options +* [#3017](https://github.com/derailed/k9s/pull/3017) feat: add helm diff plugin +* [#3009](https://github.com/derailed/k9s/pull/3009) fix(argo-rollouts plugin): resolve improper piping in watch command +* [#2996](https://github.com/derailed/k9s/pull/2996) Bump version of netshoot image in debug-container plugin +* [#2994](https://github.com/derailed/k9s/pull/2994) fix kubectl url and fail build on download errors +* [#2986](https://github.com/derailed/k9s/pull/2986) plugin/trace-dns: Trace DNS requests using Inspektor Gadget +* [#2985](https://github.com/derailed/k9s/pull/2985) feat(plugins/crossplane): change to crossplane cli & add crossplane-watch +* [#2986](https://github.com/derailed/k9s/pull/2986) plugin/trace-dns: Trace DNS requests using Inspektor Gadget + +--- + + ยฉ 2024 Imhotep Software LLC. All materials licensed under [Apache v2.0](http://www.apache.org/licenses/LICENSE-2.0) \ No newline at end of file diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index a4d94a3632..93e5755e28 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: k9s base: core22 -version: 'v0.32.7' +version: 'v0.40.0' summary: K9s is a CLI to view and manage your Kubernetes clusters. description: | K9s is a CLI to view and manage your Kubernetes clusters. By leveraging a terminal UI, you can easily traverse Kubernetes resources and view the state of your clusters in a single powerful session.