diff --git a/.github/workflows/pull_request.yaml b/.github/workflows/pull_request.yaml index 6ed43144e..c5a38db15 100644 --- a/.github/workflows/pull_request.yaml +++ b/.github/workflows/pull_request.yaml @@ -26,7 +26,7 @@ jobs: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 - - name: Set up Go 1.21 + - name: Set up Go 1.22 uses: actions/setup-go@v4 with: go-version-file: "go.mod" diff --git a/Makefile b/Makefile index c3b7d7c8e..a620a402d 100644 --- a/Makefile +++ b/Makefile @@ -17,6 +17,7 @@ export PATH:=$(GOBIN):$(PATH) install-go-tools: mod-download mkdir -p $(DEPSGOBIN) go install github.com/golang/protobuf/protoc-gen-go@v1.5.2 + go install github.com/solo-io/protoc-gen-openapi@v0.2.0 go install github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc go install github.com/solo-io/protoc-gen-ext@v0.0.18 go install github.com/golang/mock/mockgen@v1.4.4 @@ -57,7 +58,7 @@ generated-code: install-tools update-licenses go run api/generate.go # the api/generate.go command is separated out to enable us to run go generate on the generated files (used for mockgen) # this re-gens test protos - go test ./codegen + PATH=$(DEPSGOBIN):$(PATH) go test ./codegen go generate -v ./... $(DEPSGOBIN)/goimports -w . go mod tidy diff --git a/changelog/v0.37.0/protoc-gen.yaml b/changelog/v0.37.0/protoc-gen.yaml new file mode 100644 index 000000000..c98adecd9 --- /dev/null +++ b/changelog/v0.37.0/protoc-gen.yaml @@ -0,0 +1,7 @@ +changelog: + - type: BREAKING_CHANGE + issueLink: https://github.com/solo-io/gloo-mesh-enterprise/issues/16049 + resolvesIssue: false + description: > + "Enable CRD schema generation using protoc-gen-openapi" + skipCI: "false" diff --git a/ci/oss_compliance/osa_provided.md b/ci/oss_compliance/osa_provided.md index 5e6bb0cea..9cb220f13 100644 --- a/ci/oss_compliance/osa_provided.md +++ b/ci/oss_compliance/osa_provided.md @@ -5,16 +5,16 @@ Name|Version|License [go-spew/spew](https://github.com/davecgh/go-spew)|v1.1.1|ISC License [v3/log](https://github.com/emicklei/go-restful)|v3.11.0|MIT License [json-patch/v5](https://github.com/evanphx/json-patch)|v5.6.0|BSD 3-clause "New" or "Revised" License -[fsnotify/fsnotify](https://github.com/fsnotify/fsnotify)|v1.6.0|BSD 3-clause "New" or "Revised" License -[go-logr/logr](https://github.com/go-logr/logr)|v1.2.4|Apache License 2.0 -[go-openapi/jsonpointer](https://github.com/go-openapi/jsonpointer)|v0.19.6|Apache License 2.0 +[fsnotify/fsnotify](https://github.com/fsnotify/fsnotify)|v1.7.0|BSD 3-clause "New" or "Revised" License +[logr/slogr](https://github.com/go-logr/logr)|v1.3.0|Apache License 2.0 +[go-openapi/jsonpointer](https://github.com/go-openapi/jsonpointer)|v0.20.2|Apache License 2.0 [jsonreference/internal](https://github.com/go-openapi/jsonreference)|v0.20.2|Apache License 2.0 -[go-openapi/swag](https://github.com/go-openapi/swag)|v0.22.3|Apache License 2.0 +[go-openapi/swag](https://github.com/go-openapi/swag)|v0.22.8|Apache License 2.0 [gogo/protobuf](https://github.com/gogo/protobuf)|v1.3.2|BSD 3-clause "New" or "Revised" License [groupcache/lru](https://github.com/golang/groupcache)|v0.0.0-20210331224755-41bb18bfe9da|Apache License 2.0 [golang/protobuf](https://github.com/golang/protobuf)|v1.5.3|BSD 3-clause "New" or "Revised" License [google/gnostic-models](https://github.com/google/gnostic-models)|v0.6.8|Apache License 2.0 -[cmp/internal](https://github.com/google/go-cmp)|v0.5.9|BSD 3-clause "New" or "Revised" License +[cmp/internal](https://github.com/google/go-cmp)|v0.6.0|BSD 3-clause "New" or "Revised" License [gofuzz/bytesource](https://github.com/google/gofuzz)|v1.2.0|Apache License 2.0 [google/uuid](https://github.com/google/uuid)|v1.3.0|BSD 3-clause "New" or "Revised" License [josharian/intern](https://github.com/josharian/intern)|v1.0.0|MIT License @@ -33,27 +33,27 @@ Name|Version|License [go.uber.org/multierr](https://go.uber.org/multierr)|v1.11.0|MIT License [go.uber.org/zap](https://go.uber.org/zap)|v1.25.0|MIT License [exp/maps](https://golang.org/x/exp/maps)|v0.0.0-20220921164117-439092de6870|BSD 3-clause "New" or "Revised" License -[x/net](https://golang.org/x/net)|v0.17.0|BSD 3-clause "New" or "Revised" License -[oauth2/internal](https://golang.org/x/oauth2/internal)|v0.8.0|BSD 3-clause "New" or "Revised" License -[x/term](https://golang.org/x/term)|v0.13.0|BSD 3-clause "New" or "Revised" License -[x/text](https://golang.org/x/text)|v0.13.0|BSD 3-clause "New" or "Revised" License +[x/net](https://golang.org/x/net)|v0.19.0|BSD 3-clause "New" or "Revised" License +[oauth2/internal](https://golang.org/x/oauth2/internal)|v0.10.0|BSD 3-clause "New" or "Revised" License +[x/term](https://golang.org/x/term)|v0.15.0|BSD 3-clause "New" or "Revised" License +[x/text](https://golang.org/x/text)|v0.14.0|BSD 3-clause "New" or "Revised" License [time/rate](https://golang.org/x/time/rate)|v0.3.0|BSD 3-clause "New" or "Revised" License [jsonpatch/v2](https://gomodules.xyz/jsonpatch/v2)|v2.4.0|Apache License 2.0 -[google.golang.org/protobuf](https://google.golang.org/protobuf)|v1.30.0|BSD 3-clause "New" or "Revised" License +[google.golang.org/protobuf](https://google.golang.org/protobuf)|v1.31.0|BSD 3-clause "New" or "Revised" License [gopkg.in/inf.v0](https://gopkg.in/inf.v0)|v0.9.1|BSD 3-clause "New" or "Revised" License [gopkg.in/yaml.v2](https://gopkg.in/yaml.v2)|v2.4.0|Apache License 2.0 [gopkg.in/yaml.v3](https://gopkg.in/yaml.v3)|v3.0.1|MIT License -[k8s.io/api](https://k8s.io/api)|v0.28.3|Apache License 2.0 -[k8s.io/apimachinery](https://k8s.io/apimachinery)|v0.28.3|Apache License 2.0 -[k8s.io/client-go](https://k8s.io/client-go)|v0.28.3|Apache License 2.0 -[config/v1alpha1](https://k8s.io/component-base/config/v1alpha1)|v0.28.3|Apache License 2.0 -[v2/internal](https://k8s.io/klog/v2/internal)|v2.100.1|Apache License 2.0 -[kube-openapi/pkg](https://k8s.io/kube-openapi/pkg)|v0.0.0-20230717233707-2695361300d9|Apache License 2.0 -[k8s.io/utils](https://k8s.io/utils)|v0.0.0-20230406110748-d93618cff8a2|Apache License 2.0 +[k8s.io/api](https://k8s.io/api)|v0.29.0|Apache License 2.0 +[k8s.io/apimachinery](https://k8s.io/apimachinery)|v0.29.0|Apache License 2.0 +[k8s.io/client-go](https://k8s.io/client-go)|v0.29.0|Apache License 2.0 +[config/v1alpha1](https://k8s.io/component-base/config/v1alpha1)|v0.29.0|Apache License 2.0 +[v2/internal](https://k8s.io/klog/v2/internal)|v2.110.1|Apache License 2.0 +[kube-openapi/pkg](https://k8s.io/kube-openapi/pkg)|v0.0.0-20231010175941-2dd684a91f00|Apache License 2.0 +[k8s.io/utils](https://k8s.io/utils)|v0.0.0-20230726121419-3b25d923346b|Apache License 2.0 [controller-runtime/pkg](https://sigs.k8s.io/controller-runtime/pkg)|v0.16.3|Apache License 2.0 [encoding/json](https://sigs.k8s.io/json/internal/golang/encoding/json)|v0.0.0-20221116044647-bc3834ca7abd|Apache License 2.0 -[structured-merge-diff/v4](https://sigs.k8s.io/structured-merge-diff/v4)|v4.2.3|Apache License 2.0 -[sigs.k8s.io/yaml](https://sigs.k8s.io/yaml)|v1.3.0|MIT License +[structured-merge-diff/v4](https://sigs.k8s.io/structured-merge-diff/v4)|v4.4.1|Apache License 2.0 +[yaml/goyaml.v2](https://sigs.k8s.io/yaml/goyaml.v2)|v1.4.0|Apache License 2.0 [cmd/goimports](https://golang.org/x/tools/cmd/goimports)|latest|MIT License [gogo/protobuf](https://github.com/gogo/protobuf)|latest|MIT License [envoyproxy/envoy](https://github.com/envoyproxy/envoy)|latest|Apache License 2.0 diff --git a/ci/tools.go b/ci/tools.go index 6494d1c84..b3c83b1ae 100644 --- a/ci/tools.go +++ b/ci/tools.go @@ -23,6 +23,7 @@ import ( _ "github.com/golang/protobuf/protoc-gen-go" _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" _ "github.com/solo-io/protoc-gen-ext" + _ "github.com/solo-io/protoc-gen-openapi" _ "golang.org/x/tools/cmd/goimports" _ "k8s.io/code-generator" ) diff --git a/codegen/collector/executor.go b/codegen/collector/executor.go new file mode 100644 index 000000000..9025e4900 --- /dev/null +++ b/codegen/collector/executor.go @@ -0,0 +1,126 @@ +package collector + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + + "github.com/rotisserie/eris" +) + +type ProtocExecutor interface { + Execute(protoFile string, toFile string, imports []string) error +} + +type DefaultProtocExecutor struct { + // The output directory + OutputDir string + // whether or not to do a regular go-proto generate while collecting descriptors + ShouldCompileFile func(string) bool + // arguments for go_out= + CustomGoArgs []string + // custom plugins + // each will append a _out= directive to protoc command + CustomPlugins []string +} + +var defaultGoArgs = []string{ + "plugins=grpc", +} + +func (d *DefaultProtocExecutor) Execute(protoFile string, toFile string, imports []string) error { + cmd := exec.Command("protoc") + + for _, i := range imports { + cmd.Args = append(cmd.Args, fmt.Sprintf("-I%s", i)) + } + + if d.ShouldCompileFile(protoFile) { + goArgs := append(defaultGoArgs, d.CustomGoArgs...) + goArgsJoined := strings.Join(goArgs, ",") + cmd.Args = append(cmd.Args, + fmt.Sprintf("--go_out=%s:%s", goArgsJoined, d.OutputDir), + fmt.Sprintf("--ext_out=%s:%s", goArgsJoined, d.OutputDir), + ) + + for _, pluginName := range d.CustomPlugins { + cmd.Args = append(cmd.Args, + fmt.Sprintf("--%s_out=%s:%s", pluginName, goArgsJoined, d.OutputDir), + ) + } + } + + cmd.Args = append(cmd.Args, + "-o", + toFile, + "--include_imports", + "--include_source_info", + protoFile) + + out, err := cmd.CombinedOutput() + if err != nil { + return eris.Wrapf(err, "%v failed: %s", cmd.Args, out) + } + return nil +} + +type OpenApiProtocExecutor struct { + OutputDir string + + // Whether to include descriptions in validation schemas + IncludeDescriptionsInSchema bool + + // Whether to assign Enum fields the `x-kubernetes-int-or-string` property + // which allows the value to either be an integer or a string + EnumAsIntOrString bool + + // A list of messages (core.solo.io.Status) whose validation schema should + // not be generated + MessagesWithEmptySchema []string +} + +func (o *OpenApiProtocExecutor) Execute(protoFile string, toFile string, imports []string) error { + cmd := exec.Command("protoc") + + for _, i := range imports { + cmd.Args = append(cmd.Args, fmt.Sprintf("-I%s", i)) + } + + // The way that --openapi_out works, is that it produces a file in an output directory, + // with the name of the file matching the proto package (ie gloo.solo.io). + // Therefore, if you have multiple protos in a single package, they will all be output + // to the same file, and overwrite one another. + // To avoid this, we generate a directory with the name of the proto file. + // For example my_resource.proto in the gloo.solo.io package will produce the following file: + // my_resource/gloo.solo.io.yaml + + // The directoryName is created by taking the name of the file and removing the extension + _, fileName := filepath.Split(protoFile) + directoryName := fileName[0 : len(fileName)-len(filepath.Ext(fileName))] + + // Create the directory + directoryPath := filepath.Join(o.OutputDir, directoryName) + _ = os.Mkdir(directoryPath, os.ModePerm) + + cmd.Args = append(cmd.Args, + fmt.Sprintf("--openapi_out=yaml=true,single_file=false,include_description=true,multiline_description=true,enum_as_int_or_string=%v,proto_oneof=true,int_native=true,additional_empty_schema=%v:%s", + o.EnumAsIntOrString, + strings.Join(o.MessagesWithEmptySchema, "+"), + directoryPath), + ) + + cmd.Args = append(cmd.Args, + "-o", + toFile, + "--include_imports", + "--include_source_info", + protoFile) + + out, err := cmd.CombinedOutput() + if err != nil { + return eris.Wrapf(err, "%v failed: %s", cmd.Args, out) + } + return nil +} diff --git a/codegen/model/resource.go b/codegen/model/resource.go index 885a7aae3..588760f27 100644 --- a/codegen/model/resource.go +++ b/codegen/model/resource.go @@ -5,6 +5,7 @@ import ( "github.com/golang/protobuf/proto" "github.com/solo-io/skv2/codegen/collector" + "github.com/solo-io/skv2/codegen/proto/schemagen" apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/runtime/schema" ) @@ -130,6 +131,11 @@ type Group struct { type GroupOptions struct { // Required when using crds in the templates directory EscapeGoTemplateOperators bool + + // Options for generating validation schemas + SchemaValidationOpts schemagen.ValidationSchemaOptions + + SchemaGenerator schemagen.GeneratorKind } func (g Group) HasProtos() bool { diff --git a/codegen/proto/schemagen/generator.go b/codegen/proto/schemagen/generator.go new file mode 100644 index 000000000..c1a741d11 --- /dev/null +++ b/codegen/proto/schemagen/generator.go @@ -0,0 +1,44 @@ +package schemagen + +type GeneratorKind string + +const ( + Cue GeneratorKind = "cue" + ProtocGenOpenAPI GeneratorKind = "protoc-gen-openapi" +) + +type ValidationSchemaOptions struct { + // Whether to assign Enum fields the `x-kubernetes-int-or-string` property + // which allows the value to either be an integer or a string + // If this is false, only string values are allowed + // Default: false + EnumAsIntOrString bool + + // A list of messages (e.g. ratelimit.api.solo.io.Descriptor) whose validation schema should + // not be generated + MessagesWithEmptySchema []string +} + +// prevent k8s from validating proto.Any fields (since it's unstructured) +func removeProtoAnyValidation(d map[string]interface{}, propertyField string) { + for _, v := range d { + values, ok := v.(map[string]interface{}) + if !ok { + continue + } + desc, ok := values["properties"] + properties, isObj := desc.(map[string]interface{}) + // detect proto.Any field from presence of [propertyField] as field under "properties" + if !ok || !isObj || properties[propertyField] == nil { + removeProtoAnyValidation(values, propertyField) + continue + } + // remove "properties" value + delete(values, "properties") + // remove "required" value + delete(values, "required") + // x-kubernetes-preserve-unknown-fields allows for unknown fields from a particular node + // see https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#specifying-a-structural-schema + values["x-kubernetes-preserve-unknown-fields"] = true + } +} diff --git a/codegen/proto/schemagen/protoc.go b/codegen/proto/schemagen/protoc.go new file mode 100644 index 000000000..d6eddf42e --- /dev/null +++ b/codegen/proto/schemagen/protoc.go @@ -0,0 +1,178 @@ +package schemagen + +import ( + "encoding/json" + "os" + "path/filepath" + "strings" + + "github.com/getkin/kin-openapi/openapi3" + "github.com/ghodss/yaml" + "github.com/pkg/errors" + "github.com/rotisserie/eris" + "github.com/solo-io/go-utils/log" + apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + + "github.com/solo-io/skv2/codegen/collector" +) + +// Implementation of JsonSchemaGenerator that uses a plugin for the protocol buffer compiler +type protocGenerator struct { + validationSchemaOptions *ValidationSchemaOptions +} + +func NewProtocGenerator(validationSchemaOptions *ValidationSchemaOptions) *protocGenerator { + return &protocGenerator{ + validationSchemaOptions: validationSchemaOptions, + } +} + +func (p *protocGenerator) GetJSONSchemas(protoFiles []string, imports []string, gv schema.GroupVersion) (map[schema.GroupVersionKind]*apiextv1.JSONSchemaProps, error) { + // Use a tmp directory as the output of schemas + // The schemas will then be matched with the appropriate CRD + tmpOutputDir, err := os.MkdirTemp("", "skv2-schema-gen-") + if err != nil { + return nil, err + } + _ = os.MkdirAll(tmpOutputDir, os.ModePerm) + defer os.Remove(tmpOutputDir) + + // The Executor used to compile protos + protocExecutor := &collector.OpenApiProtocExecutor{ + OutputDir: tmpOutputDir, + EnumAsIntOrString: p.validationSchemaOptions.EnumAsIntOrString, + MessagesWithEmptySchema: p.validationSchemaOptions.MessagesWithEmptySchema, + } + + // 1. Generate the openApiSchemas for the project, writing them to a temp directory (schemaOutputDir) + for _, f := range protoFiles { + if err := p.generateSchemasForProjectProto(protocExecutor, f, imports); err != nil { + return nil, err + } + } + + // 2. Walk the schemaOutputDir and convert the open api schemas into JSONSchemaProps + return p.processGeneratedSchemas(gv, tmpOutputDir) +} + +func (p *protocGenerator) generateSchemasForProjectProto( + protocExecutor collector.ProtocExecutor, + projectProtoFile string, + imports []string, +) error { + log.Printf("Generating schema for proto file: %s", projectProtoFile) + + // we don't use the output of protoc so use a temp file + tmpFile, err := os.CreateTemp("", "sv2-schema-gen-") + if err != nil { + return err + } + if err := tmpFile.Close(); err != nil { + return err + } + defer os.Remove(tmpFile.Name()) + + return protocExecutor.Execute(projectProtoFile, tmpFile.Name(), imports) +} + +func (p *protocGenerator) processGeneratedSchemas(gv schema.GroupVersion, schemaOutputDir string) (map[schema.GroupVersionKind]*apiextv1.JSONSchemaProps, error) { + jsonSchemasByGVK := make(map[schema.GroupVersionKind]*apiextv1.JSONSchemaProps) + err := filepath.Walk(schemaOutputDir, func(schemaFile string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() { + return nil + } + + if !strings.HasSuffix(schemaFile, ".yaml") { + return nil + } + + log.Debugf("Generated Schema File: %s", schemaFile) + doc, err := p.readOpenApiDocumentFromFile(schemaFile) + if err != nil { + // Stop traversing the output directory + return err + } + + schemas := doc.Components.Schemas + if schemas == nil { + // Continue traversing the output directory + return nil + } + + for schemaKey, schemaValue := range schemas { + schemaGVK := p.getGVKForSchemaKey(gv, schemaKey) + + // Spec validation schema + specJsonSchema, err := p.getJsonSchema(schemaKey, schemaValue) + if err != nil { + return err + } + + jsonSchemasByGVK[schemaGVK] = specJsonSchema + } + // Continue traversing the output directory + return nil + }) + + return jsonSchemasByGVK, err +} + +func (p *protocGenerator) readOpenApiDocumentFromFile(file string) (*openapi3.T, error) { + var openApiDocument *openapi3.T + bytes, err := os.ReadFile(file) + if err != nil { + return nil, errors.Wrapf(err, "reading file") + } + if err := yaml.Unmarshal(bytes, &openApiDocument); err != nil { + return nil, errors.Wrapf(err, "unmarshalling tmp file as schemas") + } + return openApiDocument, nil +} + +func (p *protocGenerator) getGVKForSchemaKey(gv schema.GroupVersion, schemaKey string) schema.GroupVersionKind { + // The generated keys look like testing.solo.io.MockResource + // The kind is the `MockResource` portion + ss := strings.Split(schemaKey, ".") + kind := ss[len(ss)-1] + + return schema.GroupVersionKind{ + Group: gv.Group, + Version: gv.Version, + Kind: kind, + } +} + +func (p *protocGenerator) getJsonSchema(schemaKey string, schema *openapi3.SchemaRef) (*apiextv1.JSONSchemaProps, error) { + if schema == nil { + return nil, eris.Errorf("no open api schema for %s", schemaKey) + } + + oApiJson, err := schema.MarshalJSON() + if err != nil { + return nil, eris.Errorf("Cannot marshal OpenAPI schema for %v: %v", schemaKey, err) + } + + var obj map[string]interface{} + if err = json.Unmarshal(oApiJson, &obj); err != nil { + return nil, err + } + + // detect proto.Any field from presence of "typeUrl" as field under "properties" + removeProtoAnyValidation(obj, "typeUrl") + + bytes, err := json.Marshal(obj) + if err != nil { + return nil, err + } + + jsonSchema := &apiextv1.JSONSchemaProps{} + if err = json.Unmarshal(bytes, jsonSchema); err != nil { + return nil, eris.Errorf("Cannot unmarshal raw OpenAPI schema to JSONSchemaProps for %v: %v", schemaKey, err) + } + + return jsonSchema, nil +} diff --git a/codegen/render/manifests_renderer.go b/codegen/render/manifests_renderer.go index 442bdb4b6..290973ed5 100644 --- a/codegen/render/manifests_renderer.go +++ b/codegen/render/manifests_renderer.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/Masterminds/semver" + "github.com/solo-io/skv2/codegen/proto/schemagen" "github.com/solo-io/skv2/codegen/util" "github.com/solo-io/skv2/pkg/crdutils" @@ -82,10 +83,8 @@ func (r ManifestsRenderer) RenderManifests(grps []*Group, protoOpts protoutil.Op grpsByGroupName[grp.Group] = append(grpsByGroupName[grp.Group], grp) shouldRenderGroups[grp.Group] = shouldRenderGroups[grp.Group] || grp.RenderManifests grandfatheredGroups[grp.GroupVersion.String()] = grandfatheredGroups[grp.GroupVersion.String()] || grp.SkipConditionalCRDLoading - shouldSkipCRDManifest[grp.Group] = - shouldSkipCRDManifest[grp.Group] || grp.SkipCRDManifest - shouldSkipTemplatedCRDManifest[grp.Group] = - shouldSkipTemplatedCRDManifest[grp.Group] || grp.SkipTemplatedCRDManifest + shouldSkipCRDManifest[grp.Group] = shouldSkipCRDManifest[grp.Group] || grp.SkipCRDManifest + shouldSkipTemplatedCRDManifest[grp.Group] = shouldSkipTemplatedCRDManifest[grp.Group] || grp.SkipTemplatedCRDManifest } for _, grp := range grps { @@ -132,8 +131,48 @@ func (r ManifestsRenderer) RenderManifests(grps []*Group, protoOpts protoutil.Op return renderedFiles, nil } -// Use cuelang as an intermediate language for transpiling protobuf schemas to openapi v3 with k8s structural schema constraints. func generateOpenApi(grp model.Group, protoDir string, protoOpts protoutil.Options, groupOptions model.GroupOptions) (model.OpenApiSchemas, error) { + if groupOptions.SchemaGenerator == schemagen.ProtocGenOpenAPI { + return generateOpenApiFromProtocGen(grp, protoDir, protoOpts, groupOptions) + } + return generateOpenApiFromCue(grp, protoDir, protoOpts, groupOptions) +} + +// Use protoc-gen-openapi for transpiling protobuf schemas to openapi v3 with k8s structural schema constraints. +func generateOpenApiFromProtocGen(grp model.Group, protoDir string, _ protoutil.Options, groupOptions model.GroupOptions) (model.OpenApiSchemas, error) { + // Collect all protobuf definitions including transitive dependencies. + var imports []string + for _, fileDescriptor := range grp.Descriptors { + imports = append(imports, fileDescriptor.Imports...) + } + imports = stringutils.Unique(imports) + + protoFiles := make([]string, len(grp.Descriptors)) + // collect the set of messsages for which validation is disabled + for i, fileDescriptor := range grp.Descriptors { + protoFiles[i] = fileDescriptor.ProtoFilePath + } + protoGen := schemagen.NewProtocGenerator(&groupOptions.SchemaValidationOpts) + gvkSchemas, err := protoGen.GetJSONSchemas(protoFiles, imports, grp.GroupVersion) + if err != nil { + return nil, err + } + + oapiSchemas := make(model.OpenApiSchemas) + for gvk, schema := range gvkSchemas { + jsonSchema, err := postProcessOpenAPISchema(schema, groupOptions) + if err != nil { + return nil, err + } + // TODO: drop schemas we are not interested in + oapiSchemas[gvk.Kind] = jsonSchema + } + + return oapiSchemas, nil +} + +// Use cuelang as an intermediate language for transpiling protobuf schemas to openapi v3 with k8s structural schema constraints. +func generateOpenApiFromCue(grp model.Group, protoDir string, protoOpts protoutil.Options, groupOptions model.GroupOptions) (model.OpenApiSchemas, error) { if protoDir == "" { protoDir = anyvendor.DefaultDepDir } @@ -215,7 +254,6 @@ func generateOpenApi(grp model.Group, protoDir string, protoOpts protoutil.Optio // returns the map of proto fields marked as unstructured, used by CUE to generate openapi schemas func getUnstructuredFieldsMap(grp model.Group, opts protoutil.Options) (map[string][][]string, error) { - unstructuredFields := map[string][][]string{} defaultProtoPkg := grp.Group defaultGoPkg := util.GoPackage(grp) @@ -296,8 +334,8 @@ func (r ManifestsRenderer) renderCRDManifest(appName, groupName string, objs []k func (r ManifestsRenderer) renderTemplatedCRDManifest(appName, groupName string, objs []kuberesource.GlooCustomResourceDefinition, - grandfatheredGroups map[string]bool) (OutFile, error) { - + grandfatheredGroups map[string]bool, +) (OutFile, error) { renderer := DefaultTemplateRenderer // when rendering helm charts, we need @@ -426,6 +464,35 @@ func postProcessValidationSchema(oapi *openapi.OrderedMap, groupOptions model.Gr return jsonSchema, nil } +func postProcessOpenAPISchema(schema *apiextv1.JSONSchemaProps, groupOptions model.GroupOptions) (*apiextv1.JSONSchemaProps, error) { + oapiJson, err := json.Marshal(schema) + if err != nil { + return nil, err + } + var obj map[string]interface{} + if err = json.Unmarshal(oapiJson, &obj); err != nil { + return nil, err + } + + // remove 'properties' and 'required' fields to prevent validating proto.Any fields + removeProtoAnyValidation(obj) + + if groupOptions.EscapeGoTemplateOperators { + // escape {{ or }} in descriptions as they will cause helm to error + escapeGoTemplateOperators(obj) + } + + bytes, err := json.Marshal(obj) + if err != nil { + return nil, err + } + jsonSchema := &apiextv1.JSONSchemaProps{} + if err = json.Unmarshal(bytes, jsonSchema); err != nil { + return nil, err + } + return jsonSchema, nil +} + // prevent k8s from validating proto.Any fields (since it's unstructured) func removeProtoAnyValidation(d map[string]interface{}) { for _, v := range d { diff --git a/codegen/render/manifests_renderer_test.go b/codegen/render/manifests_renderer_test.go index cafa65190..4e7f92fdd 100644 --- a/codegen/render/manifests_renderer_test.go +++ b/codegen/render/manifests_renderer_test.go @@ -6,6 +6,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/solo-io/skv2/codegen/proto/schemagen" v1 "github.com/solo-io/skv2/codegen/test/api/things.test.io/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" @@ -16,7 +17,6 @@ import ( ) var _ = Describe("ManifestsRenderer", func() { - It("should set version without patch", func() { m := new(metav1.ObjectMeta) render.SetVersionForObject(m, "1.0.0-patch1") @@ -57,25 +57,27 @@ var _ = Describe("ManifestsRenderer", func() { Describe("should respect skip manifest flags", func() { It("skips crd manifest if options.SkipCrdsManifest is true", func() { - grps := []*model.Group{{ - GroupVersion: schema.GroupVersion{ - Group: "things.test.io", - Version: "v1", - }, - RenderManifests: true, - AddChartVersion: "1.0.0", - Resources: []model.Resource{ - { - Kind: "kind", - Spec: model.Field{ - Type: model.Type{ - Name: "test", - Message: &v1.AcrylicType{}, + grps := []*model.Group{ + { + GroupVersion: schema.GroupVersion{ + Group: "things.test.io", + Version: "v1", + }, + RenderManifests: true, + AddChartVersion: "1.0.0", + Resources: []model.Resource{ + { + Kind: "kind", + Spec: model.Field{ + Type: model.Type{ + Name: "test", + Message: &v1.AcrylicType{}, + }, }, + Stored: false, }, - Stored: false, }, - }}, + }, } for i := range grps { grps[i].Init() @@ -94,26 +96,28 @@ var _ = Describe("ManifestsRenderer", func() { }) It("skips crd manifest if group.SkipCRDManifest is true", func() { - grps := []*model.Group{{ - SkipCRDManifest: true, - GroupVersion: schema.GroupVersion{ - Group: "things.test.io", - Version: "v1", - }, - RenderManifests: true, - AddChartVersion: "1.0.0", - Resources: []model.Resource{ - { - Kind: "kind", - Spec: model.Field{ - Type: model.Type{ - Name: "test", - Message: &v1.AcrylicType{}, + grps := []*model.Group{ + { + SkipCRDManifest: true, + GroupVersion: schema.GroupVersion{ + Group: "things.test.io", + Version: "v1", + }, + RenderManifests: true, + AddChartVersion: "1.0.0", + Resources: []model.Resource{ + { + Kind: "kind", + Spec: model.Field{ + Type: model.Type{ + Name: "test", + Message: &v1.AcrylicType{}, + }, }, + Stored: false, }, - Stored: false, }, - }}, + }, } for i := range grps { grps[i].Init() @@ -131,26 +135,28 @@ var _ = Describe("ManifestsRenderer", func() { }) It("skips templated crd manifest if group.SkipTemplatedCRDManifest is true", func() { - grps := []*model.Group{{ - SkipTemplatedCRDManifest: true, - GroupVersion: schema.GroupVersion{ - Group: "things.test.io", - Version: "v1", - }, - RenderManifests: true, - AddChartVersion: "1.0.0", - Resources: []model.Resource{ - { - Kind: "kind", - Spec: model.Field{ - Type: model.Type{ - Name: "test", - Message: &v1.AcrylicType{}, + grps := []*model.Group{ + { + SkipTemplatedCRDManifest: true, + GroupVersion: schema.GroupVersion{ + Group: "things.test.io", + Version: "v1", + }, + RenderManifests: true, + AddChartVersion: "1.0.0", + Resources: []model.Resource{ + { + Kind: "kind", + Spec: model.Field{ + Type: model.Type{ + Name: "test", + Message: &v1.AcrylicType{}, + }, }, + Stored: false, }, - Stored: false, }, - }}, + }, } for i := range grps { grps[i].Init() @@ -168,27 +174,29 @@ var _ = Describe("ManifestsRenderer", func() { }) It("skips both manifests if both skip flags are true", func() { - grps := []*model.Group{{ - SkipCRDManifest: true, - SkipTemplatedCRDManifest: true, - GroupVersion: schema.GroupVersion{ - Group: "things.test.io", - Version: "v1", - }, - RenderManifests: true, - AddChartVersion: "1.0.0", - Resources: []model.Resource{ - { - Kind: "kind", - Spec: model.Field{ - Type: model.Type{ - Name: "test", - Message: &v1.AcrylicType{}, + grps := []*model.Group{ + { + SkipCRDManifest: true, + SkipTemplatedCRDManifest: true, + GroupVersion: schema.GroupVersion{ + Group: "things.test.io", + Version: "v1", + }, + RenderManifests: true, + AddChartVersion: "1.0.0", + Resources: []model.Resource{ + { + Kind: "kind", + Spec: model.Field{ + Type: model.Type{ + Name: "test", + Message: &v1.AcrylicType{}, + }, }, + Stored: false, }, - Stored: false, }, - }}, + }, } for i := range grps { grps[i].Init() @@ -206,33 +214,32 @@ var _ = Describe("ManifestsRenderer", func() { }) Describe("Generate non-alpha versioned CRD", func() { - var ( - grps []*model.Group - ) + var grps []*model.Group BeforeEach(func() { - grps = []*model.Group{{ - RenderManifests: true, - AddChartVersion: "1.0.0", - Resources: []model.Resource{ - { - Kind: "kind", - Spec: model.Field{ - Type: model.Type{ - Name: "test", - Message: &v1.AcrylicType{}, + grps = []*model.Group{ + { + RenderManifests: true, + AddChartVersion: "1.0.0", + Resources: []model.Resource{ + { + Kind: "kind", + Spec: model.Field{ + Type: model.Type{ + Name: "test", + Message: &v1.AcrylicType{}, + }, }, + Stored: true, }, - Stored: true, }, - }}, + }, } for i := range grps { grps[i].Init() } }) It("Renders manifests with chart and spec hash", func() { - // get api-level code gen options from descriptors outFiles, err := render.RenderManifests(render.RenderOptions{ AppName: "appName", @@ -251,37 +258,36 @@ var _ = Describe("ManifestsRenderer", func() { }) Describe("Generate alpha versioned CRD", func() { - var ( - grps []*model.Group - ) + var grps []*model.Group BeforeEach(func() { - grps = []*model.Group{{ - GroupVersion: schema.GroupVersion{ - Group: "things.test.io", - Version: "v1alpha1", - }, - RenderManifests: true, - AddChartVersion: "1.0.0", - Resources: []model.Resource{ - { - Kind: "kind", - Spec: model.Field{ - Type: model.Type{ - Name: "test", - Message: &v1.AcrylicType{}, + grps = []*model.Group{ + { + GroupVersion: schema.GroupVersion{ + Group: "things.test.io", + Version: "v1alpha1", + }, + RenderManifests: true, + AddChartVersion: "1.0.0", + Resources: []model.Resource{ + { + Kind: "kind", + Spec: model.Field{ + Type: model.Type{ + Name: "test", + Message: &v1.AcrylicType{}, + }, }, + Stored: true, }, - Stored: true, }, - }}, + }, } for i := range grps { grps[i].Init() } }) It("Renders manifests with template and spec hash", func() { - // get api-level code gen options from descriptors outFiles, err := render.RenderManifests(render.RenderOptions{ AppName: "appName", @@ -301,31 +307,31 @@ var _ = Describe("ManifestsRenderer", func() { }) Describe("Skip template for grandfathered alpha versioned CRD", func() { - var ( - grps []*model.Group - ) + var grps []*model.Group BeforeEach(func() { - grps = []*model.Group{{ - GroupVersion: schema.GroupVersion{ - Group: "things.test.io", - Version: "v1alpha1", - }, - RenderManifests: true, - AddChartVersion: "1.0.0", - SkipConditionalCRDLoading: true, - Resources: []model.Resource{ - { - Kind: "kind", - Spec: model.Field{ - Type: model.Type{ - Name: "test", - Message: &v1.AcrylicType{}, + grps = []*model.Group{ + { + GroupVersion: schema.GroupVersion{ + Group: "things.test.io", + Version: "v1alpha1", + }, + RenderManifests: true, + AddChartVersion: "1.0.0", + SkipConditionalCRDLoading: true, + Resources: []model.Resource{ + { + Kind: "kind", + Spec: model.Field{ + Type: model.Type{ + Name: "test", + Message: &v1.AcrylicType{}, + }, }, + Stored: true, }, - Stored: true, }, - }}, + }, } for i := range grps { grps[i].Init() @@ -349,30 +355,30 @@ var _ = Describe("ManifestsRenderer", func() { }) Describe("Generate combined alpha, grandfathered alpha, and non-alpha versioned CRD", func() { - var ( - grps []*model.Group - ) + var grps []*model.Group BeforeEach(func() { - grps = []*model.Group{{ - GroupVersion: schema.GroupVersion{ - Group: "things.test.io", - Version: "v3alpha1", - }, - RenderManifests: true, - AddChartVersion: "1.0.0", - Resources: []model.Resource{ - { - Kind: "kind", - Spec: model.Field{ - Type: model.Type{ - Name: "test", - Message: &v1.AcrylicType{}, + grps = []*model.Group{ + { + GroupVersion: schema.GroupVersion{ + Group: "things.test.io", + Version: "v3alpha1", + }, + RenderManifests: true, + AddChartVersion: "1.0.0", + Resources: []model.Resource{ + { + Kind: "kind", + Spec: model.Field{ + Type: model.Type{ + Name: "test", + Message: &v1.AcrylicType{}, + }, }, + Stored: false, }, - Stored: false, }, - }}, + }, { GroupVersion: schema.GroupVersion{ Group: "things.test.io", @@ -391,7 +397,8 @@ var _ = Describe("ManifestsRenderer", func() { }, Stored: true, }, - }}, + }, + }, { GroupVersion: schema.GroupVersion{ Group: "things.test.io", @@ -411,14 +418,14 @@ var _ = Describe("ManifestsRenderer", func() { }, Stored: true, }, - }}, + }, + }, } for i := range grps { grps[i].Init() } }) It("Renders manifests with chart and spec hash", func() { - // get api-level code gen options from descriptors outFiles, err := render.RenderManifests(render.RenderOptions{ AppName: "appName", @@ -438,30 +445,30 @@ var _ = Describe("ManifestsRenderer", func() { }) Describe("Generate combined alpha, grandfathered alpha, and non-alpha versioned CRD", func() { - var ( - grps []*model.Group - ) + var grps []*model.Group BeforeEach(func() { - grps = []*model.Group{{ - GroupVersion: schema.GroupVersion{ - Group: "things.test.io", - Version: "v3alpha1", - }, - RenderManifests: true, - AddChartVersion: "1.0.0", - Resources: []model.Resource{ - { - Kind: "kind", - Spec: model.Field{ - Type: model.Type{ - Name: "test", - Message: &v1.AcrylicType{}, + grps = []*model.Group{ + { + GroupVersion: schema.GroupVersion{ + Group: "things.test.io", + Version: "v3alpha1", + }, + RenderManifests: true, + AddChartVersion: "1.0.0", + Resources: []model.Resource{ + { + Kind: "kind", + Spec: model.Field{ + Type: model.Type{ + Name: "test", + Message: &v1.AcrylicType{}, + }, }, + Stored: false, }, - Stored: false, }, - }}, + }, { GroupVersion: schema.GroupVersion{ Group: "things.test.io", @@ -480,7 +487,8 @@ var _ = Describe("ManifestsRenderer", func() { }, Stored: true, }, - }}, + }, + }, { GroupVersion: schema.GroupVersion{ Group: "things.test.io", @@ -500,14 +508,14 @@ var _ = Describe("ManifestsRenderer", func() { }, Stored: true, }, - }}, + }, + }, } for i := range grps { grps[i].Init() } }) It("Renders manifests with chart and spec hash", func() { - // get api-level code gen options from descriptors outFiles, err := render.RenderManifests(render.RenderOptions{ AppName: "appName", @@ -531,25 +539,27 @@ var _ = Describe("ManifestsRenderer", func() { Describe("Render CRD template when 'EnabledAlphaApiFlagName' isn't set", func() { It("and resource contains an alpha version that should not be skipped", func() { - grps := []*model.Group{{ - GroupVersion: schema.GroupVersion{ - Group: "things.test.io", - Version: "v3alpha1", - }, - RenderManifests: true, - AddChartVersion: "1.0.0", - Resources: []model.Resource{ - { - Kind: "kind", - Spec: model.Field{ - Type: model.Type{ - Name: "test", - Message: &v1.AcrylicType{}, + grps := []*model.Group{ + { + GroupVersion: schema.GroupVersion{ + Group: "things.test.io", + Version: "v3alpha1", + }, + RenderManifests: true, + AddChartVersion: "1.0.0", + Resources: []model.Resource{ + { + Kind: "kind", + Spec: model.Field{ + Type: model.Type{ + Name: "test", + Message: &v1.AcrylicType{}, + }, }, + Stored: false, }, - Stored: false, }, - }}, + }, } for i := range grps { grps[i].Init() @@ -565,26 +575,28 @@ var _ = Describe("ManifestsRenderer", func() { Expect(err).To(Equal(fmt.Errorf("error rendering CRD template for kind kind: 'EnabledAlphaApiFlagName' is not defined"))) }) It("and resource contains an alpha version that should be skipped", func() { - grps := []*model.Group{{ - GroupVersion: schema.GroupVersion{ - Group: "things.test.io", - Version: "v3alpha1", - }, - RenderManifests: true, - AddChartVersion: "1.0.0", - SkipConditionalCRDLoading: true, - Resources: []model.Resource{ - { - Kind: "kind", - Spec: model.Field{ - Type: model.Type{ - Name: "test", - Message: &v1.AcrylicType{}, + grps := []*model.Group{ + { + GroupVersion: schema.GroupVersion{ + Group: "things.test.io", + Version: "v3alpha1", + }, + RenderManifests: true, + AddChartVersion: "1.0.0", + SkipConditionalCRDLoading: true, + Resources: []model.Resource{ + { + Kind: "kind", + Spec: model.Field{ + Type: model.Type{ + Name: "test", + Message: &v1.AcrylicType{}, + }, }, + Stored: false, }, - Stored: false, }, - }}, + }, } for i := range grps { grps[i].Init() @@ -599,4 +611,46 @@ var _ = Describe("ManifestsRenderer", func() { Expect(err).To(BeNil()) }) }) + + Describe("using protoc-gen-openapi", func() { + It("should generate CRD", func() { + grps := []*model.Group{ + { + GroupVersion: schema.GroupVersion{ + Group: "protoc-gen-openapi.test.io", + Version: "v1", + }, + RenderManifests: true, + AddChartVersion: "1.0.0", + Resources: []model.Resource{ + { + Kind: "kind", + Spec: model.Field{ + Type: model.Type{ + Name: "test", + Message: &v1.AcrylicType{}, + }, + }, + Stored: false, + }, + }, + }, + } + for i := range grps { + grps[i].Init() + } + + outFiles, err := render.RenderManifests(render.RenderOptions{ + AppName: "appName", + ManifestRoot: "manifestDir", + ProtoDir: "protoDir", + Groups: grps, + GroupOptions: model.GroupOptions{ + SchemaGenerator: schemagen.ProtocGenOpenAPI, + }, + }) + Expect(err).NotTo(HaveOccurred()) + Expect(outFiles).To(HaveLen(2)) // CRD and templated CRD + }) + }) }) diff --git a/codegen/test/chart/values.schema.json b/codegen/test/chart/values.schema.json index 23f222000..3e98bef62 100644 --- a/codegen/test/chart/values.schema.json +++ b/codegen/test/chart/values.schema.json @@ -2263,6 +2263,112 @@ "type": "null" } ] + }, + "clusterTrustBundle": { + "anyOf": [ + { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "signerName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "labelSelector": { + "anyOf": [ + { + "properties": { + "matchLabels": { + "anyOf": [ + { + "patternProperties": { + ".*": { + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "matchExpressions": { + "anyOf": [ + { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "optional": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "path": { + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] } }, "type": "object" @@ -2765,24 +2871,6 @@ "type": "null" } ] - }, - "claims": { - "anyOf": [ - { - "items": { - "properties": { - "name": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } - ] } }, "type": "object" @@ -2875,6 +2963,16 @@ "type": "null" } ] + }, + "volumeAttributesClassName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] } }, "type": "object" @@ -3849,6 +3947,21 @@ "type": "null" } ] + }, + "sleep": { + "anyOf": [ + { + "properties": { + "seconds": { + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] } }, "type": "object" @@ -3963,6 +4076,21 @@ "type": "null" } ] + }, + "sleep": { + "anyOf": [ + { + "properties": { + "seconds": { + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] } }, "type": "object" @@ -5102,6 +5230,21 @@ "type": "null" } ] + }, + "sleep": { + "anyOf": [ + { + "properties": { + "seconds": { + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] } }, "type": "object" @@ -5216,6 +5359,21 @@ "type": "null" } ] + }, + "sleep": { + "anyOf": [ + { + "properties": { + "seconds": { + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] } }, "type": "object" @@ -6325,6 +6483,21 @@ "type": "null" } ] + }, + "sleep": { + "anyOf": [ + { + "properties": { + "seconds": { + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] } }, "type": "object" @@ -6439,6 +6612,21 @@ "type": "null" } ] + }, + "sleep": { + "anyOf": [ + { + "properties": { + "seconds": { + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] } }, "type": "object" @@ -7275,6 +7463,32 @@ "type": "null" } ] + }, + "matchLabelKeys": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mismatchLabelKeys": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] } }, "type": "object" @@ -7433,6 +7647,32 @@ "type": "null" } ] + }, + "matchLabelKeys": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mismatchLabelKeys": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] } }, "type": "object" @@ -7601,6 +7841,32 @@ "type": "null" } ] + }, + "matchLabelKeys": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mismatchLabelKeys": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] } }, "type": "object" @@ -7759,6 +8025,32 @@ "type": "null" } ] + }, + "matchLabelKeys": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mismatchLabelKeys": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] } }, "type": "object" @@ -8840,6 +9132,16 @@ "hostname": { "type": "string" }, + "ipMode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, "ports": { "anyOf": [ { diff --git a/go.mod b/go.mod index 124527606..116f10c8f 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/solo-io/skv2 -go 1.21 +go 1.22 + +toolchain go1.22.2 require ( github.com/BurntSushi/toml v0.3.1 @@ -9,14 +11,16 @@ require ( github.com/avast/retry-go/v4 v4.3.3 github.com/envoyproxy/protoc-gen-validate v0.9.1 github.com/gertd/go-pluralize v0.1.1 - github.com/go-logr/logr v1.2.4 + github.com/getkin/kin-openapi v0.123.0 + github.com/ghodss/yaml v1.0.0 + github.com/go-logr/logr v1.3.0 github.com/go-logr/zapr v1.2.4 - github.com/go-test/deep v1.0.7 + github.com/go-test/deep v1.0.8 github.com/gobuffalo/packr v1.30.1 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 github.com/google/gnostic-models v0.6.8 - github.com/google/go-cmp v0.5.9 + github.com/google/go-cmp v0.6.0 github.com/hashicorp/go-multierror v1.1.0 github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 github.com/iancoleman/strcase v0.2.0 @@ -24,13 +28,13 @@ require ( github.com/lithammer/dedent v1.1.0 github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/hashstructure v1.0.0 - github.com/onsi/ginkgo/v2 v2.11.0 - github.com/onsi/gomega v1.27.10 + github.com/onsi/ginkgo/v2 v2.13.0 + github.com/onsi/gomega v1.30.0 github.com/pborman/uuid v1.2.0 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.16.0 github.com/pseudomuto/protoc-gen-doc v1.4.1 - github.com/rogpeppe/go-internal v1.10.0 + github.com/rogpeppe/go-internal v1.12.0 github.com/rotisserie/eris v0.1.1 github.com/sirupsen/logrus v1.9.0 github.com/solo-io/anyvendor v0.0.4 @@ -39,22 +43,23 @@ require ( github.com/solo-io/go-utils v0.21.4 github.com/solo-io/k8s-utils v0.0.1 github.com/solo-io/protoc-gen-ext v0.0.18 + github.com/solo-io/protoc-gen-openapi v0.2.0 github.com/spf13/pflag v1.0.5 go.uber.org/zap v1.25.0 golang.org/x/exp v0.0.0-20220921164117-439092de6870 - golang.org/x/tools v0.9.3 - google.golang.org/protobuf v1.30.0 + golang.org/x/tools v0.16.1 + google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.28.3 - k8s.io/apiextensions-apiserver v0.28.3 - k8s.io/apimachinery v0.28.3 - k8s.io/client-go v0.28.3 - k8s.io/code-generator v0.28.3 - k8s.io/klog/v2 v2.100.1 - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 + k8s.io/api v0.29.0 + k8s.io/apiextensions-apiserver v0.29.0 + k8s.io/apimachinery v0.29.0 + k8s.io/client-go v0.29.0 + k8s.io/code-generator v0.29.0 + k8s.io/klog/v2 v2.110.1 + k8s.io/utils v0.0.0-20230726121419-3b25d923346b sigs.k8s.io/controller-runtime v0.16.3 - sigs.k8s.io/yaml v1.3.0 + sigs.k8s.io/yaml v1.4.0 ) require ( @@ -71,11 +76,10 @@ require ( github.com/emicklei/proto v1.6.15 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-openapi/jsonpointer v0.20.2 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/swag v0.22.8 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gobuffalo/envy v1.8.1 // indirect github.com/gobuffalo/packd v0.3.0 // indirect @@ -83,58 +87,62 @@ require ( github.com/golang/glog v1.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect + github.com/google/pprof v0.0.0-20211214055906-6f57359322fd // indirect github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/errwrap v1.0.0 // indirect github.com/huandu/xstrings v1.3.1 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/invopop/yaml v0.2.0 // indirect github.com/joho/godotenv v1.3.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/k0kubun/pp v2.3.0+incompatible // indirect github.com/lyft/protoc-gen-star v0.6.1 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.7 // indirect - github.com/mattn/go-isatty v0.0.12 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-zglob v0.0.3 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/copystructure v1.0.0 // indirect github.com/mitchellh/reflectwalk v1.0.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 // indirect + github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect github.com/pseudomuto/protokit v0.2.0 // indirect github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.3.1 // indirect - github.com/spf13/cobra v1.7.0 // indirect + github.com/spf13/cobra v1.8.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.16.0 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sync v0.2.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/oauth2 v0.10.0 // indirect + golang.org/x/sync v0.5.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect + google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e // indirect gopkg.in/inf.v0 v0.9.1 // indirect - k8s.io/component-base v0.28.3 // indirect - k8s.io/gengo v0.0.0-20220902162205-c0856e24416d // indirect - k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect + k8s.io/component-base v0.29.0 // indirect + k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + sigs.k8s.io/controller-tools v0.14.0 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) replace ( @@ -146,4 +154,7 @@ replace ( github.com/Sirupsen/logrus => github.com/sirupsen/logrus v1.4.2 github.com/docker/docker => github.com/moby/moby v24.0.7+incompatible github.com/operator-framework/operator-lifecycle-manager => github.com/operator-framework/operator-lifecycle-manager v0.0.0-20190605231540-b8a4faf68e36 + + // Required to import kin-openapi/openapi3 + github.com/ugorji/go => github.com/ugorji/go/codec v1.2.12 ) diff --git a/go.sum b/go.sum index c084d924a..4ca710658 100644 --- a/go.sum +++ b/go.sum @@ -176,7 +176,7 @@ github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfc github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/crewjam/httperr v0.0.0-20190612203328-a946449404da/go.mod h1:+rmNIXRvYMqLQeR4DHyTvs6y0MEMymTz4vyFpFkKTPs= @@ -244,12 +244,14 @@ github.com/fgrosse/zaptest v1.1.0/go.mod h1:vMnRSul6kW7kIUXZgnZZcDwyTn8k49ODfAUL github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +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/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gertd/go-pluralize v0.1.1 h1:fQhql/WRRwr4TVp+TCw12s2esCacvEVBdkTUUwNqF/Q= github.com/gertd/go-pluralize v0.1.1/go.mod h1:t5DfHcumb6m0RqyVJDrDLEzL2AGeaiqUXIcDNwLaeAs= +github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8= +github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= @@ -273,9 +275,9 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= @@ -293,8 +295,9 @@ github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwds github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= +github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= @@ -325,8 +328,9 @@ github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/ github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicbw= +github.com/go-openapi/swag v0.22.8/go.mod h1:6QT22icPLEqAM/z/TChgb4WAveCHF92+2gF0CNjHpPI= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= @@ -335,8 +339,8 @@ github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= -github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= +github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= +github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= github.com/gobuffalo/envy v1.8.1 h1:RUr68liRvs0TS1D5qdW3mQv2SjAsu1QWMCx1tG4kDjs= @@ -415,8 +419,9 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= 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= github.com/google/go-github/v29 v29.0.2/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E= github.com/google/go-github/v29 v29.0.3/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E= github.com/google/go-github/v32 v32.0.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI= @@ -438,8 +443,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y= +github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -512,6 +517,7 @@ github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHL github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -523,6 +529,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/invopop/jsonschema v0.7.0 h1:2vgQcBz1n256N+FpX3Jq7Y17AjYt46Ig3zIWyy770So= github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= +github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= +github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= @@ -599,12 +607,13 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +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.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +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= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= @@ -642,6 +651,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de h1:D5x39vF5KCwKQaw+OC9ZPiLVHXz3UFw2+psEX+gYcto= github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de/go.mod h1:kJun4WP5gFuHZgRjZUWWuH1DTxCtxbHDOIJsudS8jzY= @@ -654,8 +665,9 @@ github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -667,10 +679,11 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -678,8 +691,8 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -696,6 +709,8 @@ github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= +github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -758,8 +773,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rollbar/rollbar-go v1.0.2/go.mod h1:AcFs5f0I+c71bpHlXNNDbOWJiKwjFDtISeXco0L5PKQ= github.com/rotisserie/eris v0.1.1 h1:C0wEdnJ6+3jYx2r8RS4xBM+ZW+mVrXGocIaFbTdRYCA= github.com/rotisserie/eris v0.1.1/go.mod h1:2ik3CyJrzlOjGyDGrKfqZivSfmkhCS3ktE+T1mNzzLk= @@ -803,6 +818,8 @@ github.com/solo-io/k8s-utils v0.0.1 h1:e2alFsqTT7GU10d6cFDX2y+86J142DrsRwy5itvvZ github.com/solo-io/k8s-utils v0.0.1/go.mod h1:53N9+9Gl2MwqIZJ7/ocA9gKvWt+6z7MPD2qKQix7oFE= github.com/solo-io/protoc-gen-ext v0.0.18 h1:zSAL8NzWpJUGYoA5IyjHiKASNyHjR0uxBQ7eQS94i3A= github.com/solo-io/protoc-gen-ext v0.0.18/go.mod h1:iGyCvmKmhJNXs5MgBcYFBF0om7LDnCVD2WwhOZGnqeA= +github.com/solo-io/protoc-gen-openapi v0.2.0 h1:bT3Fg9JACXjxtaF646z5DSrOOnOexTwmXh5vnMAJgvc= +github.com/solo-io/protoc-gen-openapi v0.2.0/go.mod h1:osEjRl1miHqlq4Wl/8SEqHFoyydptPL1EzEdM9c4vfE= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= @@ -819,8 +836,8 @@ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -849,15 +866,18 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= @@ -940,8 +960,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -985,8 +1005,8 @@ golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hM golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1036,8 +1056,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1047,8 +1067,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1061,8 +1081,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1102,7 +1122,6 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1130,13 +1149,15 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/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-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.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.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1145,8 +1166,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1221,8 +1242,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= 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= @@ -1301,10 +1322,10 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e h1:z3vDksarJxsAKM5dmEGv0GHwE2hKJ096wZra71Vs4sw= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1337,8 +1358,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/AlecAivazis/survey.v1 v1.8.2/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -1378,6 +1399,7 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= @@ -1391,53 +1413,53 @@ 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= k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8= k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= -k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= -k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/api v0.29.0 h1:NiCdQMY1QOp1H8lfRyeEf8eOwV6+0xA6XEE44ohDX2A= +k8s.io/api v0.29.0/go.mod h1:sdVmXoz2Bo/cb77Pxi71IPTSErEW32xa4aXwKH7gfBA= k8s.io/apiextensions-apiserver v0.18.0/go.mod h1:18Cwn1Xws4xnWQNC00FLq1E350b9lUF+aOdIWDOZxgo= k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= -k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= -k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apiextensions-apiserver v0.29.0 h1:0VuspFG7Hj+SxyF/Z/2T0uFbI5gb5LRgEyUVE3Q4lV0= +k8s.io/apiextensions-apiserver v0.29.0/go.mod h1:TKmpy3bTS0mr9pylH0nOt/QzQRrW7/h7yLdRForMZwc= k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= -k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= -k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/apimachinery v0.29.0 h1:+ACVktwyicPz0oc6MTMLwa2Pw3ouLAfAon1wPLtG48o= +k8s.io/apimachinery v0.29.0/go.mod h1:eVBxQ/cwiJxH58eK/jd/vAk4mrxmVlnpBH5J2GbMeis= k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw= k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= k8s.io/cli-runtime v0.18.0/go.mod h1:1eXfmBsIJosjn9LjEBUd2WVPoPAY9XGTqTFcPMIBsUQ= k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8= k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= -k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= -k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/client-go v0.29.0 h1:KmlDtFcrdUzOYrBhXHgKw5ycWzc3ryPX5mQe0SkG3y8= +k8s.io/client-go v0.29.0/go.mod h1:yLkXH4HKMAywcrD82KMSmfYg2DlE8mepPR4JGSo5n38= k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= -k8s.io/code-generator v0.28.3 h1:I847QvdpYx7xKiG2KVQeCSyNF/xU9TowaDAg601mvlw= -k8s.io/code-generator v0.28.3/go.mod h1:A2EAHTRYvCvBrb/MM2zZBNipeCk3f8NtpdNIKawC43M= +k8s.io/code-generator v0.29.0 h1:2LQfayGDhaIlaamXjIjEQlCMy4JNCH9lrzas4DNW1GQ= +k8s.io/code-generator v0.29.0/go.mod h1:5bqIZoCxs2zTRKMWNYqyQWW/bajc+ah4rh0tMY8zdGA= k8s.io/component-base v0.18.0/go.mod h1:u3BCg0z1uskkzrnAKFzulmYaEpZF7XC9Pf/uFyb1v2c= k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= -k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= -k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/component-base v0.29.0 h1:T7rjd5wvLnPBV1vC4zWd/iWRbV8Mdxs+nGaoaFzGw3s= +k8s.io/component-base v0.29.0/go.mod h1:sADonFTQ9Zc9yFLghpDpmNXEdHyQmFIGbiuZbqAXQ1M= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20220902162205-c0856e24416d h1:U9tB195lKdzwqicbJvyJeOXV7Klv+wNAWENRnXEGi08= -k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +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/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= -k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= k8s.io/kubectl v0.18.0/go.mod h1:LOkWx9Z5DXMEg5KtOjHhRiC1fqJPLyCr3KtQgEolCkU= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/metrics v0.18.0/go.mod h1:8aYTW18koXqjLVKL7Ds05RPMX9ipJZI3mywYvBOxXd4= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +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= rsc.io/letsencrypt v0.0.1/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= @@ -1446,15 +1468,17 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT sigs.k8s.io/controller-runtime v0.6.2/go.mod h1:vhcq/rlnENJ09SIRp3EveTaZ0yqH526hjf9iJdbUJ/E= sigs.k8s.io/controller-runtime v0.16.3 h1:2TuvuokmfXvDUamSx1SuAOO3eTyye+47mJCigwG62c4= sigs.k8s.io/controller-runtime v0.16.3/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= +sigs.k8s.io/controller-tools v0.14.0 h1:rnNoCC5wSXlrNoBKKzL70LNJKIQKEzT6lloG6/LF73A= +sigs.k8s.io/controller-tools v0.14.0/go.mod h1:TV7uOtNNnnR72SpzhStvPkoS/U5ir0nMudrkrC4M9Sc= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI=