diff --git a/Taskfile.yaml b/Taskfile.yaml index a84a018933..94c931eaa8 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -68,52 +68,12 @@ tasks: cmds: # Generate chart README.md's - nix develop -c helm-docs -c ./charts/ - - task: chart:generate:console - - task: chart:generate:operator - - task: chart:generate:redpanda - - task: chart:generate:connectors # Ensure go deps are up to date - go mod tidy - go work sync # Ensure flake.nix has been formatted. - nix fmt - chart:generate:console: - desc: "Generate files for the console Helm chart" - cmds: - # Generate a "partial" version of the Values struct. - - go run ./cmd/genpartial -out charts/console/values_partial.gen.go -struct Values ./charts/console - # Generate helm templates from Go definitions - - go run ./cmd/gotohelm -write ./charts/console/templates ./charts/console - - chart:generate:operator: - desc: "Generate files for the operator Helm chart" - cmds: - # Generate a "partial" version of the Values struct. - - go run ./cmd/genpartial -out charts/operator/values_partial.gen.go -struct Values ./charts/operator - # Generate the values JSON schema from the Values struct - - go run ./cmd/genschema operator > charts/operator/values.schema.json - # Generate helm templates from Go definitions - - go run ./cmd/gotohelm -write ./charts/operator/templates ./charts/operator - - chart:generate:redpanda: - desc: "Generate files for the redpanda Helm chart" - cmds: - # Generate a "partial" version of the Values struct. - - go run ./cmd/genpartial -out charts/redpanda/values_partial.gen.go -struct Values ./charts/redpanda - # Generate the values JSON schema from the Values struct - - go run ./cmd/genschema redpanda > charts/redpanda/values.schema.json - # Generate helm templates from Go definitions - - go run ./cmd/gotohelm -write ./charts/redpanda/templates ./charts/redpanda ./charts/... - - chart:generate:connectors: - desc: "Generate files for the connectors Helm chart" - cmds: - # Generate a "partial" version of the Values struct. - - go run ./cmd/genpartial -out charts/connectors/values_partial.gen.go -struct Values ./charts/connectors - # Generate helm templates from Go definitions - - go run ./cmd/gotohelm -write ./charts/connectors/templates ./charts/connectors - helm:add-repo:jetstack: aliases: - add-jetstack-repo diff --git a/cmd/genpartial/main.go b/cmd/genpartial/main.go deleted file mode 100644 index a24122bd93..0000000000 --- a/cmd/genpartial/main.go +++ /dev/null @@ -1,444 +0,0 @@ -// main executes the "genpartial" program which loads up a go package and -// recursively generates a "partial" variant of an specified struct. -// -// If you've ever worked with the AWS SDK, you've worked with "partial" structs -// before. They are any struct where every field is nullable and the json tag -// specifies "omitempty". -// -// genpartial allows us to write structs in ergonomic go where fields that must -// always exist are presented as values rather than pointers. In cases we were -// need to marshal a partial value back to json or only specify a subset of -// values (IE helm values), use the generated partial. -package main - -import ( - "bytes" - "flag" - "fmt" - "go/ast" - "go/format" - "go/parser" - "go/token" - "go/types" - "io" - "os" - "regexp" - "strconv" - "strings" - - "github.com/cockroachdb/errors" - "golang.org/x/tools/go/packages" - gofumpt "mvdan.cc/gofumpt/format" -) - -const ( - mode = packages.NeedTypes | packages.NeedName | packages.NeedSyntax | packages.NeedTypesInfo | packages.NeedImports -) - -func main() { - cwd, _ := os.Getwd() - - outFlag := flag.String("out", "-", "The file to output to or `-` for stdout") - structFlag := flag.String("struct", "Values", "The struct name to generate a partial for") - - flag.Parse() - - if len(flag.Args()) != 1 { - fmt.Printf("Usage: genpartial \n") - fmt.Printf("Example: genpartial -struct Values ./charts/redpanda\n") - os.Exit(1) - } - - pkgs := Must(packages.Load(&packages.Config{ - Dir: cwd, - Mode: mode, - }, flag.Arg(0))) - - var buf bytes.Buffer - if err := GeneratePartial(pkgs[0], *structFlag, &buf); err != nil { - panic(err) - } - - if *outFlag == "-" { - fmt.Println(buf.Bytes()) - } else { - if err := os.WriteFile(*outFlag, buf.Bytes(), 0o644); err != nil { - panic(err) - } - } -} - -type Generator struct { - pkg *packages.Package - cache map[types.Type]ast.Expr -} - -func (g *Generator) Generate(t types.Type) []ast.Node { - toPartialize := FindAllNames(g.pkg.Types, t) - - var out []ast.Node - for _, named := range toPartialize { - // For any types that we've identified as wanting to partialize, - // generate a new anonymous struct from the underlying struct of the - // named type. - // This allows the partialization algorithm to be much more sane and - // terse. Partialization of named types is a game of deciding if the - // reference needs to be a pointer or changed to a newly generated - // type. Partialization of (anonymous) structs, is generation of a new - // struct type. - partialized := g.partialize(named.Underlying()) - - var params *ast.FieldList - if named.TypeParams().Len() > 0 { - params = &ast.FieldList{List: make([]*ast.Field, named.TypeParams().Len())} - for i := 0; i < named.TypeParams().Len(); i++ { - param := named.TypeParams().At(i) - params.List[i] = &ast.Field{ - Names: []*ast.Ident{{Name: param.Obj().Name()}}, - Type: g.typeToNode(param.Constraint()).(ast.Expr), - } - } - } - - out = append(out, &ast.DeclStmt{ - Decl: &ast.GenDecl{ - Tok: token.TYPE, - Specs: []ast.Spec{ - &ast.TypeSpec{ - Name: &ast.Ident{Name: "Partial" + named.Obj().Name()}, - TypeParams: params, - Type: g.typeToNode(partialized).(ast.Expr), - }, - }, - }, - }) - } - - return out -} - -func (g *Generator) qualifier(p *types.Package) string { - if g.pkg.Types == p { - return "" // same package; unqualified - } - - // Technically this could break in the case of having multiple files - // with different import aliases. - for _, obj := range g.pkg.TypesInfo.Defs { - if name, ok := obj.(*types.PkgName); ok && p.Path() == name.Imported().Path() { - return name.Name() - } - } - - // If no package name was found in Defs, there's no import alias. - // Fallback to p.Name(). - return p.Name() -} - -func (g *Generator) typeToNode(t types.Type) ast.Node { - str := types.TypeString(t, g.qualifier) - node, err := parser.ParseExpr(str) - if err != nil { - panic(fmt.Errorf("%s\n%v", str, err)) - } - return node -} - -func (g *Generator) partialize(t types.Type) types.Type { - // TODO cache me. - - switch t := t.(type) { - case *types.Basic, *types.Interface: - return t - case *types.Pointer: - return types.NewPointer(g.partialize(t.Elem())) - case *types.Map: - return types.NewMap(t.Key(), g.partialize(t.Elem())) - case *types.Slice: - return types.NewSlice(g.partialize(t.Elem())) - case *types.Struct: - return g.partializeStruct(t) - case *types.Named: - return g.partializeNamed(t) - case *types.TypeParam: - return t // TODO this isn't super easy to fully support without a lot of additional information...... - case *types.Alias: - return g.partialize(t.Rhs()) - default: - panic(fmt.Sprintf("Unhandled: %T", t)) - } -} - -func (g *Generator) partializeStruct(t *types.Struct) *types.Struct { - tags := make([]string, t.NumFields()) - fields := make([]*types.Var, t.NumFields()) - for i := 0; i < t.NumFields(); i++ { - field := t.Field(i) - - partialized := g.partialize(field.Type()) - switch partialized.Underlying().(type) { - case *types.Basic, *types.Struct: - partialized = types.NewPointer(partialized) - } - - // TODO Docs injection would be nice but given that we're crawling the - // type tree, that's going to be quite difficult. Could probably stash - // away a map of types to comments and then inject that into the ast - // after parsing? - // Or just implement our own type printer. - tags[i] = EnsureOmitEmpty(t.Tag(i)) - fields[i] = types.NewVar(0, g.pkg.Types, field.Name(), partialized) - } - - return types.NewStruct(fields, tags) -} - -func (g *Generator) partializeNamed(t *types.Named) types.Type { - // This check isn't going to be correct in the long run but it's intention - // boils down to "Have we generated a Partialized version of this named - // type?" - // NB: This check MUST match the check in FindAllNames. - isPartialized := t.Obj().Pkg() == g.pkg.Types && !IsType[*types.Basic](t.Underlying()) - - if !isPartialized { - // If we haven't partialized this type, there's nothing we can do. Noop. - return t - } - - // If this is a partialized type, we just need to make a NamedTyped with - // any type params that reference the partial name. The Underlying aspect - // of this named type is ignored so we pass in the existing underlying type - // as nil isn't acceptable. - - var args []types.Type - for i := 0; i < t.TypeArgs().Len(); i++ { - args = append(args, g.partialize(t.TypeArgs().At(i))) - } - - params := make([]*types.TypeParam, t.TypeParams().Len()) - for i := 0; i < t.TypeParams().Len(); i++ { - param := t.TypeParams().At(i) - // Might need to clone the typename here - params[i] = types.NewTypeParam(param.Obj(), param.Constraint()) - } - - named := types.NewNamed(types.NewTypeName(0, g.pkg.Types, "Partial"+t.Obj().Name(), t.Underlying()), t.Underlying(), nil) - if len(args) < 1 { - return named - } - named.SetTypeParams(params) - result, err := types.Instantiate(nil, named, args, true) - if err != nil { - panic(err) - } - return result -} - -func GeneratePartial(pkg *packages.Package, structName string, out io.Writer) error { - root := pkg.Types.Scope().Lookup(structName) - - if root == nil { - return errors.Newf("named struct not found in package %q: %q", pkg.Name, structName) - } - - if !IsType[*types.Named](root.Type()) || !IsType[*types.Struct](root.Type().Underlying()) { - return errors.Newf("named struct not found in package %q: %q", pkg.Name, structName) - } - - gen := Generator{pkg: pkg, cache: map[types.Type]ast.Expr{}} - - partials := gen.Generate(root.Type()) - - // Map of import aliases to actual package for all imports in the - // originally parsed package. - // One of the more frustrating aspects of Go's AST/Type system is dealing - // with imports and their aliases. The best way to get them is to crawl the - // AST for import specs and then manually resolve them. - originalImports := map[string]*types.Package{} - for _, f := range pkg.Syntax { - for _, imp := range f.Imports { - // For some reason, imports can be nil. - if imp == nil { - continue - } - - path, err := strconv.Unquote(imp.Path.Value) - if err != nil { - panic(err) - } - - imported := pkg.Imports[path] - name := imported.Name - - // if an alias is specified, use it. - if imp.Name != nil { - name = imp.Name.Name - } - - originalImports[name] = imported.Types - } - } - - // Now that we have our partial structs, we need to generate the import - // block for them. We'll crawl the AST of the structs and find references - // to external packages. This method could possibly lead to conflicts as - // we're just looking for [ast.SelectorExpr]'s - imports := map[string]*types.Package{} - for _, partial := range partials { - ast.Inspect(partial, func(n ast.Node) bool { - switch n := n.(type) { - case *ast.SelectorExpr: - parent, ok := n.X.(*ast.Ident) - if !ok { - return true - } - - if pkg, ok := originalImports[parent.Name]; ok { - imports[parent.Name] = pkg - } - } - return true - }) - } - - var buf bytes.Buffer - fmt.Fprintf(&buf, "//go:build !generate\n\n") - fmt.Fprintf(&buf, "// +gotohelm:ignore=true\n") - fmt.Fprintf(&buf, "//\n") - // This line must match `^// Code generated .* DO NOT EDIT\.$`. See https://pkg.go.dev/cmd/go#hdr-Generate_Go_files_by_processing_source - fmt.Fprintf(&buf, "// Code generated by genpartial DO NOT EDIT.\n") - fmt.Fprintf(&buf, "package %s\n\n", pkg.Name) - - // Only print out imports if we have them. We lean on source.Format later - // to align and sort them. - if len(imports) > 0 { - fmt.Fprintf(&buf, "import (\n") - for name, pkg := range imports { - if pkg.Name() == name { - fmt.Fprintf(&buf, "\t%q\n", pkg.Path()) - } else { - fmt.Fprintf(&buf, "\t%s %q\n", name, pkg.Path()) - } - } - fmt.Fprintf(&buf, ")\n\n") - } - - for i, d := range partials { - if i > 0 { - fmt.Fprintf(&buf, "\n\n") - } - format.Node(&buf, token.NewFileSet(), d) - } - - formatted, err := gofumpt.Source(buf.Bytes(), gofumpt.Options{}) - if err != nil { - return err - } - - _, err = out.Write(formatted) - return err -} - -// FindAllNames traverses the given type and returns a slice of all non-Basic -// named types that are referenced from the "root" type. -func FindAllNames(pkg *types.Package, root types.Type) []*types.Named { - names := []*types.Named{} - seen := map[types.Type]struct{}{} - toTraverse := []types.Type{} - - push := func(t types.Type) { - if _, ok := seen[t]; ok { - return - } - - // Partialize all named types within this the provided package that are - // not aliases for Basic types. - // This could be "more efficient" by avoiding partialization of named - // types that don't require changes but that's much more error prone - // and makes working with partialized types a bit strange. - if named, ok := t.(*types.Named); ok && named.Obj().Pkg() == pkg && named.Origin() == named { - switch named.Underlying().(type) { - case *types.Basic: - default: - names = append(names, named) - } - } - - seen[t] = struct{}{} - toTraverse = append(toTraverse, t) - } - - push(root) - - for len(toTraverse) > 0 { - current := toTraverse[0] - toTraverse = toTraverse[1:] - - push(current.Underlying()) - - switch current := current.(type) { - case *types.Basic, *types.Interface, *types.TypeParam: - continue - - case *types.Alias: - push(current.Rhs()) - - case *types.Pointer: - push(current.Elem()) - - case *types.Slice: - push(current.Elem()) - - case *types.Array: - push(current.Elem()) - - case *types.Map: - push(current.Key()) - push(current.Elem()) - - case *types.Struct: - for i := 0; i < current.NumFields(); i++ { - push(current.Field(i).Type()) - } - case *types.Named: - push(current.Origin()) - for i := 0; i < current.TypeArgs().Len(); i++ { - push(current.TypeArgs().At(i)) - } - - default: - panic(fmt.Sprintf("unhandled: %T", current)) - } - } - - return names -} - -var jsonTagRE = regexp.MustCompile(`json:"([^"]+)"`) - -// EnsureOmitEmpty injects ,omitempty into existing json tags or adds one if -// not already present. -func EnsureOmitEmpty(tag string) string { - if !strings.Contains(tag, `json:"`) { - return strings.TrimLeft(tag+` json:",omitempty"`, " ") - } - - return jsonTagRE.ReplaceAllStringFunc(tag, func(s string) string { - if strings.Contains(s, ",omitempty") { - return s - } - return s[:len(s)-1] + `,omitempty"` - }) -} - -func Must[T any](value T, err error) T { - if err != nil { - panic(err) - } - return value -} - -func IsType[T types.Type](typ types.Type) bool { - _, ok := typ.(T) - return ok -} diff --git a/cmd/genpartial/main_test.go b/cmd/genpartial/main_test.go deleted file mode 100644 index 77d7a5505c..0000000000 --- a/cmd/genpartial/main_test.go +++ /dev/null @@ -1,123 +0,0 @@ -//lint:file-ignore ST1019 duplicate imports are on purpose -package main - -import ( - "bytes" - alias2 "bytes" - alias1 "os" - "testing" - - "github.com/redpanda-data/helm-charts/pkg/testutil" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "golang.org/x/tools/go/packages" -) - -type ( - IntAlias int - MapAlias map[string]int - MapGeneric[T any] map[string]T -) - -type ExampleStruct struct { - // Generics - A1 MapGeneric[int] - A2 MapGeneric[NestedStruct] - A3 MapGeneric[*NestedStruct] - A4 MapGeneric[IntAlias] - A5 MapGeneric[MapGeneric[IntAlias]] - A6 MapGeneric[MapGeneric[alias1.File]] - A7 MapGeneric[MapGeneric[alias1.FileInfo]] - A8 GenericStruct[string] - A9 GenericStruct[GenericStruct[*int]] - - // BasicTypes - B1 int - B2 *int - - // Inline structs - C1 struct { - Any any - Int int - } - C2 *struct{} - - // Structs - D1 NestedStruct - D2 *NestedStruct - - // Slices - E1 []any - E2 []int - E3 []*int - E4 []map[string]struct{ Foo string } - E5 []map[string]NestedStruct - E6 []map[string]GenericStruct[NestedStruct] - - // Tags - F1 []*int `json:"L"` - F2 string `yaml:"M"` - F3 IntAlias - - // Struct from another package - G1 bytes.Buffer - G2 alias1.File - G3 alias2.Reader - - // Maps - H1 map[string]any - H2 map[string]NestedStruct - H3 map[string]GenericStruct[int] - H4 map[string]GenericStruct[NestedStruct] - H5 MapAlias -} - -type NestedStruct struct { - Map map[string]string -} - -type GenericStruct[T any] struct { - Foo T -} - -func TestGenerateParital(t *testing.T) { - pkgs, err := packages.Load(&packages.Config{ - Mode: mode, - BuildFlags: []string{"-tags=generate"}, - Tests: true, - }, ".") - require.NoError(t, err) - - // Loading with tests is weird but it let's us load up the example struct - // seen above. - require.Len(t, pkgs, 3) - pkg := pkgs[1] - require.Equal(t, "main", pkg.Name) - - require.EqualError(t, GeneratePartial(pkg, "Values", nil), `named struct not found in package "main": "Values"`) - - var buf bytes.Buffer - require.NoError(t, GeneratePartial(pkg, "ExampleStruct", &buf)) - testutil.AssertGolden(t, testutil.Text, "./testdata/partial.go", buf.Bytes()) -} - -func TestEnsureOmitEmpty(t *testing.T) { - cases := []struct { - In string - Out string - }{ - {In: ``, Out: `json:",omitempty"`}, - {In: `yaml:"foo"`, Out: `yaml:"foo" json:",omitempty"`}, - {In: `json:"bar"`, Out: `json:"bar,omitempty"`}, - {In: `json:"baz,omitempty"`, Out: `json:"baz,omitempty"`}, - {In: `yaml:"foo" json:"baz,omitempty"`, Out: `yaml:"foo" json:"baz,omitempty"`}, - {In: `json:"baz" yaml:"bar"`, Out: `json:"baz,omitempty" yaml:"bar"`}, - {In: `json:"-"`, Out: `json:"-,omitempty"`}, - {In: `json:"-,string"`, Out: `json:"-,string,omitempty"`}, - {In: `json:"-,omitempty,string"`, Out: `json:"-,omitempty,string"`}, - } - - for _, tc := range cases { - assert.Equal(t, EnsureOmitEmpty(tc.In), tc.Out) - } -} diff --git a/cmd/genpartial/testdata/partial.go b/cmd/genpartial/testdata/partial.go deleted file mode 100644 index d5d572a712..0000000000 --- a/cmd/genpartial/testdata/partial.go +++ /dev/null @@ -1,63 +0,0 @@ -//go:build !generate - -// +gotohelm:ignore=true -// -// Code generated by genpartial DO NOT EDIT. -package main - -import ( - alias2 "bytes" - alias1 "os" -) - -type PartialExampleStruct struct { - A1 PartialMapGeneric[int] "json:\",omitempty\"" - A2 PartialMapGeneric[PartialNestedStruct] "json:\",omitempty\"" - A3 PartialMapGeneric[*PartialNestedStruct] "json:\",omitempty\"" - A4 PartialMapGeneric[IntAlias] "json:\",omitempty\"" - A5 PartialMapGeneric[PartialMapGeneric[IntAlias]] "json:\",omitempty\"" - A6 PartialMapGeneric[PartialMapGeneric[alias1.File]] "json:\",omitempty\"" - A7 PartialMapGeneric[PartialMapGeneric[fs.FileInfo]] "json:\",omitempty\"" - A8 *PartialGenericStruct[string] "json:\",omitempty\"" - A9 *PartialGenericStruct[PartialGenericStruct[*int]] "json:\",omitempty\"" - B1 *int "json:\",omitempty\"" - B2 *int "json:\",omitempty\"" - C1 *struct { - Any any "json:\",omitempty\"" - Int *int "json:\",omitempty\"" - } "json:\",omitempty\"" - C2 *struct{} "json:\",omitempty\"" - D1 *PartialNestedStruct "json:\",omitempty\"" - D2 *PartialNestedStruct "json:\",omitempty\"" - E1 []any "json:\",omitempty\"" - E2 []int "json:\",omitempty\"" - E3 []*int "json:\",omitempty\"" - E4 []map[string]struct { - Foo *string "json:\",omitempty\"" - } "json:\",omitempty\"" - E5 []map[string]PartialNestedStruct "json:\",omitempty\"" - E6 []map[string]PartialGenericStruct[PartialNestedStruct] "json:\",omitempty\"" - F1 []*int "json:\"L,omitempty\"" - F2 *string "yaml:\"M\" json:\",omitempty\"" - F3 *IntAlias "json:\",omitempty\"" - G1 *alias2.Buffer "json:\",omitempty\"" - G2 *alias1.File "json:\",omitempty\"" - G3 *alias2.Reader "json:\",omitempty\"" - H1 map[string]any "json:\",omitempty\"" - H2 map[string]PartialNestedStruct "json:\",omitempty\"" - H3 map[string]PartialGenericStruct[int] "json:\",omitempty\"" - H4 map[string]PartialGenericStruct[PartialNestedStruct] "json:\",omitempty\"" - H5 PartialMapAlias "json:\",omitempty\"" -} - -type PartialNestedStruct struct { - Map map[string]string "json:\",omitempty\"" -} - -type PartialMapAlias map[string]int - -type PartialMapGeneric[T any] map[string]T - -type PartialGenericStruct[T any] struct { - Foo T "json:\",omitempty\"" -} diff --git a/cmd/genschema/main.go b/cmd/genschema/main.go deleted file mode 100644 index e00337b117..0000000000 --- a/cmd/genschema/main.go +++ /dev/null @@ -1,127 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "os" - "reflect" - - "github.com/invopop/jsonschema" - monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" - "github.com/redpanda-data/helm-charts/charts/operator" - "github.com/redpanda-data/helm-charts/charts/redpanda" - "github.com/redpanda-data/helm-charts/pkg/valuesutil" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - "k8s.io/apimachinery/pkg/util/intstr" -) - -var schemas = map[string]any{ - "redpanda": &redpanda.Values{}, - "operator": &operator.Values{}, -} - -func Must[T any](value T, err error) T { - if err != nil { - panic(err) - } - return value -} - -func main() { - r := &jsonschema.Reflector{ - // These values are set to minimize the diff between the - // handwritten jsonschema and the generated jsonschema. - ExpandedStruct: true, - DoNotReference: true, - - // For backwards compatibility, don't "close" our objects. There are - // many fields that are not currently represented. Setting this to - // false, the default and recommended value, will break many existing - // installs. TestTemplate will catch many of these breakages. - AllowAdditionalProperties: true, - - // jsonschema, by default, will rely on omitempty flags to determine if - // a value is required or not. This has too much of an impact on how - // the underlying JSON is shaped and marshalled/unmarshalled. Instead, - // rely on explicitly set required tags. - RequiredFromJSONSchemaTags: true, - - // Builtin Kubernetes types can generate a JSON schema but it's a built - // difficult to do so as all the information is stored in kubebuilder - // annotations. For now, we'll hard code any types that need to be - // enhanced. - Mapper: func(t reflect.Type) *jsonschema.Schema { - switch reflect.New(t).Interface().(type) { - case *intstr.IntOrString: - return &jsonschema.Schema{ - OneOf: []*jsonschema.Schema{ - {Type: "string"}, - {Type: "number"}, - }, - } - case *corev1.PodFSGroupChangePolicy: - return &jsonschema.Schema{ - Type: "string", - Enum: []any{ - corev1.FSGroupChangeOnRootMismatch, - corev1.FSGroupChangeAlways, - }, - } - case monitoringv1.Duration: - return &jsonschema.Schema{ - Type: "string", - Pattern: "^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$", - } - case *resource.Quantity: - return &jsonschema.Schema{ - OneOf: []*jsonschema.Schema{ - {Type: "integer"}, - {Type: "string", Pattern: "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$"}, - }, - } - default: - return nil - } - }, - } - - if len(os.Args) != 2 { - fmt.Printf("Wrong number of arguments %d, require 2\nusage: %s \n", len(os.Args), os.Args[0]) - os.Exit(1) - } - - val, exist := schemas[os.Args[1]] - if !exist { - fmt.Printf("schema %s does not exist\nusage: %s \n", os.Args[1], os.Args[0]) - os.Exit(1) - } - - schema := r.Reflect(val) - makeArrayNullableRecursive(schema) - - // Leave a note to dissuade any would be manual editors. - schema.Description = "DO NOT EDIT!. This file was generated by ./cmd/genschema/genschema.go" - - // Because of jsonschema's usage of an ordered map, the key ordering is a - // bit strange. Round trip through an untyped map[string]any to have go - // sort the keys alphabetically. (This helps reduce diff churn). - untyped := Must(valuesutil.UnmarshalInto[any](schema)) - data := Must(json.MarshalIndent(untyped, "", " ")) - - fmt.Printf("%s\n", data) -} - -func makeArrayNullableRecursive(schema *jsonschema.Schema) { - for pair := schema.Properties.Oldest(); pair != nil; pair = pair.Next() { - if pair.Value.Type == "array" { - schema.Properties.Set(pair.Key, &jsonschema.Schema{ - OneOf: []*jsonschema.Schema{ - pair.Value, - {Type: "null"}, - }, - }) - } - makeArrayNullableRecursive(pair.Value) - } -} diff --git a/cmd/gotohelm/main.go b/cmd/gotohelm/main.go deleted file mode 100644 index 5b5a4002d5..0000000000 --- a/cmd/gotohelm/main.go +++ /dev/null @@ -1,98 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "os" - "os/exec" - "path" - "strings" - - "github.com/redpanda-data/redpanda-operator/pkg/gotohelm" - "golang.org/x/tools/go/packages" -) - -func main() { - out := flag.String("write", "-", "The directory to write the transpiled templates to or - to write them to standard out") - - flag.Parse() - - if len(flag.Args()) == 0 { - fmt.Printf("usage: gotohelm [dependencies...]") - os.Exit(1) - } - - cwd, _ := os.Getwd() - - pkgs, err := gotohelm.LoadPackages(&packages.Config{ - Dir: cwd, - }, flag.Args()[0]) - if err != nil { - panic(err) - } - - if len(pkgs) != 1 { - fmt.Printf("loading %q resulted in loading more than one package.", flag.Args()[0]) - os.Exit(1) - } - - pkg := pkgs[0] - - deps, err := goList(flag.Args()[1:]...) - if err != nil { - panic(err) - } - - chart, err := gotohelm.Transpile(pkg, deps...) - if err != nil { - fmt.Printf("Failed to transpile %q: %s\n", pkg.Name, err) - os.Exit(1) - } - - if *out == "-" { - writeToStdout(chart) - } else { - if err := writeToDir(chart, *out); err != nil { - panic(err) - } - } -} - -func goList(patterns ...string) ([]string, error) { - if len(patterns) == 0 { - return nil, nil - } - - cmd := exec.Command("go", append([]string{"list"}, patterns...)...) - - out, err := cmd.CombinedOutput() - if err != nil { - return nil, err - } - - return strings.Split(string(out), "\n"), nil -} - -func writeToStdout(chart *gotohelm.Chart) { - for _, f := range chart.Files { - fmt.Printf("%s\n", f.Name) - f.Write(os.Stdout) - fmt.Printf("\n\n") - } -} - -func writeToDir(chart *gotohelm.Chart, dir string) error { - for _, f := range chart.Files { - file, err := os.OpenFile(path.Join(dir, f.Name), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0o644) - if err != nil { - return err - } - - f.Write(file) - - if err := file.Close(); err != nil { - return err - } - } - return nil -} diff --git a/go.mod b/go.mod index 07c68c78d3..1e35110db8 100644 --- a/go.mod +++ b/go.mod @@ -6,34 +6,26 @@ toolchain go1.23.4 require ( github.com/cert-manager/cert-manager v1.14.5 - github.com/cockroachdb/errors v1.11.1 - github.com/gonvenience/ytbx v1.4.4 + github.com/cockroachdb/errors v1.11.3 github.com/google/gofuzz v1.2.0 - github.com/homeport/dyff v1.7.1 github.com/invopop/jsonschema v0.12.0 github.com/json-iterator/go v1.1.12 - github.com/lucasjones/reggen v0.0.0-20200904144131-37ba4fa293bb github.com/pkg/errors v0.9.1 - github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.74.0 - github.com/redpanda-data/common-go/rpadmin v0.1.5-0.20240814205445-8e6eb5806561 - github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20241216191615-bb41e7cd4a6e - github.com/redpanda-data/redpanda/src/go/rpk v0.0.0-20240105044330-c094966ca0cf + github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.76.2 + github.com/redpanda-data/redpanda-operator/charts v0.0.0-20250108152555-7d0f73871aec + github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20250108152555-7d0f73871aec + github.com/redpanda-data/redpanda/src/go/rpk v0.0.0-20240827155712-244863ea0ae8 github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 - github.com/stretchr/testify v1.9.0 - github.com/testcontainers/testcontainers-go/modules/k3s v0.32.0 - github.com/twmb/franz-go v1.18.0 - github.com/twmb/franz-go/pkg/sr v1.2.0 + github.com/stretchr/testify v1.10.0 github.com/wk8/go-ordered-map/v2 v2.1.8 go.uber.org/zap v1.27.0 golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e - golang.org/x/tools v0.24.0 - helm.sh/helm/v3 v3.14.4 + golang.org/x/tools v0.27.0 k8s.io/api v0.30.3 k8s.io/apiextensions-apiserver v0.30.3 k8s.io/apimachinery v0.30.3 k8s.io/client-go v0.30.3 k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 - mvdan.cc/gofumpt v0.6.0 pgregory.net/rapid v1.1.0 sigs.k8s.io/controller-runtime v0.18.5 sigs.k8s.io/kustomize/api v0.16.0 @@ -43,8 +35,16 @@ require ( ) require ( - dario.cat/mergo v1.0.0 // indirect + buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.2-20240717164558-a6c49f84cc0f.2 // indirect + buf.build/gen/go/grpc-ecosystem/grpc-gateway/protocolbuffers/go v1.34.2-20240617172850-a48fcebcf8f1.2 // indirect + buf.build/gen/go/redpandadata/cloud/connectrpc/go v1.16.2-20240715174738-f694d610cde4.1 // indirect + buf.build/gen/go/redpandadata/cloud/protocolbuffers/go v1.34.2-20240715174738-f694d610cde4.2 // indirect + buf.build/gen/go/redpandadata/common/protocolbuffers/go v1.34.2-20240715174743-9c0afe867874.2 // indirect + buf.build/gen/go/redpandadata/dataplane/connectrpc/go v1.16.2-20240620104934-3415ce922cfb.1 // indirect + buf.build/gen/go/redpandadata/dataplane/protocolbuffers/go v1.34.2-20240620104934-3415ce922cfb.2 // indirect + connectrpc.com/connect v1.16.2 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect + github.com/AlecAivazis/survey/v2 v2.3.7 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/BurntSushi/toml v1.4.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect @@ -52,13 +52,11 @@ require ( github.com/Masterminds/semver/v3 v3.2.1 // indirect github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/Masterminds/squirrel v1.5.4 // indirect - github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Microsoft/hcsshim v0.12.3 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/buger/jsonparser v1.1.1 // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect @@ -66,8 +64,6 @@ require ( github.com/containerd/containerd v1.7.18 // indirect github.com/containerd/errdefs v0.1.0 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/containerd/platforms v0.2.1 // indirect - github.com/cpuguy83/dockercfg v0.3.1 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/distribution/reference v0.6.0 // indirect @@ -77,19 +73,17 @@ require ( github.com/docker/docker-credential-helpers v0.8.0 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect - github.com/docker/go-units v0.5.0 // indirect github.com/emicklei/go-restful/v3 v3.12.1 // indirect github.com/evanphx/json-patch v5.7.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/color v1.17.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/getsentry/sentry-go v0.18.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-errors/errors v1.5.1 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect @@ -101,6 +95,7 @@ require ( github.com/gonvenience/term v1.0.2 // indirect github.com/gonvenience/text v1.0.7 // indirect github.com/gonvenience/wrap v1.2.0 // indirect + github.com/gonvenience/ytbx v1.4.4 // indirect github.com/google/btree v1.1.2 // indirect github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect github.com/google/go-cmp v0.6.0 // indirect @@ -112,12 +107,13 @@ require ( github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/homeport/dyff v1.7.1 // indirect github.com/huandu/xstrings v1.4.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmoiron/sqlx v1.3.5 // indirect github.com/josharian/intern v1.0.0 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/klauspost/compress v1.17.9 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect @@ -126,30 +122,25 @@ require ( github.com/lib/pq v1.10.9 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed // indirect - github.com/magiconair/properties v1.8.7 // indirect + github.com/lucasjones/reggen v0.0.0-20200904144131-37ba4fa293bb // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-ciede2000 v0.0.0-20170301095244-782e8c62fec3 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/hashstructure v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/locker v1.0.1 // indirect - github.com/moby/patternmatcher v0.6.0 // indirect - github.com/moby/spdystream v0.4.0 // indirect - github.com/moby/sys/sequential v0.5.0 // indirect - github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/spdystream v0.5.0 // indirect github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect - github.com/morikuni/aec v1.0.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/opencontainers/go-digest v1.0.1-0.20231025023718-d50d2fec9c98 // indirect @@ -157,30 +148,24 @@ require ( github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect github.com/prometheus/client_golang v1.20.0 // 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/redpanda-data/common-go/net v0.1.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/rubenv/sql-migrate v1.5.2 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect - github.com/sethgrid/pester v1.2.0 // indirect - github.com/shirou/gopsutil/v3 v3.23.12 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/testcontainers/testcontainers-go v0.33.0 // indirect github.com/texttheater/golang-levenshtein v1.0.1 // indirect - github.com/tklauser/go-sysconf v0.3.14 // indirect - github.com/tklauser/numcpus v0.8.0 // indirect + github.com/twmb/franz-go v1.18.0 // indirect + github.com/twmb/franz-go/pkg/kadm v1.12.0 // indirect github.com/twmb/franz-go/pkg/kmsg v1.9.0 // indirect github.com/twmb/tlscfg v1.2.1 // indirect github.com/virtuald/go-ordered-json v0.0.0-20170621173500-b18e6e673d74 // indirect @@ -188,22 +173,23 @@ require ( github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/xlab/treeprint v1.2.0 // indirect - github.com/yusufpapurcu/wmi v1.2.3 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect go.opentelemetry.io/otel v1.28.0 // indirect go.opentelemetry.io/otel/metric v1.28.0 // indirect go.opentelemetry.io/otel/trace v1.28.0 // indirect go.starlark.net v0.0.0-20231121155337-90ade8b19d09 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.26.0 // indirect - golang.org/x/mod v0.20.0 // indirect - golang.org/x/net v0.28.0 // indirect + golang.org/x/crypto v0.29.0 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.31.0 // indirect golang.org/x/oauth2 v0.22.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.24.0 // indirect - golang.org/x/term v0.23.0 // indirect - golang.org/x/text v0.17.0 // indirect + golang.org/x/sync v0.9.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/term v0.26.0 // indirect + golang.org/x/text v0.20.0 // indirect golang.org/x/time v0.6.0 // indirect + google.golang.org/genproto v0.0.0-20240725223205-93522f1f2a9f // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240808171019-573a1156607a // indirect google.golang.org/grpc v1.65.0 // indirect google.golang.org/protobuf v1.34.2 // indirect @@ -211,6 +197,7 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + helm.sh/helm/v3 v3.14.4 // indirect k8s.io/apiserver v0.30.3 // indirect k8s.io/cli-runtime v0.30.3 // indirect k8s.io/component-base v0.30.3 // indirect diff --git a/go.sum b/go.sum index 51f6e989ca..a2dbddc171 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,25 @@ +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.2-20240717164558-a6c49f84cc0f.2 h1:SZRVx928rbYZ6hEKUIN+vtGDkl7uotABRWGY4OAg5gM= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.2-20240717164558-a6c49f84cc0f.2/go.mod h1:ylS4c28ACSI59oJrOdW4pHS4n0Hw4TgSPHn8rpHl4Yw= +buf.build/gen/go/grpc-ecosystem/grpc-gateway/protocolbuffers/go v1.34.2-20240617172850-a48fcebcf8f1.2 h1:60531IScGBBw17MoVfvCasfBedurjQ4qkr0cNhrDTR0= +buf.build/gen/go/grpc-ecosystem/grpc-gateway/protocolbuffers/go v1.34.2-20240617172850-a48fcebcf8f1.2/go.mod h1:WZzeH4Sx52g5HpdqDE4B6I0cn5MPzKmp7lSG6oB6ais= +buf.build/gen/go/redpandadata/cloud/connectrpc/go v1.16.2-20240715174738-f694d610cde4.1 h1:mQuTpAciNc75qbO/C7am6WMw15k5gdCCfGaclahirLM= +buf.build/gen/go/redpandadata/cloud/connectrpc/go v1.16.2-20240715174738-f694d610cde4.1/go.mod h1:E5yDDT+3nicsJvcFGoYNAirM/KzLyeibMuffsHzEoew= +buf.build/gen/go/redpandadata/cloud/protocolbuffers/go v1.34.2-20240715174738-f694d610cde4.2 h1:1RS42QWCLmosvuEvr9wIX1P5H898jPAruOC2eFGTc+I= +buf.build/gen/go/redpandadata/cloud/protocolbuffers/go v1.34.2-20240715174738-f694d610cde4.2/go.mod h1:FYKJ74J6GISLCL3PrEGYtqFhl86Sav4N07klNQSkdX8= +buf.build/gen/go/redpandadata/common/protocolbuffers/go v1.34.2-20240715174743-9c0afe867874.2 h1:mwz77izDe41jrNZqQx2iEzOt4k7pfWthVFuK2SMwCCw= +buf.build/gen/go/redpandadata/common/protocolbuffers/go v1.34.2-20240715174743-9c0afe867874.2/go.mod h1:wThyg02xJx4K/DA5fg0QlKts8XVPyTT86JC8hPfEzno= +buf.build/gen/go/redpandadata/dataplane/connectrpc/go v1.16.2-20240620104934-3415ce922cfb.1 h1:LCWz9iwpOmK47kN13VNNrSMA9CWvI6ymELmRmToXquY= +buf.build/gen/go/redpandadata/dataplane/connectrpc/go v1.16.2-20240620104934-3415ce922cfb.1/go.mod h1:R0DNyd3sxZqaTQrcjSgGaJqHndFCf3kKHBbXgKYzKDY= +buf.build/gen/go/redpandadata/dataplane/protocolbuffers/go v1.34.2-20240620104934-3415ce922cfb.2 h1:Zztd29tww+/5N9Ff1HIVYXw+NDsdziaZ11Zg7MQjebc= +buf.build/gen/go/redpandadata/dataplane/protocolbuffers/go v1.34.2-20240620104934-3415ce922cfb.2/go.mod h1:AcLjVYZHtwlZvBrjuqyjtZtHv9BbDaHD6C92lO/gJFI= +connectrpc.com/connect v1.16.2 h1:ybd6y+ls7GOlb7Bh5C8+ghA6SvCBajHwxssO2CGFjqE= +connectrpc.com/connect v1.16.2/go.mod h1:n2kgwskMHXC+lVqb18wngEpF95ldBHXjZYJussz5FRc= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= +github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= @@ -23,6 +41,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/hcsshim v0.12.3 h1:LS9NXqXhMoqNCplK1ApmVSfB4UnVLRDWRapB6EIlxE0= github.com/Microsoft/hcsshim v0.12.3/go.mod h1:Iyl1WVpZzr+UkzjekHZbV8o5Z9ZkxNGx6CtY2Qg/JVQ= +github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= +github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -57,8 +77,8 @@ github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNS github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= github.com/chrisseto/rapid v0.0.0-20240815210052-cdeef406c65c h1:GZtcJAFTBCr16eM7ytFwWMg9oLaMsRfSsVyi3lTo+mw= github.com/chrisseto/rapid v0.0.0-20240815210052-cdeef406c65c/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= @@ -80,6 +100,7 @@ github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoY github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.20 h1:VIPb/a2s17qNeQgDnkfZC35RScx+blkKF8GV68n80J4= github.com/creack/pty v1.1.20/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= @@ -122,14 +143,14 @@ github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6FI= -github.com/foxcpp/go-mockdns v1.0.0/go.mod h1:lgRN6+KxQBawyIghpnl5CezHFGS9VLzvtVlwxvzXTQ4= +github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI= +github.com/foxcpp/go-mockdns v1.1.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= @@ -144,7 +165,6 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= @@ -197,7 +217,6 @@ github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl76 github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49/go.mod h1:BkkQ4L1KS1xMt2aWSPStnn55ChGC0DPOn2FQYj+f25M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 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= @@ -221,9 +240,6 @@ github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -234,6 +250,8 @@ github.com/hashicorp/golang-lru/arc/v2 v2.0.7 h1:QxkVTxwColcduO+LP7eJO56r2hFiG8z github.com/hashicorp/golang-lru/arc/v2 v2.0.7/go.mod h1:Pe7gBlGdc8clY5LJ0LpJXMt5AmgmWNH1g+oFFVUHOEc= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= +github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/homeport/dyff v1.7.1 h1:B3KJUtnU53H2UryxGcfYKQPrde8VjjbwlHZbczH3giQ= github.com/homeport/dyff v1.7.1/go.mod h1:iLe5b3ymc9xmHZNuJlNVKERE8L2isQMBLxFiTXcwZY0= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= @@ -257,6 +275,8 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= @@ -285,7 +305,6 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lucasjones/reggen v0.0.0-20200904144131-37ba4fa293bb h1:w1g9wNDIE/pHSTmAaUhv4TZQuPBS6GV3mMz5hkgziIU= github.com/lucasjones/reggen v0.0.0-20200904144131-37ba4fa293bb/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed h1:036IscGBfJsFIgJQzlui7nK1Ncm0tp2ktmPj8xO4N/0= github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -300,8 +319,10 @@ github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mattn/go-ciede2000 v0.0.0-20170301095244-782e8c62fec3 h1:BXxTozrOU8zgC5dkpn3J6NTRdoP+hjok/e+ACr4Hibk= github.com/mattn/go-ciede2000 v0.0.0-20170301095244-782e8c62fec3/go.mod h1:x1uk6vxTiVuNt6S5R2UYgdhpj3oKojXvOXauHZ7dEnI= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= @@ -311,6 +332,9 @@ github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -333,8 +357,8 @@ github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8= -github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= +github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= @@ -386,13 +410,12 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE 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= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY= github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg= -github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.74.0 h1:AHzMWDxNiAVscJL6+4wkvFRTpMnJqiaZFEKA/osaBXE= -github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.74.0/go.mod h1:wAR5JopumPtAZnu0Cjv2PSqV4p4QB09LMhc6fZZTXuA= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.76.2 h1:BpGDC87A2SaxbKgONsFLEX3kRcRJee2aLQbjXsuz0hA= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.76.2/go.mod h1:Rd8YnCqz+2FYsiGmE2DMlaLjQRB4v2jFNnzCt9YY4IM= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= @@ -411,14 +434,12 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/redpanda-data/common-go/net v0.1.0 h1:JnJioRJuL961r1QXiJQ1tW9+yEaJfu8FpXnUmvQbwNM= -github.com/redpanda-data/common-go/net v0.1.0/go.mod h1:iOdNkjxM7a1T8F3cYHTaKIPFCHzzp/ia6TN+Z+7Tt5w= -github.com/redpanda-data/common-go/rpadmin v0.1.5-0.20240814205445-8e6eb5806561 h1:b04JjYbvjv6iJSImCYw6hTJqooW7XV9u4PuG1oN4Xw0= -github.com/redpanda-data/common-go/rpadmin v0.1.5-0.20240814205445-8e6eb5806561/go.mod h1:I7umqhnMhIOSEnIA3fvLtdQU7QO/SbWGCwFfFDs3De4= -github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20241216191615-bb41e7cd4a6e h1:aa3zobBpU9dliXcIU1RmgimMbw1dMpVqss3QSEIYMfI= -github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20241216191615-bb41e7cd4a6e/go.mod h1:8FFza9zyiiUQaGmdhe9lvA67UQa1BVp/vgyOA/cHW6I= -github.com/redpanda-data/redpanda/src/go/rpk v0.0.0-20240105044330-c094966ca0cf h1:M14hKddyokDrRganGDiUbFPwF2G0agDZIZzpocHf5rc= -github.com/redpanda-data/redpanda/src/go/rpk v0.0.0-20240105044330-c094966ca0cf/go.mod h1:SaSp5/JwdLHu8ZU82wFbXD8/oE4UWB+8ZkjWWreAt7Y= +github.com/redpanda-data/redpanda-operator/charts v0.0.0-20250108152555-7d0f73871aec h1:YFyEUBIwdL73e5PFFpjoOkd68NF6oEggrL/lonAYv4o= +github.com/redpanda-data/redpanda-operator/charts v0.0.0-20250108152555-7d0f73871aec/go.mod h1:jr5gxZMv2t8S1dH3li9hqaCZM+L7Jh5zRRbYWBxsgyg= +github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20250108152555-7d0f73871aec h1:cQyKfiio6yC3Q1F5OeSg6w55ed6ftuRl1XIz8YeZ60A= +github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20250108152555-7d0f73871aec/go.mod h1:mF+W5l5wWXI9Y3ZTHgWfbY/xQGHl8/ObCGCjI02StcE= +github.com/redpanda-data/redpanda/src/go/rpk v0.0.0-20240827155712-244863ea0ae8 h1:uTQKqF8UPNxYxKBJ11VlG6Vt2l9ctkkeXsmmjHUSUG4= +github.com/redpanda-data/redpanda/src/go/rpk v0.0.0-20240827155712-244863ea0ae8/go.mod h1:97qkjcMI3gDL+y+aY/w5o0xF2qGHFof6rCXIYjnTalM= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -433,14 +454,10 @@ github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6Ng github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= -github.com/sethgrid/pester v1.2.0 h1:adC9RS29rRUef3rIKWPOuP1Jm3/MmB6ke+OhE5giENI= -github.com/sethgrid/pester v1.2.0/go.mod h1:hEUINb4RqvDxtoCaU0BNT/HV4ig5kfgOasrf1xcvr0A= github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -458,8 +475,6 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -468,29 +483,24 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/testcontainers/testcontainers-go v0.33.0 h1:zJS9PfXYT5O0ZFXM2xxXfk4J5UMw/kRiISng037Gxdw= github.com/testcontainers/testcontainers-go v0.33.0/go.mod h1:W80YpTa8D5C3Yy16icheD01UTDu+LmXIA2Keo+jWtT8= github.com/testcontainers/testcontainers-go/modules/k3s v0.32.0 h1:Z3DTMveNUqeGJZ+CXZhpvI7OF1BS71Ywi3SwoXLZ4Lc= github.com/testcontainers/testcontainers-go/modules/k3s v0.32.0/go.mod h1:SYp1WtvNc3n/cg5atO6LvaOd2aqkQYMSDCcWPOUdaZg= github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U= github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= github.com/twmb/franz-go v1.18.0 h1:25FjMZfdozBywVX+5xrWC2W+W76i0xykKjTdEeD2ejw= github.com/twmb/franz-go v1.18.0/go.mod h1:zXCGy74M0p5FbXsLeASdyvfLFsBvTubVqctIaa5wQ+I= +github.com/twmb/franz-go/pkg/kadm v1.12.0 h1:I8P/gpXFzhl73QcAYmJu+1fOXvrynyH/MAotr2udEg4= +github.com/twmb/franz-go/pkg/kadm v1.12.0/go.mod h1:VMvpfjz/szpH9WB+vGM+rteTzVv0djyHFimci9qm2C0= github.com/twmb/franz-go/pkg/kmsg v1.9.0 h1:JojYUph2TKAau6SBtErXpXGC7E3gg4vGZMv9xFU/B6M= github.com/twmb/franz-go/pkg/kmsg v1.9.0/go.mod h1:CMbfazviCyY6HM0SXuG5t9vOwYDHRCSrJJyBAe5paqg= -github.com/twmb/franz-go/pkg/sr v1.2.0 h1:zYr0Ly7KLFfeCGaSr8teN6LvAVeYVrZoUsyyPHTYB+M= -github.com/twmb/franz-go/pkg/sr v1.2.0/go.mod h1:gpd2Xl5/prkj3gyugcL+rVzagjaxFqMgvKMYcUlrpDw= github.com/twmb/tlscfg v1.2.1 h1:IU2efmP9utQEIV2fufpZjPq7xgcZK4qu25viD51BB44= github.com/twmb/tlscfg v1.2.1/go.mod h1:GameEQddljI+8Es373JfQEBvtI4dCTLKWGJbqT2kErs= github.com/virtuald/go-ordered-json v0.0.0-20170621173500-b18e6e673d74 h1:JwtAtbp7r/7QSyGz8mKUbYJBg2+6Cd7OjM8o/GNOcVo= @@ -517,18 +527,10 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIX go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM= go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.starlark.net v0.0.0-20231121155337-90ade8b19d09 h1:hzy3LFnSN8kuQK8h9tHl4ndF6UruMj47OqwqsS+/Ai4= go.starlark.net v0.0.0-20231121155337-90ade8b19d09/go.mod h1:LcLNIzVOMp4oV+uusnpk+VU+SzXaJakUuBjoCSWH5dM= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -543,15 +545,15 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk= golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= -golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -561,8 +563,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -571,42 +573,37 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/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-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-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= -golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= +golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/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.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -614,15 +611,14 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= -golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= -gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240725223205-93522f1f2a9f h1:htT2I9bZvGm+110zq8bIErMX+WgBWxCzV3ChwbvnKnc= +google.golang.org/genproto v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:Sk3mLpoDFTAp6R4OvlcUgaG4ISTspKeFsIAXMn9Bm4Y= google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f h1:b1Ln/PG8orm0SsBbHZWke8dDp2lrCD4jSmfglFpTZbk= google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:AHT0dDg3SoMOgZGnZk29b5xTbPHMoEC8qthmBLJCpys= google.golang.org/genproto/googleapis/rpc v0.0.0-20240808171019-573a1156607a h1:EKiZZXueP9/T68B8Nl0GAx9cjbQnCId0yP3qPMgaaHs= @@ -677,8 +673,6 @@ k8s.io/kubectl v0.30.3 h1:YIBBvMdTW0xcDpmrOBzcpUVsn+zOgjMYIu7kAq+yqiI= k8s.io/kubectl v0.30.3/go.mod h1:IcR0I9RN2+zzTRUa1BzZCm4oM0NLOawE6RzlDvd1Fpo= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -mvdan.cc/gofumpt v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo= -mvdan.cc/gofumpt v0.6.0/go.mod h1:4L0wf+kgIPZtcCWXynNS2e6bhmj73umwnuXSZarixzA= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= sigs.k8s.io/controller-runtime v0.18.5 h1:nTHio/W+Q4aBlQMgbnC5hZb4IjIidyrizMai9P6n4Rk= diff --git a/go.work.sum b/go.work.sum index f325d51a02..69c5044657 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,9 +1,16 @@ +buf.build/gen/go/bufbuild/protovalidate/connectrpc/go v1.16.2-20240508200655-46a4cf4ba109.1 h1:LxNUkzvCtt95ieuApdfggbIwx2ryUARJztCwjzwMleU= +buf.build/gen/go/bufbuild/protovalidate/connectrpc/go v1.16.2-20240508200655-46a4cf4ba109.1/go.mod h1:mirfoxgQpuVzaUWj0Yp+2fcOVm6vBlTE09UZas2L2OI= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.32.0-20231115204500-e097f827e652.1 h1:u0olL4yf2p7Tl5jfsAK5keaFi+JFJuv1CDHrbiXkxkk= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.32.0-20231115204500-e097f827e652.1/go.mod h1:tiTMKD8j6Pd/D2WzREoweufjzaJKHZg35f/VGcZ2v3I= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240401165935-b983156c5e99.1 h1:2IGhRovxlsOIQgx2ekZWo4wTPAYpck41+18ICxs37is= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240401165935-b983156c5e99.1/go.mod h1:Tgn5bgL220vkFOI0KPStlcClPeOJzAv4uT+V8JXGUnw= +buf.build/gen/go/grpc-ecosystem/grpc-gateway/connectrpc/go v1.16.2-20221127060915-a1ecdc58eccd.1 h1:Ia0Yhh2HFbDIu9ETDfeeQLl8cmJ+qv2Wb8Cy+2OqqFo= +buf.build/gen/go/grpc-ecosystem/grpc-gateway/connectrpc/go v1.16.2-20221127060915-a1ecdc58eccd.1/go.mod h1:weK4p6hYJhrGOtmWuJbOCXvHS4VefJm3KA6hITJ3ItE= +buf.build/gen/go/redpandadata/common/connectrpc/go v1.16.2-20240508150812-e0d0fbd58f25.1 h1:HqxNYI0XIt2ZzlL/oqcPXLnFL3YnBHAE91XnJeZsEdQ= +buf.build/gen/go/redpandadata/common/connectrpc/go v1.16.2-20240508150812-e0d0fbd58f25.1/go.mod h1:PuDLN6y2TNEKqN+T1kSpWR7HZUyN2WSI2xVbamBg1uw= buf.build/gen/go/redpandadata/common/protocolbuffers/go v1.33.0-20240508150812-e0d0fbd58f25.1 h1:X8EeeFlNCt0g77OP8kuOcdWKTTafQoW5iHD3D5SP3bY= buf.build/gen/go/redpandadata/common/protocolbuffers/go v1.33.0-20240508150812-e0d0fbd58f25.1/go.mod h1:NDWpeU3ohHVIKP3DhrDOtnLrmrjz8il/5SH+1/B6TNM= +cel.dev/expr v0.15.0 h1:O1jzfJCQBfL5BFoYktaxwIhuttaQPsVWerH9/EEKx0w= cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -32,70 +39,104 @@ cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnP cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= cloud.google.com/go v0.112.2 h1:ZaGT6LiG7dBzi6zNOvVZwacaXlmf3lRqnC4DQzqyRQw= cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= +cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14= +cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU= cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= cloud.google.com/go/accessapproval v1.7.5/go.mod h1:g88i1ok5dvQ9XJsxpUInWWvUBrIZhyPDPbk4T01OoJ0= cloud.google.com/go/accessapproval v1.7.6 h1:fMbP4cJX/926h+kwGtABmcG83PXsjkB+q7nSBzZpJoo= cloud.google.com/go/accessapproval v1.7.6/go.mod h1:bdDCS3iLSLhlK3pu8lJClaeIVghSpTLGChl1Ihr9Fsc= +cloud.google.com/go/accessapproval v1.7.10 h1:FXEpenM4o4/mwxoZh5cAIKsAwI7yJF+akJ7rA9W3DSM= +cloud.google.com/go/accessapproval v1.7.10/go.mod h1:iOXZj2B/c3N8nf2PYOB3iuRKCbnkn19/F6fqaa2zhn8= cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= cloud.google.com/go/accesscontextmanager v1.8.5/go.mod h1:TInEhcZ7V9jptGNqN3EzZ5XMhT6ijWxTGjzyETwmL0Q= cloud.google.com/go/accesscontextmanager v1.8.6 h1:NipmPd3BCzwa/mr40SK8pWRkbzv9Th5Azhi4dBYazlM= cloud.google.com/go/accesscontextmanager v1.8.6/go.mod h1:rMC0Z8pCe/JR6yQSksprDc6swNKjMEvkfCbaesh+OS0= +cloud.google.com/go/accesscontextmanager v1.8.10 h1:yOor9FEEwEv6zWZaSIyoAzp6RjHhtPO49isNS722SSE= +cloud.google.com/go/accesscontextmanager v1.8.10/go.mod h1:hdwcvyIn3NXgjSiUanbL7drFlOl39rAoj5SKBrNVtyA= cloud.google.com/go/aiplatform v1.58.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= cloud.google.com/go/aiplatform v1.60.0/go.mod h1:eTlGuHOahHprZw3Hio5VKmtThIOak5/qy6pzdsqcQnM= cloud.google.com/go/aiplatform v1.67.0 h1:YWeqD4BjYwrmY4fa+isGcw0P81lJ3dKVxbWxdBchoiU= cloud.google.com/go/aiplatform v1.67.0/go.mod h1:s/sJ6btBEr6bKnrNWdK9ZgHCvwbZNdP90b3DDtxxw+Y= +cloud.google.com/go/aiplatform v1.68.0 h1:EPPqgHDJpBZKRvv+OsB3cr0jYz3EL2pZ+802rBPcG8U= +cloud.google.com/go/aiplatform v1.68.0/go.mod h1:105MFA3svHjC3Oazl7yjXAmIR89LKhRAeNdnDKJczME= cloud.google.com/go/analytics v0.22.0/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= cloud.google.com/go/analytics v0.23.0/go.mod h1:YPd7Bvik3WS95KBok2gPXDqQPHy08TsCQG6CdUCb+u0= cloud.google.com/go/analytics v0.23.1 h1:UH/PWBcPxHKolWxaS3hO+aj+wDTuq7XKvdtpqR3lyOI= cloud.google.com/go/analytics v0.23.1/go.mod h1:N+piBUJo0RfnVTa/u8E/d31jAxxQaHlnoJfUx0dechM= +cloud.google.com/go/analytics v0.23.5 h1:TH6TKVxQkW9sxeHZ8FgHBzQWkSv3vdrPjp5dawheLGk= +cloud.google.com/go/analytics v0.23.5/go.mod h1:J54PE6xjbmbTA5mOOfX5ibafOs9jyY7sFKTTiAnIIY4= cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= cloud.google.com/go/apigateway v1.6.5/go.mod h1:6wCwvYRckRQogyDDltpANi3zsCDl6kWi0b4Je+w2UiI= cloud.google.com/go/apigateway v1.6.6 h1:60GMRN1JFwq9MldvEVMdR3gDJ0vI0C/BwgkImG6bx/M= cloud.google.com/go/apigateway v1.6.6/go.mod h1:bFH3EwOkeEC+31wVxKNuiadhk2xa7y9gJ3rK4Mctq6o= +cloud.google.com/go/apigateway v1.6.10 h1:ZnQwNy6c98vCz3IuwVX29oli9S1/AHOMgLKS0xwLNn0= +cloud.google.com/go/apigateway v1.6.10/go.mod h1:3bRZnd+TDYONxRw2W8LB1jG3pDONS7GHJXMm5+BtQ+k= cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= cloud.google.com/go/apigeeconnect v1.6.5/go.mod h1:MEKm3AiT7s11PqTfKE3KZluZA9O91FNysvd3E6SJ6Ow= cloud.google.com/go/apigeeconnect v1.6.6 h1:ObsKNGtdu0ckkCSUpCN5fVAVg+DmzFg89JlqsW4OAWk= cloud.google.com/go/apigeeconnect v1.6.6/go.mod h1:j8V/Xj51tEUl/cWnqwlolPvCpHj5OvgKrHEGfmYXG9Y= +cloud.google.com/go/apigeeconnect v1.6.10 h1:kP8X5WaFw1jsT21pwL7wkFoajnf4/9iL+8+Rp47rAws= +cloud.google.com/go/apigeeconnect v1.6.10/go.mod h1:MZf8FZK+0JZBcncSSnUkzWw2n2fQnEdIvfI6J7hGcEY= cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= cloud.google.com/go/apigeeregistry v0.8.3/go.mod h1:aInOWnqF4yMQx8kTjDqHNXjZGh/mxeNlAf52YqtASUs= cloud.google.com/go/apigeeregistry v0.8.4 h1:l8VFHdNMC+9Q4EHKye2eOZBu5IwddXF6ufAXI7D+PB8= cloud.google.com/go/apigeeregistry v0.8.4/go.mod h1:oA6iN7olOol8Rc28n1qd2q0LSD3ro2pdf/1l/y8SK4E= +cloud.google.com/go/apigeeregistry v0.8.8 h1:+IUNlJPh1iRWPuz9t4Ym317urEGJwF/If6tKaxa39PU= +cloud.google.com/go/apigeeregistry v0.8.8/go.mod h1:0pDUUsNGiqCuBlD0VoPX2ssug6/vJ6BBPg8o4qPkE4k= cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= cloud.google.com/go/appengine v1.8.5/go.mod h1:uHBgNoGLTS5di7BvU25NFDuKa82v0qQLjyMJLuPQrVo= cloud.google.com/go/appengine v1.8.6 h1:cM+Lj0A0nCtujM9lqRId5L8hz7bHRfu3q3KdKtpn+38= cloud.google.com/go/appengine v1.8.6/go.mod h1:J0Vk696gUey9gbmTub3Qe4NYPy6qulXMkfwcQjadFnM= +cloud.google.com/go/appengine v1.8.10 h1:o1vQWibFsOZc4YmYM/3coTetzApvdu12d3ZC/KzW+PU= +cloud.google.com/go/appengine v1.8.10/go.mod h1:4jh9kPp01PeN//i+yEHjIQ5153f/F9q/CDbNTMYBlU4= cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= cloud.google.com/go/area120 v0.8.5/go.mod h1:BcoFCbDLZjsfe4EkCnEq1LKvHSK0Ew/zk5UFu6GMyA0= cloud.google.com/go/area120 v0.8.6 h1:7QJ4ZzqLOwh0pHD3UAa+VwiyWmDI7bdmkYKVkte8/wg= cloud.google.com/go/area120 v0.8.6/go.mod h1:sjEk+S9QiyDt1fxo75TVut560XZLnuD9lMtps0qQSH0= +cloud.google.com/go/area120 v0.8.10 h1:sWwAAsTer6rzSsYPyMtTSs7/neaKOxSDzKmgPJpfhYk= +cloud.google.com/go/area120 v0.8.10/go.mod h1:vTEko4eg1VkkkEzWDjLtMwBHgm7L4x8HgWE8fgEUd5k= cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= cloud.google.com/go/artifactregistry v1.14.7/go.mod h1:0AUKhzWQzfmeTvT4SjfI4zjot72EMfrkvL9g9aRjnnM= cloud.google.com/go/artifactregistry v1.14.8 h1:icIyRzJ1Ag6EOafuDuFFJ/AdStcOFRVfSGURn27/7Pk= cloud.google.com/go/artifactregistry v1.14.8/go.mod h1:1UlSXh6sTXYrIT4kMO21AE1IDlMFemlZuX6QS+JXW7I= +cloud.google.com/go/artifactregistry v1.14.12 h1:zhkIriilXSGJ3Yyfl7ixJ9j9qyWXa9UY3xND2jzn6fU= +cloud.google.com/go/artifactregistry v1.14.12/go.mod h1:00qcBxCdu0SKIYPhFOymrsJpdacjBHVSiCsRkyqlRUA= cloud.google.com/go/asset v1.17.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= cloud.google.com/go/asset v1.17.2/go.mod h1:SVbzde67ehddSoKf5uebOD1sYw8Ab/jD/9EIeWg99q4= cloud.google.com/go/asset v1.18.1 h1:+NpxL5L53VY91EoJTHeGGXSWEUllf2hhXpCyTnSrd3Q= cloud.google.com/go/asset v1.18.1/go.mod h1:QXivw0mVqwrhZyuX6iqFbyfCdzYE9AFCJVG47Eh5dMM= +cloud.google.com/go/asset v1.19.4 h1:TFHvHGifCl8wRWzDDqomfUmCK3tml7lX9Jx3jZgxre8= +cloud.google.com/go/asset v1.19.4/go.mod h1:zSEhgb9eNLeBcl4eSO/nsrh1MyUNCBynvyRaFnXMaeY= cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= cloud.google.com/go/assuredworkloads v1.11.5/go.mod h1:FKJ3g3ZvkL2D7qtqIGnDufFkHxwIpNM9vtmhvt+6wqk= cloud.google.com/go/assuredworkloads v1.11.6 h1:3NlUes0xLN2kcSU24qQADFYsOaetCPg0HSA302AyV5s= cloud.google.com/go/assuredworkloads v1.11.6/go.mod h1:1dlhWKocQorGYkspt+scx11kQCI9qVHOi1Au6Rw9srg= +cloud.google.com/go/assuredworkloads v1.11.10 h1:io0SdseprW0Z17OWNmwbhHtolNKoBr9Zf9R7rlMrJ9E= +cloud.google.com/go/assuredworkloads v1.11.10/go.mod h1:x6pCPBbTVjXbAWu35spKLY3AU4Pmcn4GeXnkZGxOVhU= cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= cloud.google.com/go/automl v1.13.5/go.mod h1:MDw3vLem3yh+SvmSgeYUmUKqyls6NzSumDm9OJ3xJ1Y= cloud.google.com/go/automl v1.13.6 h1:NHBO5cjo2IgwaJ5qlez/iA35XI1db87PPlOB0Kjt5RM= cloud.google.com/go/automl v1.13.6/go.mod h1:/0VtkKis6KhFJuPzi45e0E+e9AdQE09SNieChjJqU18= +cloud.google.com/go/automl v1.13.10 h1:Fyrmq1PgufEer3tw5b9ooMlsL8tCRyWp4SmXoOdxhc4= +cloud.google.com/go/automl v1.13.10/go.mod h1:I5nlZ4sBYIX90aBwv3mm5A0W6tlGbzrJ4nkaErdsmAk= cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= cloud.google.com/go/baremetalsolution v1.2.4/go.mod h1:BHCmxgpevw9IEryE99HbYEfxXkAEA3hkMJbYYsHtIuY= cloud.google.com/go/baremetalsolution v1.2.5 h1:jCR4rnVsG6ocK6ngFr2Z6ugKZfTENmMZkiV6Ma2tEeE= cloud.google.com/go/baremetalsolution v1.2.5/go.mod h1:CImy7oNMC/7vLV1Ig68Og6cgLWuVaghDrm+sAhYSSxA= +cloud.google.com/go/baremetalsolution v1.2.9 h1:zhmip3zm/5koNF8H6dlddWa+INykm0WScpFsRDhzJRA= +cloud.google.com/go/baremetalsolution v1.2.9/go.mod h1:eFlsoR4Im039D+EVn1fKXEKWNPoMW2ewXBTHmjEZxlM= cloud.google.com/go/batch v1.7.0/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= cloud.google.com/go/batch v1.8.0/go.mod h1:k8V7f6VE2Suc0zUM4WtoibNrA6D3dqBpB+++e3vSGYc= cloud.google.com/go/batch v1.8.3 h1:b9fVZDxxp4LWMhXV7uAhyMGmPuzlzPrsZ0uh+RM92h8= cloud.google.com/go/batch v1.8.3/go.mod h1:mnDskkuz1h+6i/ra8IMhTf8HwG8GOswSRKPJdAOgSbE= +cloud.google.com/go/batch v1.9.1 h1:2tqKjMs5wvYs+120XIP8t+BDoa2QjhKgIz9MBaOekNA= +cloud.google.com/go/batch v1.9.1/go.mod h1:UGOBIGCUNo9NPeJ4VvmGpnTbE8vTewNhFaI/ZcQZaHk= cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= cloud.google.com/go/beyondcorp v1.0.4/go.mod h1:Gx8/Rk2MxrvWfn4WIhHIG1NV7IBfg14pTKv1+EArVcc= cloud.google.com/go/beyondcorp v1.0.5 h1:fnil8viEdcAJJiwiJPCT2fl3Grx3XFwXxTq7n9g/8QM= cloud.google.com/go/beyondcorp v1.0.5/go.mod h1:lFRWb7i/w4QBFW3MbM/P9wX15eLjwri/HYvQnZuk4Fw= +cloud.google.com/go/beyondcorp v1.0.9 h1:1UeDTSkNGk0XaXoQ9Z76PxtB8cJPmBZRnW2HzeKZu9k= +cloud.google.com/go/beyondcorp v1.0.9/go.mod h1:xa0eU8tIbYVraMOpRh5V9PirdYROvTUcPayJW9UlSNs= 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= @@ -106,34 +147,52 @@ cloud.google.com/go/bigquery v1.58.0/go.mod h1:0eh4mWNY0KrBTjUzLjoYImapGORq9gEPT cloud.google.com/go/bigquery v1.59.1/go.mod h1:VP1UJYgevyTwsV7desjzNzDND5p6hZB+Z8gZJN1GQUc= cloud.google.com/go/bigquery v1.60.0 h1:kA96WfgvCbkqfLnr7xI5uEfJ4h4FrnkdEb0yty0KSZo= cloud.google.com/go/bigquery v1.60.0/go.mod h1:Clwk2OeC0ZU5G5LDg7mo+h8U7KlAa5v06z5rptKdM3g= +cloud.google.com/go/bigquery v1.62.0 h1:SYEA2f7fKqbSRRBHb7g0iHTtZvtPSPYdXfmqsjpsBwo= +cloud.google.com/go/bigquery v1.62.0/go.mod h1:5ee+ZkF1x/ntgCsFQJAQTM3QkAZOecfCmvxhkJsWRSA= +cloud.google.com/go/bigtable v1.27.2-0.20240725222120-ce31365acc54 h1:KOjHlKEA0UzDD9asy7vFmv/mOwj/UH8IDjKl5LfEJXU= +cloud.google.com/go/bigtable v1.27.2-0.20240725222120-ce31365acc54/go.mod h1:NmJ2jfoB34NxQyk4w7UCchopqE9r+a186ewvGrM79TI= cloud.google.com/go/billing v1.18.0/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= cloud.google.com/go/billing v1.18.2/go.mod h1:PPIwVsOOQ7xzbADCwNe8nvK776QpfrOAUkvKjCUcpSE= cloud.google.com/go/billing v1.18.4 h1:XcYB8aKj97d4/0kh+LQgrxPxOo/0jgPNp5Q1nyzCyvs= cloud.google.com/go/billing v1.18.4/go.mod h1:hECVHwfls2hhA/wrNVAvZ48GQzMxjWkQRq65peAnxyc= +cloud.google.com/go/billing v1.18.8 h1:F0QnYXQ/o86zkuLMwJe+yLlPj/kgfrNCukH+bOhAT2I= +cloud.google.com/go/billing v1.18.8/go.mod h1:oFsuKhKiuxK7dDQ4a8tt5/1cScEo4IzhssWj6TTdi6k= cloud.google.com/go/binaryauthorization v1.8.0/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= cloud.google.com/go/binaryauthorization v1.8.1/go.mod h1:1HVRyBerREA/nhI7yLang4Zn7vfNVA3okoAR9qYQJAQ= cloud.google.com/go/binaryauthorization v1.8.2 h1:XiAdW5HAWtk9WEjEA5MXYiRJ28Tjp1xGPPAMRFI5bnc= cloud.google.com/go/binaryauthorization v1.8.2/go.mod h1:/v3/F2kBR5QmZBnlqqzq9QNwse8OFk+8l1gGNUzjedw= +cloud.google.com/go/binaryauthorization v1.8.6 h1:eMjakmqpE0UPmyki0eGZQfyBSyfNRhGzb64lE32T+ik= +cloud.google.com/go/binaryauthorization v1.8.6/go.mod h1:GAfktMiQW14Y67lIK5q9QSbzYc4NE/xIpQemVRhIVXc= cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= cloud.google.com/go/certificatemanager v1.7.5/go.mod h1:uX+v7kWqy0Y3NG/ZhNvffh0kuqkKZIXdvlZRO7z0VtM= cloud.google.com/go/certificatemanager v1.8.0 h1:oc15T+leZ2Wm5oocvGTbDXwonka0chpJTEiHIVsBiEA= cloud.google.com/go/certificatemanager v1.8.0/go.mod h1:5qq/D7PPlrMI+q9AJeLrSoFLX3eTkLc9MrcECKrWdIM= +cloud.google.com/go/certificatemanager v1.8.4 h1:Wo9Q49PRHxy4E8Z+RqO5u17kXmU14YuyHkSK9urkxtc= +cloud.google.com/go/certificatemanager v1.8.4/go.mod h1:knD4QGjaogN6hy/pk1f2Cz1fhU8oYeYSF710RRf+d6k= cloud.google.com/go/channel v1.17.4/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= cloud.google.com/go/channel v1.17.5/go.mod h1:FlpaOSINDAXgEext0KMaBq/vwpLMkkPAw9b2mApQeHc= cloud.google.com/go/channel v1.17.6 h1:rBnTls9G5nC/jOrb9V/tZFHFXt6kBMNlIQKg6DjAlRM= cloud.google.com/go/channel v1.17.6/go.mod h1:fr0Oidb2mPfA0RNcV+JMSBv5rjpLHjy9zVM5PFq6Fm4= +cloud.google.com/go/channel v1.17.10 h1:pMQz4Dx27STVg+9Dgqq3/fT5dWlEbWnDMWCgOw0jHoA= +cloud.google.com/go/channel v1.17.10/go.mod h1:TzcYuXlpeex8O483ofkxbY/DKRF49NBumZTJPvjstVA= cloud.google.com/go/cloudbuild v1.15.0/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= cloud.google.com/go/cloudbuild v1.15.1/go.mod h1:gIofXZSu+XD2Uy+qkOrGKEx45zd7s28u/k8f99qKals= cloud.google.com/go/cloudbuild v1.16.0 h1:66hY1gXV2cdn4gquy5TieaJwaZmRzrQ5cK++pVgnCkQ= cloud.google.com/go/cloudbuild v1.16.0/go.mod h1:CCWnqxLxEdh8kpOK83s3HTNBTpoIFn/U9j8DehlUyyA= +cloud.google.com/go/cloudbuild v1.16.4 h1:zB1bEj8GS5aIiULx6m5/p5BLldRY+kD1FU/pgyaa8os= +cloud.google.com/go/cloudbuild v1.16.4/go.mod h1:YSNmtWgg9lmL4st4+lej1XywNEUQnbyA/F+DdXPBevA= cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= cloud.google.com/go/clouddms v1.7.4/go.mod h1:RdrVqoFG9RWI5AvZ81SxJ/xvxPdtcRhFotwdE79DieY= cloud.google.com/go/clouddms v1.7.5 h1:t1nc49kRzEU2vrDxQQIEc5rZ4Hr187YrdOZPMAgMwMI= cloud.google.com/go/clouddms v1.7.5/go.mod h1:O4GVvxKPxbXlVfxkoUIXi8UAwwIHoszYm32dJ8tgbvE= +cloud.google.com/go/clouddms v1.7.9 h1:rXdAENHOQTrS6dsgKYfainlEy0uzQAeOS3enFsB+8YM= +cloud.google.com/go/clouddms v1.7.9/go.mod h1:U2j8sOFtsIovea96mz2joyNMULl43TGadf7tOAUKKzs= cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= cloud.google.com/go/cloudtasks v1.12.6/go.mod h1:b7c7fe4+TJsFZfDyzO51F7cjq7HLUlRi/KZQLQjDsaY= cloud.google.com/go/cloudtasks v1.12.7 h1:Ev+poxwb7pudBhiF0ObwAWT7Dh9BZAcsvAfFTWg0MPc= cloud.google.com/go/cloudtasks v1.12.7/go.mod h1:I6o/ggPK/RvvokBuUppsbmm4hrGouzFbf6fShIm0Pqc= +cloud.google.com/go/cloudtasks v1.12.11 h1:3Wg0x8pPaHy1f3Z6wOYQiu0KjseVZKHWIS2iNVDLsF8= +cloud.google.com/go/cloudtasks v1.12.11/go.mod h1:uDR/oUmPZqL2rNz9M9MXvm07hkkLnvvUORbud8MA5p4= cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= @@ -143,100 +202,151 @@ cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1Yl cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= +cloud.google.com/go/compute v1.27.3 h1:GFfoejA5qGeFYpKAfgoVzvgJ3D8upFKI/UR7MdiPdS0= +cloud.google.com/go/compute v1.27.3/go.mod h1:5GuDo3l1k9CFhfIHK1sXqlqOW/iWX4/eBlO5FtxDhvQ= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= +cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= cloud.google.com/go/contactcenterinsights v1.12.1/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= cloud.google.com/go/contactcenterinsights v1.13.0/go.mod h1:ieq5d5EtHsu8vhe2y3amtZ+BE+AQwX5qAy7cpo0POsI= cloud.google.com/go/contactcenterinsights v1.13.1 h1:sCDKUmDj9Tfd6Qj7x4XbwC43oYzEBwSDLC1tReQWS/Y= cloud.google.com/go/contactcenterinsights v1.13.1/go.mod h1:/3Ji8Rr1GS6d+/MOwlXM2gZPSuvTKIFyf8OG+7Pe5r8= +cloud.google.com/go/contactcenterinsights v1.13.5 h1:vJaf5BIrjeJ9Blzd/xJPWLpy7obftHdzc8yxzdTpVg0= +cloud.google.com/go/contactcenterinsights v1.13.5/go.mod h1:/27aGOSszuoT547CX4kTbF+4nMv3EIXN8+z+dJcMZco= cloud.google.com/go/container v1.29.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= cloud.google.com/go/container v1.31.0/go.mod h1:7yABn5s3Iv3lmw7oMmyGbeV6tQj86njcTijkkGuvdZA= cloud.google.com/go/container v1.35.0 h1:y5gmgrMMhTrLnQQdMCw0t/Yis9Ps7jvAG4JYcRWxR8g= cloud.google.com/go/container v1.35.0/go.mod h1:02fCocALhTHLw4zwqrRaFrztjoQd53yZWFq0nvr+hQo= +cloud.google.com/go/container v1.37.3 h1:FCKTPz9OtId4LzB7dXzp+bDP4G0vlQOdUSYn2MddF38= +cloud.google.com/go/container v1.37.3/go.mod h1:XKwtVfsTBsnZ9Ve1Pw2wkjk5kSjJqsHl3oBrbbi4w/M= cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= cloud.google.com/go/containeranalysis v0.11.4/go.mod h1:cVZT7rXYBS9NG1rhQbWL9pWbXCKHWJPYraE8/FTSYPE= cloud.google.com/go/containeranalysis v0.11.5 h1:yzohQ0HDoZq2TtCJkbUBsJs9RIR5WbKZlHrD7ilp2yg= cloud.google.com/go/containeranalysis v0.11.5/go.mod h1:DlgF5MaxAmGdq6F9wCUEp/JNx9lsr6QaQONFd4mxG8A= +cloud.google.com/go/containeranalysis v0.12.0 h1:c5/40le3c4Kxf8cU4yFDPoA2LTjqCPu3sonzRmipicM= +cloud.google.com/go/containeranalysis v0.12.0/go.mod h1:a3Yo1yk1Dv4nVmlxcJWOJDqsnzy5I1HmETg2UGlERhs= cloud.google.com/go/datacatalog v1.19.2/go.mod h1:2YbODwmhpLM4lOFe3PuEhHK9EyTzQJ5AXgIy7EDKTEE= cloud.google.com/go/datacatalog v1.19.3/go.mod h1:ra8V3UAsciBpJKQ+z9Whkxzxv7jmQg1hfODr3N3YPJ4= cloud.google.com/go/datacatalog v1.20.0 h1:BGDsEjqpAo0Ka+b9yDLXnE5k+jU3lXGMh//NsEeDMIg= cloud.google.com/go/datacatalog v1.20.0/go.mod h1:fSHaKjIroFpmRrYlwz9XBB2gJBpXufpnxyAKaT4w6L0= +cloud.google.com/go/datacatalog v1.20.4 h1:nUR7JBPZezl1+o+86N01VxAQQHY+It/D8tmNipcdVjI= +cloud.google.com/go/datacatalog v1.20.4/go.mod h1:71PDwywIYkNgSXdUU3H0mkTp3j15aahfYJ1CY3DogtU= cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= cloud.google.com/go/dataflow v0.9.5/go.mod h1:udl6oi8pfUHnL0z6UN9Lf9chGqzDMVqcYTcZ1aPnCZQ= cloud.google.com/go/dataflow v0.9.6 h1:GuZJgkOL64cYySwYEYqQkggdxwoZTk8cvekQW0t3KRM= cloud.google.com/go/dataflow v0.9.6/go.mod h1:nO0hYepRlPlulvAHCJ+YvRPLnL/bwUswIbhgemAt6eM= +cloud.google.com/go/dataflow v0.9.10 h1:L/mgrz4kqADWc2TZ5gFkU4qYGEqKgEzbUGBGcmXXNxM= +cloud.google.com/go/dataflow v0.9.10/go.mod h1:lkhCwyVAOR4cKx+TzaxFbfh0tJcBVqxyIN97TDc/OJ8= cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= cloud.google.com/go/dataform v0.9.2/go.mod h1:S8cQUwPNWXo7m/g3DhWHsLBoufRNn9EgFrMgne2j7cI= cloud.google.com/go/dataform v0.9.3 h1:0EzWf+c2R5V/ujZBb22H/EL5wpzD/bDFYPA2f3czB1g= cloud.google.com/go/dataform v0.9.3/go.mod h1:c/TBr0tqx5UgBTmg3+5DZvLxX+Uy5hzckYZIngkuU/w= +cloud.google.com/go/dataform v0.9.7 h1:s9NUGaQpiPxdWKdH4/3byhwJRh17NpqYAOvRgejZ7iM= +cloud.google.com/go/dataform v0.9.7/go.mod h1:zJp0zOSCKHgt2IxTQ90vNeDfT7mdqFA8ZzrYIsxTEM0= cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= cloud.google.com/go/datafusion v1.7.5/go.mod h1:bYH53Oa5UiqahfbNK9YuYKteeD4RbQSNMx7JF7peGHc= cloud.google.com/go/datafusion v1.7.6 h1:zSmMj/qZ0Yk+q/v5Wg40FTJ0WYPCtanYYekRt7cSKJ0= cloud.google.com/go/datafusion v1.7.6/go.mod h1:cDJfsWRYcaktcM1xfwkBOIccOaWJ5mG3zm95EaLtINA= +cloud.google.com/go/datafusion v1.7.10 h1:ncRuWj0PLlrNsbehmiBzjxymC+IBJ2wfWfXoXheQ48M= +cloud.google.com/go/datafusion v1.7.10/go.mod h1:MYRJjIUs2kVTbYySSp4+foNyq2MfgKTLMcsquEjbapM= cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= cloud.google.com/go/datalabeling v0.8.5/go.mod h1:IABB2lxQnkdUbMnQaOl2prCOfms20mcPxDBm36lps+s= cloud.google.com/go/datalabeling v0.8.6 h1:2zz44bPbDMHsPanQ89SybqhHDQBH1EZk8icGotyrvSU= cloud.google.com/go/datalabeling v0.8.6/go.mod h1:8gVcLufcZg0hzRnyMkf3UvcUen2Edo6abP6Rsz2jS6Q= +cloud.google.com/go/datalabeling v0.8.10 h1:x+v4K1wGeeVmEZK9rI20YBA9/ojghSVT8v2RRpbDpCE= +cloud.google.com/go/datalabeling v0.8.10/go.mod h1:8+IBTdU0te7w9b7BoZzUl05XgPvgqOrxQMzoP47skGM= cloud.google.com/go/dataplex v1.14.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= cloud.google.com/go/dataplex v1.14.2/go.mod h1:0oGOSFlEKef1cQeAHXy4GZPB/Ife0fz/PxBf+ZymA2U= cloud.google.com/go/dataplex v1.15.0 h1:Ob8NPT1UcB4kDaDx7/UdsRfZ8xUvUggZshXUlGWDahk= cloud.google.com/go/dataplex v1.15.0/go.mod h1:R5rUQ3X18d6wcMraLOUIOTEULasL/1nvSrNF7C98eyg= +cloud.google.com/go/dataplex v1.18.1 h1:LAN6ctgnKrPf/qScsJuF7N4xhpKyfYsxoJJF+L+Cguo= +cloud.google.com/go/dataplex v1.18.1/go.mod h1:G5+muC3D5rLSHG9uKACs5WfRtthIVwyUJSIXi2Wzp30= cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= cloud.google.com/go/dataproc/v2 v2.4.0/go.mod h1:3B1Ht2aRB8VZIteGxQS/iNSJGzt9+CA0WGnDVMEm7Z4= cloud.google.com/go/dataproc/v2 v2.4.1 h1:+cM8p/R6FdTuQYlriJOSUCvAZfMDgBKf0/ph9bMIjaY= cloud.google.com/go/dataproc/v2 v2.4.1/go.mod h1:HrymsaRUG1FjK2G1sBRQrHMhgj5+ENUIAwRbL130D8o= +cloud.google.com/go/dataproc/v2 v2.5.2 h1:vIgdCpfHMxYBJJY/526lzfRSkDR21n3z+ndwcscwDaw= +cloud.google.com/go/dataproc/v2 v2.5.2/go.mod h1:KCr6aYKulU4Am8utvRoXKe1L2hPkfX9Ox0m/rvenUjU= cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= cloud.google.com/go/dataqna v0.8.5/go.mod h1:vgihg1mz6n7pb5q2YJF7KlXve6tCglInd6XO0JGOlWM= cloud.google.com/go/dataqna v0.8.6 h1:FI/1q7VnANchQR9ug+nzujfiusLMfC3BHT7/fHi+BVU= cloud.google.com/go/dataqna v0.8.6/go.mod h1:3u2zPv3VwMUNW06oTRcSWS3+dDuxF/0w5hEWUCsLepw= +cloud.google.com/go/dataqna v0.8.10 h1:VHv+LbMs8Otx4u7gHAgPbmRPdq13xvFci2U4nm3vYtc= +cloud.google.com/go/dataqna v0.8.10/go.mod h1:e6Ula5UmCrbT7jOI6zZDwHHtAsDdKHKDrHSkj0pDlAQ= 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/datastore v1.15.0 h1:0P9WcsQeTWjuD1H14JIY7XQscIPQ4Laje8ti96IC5vg= cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= +cloud.google.com/go/datastore v1.17.1 h1:6Me8ugrAOAxssGhSo8im0YSuy4YvYk4mbGvCadAH5aE= +cloud.google.com/go/datastore v1.17.1/go.mod h1:mtzZ2HcVtz90OVrEXXGDc2pO4NM1kiBQy8YV4qGe0ZM= cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= cloud.google.com/go/datastream v1.10.4/go.mod h1:7kRxPdxZxhPg3MFeCSulmAJnil8NJGGvSNdn4p1sRZo= cloud.google.com/go/datastream v1.10.5 h1:nHdOKbFmKJ4tPjGtNNIO0//G7QAht6eHTUnREWPn2yI= cloud.google.com/go/datastream v1.10.5/go.mod h1:BmIPX19K+Pjho3+sR7Jtddmf+vluzLgaG7465xje/wg= +cloud.google.com/go/datastream v1.10.9 h1:muZbdJAgoStSuDHQ3q/V3esGx9AlRRoxO9/2T2x1mZ8= +cloud.google.com/go/datastream v1.10.9/go.mod h1:LvUG7tBqMn9zDkgj5HlefDzaOth8ohVITF8qTtqAINw= cloud.google.com/go/deploy v1.17.0/go.mod h1:XBr42U5jIr64t92gcpOXxNrqL2PStQCXHuKK5GRUuYo= cloud.google.com/go/deploy v1.17.1/go.mod h1:SXQyfsXrk0fBmgBHRzBjQbZhMfKZ3hMQBw5ym7MN/50= cloud.google.com/go/deploy v1.17.2 h1:UxcxzjwxGPkT7RBdMmoc5a7QxHQVdpZllD6el2VC3JA= cloud.google.com/go/deploy v1.17.2/go.mod h1:kKSAl1mab0Y27XlWGBrKNA5WOOrKo24KYzx2JRAfBL4= +cloud.google.com/go/deploy v1.19.3 h1:/qHG3eoUh9VaU7EeEHzU7uXLg6LeGn4KK+/a1g+qu1k= +cloud.google.com/go/deploy v1.19.3/go.mod h1:Ut73ILRKoxtcIWeRJyYwuhBAckuSE1KJXlSX38hf4B0= cloud.google.com/go/dialogflow v1.48.1/go.mod h1:C1sjs2/g9cEwjCltkKeYp3FFpz8BOzNondEaAlCpt+A= cloud.google.com/go/dialogflow v1.49.0/go.mod h1:dhVrXKETtdPlpPhE7+2/k4Z8FRNUp6kMV3EW3oz/fe0= cloud.google.com/go/dialogflow v1.52.0 h1:B8Y5j4/QsDirX136OoPm62kG3y5gd8rzBpHSR/FW9vI= cloud.google.com/go/dialogflow v1.52.0/go.mod h1:mMh76X5D0Tg48PjGXaCveHpeKDnKz+dpwGln3WEN7DQ= +cloud.google.com/go/dialogflow v1.54.3 h1:3Ucl5yrhOlrFqcTLX3MmZLnvU8ZFhrSi8l5321bEXfk= +cloud.google.com/go/dialogflow v1.54.3/go.mod h1:Sm5uznNq8Vrj7R+Uc84qz41gW2AXRZeWgvJ9owKZw9g= cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= cloud.google.com/go/dlp v1.11.2/go.mod h1:9Czi+8Y/FegpWzgSfkRlyz+jwW6Te9Rv26P3UfU/h/w= cloud.google.com/go/dlp v1.12.1 h1:dTsEN6r1BoplUACz7teOmE6lRG1swREiwXkfkY7bi6c= cloud.google.com/go/dlp v1.12.1/go.mod h1:RBUw3yjNSVcFoU8L4ECuxAx0lo1MrusfA4y46bp9vLw= +cloud.google.com/go/dlp v1.14.3 h1:/39qK9V7cE7Q7bDz7p/YqNuTUvDtPuaPN7WcJiutnfY= +cloud.google.com/go/dlp v1.14.3/go.mod h1:iyhOlJCSAGNP2z5YPoBjV+M9uhyiUuxjZDYqbvO3WMM= cloud.google.com/go/documentai v1.23.7/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= cloud.google.com/go/documentai v1.25.0/go.mod h1:ftLnzw5VcXkLItp6pw1mFic91tMRyfv6hHEY5br4KzY= cloud.google.com/go/documentai v1.26.1 h1:UdDy7nDTwr+mN1KiJqsj5AabauoW9SkgH9eY8BuFXJE= cloud.google.com/go/documentai v1.26.1/go.mod h1:ljZB6yyT/aKZc9tCd0WGtBxIMWu8ZCEO6UiNwirqLU0= +cloud.google.com/go/documentai v1.30.4 h1:jvvhSG9ovVG3BV6SuOomZZ8/8eaX3MNa2ERvx4NuHU4= +cloud.google.com/go/documentai v1.30.4/go.mod h1:1UqovvxIySy/sQwZcU1O+tm4qA/jnzAwzZLRIhFmhSk= cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= cloud.google.com/go/domains v0.9.5/go.mod h1:dBzlxgepazdFhvG7u23XMhmMKBjrkoUNaw0A8AQB55Y= cloud.google.com/go/domains v0.9.6 h1:NHqZk4XzHFlmXM3LMGwDVET4NKr60W2jaNCRGYod5Ic= cloud.google.com/go/domains v0.9.6/go.mod h1:hYaeMxsDZED5wuUwYHXf89+aXHJvh41+os8skywd8D4= +cloud.google.com/go/domains v0.9.10 h1:AxcpNzti0Sjg77fylI3oTj9z2obLfxDObNmYeCKTEMo= +cloud.google.com/go/domains v0.9.10/go.mod h1:8yArcduQ2fDThBQlnDSwxrkGRgduW8KK2Y/nlL1IU2o= cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= cloud.google.com/go/edgecontainer v1.1.5/go.mod h1:rgcjrba3DEDEQAidT4yuzaKWTbkTI5zAMu3yy6ZWS0M= cloud.google.com/go/edgecontainer v1.2.0 h1:a++vBi1J00NP1ifVP5mV/3j1/EJKWPj0h6NfUPLfuCQ= cloud.google.com/go/edgecontainer v1.2.0/go.mod h1:bI2foS+2fRbzBmkIQtrxNzeVv3zZZy780PFF96CiVxA= +cloud.google.com/go/edgecontainer v1.2.4 h1:fWo2E5KKpb+ts5Tu+ulcroMoQ0NlFipjntpxtOhtRoQ= +cloud.google.com/go/edgecontainer v1.2.4/go.mod h1:QiHvO/Xc/8388oPuYZfHn9BpKx3dz1jWSi8Oex5MX6w= cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/errorreporting v0.3.1 h1:E/gLk+rL7u5JZB9oq72iL1bnhVlLrnfslrgcptjJEUE= +cloud.google.com/go/errorreporting v0.3.1/go.mod h1:6xVQXU1UuntfAf+bVkFk6nld41+CPyF2NSPCyXE3Ztk= cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= cloud.google.com/go/essentialcontacts v1.6.6/go.mod h1:XbqHJGaiH0v2UvtuucfOzFXN+rpL/aU5BCZLn4DYl1Q= cloud.google.com/go/essentialcontacts v1.6.7 h1:FDdJGJEXK4RxvT6gdRBqGaCQVpi96RRB7MTyRHUcb20= cloud.google.com/go/essentialcontacts v1.6.7/go.mod h1:5577lqt2pvnx9n4zP+eJSSWL02KLmQvjJPYknHdAbZg= +cloud.google.com/go/essentialcontacts v1.6.11 h1:JN+LdSQGrKhOFu0GudcOmL7PZrKPE+/7mp6J1m8QyEk= +cloud.google.com/go/essentialcontacts v1.6.11/go.mod h1:qpdkYSdPY4C69zprW20nKu+5DsED/Gwf1KtFHUSzrC0= cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= cloud.google.com/go/eventarc v1.13.4/go.mod h1:zV5sFVoAa9orc/52Q+OuYUG9xL2IIZTbbuTHC6JSY8s= cloud.google.com/go/eventarc v1.13.5 h1:JMUiLYzxkxr7BqnCPkyJ6Ycgrs6YQlZT44H0rHg7jQY= cloud.google.com/go/eventarc v1.13.5/go.mod h1:wrZcXnSOZk/AVbBYT5GpOa5QPuQFzSxiXKsKnynoPes= +cloud.google.com/go/eventarc v1.13.9 h1:FdBz6bNU39mGJZpPVJvsrkl1mZ9E4YWsNLh1Jv8sRPM= +cloud.google.com/go/eventarc v1.13.9/go.mod h1:Jn2EBCgvGXeqndphk0nUVgJm4ZJOhxx4yYcSasvNrh4= cloud.google.com/go/filestore v1.8.0/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= cloud.google.com/go/filestore v1.8.1/go.mod h1:MbN9KcaM47DRTIuLfQhJEsjaocVebNtNQhSLhKCF5GM= cloud.google.com/go/filestore v1.8.2 h1:BpaB7bxICPUTntAV+yVUK9bxAUOv7uHRSEibSKMBJVA= cloud.google.com/go/filestore v1.8.2/go.mod h1:QU7EKJP/xmCtzIhxNVLfv/k1QBKHXTbbj9512kwUT1I= +cloud.google.com/go/filestore v1.8.6 h1:rFmq1TqVMXiLoBa2BTvbn8TM61YGpyQGfgY2RgMM/Xk= +cloud.google.com/go/filestore v1.8.6/go.mod h1:ztH4U+aeH5vWtiyEd4+Dc56L2yRk7EIm0+PAR+9m5Jc= cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= cloud.google.com/go/firestore v1.15.0 h1:/k8ppuWOtNuDHt2tsRV42yI21uaGnKDEQnRFeBpbFF8= cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= @@ -244,135 +354,201 @@ cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip cloud.google.com/go/functions v1.16.0/go.mod h1:nbNpfAG7SG7Duw/o1iZ6ohvL7mc6MapWQVpqtM29n8k= cloud.google.com/go/functions v1.16.1 h1:0kcko/2AKwm4USnWcGs/W/k++PAYPA3dYaQw1y5Xg3M= cloud.google.com/go/functions v1.16.1/go.mod h1:WcQy3bwDw6KblOuj+khLyQbsi8aupUrZUrPEKTtVaSQ= +cloud.google.com/go/functions v1.16.5 h1:BXxmOz/z5yr+Nf+yKerctpDcv22LOjmyhwcIp/f6qLI= +cloud.google.com/go/functions v1.16.5/go.mod h1:ds5f+dyMN4kCkTWTLpQl8wMi0sLRuJWrQaWr5eFlUnQ= cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= cloud.google.com/go/gkebackup v1.3.5/go.mod h1:KJ77KkNN7Wm1LdMopOelV6OodM01pMuK2/5Zt1t4Tvc= cloud.google.com/go/gkebackup v1.4.0 h1:SATJwsF8PjErP7GwHE+xK8gJ7f7hULuqtazV19ylPgg= cloud.google.com/go/gkebackup v1.4.0/go.mod h1:FpsE7Qcio7maQ5bPMvacN+qoXTPWrxHe4fm44RWa67U= +cloud.google.com/go/gkebackup v1.5.3 h1:qkVk7HCMVJde8noFBOfMUIVmFvJRJ31ZRUqpL6Lcjug= +cloud.google.com/go/gkebackup v1.5.3/go.mod h1:fzWJXO5v0AzcC3J5KgCTpEcB0uvcC+e0YqIRVYQR4sE= cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= cloud.google.com/go/gkeconnect v0.8.5/go.mod h1:LC/rS7+CuJ5fgIbXv8tCD/mdfnlAadTaUufgOkmijuk= cloud.google.com/go/gkeconnect v0.8.6 h1:7X9P6lGkOF/nJRYZBQBG2XPhunqWbNMacy9AXN7qUcU= cloud.google.com/go/gkeconnect v0.8.6/go.mod h1:4/o9sXLLsMl2Rw2AyXjtVET0RMk4phdFJuBX45jRRHc= +cloud.google.com/go/gkeconnect v0.8.10 h1:k3vfHzDO1pQ7vZm/S++m3DQ3xNozzurvylkgAN5MhX8= +cloud.google.com/go/gkeconnect v0.8.10/go.mod h1:2r9mjewv4bAEg0VXNqc7uJA2vWuDHy/44IzstIikFH8= cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= cloud.google.com/go/gkehub v0.14.5/go.mod h1:6bzqxM+a+vEH/h8W8ec4OJl4r36laxTs3A/fMNHJ0wA= cloud.google.com/go/gkehub v0.14.6 h1:kKreFf+097KfW+Tz/SqZKeXs/eFOjs1NDrsVjRPI18o= cloud.google.com/go/gkehub v0.14.6/go.mod h1:SD3/ihO+7/vStQEwYA1S/J9mouohy7BfhM/gGjAmJl0= +cloud.google.com/go/gkehub v0.14.10 h1:6ZO2BZIzV+lp+pfuqUSaFXyDDwhirpPTN6vZMP+3dwE= +cloud.google.com/go/gkehub v0.14.10/go.mod h1:+bqT9oyCDQG2Dc2pUJKYVNJGvrKgIfm7c+hk9IlDzJU= cloud.google.com/go/gkemulticloud v1.1.0/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= cloud.google.com/go/gkemulticloud v1.1.1/go.mod h1:C+a4vcHlWeEIf45IB5FFR5XGjTeYhF83+AYIpTy4i2Q= cloud.google.com/go/gkemulticloud v1.1.2 h1:CFBoDcQi9zLOkzM6xqmRzljZhF4A6A47QaQ0WtNd+DA= cloud.google.com/go/gkemulticloud v1.1.2/go.mod h1:QhdIrilhqieDJJzOyfMPBqcfDVntENYGwqSeX2ZuIDE= +cloud.google.com/go/gkemulticloud v1.2.3 h1:IYXXJjqsv7P9yH5VpHo68AyxkceQSX/hm60aku0qovA= +cloud.google.com/go/gkemulticloud v1.2.3/go.mod h1:CR97Vcd9XdDLZQtMPfXtbFWRxfIFuO9K6q7oF6+moco= cloud.google.com/go/grafeas v0.3.4 h1:D4x32R/cHX3MTofKwirz015uEdVk4uAxvZkZCZkOrF4= cloud.google.com/go/grafeas v0.3.4/go.mod h1:A5m316hcG+AulafjAbPKXBO/+I5itU4LOdKO2R/uDIc= cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= cloud.google.com/go/gsuiteaddons v1.6.5/go.mod h1:Lo4P2IvO8uZ9W+RaC6s1JVxo42vgy+TX5a6hfBZ0ubs= cloud.google.com/go/gsuiteaddons v1.6.6 h1:q3x2NE0je/tSVL66MAht5YVbGGHjTV9BxFD2lyDQ0dU= cloud.google.com/go/gsuiteaddons v1.6.6/go.mod h1:JmAp1/ojGgHtSe5d6ZPkOwJbYP7An7DRBkhSJ1aer8I= +cloud.google.com/go/gsuiteaddons v1.6.10 h1:dlPIzgucZt+HhtIzcGRbQ1H5JDsqPx7KAj/tfJu2gFc= +cloud.google.com/go/gsuiteaddons v1.6.10/go.mod h1:daIpNyqugkch134oS116DXGEVrLUt0kSdqvgi0U1DD8= cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= cloud.google.com/go/iam v1.1.7 h1:z4VHOhwKLF/+UYXAJDFwGtNF0b6gjsW1Pk9Ml0U/IoM= cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA= +cloud.google.com/go/iam v1.1.11 h1:0mQ8UKSfdHLut6pH9FM3bI55KWR46ketn0PuXleDyxw= +cloud.google.com/go/iam v1.1.11/go.mod h1:biXoiLWYIKntto2joP+62sd9uW5EpkZmKIvfNcTWlnQ= cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= cloud.google.com/go/iap v1.9.4/go.mod h1:vO4mSq0xNf/Pu6E5paORLASBwEmphXEjgCFg7aeNu1w= cloud.google.com/go/iap v1.9.5 h1:FrLAtgXzWPwe8rNp7AD+2Lgg4LqyhgXvEdiGK+jtd9g= cloud.google.com/go/iap v1.9.5/go.mod h1:4zaAOm66mId/50vqRF7ZPDeCjvHQJSVAXD/mkUWo4Zk= +cloud.google.com/go/iap v1.9.9 h1:X6VrhFEHbs38ILfzqyBysa5kARbGBt91mRi0t0zC2L4= +cloud.google.com/go/iap v1.9.9/go.mod h1:7I7ftlLPPU8du0E8jW3koaYkNcX1NLqSDU9jQFRwF04= cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= cloud.google.com/go/ids v1.4.5/go.mod h1:p0ZnyzjMWxww6d2DvMGnFwCsSxDJM666Iir1bK1UuBo= cloud.google.com/go/ids v1.4.6 h1:tNc3NpIp2LUmFJxP2CBlzYw0FTnd68r73mIzg8UlM3Q= cloud.google.com/go/ids v1.4.6/go.mod h1:EJ1554UwEEs8HCHVnXPGn21WouM0uFvoq8UvEEr2ng4= +cloud.google.com/go/ids v1.4.10 h1:nHui/LGOOXGd8ReRkDm+arZxzIbPy7oWV+2YePBrfPI= +cloud.google.com/go/ids v1.4.10/go.mod h1:438ouAjmw7c4/3Q+KbQxuJTU3jek5xo6cVH7EduiKXs= cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= cloud.google.com/go/iot v1.7.5/go.mod h1:nq3/sqTz3HGaWJi1xNiX7F41ThOzpud67vwk0YsSsqs= cloud.google.com/go/iot v1.7.6 h1:nRV/e1e3lEjsVoD5mW99JERwL8MKohyQyY63+lfBMA4= cloud.google.com/go/iot v1.7.6/go.mod h1:IMhFVfRGn5OqrDJ9Obu0rC5VIr2+SvSyUxQPHkXYuW0= +cloud.google.com/go/iot v1.7.10 h1:+OELjDfKA/hiPM/QfxPrp92aNkdbFxeRoNX12GeqXgk= +cloud.google.com/go/iot v1.7.10/go.mod h1:rVBZ3srfCH4yPr2CPkxu3tB/c0avx0KV9K68zVNAh4Q= cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= cloud.google.com/go/kms v1.15.7/go.mod h1:ub54lbsa6tDkUwnu4W7Yt1aAIFLnspgh0kPGToDukeI= cloud.google.com/go/kms v1.15.8 h1:szIeDCowID8th2i8XE4uRev5PMxQFqW+JjwYxL9h6xs= cloud.google.com/go/kms v1.15.8/go.mod h1:WoUHcDjD9pluCg7pNds131awnH429QGvRM3N/4MyoVs= +cloud.google.com/go/kms v1.18.3 h1:8+Z2S4bQDSCdghB5ZA5dVDDJTLmnkRlowtFiXqMFd74= +cloud.google.com/go/kms v1.18.3/go.mod h1:y/Lcf6fyhbdn7MrG1VaDqXxM8rhOBc5rWcWAhcvZjQU= cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= cloud.google.com/go/language v1.12.3/go.mod h1:evFX9wECX6mksEva8RbRnr/4wi/vKGYnAJrTRXU8+f8= cloud.google.com/go/language v1.12.4 h1:srkreCxnVa5+a5PXUri/K+VWxG50wGvz5+PEYjgaENQ= cloud.google.com/go/language v1.12.4/go.mod h1:Us0INRv/CEbrk2s8IBZcHaZjSBmK+bRlX4FUYZrD4I8= +cloud.google.com/go/language v1.12.8 h1:aZbr++ood1dOKk6vHkENcoi4cYphoYa4rFeZJCcXKKU= +cloud.google.com/go/language v1.12.8/go.mod h1:3706JYCNJKvNXZZzcf7PGUMR2IuEYXQ0o7KqyOLqw+s= cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= cloud.google.com/go/lifesciences v0.9.5/go.mod h1:OdBm0n7C0Osh5yZB7j9BXyrMnTRGBJIZonUMxo5CzPw= cloud.google.com/go/lifesciences v0.9.6 h1:8w3edjRiSN6GCxT0uJoXr6Zo2XNYD+6TxPZa7uIIOaU= cloud.google.com/go/lifesciences v0.9.6/go.mod h1:BkNWYU0tPZbwpy76RE4biZajWFe6NvWwEAaIlNiKXdE= +cloud.google.com/go/lifesciences v0.9.10 h1:Ma80DC2BvQGesN4i7weQHSZWredk9J2biqHjUGDxbtQ= +cloud.google.com/go/lifesciences v0.9.10/go.mod h1:zm5Y46HXN/ZoVdQ8HhXJvXG+m4De1HoJye62r/DFXoU= cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw= cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= +cloud.google.com/go/logging v1.10.0 h1:f+ZXMqyrSJ5vZ5pE/zr0xC8y/M9BLNzQeLBwfeZ+wY4= +cloud.google.com/go/logging v1.10.0/go.mod h1:EHOwcxlltJrYGqMGfghSet736KR3hX1MAj614mrMk9I= cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= cloud.google.com/go/longrunning v0.5.6 h1:xAe8+0YaWoCKr9t1+aWe+OeQgN/iJK1fEgZSXmjuEaE= cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA= +cloud.google.com/go/longrunning v0.5.10 h1:eB/BniENNRKhjz/xgiillrdcH3G74TGSl3BXinGlI7E= +cloud.google.com/go/longrunning v0.5.10/go.mod h1:tljz5guTr5oc/qhlUjBlk7UAIFMOGuPNxkNDZXlLics= cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= cloud.google.com/go/managedidentities v1.6.5/go.mod h1:fkFI2PwwyRQbjLxlm5bQ8SjtObFMW3ChBGNqaMcgZjI= cloud.google.com/go/managedidentities v1.6.6 h1:7+hGPQSojhnYNZCg3fG2mQIF7XMfvNpCpi2Zg5/Qx1g= cloud.google.com/go/managedidentities v1.6.6/go.mod h1:0+0qF22qx8o6eeaZ/Ku7HmHv9soBHD1piyNHgAP+c20= +cloud.google.com/go/managedidentities v1.6.10 h1:Nh90GFpOWpCu4nAtbGnaGTVP4IK/Kkag9XBR+P1Y24U= +cloud.google.com/go/managedidentities v1.6.10/go.mod h1:Dg+K/AgKJtOyDjrrMGh4wFrEmtlUUcoEtDdC/WsZxw4= cloud.google.com/go/maps v1.6.3/go.mod h1:VGAn809ADswi1ASofL5lveOHPnE6Rk/SFTTBx1yuOLw= cloud.google.com/go/maps v1.6.4/go.mod h1:rhjqRy8NWmDJ53saCfsXQ0LKwBHfi6OSh5wkq6BaMhI= cloud.google.com/go/maps v1.7.1 h1:vcqmqk0wt1NRzQc84Qo6z8HYyol/znqbG7tAS5Qm91g= cloud.google.com/go/maps v1.7.1/go.mod h1:fri+i4pO41ZUZ/Nrz3U9hNEtXsv5SROMFP2AwAHFSX8= +cloud.google.com/go/maps v1.11.4 h1:1POJPRZmg8cWU5CuoMBWSpAd/CJHw4KQJbajFcDsSA4= +cloud.google.com/go/maps v1.11.4/go.mod h1:RQ2Vv/f2HKGlvCtj8xyJp8gJbVqh/CWy0xR2Nfe8c0s= cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= cloud.google.com/go/mediatranslation v0.8.5/go.mod h1:y7kTHYIPCIfgyLbKncgqouXJtLsU+26hZhHEEy80fSs= cloud.google.com/go/mediatranslation v0.8.6 h1:EVW0wCQ7asoMjw8fm8oUe6pQWBaVQth/iquk7ysidy0= cloud.google.com/go/mediatranslation v0.8.6/go.mod h1:zI2ZvRRtrGimH572cwYtmq8t1elKbUGVVw4MAXIC4UQ= +cloud.google.com/go/mediatranslation v0.8.10 h1:Yz5x10q1cFWibo/Kys+Np+slJRFpWBgBCES32PvLxC8= +cloud.google.com/go/mediatranslation v0.8.10/go.mod h1:sCTNVpO4Yh9LbkjelsGakWBi93u9THKfKQLSGSLS7rA= cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= cloud.google.com/go/memcache v1.10.5/go.mod h1:/FcblbNd0FdMsx4natdj+2GWzTq+cjZvMa1I+9QsuMA= cloud.google.com/go/memcache v1.10.6 h1:rqDPCIUfVBvv7ojOGx5PRkPgWeWSKpOht2w6plaxklY= cloud.google.com/go/memcache v1.10.6/go.mod h1:4elGf6MwGszZCM0Yopp15qmBoo+Y8M7wg7QRpSM8pzA= +cloud.google.com/go/memcache v1.10.10 h1:S3llE+jJ+9XRuCu5NnlLY9FEMJh9i7htqpqvPkPYnb4= +cloud.google.com/go/memcache v1.10.10/go.mod h1:UXnN6UYNoNM6RTExZ7/iW9c2mAaeJjy7R7uaplNRmIc= cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= cloud.google.com/go/metastore v1.13.4/go.mod h1:FMv9bvPInEfX9Ac1cVcRXp8EBBQnBcqH6gz3KvJ9BAE= cloud.google.com/go/metastore v1.13.5 h1:K7gyYoqPvQgCc82tiB0CQkXOpg8AZxJtRGMVdN5B83U= cloud.google.com/go/metastore v1.13.5/go.mod h1:dmsJzIdQcJrpmRGhEaii3EhVq1JuhI0bxSBoy7A8hcQ= +cloud.google.com/go/metastore v1.13.9 h1:DMSqwM9U7jeqbFlzaDx6Pv5yUHnwCMRKeTu0t59AG0U= +cloud.google.com/go/metastore v1.13.9/go.mod h1:KgRseDRcS7Um/mNLbRHJjXZQrK8MqlGSyEga7T/Vs1A= cloud.google.com/go/monitoring v1.17.0/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= cloud.google.com/go/monitoring v1.18.0/go.mod h1:c92vVBCeq/OB4Ioyo+NbN2U7tlg5ZH41PZcdvfc+Lcg= cloud.google.com/go/monitoring v1.18.1 h1:0yvFXK+xQd95VKo6thndjwnJMno7c7Xw1CwMByg0B+8= cloud.google.com/go/monitoring v1.18.1/go.mod h1:52hTzJ5XOUMRm7jYi7928aEdVxBEmGwA0EjNJXIBvt8= +cloud.google.com/go/monitoring v1.20.2 h1:B/L+xrw9PYO7ywh37sgnjI/6dzEE+yQTAwfytDcpPto= +cloud.google.com/go/monitoring v1.20.2/go.mod h1:36rpg/7fdQ7NX5pG5x1FA7cXTVXusOp6Zg9r9e1+oek= cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= cloud.google.com/go/networkconnectivity v1.14.4/go.mod h1:PU12q++/IMnDJAB+3r+tJtuCXCfwfN+C6Niyj6ji1Po= cloud.google.com/go/networkconnectivity v1.14.5 h1:t67aEKwmO+SXvQC5ncOjm3vTwnsbO/mTzlCWdK0nwqs= cloud.google.com/go/networkconnectivity v1.14.5/go.mod h1:Wy28mxRApI1uVwA9iHaYYxGNe74cVnSP311bCUJEpBc= +cloud.google.com/go/networkconnectivity v1.14.9 h1:NvPWdRpAK6XZ5jc7V3kGydIULYWDczwNio9aUcmk7ZU= +cloud.google.com/go/networkconnectivity v1.14.9/go.mod h1:J1JgZDeSi/elFfOSLkMoY9REuGhoNXqOFuI0cfyS6WY= cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= cloud.google.com/go/networkmanagement v1.9.4/go.mod h1:daWJAl0KTFytFL7ar33I6R/oNBH8eEOX/rBNHrC/8TA= cloud.google.com/go/networkmanagement v1.13.0 h1:uSoVcd78+uNSW34Q+BNumUvTxAtVaKHc8O9WUz091gg= cloud.google.com/go/networkmanagement v1.13.0/go.mod h1:LcwkOGJmWtjM4yZGKfN1kSoEj/OLGFpZEQefWofHFKI= +cloud.google.com/go/networkmanagement v1.13.5 h1:17H0HdK/J6hH7/gIfQ1aNUD/sS0+Bq52d6j1W5fH+Uk= +cloud.google.com/go/networkmanagement v1.13.5/go.mod h1:znPuYKLqWJLzLI9feH6ex+Mq+6VlexfiUR8F6sFOtGo= cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= cloud.google.com/go/networksecurity v0.9.5/go.mod h1:KNkjH/RsylSGyyZ8wXpue8xpCEK+bTtvof8SBfIhMG8= cloud.google.com/go/networksecurity v0.9.6 h1:3ggPKshcFs1oRh5qI+Gq1s2CIU9BL99MKtYSBG4Z8s0= cloud.google.com/go/networksecurity v0.9.6/go.mod h1:SZB02ji/2uittsqoAXu9PBqGG9nF9PuxPgtezQfihSA= +cloud.google.com/go/networksecurity v0.9.10 h1:zFLHOAsYDo4Zv7uEuCDH2tOvQ5mmZ4Mu/anm6eXuU0s= +cloud.google.com/go/networksecurity v0.9.10/go.mod h1:pHy4lna09asqVhLwHVUXn92KGlM5oj1iSLFUwqqGZ2g= cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= cloud.google.com/go/notebooks v1.11.3/go.mod h1:0wQyI2dQC3AZyQqWnRsp+yA+kY4gC7ZIVP4Qg3AQcgo= cloud.google.com/go/notebooks v1.11.4 h1:A9jxIdxEccgL9iJLqvU4j5HT3/13YluoF2IbiV+hAN4= cloud.google.com/go/notebooks v1.11.4/go.mod h1:vtqPiCQMv++HOfQMzyE46f4auCB843rf20KEQW2zZKM= +cloud.google.com/go/notebooks v1.11.8 h1:26C5MjjwRWG9YTX2g7NwowZ8h6q2UE9+CTdgbiEgtSU= +cloud.google.com/go/notebooks v1.11.8/go.mod h1:jkRKhXWSXtzKtoPd9QeDzHrMPTYxf4l1rQP1/+6iR9g= cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= cloud.google.com/go/optimization v1.6.3/go.mod h1:8ve3svp3W6NFcAEFr4SfJxrldzhUl4VMUJmhrqVKtYA= cloud.google.com/go/optimization v1.6.4 h1:T/j8xyIkmHGjU6kxeUjK3UTqiXlbvpZQ2A+F5vnH21Y= cloud.google.com/go/optimization v1.6.4/go.mod h1:AfXfr2vlBXCF9RPh/Jpj46FhXR5JiWlyHA0rGI5Eu5M= +cloud.google.com/go/optimization v1.6.8 h1:Dh6TNmZ2T4qfh6fAKdBMIMk+fnbw8o1oYeCjvGhP6yg= +cloud.google.com/go/optimization v1.6.8/go.mod h1:d/uDAEVA0JYzWO3bCcuC6nnZKTjrSWhNkCTFUOV39g0= cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= cloud.google.com/go/orchestration v1.8.5/go.mod h1:C1J7HesE96Ba8/hZ71ISTV2UAat0bwN+pi85ky38Yq8= cloud.google.com/go/orchestration v1.9.1 h1:i5iSxsu1Cx1itTQEEY/YvsAo1OO8gosGGXhnOjBjgJA= cloud.google.com/go/orchestration v1.9.1/go.mod h1:yLPB2q/tdlEheIiZS7DAPKHeXdf4qNTlKAJCp/2EzXA= +cloud.google.com/go/orchestration v1.9.5 h1:gaCjAPEzkNr4nkw102PN3kGL7MThsJfSMavrtZ9EasI= +cloud.google.com/go/orchestration v1.9.5/go.mod h1:64czIksdxj1B3pu0JXHVqwSmCZEoJfmuJWssWRXrVsc= cloud.google.com/go/orgpolicy v1.12.0/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= cloud.google.com/go/orgpolicy v1.12.1/go.mod h1:aibX78RDl5pcK3jA8ysDQCFkVxLj3aOQqrbBaUL2V5I= cloud.google.com/go/orgpolicy v1.12.2 h1:x9GttuUZXXeKcJgHSGxYoPn2hOJhhuaN5YYJKfAfmLo= cloud.google.com/go/orgpolicy v1.12.2/go.mod h1:XycP+uWN8Fev47r1XibYjOgZod8SjXQtZGsO2I8KXX8= +cloud.google.com/go/orgpolicy v1.12.6 h1:H/B07NXiZNkn30jTBsSEKYk2AkTrBQx92AAcOUiWi0I= +cloud.google.com/go/orgpolicy v1.12.6/go.mod h1:yEkOiKK4w2tBzxLFvjO9kqoIRBXoF29vFeNqhGiifpE= cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= cloud.google.com/go/osconfig v1.12.5/go.mod h1:D9QFdxzfjgw3h/+ZaAb5NypM8bhOMqBzgmbhzWViiW8= cloud.google.com/go/osconfig v1.12.6 h1:wIOhgzklE0hHZsho02rRVXYBHSfsAwYZYIaxFaUBIjs= cloud.google.com/go/osconfig v1.12.6/go.mod h1:2dcXGl5qNbKo6Hjsnqbt5t6H2GX7UCAaPjF6BwDlFq8= +cloud.google.com/go/osconfig v1.13.1 h1:LD4Gbf+XJPfpQVXy1tSu2GajjiozteF0I0UzeVJNyhU= +cloud.google.com/go/osconfig v1.13.1/go.mod h1:3EcPSKozSco5jbdv2CZDojH0RVcRKvOdPrkrl+iHwuI= cloud.google.com/go/oslogin v1.13.0/go.mod h1:xPJqLwpTZ90LSE5IL1/svko+6c5avZLluiyylMb/sRA= cloud.google.com/go/oslogin v1.13.1/go.mod h1:vS8Sr/jR7QvPWpCjNqy6LYZr5Zs1e8ZGW/KPn9gmhws= cloud.google.com/go/oslogin v1.13.2 h1:v71OrrkKyqr5Mfnt345GqSOURzByv08qfrtvfhOVcnc= cloud.google.com/go/oslogin v1.13.2/go.mod h1:U8Euw2VeOEhJ/NE/0Q8xpInxi0J1oo2zdRNNVA/ba7U= +cloud.google.com/go/oslogin v1.13.6 h1:UaJ3VdjwBmziTENLpcqGYT9ZvyyD6qUocVTHqwSm8wM= +cloud.google.com/go/oslogin v1.13.6/go.mod h1:7g1whx5UORkP8K8qGFhlc6njxFA35SX1V4dDNpWWku0= cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= cloud.google.com/go/phishingprotection v0.8.5/go.mod h1:g1smd68F7mF1hgQPuYn3z8HDbNre8L6Z0b7XMYFmX7I= cloud.google.com/go/phishingprotection v0.8.6 h1:DcAre1psFwJM/FBA/MkDj0H6uxZhACE5IW/xF9ssHDQ= cloud.google.com/go/phishingprotection v0.8.6/go.mod h1:OSnaLSZryNaS80qVzArfi2/EoNWEeTSutTiWA/29xKU= +cloud.google.com/go/phishingprotection v0.8.10 h1:+TTEW5ESmHoXwu2qDvTbXvKi6H/KRtnIr0FC791Yqt0= +cloud.google.com/go/phishingprotection v0.8.10/go.mod h1:QJKnexvHGqL3u0qshpJBsjqCo+EEy3K/PrvogvcON8Q= cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= cloud.google.com/go/policytroubleshooter v1.10.3/go.mod h1:+ZqG3agHT7WPb4EBIRqUv4OyIwRTZvsVDHZ8GlZaoxk= cloud.google.com/go/policytroubleshooter v1.10.4 h1:wxBRfNoMy7rnoEeaTOHIEHCUEdUIQIwQGUqfBWH6cyQ= cloud.google.com/go/policytroubleshooter v1.10.4/go.mod h1:kSp7PKn80ttbKt8SSjQ0Z/pYYug/PFapxSx2Pr7xjf0= +cloud.google.com/go/policytroubleshooter v1.10.8 h1:r6dnUnkqj1VobRxT+/gLpQKrwd0EUdNqPTbNx5MY520= +cloud.google.com/go/policytroubleshooter v1.10.8/go.mod h1:d+6phd7MABmER7PCqlHSWGE35NFDMJfu7cLjTr820UE= cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= cloud.google.com/go/privatecatalog v0.9.5/go.mod h1:fVWeBOVe7uj2n3kWRGlUQqR/pOd450J9yZoOECcQqJk= cloud.google.com/go/privatecatalog v0.9.6 h1:bcIABOUmpnzQip83OVv+Ju/NxXjUTRLUSP+FVLFG6kk= cloud.google.com/go/privatecatalog v0.9.6/go.mod h1:BTwLqXfNzM6Tn4cTjzYj8avfw9+h/N68soYuTrYXL9I= +cloud.google.com/go/privatecatalog v0.9.10 h1:h9fyPZaOMSkUmjQRLaP9vjKBE1ZJ5TDID/6QAEZjt9E= +cloud.google.com/go/privatecatalog v0.9.10/go.mod h1:RxEAFdbH+8Ogu+1Lfp43KuAC6YIj46zWyoCX1dWB9nk= 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= @@ -381,73 +557,109 @@ cloud.google.com/go/pubsub v1.34.0/go.mod h1:alj4l4rBg+N3YTFDDC+/YyFTs6JAjam2QfY cloud.google.com/go/pubsub v1.36.1/go.mod h1:iYjCa9EzWOoBiTdd4ps7QoMtMln5NwaZQpK1hbRfBDE= cloud.google.com/go/pubsub v1.37.0 h1:0uEEfaB1VIJzabPpwpZf44zWAKAme3zwKKxHk7vJQxQ= cloud.google.com/go/pubsub v1.37.0/go.mod h1:YQOQr1uiUM092EXwKs56OPT650nwnawc+8/IjoUeGzQ= +cloud.google.com/go/pubsub v1.40.0 h1:0LdP+zj5XaPAGtWr2V6r88VXJlmtaB/+fde1q3TU8M0= +cloud.google.com/go/pubsub v1.40.0/go.mod h1:BVJI4sI2FyXp36KFKvFwcfDRDfR8MiLT8mMhmIhdAeA= cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/pubsublite v1.8.2 h1:jLQozsEVr+c6tOU13vDugtnaBSUy/PD5zK6mhm+uF1Y= +cloud.google.com/go/pubsublite v1.8.2/go.mod h1:4r8GSa9NznExjuLPEJlF1VjOPOpgf3IT6k8x/YgaOPI= cloud.google.com/go/recaptchaenterprise/v2 v2.9.0/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= cloud.google.com/go/recaptchaenterprise/v2 v2.9.2/go.mod h1:trwwGkfhCmp05Ll5MSJPXY7yvnO0p4v3orGANAFHAuU= cloud.google.com/go/recaptchaenterprise/v2 v2.12.0 h1:nykUP2WD/914jui/IldiCOuoTn6T8ha1Ys6/N9sAqJY= cloud.google.com/go/recaptchaenterprise/v2 v2.12.0/go.mod h1:4TohRUt9x4hzECD53xRFER+TJavgbep6riguPnsr4oQ= +cloud.google.com/go/recaptchaenterprise/v2 v2.14.1 h1:ap5s4euZOuyQnq6BHZpBzhXsC0hQMqMYx9eP+24mhio= +cloud.google.com/go/recaptchaenterprise/v2 v2.14.1/go.mod h1:s1dcJEzWpEsgZN8aqHacC3mWUaQPd8q/QoibU/nkr18= cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= cloud.google.com/go/recommendationengine v0.8.5/go.mod h1:A38rIXHGFvoPvmy6pZLozr0g59NRNREz4cx7F58HAsQ= cloud.google.com/go/recommendationengine v0.8.6 h1:m0eQtYCToxMSbDKOnpJ2YGdQhyjOPffg4Y8lM2RWzao= cloud.google.com/go/recommendationengine v0.8.6/go.mod h1:ratALtVdAkofp0vDzpkL87zJcTymiQLc7fQyohRKWoA= +cloud.google.com/go/recommendationengine v0.8.10 h1:LW5Omdl3ruZEbDkjIC233v4Pb1+BH5YP0QR1hswC6HY= +cloud.google.com/go/recommendationengine v0.8.10/go.mod h1:vlLaupkdqL3wuabhhjvrpH7TFswyxO6+P0L3AqrATPU= cloud.google.com/go/recommender v1.12.0/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= cloud.google.com/go/recommender v1.12.1/go.mod h1:gf95SInWNND5aPas3yjwl0I572dtudMhMIG4ni8nr+0= cloud.google.com/go/recommender v1.12.2 h1:3M6lD39/GlOMYOikeF5wflSa4EP5pGFthoIASbyhIXE= cloud.google.com/go/recommender v1.12.2/go.mod h1:9YizZzqpUtJelRv0pw2bfl3+3i5bTwL/FuAucj15WJc= +cloud.google.com/go/recommender v1.12.6 h1:nRZ49CxvVaISSHtLgxNsXC4rARhNZ497tFjqwwq885A= +cloud.google.com/go/recommender v1.12.6/go.mod h1:BNNC/CEIGV3y6hQNjewrVx80PIidfFtf8D+6SCEgLnA= cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= cloud.google.com/go/redis v1.14.2/go.mod h1:g0Lu7RRRz46ENdFKQ2EcQZBAJ2PtJHJLuiiRuEXwyQw= cloud.google.com/go/redis v1.14.3 h1:zlGxeAsiwcPU+Cta76ALduhdBAVhuYpEjv59V5L/ves= cloud.google.com/go/redis v1.14.3/go.mod h1:YtYX9QC98d3LEI9GUixwZ339Niw6w5xFcxLRruuFuss= +cloud.google.com/go/redis v1.16.3 h1:LpfqCo52c/YcgyrVUOVX2CSyUeY3lnhyp546u8f3eVg= +cloud.google.com/go/redis v1.16.3/go.mod h1:zqagsFk9fZzFKJB5NzijOUi53BeU5jUiPa4Kz/8Qz+Q= cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= cloud.google.com/go/resourcemanager v1.9.5/go.mod h1:hep6KjelHA+ToEjOfO3garMKi/CLYwTqeAw7YiEI9x8= cloud.google.com/go/resourcemanager v1.9.6 h1:VPfJFbWxrTYQzEXCDbJNpcvSB8eZhTSM0YHH146fIB8= cloud.google.com/go/resourcemanager v1.9.6/go.mod h1:d+XUOGbxg6Aka3lmC4fDiserslux3d15uX08C6a0MBg= +cloud.google.com/go/resourcemanager v1.9.10 h1:++wnwx8jD5cCtUH/wQT5nAswv37M9rwyjwVOcIgJOIY= +cloud.google.com/go/resourcemanager v1.9.10/go.mod h1:UJ5zGD2ZD+Ng3MNxkU1fwBbpJQEQE1UctqpvV5pbP1M= cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= cloud.google.com/go/resourcesettings v1.6.5/go.mod h1:WBOIWZraXZOGAgoR4ukNj0o0HiSMO62H9RpFi9WjP9I= cloud.google.com/go/resourcesettings v1.6.6 h1:l/IbRDDmGJFlR4bRZGtfYvix1Pu0jAKGLr7wgUtixHQ= cloud.google.com/go/resourcesettings v1.6.6/go.mod h1:t1+N03/gwNuKyOqpnACg/hWNL7ujT8mQYGqOzxOjFVE= +cloud.google.com/go/resourcesettings v1.7.3 h1:BRo3/I/Uwyabr9ScZnQvw2up/FrPyIVjSUqOyTLDnHA= +cloud.google.com/go/resourcesettings v1.7.3/go.mod h1:lMSnOoQPDKzcF6LGJOBcQqGCY2Zm8ZhbHEzhqdU61S8= cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= cloud.google.com/go/retail v1.16.0/go.mod h1:LW7tllVveZo4ReWt68VnldZFWJRzsh9np+01J9dYWzE= cloud.google.com/go/retail v1.16.1 h1:AyVdElkdIU3JedWpX/qENbt8iUmKD+kiyj7ZpzguhTg= cloud.google.com/go/retail v1.16.1/go.mod h1:xzHOcNrzFB5aew1AjWhZAPnHF2oCGqt7hMmTlrzQqAs= +cloud.google.com/go/retail v1.17.3 h1:Da86fObSMBSxtglj6V57QH5y09pOIWAJW8mlex8EMAg= +cloud.google.com/go/retail v1.17.3/go.mod h1:8OWmRAUXg8PKs1ef+VwrBLYBRdYJxq+YyxiytMaUBRI= cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= cloud.google.com/go/run v1.3.4/go.mod h1:FGieuZvQ3tj1e9GnzXqrMABSuir38AJg5xhiYq+SF3o= cloud.google.com/go/run v1.3.6 h1:xQND6EJn1LgouCLPSfykkzagyr4gq4FKiRexNxXixV0= cloud.google.com/go/run v1.3.6/go.mod h1:/ou4d0u5CcK5/44Hbpd3wsBjNFXmn6YAWChu+XAKwSU= +cloud.google.com/go/run v1.3.10 h1:6Ri8S6Zp33qFzX88b7/7QXGQEzKeuuSAfW0DopVgjww= +cloud.google.com/go/run v1.3.10/go.mod h1:zQGa7V57WWZhyiUYMlYitrBZzR+d2drzJQvrpaQ8YIA= cloud.google.com/go/scheduler v1.10.5/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= cloud.google.com/go/scheduler v1.10.6/go.mod h1:pe2pNCtJ+R01E06XCDOJs1XvAMbv28ZsQEbqknxGOuE= cloud.google.com/go/scheduler v1.10.7 h1:h1/VZk0XdkSh/jI7dDNp3V0Qi8yTkclOljDVPelXvAw= cloud.google.com/go/scheduler v1.10.7/go.mod h1:AfKUtlPF0D2xtfWy+k6rQFaltcBeeoSOY7XKQkWs+1s= +cloud.google.com/go/scheduler v1.10.11 h1:SLQ3tIufG6NFILFmRivwuehtmFQRlYXCJ4gagxWx9PI= +cloud.google.com/go/scheduler v1.10.11/go.mod h1:irpDaNL41B5q8hX/Ki87hzkxO8FnZEhhZnFk6OP8TnE= cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= cloud.google.com/go/secretmanager v1.11.5/go.mod h1:eAGv+DaCHkeVyQi0BeXgAHOU0RdrMeZIASKc+S7VqH4= cloud.google.com/go/secretmanager v1.12.0 h1:e5pIo/QEgiFiHPVJPxM5jbtUr4O/u5h2zLHYtkFQr24= cloud.google.com/go/secretmanager v1.12.0/go.mod h1:Y1Gne3Ag+fZ2TDTiJc8ZJCMFbi7k1rYT4Rw30GXfvlk= +cloud.google.com/go/secretmanager v1.13.4 h1:pizLSVUkZ8RdeQL5Vswj/3ujVC4kSY5eTxAWyMwQ1uc= +cloud.google.com/go/secretmanager v1.13.4/go.mod h1:SjKHs6rx0ELUqfbRWrWq4e7SiNKV7QMWZtvZsQm3k5w= cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= cloud.google.com/go/security v1.15.5/go.mod h1:KS6X2eG3ynWjqcIX976fuToN5juVkF6Ra6c7MPnldtc= cloud.google.com/go/security v1.15.6 h1:LYMj7ISEEjVQ0ub6E6ygGhjVbNQTH5CawKZz0bbPMVE= cloud.google.com/go/security v1.15.6/go.mod h1:UMEAGVBMqE6xZvkCR1FvUIeBEmGOCRIDwtwT357xmok= +cloud.google.com/go/security v1.17.3 h1:LTNqcCljAsgCEqZzir/+dSE8cEsc5wXKDQzTIoY9lxE= +cloud.google.com/go/security v1.17.3/go.mod h1:CuKzQq5OD6TXAYaZs/jI0d7CNHoD0LXbpsznIIIn4f4= cloud.google.com/go/securitycenter v1.24.3/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= cloud.google.com/go/securitycenter v1.24.4/go.mod h1:PSccin+o1EMYKcFQzz9HMMnZ2r9+7jbc+LvPjXhpwcU= cloud.google.com/go/securitycenter v1.28.0 h1:NpEJeFbm3ad3ibpbpIBKXJS7eQq1cZhtt9nrDTMO/QQ= cloud.google.com/go/securitycenter v1.28.0/go.mod h1:kmS8vAIwPbCIg7dDuiVKF/OTizYfuWe5f0IIW6NihN8= +cloud.google.com/go/securitycenter v1.33.0 h1:0UMkWiqmkMV5YE1oEx7uYOz24vipZYugCHj/Gxrca5k= +cloud.google.com/go/securitycenter v1.33.0/go.mod h1:lkEPItFjC1RRBHniiWR3lJTpUJW+7+EFAb7nP5ZCQxI= cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= cloud.google.com/go/servicedirectory v1.11.4/go.mod h1:Bz2T9t+/Ehg6x+Y7Ycq5xiShYLD96NfEsWNHyitj1qM= cloud.google.com/go/servicedirectory v1.11.5 h1:gkzx9Cd+OTOD+zY4u5vtbdvOx7vrvHYdeDiNdC6vKyw= cloud.google.com/go/servicedirectory v1.11.5/go.mod h1:hp2Ix2Qko7hIh5jaFWftbdwKXHQhYPijcGPpLgTVZvw= +cloud.google.com/go/servicedirectory v1.11.10 h1:K8SePw70JShexjXEBm2gxoBshNc4uFOMmoGyln3q3nM= +cloud.google.com/go/servicedirectory v1.11.10/go.mod h1:pgbBjH2r73lEd3Y7eNA64fRO3g1zL96PMu+/hAjkH6g= cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= cloud.google.com/go/shell v1.7.5/go.mod h1:hL2++7F47/IfpfTO53KYf1EC+F56k3ThfNEXd4zcuiE= cloud.google.com/go/shell v1.7.6 h1:/oJf9sboa2FfHWCmHXy+XfTRnZy8lC7O5zFyfE1EA6s= cloud.google.com/go/shell v1.7.6/go.mod h1:Ax+fG/h5TbwbnlhyzkgMeDK7KPfINYWE0V/tZUuuPXo= +cloud.google.com/go/shell v1.7.10 h1:Hc5/g3WgVSfTRaTaRxx8gJaOmTFDAzw1jndR/wYMffY= +cloud.google.com/go/shell v1.7.10/go.mod h1:1sKAD5ijarrTLPX0VMQai6jCduRxaU2A6w0JWVGCNag= cloud.google.com/go/spanner v1.55.0/go.mod h1:HXEznMUVhC+PC+HDyo9YFG2Ajj5BQDkcbqB9Z2Ffxi0= cloud.google.com/go/spanner v1.56.0/go.mod h1:DndqtUKQAt3VLuV2Le+9Y3WTnq5cNKrnLb/Piqcj+h0= cloud.google.com/go/spanner v1.57.0/go.mod h1:aXQ5QDdhPRIqVhYmnkAdwPYvj/DRN0FguclhEWw+jOo= cloud.google.com/go/spanner v1.60.0 h1:O9kf49dfaDRzPpKJNChHUJ+Bao02WPedZb8ZPyi02lI= cloud.google.com/go/spanner v1.60.0/go.mod h1:D2bOAeT/dC6zsZhXRIxbdYa5nQEYU3wYM/1KN3eg7Fs= +cloud.google.com/go/spanner v1.64.0 h1:ltyPbHA/nRAtAhU/o742dXBCI1eNHPeaRY09Ja8B+hM= +cloud.google.com/go/spanner v1.64.0/go.mod h1:TOFx3pb2UwPsDGlE1gTehW+y6YlU4IFk+VdDHSGQS/M= cloud.google.com/go/speech v1.21.0/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= cloud.google.com/go/speech v1.21.1/go.mod h1:E5GHZXYQlkqWQwY5xRSLHw2ci5NMQNG52FfMU1aZrIA= cloud.google.com/go/speech v1.23.0 h1:evZ9B5S6OBGP5PeJXnYWW1UpgIYV4jbsXwsQr5x7fPM= cloud.google.com/go/speech v1.23.0/go.mod h1:a5rtCeVQ9tJglWLBNc6rYEMjfZg6DDaBKq1bEjvH+I8= +cloud.google.com/go/speech v1.23.4 h1:sXHeIuwctDNFc7OF3FJhHZ5HVFqRBWWVRDNMNy6pemI= +cloud.google.com/go/speech v1.23.4/go.mod h1:pv5VPKuXsZStCnTBImQP8HDfQHgG4DxJSlDyx5Kcwak= 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= @@ -463,62 +675,92 @@ cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJ cloud.google.com/go/storagetransfer v1.10.4/go.mod h1:vef30rZKu5HSEf/x1tK3WfWrL0XVoUQN/EPDRGPzjZs= cloud.google.com/go/storagetransfer v1.10.5 h1:BawJo/u0P21cdxc2gB878qIFDC80COq2i0qWZeNevSw= cloud.google.com/go/storagetransfer v1.10.5/go.mod h1:086WXPZlWXLfql+/nlmcc8ZzFWvITqfSGUQyMdf5eBk= +cloud.google.com/go/storagetransfer v1.10.9 h1:/zz1wNM9mS3bbAKhc6HPoIq4TmPkSgvMvDD2YnFDMaY= +cloud.google.com/go/storagetransfer v1.10.9/go.mod h1:QKkg5Wau5jc0iXlPOZyEv3hH9mjCLeYIBiRrZTf6Ehw= cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= cloud.google.com/go/talent v1.6.6/go.mod h1:y/WQDKrhVz12WagoarpAIyKKMeKGKHWPoReZ0g8tseQ= cloud.google.com/go/talent v1.6.7 h1:4xgDFfOcgcSY0dUzaSc2tQCSRoLDEJ5CfbW5jfcgNJk= cloud.google.com/go/talent v1.6.7/go.mod h1:OLojlmmygm0wuTqi+UXKO0ZdLHsAedUfDgxDrkIWxTo= +cloud.google.com/go/talent v1.6.11 h1:KeHivwG3oLs+AkRTDIcVryLRa4T5qcCeh7zqjGsNWho= +cloud.google.com/go/talent v1.6.11/go.mod h1:tmMptbP5zTw6tjudgip8LObeh7E4xHNC/IYsiGtxnrc= cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= cloud.google.com/go/texttospeech v1.7.5/go.mod h1:tzpCuNWPwrNJnEa4Pu5taALuZL4QRRLcb+K9pbhXT6M= cloud.google.com/go/texttospeech v1.7.6 h1:gLEyDoJeFGdoX7jSKbf+nJy7CTgjsSbCZXwzzkXgH9w= cloud.google.com/go/texttospeech v1.7.6/go.mod h1:nhRJledkoE6/6VvEq/d0CX7nPnDwc/uzfaqePlmiPVE= +cloud.google.com/go/texttospeech v1.7.10 h1:0jLBTnPTuxtrQuJK6BBs4jGxvhY4eDx8ISSBsQHRnqQ= +cloud.google.com/go/texttospeech v1.7.10/go.mod h1:ChThPazSxR7e4qe9ryRlFGU4lRONvL9Oo2geyp7LX4o= cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= cloud.google.com/go/tpu v1.6.5/go.mod h1:P9DFOEBIBhuEcZhXi+wPoVy/cji+0ICFi4TtTkMHSSs= cloud.google.com/go/tpu v1.6.6 h1:Cb1txkZYbKlGIZ4tQr9EjEB9snAOU6qyjvNezGXDunI= cloud.google.com/go/tpu v1.6.6/go.mod h1:T4gCNpT7SO28mMkCVJTWQ3OXAUY3YlScOqU4+5iX2B8= +cloud.google.com/go/tpu v1.6.10 h1:M3bO0H0HR/zvBc0CY6cOc9fFhXA+737cCP4AOcSt8J4= +cloud.google.com/go/tpu v1.6.10/go.mod h1:O+N+S0i3bOH6NJ+s9GPsg9LC7jnE1HRSp8CSRYjCrfM= cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= cloud.google.com/go/trace v1.10.5/go.mod h1:9hjCV1nGBCtXbAE4YK7OqJ8pmPYSxPA0I67JwRd5s3M= cloud.google.com/go/trace v1.10.6 h1:XF0Ejdw0NpRfAvuZUeQe3ClAG4R/9w5JYICo7l2weaw= cloud.google.com/go/trace v1.10.6/go.mod h1:EABXagUjxGuKcZMy4pXyz0fJpE5Ghog3jzTxcEsVJS4= +cloud.google.com/go/trace v1.10.10 h1:eiIFoRp1qTh2tRemTd8HIE7qZ0Ok5l7dl9pYsNWoXjk= +cloud.google.com/go/trace v1.10.10/go.mod h1:5b1BiSYQO27KgGRevNFfoIQ8czwpVgnkKbTLb4wV+XM= cloud.google.com/go/translate v1.10.0/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= cloud.google.com/go/translate v1.10.1/go.mod h1:adGZcQNom/3ogU65N9UXHOnnSvjPwA/jKQUMnsYXOyk= cloud.google.com/go/translate v1.10.2 h1:SXOtKYnT7ZkeMtPwujaBOBt5Ph4kf6LIuMpAgu/WON0= cloud.google.com/go/translate v1.10.2/go.mod h1:M4xIFGUwTrmuhyMMpJFZrBuSOhaX7Fhj4U1//mfv4BE= +cloud.google.com/go/translate v1.10.6 h1:qei5yunwHM3jDMwaisWeLs6CFMIK2rYJ6+OQBf6nrwI= +cloud.google.com/go/translate v1.10.6/go.mod h1:vqZOHurggOqpssx/agK9S21UdStpwugMOhlHvWEGAdw= cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= cloud.google.com/go/video v1.20.4/go.mod h1:LyUVjyW+Bwj7dh3UJnUGZfyqjEto9DnrvTe1f/+QrW0= cloud.google.com/go/video v1.20.5 h1:y4jgUqDiWMfX+beJnlrnloBQxEIa9v+KrlkD2QJVpeE= cloud.google.com/go/video v1.20.5/go.mod h1:tCaG+vfAM6jmkwHvz2M0WU3KhiXpmDbQy3tBryMo8I0= +cloud.google.com/go/video v1.21.3 h1:ov3PEKobF5xwGaDOW3csADWdrd7dt9CBcjvzk78MHEw= +cloud.google.com/go/video v1.21.3/go.mod h1:tp2KqkcxNEL5k2iF2Hd38aIWlNo/ew+i1yklhlyq6BM= cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= cloud.google.com/go/videointelligence v1.11.5/go.mod h1:/PkeQjpRponmOerPeJxNPuxvi12HlW7Em0lJO14FC3I= cloud.google.com/go/videointelligence v1.11.6 h1:P0Sa8+5KOEAVk/fazUNjVPzRCijCheZWJ8wL8xBn9Uk= cloud.google.com/go/videointelligence v1.11.6/go.mod h1:b6dd26k4jUM+9evzWxLK1QDwVvoOA1piEYiTDv3jF6w= +cloud.google.com/go/videointelligence v1.11.10 h1:7WdrgmvIrBYl+jLCdiXA2cIi/YuYE9k+6/gWBAy7MRg= +cloud.google.com/go/videointelligence v1.11.10/go.mod h1:5oW8qq+bk8Me+3fNoQK+27CCw4Nsuk/YN7zMw7vNDTA= cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= cloud.google.com/go/vision/v2 v2.8.0/go.mod h1:ocqDiA2j97pvgogdyhoxiQp2ZkDCyr0HWpicywGGRhU= cloud.google.com/go/vision/v2 v2.8.1 h1:kvR1sHcuPYat1wI3BYY7CEX2xLAcUHPYL6dOzV2Xf4Q= cloud.google.com/go/vision/v2 v2.8.1/go.mod h1:0n3GzR+ZyRVDHTH5koELHFqIw3lXaFdLzlHUvlXNWig= +cloud.google.com/go/vision/v2 v2.8.5 h1:dMifa7r2KBUkWZaTsEMnT2bl7WdpcFtwAgogPcstRww= +cloud.google.com/go/vision/v2 v2.8.5/go.mod h1:3X2ni4uSzzqpj8zTUD6aia62O1NisD19JH3l5i0CoM4= cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= cloud.google.com/go/vmmigration v1.7.5/go.mod h1:pkvO6huVnVWzkFioxSghZxIGcsstDvYiVCxQ9ZH3eYI= cloud.google.com/go/vmmigration v1.7.6 h1:sbaWK76csqtk0TGPGCiJqZi7tfrU0LnrhUjZHI5YVdc= cloud.google.com/go/vmmigration v1.7.6/go.mod h1:HpLc+cOfjHgW0u6jdwcGlOSbkeemIEwGiWKS+8Mqy1M= +cloud.google.com/go/vmmigration v1.7.10 h1:cqR5hn2wzTshVJc/s37JPVF8z8N4Ne5KNsgtECXhZVI= +cloud.google.com/go/vmmigration v1.7.10/go.mod h1:VkoA4ktmA0C3fr7LqhthGtGWEmgM7WHWg6ObxeXR5lU= cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= cloud.google.com/go/vmwareengine v1.1.1/go.mod h1:nMpdsIVkUrSaX8UvmnBhzVzG7PPvNYc5BszcvIVudYs= cloud.google.com/go/vmwareengine v1.1.2 h1:Mf8abigBstvjfSGq9twhtbMTCONL0Cjds+tGbc2pV0M= cloud.google.com/go/vmwareengine v1.1.2/go.mod h1:7wZHC+0NM4TnQE8gUpW397KgwccH+fAnc4Lt5zB0T1k= +cloud.google.com/go/vmwareengine v1.1.6 h1:bnmSVRm2cvXTOXakMhW8NnDW/7rnIV4i/ceHIxN/o0w= +cloud.google.com/go/vmwareengine v1.1.6/go.mod h1:9txHCR2yJ6H9pFsfehTXLte5uvl/wOiM2PCtcVfglvI= cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= cloud.google.com/go/vpcaccess v1.7.5/go.mod h1:slc5ZRvvjP78c2dnL7m4l4R9GwL3wDLcpIWz6P/ziig= cloud.google.com/go/vpcaccess v1.7.6 h1:wbMTRdZ9P5+3D6oQWWqB/YxDCFR5m5OJ+b+hHwaBBQQ= cloud.google.com/go/vpcaccess v1.7.6/go.mod h1:BV6tTobbojd2AhrEOBLfywFUJlFU63or5Qgd0XrFsCc= +cloud.google.com/go/vpcaccess v1.7.10 h1:w/B2f0sQah6acAsTJ1/W4Rv9IUmGK4upg5uPd4v0cc8= +cloud.google.com/go/vpcaccess v1.7.10/go.mod h1:69kdbMh8wvGcM3agEHP1YnHPyxIBSRcZuK+KWZlpVLI= cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= cloud.google.com/go/webrisk v1.9.5/go.mod h1:aako0Fzep1Q714cPEM5E+mtYX8/jsfegAuS8aivxy3U= cloud.google.com/go/webrisk v1.9.6 h1:rVhi2WOHcZF72X7spXVTFTmRGeFN4NFeW7/Ku7kgeug= cloud.google.com/go/webrisk v1.9.6/go.mod h1:YzrDCXBOpnC64+GRRpSXPMQSvR8I4r5YO78y7A/T0Ac= +cloud.google.com/go/webrisk v1.9.10 h1:cmQc8akyRLhLELOO7eWqQrxYoPkpnysXQ5dkY3FnPh8= +cloud.google.com/go/webrisk v1.9.10/go.mod h1:wDxtALjJMXlGR2c3qtZaVI5jRKcneIMTYqV1IA1jPmo= cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= cloud.google.com/go/websecurityscanner v1.6.5/go.mod h1:QR+DWaxAz2pWooylsBF854/Ijvuoa3FCyS1zBa1rAVQ= cloud.google.com/go/websecurityscanner v1.6.6 h1:YAwNB/HjKOVAy9D7W8Bkv8OQ9G2lqIqFOuJbyH5Xo4Q= cloud.google.com/go/websecurityscanner v1.6.6/go.mod h1:zjsc4h9nV1sUxuSMurR2v3gJwWKYorJ+Nanm+1/w6G0= +cloud.google.com/go/websecurityscanner v1.6.10 h1:OTETVcew3rHsCcZAHdAgPryK8/NB/n5VK1bc1YjoswU= +cloud.google.com/go/websecurityscanner v1.6.10/go.mod h1:ndil05bWkG/KDgWAXwFFAuvOYcOKu+mk/wC/nIfLQwE= cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= cloud.google.com/go/workflows v1.12.4/go.mod h1:yQ7HUqOkdJK4duVtMeBCAOPiN1ZF1E9pAMX51vpwB/w= cloud.google.com/go/workflows v1.12.5 h1:hH511zmS93oE6j64m/eiGWnfgqailh/S8+f3MVNLcE8= cloud.google.com/go/workflows v1.12.5/go.mod h1:KbK5/Ef28G8MKLXcsvt/laH1Vka4CKeQj0I1/wEiByo= +cloud.google.com/go/workflows v1.12.9 h1:L9+onC8agR1DExlPWNc5hQugo+mDpodH9S19dvC5u0c= +cloud.google.com/go/workflows v1.12.9/go.mod h1:g9S8NdA20MnQTReKVrXCDsnPrOsNgwonY7xZn+vr3SY= connectrpc.com/connect v1.14.0 h1:PDS+J7uoz5Oui2VEOMcfz6Qft7opQM9hPiKvtGC01pA= connectrpc.com/connect v1.14.0/go.mod h1:uoAq5bmhhn43TwhaKdGKN/bZcGtzPW1v+ngDTn5u+8s= connectrpc.com/connect v1.16.1 h1:rOdrK/RTI/7TVnn3JsVxt3n028MlTRwmK5Q4heSpjis= @@ -532,8 +774,6 @@ cuelang.org/go v0.7.0/go.mod h1:ix+3dM/bSpdG9xg6qpCgnJnpeLtciZu+O/rDbywoMII= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 h1:59MxjQVfjXsBpLy+dbd2/ELV5ofnUkUZBvWSC85sheA= github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= -github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= -github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= @@ -555,10 +795,14 @@ github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4s github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v6 v6.1.0 h1:hvO96X345XagdH1fAoBjpBYG4a1ghhL/QzalkduPuXk= github.com/CloudyKit/jet/v6 v6.1.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= +github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= github.com/Jeffail/gabs/v2 v2.7.0 h1:Y2edYaTcE8ZpRsR2AtmPu5xQdFDIthFG0jYhu5PY8kg= github.com/Jeffail/gabs/v2 v2.7.0/go.mod h1:dp5ocw1FvBBQYssgHsG7I1WYsiLRtkUaB1FEtSwvNUw= github.com/Jeffail/shutdown v1.0.0 h1:afYjnY4pksqP/012m3NGJVccDI+WATdSzIMVHZKU8/Y= github.com/Jeffail/shutdown v1.0.0/go.mod h1:5dT4Y1oe60SJELCkmAB1pr9uQyHBhh6cwDLQTfmuO5U= +github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= +github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/Masterminds/vcs v1.13.3 h1:IIA2aBdXvfbIM+yl/eTnL4hb1XwdpvuQLglAix1gweE= github.com/Masterminds/vcs v1.13.3/go.mod h1:TiE7xuEjl1N4j016moRd6vezp6e6Lz23gypeXfzXeW8= github.com/Microsoft/cosesign1go v1.1.0 h1:JnHY2wQkIK4HmstaK5rMdM4S83nIC7fJmD1phOLj9qo= @@ -598,6 +842,8 @@ github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAu github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18= @@ -620,6 +866,8 @@ github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHS github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/aws/aws-sdk-go v1.49.13 h1:f4mGztsgnx2dR9r8FQYa9YW/RsKb+N7bgef4UGrOW1Y= github.com/aws/aws-sdk-go v1.49.13/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.55.3 h1:0B5hOX+mIx7I5XPOrjrHlKSDQV/+ypFZpIHOx5LOk3E= +github.com/aws/aws-sdk-go v1.55.3/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.9.2 h1:dUFQcMNZMLON4BOe273pl0filK9RqyQMhCK/6xssL6s= github.com/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= @@ -672,6 +920,8 @@ github.com/basgys/goxml2json v1.1.0 h1:4ln5i4rseYfXNd86lGEB+Vi652IsIXIvggKM/BhUK github.com/basgys/goxml2json v1.1.0/go.mod h1:wH7a5Np/Q4QoECFIU8zTQlZwZkrilY0itPfecMw41Dw= github.com/beevik/ntp v1.3.0 h1:/w5VhpW5BGKS37vFm1p9oVk/t4HnnkKZAZIubHM6F7Q= github.com/beevik/ntp v1.3.0/go.mod h1:vD6h1um4kzXpqmLTuu0cCLcC+NfvC0IC+ltmEDA8E78= +github.com/beevik/ntp v1.4.3 h1:PlbTvE5NNy4QHmA4Mg57n7mcFTmr1W1j3gcK7L1lqho= +github.com/beevik/ntp v1.4.3/go.mod h1:Unr8Zg+2dRn7d8bHFuehIMSvvUYssHMxW3Q5Nx4RW5Q= github.com/benthosdev/benthos/v4 v4.27.1-0.20240521091006-cca8c858ec4d h1:94Irz6o8uKNuIRH2olWyfscV4iyfXeX2/3K6JoYkzro= github.com/benthosdev/benthos/v4 v4.27.1-0.20240521091006-cca8c858ec4d/go.mod h1:KbKrzlHGhf67eIdUqk4pjT5yaD8nTPb7vczP5/twTOc= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= @@ -686,6 +936,8 @@ github.com/bufbuild/protocompile v0.7.1 h1:Kd8fb6EshOHXNNRtYAmLAwy/PotlyFoN0iMbu github.com/bufbuild/protocompile v0.7.1/go.mod h1:+Etjg4guZoAqzVk2czwEQP12yaxLJ8DxuqCJ9qHdH94= github.com/bufbuild/protocompile v0.13.0 h1:6cwUB0Y2tSvmNxsbunwzmIto3xOlJOV7ALALuVOs92M= github.com/bufbuild/protocompile v0.13.0/go.mod h1:dr++fGGeMPWHv7jPeT06ZKukm45NJscd7rUxQVzEKRk= +github.com/bufbuild/protocompile v0.14.0 h1:z3DW4IvXE5G/uTOnSQn+qwQQxvhckkTWLS/0No/o7KU= +github.com/bufbuild/protocompile v0.14.0/go.mod h1:N6J1NYzkspJo3ZwyL4Xjvli86XOj1xq4qAasUFxGups= github.com/bufbuild/protovalidate-go v0.4.3 h1:1Xsm3qhkwioxLDEtxWgtn0Ch71xBP/sBauT/FZnn76A= github.com/bufbuild/protovalidate-go v0.4.3/go.mod h1:RcgJ+onKVv4OkAVtzkRUxkocb8stcUAMK0EoqR4fuZE= github.com/bufbuild/protovalidate-go v0.6.2 h1:U/V3CGF0kPlR12v41rjO4DrYZtLcS4ZONLmWN+rJVCQ= @@ -709,6 +961,7 @@ github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= @@ -720,6 +973,8 @@ github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cfssl v1.6.5 h1:46zpNkm6dlNkMZH/wMW22ejih6gIaJbzL2du6vD7ZeI= +github.com/cloudflare/cfssl v1.6.5/go.mod h1:Bk1si7sq8h2+yVEDrFJiz3d7Aw+pfjjJSZVaD+Taky4= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI= @@ -738,6 +993,7 @@ github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+g github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b h1:ga8SEFjZ60pxLcmhnThWgvH2wg8376yUJmPhEH4H3kw= github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg= github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc= @@ -805,10 +1061,12 @@ github.com/cpu/goacmedns v0.1.1/go.mod h1:MuaouqEhPAHxsbqjgnck5zeghuwBP1dLnPoobe github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/daviddengcn/go-colortext v1.0.0 h1:ANqDyC0ys6qCSvuEK7l3g5RaehL/Xck9EX8ATG8oKsE= github.com/daviddengcn/go-colortext v1.0.0/go.mod h1:zDqEI5NVUop5QPpVJUxE9UO10hRnmkD5G4Pmri9+m4c= @@ -816,6 +1074,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d h1: github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/denisenkom/go-mssqldb v0.9.0 h1:RSohk2RsiZqLZ0zCjtfn3S4Gp4exhpBWHyQ7D0yGjAk= github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/digitalocean/godo v1.107.0 h1:P72IbmGFQvKOvyjVLyT59bmHxilA4E5hWi40rF4zNQc= @@ -870,11 +1130,14 @@ github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6FI= +github.com/foxcpp/go-mockdns v1.0.0/go.mod h1:lgRN6+KxQBawyIghpnl5CezHFGS9VLzvtVlwxvzXTQ4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQmYw= github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= +github.com/fxamacker/cbor/v2 v2.6.0 h1:sU6J2usfADwWlYDAFhZBQ6TnLFBHxgesMrQfQgk1tWA= github.com/fxamacker/cbor/v2 v2.6.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/getkin/kin-openapi v0.122.0 h1:WB9Jbl0Hp/T79/JF9xlSW5Kl9uYdk/AWD0yAd9HOM10= github.com/getkin/kin-openapi v0.122.0/go.mod h1:PCWw/lfBrJY4HcdqE3jj+QFkaFK8ABoqo7PvqVhXXqw= @@ -956,6 +1219,8 @@ github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -982,6 +1247,7 @@ github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1020,6 +1286,7 @@ github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/cel-go v0.17.7 h1:6ebJFzu1xO2n7TLtN+UBqShGBhlD85bhvglh5DpcfqQ= github.com/google/cel-go v0.17.7/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= +github.com/google/cel-go v0.17.8 h1:j9m730pMZt1Fc4oKhCLUHfjj6527LuhYcYw0Rl8gqto= github.com/google/cel-go v0.17.8/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= github.com/google/cel-go v0.18.2 h1:L0B6sNBSVmt0OyECi8v6VOS74KOc9W/tLiWKfZABvf4= github.com/google/cel-go v0.18.2/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg= @@ -1095,18 +1362,23 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaW github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/hamba/avro/v2 v2.16.0 h1:0XhyP65Hs8iMLtdSR0v7ZrwRjsbIZdvr7KzYgmx1Mbo= github.com/hamba/avro/v2 v2.16.0/go.mod h1:Q9YK+qxAhtVrNqOhwlZTATLgLA8qxG2vtvkhK8fJ7Jo= github.com/hamba/avro/v2 v2.18.0 h1:U7T0xI8MGw9+m3SS48E2KHUxas/Hb0EvS0CpkmVcLoI= github.com/hamba/avro/v2 v2.18.0/go.mod h1:dEG+AHrykTpkXvBYsc+XXTuRlvGC645Ix5d2qR8EdEs= github.com/hamba/avro/v2 v2.21.0 h1:c+zUjpawYToY701O3RR5YMLML4GR+Rq+GGHCVNk2uC4= github.com/hamba/avro/v2 v2.21.0/go.mod h1:ouJ4PkiAEP49u0lAtQyd5Gv04MehKj+7lXwD3zpLpY0= +github.com/hamba/avro/v2 v2.23.0 h1:DYWz6UqNCi21JflaZlcwNfW+rK+D/CwnrWWJtfmO4vw= +github.com/hamba/avro/v2 v2.23.0/go.mod h1:7vDfy/2+kYCE8WUHoj2et59GTv0ap7ptktMXu0QHePI= github.com/hashicorp/consul/api v1.13.0 h1:2hnLQ0GjQvw7f3O61jMO8gbasZviZTrt9R8WzgiirHc= github.com/hashicorp/consul/api v1.13.0/go.mod h1:ZlVrynguJKcYr54zGaDbaL3fOvKC9m72FhPvA8T35KQ= github.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU= @@ -1241,16 +1513,18 @@ github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= github.com/kataras/golog v0.1.7 h1:0TY5tHn5L5DlRIikepcaRR/6oInIr9AiWsxzt0vvlBE= github.com/kataras/golog v0.1.7/go.mod h1:jOSQ+C5fUqsNSwurB/oAHq1IFSb0KI3l6GMa7xB6dZA= +github.com/kataras/golog v0.1.8 h1:isP8th4PJH2SrbkciKnylaND9xoTtfxv++NB+DF0l9g= +github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= github.com/kataras/iris/v12 v12.2.0-beta5 h1:grB/oCf5baZhmYIeDMfgN3LYrtEcmK8pbxlRvEZ2pgw= github.com/kataras/iris/v12 v12.2.0-beta5/go.mod h1:q26aoWJ0Knx/00iPKg5iizDK7oQQSPjbD8np0XDh6dc= +github.com/kataras/iris/v12 v12.2.0 h1:WzDY5nGuW/LgVaFS5BtTkW3crdSKJ/FEgWnxPnIVVLI= +github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= github.com/kataras/pio v0.0.11 h1:kqreJ5KOEXGMwHAWHDwIl+mjfNCPhAwZPa8gK7MKlyw= github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= @@ -1274,8 +1548,12 @@ github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/labstack/echo/v4 v4.9.0 h1:wPOF1CE6gvt/kmbMR4dGzWvHMPT+sAEUJOwOTtvITVY= github.com/labstack/echo/v4 v4.9.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= +github.com/labstack/echo/v4 v4.10.0 h1:5CiyngihEO4HXsz3vVsJn7f8xAlWwRr3aY6Ih280ZKA= +github.com/labstack/echo/v4 v4.10.0/go.mod h1:S/T/5fy/GigaXnHTkh0ZGe4LpkkQysvRjFMSUTkDRNQ= github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o= github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= +github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= @@ -1296,6 +1574,8 @@ github.com/lestrrat-go/jwx v1.2.25 h1:tAx93jN2SdPvFn08fHNAhqFJazn5mBBOB8Zli0g0ot github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= github.com/lestrrat-go/jwx v1.2.28 h1:uadI6o0WpOVrBSf498tRXZIwPpEtLnR9CvqPFXeI5sA= github.com/lestrrat-go/jwx v1.2.28/go.mod h1:nF+91HEMh/MYFVwKPl5HHsBGMPscqbQb+8IDQdIazP8= +github.com/lestrrat-go/jwx v1.2.29 h1:QT0utmUJ4/12rmsVQrJ3u55bycPkKqGYuGT4tyRhxSQ= +github.com/lestrrat-go/jwx v1.2.29/go.mod h1:hU8k2l6WF0ncx20uQdOmik/Gjg6E3/wIRtXSNFeZuB8= github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= @@ -1304,6 +1584,8 @@ github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENj github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= github.com/linkedin/goavro/v2 v2.12.0 h1:rIQQSj8jdAUlKQh6DttK8wCRv4t4QO09g1C4aBWXslg= github.com/linkedin/goavro/v2 v2.12.0/go.mod h1:KXx+erlq+RPlGSPmLF7xGo6SAbh8sCQ53x064+ioxhk= +github.com/linkedin/goavro/v2 v2.13.0 h1:L8eI8GcuciwUkt41Ej62joSZS4kKaYIUdze+6for9NU= +github.com/linkedin/goavro/v2 v2.13.0/go.mod h1:KXx+erlq+RPlGSPmLF7xGo6SAbh8sCQ53x064+ioxhk= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3 h1:jUp75lepDg0phMUJBCmvaeFDldD2N3S1lBuPwUTszio= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= @@ -1316,13 +1598,14 @@ github.com/lyft/protoc-gen-star/v2 v2.0.3 h1:/3+/2sWyXeMLzKd1bX+ixWKgEMsULrIivpD github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/mailgun/raymond/v2 v2.0.46 h1:aOYHhvTpF5USySJ0o7cpPno/Uh2I5qg2115K25A+Ft4= github.com/mailgun/raymond/v2 v2.0.46/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= +github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= +github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/matoous/go-nanoid/v2 v2.0.0 h1:d19kur2QuLeHmJBkvYkFdhFBzLoo1XVm2GgTpL+9Tj0= github.com/matoous/go-nanoid/v2 v2.0.0/go.mod h1:FtS4aGPVfEkxKxhdWPAspZpZSh1cOjtM7Ej/So3hR0g= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -1337,10 +1620,10 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfr github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/mdelapenya/tlscert v0.1.0/go.mod h1:wrbyM/DwbFCeCeqdPX/8c6hNOqQgbf0rUDErE1uD+64= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg= github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= +github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= +github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg= github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= @@ -1494,6 +1777,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -1503,10 +1788,16 @@ github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkB github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/safchain/ethtool v0.3.0 h1:gimQJpsI6sc1yIqP/y8GYgiXn/NjgvpM0RNoWLVVmP0= github.com/safchain/ethtool v0.3.0/go.mod h1:SA9BwrgyAqNo7M+uaL6IYbxpm5wk3L7Mm6ocLW+CJUs= +github.com/safchain/ethtool v0.4.1 h1:S6mEleTADqgynileXoiapt/nKnatyR6bmIHoF+h2ADo= +github.com/safchain/ethtool v0.4.1/go.mod h1:XLLnZmy4OCRTkksP/UiMjij96YmIsBfmBQcs7H6tA48= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/schollz/progressbar/v3 v3.13.1 h1:o8rySDYiQ59Mwzy2FELeHY5ZARXZTVJC7iHD6PEFUiE= github.com/schollz/progressbar/v3 v3.13.1/go.mod h1:xvrbki8kfT1fzWzBT/UZd9L6GA+jdL7HAgq2RFnO6fQ= +github.com/schollz/progressbar/v3 v3.14.4 h1:W9ZrDSJk7eqmQhd3uxFNNcTr0QL+xuGNI9dEMrw0r74= +github.com/schollz/progressbar/v3 v3.14.4/go.mod h1:aT3UQ7yGm+2ZjeXPqsjTenwL3ddUiuZ0kfQ/2tHlyNI= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c= @@ -1604,6 +1895,8 @@ github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1 github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= github.com/vbatts/tar-split v0.11.3 h1:hLFqsOLQ1SsppQNTMpkpPXClLDfC2A3Zgy9OUU+RVck= @@ -1710,11 +2003,15 @@ go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZV go.opentelemetry.io/otel v1.23.0/go.mod h1:YCycw9ZeKhcJFrb34iVSkyT0iczq/zYDtZYFufObyB0= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM= go.opentelemetry.io/otel/exporters/prometheus v0.45.0 h1:BeIK2KGho0oCWa7LxEGSqfDZbs7Fpv/Viz+FS4P8CXE= go.opentelemetry.io/otel/exporters/prometheus v0.45.0/go.mod h1:UVJZPLnfDSvHj+eJuZE+E1GjIBD267mEMfAAHJdghWg= go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= @@ -1727,6 +2024,8 @@ go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZ go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= +go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= go.opentelemetry.io/otel/sdk/metric v1.22.0 h1:ARrRetm1HCVxq0cbnaZQlfwODYJHo3gFL8Z3tSmHBcI= go.opentelemetry.io/otel/sdk/metric v1.22.0/go.mod h1:KjQGeMIDlBNEOo6HvjhxIec1p/69/kULDcp4gr0oLQQ= go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= @@ -1734,6 +2033,8 @@ go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+ go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= go.opentelemetry.io/otel/trace v1.23.0/go.mod h1:GSGTbIClEsuZrGIzoEHqsVfxgn5UkggkflQwDScNUsk= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1779,6 +2080,8 @@ golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2F golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/exp/typeparams v0.0.0-20231006140011-7918f672742d h1:NRn/Afz91uVUyEsxMp4lGGxpr5y1qz+Iko60dbkfvLQ= golang.org/x/exp/typeparams v0.0.0-20231006140011-7918f672742d/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20240719175910-8a7402abbf56 h1:i+QrZdyNyfLEnWjd5T6LQZvQP3xk2XiNs3sQgN7QDGE= +golang.org/x/exp/typeparams v0.0.0-20240719175910-8a7402abbf56/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1885,7 +2188,6 @@ golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1949,6 +2251,7 @@ golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808 h1:+Kc94D8UVEVxJnLXp/+ golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2020,10 +2323,13 @@ golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= 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= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2061,6 +2367,7 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2109,6 +2416,7 @@ google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 h1:nz5NESFLZbJGPFxDT/HCn+V1mZ8JGNoY4nUpmW/Y2eg= google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= google.golang.org/genproto v0.0.0-20240205150955-31a09d347014/go.mod h1:xEgQu1e4stdSSsxPDK8Azkrk/ECl5HvdPf6nbZrTS5M= @@ -2235,6 +2543,8 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.4.6 h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8= honnef.co/go/tools v0.4.6/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= +honnef.co/go/tools v0.4.7 h1:9MDAWxMoSnB6QoSqiVr7P5mtkT9pOc1kSxchzPCnqJs= +honnef.co/go/tools v0.4.7/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= k8s.io/api v0.30.1/go.mod h1:ddbN2C0+0DIiPntan/bye3SW3PdwLa11/0yqwvuRrJM= k8s.io/apiextensions-apiserver v0.30.1/go.mod h1:R4GuSrlhgq43oRY9sF2IToFh7PVlF1JjfWdoG3pixk4= k8s.io/apimachinery v0.30.1/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= @@ -2246,23 +2556,27 @@ k8s.io/cli-runtime v0.29.0/go.mod h1:VKudXp3X7wR45L+nER85YUzOQIru28HQpXr0mTdeCrk k8s.io/client-go v0.30.1/go.mod h1:wrAqLNs2trwiCH/wxxmT/x3hKVH9PuV0GGW0oDoHVqc= k8s.io/code-generator v0.29.5 h1:WqSdBPVV1B3jsPnKtPS39U02zj6Q7+FsjhAj1EPBJec= k8s.io/code-generator v0.29.5/go.mod h1:7TYnI0dYItL2cKuhhgPSuF3WED9uMdELgbVXFfn/joE= +k8s.io/code-generator v0.30.3 h1:bmtnLJKagDS5f5uOEpLyJiDfIMKXGMKgOLBdde+w0Mc= k8s.io/code-generator v0.30.3/go.mod h1:PFgBiv+miFV7TZYp+RXgROkhA+sWYZ+mtpbMLofMke8= k8s.io/component-base v0.29.5 h1:Ptj8AzG+p8c2a839XriHwxakDpZH9uvIgYz+o1agjg8= k8s.io/component-base v0.29.5/go.mod h1:9nBUoPxW/yimISIgAG7sJDrUGJlu7t8HnDafIrOdU8Q= k8s.io/component-base v0.30.1/go.mod h1:e/X9kDiOebwlI41AvBHuWdqFriSRrX50CdwA9TFaHLI= k8s.io/component-helpers v0.29.0 h1:Y8W70NGeitKxWwhsPo/vEQbQx5VqJV+3xfLpP3V1VxU= k8s.io/component-helpers v0.29.0/go.mod h1:j2coxVfmzTOXWSE6sta0MTgNSr572Dcx68F6DD+8fWc= +k8s.io/component-helpers v0.30.3 h1:KPc8l0eGx9Wg2OcKc58k9ozNcVcOInAi3NGiuS2xJ/c= k8s.io/component-helpers v0.30.3/go.mod h1:VOQ7g3q+YbKWwKeACG2BwPv4ftaN8jXYJ5U3xpzuYAE= k8s.io/cri-api v0.27.1 h1:KWO+U8MfI9drXB/P4oU9VchaWYOlwDglJZVHWMpTT3Q= k8s.io/cri-api v0.27.1/go.mod h1:+Ts/AVYbIo04S86XbTD73UPp/DkTiYxtsFeOFEu32L0= k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks= k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo= k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8= k8s.io/klog v0.2.0 h1:0ElL0OHzF3N+OhoJTL0uca20SxtYt4X4+bzHeqrB83c= k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kms v0.29.5 h1:DcR0hBeEcuLmKTpriezu7kyR4sJcHeeYle/WGdQWi2o= k8s.io/kms v0.29.5/go.mod h1:vWVImKkJd+1BQY4tBwdfSwjQBiLrnbNtHADcDEDQFtk= +k8s.io/kms v0.30.3 h1:NLg+oN45S2Y3U0WiLRzbS61AY/XrS5JBMZp531Z+Pho= k8s.io/kms v0.30.3/go.mod h1:GrMurD0qk3G4yNgGcsCEmepqf9KyyIrTXYR2lyUOJC4= k8s.io/kube-aggregator v0.29.0 h1:N4fmtePxOZ+bwiK1RhVEztOU+gkoVkvterHgpwAuiTw= k8s.io/kube-aggregator v0.29.0/go.mod h1:bjatII63ORkFg5yUFP2qm2OC49R0wwxZhRVIyJ4Z4X0= @@ -2271,6 +2585,7 @@ k8s.io/kubectl v0.29.0 h1:Oqi48gXjikDhrBF67AYuZRTcJV4lg2l42GmvsP7FmYI= k8s.io/kubectl v0.29.0/go.mod h1:0jMjGWIcMIQzmUaMgAzhSELv5WtHo2a8pq67DtviAJs= k8s.io/metrics v0.29.0 h1:a6dWcNM+EEowMzMZ8trka6wZtSRIfEA/9oLjuhBksGc= k8s.io/metrics v0.29.0/go.mod h1:UCuTT4dC/x/x6ODSk87IWIZQnuAfcwxOjb1gjWJdjMA= +k8s.io/metrics v0.30.3 h1:gKCpte5zykrOmQhZ8qmsxyJslMdiLN+sqbBfIWNpbGM= k8s.io/metrics v0.30.3/go.mod h1:W06L2nXRhOwPkFYDJYWdEIS3u6JcJy3ebIPYbndRs6A= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/pkg/helm/flags.go b/pkg/helm/flags.go deleted file mode 100644 index 53d379e665..0000000000 --- a/pkg/helm/flags.go +++ /dev/null @@ -1,45 +0,0 @@ -package helm - -import ( - "fmt" - "reflect" -) - -// ToFlags is a reflect based helper that translates a go struct with `flag` -// tags into a string slice of command line arguments. -// If flagsStruct is not a struct, ToFlags panics. -func ToFlags(flagsStruct any) []string { - v := reflect.ValueOf(flagsStruct) - t := v.Type() - - var flags []string - - for i := 0; i < t.NumField(); i++ { - field := t.Field(i) - flag := field.Tag.Get("flag") - if flag == "" || flag == "-" { - continue - } - - value := v.Field(i).Interface() - - if field.Type.Kind() == reflect.Bool && field.Name[:2] == "No" && flag[:3] != "no-" { - value = !value.(bool) - } - - if field.Type.Kind() == reflect.String && reflect.ValueOf(value).IsZero() { - continue - } - - if field.Type.Kind() == reflect.Slice { - for j := 0; j < v.Field(i).Len(); j++ { - flags = append(flags, fmt.Sprintf("--%s=%v", flag, v.Field(i).Index(j))) - } - continue - } - - flags = append(flags, fmt.Sprintf("--%s=%v", flag, value)) - } - - return flags -} diff --git a/pkg/helm/flags_test.go b/pkg/helm/flags_test.go deleted file mode 100644 index da6cf208d7..0000000000 --- a/pkg/helm/flags_test.go +++ /dev/null @@ -1,66 +0,0 @@ -package helm_test - -import ( - "testing" - - "github.com/redpanda-data/helm-charts/pkg/helm" - "github.com/stretchr/testify/require" -) - -type Flags struct { - NoWait bool `flag:"wait"` - NoWaitForJobs bool `flag:"no-wait-for-jobs"` - NotAFlag string - StringFlag string `flag:"string-flag"` - StringArray []string `flag:"string-array"` -} - -func TestToFlags(t *testing.T) { - testCases := []struct { - in Flags - out []string - }{ - { - in: Flags{}, - out: []string{ - "--wait=true", - "--no-wait-for-jobs=false", - }, - }, - { - in: Flags{}, - out: []string{ - "--wait=true", - "--no-wait-for-jobs=false", - }, - }, - { - in: Flags{ - StringFlag: "something", - }, - out: []string{ - "--wait=true", - "--no-wait-for-jobs=false", - "--string-flag=something", - }, - }, - { - in: Flags{ - StringFlag: "something", - StringArray: []string{"1", "2", "3"}, - }, - out: []string{ - "--wait=true", - "--no-wait-for-jobs=false", - "--string-flag=something", - "--string-array=1", - "--string-array=2", - "--string-array=3", - }, - }, - } - - for _, tc := range testCases { - require.Equal(t, tc.out, helm.ToFlags(tc.in)) - } -} diff --git a/pkg/helm/helm.go b/pkg/helm/helm.go deleted file mode 100644 index 4e076d1aa7..0000000000 --- a/pkg/helm/helm.go +++ /dev/null @@ -1,557 +0,0 @@ -package helm - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - "log" - "net/http" - "os" - "os/exec" - "path" - "path/filepath" - "slices" - "strings" - "time" - - "github.com/cockroachdb/errors" - "github.com/redpanda-data/helm-charts/pkg/kube" - "helm.sh/helm/v3/pkg/action" - "helm.sh/helm/v3/pkg/chart/loader" - "helm.sh/helm/v3/pkg/chartutil" - "helm.sh/helm/v3/pkg/cli" - "helm.sh/helm/v3/pkg/cli/values" - "helm.sh/helm/v3/pkg/registry" - "helm.sh/helm/v3/pkg/release" - "helm.sh/helm/v3/pkg/storage" - "helm.sh/helm/v3/pkg/storage/driver" - "k8s.io/client-go/rest" - "sigs.k8s.io/yaml" -) - -type RawYAML []byte - -type Repo struct { - Name string `json:"name"` - URL string `json:"url"` -} - -type Chart struct { - Name string `json:"name"` - Version string `json:"version"` - AppVersion string `json:"app_version"` - Description string `json:"description"` -} - -// ChartLock is a helm lock file for dependencies. -type ChartLock struct { - // Generated is the date the lock file was last generated. - Generated time.Time `json:"generated"` - // Digest is a hash of the dependencies in Chart.yaml. - Digest string `json:"digest"` - // Dependencies is the list of dependencies that this lock file has locked. - Dependencies []*Dependency `json:"dependencies"` -} - -// Dependency describes a chart upon which another chart depends. -type Dependency struct { - // Name is the name of the dependency. - // - // This must mach the name in the dependency's Chart.yaml. - Name string `json:"name"` - // Version is the version (range) of this chart. - // - // A lock file will always produce a single version, while a dependency - // may contain a semantic version range. - Version string `json:"version,omitempty"` - // The URL to the repository. - // - // Appending `index.yaml` to this string should result in a URL that can be - // used to fetch the repository index. - Repository string `json:"repository"` - // A yaml path that resolves to a boolean, used for enabling/disabling charts (e.g. subchart1.enabled ) - Condition string `json:"condition,omitempty"` - // Tags can be used to group charts for enabling/disabling together - Tags []string `json:"tags,omitempty"` - // Enabled bool determines if chart should be loaded - Enabled bool `json:"enabled,omitempty"` - // ImportValues holds the mapping of source values to parent key to be imported. Each item can be a - // string or pair of child/parent sublist items. - ImportValues []interface{} `json:"import-values,omitempty"` - // Alias usable alias to be used for the chart - Alias string `json:"alias,omitempty"` -} - -type Release struct { - Name string `json:"name"` - Namespace string `json:"namespace"` - Revision int `json:"revision"` - DeployedAt time.Time `json:"deployedAt"` - Status string `json:"status"` - Chart string `json:"chart"` - AppVersion string `json:"app_version"` -} - -// Client is a sandboxed programmatic API for the `helm` CLI. -// -// It leverages an isolated HELM_CONFIG_HOME directory to keep operation -// hermetic but shares a global cache to keep network chatter to a minimum. See -// `helm env` for more details. -type Client struct { - env []string - configHome string - config *action.Configuration -} - -type Options struct { - ConfigHome string - KubeConfig *rest.Config -} - -func (o *Options) asEnv() ([]string, error) { - if o.ConfigHome == "" { - var err error - o.ConfigHome, err = os.MkdirTemp(os.TempDir(), "go-helm-client") - if err != nil { - return nil, err - } - } - - kubeConfigPath := "/dev/null" - if o.KubeConfig != nil { - kubeConfigPath = path.Join(o.ConfigHome, "kubeconfig") - if err := kube.WriteToFile(kube.RestToConfig(o.KubeConfig), kubeConfigPath); err != nil { - return nil, err - } - } - - return []string{ - fmt.Sprintf("KUBECONFIG=%s", kubeConfigPath), - fmt.Sprintf("HELM_CONFIG_HOME=%s", path.Join(o.ConfigHome, "helm-config")), - }, nil -} - -// New creates a new helm client. -func New(opts Options) (*Client, error) { - // Clone the host environment. - env, err := opts.asEnv() - if err != nil { - return nil, err - } - - registryClient, err := registry.NewClient() - if err != nil { - return nil, errors.WithStack(err) - } - - return &Client{ - config: &action.Configuration{ - // NB: Currently, only `helm template` is "in process" as opposed - // to sub processing everything. If anything else is migrated to - // use this configuration, we'll probably want to use the secret - // storage engine for compatibilities with the `helm` CLI. - Releases: storage.Init(driver.NewMemory()), - RegistryClient: registryClient, - }, - configHome: opts.ConfigHome, - env: append(os.Environ(), env...), - }, nil -} - -func (c *Client) GetConfigHome() string { - return c.configHome -} - -func (c *Client) List(ctx context.Context) ([]Release, error) { - stdout, _, err := c.runHelm(ctx, "list", "-A", "--output=json") - if err != nil { - return nil, err - } - - var releases []Release - if err := json.Unmarshal(stdout, &releases); err != nil { - return nil, err - } - return releases, nil -} - -func (c *Client) Get(ctx context.Context, namespace, name string) (Release, error) { - stdout, _, err := c.runHelm(ctx, "get", "metadata", name, "--output=json", "--namespace", namespace) - if err != nil { - return Release{}, err - } - - var release Release - if err := json.Unmarshal(stdout, &release); err != nil { - return Release{}, err - } - return release, nil -} - -func (c *Client) ShowValues(ctx context.Context, chart string, values any) error { - stdout, _, err := c.runHelm(ctx, "show", "values", chart) - if err != nil { - return err - } - return yaml.Unmarshal(stdout, &values) -} - -func (c *Client) GetValues(ctx context.Context, release *Release, values any) error { - stdout, _, err := c.runHelm(ctx, "get", "values", release.Name, "--output=json", "--namespace", release.Namespace) - if err != nil { - return err - } - return json.Unmarshal(stdout, &values) -} - -type InstallOptions struct { - CreateNamespace bool `flag:"create-namespace"` - Name string `flag:"-"` - Namespace string `flag:"namespace"` - Values any `flag:"-"` - Version string `flag:"version"` - NoWait bool `flag:"wait"` - NoWaitForJobs bool `flag:"wait-for-jobs"` - GenerateName bool `flag:"generate-name"` - ValuesFile string `flag:"values"` - Set []string `flag:"set"` -} - -func (c *Client) Install(ctx context.Context, chart string, opts InstallOptions) (Release, error) { - if opts.Name == "" { - opts.GenerateName = true - } - - if opts.Values != nil { - var err error - opts.ValuesFile, err = c.writeValues(opts.Values) - if err != nil { - return Release{}, err - } - } - - args := []string{"install", chart, "--output=json"} - args = append(args, ToFlags(opts)...) - - if opts.Name != "" { - args = slices.Insert(args, 1, opts.Name) - } - - stdout, _, err := c.runHelm(ctx, args...) - if err != nil { - return Release{}, err - } - - // TODO(chrisseto): The result of `helm install` appears to be its own - // unique type. The closest equivalent is `helm get all` but that can't be - // output as JSON. - // For now, we scrape out the name and use `helm get metadata` to return - // consistent information. - var result map[string]any - if err := json.Unmarshal([]byte(stdout), &result); err != nil { - return Release{}, err - } - - return c.Get(ctx, opts.Namespace, result["name"].(string)) -} - -func (c *Client) Uninstall(ctx context.Context, release Release) error { - args := []string{"uninstall", release.Name, fmt.Sprintf("--namespace=%s", release.Namespace), "--wait", "--cascade=foreground"} - - _, _, err := c.runHelm(ctx, args...) - if err != nil { - return err - } - return nil -} - -type TemplateOptions struct { - Name string `flag:"-"` - Namespace string `flag:"namespace"` - Values any `flag:"-"` - Version string `flag:"version"` - GenerateName bool `flag:"generate-name"` - ValuesFile string `flag:"values"` - Set []string `flag:"set"` - SkipTests bool `flag:"skip-tests"` -} - -func (c *Client) Template(ctx context.Context, chart string, opts TemplateOptions) ([]byte, error) { - // NOTE: Unlike other methods, Template calls into helm directly. This is - // to minimize any potential overhead from go/helm/cobra's start up time - // and allow us to be much more aggressive with writing tests through - // Template. - // TODO: Support IsUpgrade and the like and find a nice way to inject a - // fake KubeClient. - client := action.NewInstall(c.config) - - // Options taken, more or less, directly from helm. This make the template - // command not interact with a Kube APIServer. - // https://github.com/helm/helm/blob/51a07e7e78cba05126a84c0d890851d7490d2e20/cmd/helm/template.go#L89-L94 - client.APIVersions = chartutil.DefaultVersionSet - client.ClientOnly = true - client.DryRun = true - client.GenerateName = opts.GenerateName - client.Namespace = opts.Namespace - client.ReleaseName = opts.Name - client.Replace = true // Skips "name" checks. - - if client.Namespace == "" { - client.Namespace = "default" - } - - // Our vendored version of helm has a baked in version of a Kubernetes - // version for use with helm template but it's archaic (1.20 as of - // writing; check chartutil.DefaultCapabilities). - // Bump to some version waaaaaaaaaaaay in the future so we don't have to - // deal with this. - // Running helm install in our integration tests will catch any real issues. - client.KubeVersion = &chartutil.KubeVersion{Version: "v1.99.0", Minor: "99", Major: "1"} - - releaseName, chart, err := client.NameAndChart([]string{opts.Name, chart}) - if err != nil { - return nil, errors.WithStack(err) - } - - // Strange but helm does exactly this. The `client` handles figuring out if - // it needs to generate a name from .ReleaseName and returns it instead of - // storing it. It also reads the release name from .ReleaseName so we have - // to set it ourselves. - client.ReleaseName = releaseName - - chart, err = client.ChartPathOptions.LocateChart(chart, &cli.EnvSettings{ - Debug: true, - }) - if err != nil { - return nil, errors.WithStack(err) - } - - loadedChart, err := loader.Load(chart) - if err != nil { - return nil, errors.WithStack(err) - } - - if err := action.CheckDependencies(loadedChart, loadedChart.Metadata.Dependencies); err != nil { - return nil, errors.WithStack(err) - } - - vOpts := values.Options{Values: opts.Set} - - if opts.Values != nil { - valuesFile, err := c.writeValues(opts.Values) - if err != nil { - return nil, errors.WithStack(err) - } - - vOpts.ValueFiles = append(vOpts.ValueFiles, valuesFile) - } - - if opts.ValuesFile != "" { - vOpts.ValueFiles = append(vOpts.ValueFiles, opts.ValuesFile) - } - - values, err := vOpts.MergeValues(nil /* getter.Providers that's not used unless a URL is provided. */) - if err != nil { - return nil, errors.WithStack(err) - } - - rel, err := client.RunWithContext(ctx, loadedChart, values) - if err != nil { - return nil, err - } - - manifest := bytes.NewBuffer([]byte(rel.Manifest)) - - // Hooks are not included in .Manifest and need to be injected into our - // output. We copy helm's convention of adding a "Source:" header to each - // file. - for _, hook := range rel.Hooks { - if opts.SkipTests && slices.Contains(hook.Events, release.HookTest) { - continue - } - fmt.Fprintf(manifest, "---\n# Source: %s\n%s\n", hook.Path, hook.Manifest) - } - - return manifest.Bytes(), nil -} - -func (c *Client) DownloadFile(ctx context.Context, url, filename string) error { - req, err := http.NewRequestWithContext(ctx, "GET", url, nil) - if err != nil { - return err - } - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - filepath := filepath.Join(c.configHome, filename) - out, err := os.Create(filepath) - if err != nil { - return err - } - defer out.Close() - - _, err = io.Copy(out, resp.Body) - return err -} - -type UpgradeOptions struct { - CreateNamespace bool `flag:"create-namespace"` - Install bool `flag:"install"` - Namespace string `flag:"namespace"` - Version string `flag:"version"` - NoWait bool `flag:"wait"` - NoWaitForJobs bool `flag:"wait-for-jobs"` - ReuseValues bool `flag:"reuse-values"` - Values any `flag:"-"` - ValuesFile string `flag:"values"` - Set []string `flag:"set"` -} - -func (c *Client) Upgrade(ctx context.Context, release, chart string, opts UpgradeOptions) (Release, error) { - if opts.Values != nil { - var err error - opts.ValuesFile, err = c.writeValues(opts.Values) - if err != nil { - return Release{}, err - } - } - - args := []string{"upgrade", release, chart, "--output=json"} - args = append(args, ToFlags(opts)...) - - stdout, _, err := c.runHelm(ctx, args...) - if err != nil { - return Release{}, err - } - - // TODO(chrisseto): The result of `helm install` appears to be its own - // unique type. The closest equivalent is `helm get all` but that can't be - // output as JSON. - // For now, we scrape out the name and use `helm get metadata` to return - // consistent information. - var result map[string]any - if err := json.Unmarshal([]byte(stdout), &result); err != nil { - return Release{}, err - } - - return c.Get(ctx, opts.Namespace, result["name"].(string)) -} - -func (c *Client) Test(ctx context.Context, release Release) error { - stdout, _, err := c.runHelm(ctx, "test", release.Name, "--namespace", release.Namespace, "--logs") - return errors.Wrapf(err, "stdout: %s", stdout) -} - -func (c *Client) RepoList(ctx context.Context) ([]Repo, error) { - out, _, err := c.runHelm(ctx, "repo", "list", "--output=json") - if err != nil { - return nil, err - } - - var repos []Repo - if err := json.Unmarshal(out, &repos); err != nil { - return nil, err - } - return repos, nil -} - -func (c *Client) RepoAdd(ctx context.Context, name, url string) error { - _, _, err := c.runHelm(ctx, "repo", "add", name, url) - return err -} - -func (c *Client) Search(ctx context.Context, keyword string) ([]Chart, error) { - out, _, err := c.runHelm(ctx, "search", "repo", keyword, "--output=json") - if err != nil { - return nil, err - } - - var charts []Chart - if err := json.Unmarshal(out, &charts); err != nil { - return nil, err - } - return charts, nil -} - -func (c *Client) DependencyBuild(ctx context.Context, chartDir string) error { - _, _, err := c.runHelmInDir(ctx, chartDir, "dep", "build") - return err -} - -func (c *Client) runHelm(ctx context.Context, args ...string) ([]byte, []byte, error) { - // NB: an empty string will cause os/exec to use it's default of the - // working directory of the calling process. - return c.runHelmInDir(ctx, "", args...) -} - -func (c *Client) runHelmInDir(ctx context.Context, dir string, args ...string) ([]byte, []byte, error) { - var stdout bytes.Buffer - var stderr bytes.Buffer - - log.Printf("Executing: %#v", strings.Join(append([]string{"helm"}, args...), " ")) - cmd := exec.CommandContext(ctx, "helm", args...) - - cmd.Dir = dir - cmd.Env = c.env - cmd.Stderr = &stderr - cmd.Stdout = &stdout - - err := cmd.Run() - return stdout.Bytes(), stderr.Bytes(), errors.Wrapf(err, "stderr: %s", stderr.String()) -} - -// writeValues writes a helm values file to a unique file in HELM_CONFIG_HOME -// and returns the path to the written file. -func (c *Client) writeValues(values any) (string, error) { - valuesFile, err := os.CreateTemp(c.configHome, "values-*.yaml") - if err != nil { - return "", err - } - - valueBytes, ok := values.(RawYAML) - if !ok { - valueBytes, err = yaml.Marshal(values) - if err != nil { - return "", err - } - } - - if _, err := valuesFile.Write(valueBytes); err != nil { - return "", err - } - - if err := valuesFile.Close(); err != nil { - return "", err - } - - return valuesFile.Name(), nil -} - -func GetChartLock(filePath string) (ChartLock, error) { - b, err := os.ReadFile(filePath) - if err != nil { - return ChartLock{}, err - } - - cl := ChartLock{} - err = yaml.Unmarshal(b, &cl) - if err != nil { - return ChartLock{}, err - } - - return cl, nil -} - -func UpdateChartLock(chartLock ChartLock, filepath string) error { - b, err := yaml.Marshal(chartLock) - if err != nil { - return err - } - - return os.WriteFile(filepath, b, 0o644) -} diff --git a/pkg/helm/helm_test.go b/pkg/helm/helm_test.go deleted file mode 100644 index 9c60901a3f..0000000000 --- a/pkg/helm/helm_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package helm_test - -import ( - "path" - "testing" - - "github.com/redpanda-data/helm-charts/pkg/helm" - "github.com/redpanda-data/helm-charts/pkg/testutil" - "github.com/stretchr/testify/require" -) - -func TestHelm(t *testing.T) { - ctx := testutil.Context(t) - - configDir := path.Join(t.TempDir(), "helm-1") - - c, err := helm.New(helm.Options{ConfigHome: configDir}) - require.NoError(t, err) - - repos := []helm.Repo{ - {Name: "redpanda", URL: "https://charts.redpanda.com"}, - {Name: "jetstack", URL: "https://charts.jetstack.io"}, - } - - listedRepos, err := c.RepoList(ctx) - require.NoError(t, err) - require.Len(t, listedRepos, 0) - - for _, repo := range repos { - require.NoError(t, c.RepoAdd(ctx, repo.Name, repo.URL)) - } - - listedRepos, err = c.RepoList(ctx) - require.NoError(t, err) - require.ElementsMatch(t, repos, listedRepos) - - charts, err := c.Search(ctx, "redpanda/redpanda") - require.NoError(t, err) - require.Len(t, charts, 1) - require.Equal(t, "Redpanda is the real-time engine for modern apps.", charts[0].Description) -} diff --git a/pkg/helm/helmtest/helmtest.go b/pkg/helm/helmtest/helmtest.go deleted file mode 100644 index ce052c6ab8..0000000000 --- a/pkg/helm/helmtest/helmtest.go +++ /dev/null @@ -1,133 +0,0 @@ -package helmtest - -import ( - "context" - "testing" - - "github.com/redpanda-data/helm-charts/pkg/helm" - "github.com/redpanda-data/helm-charts/pkg/kube" - "github.com/redpanda-data/helm-charts/pkg/testutil" - "github.com/stretchr/testify/require" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// Env represents a test environment consisting of a Kubernetes cluster, -// helm client, and cert-manager installation. -// -// Env's are expected to be [Setup] infrequently. Ideally, once per test -// package and then reused via [Env.Namespaced] and [testing.T.Run]. -type Env struct { - helm *helm.Client - ctl *kube.Ctl -} - -// Setup creates a new [Env] using whatever cluster is available in KUBECONFIG. -func Setup(t *testing.T) *Env { - ctl, err := kube.FromEnv() - require.NoError(t, err) - - client, err := helm.New(helm.Options{ - KubeConfig: ctl.RestConfig(), - ConfigHome: testutil.TempDir(t), - }) - require.NoError(t, err) - - require.NoError(t, ensureCertManager(context.Background(), client)) - - return &Env{ctl: ctl, helm: client} -} - -func (e *Env) Ctl() *kube.Ctl { - return e.ctl -} - -// Namespaced creates a sandboxed Kubernetes namespace that will be cleaned up -// at the end of `t`. Usage: -// -// t.Run('subtest', func(t *testing.T) { -// env := env.Namespaced(t) -// // Testing.... -// }) -func (e *Env) Namespaced(t *testing.T) *NamespacedEnv { - ns := tempNamespace(t, context.Background(), e.ctl) - t.Logf("using namespace %q", ns.Name) - return &NamespacedEnv{t: t, env: e, namespace: ns} -} - -// NamespacedEnv is effectively an [Env] that is bound to a specific Kubernetes -// Namespace. -// It exposes convenience methods for common operations without the need to set -// .Namespace or check errors. -type NamespacedEnv struct { - t *testing.T - env *Env - namespace *corev1.Namespace -} - -func (e *NamespacedEnv) Namespace() string { - return e.namespace.Name -} - -func (e *NamespacedEnv) Ctl() *kube.Ctl { - return e.env.Ctl() -} - -func (e *NamespacedEnv) Install(ctx context.Context, chart string, opts helm.InstallOptions) helm.Release { - require.False(e.t, opts.CreateNamespace, ".CreateNamespace may not be specified") - - opts.Namespace = e.namespace.Name - - release, err := e.env.helm.Install(ctx, chart, opts) - require.NoError(e.t, err) - - return release -} - -func (e *NamespacedEnv) Test(release helm.Release) { - require.NoError(e.t, e.env.helm.Test(context.Background(), release)) -} - -func (e *NamespacedEnv) Upgrade(chart string, release helm.Release, opts helm.UpgradeOptions) helm.Release { - require.Zero(e.t, opts.Namespace, ".Namespace may not be specified") - require.False(e.t, opts.CreateNamespace, ".CreateNamespace may not be specified") - - opts.Namespace = e.namespace.Name - - release, err := e.env.helm.Upgrade(context.Background(), release.Name, chart, opts) - require.NoError(e.t, err) - return release -} - -func tempNamespace(t *testing.T, ctx context.Context, ctl *kube.Ctl) *corev1.Namespace { - ns, err := kube.Create(ctx, ctl, corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - GenerateName: "test-", - }, - Spec: corev1.NamespaceSpec{}, - }) - require.NoError(t, err) - - testutil.MaybeCleanup(t, func() { - require.NoError(t, kube.Delete[corev1.Namespace](ctx, ctl, kube.AsKey(ns))) - }) - - return ns -} - -func ensureCertManager(ctx context.Context, client *helm.Client) error { - if err := client.RepoAdd(ctx, "jetstack", "https://charts.jetstack.io"); err != nil { - return err - } - - _, err := client.Upgrade(ctx, "cert-manager", "jetstack/cert-manager", helm.UpgradeOptions{ - Install: true, - Version: "v1.14.2", - Namespace: "cert-manager", - CreateNamespace: true, - Values: map[string]any{ - "installCRDs": true, - }, - }) - return err -} diff --git a/pkg/helm/util.go b/pkg/helm/util.go deleted file mode 100644 index b08b44e5b9..0000000000 --- a/pkg/helm/util.go +++ /dev/null @@ -1,37 +0,0 @@ -package helm - -import ( - "fmt" - "os" - - "helm.sh/helm/v3/pkg/cli/values" -) - -// MergeYAMLValues uses helm's values package to merge a collection of YAML -// values in accordance with helm's merging logic. -// Sadly, their merging logic is not exported nor can it accept raw JSON/YAML -// so we dump files on disk. -func MergeYAMLValues(tempDir string, vs ...[]byte) (map[string]any, error) { - if tempDir == "" { - tempDir = os.TempDir() - } - - var opts values.Options - for i, v := range vs { - file, err := os.CreateTemp(tempDir, fmt.Sprintf("values-%d.yaml", i)) - if err != nil { - return nil, err - } - - if _, err := file.Write(v); err != nil { - return nil, err - } - - if err := file.Close(); err != nil { - return nil, err - } - opts.ValueFiles = append(opts.ValueFiles, file.Name()) - } - - return opts.MergeValues(nil) -} diff --git a/pkg/kube/config.go b/pkg/kube/config.go deleted file mode 100644 index 7c9d2aaee1..0000000000 --- a/pkg/kube/config.go +++ /dev/null @@ -1,55 +0,0 @@ -package kube - -import ( - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" -) - -type ( - Config = clientcmdapi.Config - RESTConfig = rest.Config -) - -var WriteToFile = clientcmd.WriteToFile - -func RestToConfig(cfg *rest.Config) clientcmdapi.Config { - // Thanks to: https://github.com/kubernetes/client-go/issues/711#issuecomment-1666075787 - - clusters := make(map[string]*clientcmdapi.Cluster) - clusters["default-cluster"] = &clientcmdapi.Cluster{ - Server: cfg.Host, - CertificateAuthority: cfg.CAFile, - CertificateAuthorityData: cfg.CAData, - } - - contexts := make(map[string]*clientcmdapi.Context) - contexts["default-context"] = &clientcmdapi.Context{ - Cluster: "default-cluster", - AuthInfo: "default-user", - } - - authinfos := make(map[string]*clientcmdapi.AuthInfo) - authinfos["default-user"] = &clientcmdapi.AuthInfo{ - Token: cfg.BearerToken, - TokenFile: cfg.BearerTokenFile, - ClientCertificateData: cfg.CertData, - ClientCertificate: cfg.CertFile, - ClientKeyData: cfg.KeyData, - ClientKey: cfg.KeyFile, - } - - return clientcmdapi.Config{ - Kind: "Config", - APIVersion: "v1", - Clusters: clusters, - Contexts: contexts, - CurrentContext: "default-context", - AuthInfos: authinfos, - } -} - -func ConfigToRest(cfg Config) (*RESTConfig, error) { - clientConfig := clientcmd.NewNonInteractiveClientConfig(cfg, cfg.CurrentContext, &clientcmd.ConfigOverrides{}, nil) - return clientConfig.ClientConfig() -} diff --git a/pkg/kube/ctl.go b/pkg/kube/ctl.go deleted file mode 100644 index 1877b5b3bc..0000000000 --- a/pkg/kube/ctl.go +++ /dev/null @@ -1,237 +0,0 @@ -package kube - -import ( - "context" - "fmt" - "io" - "net/http" - - "github.com/cockroachdb/errors" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" - "k8s.io/client-go/tools/portforward" - "k8s.io/client-go/tools/remotecommand" - "k8s.io/client-go/transport/spdy" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -type ( - Object = client.Object - ObjectKey = client.ObjectKey -) - -// FromEnv returns a [Ctl] for the default context in $KUBECONFIG. -func FromEnv() (*Ctl, error) { - loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() - configOverrides := &clientcmd.ConfigOverrides{} - kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides) - config, err := kubeConfig.ClientConfig() - if err != nil { - return nil, err - } - - c, err := client.New(config, client.Options{}) - if err != nil { - return nil, err - } - - return &Ctl{ - config: config, - client: c, - }, nil -} - -func FromConfig(cfg Config) (*Ctl, error) { - rest, err := ConfigToRest(cfg) - if err != nil { - return nil, err - } - return FromRESTConfig(rest) -} - -func FromRESTConfig(cfg *RESTConfig) (*Ctl, error) { - c, err := client.New(cfg, client.Options{}) - if err != nil { - return nil, err - } - - return &Ctl{config: cfg, client: c}, nil -} - -// Ctl is a Kubernetes client inspired by the shape of the `kubectl` CLI with a -// focus on being ergonomic. -type Ctl struct { - config *rest.Config - client client.Client -} - -// RestConfig returns a deep copy of the [rest.Config] used by this [Ctl]. -func (c *Ctl) RestConfig() *rest.Config { - return rest.CopyConfig(c.config) -} - -// Get fetches the latest state of an object into `obj` from Kubernetes. -// Usage: -// -// var pod corev1.Pod -// ctl.Get(ctx, kube.ObjectKey{Namespace: "", Name:""}, &pod) -func (c *Ctl) Get(ctx context.Context, key ObjectKey, obj Object) error { - if err := c.client.Get(ctx, key, obj); err != nil { - return errors.WithStack(err) - } - return nil -} - -func (c *Ctl) Create(ctx context.Context, obj Object) error { - if err := c.client.Create(ctx, obj); err != nil { - return errors.WithStack(err) - } - return nil -} - -func (c *Ctl) Delete(ctx context.Context, obj Object) error { - if err := c.client.Delete(ctx, obj); err != nil { - return errors.WithStack(err) - } - return nil -} - -type ExecOptions struct { - Container string - Command []string - Stdin io.Reader - Stdout io.Writer - Stderr io.Writer -} - -// Exec runs `kubectl exec` on the given Pod in the style of [exec.Command]. -func (c *Ctl) Exec(ctx context.Context, pod *corev1.Pod, opts ExecOptions) error { - if opts.Container == "" { - opts.Container = pod.Spec.Containers[0].Name - } - - // Apparently, nothing in the k8s SDK, except exec'ing, uses RESTClientFor. - // RESTClientFor checks for GroupVersion and NegotiatedSerializer which are - // never set by the config loading tool chain. - // The .APIPath setting was a random shot in the dark that happened to work... - // Pulled from https://github.com/kubernetes/kubectl/blob/acf4a09f2daede8fdbf65514ade9426db0367ed3/pkg/cmd/util/kubectl_match_version.go#L115 - cfg := c.RestConfig() - cfg.APIPath = "/api" - cfg.GroupVersion = &schema.GroupVersion{Version: "v1"} - cfg.NegotiatedSerializer = scheme.Codecs.WithoutConversion() - restClient, err := rest.RESTClientFor(cfg) - if err != nil { - return errors.WithStack(err) - } - - // Inspired by https://github.com/kubernetes/kubectl/blob/acf4a09f2daede8fdbf65514ade9426db0367ed3/pkg/cmd/exec/exec.go#L388 - req := restClient.Post(). - Resource("pods"). - Name(pod.Name). - Namespace(pod.Namespace). - SubResource("exec") - - req.VersionedParams(&corev1.PodExecOptions{ - Container: opts.Container, - Command: opts.Command, - Stdin: opts.Stdin != nil, - Stdout: opts.Stdout != nil, - Stderr: opts.Stderr != nil, - TTY: false, - }, runtime.NewParameterCodec(c.client.Scheme())) - - // TODO(chrisseto): SPDY is reported to be deprecated but - // NewWebSocketExecutor doesn't appear to work in our version of KinD. - exec, err := remotecommand.NewSPDYExecutor(c.config, "POST", req.URL()) - // exec, err := remotecommand.NewWebSocketExecutor(c.config, "GET", req.URL().String()) - if err != nil { - return errors.WithStack(err) - } - - return exec.StreamWithContext(ctx, remotecommand.StreamOptions{ - Stderr: opts.Stderr, - Stdout: opts.Stdout, - Stdin: opts.Stdin, - }) -} - -func (c *Ctl) PortForward(ctx context.Context, pod *corev1.Pod, out, errOut io.Writer) ([]portforward.ForwardedPort, func(), error) { - // Apparently, nothing in the k8s SDK, except exec'ing, uses RESTClientFor. - // RESTClientFor checks for GroupVersion and NegotiatedSerializer which are - // never set by the config loading tool chain. - // The .APIPath setting was a random shot in the dark that happened to work... - // Pulled from https://github.com/kubernetes/kubectl/blob/acf4a09f2daede8fdbf65514ade9426db0367ed3/pkg/cmd/util/kubectl_match_version.go#L115 - cfg := c.RestConfig() - cfg.APIPath = "/api" - cfg.GroupVersion = &schema.GroupVersion{Version: "v1"} - cfg.NegotiatedSerializer = scheme.Codecs.WithoutConversion() - restClient, err := rest.RESTClientFor(cfg) - if err != nil { - return nil, nil, errors.WithStack(err) - } - - // Inspired by https://github.com/kubernetes/kubectl/blob/acf4a09f2daede8fdbf65514ade9426db0367ed3/pkg/cmd/portforward/portforward.go#L410-L416 - req := restClient.Post(). - Resource("pods"). - Namespace(pod.Namespace). - Name(pod.Name). - SubResource("portforward") - - transport, upgrader, err := spdy.RoundTripperFor(cfg) - if err != nil { - return nil, nil, errors.WithStack(err) - } - - stopChan := make(chan struct{}) - readyChan := make(chan struct{}) - - dialer := spdy.NewDialer(upgrader, &http.Client{Transport: transport}, "POST", req.URL()) - - var ports []string - for _, container := range pod.Spec.Containers { - for _, port := range container.Ports { - // port forward and spdy does not handle UDP connection correctly - // - // Reference - // https://github.com/kubernetes/kubernetes/issues/47862 - // https://github.com/kubernetes/kubectl/blob/acf4a09f2daede8fdbf65514ade9426db0367ed3/pkg/cmd/portforward/portforward.go#L273-L290 - if port.Protocol != corev1.ProtocolTCP { - continue - } - - ports = append(ports, fmt.Sprintf(":%d", port.ContainerPort)) - } - } - - fw, err := portforward.New(dialer, ports, stopChan, readyChan, out, errOut) - if err != nil { - return nil, nil, errors.WithStack(err) - } - - go func() { - err = fw.ForwardPorts() - if err != nil { - fmt.Fprintf(errOut, "failed while forwaring ports: %v\n", err) - } - }() - - select { - case <-fw.Ready: - case <-ctx.Done(): - } - - p, err := fw.GetPorts() - if err != nil { - return nil, nil, errors.WithStack(err) - } - - return p, func() { - if stopChan != nil { - close(stopChan) - } - }, nil -} diff --git a/pkg/kube/dialer.go b/pkg/kube/dialer.go deleted file mode 100644 index cf1f8918ee..0000000000 --- a/pkg/kube/dialer.go +++ /dev/null @@ -1,421 +0,0 @@ -package kube - -import ( - "context" - "errors" - "fmt" - "io" - "net" - "net/http" - "strconv" - "strings" - "sync" - "sync/atomic" - "time" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/httpstream" - "k8s.io/client-go/rest" - "k8s.io/client-go/transport/spdy" -) - -const ( - defaultClusterDomain = "cluster.local" - defaultNamespace = "default" - svcLabel = "svc" - - portForwardProtocolV1Name = "portforward.k8s.io" -) - -var ( - ErrInvalidPodFQDN = errors.New("invalid pod FQDN") - ErrNoPort = errors.New("no port specified") - - negotiatedSerializer = serializer.NewCodecFactory(runtime.NewScheme()).WithoutConversion() -) - -type refCountedConnection struct { - httpstream.Connection - references int -} - -// PodDialer is a basic port-forwarding dialer that doesn't start -// any local listeners, but returns a net.Conn directly. -type PodDialer struct { - config *rest.Config - clusterDomain string - requestID int - - connections map[types.NamespacedName]*refCountedConnection - mutex sync.RWMutex -} - -// NewPodDialer create a PodDialer. -func NewPodDialer(config *rest.Config) *PodDialer { - return &PodDialer{ - config: config, - clusterDomain: defaultClusterDomain, - connections: make(map[types.NamespacedName]*refCountedConnection), - } -} - -// WithClusterDomain overrides the domain used for FQDN parsing. -func (p *PodDialer) WithClusterDomain(domain string) *PodDialer { - p.clusterDomain = domain - return p -} - -// cleanupConnection should be called via a function callback -// any time that one of its underlying streams is closed -// when it's called, it decrements the reference counted connection -// pruning it from our connection map when its references hit 0. -func (p *PodDialer) cleanupConnection(pod types.NamespacedName) { - p.mutex.Lock() - defer p.mutex.Unlock() - - connection, ok := p.connections[pod] - if !ok { - return - } - - connection.references-- - - if connection.references == 0 { - connection.Close() - - delete(p.connections, pod) - } -} - -// DialContext dials the given pod's service-based DNS address and returns a -// net.Conn that can be used to reach the pod directly. It uses the passed in -// context to close the underlying connection when -func (p *PodDialer) DialContext(ctx context.Context, network string, address string) (net.Conn, error) { - switch network { - case "tcp", "tcp4", "tcp6": - default: - return nil, fmt.Errorf("dialer only supports TCP-based networks: %w", net.UnknownNetworkError(network)) - } - - pod, port, err := p.parseDNS(address) - if err != nil { - return nil, err - } - - p.mutex.Lock() - defer p.mutex.Unlock() - - conn, err := p.connectionForPodLocked(pod) - if err != nil { - return nil, err - } - - p.requestID++ - - headers := http.Header{} - headers.Set(corev1.PortHeader, strconv.Itoa(port)) - headers.Set(corev1.PortForwardRequestIDHeader, strconv.Itoa(p.requestID)) - - headers.Set(corev1.StreamType, corev1.StreamTypeError) - errorStream, err := conn.CreateStream(headers) - if err != nil { - return nil, err - } - - headers.Set(corev1.StreamType, corev1.StreamTypeData) - dataStream, err := conn.CreateStream(headers) - if err != nil { - // close off the error stream that's been opened - errorStream.Reset() - - return nil, err - } - - conn.references++ - onClose := func() { - p.cleanupConnection(pod) - } - - return wrapConn(onClose, network, address, dataStream, errorStream), nil -} - -// parseDNS attempts to determine the intended pod to target, currently the -// following formats are supported for resolution of "service-based" hostnames: -// 1. [pod-name].[service-name].[namespace-name].svc.[cluster-domain] -// 2. [pod-name].[service-name].[namespace-name].svc -// 3. [pod-name].[service-name].[namespace-name] -// -// If no cluster-domain is supplied, the dialer's configured domain is assumed. -// -// No validation is done to ensure that the pod is actually referenced by the -// given service or that the DNS record exists in Kubernetes, instead this assumes -// that things are set up properly in Kubernetes such that the FQDN passed here -// matches Kubernetes' own DNS records and a pod within the cluster would be able -// to resolve the same FQDN to the pod that we do. -// -// These assumptions allow us to use this dialer to issues requests *as if* we are -// in the Kubernetes network even from outside of it (i.e. in tests that attempt to -// connect to a pod at a given hostname). -// -// The implementation of parsing for shorter, non-`svc` suffixed domains does not -// follow the typical service DNS scheme. Rather it allows for the following custom -// pod direct-dialing strategy: -// -// 4. [pod-name].[namespace-name] -// 5. [pod-name] -// -// If no namespace-name is supplied, the default namespace is assumed. -func (p *PodDialer) parseDNS(fqdn string) (types.NamespacedName, int, error) { - var pod types.NamespacedName - - addressPort := strings.Split(fqdn, ":") - if len(addressPort) != 2 { - return pod, 0, ErrNoPort - } - - port, err := strconv.Atoi(addressPort[1]) - if err != nil { - return pod, 0, ErrNoPort - } - - fqdn = addressPort[0] - - // Trim any empty labels as our Helm chart-based - // URLS use FQDNs ending with an empty label - fqdn = strings.TrimSuffix(fqdn, ".") - - isServiceDNS := true - - if strings.Count(fqdn, ".") < 2 { - // we have a direct pod DNS address - isServiceDNS = false - } else { - // we have a service-based DNS address - fqdn = strings.TrimSuffix(fqdn, "."+p.clusterDomain) - fqdn = strings.TrimSuffix(fqdn, "."+svcLabel) - } - - labels := strings.Split(fqdn, ".") - - // since we only dial pods we require 2 labels - // (assuming we're trying to dial a pod in the - // default namespace) or 3 (for a pod outside - // of the default namespace) - switch len(labels) { - case 1: - if !isServiceDNS { - pod.Namespace = defaultNamespace - } else { - return pod, 0, ErrInvalidPodFQDN - } - case 2: - if isServiceDNS { - pod.Namespace = defaultNamespace - } else { - pod.Namespace = labels[1] - } - case 3: - pod.Namespace = labels[2] - default: - return pod, 0, ErrInvalidPodFQDN - } - - pod.Name = labels[0] - - return pod, port, nil -} - -func (p *PodDialer) connectionForPodLocked(pod types.NamespacedName) (*refCountedConnection, error) { - if conn, ok := p.connections[pod]; ok { - return conn, nil - } - - transport, upgrader, err := spdy.RoundTripperFor(p.config) - if err != nil { - return nil, err - } - - cfg := p.config - cfg.APIPath = "/api" - cfg.GroupVersion = &schema.GroupVersion{Version: "v1"} - cfg.NegotiatedSerializer = negotiatedSerializer - restClient, err := rest.RESTClientFor(cfg) - if err != nil { - return nil, err - } - - req := restClient.Post(). - Resource("pods"). - Namespace(pod.Namespace). - Name(pod.Name). - SubResource("portforward") - - dialer := spdy.NewDialer(upgrader, &http.Client{Transport: transport}, http.MethodPost, req.URL()) - conn, protocol, err := dialer.Dial(portForwardProtocolV1Name) - if err != nil { - return nil, err - } - - if protocol != portForwardProtocolV1Name { - if conn != nil { - conn.Close() - } - - return nil, fmt.Errorf("unable to negotiate protocol: client supports %q, server returned %q", portForwardProtocolV1Name, protocol) - } - - refCountedConn := &refCountedConnection{Connection: conn} - - p.connections[pod] = refCountedConn - return refCountedConn, nil -} - -type conn struct { - dataStream httpstream.Stream - errorStream httpstream.Stream - network string - remote string - onClose func() - - errCh chan error - closed atomic.Bool -} - -var _ net.Conn = (*conn)(nil) - -func wrapConn(onClose func(), network, remote string, s, err httpstream.Stream) *conn { - c := &conn{ - dataStream: s, - errorStream: err, - network: network, - remote: remote, - onClose: onClose, - errCh: make(chan error, 1), - } - - go c.pollErrors() - - return c -} - -func (c *conn) pollErrors() { - defer c.Close() - - data, err := io.ReadAll(c.errorStream) - if err != nil { - c.writeError(err) - return - } - - if len(data) != 0 { - c.writeError(fmt.Errorf("received error message from error stream: %s", string(data))) - return - } -} - -func (c *conn) writeError(err error) { - select { - case c.errCh <- err: - default: - } -} - -func (c *conn) checkError() error { - select { - case err := <-c.errCh: - return err - default: - if c.closed.Load() { - return net.ErrClosed - } - return nil - } -} - -func (c *conn) Read(data []byte) (int, error) { - if err := c.checkError(); err != nil { - return 0, err - } - - n, err := c.dataStream.Read(data) - - // prioritize any sort of checks propagated on - // the error stream - if err := c.checkError(); err != nil { - return n, err - } - return n, err -} - -func (c *conn) Write(b []byte) (int, error) { - if err := c.checkError(); err != nil { - return 0, err - } - - n, err := c.dataStream.Write(b) - - // prioritize any sort of checks propagated on - // the error stream - if err := c.checkError(); err != nil { - return n, err - } - return n, err -} - -func (c *conn) Close() error { - // make Close idempotent since we may close off - // the stream when a context is canceled but also - // may have had Close called manually - if !c.closed.CompareAndSwap(false, true) { - return nil - } - - // call our onClose cleanup handler - defer c.onClose() - - // closing the underlying connection should cause - // our error stream reading routine to stop - c.errorStream.Reset() - closeErr := c.dataStream.Reset() - - // prioritize any sort of checks propagated on - // the error stream - if err := c.checkError(); err != nil { - if !errors.Is(err, net.ErrClosed) { - return err - } - } - return closeErr -} - -func (c *conn) SetDeadline(t time.Time) error { - return c.dataStream.(net.Conn).SetDeadline(t) -} - -func (c *conn) SetReadDeadline(t time.Time) error { - return c.dataStream.(net.Conn).SetReadDeadline(t) -} - -func (c *conn) SetWriteDeadline(t time.Time) error { - return c.dataStream.(net.Conn).SetWriteDeadline(t) -} - -func (c *conn) LocalAddr() net.Addr { - return addr{c.network, "localhost:0"} -} - -func (c *conn) RemoteAddr() net.Addr { - return addr{c.network, c.remote} -} - -type addr struct { - Net string - Addr string -} - -func (a addr) Network() string { return a.Net } -func (a addr) String() string { return a.Addr } diff --git a/pkg/kube/dialer_test.go b/pkg/kube/dialer_test.go deleted file mode 100644 index 2cfc2bf0de..0000000000 --- a/pkg/kube/dialer_test.go +++ /dev/null @@ -1,185 +0,0 @@ -package kube - -import ( - "context" - "crypto/tls" - "io" - "net" - "net/http" - "testing" - "time" - - "github.com/stretchr/testify/require" - "github.com/testcontainers/testcontainers-go/modules/k3s" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/tools/clientcmd" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -func TestDialer(t *testing.T) { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - defer cancel() - - container, err := k3s.Run(ctx, "rancher/k3s:v1.27.1-k3s1") - require.NoError(t, err) - t.Cleanup(func() { - container.Terminate(context.Background()) - }) - - config, err := container.GetKubeConfig(ctx) - require.NoError(t, err) - restcfg, err := clientcmd.RESTConfigFromKubeConfig(config) - require.NoError(t, err) - s := runtime.NewScheme() - require.NoError(t, clientgoscheme.AddToScheme(s)) - client, err := client.New(restcfg, client.Options{Scheme: s}) - require.NoError(t, err) - - pod := &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "default", - Labels: map[string]string{ - "service": "label", - }, - }, - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - { - Image: "caddy", - Name: "caddy", - Command: []string{ - "caddy", - }, - Args: []string{ - "file-server", - "--domain", - // use localhost so we don't reach out to an - // ACME server - "localhost", - }, - Ports: []corev1.ContainerPort{{ - Name: "http", - ContainerPort: 80, - }, { - Name: "https", - ContainerPort: 443, - }}, - }, - }, - }, - } - err = client.Create(ctx, pod) - require.NoError(t, err) - - service := &corev1.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: "service", - Namespace: "default", - }, - Spec: corev1.ServiceSpec{ - Selector: map[string]string{ - "service": "label", - }, - Ports: []corev1.ServicePort{{ - Name: "http", - Port: 8080, - }}, - }, - } - err = client.Create(ctx, service) - require.NoError(t, err) - - require.Eventually(t, func() bool { - var ready corev1.Pod - err := client.Get(ctx, types.NamespacedName{Name: pod.Name, Namespace: pod.Namespace}, &ready) - if err != nil { - return false - } - - return ready.Status.Phase == corev1.PodRunning - }, 30*time.Second, 10*time.Millisecond) - - dialer := NewPodDialer(restcfg) - // Set the `ServerName` to match what Caddy generates for the localhost domain, - // otherwise it fails due to an SNI mismatch. - tlsConfig := &tls.Config{InsecureSkipVerify: true, ServerName: "localhost"} - httpClient := &http.Client{ - Transport: &http.Transport{ - TLSClientConfig: tlsConfig, - DialContext: func(ctx context.Context, network string, address string) (net.Conn, error) { - conn, err := dialer.DialContext(ctx, network, address) - if err != nil { - return nil, err - } - - // add in some deadline calls to make sure we don't panic/error - - if err := conn.SetReadDeadline(time.Now().Add(1 * time.Minute)); err != nil { - return nil, err - } - - if err := conn.SetWriteDeadline(time.Now().Add(1 * time.Minute)); err != nil { - return nil, err - } - - if err := conn.SetDeadline(time.Now().Add(1 * time.Minute)); err != nil { - return nil, err - } - - return conn, nil - }, - }, - } - - for _, host := range []string{ - // http service-based DNS - "http://name.service.default.svc.cluster.local", - "http://name.service.default.svc", - "http://name.service.default", - // https pod-based DNS - "http://name.default", - "http://name", - // https service-based DNS - "https://name.service.default.svc.cluster.local", - "https://name.service.default.svc", - "https://name.service.default", - // https pod-based DNS - "https://name.default", - "https://name", - // trailing dots - "http://name.service.default.svc.cluster.local.", - } { - t.Run(host, func(t *testing.T) { - // Test the pooling behavior of HTTPClient by making requests to - // the same hosts a few times. - for i := 0; i < 5; i++ { - func() { - // Run in a closure so we have a context scoped to the life - // time of each request we make, which is distinct from the - // lifetime of the connection due to http.Transport's - // connection pooling. - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - req, err := http.NewRequestWithContext(ctx, http.MethodGet, host, nil) - require.NoError(t, err) - - resp, err := httpClient.Do(req) - require.NoError(t, err) - - defer resp.Body.Close() - - _, err = io.ReadAll(resp.Body) - require.NoError(t, err) - - require.Equal(t, http.StatusOK, resp.StatusCode) - }() - } - }) - } -} diff --git a/pkg/kube/generics.go b/pkg/kube/generics.go deleted file mode 100644 index 705d8e612f..0000000000 --- a/pkg/kube/generics.go +++ /dev/null @@ -1,59 +0,0 @@ -package kube - -import ( - "context" - - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// ObjectList is a generic equivalent of [ObjectList]. -type ObjectList[T any] interface { - client.ObjectList - *T -} - -// AddrofObject is a helper type constraint for accepting a struct value that -// implements the Object interface. -type AddrofObject[T any] interface { - *T - client.Object -} - -// List is a generic equivalent of [Ctl.List]. -func List[T any, L ObjectList[T]](ctx context.Context, ctl *Ctl, opts ...client.ListOption) (*T, error) { - var list T - if err := ctl.client.List(ctx, L(&list), opts...); err != nil { - return nil, err - } - return &list, nil -} - -// Get is a generic equivalent of [Ctl.Get]. -func Get[T any, PT AddrofObject[T]](ctx context.Context, ctl *Ctl, key ObjectKey) (*T, error) { - var obj T - if err := ctl.client.Get(ctx, key, PT(&obj)); err != nil { - return nil, err - } - return &obj, nil -} - -// Get is a generic equivalent of [Ctl.Create]. -func Create[T any, PT AddrofObject[T]](ctx context.Context, ctl *Ctl, obj T) (*T, error) { - if err := ctl.Create(ctx, PT(&obj)); err != nil { - return nil, err - } - return &obj, nil -} - -// Get is a generic equivalent of [Ctl.Delete]. -func Delete[T any, PT AddrofObject[T]](ctx context.Context, ctl *Ctl, key ObjectKey) error { - obj := PT(new(T)) - obj.SetName(key.Name) - obj.SetNamespace(key.Namespace) - - return ctl.client.Delete(ctx, obj) -} - -func AsKey(obj Object) ObjectKey { - return ObjectKey{Namespace: obj.GetNamespace(), Name: obj.GetName()} -} diff --git a/pkg/kube/kubetest/kubetest.go b/pkg/kube/kubetest/kubetest.go deleted file mode 100644 index 888fb9195e..0000000000 --- a/pkg/kube/kubetest/kubetest.go +++ /dev/null @@ -1,47 +0,0 @@ -package kubetest - -import ( - "os/exec" - "testing" - "time" - - "github.com/redpanda-data/helm-charts/pkg/kube" - "github.com/stretchr/testify/require" - "sigs.k8s.io/controller-runtime/pkg/envtest" -) - -const controlPlaneVersion = "1.30.x" - -// NewEnv starts a local kubernetes control plane via [envtest.Environment] and -// returns a [kube.Ctl] to access it. The provided [testing.T] will be used to -// shutdown the control plane at the end of the test. -func NewEnv(t *testing.T) *kube.Ctl { - // TODO: Would be nice to instead just import setup-envtest but the package - // isn't exactly friendly to be used as a library. Alternatively, we could - // use nix to provide the etcd and kubeapi-server binaries as that's all - // setup-envtest does. - if _, err := exec.LookPath("setup-envtest"); err != nil { - t.Fatalf("setup-envtest not found in $PATH. Did you forget nix develop?") - } - - stdout, err := exec.Command("setup-envtest", "use", controlPlaneVersion, "-p", "path").CombinedOutput() - require.NoError(t, err) - - env := envtest.Environment{ - BinaryAssetsDirectory: string(stdout), - ControlPlaneStartTimeout: 30 * time.Second, - ControlPlaneStopTimeout: 30 * time.Second, - } - - cfg, err := env.Start() - require.NoError(t, err) - - t.Cleanup(func() { - require.NoError(t, env.Stop()) - }) - - ctl, err := kube.FromRESTConfig(cfg) - require.NoError(t, err) - - return ctl -} diff --git a/pkg/kube/serde.go b/pkg/kube/serde.go deleted file mode 100644 index 2f4142e2f7..0000000000 --- a/pkg/kube/serde.go +++ /dev/null @@ -1,110 +0,0 @@ -package kube - -import ( - "bufio" - "bytes" - "io" - - "github.com/cockroachdb/errors" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/apimachinery/pkg/runtime/serializer/json" - yamlutil "k8s.io/apimachinery/pkg/util/yaml" - clientscheme "k8s.io/client-go/kubernetes/scheme" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/apiutil" - "sigs.k8s.io/yaml" -) - -var ( - NewYAMLFrameReader = json.YAMLFramer.NewFrameReader - NewYAMLFrameWriter = json.YAMLFramer.NewFrameWriter -) - -// EncodeYAML calls [EncodeYAMLInto] with a [bytes.Buffer] and returns the -// resultant bytes. -func EncodeYAML(scheme *runtime.Scheme, objs ...Object) ([]byte, error) { - var b bytes.Buffer - if err := EncodeYAMLInto(NewYAMLFrameWriter(&b), scheme, objs...); err != nil { - return nil, err - } - return b.Bytes(), nil -} - -// EncodeYAMLInto encodes a slice of [Object]s into multi-document YAML and -// writes them to w. -// NOTE: .TypeMeta of all provided objects WILL BE SET BY THIS FUNCTION. -func EncodeYAMLInto(w io.Writer, scheme *runtime.Scheme, objs ...Object) error { - if scheme == nil { - scheme = clientscheme.Scheme - } - - serializer := json.NewYAMLSerializer(json.DefaultMetaFactory, scheme, scheme) - - w = NewYAMLFrameWriter(w) - - for _, obj := range objs { - gvk, err := apiutil.GVKForObject(obj, scheme) - if err != nil { - return errors.WithStack(err) - } - - obj.GetObjectKind().SetGroupVersionKind(gvk) - - if err := serializer.Encode(obj, w); err != nil { - return errors.WithStack(err) - } - } - - return nil -} - -// DecodeYAML calls [DecodeYAMLFrom] with a [bytes.Reader]. -func DecodeYAML(manifest []byte, scheme *runtime.Scheme) ([]Object, error) { - return DecodeYAMLFrom(bytes.NewReader(manifest), scheme) -} - -// DecodeYAMLFrom decodes a multi-document YAML into a slice of concretely -// types [kube.Object]s. -// To appropriately decode, a scheme that's knowledgable of all the provided -// types must be provided. If none is provided, the scheme from Kubernetes' go -// client will be used. -func DecodeYAMLFrom(in io.Reader, scheme *runtime.Scheme) ([]Object, error) { - if scheme == nil { - scheme = clientscheme.Scheme - } - - reader := yamlutil.NewYAMLReader(bufio.NewReader(in)) - decoder := serializer.NewCodecFactory(scheme).UniversalDeserializer() - - var objects []client.Object - - for { - doc, err := reader.Read() - if err == io.EOF { - return objects, nil - } - - if err != nil { - return nil, err - } - - obj, _, err := decoder.Decode(doc, nil, nil) - if err != nil { - // Special case to work around an issue with helm outputs. There can be empty YAML docs in the form: - // --- - // # Source: .... - // --- - // Parsing these docs as YAML will result in a nil value. If we - // can't decode a k8s object and the YAML is otherwise parsed as - // nil, skip the document. - var x any - if yaml.Unmarshal(doc, &x) == nil && x == nil { - continue - } - return nil, err - } - - objects = append(objects, obj.(Object)) - } -} diff --git a/pkg/kube/serde_test.go b/pkg/kube/serde_test.go deleted file mode 100644 index 2cc60d8d14..0000000000 --- a/pkg/kube/serde_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package kube_test - -import ( - "testing" - - "github.com/redpanda-data/helm-charts/pkg/kube" - "github.com/stretchr/testify/require" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - clientscheme "k8s.io/client-go/kubernetes/scheme" - "k8s.io/utils/ptr" -) - -func TestEncodeDecode(t *testing.T) { - objs := []kube.Object{ - &corev1.Pod{Spec: corev1.PodSpec{DNSPolicy: corev1.DNSClusterFirst}}, - &corev1.Service{Spec: corev1.ServiceSpec{ClusterIP: "127.0.0.1"}}, - &appsv1.StatefulSet{Spec: appsv1.StatefulSetSpec{Replicas: ptr.To[int32](10)}}, - &appsv1.Deployment{Spec: appsv1.DeploymentSpec{Paused: true}}, - } - - encoded, err := kube.EncodeYAML(clientscheme.Scheme, objs...) - require.NoError(t, err) - - decoded, err := kube.DecodeYAML(encoded, nil) - require.NoError(t, err) - - require.IsType(t, &corev1.Pod{}, decoded[0]) - require.IsType(t, &corev1.Service{}, decoded[1]) - require.IsType(t, &appsv1.StatefulSet{}, decoded[2]) - require.IsType(t, &appsv1.Deployment{}, decoded[3]) - require.Equal(t, objs, decoded) -} diff --git a/pkg/lint/lint_test.go b/pkg/lint/lint_test.go deleted file mode 100644 index 7311f45d52..0000000000 --- a/pkg/lint/lint_test.go +++ /dev/null @@ -1,140 +0,0 @@ -package lint - -import ( - "bytes" - "fmt" - "io/fs" - "os" - "testing" - - "github.com/redpanda-data/helm-charts/charts/redpanda" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "sigs.k8s.io/yaml" -) - -const tagURL = "https://github.com/redpanda-data/helm-charts/releases/tag/" - -type ChartYAML struct { - Version string `json:"version"` - AppVersion string `json:"appVersion"` - Annotations map[string]string `json:"annotations"` -} - -func TestChartYAMLVersions(t *testing.T) { - chartYAMLs, err := fs.Glob(os.DirFS("../.."), "charts/*/Chart.yaml") - require.NoError(t, err) - - changelog, err := os.ReadFile("../../CHANGELOG.md") - require.NoError(t, err) - - for _, chartYAML := range chartYAMLs { - chartBytes, err := os.ReadFile("../../" + chartYAML) - require.NoError(t, err) - - var chart map[string]any - require.NoError(t, yaml.Unmarshal(chartBytes, &chart)) - - chartName := chart["name"].(string) - chartVersion := chart["version"].(string) - - releaseHeader := fmt.Sprintf("### [%s](%s%s-%s)", chartVersion, tagURL, chartName, chartVersion) - - // require.Contains is noisy with a large file. Fallback to - // require.True for friendlier messages. - assert.Truef( - t, - bytes.Contains(changelog, []byte(releaseHeader)), - "CHANGELOG.md is missing the release header for %s %s\nDid you forget to add it?\n%s", - chartName, - chartVersion, - releaseHeader, - ) - } -} - -func TestOperatorArtifactHubImages(t *testing.T) { - const operatorRepo = "docker.redpanda.com/redpandadata/redpanda-operator" - const configuratorRepo = "docker.redpanda.com/redpandadata/configurator" - - chartBytes, err := os.ReadFile("../../charts/operator/Chart.yaml") - require.NoError(t, err) - - var chart ChartYAML - require.NoError(t, yaml.Unmarshal(chartBytes, &chart)) - - assert.Contains( - t, - chart.Annotations["artifacthub.io/images"], - fmt.Sprintf("%s:%s", operatorRepo, chart.AppVersion), - "artifacthub.io/images should be in sync with .appVersion", - ) - - assert.Contains( - t, - chart.Annotations["artifacthub.io/images"], - fmt.Sprintf("%s:%s", configuratorRepo, chart.AppVersion), - "artifacthub.io/images should be in sync with .appVersion", - ) -} - -func TestConnectArtifactHubImages(t *testing.T) { - const connectRepo = "docker.redpanda.com/redpandadata/connect" - - chartBytes, err := os.ReadFile("../../charts/connect/Chart.yaml") - require.NoError(t, err) - - var chart ChartYAML - require.NoError(t, yaml.Unmarshal(chartBytes, &chart)) - - assert.Contains( - t, - chart.Annotations["artifacthub.io/images"], - fmt.Sprintf("%s:%s", connectRepo, chart.AppVersion), - "artifacthub.io/images should be in sync with .appVersion", - ) -} - -func TestRedpandaControllersTag(t *testing.T) { - chartBytes, err := os.ReadFile("../../charts/operator/Chart.yaml") - require.NoError(t, err) - - valuesYAML, err := os.ReadFile("../../charts/redpanda/values.yaml") - require.NoError(t, err) - - var chart map[string]any - require.NoError(t, yaml.Unmarshal(chartBytes, &chart)) - - var values redpanda.Values - require.NoError(t, yaml.Unmarshal(valuesYAML, &values)) - - require.Equal( - t, - chart["appVersion"].(string), - string(values.Statefulset.SideCars.Controllers.Image.Tag), - "the redpanda chart's values.yaml's controllers tag should be equal to the operator chart's appVersion", - ) -} - -func TestOperatorKustomizationTag(t *testing.T) { - chartBytes, err := os.ReadFile("../../charts/operator/Chart.yaml") - require.NoError(t, err) - - var chart map[string]any - require.NoError(t, yaml.Unmarshal(chartBytes, &chart)) - - kustomizationBytes, err := os.ReadFile("../../charts/operator/testdata/kustomization.yaml") - require.NoError(t, err) - - var kustomization map[string]any - require.NoError(t, yaml.Unmarshal(kustomizationBytes, &kustomization)) - - for _, addr := range kustomization["resources"].([]any) { - require.Contains( - t, - addr, - chart["appVersion"].(string), - "testdata kustomization address tag should be equal to the operator chart's appVersion", - ) - } -} diff --git a/pkg/rapidutil/rapidutil.go b/pkg/rapidutil/rapidutil.go deleted file mode 100644 index 287863e460..0000000000 --- a/pkg/rapidutil/rapidutil.go +++ /dev/null @@ -1,59 +0,0 @@ -// Package rapidutil contains utilities for working with the rapid property -// testing library. This primarily entails providing rapid Generators for -// Kubernetes types that would otherwise be considered invalid. -// -// For example, [intstr.IntOrString] may be created with a non existent -// [intstr.Type] without this package. -package rapidutil - -import ( - "reflect" - "time" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/intstr" - "pgregory.net/rapid" -) - -var ( - Quantity = rapid.Custom(func(t *rapid.T) *resource.Quantity { - return resource.NewQuantity(rapid.Int64().Draw(t, "Quantity"), resource.DecimalSI) - }) - - Duration = rapid.Custom(func(t *rapid.T) metav1.Duration { - dur := rapid.Int64().Draw(t, "Duration") - return metav1.Duration{Duration: time.Duration(dur)} - }) - - IntOrString = rapid.Custom(func(t *rapid.T) intstr.IntOrString { - if rapid.Bool().Draw(t, "intorstr") { - return intstr.FromInt32(rapid.Int32().Draw(t, "FromInt32")) - } else { - return intstr.FromString(rapid.StringN(0, 10, 10).Draw(t, "FromString")) - } - }) - - Probe = rapid.Custom(func(t *rapid.T) corev1.Probe { - return corev1.Probe{ - InitialDelaySeconds: rapid.Int32Min(1).Draw(t, "InitialDelaySeconds"), - FailureThreshold: rapid.Int32Min(1).Draw(t, "FailureThreshold"), - PeriodSeconds: rapid.Int32Min(1).Draw(t, "PeriodSeconds"), - TimeoutSeconds: rapid.Int32Min(1).Draw(t, "TimeoutSeconds"), - SuccessThreshold: rapid.Int32Min(1).Draw(t, "SuccessThreshold"), - } - }) - - KubernetesTypes = rapid.MakeConfig{ - Types: map[reflect.Type]*rapid.Generator[any]{ - reflect.TypeFor[int64](): rapid.Int64Range(-99999, 99999).AsAny(), - reflect.TypeFor[any](): rapid.Just[any](nil), // Return nil for all untyped (any, interface{}) fields. - reflect.TypeFor[*metav1.FieldsV1](): rapid.Just[any](nil), // Return nil for K8s accounting fields. - reflect.TypeFor[*resource.Quantity](): Quantity.AsAny(), - reflect.TypeFor[metav1.Duration](): Duration.AsAny(), - reflect.TypeFor[intstr.IntOrString](): IntOrString.AsAny(), - reflect.TypeFor[corev1.Probe](): Probe.AsAny(), - }, - } -) diff --git a/pkg/redpanda/client.go b/pkg/redpanda/client.go deleted file mode 100644 index 17fa003d87..0000000000 --- a/pkg/redpanda/client.go +++ /dev/null @@ -1,394 +0,0 @@ -package redpanda - -import ( - "context" - "crypto/tls" - "crypto/x509" - "encoding/pem" - "errors" - "fmt" - "net" - "net/http" - "slices" - "strings" - "time" - - "github.com/redpanda-data/helm-charts/charts/redpanda" - "github.com/redpanda-data/redpanda-operator/pkg/gotohelm/helmette" - "github.com/twmb/franz-go/pkg/kgo" - "github.com/twmb/franz-go/pkg/sasl" - "github.com/twmb/franz-go/pkg/sasl/scram" - "github.com/twmb/franz-go/pkg/sr" - - "github.com/redpanda-data/common-go/rpadmin" - - corev1 "k8s.io/api/core/v1" -) - -var ( - ErrServerCertificateNotFound = errors.New("server TLS certificate not found") - ErrServerCertificatePublicKeyNotFound = errors.New("server TLS certificate does not contain a public key") - - ErrClientCertificateNotFound = errors.New("client TLS certificate not found") - ErrClientCertificatePublicKeyNotFound = errors.New("client TLS certificate does not contain a public key") - ErrClientCertificatePrivateKeyNotFound = errors.New("client TLS certificate does not contain a private key") - - ErrSASLSecretNotFound = errors.New("users secret not found") - ErrSASLSecretKeyNotFound = errors.New("users secret key not found") - ErrSASLSecretSuperuserNotFound = errors.New("users secret has no users") - - supportedSASLMechanisms = []string{ - "SCRAM-SHA-256", "SCRAM-SHA-512", - } -) - -// DialContextFunc is a function that acts as a dialer for the underlying Kafka client. -type DialContextFunc = func(ctx context.Context, network, host string) (net.Conn, error) - -// AdminClient creates a client to talk to a Redpanda cluster admin API based on its helm -// configuration over its internal listeners. -func AdminClient(dot *helmette.Dot, dialer DialContextFunc) (*rpadmin.AdminAPI, error) { - values := helmette.Unwrap[redpanda.Values](dot.Values) - name := redpanda.Fullname(dot) - domain := redpanda.InternalDomain(dot) - prefix := "http://" - - var tlsConfig *tls.Config - var err error - - if values.Listeners.Admin.TLS.IsEnabled(&values.TLS) { - prefix = "https://" - - tlsConfig, err = tlsConfigFromDot(dot, values.Listeners.Admin.TLS) - if err != nil { - return nil, err - } - } - - var auth rpadmin.Auth - username, password, _, err := authFromDot(dot) - if err != nil { - return nil, err - } - - if username != "" { - auth = &rpadmin.BasicAuth{ - Username: username, - Password: password, - } - } else { - auth = &rpadmin.NopAuth{} - } - - hosts := redpanda.ServerList(values.Statefulset.Replicas, prefix, name, domain, values.Listeners.Admin.Port) - - return rpadmin.NewAdminAPIWithDialer(hosts, auth, tlsConfig, dialer) -} - -// SchemaRegistryClient creates a client to talk to a Redpanda cluster admin API based on its helm -// configuration over its internal listeners. -func SchemaRegistryClient(dot *helmette.Dot, dialer DialContextFunc, opts ...sr.ClientOpt) (*sr.Client, error) { - values := helmette.Unwrap[redpanda.Values](dot.Values) - name := redpanda.Fullname(dot) - domain := redpanda.InternalDomain(dot) - prefix := "http://" - - // These transport values come from the TLS client options found here: - // https://github.com/twmb/franz-go/blob/cea7aa5d803781e5f0162187795482ba1990c729/pkg/sr/clientopt.go#L48-L68 - transport := &http.Transport{ - Proxy: http.ProxyFromEnvironment, - ForceAttemptHTTP2: true, - MaxIdleConns: 100, - MaxIdleConnsPerHost: 100, - DialContext: dialer, - IdleConnTimeout: 90 * time.Second, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, - } - - if dialer == nil { - transport.DialContext = (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - }).DialContext - } - - if values.Listeners.SchemaRegistry.TLS.IsEnabled(&values.TLS) { - prefix = "https://" - - tlsConfig, err := tlsConfigFromDot(dot, values.Listeners.SchemaRegistry.TLS) - if err != nil { - return nil, err - } - transport.TLSClientConfig = tlsConfig - } - - copts := []sr.ClientOpt{sr.HTTPClient(&http.Client{ - Timeout: 5 * time.Second, - Transport: transport, - })} - - username, password, _, err := authFromDot(dot) - if err != nil { - return nil, err - } - - if username != "" { - copts = append(copts, sr.BasicAuth(username, password)) - } - - hosts := redpanda.ServerList(values.Statefulset.Replicas, prefix, name, domain, values.Listeners.SchemaRegistry.Port) - copts = append(copts, sr.URLs(hosts...)) - - // finally, override any calculated client opts with whatever was - // passed in - return sr.NewClient(append(copts, opts...)...) -} - -// KafkaClient creates a client to talk to a Redpanda cluster based on its helm -// configuration over its internal listeners. -func KafkaClient(dot *helmette.Dot, dialer DialContextFunc, opts ...kgo.Opt) (*kgo.Client, error) { - values := helmette.Unwrap[redpanda.Values](dot.Values) - name := redpanda.Fullname(dot) - domain := redpanda.InternalDomain(dot) - - brokers := redpanda.ServerList(values.Statefulset.Replicas, "", name, domain, values.Listeners.Kafka.Port) - - opts = append(opts, kgo.SeedBrokers(brokers...)) - - if values.Listeners.Kafka.TLS.IsEnabled(&values.TLS) { - tlsConfig, err := tlsConfigFromDot(dot, values.Listeners.Kafka.TLS) - if err != nil { - return nil, err - } - - // we can only specify one of DialTLSConfig or Dialer - if dialer == nil { - opts = append(opts, kgo.DialTLSConfig(tlsConfig)) - } else { - opts = append(opts, kgo.Dialer(wrapTLSDialer(dialer, tlsConfig))) - } - } else if dialer != nil { - opts = append(opts, kgo.Dialer(dialer)) - } - - username, password, mechanism, err := authFromDot(dot) - if err != nil { - return nil, err - } - - if username != "" { - opts = append(opts, saslOpt(username, password, mechanism)) - } - - return kgo.NewClient(opts...) -} - -func authFromDot(dot *helmette.Dot) (username string, password string, mechanism string, err error) { - values := helmette.Unwrap[redpanda.Values](dot.Values) - - bootstrapUser := redpanda.SecretBootstrapUser(dot) - - if bootstrapUser != nil { - // if we have any errors grabbing the credentials from the bootstrap user - // then we'll just fallback to the superuser parsing code - user, found, lookupErr := helmette.SafeLookup[corev1.Secret](dot, bootstrapUser.Namespace, bootstrapUser.Name) - if lookupErr == nil && found { - selector := values.Auth.SASL.BootstrapUser.SecretKeySelector(redpanda.Fullname(dot)) - mechanism := values.Auth.SASL.BootstrapUser.GetMechanism() - if data, found := user.Data[selector.Key]; found { - return values.Auth.SASL.BootstrapUser.Username(), string(data), mechanism, nil - } - } - } - - saslUsers := redpanda.SecretSASLUsers(dot) - saslUsersError := func(err error) error { - return fmt.Errorf("error fetching SASL authentication for %s/%s: %w", saslUsers.Namespace, saslUsers.Name, err) - } - - if saslUsers != nil { - // read from the server since we're assuming all the resources - // have already been created - users, found, lookupErr := helmette.SafeLookup[corev1.Secret](dot, saslUsers.Namespace, saslUsers.Name) - if lookupErr != nil { - err = saslUsersError(lookupErr) - return - } - - if !found { - err = saslUsersError(ErrSASLSecretNotFound) - return - } - - data, found := users.Data["users.txt"] - if !found { - err = saslUsersError(ErrSASLSecretKeyNotFound) - return - } - - username, password, mechanism = firstUser(data) - if username == "" { - err = saslUsersError(ErrSASLSecretSuperuserNotFound) - return - } - } - - return -} - -func certificatesFor(dot *helmette.Dot, cert string) (certSecret, certKey, clientSecret string) { - values := helmette.Unwrap[redpanda.Values](dot.Values) - - name := redpanda.Fullname(dot) - - // default to cert manager issued names and tls.crt which is - // where cert-manager outputs the root CA - certKey = corev1.TLSCertKey - certSecret = fmt.Sprintf("%s-%s-root-certificate", name, cert) - clientSecret = fmt.Sprintf("%s-client", name) - - if certificate, ok := values.TLS.Certs[cert]; ok { - // if this references a non-enabled certificate, just return - // the default cert-manager issued names - if certificate.Enabled != nil && !*certificate.Enabled { - return certSecret, certKey, clientSecret - } - - if certificate.ClientSecretRef != nil { - clientSecret = certificate.ClientSecretRef.Name - } - if certificate.SecretRef != nil { - certSecret = certificate.SecretRef.Name - if certificate.CAEnabled { - certKey = "ca.crt" - } - } - } - return certSecret, certKey, clientSecret -} - -func tlsConfigFromDot(dot *helmette.Dot, listener redpanda.InternalTLS) (*tls.Config, error) { - namespace := dot.Release.Namespace - serverName := redpanda.InternalDomain(dot) - - rootCertName, rootCertKey, clientCertName := certificatesFor(dot, listener.Cert) - - serverTLSError := func(err error) error { - return fmt.Errorf("error fetching server root CA %s/%s: %w", namespace, rootCertName, err) - } - clientTLSError := func(err error) error { - return fmt.Errorf("error fetching client certificate default/%s: %w", clientCertName, err) - } - - tlsConfig := &tls.Config{MinVersion: tls.VersionTLS12, ServerName: serverName} - - serverCert, found, lookupErr := helmette.SafeLookup[corev1.Secret](dot, namespace, rootCertName) - if lookupErr != nil { - return nil, serverTLSError(lookupErr) - } - - if !found { - return nil, serverTLSError(ErrServerCertificateNotFound) - } - - serverPublicKey, found := serverCert.Data[rootCertKey] - if !found { - return nil, serverTLSError(ErrServerCertificatePublicKeyNotFound) - } - - block, _ := pem.Decode(serverPublicKey) - serverParsedCertificate, err := x509.ParseCertificate(block.Bytes) - if err != nil { - return nil, serverTLSError(fmt.Errorf("unable to parse public key %w", err)) - } - pool := x509.NewCertPool() - pool.AddCert(serverParsedCertificate) - - tlsConfig.RootCAs = pool - - if listener.RequireClientAuth { - clientCert, found, lookupErr := helmette.SafeLookup[corev1.Secret](dot, namespace, clientCertName) - if lookupErr != nil { - return nil, clientTLSError(lookupErr) - } - - if !found { - return nil, clientTLSError(ErrServerCertificateNotFound) - } - - // we always use tls.crt for client certs - clientPublicKey, found := clientCert.Data[corev1.TLSCertKey] - if !found { - return nil, clientTLSError(ErrClientCertificatePublicKeyNotFound) - } - - clientPrivateKey, found := clientCert.Data[corev1.TLSPrivateKeyKey] - if !found { - return nil, clientTLSError(ErrClientCertificatePrivateKeyNotFound) - } - - clientKey, err := tls.X509KeyPair(clientPublicKey, clientPrivateKey) - if err != nil { - return nil, clientTLSError(fmt.Errorf("unable to parse public and private key %w", err)) - } - - tlsConfig.Certificates = []tls.Certificate{clientKey} - } - - return tlsConfig, nil -} - -func firstUser(data []byte) (user string, password string, mechanism string) { - file := string(data) - - for _, line := range strings.Split(file, "\n") { - tokens := strings.Split(line, ":") - - switch len(tokens) { - case 2: - return tokens[0], tokens[1], redpanda.DefaultSASLMechanism - - case 3: - if !slices.Contains(supportedSASLMechanisms, tokens[2]) { - continue - } - - return tokens[0], tokens[1], tokens[2] - - default: - continue - } - } - - return -} - -func saslOpt(user, password, mechanism string) kgo.Opt { - var m sasl.Mechanism - switch mechanism { - case "SCRAM-SHA-256", "SCRAM-SHA-512": - scram := scram.Auth{User: user, Pass: password} - - switch mechanism { - case "SCRAM-SHA-256": - m = scram.AsSha256Mechanism() - case "SCRAM-SHA-512": - m = scram.AsSha512Mechanism() - } - default: - panic(fmt.Sprintf("unhandled SASL mechanism: %s", mechanism)) - } - - return kgo.SASL(m) -} - -func wrapTLSDialer(dialer DialContextFunc, config *tls.Config) DialContextFunc { - return func(ctx context.Context, network, host string) (net.Conn, error) { - conn, err := dialer(ctx, network, host) - if err != nil { - return nil, err - } - return tls.Client(conn, config), nil - } -} diff --git a/pkg/redpanda/client_test.go b/pkg/redpanda/client_test.go deleted file mode 100644 index e4366797aa..0000000000 --- a/pkg/redpanda/client_test.go +++ /dev/null @@ -1,131 +0,0 @@ -package redpanda - -import ( - "testing" - - "github.com/redpanda-data/helm-charts/charts/redpanda" - "github.com/redpanda-data/helm-charts/pkg/kube" - "github.com/redpanda-data/redpanda-operator/pkg/gotohelm/helmette" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - v1 "k8s.io/api/core/v1" - "k8s.io/utils/ptr" -) - -func TestFirstUser(t *testing.T) { - cases := []struct { - In string - Out [3]string - }{ - { - In: "hello:world:SCRAM-SHA-256", - Out: [3]string{"hello", "world", "SCRAM-SHA-256"}, - }, - { - In: "name:password\n#Intentionally Blank\n", - Out: [3]string{"name", "password", "SCRAM-SHA-512"}, - }, - { - In: "name:password:SCRAM-MD5-999", - Out: [3]string{"", "", ""}, - }, - } - - for _, c := range cases { - user, password, mechanism := firstUser([]byte(c.In)) - assert.Equal(t, [3]string{user, password, mechanism}, c.Out) - } -} - -func TestCertificates(t *testing.T) { - cases := map[string]struct { - Cert *redpanda.TLSCert - CertificateName string - ExpectedRootCertName string - ExpectedRootCertKey string - ExpectedClientCertName string - }{ - "default": { - CertificateName: "default", - ExpectedRootCertName: "redpanda-default-root-certificate", - ExpectedRootCertKey: "tls.crt", - ExpectedClientCertName: "redpanda-client", - }, - "default with non-enabled global cert": { - Cert: &redpanda.TLSCert{ - Enabled: ptr.To(false), - SecretRef: &v1.LocalObjectReference{ - Name: "some-cert", - }, - }, - CertificateName: "default", - ExpectedRootCertName: "redpanda-default-root-certificate", - ExpectedRootCertKey: "tls.crt", - ExpectedClientCertName: "redpanda-client", - }, - "certificate with secret ref": { - Cert: &redpanda.TLSCert{ - SecretRef: &v1.LocalObjectReference{ - Name: "some-cert", - }, - }, - CertificateName: "default", - ExpectedRootCertName: "some-cert", - ExpectedRootCertKey: "tls.crt", - ExpectedClientCertName: "redpanda-client", - }, - "certificate with CA": { - Cert: &redpanda.TLSCert{ - CAEnabled: true, - SecretRef: &v1.LocalObjectReference{ - Name: "some-cert", - }, - }, - CertificateName: "default", - ExpectedRootCertName: "some-cert", - ExpectedRootCertKey: "ca.crt", - ExpectedClientCertName: "redpanda-client", - }, - "certificate with client certificate": { - Cert: &redpanda.TLSCert{ - CAEnabled: true, - SecretRef: &v1.LocalObjectReference{ - Name: "some-cert", - }, - ClientSecretRef: &v1.LocalObjectReference{ - Name: "client-cert", - }, - }, - CertificateName: "default", - ExpectedRootCertName: "some-cert", - ExpectedRootCertKey: "ca.crt", - ExpectedClientCertName: "client-cert", - }, - } - - for name, c := range cases { - t.Run(name, func(t *testing.T) { - certMap := redpanda.TLSCertMap{} - - if c.Cert != nil { - certMap[c.CertificateName] = *c.Cert - } - - dot, err := redpanda.Chart.Dot(kube.Config{}, helmette.Release{ - Name: "redpanda", - Namespace: "redpanda", - Service: "Helm", - }, redpanda.Values{ - TLS: redpanda.TLS{ - Certs: certMap, - }, - }) - require.NoError(t, err) - - actualRootCertName, actualRootCertKey, actualClientCertName := certificatesFor(dot, c.CertificateName) - require.Equal(t, c.ExpectedRootCertName, actualRootCertName) - require.Equal(t, c.ExpectedRootCertKey, actualRootCertKey) - require.Equal(t, c.ExpectedClientCertName, actualClientCertName) - }) - } -} diff --git a/pkg/testutil/testutil.go b/pkg/testutil/testutil.go deleted file mode 100644 index 522fbfa35b..0000000000 --- a/pkg/testutil/testutil.go +++ /dev/null @@ -1,213 +0,0 @@ -package testutil - -import ( - "bytes" - "context" - "flag" - "os" - "slices" - "strings" - "sync" - "testing" - "time" - - "github.com/gonvenience/ytbx" - "github.com/homeport/dyff/pkg/dyff" - "github.com/stretchr/testify/require" - "golang.org/x/tools/txtar" -) - -var ( - retain = flag.Bool("retain", false, "if true, no clean up will be performed.") - update = flag.Bool("update", false, "if true, golden assertions will update the expected file instead of performing an assertion") -) - -// Retain returns the value of the -retain CLI flag. A value of true indicates -// that cleanup actions should be SKIPPED. -func Retain() bool { - return *retain -} - -// Update returns value of the -update CLI flag. A value of true indicates that -// computed files should be updated instead of asserted against. -func Update() bool { - return *update -} - -// TempDir is wrapper around [testing.T.TempDir] that respects [Retain]. -func TempDir(t *testing.T) string { - t.Helper() - if !Retain() { - return t.TempDir() - } - dir, err := os.MkdirTemp(os.TempDir(), t.Name()) - if err != nil { - t.Fatalf("%+v", err) - } - return dir -} - -// MaybeCleanup is helper to invoke `fn` within a [testing.T.Cleanup] closure -// only if [Retain] returns false. -func MaybeCleanup(t *testing.T, fn func()) { - t.Cleanup(func() { - if Retain() { - return - } - fn() - }) -} - -// Context returns a [context.Context] that will cancel 1s before the t's -// deadline. -func Context(t *testing.T) context.Context { - ctx := context.Background() - if timeout, ok := t.Deadline(); ok { - var cancel context.CancelFunc - ctx, cancel = context.WithDeadline(ctx, timeout.Add(-time.Second)) - t.Cleanup(cancel) - } - return ctx -} - -// Writer wraps a [testing.T] to implement [io.Writer] by utilizing -// [testing.T.Log]. -type Writer struct { - T *testing.T -} - -func (w Writer) Write(p []byte) (int, error) { - w.T.Log(string(p)) - return len(p), nil -} - -type GoldenAssertion int - -const ( - YAML GoldenAssertion = iota - JSON - Text - Bytes -) - -func assertGolden(t *testing.T, assertionType GoldenAssertion, path string, expected, actual []byte, update func(string, []byte) error) { - t.Helper() - - if Update() { - require.NoError(t, update(path, actual)) - return - } - - const msg = "Divergence from snapshot at %q. If this change is expected re-run this test with -update." - - switch assertionType { - case Text: - require.Equal(t, string(expected), string(actual), msg, path) - case Bytes: - require.Equal(t, expected, actual, msg, path) - case JSON: - require.JSONEq(t, string(expected), string(actual), msg, path) - case YAML: - actualDocuments, err := ytbx.LoadDocuments(actual) - require.NoError(t, err) - - expectedDocuments, err := ytbx.LoadDocuments(expected) - require.NoError(t, err) - - report, err := dyff.CompareInputFiles( - ytbx.InputFile{Documents: expectedDocuments}, - ytbx.InputFile{Documents: actualDocuments}, - ) - if err != nil { - require.NoError(t, err) - } - - if len(report.Diffs) > 0 { - hr := dyff.HumanReport{Report: report, OmitHeader: true} - - var buf bytes.Buffer - require.NoError(t, hr.WriteReport(&buf)) - - require.Fail(t, buf.String()) - } - - default: - require.Fail(t, "unknown assertion type: %#v", assertionType) - } -} - -// AssertGolden is a helper for "golden" or "snapshot" testing. It asserts -// that `actual`, a serialized YAML document, is equal to the one at `path`. If -// `-update` has been passed to `go test`, `actual` will be written to `path`. -func AssertGolden(t *testing.T, assertionType GoldenAssertion, path string, actual []byte) { - expected, err := os.ReadFile(path) - if !os.IsNotExist(err) { - require.NoError(t, err) - } - - assertGolden(t, assertionType, path, expected, actual, func(s string, b []byte) error { - return os.WriteFile(path, actual, 0o644) - }) -} - -type TxTarGolden struct { - mu sync.Mutex - archive *txtar.Archive -} - -func NewTxTar(t *testing.T, path string) *TxTarGolden { - archive, err := txtar.ParseFile(path) - if os.IsNotExist(err) { - archive = &txtar.Archive{} - } else if err != nil { - require.NoError(t, err) - } - - g := &TxTarGolden{archive: archive} - - if Update() { - t.Cleanup(func() { - require.NoError(t, g.update(path)) - }) - } - - return g -} - -func (g *TxTarGolden) update(path string) error { - g.mu.Lock() - defer g.mu.Unlock() - - slices.SortFunc(g.archive.Files, func(a, b txtar.File) int { - return strings.Compare(a.Name, b.Name) - }) - - return os.WriteFile(path, txtar.Format(g.archive), 0o664) -} - -func (g *TxTarGolden) getFile(path string) *txtar.File { - g.mu.Lock() - defer g.mu.Unlock() - - for i, file := range g.archive.Files { - if file.Name == path { - return &g.archive.Files[i] - } - } - g.archive.Files = append(g.archive.Files, txtar.File{ - Name: path, - Data: []byte{}, - }) - return &g.archive.Files[len(g.archive.Files)-1] -} - -func (g *TxTarGolden) AssertGolden(t *testing.T, assertionType GoldenAssertion, path string, actual []byte) { - t.Helper() - - file := g.getFile(path) - - assertGolden(t, assertionType, path, file.Data, actual, func(s string, b []byte) error { - file.Data = b - return nil - }) -} diff --git a/pkg/tlsgeneration/tls.go b/pkg/tlsgeneration/tls.go deleted file mode 100644 index fa171a67d1..0000000000 --- a/pkg/tlsgeneration/tls.go +++ /dev/null @@ -1,154 +0,0 @@ -package tlsgeneration - -import ( - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/x509" - "crypto/x509/pkix" - "encoding/pem" - "fmt" - "math/big" - "time" - - "github.com/cockroachdb/errors" -) - -func ClientServerCertificate(chartReleaseName, chartReleaseNamespace string) (ca, serverPublic, serverPrivate, clientPublic, clientPrivate []byte, err error) { - now := time.Now() - - rootCASubject := pkix.Name{ - CommonName: "test.example.com", - Organization: []string{"Σ Acme Co"}, - Country: []string{"US"}, - } - root := &x509.Certificate{ - SerialNumber: big.NewInt(1), - Subject: rootCASubject, - NotBefore: now.Add(-time.Hour), - NotAfter: now.Add(time.Hour), - - KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageDigitalSignature, - ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth}, - - BasicConstraintsValid: true, - IsCA: true, - - DNSNames: []string{"test.example.com"}, - EmailAddresses: []string{"gopher@golang.org"}, - } - - priv, err := ecdsa.GenerateKey(elliptic.P384(), rand.Reader) - if err != nil { - err = errors.WithStack(err) - return - } - - derBytes, err := x509.CreateCertificate(rand.Reader, root, root, priv.Public(), priv) - if err != nil { - err = errors.WithStack(err) - return - } - - root, err = x509.ParseCertificate(derBytes) - if err != nil { - err = errors.WithStack(err) - return - } - - ca = pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) - - commonName := fmt.Sprintf("%s.%s.svc.cluster.local", chartReleaseName, chartReleaseNamespace) - shortTestName := fmt.Sprintf("%s.%s", chartReleaseName, chartReleaseNamespace) - serverTemplate := x509.Certificate{ - SerialNumber: big.NewInt(1), - Subject: pkix.Name{ - CommonName: commonName, - Organization: []string{"Σ Acme Co"}, - Country: []string{"US"}, - }, - Issuer: rootCASubject, - NotBefore: now.Add(-time.Hour), - NotAfter: now.Add(time.Hour), - - SignatureAlgorithm: x509.ECDSAWithSHA384, - - KeyUsage: x509.KeyUsageDigitalSignature, - ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth}, - - BasicConstraintsValid: true, - IsCA: false, - - DNSNames: []string{ - shortTestName, - commonName, - fmt.Sprintf("%s.", commonName), - fmt.Sprintf("*.%s", commonName), - fmt.Sprintf("*.%s.", commonName), - }, - EmailAddresses: []string{"gopher@golang.org"}, - } - - privServer, err := ecdsa.GenerateKey(elliptic.P384(), rand.Reader) - if err != nil { - err = errors.WithStack(err) - return - } - - derServerBytes, err := x509.CreateCertificate(rand.Reader, &serverTemplate, root, privServer.Public(), priv) - if err != nil { - err = errors.WithStack(err) - return - } - - privBytes, err := x509.MarshalPKCS8PrivateKey(privServer) - if err != nil { - err = errors.WithStack(err) - return - } - - serverPublic = pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: derServerBytes}) - serverPrivate = pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: privBytes}) - - clientTemplate := x509.Certificate{ - SerialNumber: big.NewInt(1), - Subject: pkix.Name{ - CommonName: "redpanda-client", - Organization: []string{"Σ Acme Co"}, - Country: []string{"US"}, - }, - Issuer: rootCASubject, - NotBefore: now.Add(-time.Hour), - NotAfter: now.Add(time.Hour), - - SignatureAlgorithm: x509.ECDSAWithSHA384, - - KeyUsage: x509.KeyUsageDigitalSignature, - ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth}, - - BasicConstraintsValid: true, - IsCA: false, - - DNSNames: []string{"redpanda-client"}, - EmailAddresses: []string{"gopher@golang.org"}, - } - - privClient, err := ecdsa.GenerateKey(elliptic.P384(), rand.Reader) - if err != nil { - err = errors.WithStack(err) - return - } - - derClientBytes, err := x509.CreateCertificate(rand.Reader, &clientTemplate, root, privClient.Public(), priv) - if err != nil { - err = errors.WithStack(err) - return - } - - privBytes, err = x509.MarshalPKCS8PrivateKey(privClient) - - clientPublic = pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: derClientBytes}) - clientPrivate = pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: privBytes}) - - return -} diff --git a/pkg/valuesutil/fuzz.go b/pkg/valuesutil/fuzz.go deleted file mode 100644 index 96858735d8..0000000000 --- a/pkg/valuesutil/fuzz.go +++ /dev/null @@ -1,228 +0,0 @@ -package valuesutil - -import ( - "encoding/json" - "fmt" - "math" - "math/rand" - "regexp" - "slices" - - "github.com/invopop/jsonschema" - "github.com/lucasjones/reggen" - "k8s.io/utils/ptr" -) - -// Generate generates a go values that is valid for the provided JSON schema. -// It may be used to "fuzz" or property test charts to ensure that all paths -// are appropriately explored and that the schema is well formed for the chart. -func Generate(rng *rand.Rand, s *jsonschema.Schema) any { - g := generator{rng: rng, maxDepth: 15, defs: buildDefMap(s), skipDeprecated: true} - return g.generate(0, s) -} - -func buildDefMap(s *jsonschema.Schema) jsonschema.Definitions { - mapping := map[string]*jsonschema.Schema{"#" + s.Anchor: s} - for def, schema := range s.Definitions { - mapping["#/$defs/"+def] = schema - } - return mapping -} - -type generator struct { - defs jsonschema.Definitions - maxDepth int - rng *rand.Rand - skipDeprecated bool - reggenCache map[string]*reggen.Generator -} - -func (g *generator) generateRegex(pattern string) string { - if g.reggenCache == nil { - g.reggenCache = map[string]*reggen.Generator{} - } - if _, ok := g.reggenCache[pattern]; !ok { - gen := must(reggen.NewGenerator(pattern)) - gen.SetSeed(int64(g.rng.Int())) - g.reggenCache[pattern] = gen - } - return g.reggenCache[pattern].Generate(5) -} - -func (g *generator) generate(depth int, s *jsonschema.Schema) any { - if depth > g.maxDepth { - panic("exceeded max depth") - } - - serialized := string(must(json.Marshal(s))) - - switch { - case s == nil: - panic("Why is s nil?") - - case serialized == "true": - return nil - - case s.Ref != "": - if referred, ok := g.defs[s.Ref]; ok { - return g.generate(depth, referred) - } - panic(fmt.Sprintf("unknown ref: %q", s.Ref)) - - case s.DynamicRef != "": - if referred, ok := g.defs[s.DynamicRef]; ok { - return g.generate(depth, referred) - } - panic(fmt.Sprintf("unknown dynamic ref: %q", s.DynamicRef)) - - case s.Const != nil: - return s.Const - - case len(s.Enum) > 0: - return pickone(g.rng, s.Enum) - - case len(s.OneOf) > 0: - return g.generate(depth, pickone(g.rng, s.OneOf)) - - case len(s.AnyOf) > 0: - return g.generate(depth, pickone(g.rng, s.AnyOf)) - } - - switch s.Type { - case "null": - return nil - - case "boolean": - // Flip a coin. - return g.rng.Intn(2) == 0 - - case "number": - fallthrough - - case "integer": - max, _ := s.Maximum.Int64() - min, _ := s.Minimum.Int64() - if max == 0 { - max = math.MaxInt16 - // TODO this causes too many issues right now as setting a type to - // int doesn't automatically result in the upper and lower - // boundaries being applied. - // max = math.MaxInt64 - } - return int(min) + g.rng.Intn(int(max-min)) - - case "string": - if s.Pattern != "" { - if s.MinLength != nil || s.MaxLength != nil { - panic("unsupported pattern + min/maxlength") - } - return g.generateRegex(s.Pattern) - } - - min := int(ptr.Deref(s.MinLength, 0)) - max := int(ptr.Deref(s.MaxLength, 10)) - - var result string - const alphabet = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()-_=+" - for i := 0; i < min+g.rng.Intn(max-min); i++ { - result += string(alphabet[g.rng.Intn(len(alphabet))]) - } - return result - - case "array": - min := int(ptr.Deref(s.MinItems, 0)) - max := int(ptr.Deref(s.MaxItems, 5)) - - itemSchema := s.Items - if itemSchema == nil { - itemSchema = jsonschema.TrueSchema - } - - items := []any{} - for i := 0; i < min+g.rng.Intn(max-min); i++ { - items = append(items, g.generate(depth, itemSchema)) - } - return items - - case "object": - val := map[string]any{} - min := int(ptr.Deref(s.MinProperties, uint64(s.Properties.Len()))) - max := int(ptr.Deref(s.MaxProperties, uint64(s.Properties.Len()+5))) - - for _, key := range s.Required { - schema, ok := s.Properties.Get(key) - if !ok { - // This might be okay in cases of AdditionalProperties or pattern properties... - panic(fmt.Sprintf("missing required property %q", key)) - } - - if g.skipDeprecated && schema.Deprecated { - continue - } - - val[key] = g.generate(depth, schema) - } - - var patterns []string - var schemas []*jsonschema.Schema - - for pair := s.Properties.Oldest(); pair != nil; pair = pair.Next() { - required := slices.Contains(s.Required, pair.Key) - if required || (g.skipDeprecated && pair.Value.Deprecated) { - continue - } - - patterns = append(patterns, regexp.QuoteMeta(pair.Key)) - schemas = append(schemas, pair.Value) - } - - for pattern, schema := range s.PatternProperties { - if g.skipDeprecated && schema.Deprecated { - continue - } - patterns = append(patterns, pattern) - schemas = append(schemas, schema) - } - - addlProps := string(must(json.Marshal(s.AdditionalProperties))) - if addlProps != "null" && addlProps != "false" { - if !(g.skipDeprecated && s.AdditionalProperties.Deprecated) { - patterns = append(patterns, `\w+`) - schemas = append(schemas, s.AdditionalProperties) - } - } - - // If there are no optional properties to add, bail early or if we're - // starting to get too "deep" progressively decrease the likelihood of - // going even deeper. - if len(patterns) == 0 || depth+g.rng.Intn(g.maxDepth) >= g.maxDepth { - return val - } - - for i := len(val); i < min+g.rng.Intn(max-min); i++ { - j := g.rng.Intn(len(patterns)) - - schema := schemas[j] - pattern := patterns[j] - - key := g.generateRegex(pattern) - val[key] = g.generate(depth+1, schema) - } - - return val - - default: - panic(fmt.Sprintf("unhandled schema: %s", serialized)) - } -} - -func must[T any](v T, err error) T { - if err != nil { - panic(err) - } - return v -} - -func pickone[T any](rng *rand.Rand, l []T) T { - return l[rng.Intn(len(l))] -} diff --git a/pkg/valuesutil/fuzz_test.go b/pkg/valuesutil/fuzz_test.go deleted file mode 100644 index 6d95756b2d..0000000000 --- a/pkg/valuesutil/fuzz_test.go +++ /dev/null @@ -1,190 +0,0 @@ -package valuesutil - -import ( - "encoding/json" - "math/rand" - "reflect" - "testing" - "testing/quick" - "time" - - "github.com/invopop/jsonschema" - "github.com/stretchr/testify/require" - orderedmap "github.com/wk8/go-ordered-map/v2" - "k8s.io/utils/ptr" -) - -// TestGenerate is both an example of how to utilize [Generate] with -// [quick.Check] and a property test for [Generate]. It's a bit mind bending. -func TestGenerate(t *testing.T) { - configs := []*quick.Config{ - // 1st property: Given a schema describing JSON schemas, we can generate - // valid JSON schemas. - {Values: func(args []reflect.Value, rng *rand.Rand) { - args[0] = reflect.ValueOf(metaSchema) - args[1] = reflect.ValueOf(Generate(rng, metaSchema)) - }}, - // 2st property: For any valid JSON schema, we can generate a value that is - // valid. NB: We're relying on our 1st property to ensure that this - // property always receives valid JSONSchemas. - {Values: func(args []reflect.Value, rng *rand.Rand) { - schema, _ := UnmarshalInto[*jsonschema.Schema](Generate(rng, metaSchema)) - args[0] = reflect.ValueOf(schema) - args[1] = reflect.ValueOf(Generate(rng, metaSchema)) - }}, - } - - for _, cfg := range configs { - if err := quick.Check(func(schema *jsonschema.Schema, instance any) bool { - return Validate(schema, instance) == nil - }, cfg); err != nil { - err := err.(*quick.CheckError) - schema := err.In[0].(*jsonschema.Schema) - instance := err.In[1] - - t.Logf("Schema: %#v", schema) - t.Logf("Invalid Generated Value: %#v", instance) - require.NoError(t, err) - } - } -} - -// TestGenerateDeterministic asserts that [Generate] is deterministic and -// produces the same value when given a particular seed. -func TestGenerateDeterministic(t *testing.T) { - f := func(seed int64) any { - return Generate(rand.New(rand.NewSource(seed)), metaSchema) - } - require.NoError(t, quick.CheckEqual(f, f, &quick.Config{})) -} - -// FuzzGenerate is effectively equivalent to [TestGenerate]'s 1st property with -// the added benefit that it can save failures as regression cases to -// ./testdata. -func FuzzGenerate(f *testing.F) { - f.Add(time.Now().UnixNano()) - f.Fuzz(func(t *testing.T, seed int64) { - rng := rand.New(rand.NewSource(seed)) - instance := Generate(rng, metaSchema) - require.NoError(t, Validate(metaSchema, instance)) - }) -} - -// metaSchema is a jsonschema that describes JSON schemas. It's used instead of -// loading the actual JSONSchema metaschema because [Generate] only implements -// a subset of features and the metaschema isn't fully complete as it allows -// specifying fields like maxProperties on arrays. -var metaSchema = &jsonschema.Schema{ - Definitions: jsonschema.Definitions{ - "any": &jsonschema.Schema{Const: true}, - "null": &jsonschema.Schema{ - Type: "object", - Required: []string{"type"}, - Properties: Props(map[string]*jsonschema.Schema{ - "type": {Const: "null"}, - }), - }, - "integer": &jsonschema.Schema{ - Type: "object", - Required: []string{"type"}, - Properties: Props(map[string]*jsonschema.Schema{ - "type": {Const: "integer"}, - "minimum": {Type: "integer", Minimum: json.Number("0"), Maximum: json.Number("1000")}, - "maximum": {Type: "integer", Minimum: json.Number("1001"), Maximum: json.Number("10000")}, - }), - }, - "boolean": &jsonschema.Schema{ - Type: "object", - Required: []string{"type"}, - Properties: Props(map[string]*jsonschema.Schema{ - "type": {Const: "boolean"}, - }), - }, - "string": &jsonschema.Schema{ - Type: "object", - Required: []string{"type"}, - Properties: Props(map[string]*jsonschema.Schema{ - "type": {Const: "string"}, - "minLength": {Type: "integer", Minimum: json.Number("0"), Maximum: json.Number("3")}, - "maxLength": {Type: "integer", Minimum: json.Number("4"), Maximum: json.Number("7")}, - }), - }, - "scalar": &jsonschema.Schema{ - AnyOf: []*jsonschema.Schema{ - {Ref: "#/$defs/any"}, - {Ref: "#/$defs/boolean"}, - {Ref: "#/$defs/integer"}, - {Ref: "#/$defs/null"}, - {Ref: "#/$defs/string"}, - }, - }, - "array": &jsonschema.Schema{ - Type: "object", - Required: []string{"type", "items"}, - Properties: Props(map[string]*jsonschema.Schema{ - "type": {Const: "array"}, - "items": {AnyOf: []*jsonschema.Schema{ - {Ref: "#/$defs/array"}, - {Ref: "#/$defs/object"}, - {Ref: "#/$defs/scalar"}, - }}, - "minItems": {Type: "integer", Minimum: json.Number("0"), Maximum: json.Number("3")}, - "maxItems": {Type: "integer", Minimum: json.Number("4"), Maximum: json.Number("7")}, - }), - }, - "object": &jsonschema.Schema{ - Type: "object", - Required: []string{"type", "properties"}, - Properties: Props(map[string]*jsonschema.Schema{ - "type": {Const: "object"}, - "properties": { - Type: "object", - MaxProperties: ptr.To(uint64(10)), - MinProperties: ptr.To(uint64(0)), - AdditionalProperties: &jsonschema.Schema{ - AnyOf: []*jsonschema.Schema{ - {Ref: "#/$defs/array"}, - {Ref: "#/$defs/object"}, - {Ref: "#/$defs/scalar"}, - }, - }, - }, - // TODO get additionalProperties and patternProperties working. - // "patternProperties": { - // Type: "object", - // MaxProperties: ptr.To(uint64(10)), - // MinProperties: ptr.To(uint64(0)), - // PatternProperties: map[string]*jsonschema.Schema{ - // `(\.|\\w|\\d){3,5}`: { - // AnyOf: []*jsonschema.Schema{ - // {Ref: "#/$defs/array"}, - // {Ref: "#/$defs/object"}, - // {Ref: "#/$defs/scalar"}, - // }, - // }, - // }, - // }, - // "additionalProperties": { - // Type: "object", - // OneOf: []*jsonschema.Schema{ - // {Ref: "#/$defs/array"}, - // {Ref: "#/$defs/object"}, - // {Ref: "#/$defs/scalar"}, - // }, - // }, - }), - }, - }, - AnyOf: []*jsonschema.Schema{ - {Ref: "#/$defs/object"}, - }, -} - -// Props is a helper for constructing inline OrderedMaps. -func Props(init map[string]*jsonschema.Schema) *orderedmap.OrderedMap[string, *jsonschema.Schema] { - props := jsonschema.NewProperties() - for key, value := range init { - props.Set(key, value) - } - return props -} diff --git a/pkg/valuesutil/valuesutil.go b/pkg/valuesutil/valuesutil.go deleted file mode 100644 index 7e23f79986..0000000000 --- a/pkg/valuesutil/valuesutil.go +++ /dev/null @@ -1,71 +0,0 @@ -package valuesutil - -import ( - "bytes" - "encoding/json" - - "github.com/invopop/jsonschema" - schemavalidator "github.com/santhosh-tekuri/jsonschema/v5" -) - -// Validate returns an error if instance is not considered valid by schema. -// Otherwise it returns nil. -func Validate(schema *jsonschema.Schema, instance any) error { - c := schemavalidator.NewCompiler() - - var buf bytes.Buffer - if err := json.NewEncoder(&buf).Encode(schema); err != nil { - return err - } - - if err := c.AddResource(string(schema.ID), &buf); err != nil { - return err - } - - validator, err := c.Compile(string(schema.ID)) - if err != nil { - return err - } - - return validator.Validate(instance) -} - -func GenerateSchema(instance any) *jsonschema.Schema { - r := jsonschema.Reflector{ - ExpandedStruct: true, - DoNotReference: true, - RequiredFromJSONSchemaTags: true, - } - - return r.Reflect(instance) -} - -// RoundTripThrough round trips input through T. It may be used to understand -// how various types affect JSON marshalling or apply go's defaulting to an -// untyped value. -func RoundTripThrough[T any, K any](input K) (K, error) { - through, err := UnmarshalInto[T](input) - if err != nil { - var zero K - return zero, err - } - - return UnmarshalInto[K](through) -} - -// UnmarshalInto "converts" input into T by marshalling input to JSON and then -// unmarshalling into T. -func UnmarshalInto[T any](input any) (T, error) { - var output T - var buf bytes.Buffer - - if err := json.NewEncoder(&buf).Encode(input); err != nil { - return output, err - } - - if err := json.NewDecoder(&buf).Decode(&output); err != nil { - return output, err - } - - return output, nil -} diff --git a/pkg/valuesutil/valuesutil_test.go b/pkg/valuesutil/valuesutil_test.go deleted file mode 100644 index ade85facd9..0000000000 --- a/pkg/valuesutil/valuesutil_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package valuesutil - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestUnmarshalInto(t *testing.T) { - // NB: Can't use table tests here due to the use of generics. - { - out, err := UnmarshalInto[int](10) - assert.NoError(t, err) - assert.Equal(t, 10, out) - } - - { - out, err := UnmarshalInto[any](struct { - Foo string - Bar int - }{Foo: "hello world", Bar: 12}) - assert.NoError(t, err) - assert.Equal(t, map[string]any{ - "Foo": "hello world", - "Bar": float64(12), - }, out) - } -}