Merge pull request #123529 from thockin/go-workspaces
Go workspaces for k/k and k/staging/*
This commit is contained in:
		
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,7 +1,3 @@ | ||||
| # gopls gets indigestion without go.work, CI gets indigestion WITH go.work | ||||
| /go.work | ||||
| /go.work.sum | ||||
|  | ||||
| # OSX leaves these everywhere on SMB shares | ||||
| ._* | ||||
|  | ||||
|   | ||||
							
								
								
									
										4
									
								
								LICENSES/vendor/k8s.io/gengo/LICENSE → LICENSES/vendor/k8s.io/gengo/v2/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								LICENSES/vendor/k8s.io/gengo/LICENSE → LICENSES/vendor/k8s.io/gengo/v2/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| = vendor/k8s.io/gengo licensed under: = | ||||
| = vendor/k8s.io/gengo/v2 licensed under: = | ||||
| 
 | ||||
| 
 | ||||
|                                  Apache License | ||||
| @@ -203,4 +203,4 @@ | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| 
 | ||||
| = vendor/k8s.io/gengo/LICENSE ad09685d909e7a9f763d2bb62d4bd6fb | ||||
| = vendor/k8s.io/gengo/v2/LICENSE ad09685d909e7a9f763d2bb62d4bd6fb | ||||
| @@ -43,8 +43,6 @@ If you want to build Kubernetes right away there are two options: | ||||
| ##### You have a working [Go environment]. | ||||
|  | ||||
| ``` | ||||
| mkdir -p $GOPATH/src/k8s.io | ||||
| cd $GOPATH/src/k8s.io | ||||
| git clone https://github.com/kubernetes/kubernetes | ||||
| cd kubernetes | ||||
| make | ||||
|   | ||||
							
								
								
									
										10
									
								
								api/openapi-spec/swagger.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										10
									
								
								api/openapi-spec/swagger.json
									
									
									
										generated
									
									
									
								
							| @@ -1449,7 +1449,8 @@ | ||||
|       "required": [ | ||||
|         "type", | ||||
|         "status", | ||||
|         "reason" | ||||
|         "reason", | ||||
|         "message" | ||||
|       ], | ||||
|       "type": "object" | ||||
|     }, | ||||
| @@ -13477,6 +13478,9 @@ | ||||
|           "description": "ParentRef references the resource that an IPAddress is attached to. An IPAddress must reference a parent object." | ||||
|         } | ||||
|       }, | ||||
|       "required": [ | ||||
|         "parentRef" | ||||
|       ], | ||||
|       "type": "object" | ||||
|     }, | ||||
|     "io.k8s.api.networking.v1alpha1.ParentReference": { | ||||
| @@ -13499,6 +13503,10 @@ | ||||
|           "type": "string" | ||||
|         } | ||||
|       }, | ||||
|       "required": [ | ||||
|         "resource", | ||||
|         "name" | ||||
|       ], | ||||
|       "type": "object" | ||||
|     }, | ||||
|     "io.k8s.api.networking.v1alpha1.ServiceCIDR": { | ||||
|   | ||||
| @@ -124,7 +124,8 @@ | ||||
|         "required": [ | ||||
|           "type", | ||||
|           "status", | ||||
|           "reason" | ||||
|           "reason", | ||||
|           "message" | ||||
|         ], | ||||
|         "type": "object" | ||||
|       }, | ||||
|   | ||||
| @@ -97,6 +97,9 @@ | ||||
|             "description": "ParentRef references the resource that an IPAddress is attached to. An IPAddress must reference a parent object." | ||||
|           } | ||||
|         }, | ||||
|         "required": [ | ||||
|           "parentRef" | ||||
|         ], | ||||
|         "type": "object" | ||||
|       }, | ||||
|       "io.k8s.api.networking.v1alpha1.ParentReference": { | ||||
| @@ -119,6 +122,10 @@ | ||||
|             "type": "string" | ||||
|           } | ||||
|         }, | ||||
|         "required": [ | ||||
|           "resource", | ||||
|           "name" | ||||
|         ], | ||||
|         "type": "object" | ||||
|       }, | ||||
|       "io.k8s.api.networking.v1alpha1.ServiceCIDR": { | ||||
|   | ||||
| @@ -81,6 +81,7 @@ readonly LOCAL_OUTPUT_IMAGE_STAGING="${LOCAL_OUTPUT_ROOT}/images" | ||||
| # This is a symlink to binaries for "this platform" (e.g. build tools). | ||||
| readonly THIS_PLATFORM_BIN="${LOCAL_OUTPUT_ROOT}/bin" | ||||
|  | ||||
| readonly KUBE_GO_PACKAGE=k8s.io/kubernetes | ||||
| readonly REMOTE_ROOT="/go/src/${KUBE_GO_PACKAGE}" | ||||
| readonly REMOTE_OUTPUT_ROOT="${REMOTE_ROOT}/_output" | ||||
| readonly REMOTE_OUTPUT_SUBPATH="${REMOTE_OUTPUT_ROOT}/dockerized" | ||||
|   | ||||
| @@ -48,7 +48,6 @@ MAKEFLAGS += --warn-undefined-variables | ||||
| .EXPORT_ALL_VARIABLES: | ||||
| OUT_DIR ?= _output | ||||
| BIN_DIR := $(OUT_DIR)/bin | ||||
| PRJ_SRC_PATH := k8s.io/kubernetes | ||||
|  | ||||
| ifdef KUBE_GOFLAGS | ||||
| $(info KUBE_GOFLAGS is now deprecated. Please use GOFLAGS instead.) | ||||
| @@ -67,9 +66,9 @@ define ALL_HELP_INFO | ||||
| # Build code. | ||||
| # | ||||
| # Args: | ||||
| #   WHAT: Directory names to build.  If any of these directories has a 'main' | ||||
| #     package, the build will produce executable files under $(OUT_DIR)/bin. | ||||
| #     If not specified, "everything" will be built. | ||||
| #   WHAT: Directory or Go package names to build.  If any of these directories | ||||
| #   has a 'main' package, the build will produce executable files under | ||||
| #   $(OUT_DIR)/bin.  If not specified, "everything" will be built. | ||||
| #     "vendor/<module>/<path>" is accepted as alias for "<module>/<path>". | ||||
| #     "ginkgo" is an alias for the ginkgo CLI. | ||||
| #   GOFLAGS: Extra flags to pass to 'go' when building. | ||||
| @@ -83,9 +82,9 @@ define ALL_HELP_INFO | ||||
| #   make all | ||||
| #   make all WHAT=cmd/kubelet GOFLAGS=-v | ||||
| #   make all DBG=1 | ||||
| #     Note: Specify DBG=1 for building unstripped binaries, which allows you to use code debugging | ||||
| #           tools like delve. When DBG is unspecified, it defaults to "-s -w" which strips debug | ||||
| #           information. | ||||
| #     Note: Specify DBG=1 for building unstripped binaries, which allows you to | ||||
| #     use code debugging tools like delve. When DBG is unspecified, it defaults | ||||
| #     to "-s -w" which strips debug information. | ||||
| endef | ||||
| .PHONY: all | ||||
| ifeq ($(PRINT_HELP),y) | ||||
|   | ||||
| @@ -23,12 +23,10 @@ package tools | ||||
| import ( | ||||
| 	// build script dependencies | ||||
| 	_ "github.com/onsi/ginkgo/v2/ginkgo" | ||||
| 	_ "k8s.io/code-generator/cmd/deepcopy-gen" | ||||
| 	_ "k8s.io/code-generator/cmd/defaulter-gen" | ||||
| 	_ "k8s.io/code-generator/cmd/go-to-protobuf" | ||||
| 	_ "k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo" | ||||
| 	_ "k8s.io/gengo/examples/deepcopy-gen/generators" | ||||
| 	_ "k8s.io/gengo/examples/defaulter-gen/generators" | ||||
| 	_ "k8s.io/gengo/examples/import-boss/generators" | ||||
| 	_ "k8s.io/gengo/examples/set-gen/generators" | ||||
| 	_ "k8s.io/kube-openapi/cmd/openapi-gen" | ||||
|  | ||||
| 	// submodule test dependencies | ||||
|   | ||||
							
								
								
									
										104
									
								
								cmd/import-boss/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								cmd/import-boss/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | ||||
| ## Purpose | ||||
|  | ||||
| `import-boss` enforces optional import restrictions between packages.  This is | ||||
| useful to manage the dependency graph within a large repository, such as | ||||
| [kubernetes](https://github.com/kubernetes/kubernetes). | ||||
|  | ||||
| ## How does it work? | ||||
|  | ||||
| When a package is verified, `import-boss` looks for a file called | ||||
| `.import-restrictions` in the same directory and all parent directories, up to | ||||
| the module root (defined by the presence of a go.mod file).  These files | ||||
| contain rules which are evaluated against each dependency of the package in | ||||
| question. | ||||
|  | ||||
| Evaluation starts with the rules file closest to the package.  If that file | ||||
| makes a determination to allow or forbid the import, evaluation is done.  If | ||||
| the import does not match any rule, the next-closest rules file is consulted, | ||||
| and so forth.  If the rules files are exhausted and no determination has been | ||||
| made, the import will be flagged as an error. | ||||
|  | ||||
| ### What are rules files? | ||||
|  | ||||
| A rules file is a JSON or YAML document with two top-level keys, both optional: | ||||
| * `Rules` | ||||
| * `InverseRules` | ||||
|  | ||||
| ### What are Rules? | ||||
|  | ||||
| A `rule` defines a policy to be enforced on packages which are depended on by | ||||
| the package in question.  It consists of three parts: | ||||
|   - A `SelectorRegexp`, to select the import paths that the rule applies to. | ||||
|   - A list of `AllowedPrefixes` | ||||
|   - A list of `ForbiddenPrefixes` | ||||
|  | ||||
| An import is allowed if it matches at least one allowed prefix and does not | ||||
| match any forbidden prefixes. | ||||
|  | ||||
| Rules also have a boolean `Transitive` option. When this option is true, the | ||||
| rule is applied to transitive imports. | ||||
|  | ||||
| Example: | ||||
|  | ||||
| ```json | ||||
| { | ||||
|   "Rules": [ | ||||
|     { | ||||
|       "SelectorRegexp": "example[.]com", | ||||
|       "AllowedPrefixes": [ | ||||
|         "example.com/project/package", | ||||
|         "example.com/other/package" | ||||
|       ], | ||||
|       "ForbiddenPrefixes": [ | ||||
|         "example.com/legacy/package" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "SelectorRegexp": "^unsafe$", | ||||
|       "AllowedPrefixes": [], | ||||
|       "ForbiddenPrefixes": [ "" ], | ||||
|       "Transitive": true | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| ``` | ||||
|  | ||||
| The `SelectorRegexp` specifies that this rule applies only to imports which | ||||
| match that regex. | ||||
|  | ||||
| Note: an empty list (`[]`) matches nothing, and an empty string (`""`) is a | ||||
| prefix of everything. | ||||
|  | ||||
| ### What are InverseRules? | ||||
|  | ||||
| In contrast to rules, which are defined in terms of "things this package | ||||
| depends on", inverse rules are defined in terms of "things which import this | ||||
| package".  This allows for fine-grained import restrictions for "semi-private | ||||
| packages" which are more sophisticated than Go's `internal` convention. | ||||
|  | ||||
| If inverse rules are found, then all known imports of the package are checked | ||||
| against each such rule, in the same fashion as regular rules.  Note that this | ||||
| can only handle known imports, which is defined as any package which is also | ||||
| being considered by this `import-boss` run.  For most repositories, `./...` will | ||||
| suffice. | ||||
|  | ||||
| Example: | ||||
|  | ||||
| ```yaml | ||||
| inverseRules: | ||||
|   - selectorRegexp: example[.]com | ||||
|     allowedPrefixes: | ||||
|       - example.com/this-same-repo | ||||
|       - example.com/close-friend/legacy | ||||
|     forbiddenPrefixes: | ||||
|       - example.com/other-project | ||||
|   - selectorRegexp: example[.]com | ||||
|     transitive: true | ||||
|     forbiddenPrefixes: | ||||
|       - example.com/other-team | ||||
| ``` | ||||
|  | ||||
| ## How do I run import-boss? | ||||
|  | ||||
| For most scenarios, simply running `import-boss ./...` will work.  For projects | ||||
| which use Go workspaces, this can even span multiple modules. | ||||
							
								
								
									
										585
									
								
								cmd/import-boss/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										585
									
								
								cmd/import-boss/main.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,585 @@ | ||||
| /* | ||||
| Copyright 2016 The Kubernetes Authors. | ||||
|  | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| */ | ||||
|  | ||||
| // import-boss enforces import restrictions in a given repository. | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"os" | ||||
|  | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"path/filepath" | ||||
| 	"regexp" | ||||
| 	"sort" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/spf13/pflag" | ||||
| 	"golang.org/x/tools/go/packages" | ||||
| 	"k8s.io/klog/v2" | ||||
| 	"sigs.k8s.io/yaml" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	rulesFileName = ".import-restrictions" | ||||
| 	goModFile     = "go.mod" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
| 	klog.InitFlags(nil) | ||||
| 	pflag.CommandLine.AddGoFlagSet(flag.CommandLine) | ||||
| 	pflag.Parse() | ||||
|  | ||||
| 	pkgs, err := loadPkgs(pflag.Args()...) | ||||
| 	if err != nil { | ||||
| 		klog.Errorf("failed to load packages: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	pkgs = massage(pkgs) | ||||
| 	boss := newBoss(pkgs) | ||||
|  | ||||
| 	var allErrs []error | ||||
| 	for _, pkg := range pkgs { | ||||
| 		if pkgErrs := boss.Verify(pkg); pkgErrs != nil { | ||||
| 			allErrs = append(allErrs, pkgErrs...) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	fail := false | ||||
| 	for _, err := range allErrs { | ||||
| 		if lister, ok := err.(interface{ Unwrap() []error }); ok { | ||||
| 			for _, err := range lister.Unwrap() { | ||||
| 				fmt.Printf("ERROR: %v\n", err) | ||||
| 			} | ||||
| 		} else { | ||||
| 			fmt.Printf("ERROR: %v\n", err) | ||||
| 		} | ||||
| 		fail = true | ||||
| 	} | ||||
|  | ||||
| 	if fail { | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
|  | ||||
| 	klog.V(2).Info("Completed successfully.") | ||||
| } | ||||
|  | ||||
| func loadPkgs(patterns ...string) ([]*packages.Package, error) { | ||||
| 	cfg := packages.Config{ | ||||
| 		Mode: packages.NeedName | packages.NeedFiles | packages.NeedImports | | ||||
| 			packages.NeedDeps | packages.NeedModule, | ||||
| 		Tests: true, | ||||
| 	} | ||||
|  | ||||
| 	klog.V(1).Infof("loading: %v", patterns) | ||||
| 	tBefore := time.Now() | ||||
| 	pkgs, err := packages.Load(&cfg, patterns...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	klog.V(2).Infof("loaded %d pkg(s) in %v", len(pkgs), time.Since(tBefore)) | ||||
|  | ||||
| 	var allErrs []error | ||||
| 	for _, pkg := range pkgs { | ||||
| 		var errs []error | ||||
| 		for _, e := range pkg.Errors { | ||||
| 			if e.Kind == packages.ListError || e.Kind == packages.ParseError { | ||||
| 				errs = append(errs, e) | ||||
| 			} | ||||
| 		} | ||||
| 		if len(errs) > 0 { | ||||
| 			allErrs = append(allErrs, fmt.Errorf("error(s) in %q: %w", pkg.PkgPath, errors.Join(errs...))) | ||||
| 		} | ||||
| 	} | ||||
| 	if len(allErrs) > 0 { | ||||
| 		return nil, errors.Join(allErrs...) | ||||
| 	} | ||||
|  | ||||
| 	return pkgs, nil | ||||
| } | ||||
|  | ||||
| func massage(in []*packages.Package) []*packages.Package { | ||||
| 	out := []*packages.Package{} | ||||
|  | ||||
| 	for _, pkg := range in { | ||||
| 		klog.V(2).Infof("considering pkg: %q", pkg.PkgPath) | ||||
|  | ||||
| 		// Discard packages which represent the <pkg>.test result.  They don't seem | ||||
| 		// to hold any interesting source info. | ||||
| 		if strings.HasSuffix(pkg.PkgPath, ".test") { | ||||
| 			klog.V(3).Infof("ignoring testbin pkg: %q", pkg.PkgPath) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// Packages which end in "_test" have tests which use the special "_test" | ||||
| 		// package suffix.  Packages which have test files must be tests.  Don't | ||||
| 		// ask me, this is what packages.Load produces. | ||||
| 		if strings.HasSuffix(pkg.PkgPath, "_test") || hasTestFiles(pkg.GoFiles) { | ||||
| 			// NOTE: This syntax can be undone with unmassage(). | ||||
| 			pkg.PkgPath = strings.TrimSuffix(pkg.PkgPath, "_test") + " ((tests:" + pkg.Name + "))" | ||||
| 			klog.V(3).Infof("renamed to: %q", pkg.PkgPath) | ||||
| 		} | ||||
| 		out = append(out, pkg) | ||||
| 	} | ||||
|  | ||||
| 	return out | ||||
| } | ||||
|  | ||||
| func unmassage(str string) string { | ||||
| 	idx := strings.LastIndex(str, " ((") | ||||
| 	if idx == -1 { | ||||
| 		return str | ||||
| 	} | ||||
| 	return str[0:idx] | ||||
| } | ||||
|  | ||||
| type ImportBoss struct { | ||||
| 	// incomingImports holds all the packages importing the key. | ||||
| 	incomingImports map[string][]string | ||||
|  | ||||
| 	// transitiveIncomingImports holds the transitive closure of | ||||
| 	// incomingImports. | ||||
| 	transitiveIncomingImports map[string][]string | ||||
| } | ||||
|  | ||||
| func newBoss(pkgs []*packages.Package) *ImportBoss { | ||||
| 	boss := &ImportBoss{ | ||||
| 		incomingImports:           map[string][]string{}, | ||||
| 		transitiveIncomingImports: map[string][]string{}, | ||||
| 	} | ||||
|  | ||||
| 	for _, pkg := range pkgs { | ||||
| 		// Accumulate imports | ||||
| 		for imp := range pkg.Imports { | ||||
| 			boss.incomingImports[imp] = append(boss.incomingImports[imp], pkg.PkgPath) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	boss.transitiveIncomingImports = transitiveClosure(boss.incomingImports) | ||||
|  | ||||
| 	return boss | ||||
| } | ||||
|  | ||||
| func hasTestFiles(files []string) bool { | ||||
| 	for _, f := range files { | ||||
| 		if strings.HasSuffix(f, "_test.go") { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (boss *ImportBoss) Verify(pkg *packages.Package) []error { | ||||
| 	pkgDir := packageDir(pkg) | ||||
| 	if pkgDir == "" { | ||||
| 		// This Package has no usable files, e.g. only tests, which are modelled in | ||||
| 		// a distinct Package. | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	restrictionFiles, err := recursiveRead(filepath.Join(pkgDir, rulesFileName)) | ||||
| 	if err != nil { | ||||
| 		return []error{fmt.Errorf("error finding rules file: %w", err)} | ||||
| 	} | ||||
| 	if len(restrictionFiles) == 0 { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	klog.V(2).Infof("verifying pkg %q (%s)", pkg.PkgPath, pkgDir) | ||||
| 	var errs []error | ||||
| 	errs = append(errs, boss.verifyRules(pkg, restrictionFiles)...) | ||||
| 	errs = append(errs, boss.verifyInverseRules(pkg, restrictionFiles)...) | ||||
| 	return errs | ||||
| } | ||||
|  | ||||
| // packageDir tries to figure out the directory of the specified package. | ||||
| func packageDir(pkg *packages.Package) string { | ||||
| 	if len(pkg.GoFiles) > 0 { | ||||
| 		return filepath.Dir(pkg.GoFiles[0]) | ||||
| 	} | ||||
| 	if len(pkg.IgnoredFiles) > 0 { | ||||
| 		return filepath.Dir(pkg.IgnoredFiles[0]) | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type FileFormat struct { | ||||
| 	Rules        []Rule | ||||
| 	InverseRules []Rule | ||||
|  | ||||
| 	path string | ||||
| } | ||||
|  | ||||
| // A single import restriction rule. | ||||
| type Rule struct { | ||||
| 	// All import paths that match this regexp... | ||||
| 	SelectorRegexp string | ||||
| 	// ... must have one of these prefixes ... | ||||
| 	AllowedPrefixes []string | ||||
| 	// ... and must not have one of these prefixes. | ||||
| 	ForbiddenPrefixes []string | ||||
| 	// True if the rule is to be applied to transitive imports. | ||||
| 	Transitive bool | ||||
| } | ||||
|  | ||||
| // Disposition represents a decision or non-decision. | ||||
| type Disposition int | ||||
|  | ||||
| const ( | ||||
| 	// DepForbidden means the dependency was explicitly forbidden by a rule. | ||||
| 	DepForbidden Disposition = iota | ||||
| 	// DepAllowed means the dependency was explicitly allowed by a rule. | ||||
| 	DepAllowed | ||||
| 	// DepAllowed means the dependency did not match any rule. | ||||
| 	DepUnknown | ||||
| ) | ||||
|  | ||||
| // Evaluate considers this rule and decides if this dependency is allowed. | ||||
| func (r Rule) Evaluate(imp string) Disposition { | ||||
| 	// To pass, an import muct be allowed and not forbidden. | ||||
| 	// Check forbidden first. | ||||
| 	for _, forbidden := range r.ForbiddenPrefixes { | ||||
| 		klog.V(5).Infof("checking %q against forbidden prefix %q", imp, forbidden) | ||||
| 		if hasPathPrefix(imp, forbidden) { | ||||
| 			klog.V(5).Infof("this import of %q is forbidden", imp) | ||||
| 			return DepForbidden | ||||
| 		} | ||||
| 	} | ||||
| 	for _, allowed := range r.AllowedPrefixes { | ||||
| 		klog.V(5).Infof("checking %q against allowed prefix %q", imp, allowed) | ||||
| 		if hasPathPrefix(imp, allowed) { | ||||
| 			klog.V(5).Infof("this import of %q is allowed", imp) | ||||
| 			return DepAllowed | ||||
| 		} | ||||
| 	} | ||||
| 	return DepUnknown | ||||
| } | ||||
|  | ||||
| // recursiveRead collects all '.import-restriction' files, between the current directory, | ||||
| // and the module root. | ||||
| func recursiveRead(path string) ([]*FileFormat, error) { | ||||
| 	restrictionFiles := make([]*FileFormat, 0) | ||||
|  | ||||
| 	for { | ||||
| 		if _, err := os.Stat(path); err == nil { | ||||
| 			rules, err := readFile(path) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
|  | ||||
| 			restrictionFiles = append(restrictionFiles, rules) | ||||
| 		} | ||||
|  | ||||
| 		nextPath, removedDir := removeLastDir(path) | ||||
| 		if nextPath == path || isGoModRoot(path) || removedDir == "src" { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		path = nextPath | ||||
| 	} | ||||
|  | ||||
| 	return restrictionFiles, nil | ||||
| } | ||||
|  | ||||
| func readFile(path string) (*FileFormat, error) { | ||||
| 	currentBytes, err := os.ReadFile(path) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("couldn't read %v: %w", path, err) | ||||
| 	} | ||||
|  | ||||
| 	var current FileFormat | ||||
| 	err = yaml.Unmarshal(currentBytes, ¤t) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("couldn't unmarshal %v: %w", path, err) | ||||
| 	} | ||||
| 	current.path = path | ||||
| 	return ¤t, nil | ||||
| } | ||||
|  | ||||
| // isGoModRoot checks if a directory is the root directory for a package | ||||
| // by checking for the existence of a 'go.mod' file in that directory. | ||||
| func isGoModRoot(path string) bool { | ||||
| 	_, err := os.Stat(filepath.Join(filepath.Dir(path), goModFile)) | ||||
| 	return err == nil | ||||
| } | ||||
|  | ||||
| // removeLastDir removes the last directory, but leaves the file name | ||||
| // unchanged. It returns the new path and the removed directory. So: | ||||
| // "a/b/c/file" -> ("a/b/file", "c") | ||||
| func removeLastDir(path string) (newPath, removedDir string) { | ||||
| 	dir, file := filepath.Split(path) | ||||
| 	dir = strings.TrimSuffix(dir, string(filepath.Separator)) | ||||
| 	return filepath.Join(filepath.Dir(dir), file), filepath.Base(dir) | ||||
| } | ||||
|  | ||||
| func (boss *ImportBoss) verifyRules(pkg *packages.Package, restrictionFiles []*FileFormat) []error { | ||||
| 	klog.V(3).Infof("verifying pkg %q rules", pkg.PkgPath) | ||||
|  | ||||
| 	// compile all Selector regex in all restriction files | ||||
| 	selectors := make([][]*regexp.Regexp, len(restrictionFiles)) | ||||
| 	for i, restrictionFile := range restrictionFiles { | ||||
| 		for _, r := range restrictionFile.Rules { | ||||
| 			re, err := regexp.Compile(r.SelectorRegexp) | ||||
| 			if err != nil { | ||||
| 				return []error{ | ||||
| 					fmt.Errorf("regexp `%s` in file %q doesn't compile: %w", r.SelectorRegexp, restrictionFile.path, err), | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			selectors[i] = append(selectors[i], re) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	realPkgPath := unmassage(pkg.PkgPath) | ||||
|  | ||||
| 	direct, indirect := transitiveImports(pkg) | ||||
| 	isDirect := map[string]bool{} | ||||
| 	for _, imp := range direct { | ||||
| 		isDirect[imp] = true | ||||
| 	} | ||||
| 	relate := func(imp string) string { | ||||
| 		if isDirect[imp] { | ||||
| 			return "->" | ||||
| 		} | ||||
| 		return "-->" | ||||
| 	} | ||||
|  | ||||
| 	var errs []error | ||||
| 	for _, imp := range uniq(direct, indirect) { | ||||
| 		if unmassage(imp) == realPkgPath { | ||||
| 			// Tests in package "foo_test" depend on the test package for | ||||
| 			// "foo" (if both exist in a giver directory). | ||||
| 			continue | ||||
| 		} | ||||
| 		klog.V(4).Infof("considering import %q %s %q", pkg.PkgPath, relate(imp), imp) | ||||
| 		matched := false | ||||
| 		decided := false | ||||
| 		for i, file := range restrictionFiles { | ||||
| 			klog.V(4).Infof("rules file %s", file.path) | ||||
| 			for j, rule := range file.Rules { | ||||
| 				if !rule.Transitive && !isDirect[imp] { | ||||
| 					continue | ||||
| 				} | ||||
| 				matching := selectors[i][j].MatchString(imp) | ||||
| 				if !matching { | ||||
| 					continue | ||||
| 				} | ||||
| 				matched = true | ||||
| 				klog.V(6).Infof("selector %v matches %q", rule.SelectorRegexp, imp) | ||||
|  | ||||
| 				disp := rule.Evaluate(imp) | ||||
| 				if disp == DepAllowed { | ||||
| 					decided = true | ||||
| 					break // no further rules, next file | ||||
| 				} else if disp == DepForbidden { | ||||
| 					errs = append(errs, fmt.Errorf("%q %s %q is forbidden by %s", pkg.PkgPath, relate(imp), imp, file.path)) | ||||
| 					decided = true | ||||
| 					break // no further rules, next file | ||||
| 				} | ||||
| 			} | ||||
| 			if decided { | ||||
| 				break // no further files, next import | ||||
| 			} | ||||
| 		} | ||||
| 		if matched && !decided { | ||||
| 			klog.V(5).Infof("%q %s %q did not match any rule", pkg, relate(imp), imp) | ||||
| 			errs = append(errs, fmt.Errorf("%q %s %q did not match any rule", pkg.PkgPath, relate(imp), imp)) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if len(errs) > 0 { | ||||
| 		return errs | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func uniq(slices ...[]string) []string { | ||||
| 	m := map[string]bool{} | ||||
| 	for _, sl := range slices { | ||||
| 		for _, str := range sl { | ||||
| 			m[str] = true | ||||
| 		} | ||||
| 	} | ||||
| 	ret := []string{} | ||||
| 	for str := range m { | ||||
| 		ret = append(ret, str) | ||||
| 	} | ||||
| 	sort.Strings(ret) | ||||
| 	return ret | ||||
| } | ||||
|  | ||||
| func hasPathPrefix(path, prefix string) bool { | ||||
| 	if prefix == "" || path == prefix { | ||||
| 		return true | ||||
| 	} | ||||
| 	if !strings.HasSuffix(path, string(filepath.Separator)) { | ||||
| 		prefix += string(filepath.Separator) | ||||
| 	} | ||||
| 	return strings.HasPrefix(path, prefix) | ||||
| } | ||||
|  | ||||
| func transitiveImports(pkg *packages.Package) ([]string, []string) { | ||||
| 	direct := []string{} | ||||
| 	indirect := []string{} | ||||
| 	seen := map[string]bool{} | ||||
| 	for _, imp := range pkg.Imports { | ||||
| 		direct = append(direct, imp.PkgPath) | ||||
| 		dfsImports(&indirect, seen, imp) | ||||
| 	} | ||||
| 	return direct, indirect | ||||
| } | ||||
|  | ||||
| func dfsImports(dest *[]string, seen map[string]bool, p *packages.Package) { | ||||
| 	for _, p2 := range p.Imports { | ||||
| 		if seen[p2.PkgPath] { | ||||
| 			continue | ||||
| 		} | ||||
| 		seen[p2.PkgPath] = true | ||||
| 		*dest = append(*dest, p2.PkgPath) | ||||
| 		dfsImports(dest, seen, p2) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // verifyInverseRules checks that all packages that import a package are allowed to import it. | ||||
| func (boss *ImportBoss) verifyInverseRules(pkg *packages.Package, restrictionFiles []*FileFormat) []error { | ||||
| 	klog.V(3).Infof("verifying pkg %q inverse-rules", pkg.PkgPath) | ||||
|  | ||||
| 	// compile all Selector regex in all restriction files | ||||
| 	selectors := make([][]*regexp.Regexp, len(restrictionFiles)) | ||||
| 	for i, restrictionFile := range restrictionFiles { | ||||
| 		for _, r := range restrictionFile.InverseRules { | ||||
| 			re, err := regexp.Compile(r.SelectorRegexp) | ||||
| 			if err != nil { | ||||
| 				return []error{ | ||||
| 					fmt.Errorf("regexp `%s` in file %q doesn't compile: %w", r.SelectorRegexp, restrictionFile.path, err), | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			selectors[i] = append(selectors[i], re) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	realPkgPath := unmassage(pkg.PkgPath) | ||||
|  | ||||
| 	isDirect := map[string]bool{} | ||||
| 	for _, imp := range boss.incomingImports[pkg.PkgPath] { | ||||
| 		isDirect[imp] = true | ||||
| 	} | ||||
| 	relate := func(imp string) string { | ||||
| 		if isDirect[imp] { | ||||
| 			return "<-" | ||||
| 		} | ||||
| 		return "<--" | ||||
| 	} | ||||
|  | ||||
| 	var errs []error | ||||
| 	for _, imp := range boss.transitiveIncomingImports[pkg.PkgPath] { | ||||
| 		if unmassage(imp) == realPkgPath { | ||||
| 			// Tests in package "foo_test" depend on the test package for | ||||
| 			// "foo" (if both exist in a giver directory). | ||||
| 			continue | ||||
| 		} | ||||
| 		klog.V(4).Infof("considering import %q %s %q", pkg.PkgPath, relate(imp), imp) | ||||
| 		matched := false | ||||
| 		decided := false | ||||
| 		for i, file := range restrictionFiles { | ||||
| 			klog.V(4).Infof("rules file %s", file.path) | ||||
| 			for j, rule := range file.InverseRules { | ||||
| 				if !rule.Transitive && !isDirect[imp] { | ||||
| 					continue | ||||
| 				} | ||||
| 				matching := selectors[i][j].MatchString(imp) | ||||
| 				if !matching { | ||||
| 					continue | ||||
| 				} | ||||
| 				matched = true | ||||
| 				klog.V(6).Infof("selector %v matches %q", rule.SelectorRegexp, imp) | ||||
|  | ||||
| 				disp := rule.Evaluate(imp) | ||||
| 				if disp == DepAllowed { | ||||
| 					decided = true | ||||
| 					break // no further rules, next file | ||||
| 				} else if disp == DepForbidden { | ||||
| 					errs = append(errs, fmt.Errorf("%q %s %q is forbidden by %s", pkg.PkgPath, relate(imp), imp, file.path)) | ||||
| 					decided = true | ||||
| 					break // no further rules, next file | ||||
| 				} | ||||
| 			} | ||||
| 			if decided { | ||||
| 				break // no further files, next import | ||||
| 			} | ||||
| 		} | ||||
| 		if matched && !decided { | ||||
| 			klog.V(5).Infof("%q %s %q did not match any rule", pkg.PkgPath, relate(imp), imp) | ||||
| 			errs = append(errs, fmt.Errorf("%q %s %q did not match any rule", pkg.PkgPath, relate(imp), imp)) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if len(errs) > 0 { | ||||
| 		return errs | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func transitiveClosure(in map[string][]string) map[string][]string { | ||||
| 	type edge struct { | ||||
| 		from string | ||||
| 		to   string | ||||
| 	} | ||||
|  | ||||
| 	adj := make(map[edge]bool) | ||||
| 	imports := make(map[string]struct{}) | ||||
| 	for from, tos := range in { | ||||
| 		for _, to := range tos { | ||||
| 			adj[edge{from, to}] = true | ||||
| 			imports[to] = struct{}{} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Warshal's algorithm | ||||
| 	for k := range in { | ||||
| 		for i := range in { | ||||
| 			if !adj[edge{i, k}] { | ||||
| 				continue | ||||
| 			} | ||||
| 			for j := range imports { | ||||
| 				if adj[edge{i, j}] { | ||||
| 					continue | ||||
| 				} | ||||
| 				if adj[edge{k, j}] { | ||||
| 					adj[edge{i, j}] = true | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	out := make(map[string][]string, len(in)) | ||||
| 	for i := range in { | ||||
| 		for j := range imports { | ||||
| 			if adj[edge{i, j}] { | ||||
| 				out[i] = append(out[i], j) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		sort.Strings(out[i]) | ||||
| 	} | ||||
|  | ||||
| 	return out | ||||
| } | ||||
							
								
								
									
										322
									
								
								cmd/import-boss/main_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										322
									
								
								cmd/import-boss/main_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,322 @@ | ||||
| /* | ||||
| Copyright 2024 The Kubernetes Authors. | ||||
|  | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| */ | ||||
|  | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"path/filepath" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	"golang.org/x/tools/go/packages" | ||||
| ) | ||||
|  | ||||
| func TestRemoveLastDir(t *testing.T) { | ||||
| 	table := map[string]struct{ newPath, removedDir string }{ | ||||
| 		"a/b/c": {"a/c", "b"}, | ||||
| 	} | ||||
| 	for slashInput, expect := range table { | ||||
| 		input := filepath.FromSlash(slashInput) | ||||
|  | ||||
| 		gotPath, gotRemoved := removeLastDir(input) | ||||
| 		if e, a := filepath.FromSlash(expect.newPath), gotPath; e != a { | ||||
| 			t.Errorf("%v: wanted %v, got %v", input, e, a) | ||||
| 		} | ||||
| 		if e, a := filepath.FromSlash(expect.removedDir), gotRemoved; e != a { | ||||
| 			t.Errorf("%v: wanted %v, got %v", input, e, a) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestTransitiveClosure(t *testing.T) { | ||||
| 	cases := []struct { | ||||
| 		name     string | ||||
| 		in       map[string][]string | ||||
| 		expected map[string][]string | ||||
| 	}{ | ||||
| 		{ | ||||
| 			name: "no transition", | ||||
| 			in: map[string][]string{ | ||||
| 				"a": {"b"}, | ||||
| 				"c": {"d"}, | ||||
| 			}, | ||||
| 			expected: map[string][]string{ | ||||
| 				"a": {"b"}, | ||||
| 				"c": {"d"}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name: "simple", | ||||
| 			in: map[string][]string{ | ||||
| 				"a": {"b"}, | ||||
| 				"b": {"c"}, | ||||
| 				"c": {"d"}, | ||||
| 			}, | ||||
| 			expected: map[string][]string{ | ||||
| 				"a": {"b", "c", "d"}, | ||||
| 				"b": {"c", "d"}, | ||||
| 				"c": {"d"}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	for _, c := range cases { | ||||
| 		t.Run(c.name, func(t *testing.T) { | ||||
| 			out := transitiveClosure(c.in) | ||||
| 			if !reflect.DeepEqual(c.expected, out) { | ||||
| 				t.Errorf("expected: %#v, got %#v", c.expected, out) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestHasTestFiles(t *testing.T) { | ||||
| 	cases := []struct { | ||||
| 		input  []string | ||||
| 		expect bool | ||||
| 	}{{ | ||||
| 		input:  nil, | ||||
| 		expect: false, | ||||
| 	}, { | ||||
| 		input:  []string{}, | ||||
| 		expect: false, | ||||
| 	}, { | ||||
| 		input:  []string{"foo.go"}, | ||||
| 		expect: false, | ||||
| 	}, { | ||||
| 		input:  []string{"foo.go", "bar.go"}, | ||||
| 		expect: false, | ||||
| 	}, { | ||||
| 		input:  []string{"foo_test.go"}, | ||||
| 		expect: true, | ||||
| 	}, { | ||||
| 		input:  []string{"foo.go", "foo_test.go"}, | ||||
| 		expect: true, | ||||
| 	}, { | ||||
| 		input:  []string{"foo.go", "foo_test.go", "bar.go", "bar_test.go"}, | ||||
| 		expect: true, | ||||
| 	}} | ||||
|  | ||||
| 	for _, tc := range cases { | ||||
| 		ret := hasTestFiles(tc.input) | ||||
| 		if ret != tc.expect { | ||||
| 			t.Errorf("expected %v, got %v: %q", tc.expect, ret, tc.input) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestPackageDir(t *testing.T) { | ||||
| 	cases := []struct { | ||||
| 		input  *packages.Package | ||||
| 		expect string | ||||
| 	}{{ | ||||
| 		input: &packages.Package{ | ||||
| 			PkgPath:      "example.com/foo/bar/qux", | ||||
| 			GoFiles:      []string{"/src/prj/file.go"}, | ||||
| 			IgnoredFiles: []string{"/otherdir/file.go"}, | ||||
| 		}, | ||||
| 		expect: "/src/prj", | ||||
| 	}, { | ||||
| 		input: &packages.Package{ | ||||
| 			PkgPath:      "example.com/foo/bar/qux", | ||||
| 			IgnoredFiles: []string{"/src/prj/file.go"}, | ||||
| 		}, | ||||
| 		expect: "/src/prj", | ||||
| 	}, { | ||||
| 		input: &packages.Package{ | ||||
| 			PkgPath: "example.com/foo/bar/qux", | ||||
| 		}, | ||||
| 		expect: "", | ||||
| 	}} | ||||
|  | ||||
| 	for i, tc := range cases { | ||||
| 		ret := packageDir(tc.input) | ||||
| 		if ret != tc.expect { | ||||
| 			t.Errorf("[%d] expected %v, got %v: %q", i, tc.expect, ret, tc.input) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestHasPathPrefix(t *testing.T) { | ||||
| 	cases := []struct { | ||||
| 		base   string | ||||
| 		pfx    string | ||||
| 		expect bool | ||||
| 	}{{ | ||||
| 		base:   "", | ||||
| 		pfx:    "", | ||||
| 		expect: true, | ||||
| 	}, { | ||||
| 		base:   "/foo/bar", | ||||
| 		pfx:    "", | ||||
| 		expect: true, | ||||
| 	}, { | ||||
| 		base:   "", | ||||
| 		pfx:    "/foo", | ||||
| 		expect: false, | ||||
| 	}, { | ||||
| 		base:   "/foo", | ||||
| 		pfx:    "/foo", | ||||
| 		expect: true, | ||||
| 	}, { | ||||
| 		base:   "/foo/bar", | ||||
| 		pfx:    "/foo", | ||||
| 		expect: true, | ||||
| 	}, { | ||||
| 		base:   "/foobar/qux", | ||||
| 		pfx:    "/foo", | ||||
| 		expect: false, | ||||
| 	}, { | ||||
| 		base:   "/foo/bar/bat/qux/zrb", | ||||
| 		pfx:    "/foo/bar/bat", | ||||
| 		expect: true, | ||||
| 	}} | ||||
|  | ||||
| 	for _, tc := range cases { | ||||
| 		ret := hasPathPrefix(tc.base, tc.pfx) | ||||
| 		if ret != tc.expect { | ||||
| 			t.Errorf("expected %v, got %v: (%q, %q)", tc.expect, ret, tc.base, tc.pfx) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func checkAllErrorStrings(t *testing.T, errs []error, expect []string) { | ||||
| 	t.Helper() | ||||
| 	if len(errs) != len(expect) { | ||||
| 		t.Fatalf("expected %d errors, got %d: %q", len(expect), len(errs), errs) | ||||
| 	} | ||||
|  | ||||
| 	for _, str := range expect { | ||||
| 		found := false | ||||
| 		for _, err := range errs { | ||||
| 			if strings.HasPrefix(err.Error(), str) { | ||||
| 				found = true | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 		if !found { | ||||
| 			t.Errorf("did not find error %q", str) | ||||
| 			t.Logf("\tseek: %s\n\t  in:", str) | ||||
| 			for _, err := range errs { | ||||
| 				t.Logf("\t      %s", err.Error()) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestSimpleForward(t *testing.T) { | ||||
| 	pkgs, err := loadPkgs("./testdata/simple-fwd/aaa") | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("unexpected failure: %v", err) | ||||
| 	} | ||||
| 	if len(pkgs) != 1 { | ||||
| 		t.Fatalf("expected 1 pkg result, got %d", len(pkgs)) | ||||
| 	} | ||||
| 	if pkgs[0].PkgPath != "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/aaa" { | ||||
| 		t.Fatalf("wrong PkgPath: %q", pkgs[0].PkgPath) | ||||
| 	} | ||||
|  | ||||
| 	boss := newBoss(pkgs) | ||||
| 	errs := boss.Verify(pkgs[0]) | ||||
|  | ||||
| 	expect := []string{ | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/aaa" -> "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/forbidden" is forbidden`, | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/aaa" -> "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/forbidden/f1" is forbidden`, | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/aaa" -> "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/neither" did not match any rule`, | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/aaa" -> "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/neither/n1" did not match any rule`, | ||||
| 	} | ||||
|  | ||||
| 	checkAllErrorStrings(t, errs, expect) | ||||
| } | ||||
|  | ||||
| func TestNestedForward(t *testing.T) { | ||||
| 	pkgs, err := loadPkgs("./testdata/nested-fwd/aaa") | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("unexpected failure: %v", err) | ||||
| 	} | ||||
| 	if len(pkgs) != 1 { | ||||
| 		t.Fatalf("expected 1 pkg result, got %d", len(pkgs)) | ||||
| 	} | ||||
| 	if pkgs[0].PkgPath != "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/aaa" { | ||||
| 		t.Fatalf("wrong PkgPath: %q", pkgs[0].PkgPath) | ||||
| 	} | ||||
|  | ||||
| 	boss := newBoss(pkgs) | ||||
| 	errs := boss.Verify(pkgs[0]) | ||||
|  | ||||
| 	expect := []string{ | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/aaa" -> "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/forbidden-by-both" is forbidden`, | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/aaa" -> "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/forbidden-by-root" is forbidden`, | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/aaa" -> "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/forbidden-by-sub" is forbidden`, | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/aaa" -> "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/neither/n1" did not match any rule`, | ||||
| 	} | ||||
|  | ||||
| 	checkAllErrorStrings(t, errs, expect) | ||||
| } | ||||
|  | ||||
| func TestInverse(t *testing.T) { | ||||
| 	pkgs, err := loadPkgs("./testdata/inverse/...") | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("unexpected failure: %v", err) | ||||
| 	} | ||||
| 	if len(pkgs) != 10 { | ||||
| 		t.Fatalf("expected 10 pkg results, got %d", len(pkgs)) | ||||
| 	} | ||||
|  | ||||
| 	boss := newBoss(pkgs) | ||||
|  | ||||
| 	var errs []error | ||||
| 	for _, pkg := range pkgs { | ||||
| 		errs = append(errs, boss.Verify(pkg)...) | ||||
| 	} | ||||
|  | ||||
| 	expect := []string{ | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/inverse/forbidden" <- "k8s.io/kubernetes/cmd/import-boss/testdata/inverse/aaa" is forbidden`, | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/inverse/forbidden/f1" <- "k8s.io/kubernetes/cmd/import-boss/testdata/inverse/aaa" is forbidden`, | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/inverse/allowed/a2" <- "k8s.io/kubernetes/cmd/import-boss/testdata/inverse/allowed" did not match any rule`, | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/inverse/forbidden/f2" <- "k8s.io/kubernetes/cmd/import-boss/testdata/inverse/allowed" did not match any rule`, | ||||
| 	} | ||||
|  | ||||
| 	checkAllErrorStrings(t, errs, expect) | ||||
| } | ||||
|  | ||||
| func TestTransitive(t *testing.T) { | ||||
| 	pkgs, err := loadPkgs("./testdata/transitive/...") | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("unexpected failure: %v", err) | ||||
| 	} | ||||
| 	if len(pkgs) != 10 { | ||||
| 		t.Fatalf("expected 10 pkg results, got %d", len(pkgs)) | ||||
| 	} | ||||
|  | ||||
| 	boss := newBoss(pkgs) | ||||
|  | ||||
| 	var errs []error | ||||
| 	for _, pkg := range pkgs { | ||||
| 		errs = append(errs, boss.Verify(pkg)...) | ||||
| 	} | ||||
|  | ||||
| 	expect := []string{ | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/transitive/forbidden" <- "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/aaa" is forbidden`, | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/transitive/forbidden/f1" <- "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/aaa" is forbidden`, | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/transitive/forbidden/f2" <-- "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/aaa" is forbidden`, | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/transitive/allowed/a2" <- "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/allowed" did not match any rule`, | ||||
| 		`"k8s.io/kubernetes/cmd/import-boss/testdata/transitive/forbidden/f2" <- "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/allowed" did not match any rule`, | ||||
| 	} | ||||
|  | ||||
| 	checkAllErrorStrings(t, errs, expect) | ||||
| } | ||||
							
								
								
									
										12
									
								
								cmd/import-boss/testdata/inverse/aaa/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								cmd/import-boss/testdata/inverse/aaa/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| package aaa | ||||
|  | ||||
| import ( | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/inverse/allowed" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/inverse/allowed/a1" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/inverse/forbidden" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/inverse/forbidden/f1" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/inverse/neither" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/inverse/neither/n1" | ||||
| ) | ||||
|  | ||||
| var X = "aaa" | ||||
							
								
								
									
										4
									
								
								cmd/import-boss/testdata/inverse/allowed/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								cmd/import-boss/testdata/inverse/allowed/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| inverseRules: | ||||
|   - selectorRegexp: k8s[.]io | ||||
|     allowedPrefixes: | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/inverse/aaa | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/inverse/allowed/a1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/inverse/allowed/a1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package a1 | ||||
|  | ||||
| var X = "a1" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/inverse/allowed/a2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/inverse/allowed/a2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package a2 | ||||
|  | ||||
| var X = "a2" | ||||
							
								
								
									
										9
									
								
								cmd/import-boss/testdata/inverse/allowed/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								cmd/import-boss/testdata/inverse/allowed/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| package allowed | ||||
|  | ||||
| import ( | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/inverse/allowed/a2" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/inverse/forbidden/f2" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/inverse/neither/n2" | ||||
| ) | ||||
|  | ||||
| var X = "allowed" | ||||
							
								
								
									
										4
									
								
								cmd/import-boss/testdata/inverse/forbidden/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								cmd/import-boss/testdata/inverse/forbidden/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| inverseRules: | ||||
|   - selectorRegexp: k8s[.]io | ||||
|     forbiddenPrefixes: | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/inverse/aaa | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/inverse/forbidden/f1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/inverse/forbidden/f1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package f1 | ||||
|  | ||||
| var X = "f1" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/inverse/forbidden/f2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/inverse/forbidden/f2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package f2 | ||||
|  | ||||
| var X = "f2" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/inverse/forbidden/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/inverse/forbidden/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package forbidden | ||||
|  | ||||
| var X = "forbidden" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/inverse/neither/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/inverse/neither/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package neither | ||||
|  | ||||
| var X = "neither" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/inverse/neither/n1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/inverse/neither/n1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package n1 | ||||
|  | ||||
| var X = "n1" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/inverse/neither/n2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/inverse/neither/n2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package n2 | ||||
|  | ||||
| var X = "n2" | ||||
							
								
								
									
										8
									
								
								cmd/import-boss/testdata/nested-fwd/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								cmd/import-boss/testdata/nested-fwd/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| rules: | ||||
|   - selectorRegexp: k8s[.]io | ||||
|     allowedPrefixes: | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/allowed-by-root | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/allowed-by-both | ||||
|     forbiddenPrefixes: | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/forbidden-by-root | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/forbidden-by-both | ||||
							
								
								
									
										9
									
								
								cmd/import-boss/testdata/nested-fwd/aaa/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								cmd/import-boss/testdata/nested-fwd/aaa/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| rules: | ||||
|   - selectorRegexp: k8s[.]io | ||||
|     allowedPrefixes: | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/bbb | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/allowed-by-sub | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/allowed-by-both | ||||
|     forbiddenPrefixes: | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/forbidden-by-sub | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/forbidden-by-both | ||||
							
								
								
									
										14
									
								
								cmd/import-boss/testdata/nested-fwd/aaa/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								cmd/import-boss/testdata/nested-fwd/aaa/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| package aaa | ||||
|  | ||||
| import ( | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/allowed-by-both" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/allowed-by-root" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/allowed-by-sub" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/bbb" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/forbidden-by-both" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/forbidden-by-root" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/forbidden-by-sub" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/neither/n1" | ||||
| ) | ||||
|  | ||||
| var X = "aaa" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/allowed-by-both/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/allowed-by-both/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package allowedbyboth | ||||
|  | ||||
| var X = "allowedbyboth" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/allowed-by-root/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/allowed-by-root/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package allowedbyroot | ||||
|  | ||||
| var X = "allowedbyroot" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/allowed-by-sub/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/allowed-by-sub/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package allowedbysub | ||||
|  | ||||
| var X = "allowedbysub" | ||||
							
								
								
									
										13
									
								
								cmd/import-boss/testdata/nested-fwd/bbb/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								cmd/import-boss/testdata/nested-fwd/bbb/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| package bbb | ||||
|  | ||||
| import ( | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/allowed-by-both" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/allowed-by-root" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/allowed-by-sub" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/forbidden-by-both" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/forbidden-by-root" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/forbidden-by-sub" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/nested-fwd/neither/n2" | ||||
| ) | ||||
|  | ||||
| var X = "bbb" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/forbidden-by-both/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/forbidden-by-both/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package forbiddenbyboth | ||||
|  | ||||
| var X = "forbiddenbyboth" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/forbidden-by-root/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/forbidden-by-root/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package forbiddenbyroot | ||||
|  | ||||
| var X = "forbiddenbyroot" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/forbidden-by-sub/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/forbidden-by-sub/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package forbiddenbysub | ||||
|  | ||||
| var X = "forbiddenbysub" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/neither/n1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/neither/n1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package n1 | ||||
|  | ||||
| var X = "n1" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/neither/n2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/nested-fwd/neither/n2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package n2 | ||||
|  | ||||
| var X = "n2" | ||||
							
								
								
									
										6
									
								
								cmd/import-boss/testdata/simple-fwd/aaa/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								cmd/import-boss/testdata/simple-fwd/aaa/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| rules: | ||||
|   - selectorRegexp: k8s[.]io | ||||
|     allowedPrefixes: | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/allowed | ||||
|     forbiddenPrefixes: | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/forbidden | ||||
							
								
								
									
										12
									
								
								cmd/import-boss/testdata/simple-fwd/aaa/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								cmd/import-boss/testdata/simple-fwd/aaa/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| package aaa | ||||
|  | ||||
| import ( | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/allowed" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/allowed/a1" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/forbidden" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/forbidden/f1" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/neither" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/neither/n1" | ||||
| ) | ||||
|  | ||||
| var X = "aaa" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/allowed/a1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/allowed/a1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package a1 | ||||
|  | ||||
| var X = "a1" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/allowed/a2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/allowed/a2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package a2 | ||||
|  | ||||
| var X = "a2" | ||||
							
								
								
									
										9
									
								
								cmd/import-boss/testdata/simple-fwd/allowed/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								cmd/import-boss/testdata/simple-fwd/allowed/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| package allowed | ||||
|  | ||||
| import ( | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/allowed/a2" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/forbidden/f2" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/simple-fwd/neither/n2" | ||||
| ) | ||||
|  | ||||
| var X = "allowed" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/forbidden/f1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/forbidden/f1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package f1 | ||||
|  | ||||
| var X = "f1" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/forbidden/f2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/forbidden/f2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package f2 | ||||
|  | ||||
| var X = "f2" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/forbidden/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/forbidden/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package forbidden | ||||
|  | ||||
| var X = "forbidden" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/neither/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/neither/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package neither | ||||
|  | ||||
| var X = "neither" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/neither/n1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/neither/n1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package n1 | ||||
|  | ||||
| var X = "n1" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/neither/n2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/simple-fwd/neither/n2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package n2 | ||||
|  | ||||
| var X = "n2" | ||||
							
								
								
									
										12
									
								
								cmd/import-boss/testdata/transitive/aaa/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								cmd/import-boss/testdata/transitive/aaa/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| package aaa | ||||
|  | ||||
| import ( | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/allowed" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/allowed/a1" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/forbidden" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/forbidden/f1" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/neither" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/neither/n1" | ||||
| ) | ||||
|  | ||||
| var X = "aaa" | ||||
							
								
								
									
										5
									
								
								cmd/import-boss/testdata/transitive/allowed/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								cmd/import-boss/testdata/transitive/allowed/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| inverseRules: | ||||
|   - selectorRegexp: k8s[.]io | ||||
|     allowedPrefixes: | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/transitive/aaa | ||||
|     transitive: true | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/transitive/allowed/a1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/transitive/allowed/a1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package a1 | ||||
|  | ||||
| var X = "a1" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/transitive/allowed/a2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/transitive/allowed/a2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package a2 | ||||
|  | ||||
| var X = "a2" | ||||
							
								
								
									
										9
									
								
								cmd/import-boss/testdata/transitive/allowed/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								cmd/import-boss/testdata/transitive/allowed/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| package allowed | ||||
|  | ||||
| import ( | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/allowed/a2" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/forbidden/f2" | ||||
| 	_ "k8s.io/kubernetes/cmd/import-boss/testdata/transitive/neither/n2" | ||||
| ) | ||||
|  | ||||
| var X = "allowed" | ||||
							
								
								
									
										5
									
								
								cmd/import-boss/testdata/transitive/forbidden/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								cmd/import-boss/testdata/transitive/forbidden/.import-restrictions
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| inverseRules: | ||||
|   - selectorRegexp: k8s[.]io | ||||
|     forbiddenPrefixes: | ||||
|       - k8s.io/kubernetes/cmd/import-boss/testdata/transitive/aaa | ||||
|     transitive: true | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/transitive/forbidden/f1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/transitive/forbidden/f1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package f1 | ||||
|  | ||||
| var X = "f1" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/transitive/forbidden/f2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/transitive/forbidden/f2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package f2 | ||||
|  | ||||
| var X = "f2" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/transitive/forbidden/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/transitive/forbidden/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package forbidden | ||||
|  | ||||
| var X = "forbidden" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/transitive/neither/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/transitive/neither/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package neither | ||||
|  | ||||
| var X = "neither" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/transitive/neither/n1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/transitive/neither/n1/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package n1 | ||||
|  | ||||
| var X = "n1" | ||||
							
								
								
									
										3
									
								
								cmd/import-boss/testdata/transitive/neither/n2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cmd/import-boss/testdata/transitive/neither/n2/file.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| package n2 | ||||
|  | ||||
| var X = "n2" | ||||
| @@ -33,7 +33,7 @@ import ( | ||||
| // Package is a subset of cmd/go.Package | ||||
| type Package struct { | ||||
| 	Dir          string   `yaml:",omitempty"` // directory containing package sources | ||||
| 	ImportPath   string   `yaml:",omitempty"` // import path of package in dir | ||||
| 	ImportPath   string   `yaml:",omitempty"` // import path of package | ||||
| 	Imports      []string `yaml:",omitempty"` // import paths used by this package | ||||
| 	TestImports  []string `yaml:",omitempty"` // imports from TestGoFiles | ||||
| 	XTestImports []string `yaml:",omitempty"` // imports from XTestGoFiles | ||||
| @@ -42,19 +42,18 @@ type Package struct { | ||||
| // ImportRestriction describes a set of allowable import | ||||
| // trees for a tree of source code | ||||
| type ImportRestriction struct { | ||||
| 	// BaseDir is the root of the package tree that is | ||||
| 	// restricted by this configuration, given as a | ||||
| 	// relative path from the root of the repository | ||||
| 	// BaseDir is the root of a package tree that is restricted by this | ||||
| 	// configuration, given as a relative path from the root of the repository. | ||||
| 	// This is a directory which `go list` might not consider a package (if it | ||||
| 	// has not .go files) | ||||
| 	BaseDir string `yaml:"baseImportPath"` | ||||
| 	// IgnoredSubTrees are roots of sub-trees of the | ||||
| 	// BaseDir for which we do not want to enforce | ||||
| 	// any import restrictions whatsoever, given as | ||||
| 	// relative paths from the root of the repository | ||||
| 	// IgnoredSubTrees are roots of sub-trees of the BaseDir for which we do | ||||
| 	// not want to enforce any import restrictions whatsoever, given as | ||||
| 	// relative paths from the root of the repository. | ||||
| 	IgnoredSubTrees []string `yaml:"ignoredSubTrees,omitempty"` | ||||
| 	// AllowedImports are roots of package trees that | ||||
| 	// are allowed to be imported from the BaseDir, | ||||
| 	// given as paths that would be used in a Go | ||||
| 	// import statement | ||||
| 	// AllowedImports are roots of package trees that are allowed to be | ||||
| 	// imported from the BaseDir, given as paths that would be used in a Go | ||||
| 	// import statement. | ||||
| 	AllowedImports []string `yaml:"allowedImports"` | ||||
| 	// ExcludeTests will skip checking test dependencies. | ||||
| 	ExcludeTests bool `yaml:"excludeTests"` | ||||
| @@ -126,9 +125,8 @@ func (i *ImportRestriction) forbiddenImportsFor(pkg Package) []string { | ||||
| 		imports = append(imports, append(pkg.TestImports, pkg.XTestImports...)...) | ||||
| 	} | ||||
| 	for _, imp := range imports { | ||||
| 		path := extractVendorPath(imp) | ||||
| 		if i.isForbidden(path) { | ||||
| 			forbiddenImportSet[path] = struct{}{} | ||||
| 		if i.isForbidden(imp) { | ||||
| 			forbiddenImportSet[imp] = struct{}{} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @@ -139,16 +137,6 @@ func (i *ImportRestriction) forbiddenImportsFor(pkg Package) []string { | ||||
| 	return forbiddenImports | ||||
| } | ||||
|  | ||||
| // extractVendorPath removes a vendor prefix if one exists | ||||
| func extractVendorPath(path string) string { | ||||
| 	vendorPath := "/vendor/" | ||||
| 	if !strings.Contains(path, vendorPath) { | ||||
| 		return path | ||||
| 	} | ||||
|  | ||||
| 	return path[strings.Index(path, vendorPath)+len(vendorPath):] | ||||
| } | ||||
|  | ||||
| // isForbidden determines if an import is forbidden, | ||||
| // which is true when the import is: | ||||
| //   - of a package under the rootPackage | ||||
| @@ -171,7 +159,7 @@ var rootPackage string | ||||
|  | ||||
| func main() { | ||||
| 	if len(os.Args) != 3 { | ||||
| 		log.Fatalf("Usage: %s ROOT RESTRICTIONS.yaml", os.Args[0]) | ||||
| 		log.Fatalf("Usage: %s <root> <restrictions.yaml>", os.Args[0]) | ||||
| 	} | ||||
|  | ||||
| 	rootPackage = os.Args[1] | ||||
| @@ -183,15 +171,24 @@ func main() { | ||||
|  | ||||
| 	foundForbiddenImports := false | ||||
| 	for _, restriction := range importRestrictions { | ||||
| 		log.Printf("Inspecting imports under %s...\n", restriction.BaseDir) | ||||
| 		packages, err := resolvePackageTree(restriction.BaseDir) | ||||
| 		baseDir := restriction.BaseDir | ||||
| 		if filepath.IsAbs(baseDir) { | ||||
| 			log.Fatalf("%q appears to be an absolute path", baseDir) | ||||
| 		} | ||||
| 		if !strings.HasPrefix(baseDir, "./") { | ||||
| 			baseDir = "./" + baseDir | ||||
| 		} | ||||
| 		baseDir = strings.TrimRight(baseDir, "/") | ||||
| 		log.Printf("Inspecting imports under %s/...\n", baseDir) | ||||
|  | ||||
| 		packages, err := resolvePackageTree(baseDir) | ||||
| 		if err != nil { | ||||
| 			log.Fatalf("Failed to resolve package tree: %v", err) | ||||
| 		} else if len(packages) == 0 { | ||||
| 			log.Fatalf("Found no packages under tree %s", restriction.BaseDir) | ||||
| 			log.Fatalf("Found no packages under tree %s", baseDir) | ||||
| 		} | ||||
|  | ||||
| 		log.Printf("- validating imports for %d packages in the tree", len(packages)) | ||||
| 		log.Printf("- validating imports for %d packages", len(packages)) | ||||
| 		restrictionViolated := false | ||||
| 		for _, pkg := range packages { | ||||
| 			if forbidden, err := restriction.ForbiddenImportsFor(pkg); err != nil { | ||||
| @@ -229,25 +226,9 @@ func loadImportRestrictions(configFile string) ([]ImportRestriction, error) { | ||||
| } | ||||
|  | ||||
| func resolvePackageTree(treeBase string) ([]Package, error) { | ||||
| 	// try resolving with $cwd | ||||
| 	packages, err := resolvePackageTreeInDir("", treeBase) | ||||
| 	if err != nil || len(packages) == 0 { | ||||
| 		// if that fails or finds no packages, resolve under ./vendor/$treeBase | ||||
| 		stagingPackages, stagingErr := resolvePackageTreeInDir(filepath.Join("./vendor", treeBase), treeBase) | ||||
| 		if stagingErr == nil && len(stagingPackages) > 0 { | ||||
| 			// if that succeeds, return | ||||
| 			return stagingPackages, stagingErr | ||||
| 		} | ||||
| 	} | ||||
| 	// otherwise, return original packages and error | ||||
| 	return packages, err | ||||
| } | ||||
|  | ||||
| func resolvePackageTreeInDir(dir string, treeBase string) ([]Package, error) { | ||||
| 	cmd := "go" | ||||
| 	args := []string{"list", "-json", fmt.Sprintf("%s...", treeBase)} | ||||
| 	args := []string{"list", "-json", fmt.Sprintf("%s/...", treeBase)} | ||||
| 	c := exec.Command(cmd, args...) | ||||
| 	c.Dir = dir | ||||
| 	stdout, err := c.Output() | ||||
| 	if err != nil { | ||||
| 		var message string | ||||
|   | ||||
| @@ -200,10 +200,6 @@ func (c *collector) handlePath(path string, info os.FileInfo, err error) error { | ||||
| 	if info.IsDir() { | ||||
| 		// Ignore hidden directories (.git, .cache, etc) | ||||
| 		if len(path) > 1 && path[0] == '.' || | ||||
| 			// Staging code is symlinked from vendor/k8s.io, and uses import | ||||
| 			// paths as if it were inside of vendor/. It fails typechecking | ||||
| 			// inside of staging/, but works when typechecked as part of vendor/. | ||||
| 			path == "staging" || | ||||
| 			// OS-specific vendor code tends to be imported by OS-specific | ||||
| 			// packages. We recursively typecheck imported vendored packages for | ||||
| 			// each OS, but don't typecheck everything for every OS. | ||||
|   | ||||
							
								
								
									
										14
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								go.mod
									
									
									
									
									
								
							| @@ -6,7 +6,7 @@ | ||||
|  | ||||
| module k8s.io/kubernetes | ||||
|  | ||||
| go 1.21 | ||||
| go 1.22.0 | ||||
|  | ||||
| require ( | ||||
| 	bitbucket.org/bertimus9/systemstat v0.5.0 | ||||
| @@ -74,13 +74,13 @@ require ( | ||||
| 	go.uber.org/goleak v1.3.0 | ||||
| 	go.uber.org/zap v1.26.0 | ||||
| 	golang.org/x/crypto v0.19.0 | ||||
| 	golang.org/x/net v0.19.0 | ||||
| 	golang.org/x/net v0.21.0 | ||||
| 	golang.org/x/oauth2 v0.10.0 | ||||
| 	golang.org/x/sync v0.5.0 | ||||
| 	golang.org/x/sync v0.6.0 | ||||
| 	golang.org/x/sys v0.17.0 | ||||
| 	golang.org/x/term v0.17.0 | ||||
| 	golang.org/x/time v0.3.0 | ||||
| 	golang.org/x/tools v0.16.1 | ||||
| 	golang.org/x/tools v0.18.0 | ||||
| 	google.golang.org/api v0.126.0 | ||||
| 	google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d | ||||
| 	google.golang.org/grpc v1.58.3 | ||||
| @@ -104,12 +104,11 @@ require ( | ||||
| 	k8s.io/csi-translation-lib v0.0.0 | ||||
| 	k8s.io/dynamic-resource-allocation v0.0.0 | ||||
| 	k8s.io/endpointslice v0.0.0 | ||||
| 	k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 | ||||
| 	k8s.io/klog/v2 v2.120.1 | ||||
| 	k8s.io/kms v0.0.0 | ||||
| 	k8s.io/kube-aggregator v0.0.0 | ||||
| 	k8s.io/kube-controller-manager v0.0.0 | ||||
| 	k8s.io/kube-openapi v0.0.0-20231113174909-778a5567bc1e | ||||
| 	k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 | ||||
| 	k8s.io/kube-proxy v0.0.0 | ||||
| 	k8s.io/kube-scheduler v0.0.0 | ||||
| 	k8s.io/kubectl v0.0.0 | ||||
| @@ -220,7 +219,7 @@ require ( | ||||
| 	go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect | ||||
| 	go.uber.org/multierr v1.11.0 // indirect | ||||
| 	golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect | ||||
| 	golang.org/x/mod v0.14.0 // indirect | ||||
| 	golang.org/x/mod v0.15.0 // indirect | ||||
| 	golang.org/x/text v0.14.0 // indirect | ||||
| 	google.golang.org/appengine v1.6.7 // indirect | ||||
| 	google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect | ||||
| @@ -229,6 +228,7 @@ require ( | ||||
| 	gopkg.in/inf.v0 v0.9.1 // indirect | ||||
| 	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect | ||||
| 	gopkg.in/warnings.v0 v0.1.2 // indirect | ||||
| 	k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 // indirect | ||||
| 	sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 // indirect | ||||
| 	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect | ||||
| 	sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 // indirect | ||||
|   | ||||
							
								
								
									
										32
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								go.sum
									
									
									
									
									
								
							| @@ -352,7 +352,6 @@ 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-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= | ||||
| 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.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= | ||||
| github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= | ||||
| @@ -450,7 +449,6 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN | ||||
| 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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= | ||||
| github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= | ||||
| @@ -558,7 +556,6 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= | ||||
| github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | ||||
| github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= | ||||
| github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= | ||||
| github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= | ||||
| github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= | ||||
| @@ -865,8 +862,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| 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/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= | ||||
| golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= | ||||
| golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| @@ -909,8 +906,8 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd | ||||
| golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= | ||||
| golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
| golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
| 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/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= | ||||
| golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= | ||||
| 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= | ||||
| @@ -940,8 +937,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.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= | ||||
| golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | ||||
| golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= | ||||
| golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | ||||
| golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| @@ -1006,6 +1003,7 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc | ||||
| golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= | ||||
| golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= | ||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||
| golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||
| golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= | ||||
| @@ -1063,7 +1061,6 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs | ||||
| golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= | ||||
| golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= | ||||
| golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| @@ -1083,8 +1080,8 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| golang.org/x/tools v0.1.3/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.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= | ||||
| golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= | ||||
| golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= | ||||
| golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= | ||||
| 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= | ||||
| @@ -1242,7 +1239,6 @@ google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw | ||||
| gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= | ||||
| gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= | ||||
| gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= | ||||
| @@ -1277,14 +1273,13 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh | ||||
| honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= | ||||
| honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= | ||||
| honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= | ||||
| k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks= | ||||
| k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= | ||||
| k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo= | ||||
| k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8= | ||||
| k8s.io/klog/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.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= | ||||
| k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= | ||||
| k8s.io/kube-openapi v0.0.0-20231113174909-778a5567bc1e h1:snPmy96t93RredGRjKfMFt+gvxuVAncqSAyBveJtr4Q= | ||||
| k8s.io/kube-openapi v0.0.0-20231113174909-778a5567bc1e/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= | ||||
| k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= | ||||
| k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= | ||||
| k8s.io/system-validators v1.8.0 h1:tq05tdO9zdJZnNF3SXrq6LE7Knc/KfJm5wk68467JDg= | ||||
| k8s.io/system-validators v1.8.0/go.mod h1:gP1Ky+R9wtrSiFbrpEPwWMeYz9yqyy1S/KOh0Vci7WI= | ||||
| k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= | ||||
| @@ -1307,6 +1302,5 @@ sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 h1:W6cLQc5pnqM | ||||
| sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3/go.mod h1:JWP1Fj0VWGHyw3YUPjXSQnRnrwezrZSrApfX5S0nIag= | ||||
| 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.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= | ||||
|   | ||||
							
								
								
									
										35
									
								
								go.work
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								go.work
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| go 1.22.0 | ||||
|  | ||||
| use ( | ||||
| 	. | ||||
| 	./staging/src/k8s.io/api | ||||
| 	./staging/src/k8s.io/apiextensions-apiserver | ||||
| 	./staging/src/k8s.io/apimachinery | ||||
| 	./staging/src/k8s.io/apiserver | ||||
| 	./staging/src/k8s.io/cli-runtime | ||||
| 	./staging/src/k8s.io/client-go | ||||
| 	./staging/src/k8s.io/cloud-provider | ||||
| 	./staging/src/k8s.io/cluster-bootstrap | ||||
| 	./staging/src/k8s.io/code-generator | ||||
| 	./staging/src/k8s.io/component-base | ||||
| 	./staging/src/k8s.io/component-helpers | ||||
| 	./staging/src/k8s.io/controller-manager | ||||
| 	./staging/src/k8s.io/cri-api | ||||
| 	./staging/src/k8s.io/csi-translation-lib | ||||
| 	./staging/src/k8s.io/dynamic-resource-allocation | ||||
| 	./staging/src/k8s.io/endpointslice | ||||
| 	./staging/src/k8s.io/kms | ||||
| 	./staging/src/k8s.io/kube-aggregator | ||||
| 	./staging/src/k8s.io/kube-controller-manager | ||||
| 	./staging/src/k8s.io/kube-proxy | ||||
| 	./staging/src/k8s.io/kube-scheduler | ||||
| 	./staging/src/k8s.io/kubectl | ||||
| 	./staging/src/k8s.io/kubelet | ||||
| 	./staging/src/k8s.io/legacy-cloud-providers | ||||
| 	./staging/src/k8s.io/metrics | ||||
| 	./staging/src/k8s.io/mount-utils | ||||
| 	./staging/src/k8s.io/pod-security-admission | ||||
| 	./staging/src/k8s.io/sample-apiserver | ||||
| 	./staging/src/k8s.io/sample-cli-plugin | ||||
| 	./staging/src/k8s.io/sample-controller | ||||
| ) | ||||
							
								
								
									
										249
									
								
								go.work.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										249
									
								
								go.work.sum
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,249 @@ | ||||
| bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898 h1:SC+c6A1qTFstO9qmB86mPV2IpYme/2ZoEQ0hrP+wo+Q= | ||||
| cloud.google.com/go/accessapproval v1.7.1 h1:/5YjNhR6lzCvmJZAnByYkfEgWjfAKwYP6nkuTk6nKFE= | ||||
| cloud.google.com/go/accesscontextmanager v1.8.1 h1:WIAt9lW9AXtqw/bnvrEUaE8VG/7bAAeMzRCBGMkc4+w= | ||||
| cloud.google.com/go/aiplatform v1.48.0 h1:M5davZWCTzE043rJCn+ZLW6hSxfG1KAx4vJTtas2/ec= | ||||
| cloud.google.com/go/analytics v0.21.3 h1:TFBC1ZAqX9/jL56GEXdLrVe5vT3I22bDVWyDwZX4IEg= | ||||
| cloud.google.com/go/apigateway v1.6.1 h1:aBSwCQPcp9rZ0zVEUeJbR623palnqtvxJlUyvzsKGQc= | ||||
| cloud.google.com/go/apigeeconnect v1.6.1 h1:6u/jj0P2c3Mcm+H9qLsXI7gYcTiG9ueyQL3n6vCmFJM= | ||||
| cloud.google.com/go/apigeeregistry v0.7.1 h1:hgq0ANLDx7t2FDZDJQrCMtCtddR/pjCqVuvQWGrQbXw= | ||||
| cloud.google.com/go/appengine v1.8.1 h1:J+aaUZ6IbTpBegXbmEsh8qZZy864ZVnOoWyfa1XSNbI= | ||||
| cloud.google.com/go/area120 v0.8.1 h1:wiOq3KDpdqXmaHzvZwKdpoM+3lDcqsI2Lwhyac7stss= | ||||
| cloud.google.com/go/artifactregistry v1.14.1 h1:k6hNqab2CubhWlGcSzunJ7kfxC7UzpAfQ1UPb9PDCKI= | ||||
| cloud.google.com/go/asset v1.14.1 h1:vlHdznX70eYW4V1y1PxocvF6tEwxJTTarwIGwOhFF3U= | ||||
| cloud.google.com/go/assuredworkloads v1.11.1 h1:yaO0kwS+SnhVSTF7BqTyVGt3DTocI6Jqo+S3hHmCwNk= | ||||
| cloud.google.com/go/automl v1.13.1 h1:iP9iQurb0qbz+YOOMfKSEjhONA/WcoOIjt6/m+6pIgo= | ||||
| cloud.google.com/go/baremetalsolution v1.1.1 h1:0Ge9PQAy6cZ1tRrkc44UVgYV15nw2TVnzJzYsMHXF+E= | ||||
| cloud.google.com/go/batch v1.3.1 h1:uE0Q//W7FOGPjf7nuPiP0zoE8wOT3ngoIO2HIet0ilY= | ||||
| cloud.google.com/go/beyondcorp v1.0.0 h1:VPg+fZXULQjs8LiMeWdLaB5oe8G9sEoZ0I0j6IMiG1Q= | ||||
| cloud.google.com/go/bigquery v1.53.0 h1:K3wLbjbnSlxhuG5q4pntHv5AEbQM1QqHKGYgwFIqOTg= | ||||
| cloud.google.com/go/billing v1.16.0 h1:1iktEAIZ2uA6KpebC235zi/rCXDdDYQ0bTXTNetSL80= | ||||
| cloud.google.com/go/binaryauthorization v1.6.1 h1:cAkOhf1ic92zEN4U1zRoSupTmwmxHfklcp1X7CCBKvE= | ||||
| cloud.google.com/go/certificatemanager v1.7.1 h1:uKsohpE0hiobx1Eak9jNcPCznwfB6gvyQCcS28Ah9E8= | ||||
| cloud.google.com/go/channel v1.16.0 h1:dqRkK2k7Ll/HHeYGxv18RrfhozNxuTJRkspW0iaFZoY= | ||||
| cloud.google.com/go/cloudbuild v1.13.0 h1:YBbAWcvE4x6xPWTyS+OU4eiUpz5rCS3VCM/aqmfddPA= | ||||
| cloud.google.com/go/clouddms v1.6.1 h1:rjR1nV6oVf2aNNB7B5uz1PDIlBjlOiBgR+q5n7bbB7M= | ||||
| cloud.google.com/go/cloudtasks v1.12.1 h1:cMh9Q6dkvh+Ry5LAPbD/U2aw6KAqdiU6FttwhbTo69w= | ||||
| cloud.google.com/go/contactcenterinsights v1.10.0 h1:YR2aPedGVQPpFBZXJnPkqRj8M//8veIZZH5ZvICoXnI= | ||||
| cloud.google.com/go/container v1.24.0 h1:N51t/cgQJFqDD/W7Mb+IvmAPHrf8AbPx7Bb7aF4lROE= | ||||
| cloud.google.com/go/containeranalysis v0.10.1 h1:SM/ibWHWp4TYyJMwrILtcBtYKObyupwOVeceI9pNblw= | ||||
| cloud.google.com/go/datacatalog v1.16.0 h1:qVeQcw1Cz93/cGu2E7TYUPh8Lz5dn5Ws2siIuQ17Vng= | ||||
| cloud.google.com/go/dataflow v0.9.1 h1:VzG2tqsk/HbmOtq/XSfdF4cBvUWRK+S+oL9k4eWkENQ= | ||||
| cloud.google.com/go/dataform v0.8.1 h1:xcWso0hKOoxeW72AjBSIp/UfkvpqHNzzS0/oygHlcqY= | ||||
| cloud.google.com/go/datafusion v1.7.1 h1:eX9CZoyhKQW6g1Xj7+RONeDj1mV8KQDKEB9KLELX9/8= | ||||
| cloud.google.com/go/datalabeling v0.8.1 h1:zxsCD/BLKXhNuRssen8lVXChUj8VxF3ofN06JfdWOXw= | ||||
| cloud.google.com/go/dataplex v1.9.0 h1:yoBWuuUZklYp7nx26evIhzq8+i/nvKYuZr1jka9EqLs= | ||||
| cloud.google.com/go/dataproc/v2 v2.0.1 h1:4OpSiPMMGV3XmtPqskBU/RwYpj3yMFjtMLj/exi425Q= | ||||
| cloud.google.com/go/dataqna v0.8.1 h1:ITpUJep04hC9V7C+gcK390HO++xesQFSUJ7S4nSnF3U= | ||||
| cloud.google.com/go/datastore v1.13.0 h1:ktbC66bOQB3HJPQe8qNI1/aiQ77PMu7hD4mzE6uxe3w= | ||||
| cloud.google.com/go/datastream v1.10.0 h1:ra/+jMv36zTAGPfi8TRne1hXme+UsKtdcK4j6bnqQiw= | ||||
| cloud.google.com/go/deploy v1.13.0 h1:A+w/xpWgz99EYzB6e31gMGAI/P5jTZ2UO7veQK5jQ8o= | ||||
| cloud.google.com/go/dialogflow v1.40.0 h1:sCJbaXt6ogSbxWQnERKAzos57f02PP6WkGbOZvXUdwc= | ||||
| cloud.google.com/go/dlp v1.10.1 h1:tF3wsJ2QulRhRLWPzWVkeDz3FkOGVoMl6cmDUHtfYxw= | ||||
| cloud.google.com/go/documentai v1.22.0 h1:dW8ex9yb3oT9s1yD2+yLcU8Zq15AquRZ+wd0U+TkxFw= | ||||
| cloud.google.com/go/domains v0.9.1 h1:rqz6KY7mEg7Zs/69U6m6LMbB7PxFDWmT3QWNXIqhHm0= | ||||
| cloud.google.com/go/edgecontainer v1.1.1 h1:zhHWnLzg6AqzE+I3gzJqiIwHfjEBhWctNQEzqb+FaRo= | ||||
| cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= | ||||
| cloud.google.com/go/essentialcontacts v1.6.2 h1:OEJ0MLXXCW/tX1fkxzEZOsv/wRfyFsvDVNaHWBAvoV0= | ||||
| cloud.google.com/go/eventarc v1.13.0 h1:xIP3XZi0Xawx8DEfh++mE2lrIi5kQmCr/KcWhJ1q0J4= | ||||
| cloud.google.com/go/filestore v1.7.1 h1:Eiz8xZzMJc5ppBWkuaod/PUdUZGCFR8ku0uS+Ah2fRw= | ||||
| cloud.google.com/go/firestore v1.11.0 h1:PPgtwcYUOXV2jFe1bV3nda3RCrOa8cvBjTOn2MQVfW8= | ||||
| cloud.google.com/go/functions v1.15.1 h1:LtAyqvO1TFmNLcROzHZhV0agEJfBi+zfMZsF4RT/a7U= | ||||
| cloud.google.com/go/gkebackup v1.3.0 h1:lgyrpdhtJKV7l1GM15YFt+OCyHMxsQZuSydyNmS0Pxo= | ||||
| cloud.google.com/go/gkeconnect v0.8.1 h1:a1ckRvVznnuvDWESM2zZDzSVFvggeBaVY5+BVB8tbT0= | ||||
| cloud.google.com/go/gkehub v0.14.1 h1:2BLSb8i+Co1P05IYCKATXy5yaaIw/ZqGvVSBTLdzCQo= | ||||
| cloud.google.com/go/gkemulticloud v1.0.0 h1:MluqhtPVZReoriP5+adGIw+ij/RIeRik8KApCW2WMTw= | ||||
| cloud.google.com/go/gsuiteaddons v1.6.1 h1:mi9jxZpzVjLQibTS/XfPZvl+Jr6D5Bs8pGqUjllRb00= | ||||
| cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= | ||||
| cloud.google.com/go/iap v1.8.1 h1:X1tcp+EoJ/LGX6cUPt3W2D4H2Kbqq0pLAsldnsCjLlE= | ||||
| cloud.google.com/go/ids v1.4.1 h1:khXYmSoDDhWGEVxHl4c4IgbwSRR+qE/L4hzP3vaU9Hc= | ||||
| cloud.google.com/go/iot v1.7.1 h1:yrH0OSmicD5bqGBoMlWG8UltzdLkYzNUwNVUVz7OT54= | ||||
| cloud.google.com/go/kms v1.15.0 h1:xYl5WEaSekKYN5gGRyhjvZKM22GVBBCzegGNVPy+aIs= | ||||
| cloud.google.com/go/language v1.10.1 h1:3MXeGEv8AlX+O2LyV4pO4NGpodanc26AmXwOuipEym0= | ||||
| cloud.google.com/go/lifesciences v0.9.1 h1:axkANGx1wiBXHiPcJZAE+TDjjYoJRIDzbHC/WYllCBU= | ||||
| cloud.google.com/go/logging v1.7.0 h1:CJYxlNNNNAMkHp9em/YEXcfJg+rPDg7YfwoRpMU+t5I= | ||||
| cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= | ||||
| cloud.google.com/go/managedidentities v1.6.1 h1:2/qZuOeLgUHorSdxSQGtnOu9xQkBn37+j+oZQv/KHJY= | ||||
| cloud.google.com/go/maps v1.4.0 h1:PdfgpBLhAoSzZrQXP+/zBc78fIPLZSJp5y8+qSMn2UU= | ||||
| cloud.google.com/go/mediatranslation v0.8.1 h1:50cF7c1l3BanfKrpnTCaTvhf+Fo6kdF21DG0byG7gYU= | ||||
| cloud.google.com/go/memcache v1.10.1 h1:7lkLsF0QF+Mre0O/NvkD9Q5utUNwtzvIYjrOLOs0HO0= | ||||
| cloud.google.com/go/metastore v1.12.0 h1:+9DsxUOHvsqvC0ylrRc/JwzbXJaaBpfIK3tX0Lx8Tcc= | ||||
| cloud.google.com/go/monitoring v1.15.1 h1:65JhLMd+JiYnXr6j5Z63dUYCuOg770p8a/VC+gil/58= | ||||
| cloud.google.com/go/networkconnectivity v1.12.1 h1:LnrYM6lBEeTq+9f2lR4DjBhv31EROSAQi/P5W4Q0AEc= | ||||
| cloud.google.com/go/networkmanagement v1.8.0 h1:/3xP37eMxnyvkfLrsm1nv1b2FbMMSAEAOlECTvoeCq4= | ||||
| cloud.google.com/go/networksecurity v0.9.1 h1:TBLEkMp3AE+6IV/wbIGRNTxnqLXHCTEQWoxRVC18TzY= | ||||
| cloud.google.com/go/notebooks v1.9.1 h1:CUqMNEtv4EHFnbogV+yGHQH5iAQLmijOx191innpOcs= | ||||
| cloud.google.com/go/optimization v1.4.1 h1:pEwOAmO00mxdbesCRSsfj8Sd4rKY9kBrYW7Vd3Pq7cA= | ||||
| cloud.google.com/go/orchestration v1.8.1 h1:KmN18kE/xa1n91cM5jhCh7s1/UfIguSCisw7nTMUzgE= | ||||
| cloud.google.com/go/orgpolicy v1.11.1 h1:I/7dHICQkNwym9erHqmlb50LRU588NPCvkfIY0Bx9jI= | ||||
| cloud.google.com/go/osconfig v1.12.1 h1:dgyEHdfqML6cUW6/MkihNdTVc0INQst0qSE8Ou1ub9c= | ||||
| cloud.google.com/go/oslogin v1.10.1 h1:LdSuG3xBYu2Sgr3jTUULL1XCl5QBx6xwzGqzoDUw1j0= | ||||
| cloud.google.com/go/phishingprotection v0.8.1 h1:aK/lNmSd1vtbft/vLe2g7edXK72sIQbqr2QyrZN/iME= | ||||
| cloud.google.com/go/policytroubleshooter v1.8.0 h1:XTMHy31yFmXgQg57CB3w9YQX8US7irxDX0Fl0VwlZyY= | ||||
| cloud.google.com/go/privatecatalog v0.9.1 h1:B/18xGo+E0EMS9LOEQ0zXz7F2asMgmVgTYGSI89MHOA= | ||||
| cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= | ||||
| cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= | ||||
| cloud.google.com/go/recaptchaenterprise/v2 v2.7.2 h1:IGkbudobsTXAwmkEYOzPCQPApUCsN4Gbq3ndGVhHQpI= | ||||
| cloud.google.com/go/recommendationengine v0.8.1 h1:nMr1OEVHuDambRn+/y4RmNAmnR/pXCuHtH0Y4tCgGRQ= | ||||
| cloud.google.com/go/recommender v1.10.1 h1:UKp94UH5/Lv2WXSQe9+FttqV07x/2p1hFTMMYVFtilg= | ||||
| cloud.google.com/go/redis v1.13.1 h1:YrjQnCC7ydk+k30op7DSjSHw1yAYhqYXFcOq1bSXRYA= | ||||
| cloud.google.com/go/resourcemanager v1.9.1 h1:QIAMfndPOHR6yTmMUB0ZN+HSeRmPjR/21Smq5/xwghI= | ||||
| cloud.google.com/go/resourcesettings v1.6.1 h1:Fdyq418U69LhvNPFdlEO29w+DRRjwDA4/pFamm4ksAg= | ||||
| cloud.google.com/go/retail v1.14.1 h1:gYBrb9u/Hc5s5lUTFXX1Vsbc/9BEvgtioY6ZKaK0DK8= | ||||
| cloud.google.com/go/run v1.2.0 h1:kHeIG8q+N6Zv0nDkBjSOYfK2eWqa5FnaiDPH/7/HirE= | ||||
| cloud.google.com/go/scheduler v1.10.1 h1:yoZbZR8880KgPGLmACOMCiY2tPk+iX4V/dkxqTirlz8= | ||||
| cloud.google.com/go/secretmanager v1.11.1 h1:cLTCwAjFh9fKvU6F13Y4L9vPcx9yiWPyWXE4+zkuEQs= | ||||
| cloud.google.com/go/security v1.15.1 h1:jR3itwycg/TgGA0uIgTItcVhA55hKWiNJxaNNpQJaZE= | ||||
| cloud.google.com/go/securitycenter v1.23.0 h1:XOGJ9OpnDtqg8izd7gYk/XUhj8ytjIalyjjsR6oyG0M= | ||||
| cloud.google.com/go/servicedirectory v1.11.0 h1:pBWpjCFVGWkzVTkqN3TBBIqNSoSHY86/6RL0soSQ4z8= | ||||
| cloud.google.com/go/shell v1.7.1 h1:aHbwH9LSqs4r2rbay9f6fKEls61TAjT63jSyglsw7sI= | ||||
| cloud.google.com/go/spanner v1.47.0 h1:aqiMP8dhsEXgn9K5EZBWxPG7dxIiyM2VaikqeU4iteg= | ||||
| cloud.google.com/go/speech v1.19.0 h1:MCagaq8ObV2tr1kZJcJYgXYbIn8Ai5rp42tyGYw9rls= | ||||
| cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA= | ||||
| cloud.google.com/go/storagetransfer v1.10.0 h1:+ZLkeXx0K0Pk5XdDmG0MnUVqIR18lllsihU/yq39I8Q= | ||||
| cloud.google.com/go/talent v1.6.2 h1:j46ZgD6N2YdpFPux9mc7OAf4YK3tiBCsbLKc8rQx+bU= | ||||
| cloud.google.com/go/texttospeech v1.7.1 h1:S/pR/GZT9p15R7Y2dk2OXD/3AufTct/NSxT4a7nxByw= | ||||
| cloud.google.com/go/tpu v1.6.1 h1:kQf1jgPY04UJBYYjNUO+3GrZtIb57MfGAW2bwgLbR3A= | ||||
| cloud.google.com/go/trace v1.10.1 h1:EwGdOLCNfYOOPtgqo+D2sDLZmRCEO1AagRTJCU6ztdg= | ||||
| cloud.google.com/go/translate v1.8.2 h1:PQHamiOzlehqLBJMnM72lXk/OsMQewZB12BKJ8zXrU0= | ||||
| cloud.google.com/go/video v1.19.0 h1:BRyyS+wU+Do6VOXnb8WfPr42ZXti9hzmLKLUCkggeK4= | ||||
| cloud.google.com/go/videointelligence v1.11.1 h1:MBMWnkQ78GQnRz5lfdTAbBq/8QMCF3wahgtHh3s/J+k= | ||||
| cloud.google.com/go/vision/v2 v2.7.2 h1:ccK6/YgPfGHR/CyESz1mvIbsht5Y2xRsWCPqmTNydEw= | ||||
| cloud.google.com/go/vmmigration v1.7.1 h1:gnjIclgqbEMc+cF5IJuPxp53wjBIlqZ8h9hE8Rkwp7A= | ||||
| cloud.google.com/go/vmwareengine v1.0.0 h1:qsJ0CPlOQu/3MFBGklu752v3AkD+Pdu091UmXJ+EjTA= | ||||
| cloud.google.com/go/vpcaccess v1.7.1 h1:ram0GzjNWElmbxXMIzeOZUkQ9J8ZAahD6V8ilPGqX0Y= | ||||
| cloud.google.com/go/webrisk v1.9.1 h1:Ssy3MkOMOnyRV5H2bkMQ13Umv7CwB/kugo3qkAX83Fk= | ||||
| cloud.google.com/go/websecurityscanner v1.6.1 h1:CfEF/vZ+xXyAR3zC9iaC/QRdf1MEgS20r5UR17Q4gOg= | ||||
| cloud.google.com/go/workflows v1.11.1 h1:2akeQ/PgtRhrNuD/n1WvJd5zb7YyuDZrlOanBj2ihPg= | ||||
| dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= | ||||
| github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= | ||||
| github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= | ||||
| github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= | ||||
| github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= | ||||
| github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU= | ||||
| github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= | ||||
| github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= | ||||
| github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= | ||||
| github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I= | ||||
| github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to= | ||||
| github.com/aws/aws-sdk-go v1.35.24 h1:U3GNTg8+7xSM6OAJ8zksiSM4bRqxBWmVwwehvOSNG3A= | ||||
| github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= | ||||
| github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c h1:+0HFd5KSZ/mm3JmhmrDukiId5iR6w4+BdFtfSy4yWIc= | ||||
| github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= | ||||
| github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= | ||||
| github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= | ||||
| github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= | ||||
| github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= | ||||
| github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= | ||||
| github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= | ||||
| github.com/containerd/containerd v1.4.9 h1:JIw9mjVw4LsGmnA/Bqg9j9e+XB7soOJufrKUpA6n2Ns= | ||||
| github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8= | ||||
| github.com/containerd/fifo v1.0.0 h1:6PirWBr9/L7GDamKr+XM0IeUFXu5mf3M/BPpH9gaLBU= | ||||
| github.com/containerd/go-runc v1.0.0 h1:oU+lLv1ULm5taqgV/CJivypVODI4SUz1znWjv3nNYS0= | ||||
| github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= | ||||
| github.com/coreos/etcd v3.3.13+incompatible h1:8F3hqu9fGYLBifCmRCJsicFqDx/D68Rt3q1JMazcgBQ= | ||||
| github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= | ||||
| github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= | ||||
| github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= | ||||
| github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 h1:RMLoZVzv4GliuWafOuPuQDKSm1SJph7uCRnnS61JAn4= | ||||
| github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= | ||||
| github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= | ||||
| github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= | ||||
| github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= | ||||
| github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= | ||||
| github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= | ||||
| github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= | ||||
| github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= | ||||
| github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= | ||||
| github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= | ||||
| github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= | ||||
| github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= | ||||
| github.com/golangplus/bytes v1.0.0 h1:YQKBijBVMsBxIiXT4IEhlKR2zHohjEqPole4umyDX+c= | ||||
| github.com/golangplus/fmt v1.0.0 h1:FnUKtw86lXIPfBMc3FimNF3+ABcV+aH5F17OOitTN+E= | ||||
| github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= | ||||
| github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= | ||||
| github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= | ||||
| github.com/hashicorp/consul/api v1.1.0 h1:BNQPM9ytxj6jbjjdRPioQ94T6YXriSopn0i8COv6SRA= | ||||
| github.com/hashicorp/consul/sdk v0.1.1 h1:LnuDWGNsoajlhGyHJvuWW6FVqRl8JOTPqS6CPTsYjhY= | ||||
| github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= | ||||
| github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= | ||||
| github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= | ||||
| github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= | ||||
| github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= | ||||
| github.com/hashicorp/go-rootcerts v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI= | ||||
| github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= | ||||
| github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= | ||||
| github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= | ||||
| github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= | ||||
| github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= | ||||
| github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= | ||||
| github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= | ||||
| github.com/hashicorp/mdns v1.0.0 h1:WhIgCr5a7AaVH6jPUwjtRuuE7/RDufnUvzIr48smyxs= | ||||
| github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M= | ||||
| github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0= | ||||
| github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 h1:mV02weKRL81bEnm8A0HT1/CAelMQDBuQIfLw8n+d6xI= | ||||
| github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= | ||||
| github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= | ||||
| github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= | ||||
| github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= | ||||
| github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= | ||||
| github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= | ||||
| github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= | ||||
| github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= | ||||
| github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= | ||||
| github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= | ||||
| github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= | ||||
| github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= | ||||
| github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= | ||||
| github.com/mitchellh/cli v1.0.0 h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y= | ||||
| github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= | ||||
| github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= | ||||
| github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= | ||||
| github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= | ||||
| github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= | ||||
| github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= | ||||
| github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= | ||||
| github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= | ||||
| github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= | ||||
| github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs= | ||||
| github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= | ||||
| github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= | ||||
| github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w= | ||||
| github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= | ||||
| github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= | ||||
| github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f h1:UFr9zpz4xgTnIE5yIMtWAMngCdZ9p/+q6lTbgelo80M= | ||||
| github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= | ||||
| github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= | ||||
| github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= | ||||
| github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= | ||||
| github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= | ||||
| github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= | ||||
| github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= | ||||
| github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= | ||||
| github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= | ||||
| github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= | ||||
| github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= | ||||
| github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= | ||||
| github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= | ||||
| github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= | ||||
| github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= | ||||
| go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= | ||||
| go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= | ||||
| golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= | ||||
| golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= | ||||
| golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= | ||||
| golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808 h1:+Kc94D8UVEVxJnLXp/+FMfqQARZtWHfVrcRtcG8aT3g= | ||||
| golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= | ||||
| google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc h1:g3hIDl0jRNd9PPTs2uBzYuaD5mQuwOkZY0vSc0LR32o= | ||||
| google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= | ||||
| gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= | ||||
| gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= | ||||
| gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= | ||||
| gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= | ||||
| gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= | ||||
| honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= | ||||
| rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= | ||||
| rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= | ||||
| rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= | ||||
| sigs.k8s.io/kustomize/cmd/config v0.11.2 h1:YyoHHbxxsLUts/gWLGgIQkdT82ekp3zautbpcml54vc= | ||||
| @@ -30,18 +30,19 @@ source "${KUBE_ROOT}/hack/lib/protoc.sh" | ||||
| kube::protoc::check_protoc | ||||
| kube::golang::setup_env | ||||
| 
 | ||||
| GO111MODULE=on GOPROXY=off go install k8s.io/code-generator/cmd/go-to-protobuf | ||||
| GO111MODULE=on GOPROXY=off go install k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo | ||||
| 
 | ||||
| gotoprotobuf=$(kube::util::find-binary "go-to-protobuf") | ||||
| GOPROXY=off go install k8s.io/code-generator/cmd/go-to-protobuf | ||||
| GOPROXY=off go install k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo | ||||
| 
 | ||||
| # requires the 'proto' tag to build (will remove when ready) | ||||
| # searches for the protoc-gen-gogo extension in the output directory | ||||
| # satisfies import of github.com/gogo/protobuf/gogoproto/gogo.proto and the | ||||
| # core Google protobuf types | ||||
| PATH="${KUBE_ROOT}/_output/bin:${PATH}" \ | ||||
|   "${gotoprotobuf}" \ | ||||
|   --proto-import="${KUBE_ROOT}/vendor" \ | ||||
|   go-to-protobuf \ | ||||
|   -v "${KUBE_VERBOSE}" \ | ||||
|   --go-header-file "${KUBE_ROOT}/hack/boilerplate/boilerplate.generatego.txt" \ | ||||
|   --output-dir="${KUBE_ROOT}/staging/src" \ | ||||
|   --proto-import="${KUBE_ROOT}/staging/src" \ | ||||
|   --proto-import="${KUBE_ROOT}/vendor" `# required for gogo.proto` \ | ||||
|   --proto-import="${KUBE_ROOT}/third_party/protobuf" \ | ||||
|   --packages="$(IFS=, ; echo "$*")" \ | ||||
|   --go-header-file "${KUBE_ROOT}/hack/boilerplate/boilerplate.generatego.txt" | ||||
|   --packages="$(IFS=, ; echo "$*")" | ||||
| @@ -147,11 +147,11 @@ def file_extension(filename): | ||||
|  | ||||
| skipped_names = [ | ||||
|     "third_party", | ||||
|     "_gopath", | ||||
|     "_output", | ||||
|     ".git", | ||||
|     "cluster/env.sh", | ||||
|     "vendor", | ||||
|     "testdata", | ||||
|     "test/e2e/generated/bindata.go", | ||||
|     "hack/boilerplate/test", | ||||
|     "staging/src/k8s.io/kubectl/pkg/generated/bindata.go", | ||||
|   | ||||
| @@ -16,8 +16,6 @@ | ||||
|  | ||||
| # shellcheck disable=SC2034 # Variables sourced in other scripts. | ||||
|  | ||||
| # The golang package that we are building. | ||||
| readonly KUBE_GO_PACKAGE=k8s.io/kubernetes | ||||
| readonly KUBE_GOPATH="${KUBE_GOPATH:-"${KUBE_OUTPUT}/go"}" | ||||
| export KUBE_GOPATH | ||||
|  | ||||
| @@ -76,9 +74,9 @@ kube::golang::server_targets() { | ||||
|     cmd/kubelet | ||||
|     cmd/kubeadm | ||||
|     cmd/kube-scheduler | ||||
|     vendor/k8s.io/component-base/logs/kube-log-runner | ||||
|     vendor/k8s.io/kube-aggregator | ||||
|     vendor/k8s.io/apiextensions-apiserver | ||||
|     staging/src/k8s.io/component-base/logs/kube-log-runner | ||||
|     staging/src/k8s.io/kube-aggregator | ||||
|     staging/src/k8s.io/apiextensions-apiserver | ||||
|     cluster/gce/gci/mounter | ||||
|   ) | ||||
|   echo "${targets[@]}" | ||||
| @@ -126,7 +124,7 @@ kube::golang::node_targets() { | ||||
|     cmd/kube-proxy | ||||
|     cmd/kubeadm | ||||
|     cmd/kubelet | ||||
|     vendor/k8s.io/component-base/logs/kube-log-runner | ||||
|     staging/src/k8s.io/component-base/logs/kube-log-runner | ||||
|   ) | ||||
|   echo "${targets[@]}" | ||||
| } | ||||
| @@ -318,7 +316,7 @@ readonly KUBE_ALL_TARGETS=( | ||||
| ) | ||||
| readonly KUBE_ALL_BINARIES=("${KUBE_ALL_TARGETS[@]##*/}") | ||||
|  | ||||
| readonly KUBE_STATIC_LIBRARIES=( | ||||
| readonly KUBE_STATIC_BINARIES=( | ||||
|   apiextensions-apiserver | ||||
|   kube-aggregator | ||||
|   kube-apiserver | ||||
| @@ -344,16 +342,16 @@ readonly KUBE_COVERAGE_INSTRUMENTED_PACKAGES=( | ||||
|  | ||||
| # KUBE_CGO_OVERRIDES is a space-separated list of binaries which should be built | ||||
| # with CGO enabled, assuming CGO is supported on the target platform. | ||||
| # This overrides any entry in KUBE_STATIC_LIBRARIES. | ||||
| # This overrides any entry in KUBE_STATIC_BINARIES. | ||||
| IFS=" " read -ra KUBE_CGO_OVERRIDES_LIST <<< "${KUBE_CGO_OVERRIDES:-}" | ||||
| readonly KUBE_CGO_OVERRIDES_LIST | ||||
| # KUBE_STATIC_OVERRIDES is a space-separated list of binaries which should be | ||||
| # built with CGO disabled. This is in addition to the list in | ||||
| # KUBE_STATIC_LIBRARIES. | ||||
| # KUBE_STATIC_BINARIES. | ||||
| IFS=" " read -ra KUBE_STATIC_OVERRIDES_LIST <<< "${KUBE_STATIC_OVERRIDES:-}" | ||||
| readonly KUBE_STATIC_OVERRIDES_LIST | ||||
|  | ||||
| kube::golang::is_statically_linked_library() { | ||||
| kube::golang::is_statically_linked() { | ||||
|   local e | ||||
|   # Explicitly enable cgo when building kubectl for darwin from darwin. | ||||
|   [[ "$(go env GOHOSTOS)" == "darwin" && "$(go env GOOS)" == "darwin" && | ||||
| @@ -361,16 +359,18 @@ kube::golang::is_statically_linked_library() { | ||||
|   if [[ -n "${KUBE_CGO_OVERRIDES_LIST:+x}" ]]; then | ||||
|     for e in "${KUBE_CGO_OVERRIDES_LIST[@]}"; do [[ "${1}" == *"/${e}" ]] && return 1; done; | ||||
|   fi | ||||
|   for e in "${KUBE_STATIC_LIBRARIES[@]}"; do [[ "${1}" == *"/${e}" ]] && return 0; done; | ||||
|   for e in "${KUBE_STATIC_BINARIES[@]}"; do [[ "${1}" == *"/${e}" ]] && return 0; done; | ||||
|   if [[ -n "${KUBE_STATIC_OVERRIDES_LIST:+x}" ]]; then | ||||
|     for e in "${KUBE_STATIC_OVERRIDES_LIST[@]}"; do [[ "${1}" == *"/${e}" ]] && return 0; done; | ||||
|   fi | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| # kube::binaries_from_targets take a list of build targets and return the | ||||
| # full go package to be built | ||||
| kube::golang::binaries_from_targets() { | ||||
| # kube::golang::best_guess_go_targets takes a list of build targets, which might | ||||
| # be Go-style names (e.g. example.com/foo/bar or ./foo/bar) or just local paths | ||||
| # (e.g. foo/bar) and produces a respective list (on stdout) of our best guess at | ||||
| # Go target names. | ||||
| kube::golang::best_guess_go_targets() { | ||||
|   local target | ||||
|   for target; do | ||||
|     if [ "${target}" = "ginkgo" ] || | ||||
| @@ -380,17 +380,72 @@ kube::golang::binaries_from_targets() { | ||||
|       # "ginkgo" is the one that is documented in the Makefile. The others | ||||
|       # are for backwards compatibility. | ||||
|       echo "github.com/onsi/ginkgo/v2/ginkgo" | ||||
|     elif [[ "${target}" =~ ^([[:alnum:]]+".")+[[:alnum:]]+"/" ]]; then | ||||
|       # If the target starts with what looks like a domain name, assume it has a | ||||
|       # fully-qualified package name rather than one that needs the Kubernetes | ||||
|       # package prepended. | ||||
|       echo "${target}" | ||||
|     elif [[ "${target}" =~ ^vendor/ ]]; then | ||||
|       # Strip vendor/ prefix, since we're building in gomodule mode. | ||||
|       echo "${target#"vendor/"}" | ||||
|     else | ||||
|       echo "${KUBE_GO_PACKAGE}/${target}" | ||||
|       continue | ||||
|     fi | ||||
|  | ||||
|     if [[ "${target}" =~ ^([[:alnum:]]+".")+[[:alnum:]]+"/" ]]; then | ||||
|       # If the target starts with what looks like a domain name, assume it has a | ||||
|       # fully-qualified Go package name. | ||||
|       echo "${target}" | ||||
|       continue | ||||
|     fi | ||||
|  | ||||
|     if [[ "${target}" =~ ^vendor/ ]]; then | ||||
|       # Strip vendor/ prefix, since we're building in gomodule mode.  This is | ||||
|       # for backwards compatibility. | ||||
|       echo "${target#"vendor/"}" | ||||
|       continue | ||||
|     fi | ||||
|  | ||||
|     # If the target starts with "./", assume it is a local path which qualifies | ||||
|     # as a Go target name. | ||||
|     if [[ "${target}" =~ ^\./ ]]; then | ||||
|       echo "${target}" | ||||
|       continue | ||||
|     fi | ||||
|  | ||||
|     # Otherwise assume it's a relative path (e.g. foo/bar or foo/bar/bar.test). | ||||
|     # We probably SHOULDN'T accept this, but we did in the past and it would be | ||||
|     # rude to break things if we don't NEED to.  We can't really test if it | ||||
|     # exists or not, because the last element might be an output file (e.g. | ||||
|     # bar.test) or even "...". | ||||
|     echo "./${target}" | ||||
|   done | ||||
| } | ||||
|  | ||||
| # kube::golang::normalize_go_targets takes a list of build targets, which might | ||||
| # be Go-style names (e.g. example.com/foo/bar or ./foo/bar) or just local paths | ||||
| # (e.g. foo/bar) and produces a respective list (on stdout) of Go package | ||||
| # names. | ||||
| # | ||||
| # If this cannot find (go list -find -e) one or more inputs, it will emit the | ||||
| # them on stdout, so callers can at least get a useful error. | ||||
| kube::golang::normalize_go_targets() { | ||||
|   local targets=() | ||||
|   kube::util::read-array targets < <(kube::golang::best_guess_go_targets "$@") | ||||
|   kube::util::read-array targets < <(kube::golang::dedup "${targets[@]}") | ||||
|   set -- "${targets[@]}" | ||||
|  | ||||
|   for target; do | ||||
|     if [[ "${target}" =~ ".test"$ ]]; then | ||||
|       local dir | ||||
|       dir="$(dirname "${target}")" | ||||
|       local tst | ||||
|       tst="$(basename "${target}")" | ||||
|       local pkg | ||||
|       pkg="$(go list -find -e "${dir}")" | ||||
|       echo "${pkg}/${tst}" | ||||
|       continue | ||||
|     fi | ||||
|     if [[ "${target}" =~ "/..."$ ]]; then | ||||
|       local dir | ||||
|       dir="$(dirname "${target}")" | ||||
|       local pkg | ||||
|       pkg="$(go list -find -e "${dir}")" | ||||
|       echo "${pkg}/..." | ||||
|       continue | ||||
|     fi | ||||
|     go list -find -e "${target}" | ||||
|   done | ||||
| } | ||||
|  | ||||
| @@ -446,25 +501,11 @@ kube::golang::set_platform_envs() { | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Create the GOPATH tree under $KUBE_OUTPUT | ||||
| kube::golang::create_gopath_tree() { | ||||
|   local go_pkg_dir="${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}" | ||||
|   local go_pkg_basedir | ||||
|   go_pkg_basedir=$(dirname "${go_pkg_dir}") | ||||
|  | ||||
|   mkdir -p "${go_pkg_basedir}" | ||||
|  | ||||
|   # TODO: This symlink should be relative. | ||||
|   if [[ ! -e "${go_pkg_dir}" || "$(readlink "${go_pkg_dir}")" != "${KUBE_ROOT}" ]]; then | ||||
|     ln -snf "${KUBE_ROOT}" "${go_pkg_dir}" | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Ensure the go tool exists and is a viable version. | ||||
| # Inputs: | ||||
| #   env-var GO_VERSION is the desired go version to use, downloading it if needed (defaults to content of .go-version) | ||||
| #   env-var FORCE_HOST_GO set to a non-empty value uses the go version in the $PATH and skips ensuring $GO_VERSION is used | ||||
| kube::golang::verify_go_version() { | ||||
| kube::golang::internal::verify_go_version() { | ||||
|   # default GO_VERSION to content of .go-version | ||||
|   GO_VERSION="${GO_VERSION:-"$(cat "${KUBE_ROOT}/.go-version")"}" | ||||
|   if [ "${GOTOOLCHAIN:-auto}" != 'auto' ]; then | ||||
| @@ -515,20 +556,14 @@ EOF | ||||
| # Outputs: | ||||
| #   env-var GOPATH points to our local output dir | ||||
| #   env-var GOBIN is unset (we want binaries in a predictable place) | ||||
| #   env-var GO15VENDOREXPERIMENT=1 | ||||
| #   current directory is within GOPATH | ||||
| #   env-var PATH includes the local GOPATH | ||||
| kube::golang::setup_env() { | ||||
|   kube::golang::verify_go_version | ||||
|  | ||||
|   # Set up GOPATH.  We have tools which depend on being in a GOPATH (see | ||||
|   # hack/run-in-gopath.sh). | ||||
|   # | ||||
|   # Even in module mode, we need to set GOPATH for `go build` and `go install` | ||||
|   # to work.  We build various tools (usually via `go install`) from a lot of | ||||
|   # scripts. | ||||
|   #   * We can't set GOBIN because that does not work on cross-compiles. | ||||
|   #   * We could use `go build -o <something>`, but it's subtle when it comes | ||||
|   #     to cross-compiles and whether the <something> is a file or a directory, | ||||
|   #   * We can't just set GOBIN because that does not work on cross-compiles. | ||||
|   #   * We could always use `go build -o <something>`, but it's subtle wrt | ||||
|   #     cross-compiles and whether the <something> is a file or a directory, | ||||
|   #     and EVERY caller has to get it *just* right. | ||||
|   #   * We could leave GOPATH alone and let `go install` write binaries | ||||
|   #     wherever the user's GOPATH says (or doesn't say). | ||||
| @@ -536,10 +571,6 @@ kube::golang::setup_env() { | ||||
|   # Instead we set it to a phony local path and process the results ourselves. | ||||
|   # In particular, GOPATH[0]/bin will be used for `go install`, with | ||||
|   # cross-compiles adding an extra directory under that. | ||||
|   # | ||||
|   # Eventually, when we no longer rely on run-in-gopath.sh we may be able to | ||||
|   # simplify this some. | ||||
|   kube::golang::create_gopath_tree | ||||
|   export GOPATH="${KUBE_GOPATH}" | ||||
|  | ||||
|   # If these are not set, set them now.  This ensures that any subsequent | ||||
| @@ -550,23 +581,17 @@ kube::golang::setup_env() { | ||||
|   # Make sure our own Go binaries are in PATH. | ||||
|   export PATH="${KUBE_GOPATH}/bin:${PATH}" | ||||
|  | ||||
|   # Change directories so that we are within the GOPATH.  Some tools get really | ||||
|   # upset if this is not true.  We use a whole fake GOPATH here to collect the | ||||
|   # resultant binaries. | ||||
|   local subdir | ||||
|   subdir=$(kube::realpath . | sed "s|${KUBE_ROOT}||") | ||||
|   cd "${KUBE_GOPATH}/src/${KUBE_GO_PACKAGE}/${subdir}" || return 1 | ||||
|  | ||||
|   # Set GOROOT so binaries that parse code can work properly. | ||||
|   GOROOT=$(go env GOROOT) | ||||
|   export GOROOT | ||||
|  | ||||
|   # Unset GOBIN in case it already exists in the current session. | ||||
|   # Cross-compiles will not work with it set. | ||||
|   unset GOBIN | ||||
|  | ||||
|   # This seems to matter to some tools | ||||
|   export GO15VENDOREXPERIMENT=1 | ||||
|   # Turn on modules and workspaces (both are default-on). | ||||
|   unset GO111MODULE | ||||
|   unset GOWORK | ||||
|  | ||||
|   # This may try to download our specific Go version.  Do it last so it uses | ||||
|   # the above-configured environment. | ||||
|   kube::golang::internal::verify_go_version | ||||
| } | ||||
|  | ||||
| kube::golang::setup_gomaxprocs() { | ||||
| @@ -576,7 +601,7 @@ kube::golang::setup_gomaxprocs() { | ||||
|     if ! command -v ncpu >/dev/null 2>&1; then | ||||
|       # shellcheck disable=SC2164 | ||||
|       pushd "${KUBE_ROOT}/hack/tools" >/dev/null | ||||
|       GO111MODULE=on go install ./ncpu || echo "Will not automatically set GOMAXPROCS" | ||||
|       go install ./ncpu || echo "Will not automatically set GOMAXPROCS" | ||||
|       # shellcheck disable=SC2164 | ||||
|       popd >/dev/null | ||||
|     fi | ||||
| @@ -589,10 +614,10 @@ kube::golang::setup_gomaxprocs() { | ||||
| } | ||||
|  | ||||
| # This will take binaries from $GOPATH/bin and copy them to the appropriate | ||||
| # place in ${KUBE_OUTPUT_BINDIR} | ||||
| # place in ${KUBE_OUTPUT_BIN} | ||||
| # | ||||
| # Ideally this wouldn't be necessary and we could just set GOBIN to | ||||
| # KUBE_OUTPUT_BINDIR but that won't work in the face of cross compilation.  'go | ||||
| # KUBE_OUTPUT_BIN but that won't work in the face of cross compilation.  'go | ||||
| # install' will place binaries that match the host platform directly in $GOBIN | ||||
| # while placing cross compiled binaries into `platform_arch` subdirs.  This | ||||
| # complicates pretty much everything else we do around packaging and such. | ||||
| @@ -610,14 +635,14 @@ kube::golang::place_bins() { | ||||
|     if [[ "${platform}" == "${host_platform}" ]]; then | ||||
|       platform_src="" | ||||
|       rm -f "${THIS_PLATFORM_BIN}" | ||||
|       ln -s "${KUBE_OUTPUT_BINPATH}/${platform}" "${THIS_PLATFORM_BIN}" | ||||
|       ln -s "${KUBE_OUTPUT_BIN}/${platform}" "${THIS_PLATFORM_BIN}" | ||||
|     fi | ||||
|  | ||||
|     local full_binpath_src="${KUBE_GOPATH}/bin${platform_src}" | ||||
|     if [[ -d "${full_binpath_src}" ]]; then | ||||
|       mkdir -p "${KUBE_OUTPUT_BINPATH}/${platform}" | ||||
|       mkdir -p "${KUBE_OUTPUT_BIN}/${platform}" | ||||
|       find "${full_binpath_src}" -maxdepth 1 -type f -exec \ | ||||
|         rsync -pc {} "${KUBE_OUTPUT_BINPATH}/${platform}" \; | ||||
|         rsync -pc {} "${KUBE_OUTPUT_BIN}/${platform}" \; | ||||
|     fi | ||||
|   done | ||||
| } | ||||
| @@ -660,7 +685,8 @@ kube::golang::is_instrumented_package() { | ||||
| # Echos the path to a dummy test used for coverage information. | ||||
| kube::golang::path_for_coverage_dummy_test() { | ||||
|   local package="$1" | ||||
|   local path="${KUBE_GOPATH}/src/${package}" | ||||
|   local path | ||||
|   path=$(go list -find -f '{{.Dir}}' "${package}") | ||||
|   local name | ||||
|   name=$(basename "${package}") | ||||
|   echo "${path}/zz_generated_${name}_test.go" | ||||
| @@ -727,7 +753,7 @@ kube::golang::build_some_binaries() { | ||||
|  | ||||
|         go test -c -o "$(kube::golang::outfile_for_binary "${package}" "${platform}")" \ | ||||
|           -covermode count \ | ||||
|           -coverpkg k8s.io/...,k8s.io/kubernetes/vendor/k8s.io/... \ | ||||
|           -coverpkg k8s.io/... \ | ||||
|           "${build_args[@]}" \ | ||||
|           -tags coverage \ | ||||
|           "${package}" | ||||
| @@ -737,14 +763,14 @@ kube::golang::build_some_binaries() { | ||||
|     done | ||||
|     if [[ "${#uncovered[@]}" != 0 ]]; then | ||||
|       V=2 kube::log::info "Building ${uncovered[*]} without coverage..." | ||||
|       GO111MODULE=on GOPROXY=off go install "${build_args[@]}" "${uncovered[@]}" | ||||
|       GOPROXY=off go install "${build_args[@]}" "${uncovered[@]}" | ||||
|     else | ||||
|       V=2 kube::log::info "Nothing to build without coverage." | ||||
|      fi | ||||
|    else | ||||
|     fi | ||||
|   else | ||||
|     V=2 kube::log::info "Coverage is disabled." | ||||
|     GO111MODULE=on GOPROXY=off go install "${build_args[@]}" "$@" | ||||
|    fi | ||||
|     GOPROXY=off go install "${build_args[@]}" "$@" | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Args: | ||||
| @@ -763,14 +789,14 @@ kube::golang::build_binaries_for_platform() { | ||||
|     if [[ "${binary}" =~ ".test"$ ]]; then | ||||
|       tests+=("${binary}") | ||||
|       kube::log::info "    ${binary} (test)" | ||||
|     elif kube::golang::is_statically_linked_library "${binary}"; then | ||||
|     elif kube::golang::is_statically_linked "${binary}"; then | ||||
|       statics+=("${binary}") | ||||
|       kube::log::info "    ${binary} (static)" | ||||
|     else | ||||
|       nonstatics+=("${binary}") | ||||
|       kube::log::info "    ${binary} (non-static)" | ||||
|     fi | ||||
|   done | ||||
|    done | ||||
|  | ||||
|   V=2 kube::log::info "Env for ${platform}: GOOS=${GOOS-} GOARCH=${GOARCH-} GOROOT=${GOROOT-} CGO_ENABLED=${CGO_ENABLED-} CC=${CC-}" | ||||
|   V=3 kube::log::info "Building binaries with GCFLAGS=${gogcflags} LDFLAGS=${goldflags}" | ||||
| @@ -892,18 +918,20 @@ kube::golang::build_binaries() { | ||||
|       fi | ||||
|     done | ||||
|  | ||||
|     if [[ ${#targets[@]} -eq 0 ]]; then | ||||
|       targets=("${KUBE_ALL_TARGETS[@]}") | ||||
|     fi | ||||
|  | ||||
|     local -a platforms | ||||
|     IFS=" " read -ra platforms <<< "${KUBE_BUILD_PLATFORMS:-}" | ||||
|     if [[ ${#platforms[@]} -eq 0 ]]; then | ||||
|       platforms=("${host_platform}") | ||||
|     fi | ||||
|  | ||||
|     if [[ ${#targets[@]} -eq 0 ]]; then | ||||
|       targets=("${KUBE_ALL_TARGETS[@]}") | ||||
|     fi | ||||
|     kube::util::read-array targets < <(kube::golang::dedup "${targets[@]}") | ||||
|  | ||||
|     local -a binaries | ||||
|     while IFS="" read -r binary; do binaries+=("$binary"); done < <(kube::golang::binaries_from_targets "${targets[@]}") | ||||
|     kube::util::read-array binaries < <(kube::golang::normalize_go_targets "${targets[@]}") | ||||
|     kube::util::read-array binaries < <(kube::golang::dedup "${binaries[@]}") | ||||
|  | ||||
|     local parallel=false | ||||
|     if [[ ${#platforms[@]} -gt 1 ]]; then | ||||
|   | ||||
| @@ -25,12 +25,6 @@ set -o pipefail | ||||
| # https://github.com/kubernetes/kubernetes/issues/52255 | ||||
| unset CDPATH | ||||
|  | ||||
| # Until all GOPATH references are removed from all build scripts as well, | ||||
| # explicitly disable module mode to avoid picking up user-set GO111MODULE preferences. | ||||
| # As individual scripts (like hack/update-vendor.sh) make use of go modules, | ||||
| # they can explicitly set GO111MODULE=on | ||||
| export GO111MODULE=off | ||||
|  | ||||
| # FIXME(dims): Note that here we assume that if GOFLAGS are already set we | ||||
| # leave them as-is and not try to add providerless to it. So if you | ||||
| # really need to set your own GOFLAGS, ensure you add "providerless" explicitly | ||||
| @@ -41,9 +35,21 @@ fi | ||||
| # The root of the build/dist directory | ||||
| KUBE_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)" | ||||
|  | ||||
| KUBE_OUTPUT_SUBPATH="${KUBE_OUTPUT_SUBPATH:-_output/local}" | ||||
| KUBE_OUTPUT="${KUBE_ROOT}/${KUBE_OUTPUT_SUBPATH}" | ||||
| KUBE_OUTPUT_BINPATH="${KUBE_OUTPUT}/bin" | ||||
| # Where output goes.  We should avoid redefining these anywhere else. | ||||
| # | ||||
| # KUBE_OUTPUT: the root directory (absolute) where this build should drop any | ||||
| #     files (subdirs are encouraged). | ||||
| # KUBE_OUTPUT_BIN: the directory in which compiled binaries will be placed, | ||||
| #     under OS/ARCH specific subdirs | ||||
| # THIS_PLATFORM_BIN: a symlink to the output directory for binaries built for | ||||
| #     the current host platform (e.g. build/test tools). | ||||
| # | ||||
| # Compat: The KUBE_OUTPUT_SUBPATH variable is sometimes passed in by callers. | ||||
| # If it is specified, we'll use it in KUBE_OUTPUT. | ||||
| _KUBE_OUTPUT_SUBPATH="${KUBE_OUTPUT_SUBPATH:-_output/local}" | ||||
| export KUBE_OUTPUT="${KUBE_ROOT}/${_KUBE_OUTPUT_SUBPATH}" | ||||
| export KUBE_OUTPUT_BIN="${KUBE_OUTPUT}/bin" | ||||
| export THIS_PLATFORM_BIN="${KUBE_ROOT}/_output/bin" | ||||
|  | ||||
| # This controls rsync compression. Set to a value > 0 to enable rsync | ||||
| # compression for build container | ||||
| @@ -53,9 +59,6 @@ KUBE_RSYNC_COMPRESS="${KUBE_RSYNC_COMPRESS:-0}" | ||||
| # the connections to localhost in scripts will time out | ||||
| export no_proxy="127.0.0.1,localhost${no_proxy:+,${no_proxy}}" | ||||
|  | ||||
| # This is a symlink to binaries for "this platform", e.g. build tools. | ||||
| export THIS_PLATFORM_BIN="${KUBE_ROOT}/_output/bin" | ||||
|  | ||||
| source "${KUBE_ROOT}/hack/lib/util.sh" | ||||
| source "${KUBE_ROOT}/hack/lib/logging.sh" | ||||
|  | ||||
| @@ -66,9 +69,6 @@ source "${KUBE_ROOT}/hack/lib/version.sh" | ||||
| source "${KUBE_ROOT}/hack/lib/golang.sh" | ||||
| source "${KUBE_ROOT}/hack/lib/etcd.sh" | ||||
|  | ||||
| KUBE_OUTPUT_HOSTBIN="${KUBE_OUTPUT_BINPATH}/$(kube::util::host_platform)" | ||||
| export KUBE_OUTPUT_HOSTBIN | ||||
|  | ||||
| # list of all available group versions.  This should be used when generated code | ||||
| # or when starting an API server that you want to have everything. | ||||
| # most preferred version for a group should appear first | ||||
|   | ||||
| @@ -32,7 +32,7 @@ PROTOC_VERSION=23.4 | ||||
| # $1: Full path to the directory where the api.proto file is | ||||
| function kube::protoc::generate_proto() { | ||||
|   kube::golang::setup_env | ||||
|   GO111MODULE=on GOPROXY=off go install k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo | ||||
|   GOPROXY=off go install k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo | ||||
|  | ||||
|   kube::protoc::check_protoc | ||||
|  | ||||
| @@ -84,7 +84,7 @@ function kube::protoc::format() { | ||||
|   cat hack/boilerplate/boilerplate.generatego.txt "${package}/api.pb.go" > tmpfile && mv tmpfile "${package}/api.pb.go" | ||||
|  | ||||
|   # Run gofmt to clean up the generated code. | ||||
|   kube::golang::verify_go_version | ||||
|   kube::golang::setup_env | ||||
|   gofmt -s -w "${package}/api.pb.go" | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -243,59 +243,6 @@ kube::util::find-binary() { | ||||
|   kube::util::find-binary-for-platform "$1" "$(kube::util::host_platform)" | ||||
| } | ||||
|  | ||||
| # Run all known doc generators (today gendocs and genman for kubectl) | ||||
| # $1 is the directory to put those generated documents | ||||
| kube::util::gen-docs() { | ||||
|   local dest="$1" | ||||
|  | ||||
|   # Find binary | ||||
|   gendocs=$(kube::util::find-binary "gendocs") | ||||
|   genkubedocs=$(kube::util::find-binary "genkubedocs") | ||||
|   genman=$(kube::util::find-binary "genman") | ||||
|   genyaml=$(kube::util::find-binary "genyaml") | ||||
|  | ||||
|   mkdir -p "${dest}/docs/user-guide/kubectl/" | ||||
|   "${gendocs}" "${dest}/docs/user-guide/kubectl/" | ||||
|   mkdir -p "${dest}/docs/admin/" | ||||
|   "${genkubedocs}" "${dest}/docs/admin/" "kube-apiserver" | ||||
|   "${genkubedocs}" "${dest}/docs/admin/" "kube-controller-manager" | ||||
|   "${genkubedocs}" "${dest}/docs/admin/" "kube-proxy" | ||||
|   "${genkubedocs}" "${dest}/docs/admin/" "kube-scheduler" | ||||
|   "${genkubedocs}" "${dest}/docs/admin/" "kubelet" | ||||
|   "${genkubedocs}" "${dest}/docs/admin/" "kubeadm" | ||||
|  | ||||
|   mkdir -p "${dest}/docs/man/man1/" | ||||
|   "${genman}" "${dest}/docs/man/man1/" "kube-apiserver" | ||||
|   "${genman}" "${dest}/docs/man/man1/" "kube-controller-manager" | ||||
|   "${genman}" "${dest}/docs/man/man1/" "kube-proxy" | ||||
|   "${genman}" "${dest}/docs/man/man1/" "kube-scheduler" | ||||
|   "${genman}" "${dest}/docs/man/man1/" "kubelet" | ||||
|   "${genman}" "${dest}/docs/man/man1/" "kubectl" | ||||
|   "${genman}" "${dest}/docs/man/man1/" "kubeadm" | ||||
|  | ||||
|   mkdir -p "${dest}/docs/yaml/kubectl/" | ||||
|   "${genyaml}" "${dest}/docs/yaml/kubectl/" | ||||
|  | ||||
|   # create the list of generated files | ||||
|   pushd "${dest}" > /dev/null || return 1 | ||||
|   touch docs/.generated_docs | ||||
|   find . -type f | cut -sd / -f 2- | LC_ALL=C sort > docs/.generated_docs | ||||
|   popd > /dev/null || return 1 | ||||
| } | ||||
|  | ||||
| # Removes previously generated docs-- we don't want to check them in. $KUBE_ROOT | ||||
| # must be set. | ||||
| kube::util::remove-gen-docs() { | ||||
|   if [ -e "${KUBE_ROOT}/docs/.generated_docs" ]; then | ||||
|     # remove all of the old docs; we don't want to check them in. | ||||
|     while read -r file; do | ||||
|       rm "${KUBE_ROOT}/${file}" 2>/dev/null || true | ||||
|     done <"${KUBE_ROOT}/docs/.generated_docs" | ||||
|     # The docs/.generated_docs file lists itself, so we don't need to explicitly | ||||
|     # delete it. | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Takes a group/version and returns the path to its location on disk, sans | ||||
| # "pkg". E.g.: | ||||
| # * default behavior: extensions/v1beta1 -> apis/extensions/v1beta1 | ||||
| @@ -322,14 +269,14 @@ kube::util::group-version-to-pkg-path() { | ||||
|     # Change "foo.bar.k8s.io/v1" -> "foo/v1" notation. | ||||
|     local simple_gv="${group_version/.*k8s.io/}" | ||||
|     if [[ "${api}" = "${simple_gv}" ]]; then | ||||
|       echo "vendor/k8s.io/api/${simple_gv}" | ||||
|       echo "staging/src/k8s.io/api/${simple_gv}" | ||||
|       return | ||||
|     fi | ||||
|   done | ||||
|  | ||||
|   # "v1" is the API GroupVersion | ||||
|   if [[ "${group_version}" == "v1" ]]; then | ||||
|     echo "vendor/k8s.io/api/core/v1" | ||||
|     echo "staging/src/k8s.io/api/core/v1" | ||||
|     return | ||||
|   fi | ||||
|  | ||||
| @@ -342,13 +289,13 @@ kube::util::group-version-to-pkg-path() { | ||||
|       echo "pkg/apis/core" | ||||
|       ;; | ||||
|     meta/v1) | ||||
|       echo "vendor/k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
|       echo "staging/src/k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
|       ;; | ||||
|     meta/v1beta1) | ||||
|       echo "vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1" | ||||
|       echo "staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1" | ||||
|       ;; | ||||
|     internal.apiserver.k8s.io/v1alpha1) | ||||
|       echo "vendor/k8s.io/api/apiserverinternal/v1alpha1" | ||||
|       echo "staging/src/k8s.io/api/apiserverinternal/v1alpha1" | ||||
|       ;; | ||||
|     *.k8s.io) | ||||
|       echo "pkg/apis/${group_version%.*k8s.io}" | ||||
| @@ -832,8 +779,8 @@ function kube::util::md5() { | ||||
| # kube::util::read-array | ||||
| # Reads in stdin and adds it line by line to the array provided. This can be | ||||
| # used instead of "mapfile -t", and is bash 3 compatible.  If the named array | ||||
| # exists and is an array, it will be used.  Otherwise it will be unset and | ||||
| # recreated. | ||||
| # exists and is an array, it will be overwritten.  Otherwise it will be unset | ||||
| # and recreated. | ||||
| # | ||||
| # Assumed vars: | ||||
| #   $1 (name of array to create/modify) | ||||
|   | ||||
| @@ -156,8 +156,6 @@ kube::version::ldflags() { | ||||
|     local key=${1} | ||||
|     local val=${2} | ||||
|     ldflags+=( | ||||
|       "-X '${KUBE_GO_PACKAGE}/vendor/k8s.io/client-go/pkg/version.${key}=${val}'" | ||||
|       "-X '${KUBE_GO_PACKAGE}/vendor/k8s.io/component-base/version.${key}=${val}'" | ||||
|       "-X 'k8s.io/client-go/pkg/version.${key}=${val}'" | ||||
|       "-X 'k8s.io/component-base/version.${key}=${val}'" | ||||
|     ) | ||||
|   | ||||
| @@ -25,19 +25,20 @@ set -o pipefail | ||||
| KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. | ||||
| source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
|  | ||||
| # Explicitly opt into go modules, even though we're inside a GOPATH directory | ||||
| export GO111MODULE=on | ||||
| # Explicitly set GOFLAGS to ignore vendor, since GOFLAGS=-mod=vendor breaks dependency resolution while rebuilding vendor | ||||
| export GOFLAGS=-mod=mod | ||||
| # Detect problematic GOPROXY settings that prevent lookup of dependencies | ||||
| if [[ "${GOPROXY:-}" == "off" ]]; then | ||||
|   kube::log::error "Cannot run with \$GOPROXY=off" | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| kube::golang::verify_go_version | ||||
| kube::golang::setup_env | ||||
| kube::util::require-jq | ||||
|  | ||||
| # Set the Go environment, otherwise we get "can't compute 'all' using the | ||||
| # vendor directory". | ||||
| export GOWORK=off | ||||
| export GOFLAGS=-mod=mod | ||||
|  | ||||
| # let us log all errors before we exit | ||||
| rc=0 | ||||
|  | ||||
| @@ -86,7 +87,7 @@ unused=$(comm -23 \ | ||||
| if [[ -n "${unused}" ]]; then | ||||
|   echo "" | ||||
|   echo "Use the given commands to remove pinned module versions that aren't actually used:" | ||||
|   echo "${unused}" | xargs -L 1 echo 'GO111MODULE=on go mod edit -dropreplace' | ||||
|   echo "${unused}" | xargs -L 1 echo 'go mod edit -dropreplace' | ||||
| fi | ||||
|  | ||||
| if [[ -n "${unused}${outdated}${noncanonical}" ]]; then | ||||
|   | ||||
| @@ -64,7 +64,7 @@ function run_kube_apiserver() { | ||||
|   # Enable features | ||||
|   ENABLE_FEATURE_GATES="" | ||||
|  | ||||
|   "${KUBE_OUTPUT_HOSTBIN}/kube-apiserver" \ | ||||
|   "${THIS_PLATFORM_BIN}/kube-apiserver" \ | ||||
|     --bind-address="127.0.0.1" \ | ||||
|     --authorization-mode="${AUTHORIZATION_MODE}" \ | ||||
|     --secure-port="${SECURE_API_PORT}" \ | ||||
| @@ -119,7 +119,7 @@ current-context: local-context | ||||
| EOF | ||||
|  | ||||
|   kube::log::status "Starting controller-manager" | ||||
|   "${KUBE_OUTPUT_HOSTBIN}/kube-controller-manager" \ | ||||
|   "${THIS_PLATFORM_BIN}/kube-controller-manager" \ | ||||
|     --kube-api-content-type="${KUBE_TEST_API_TYPE-}" \ | ||||
|     --cluster-signing-cert-file=hack/testdata/ca/ca.crt \ | ||||
|     --cluster-signing-key-file=hack/testdata/ca/ca.key \ | ||||
|   | ||||
| @@ -46,11 +46,12 @@ KUBE_TEST_VMODULE=${KUBE_TEST_VMODULE:-""} | ||||
| kube::test::find_integration_test_dirs() { | ||||
|   ( | ||||
|     cd "${KUBE_ROOT}" | ||||
|     find test/integration/ -name '*_test.go' -print0 \ | ||||
|       | xargs -0n1 dirname | sed "s|^|${KUBE_GO_PACKAGE}/|" \ | ||||
|     # The "./" syntax here produces Go-compatible package names. | ||||
|     find ./test/integration/ -name '*_test.go' -print0 \ | ||||
|       | xargs -0n1 dirname \ | ||||
|       | LC_ALL=C sort -u | ||||
|     find vendor/k8s.io/apiextensions-apiserver/test/integration/ -name '*_test.go' -print0 \ | ||||
|       | xargs -0n1 dirname | sed "s|^|${KUBE_GO_PACKAGE}/|" \ | ||||
|     find ./staging/src/k8s.io/apiextensions-apiserver/test/integration/ -name '*_test.go' -print0 \ | ||||
|       | xargs -0n1 dirname \ | ||||
|       | LC_ALL=C sort -u | ||||
|   ) | ||||
| } | ||||
|   | ||||
| @@ -39,10 +39,8 @@ kube::test::find_dirs() { | ||||
|         \( \ | ||||
|           -path './_artifacts/*' \ | ||||
|           -o -path './_output/*' \ | ||||
|           -o -path './_gopath/*' \ | ||||
|           -o -path './cmd/kubeadm/test/*' \ | ||||
|           -o -path './contrib/podex/*' \ | ||||
|           -o -path './output/*' \ | ||||
|           -o -path './release/*' \ | ||||
|           -o -path './target/*' \ | ||||
|           -o -path './test/e2e/e2e_test.go' \ | ||||
| @@ -53,9 +51,9 @@ kube::test::find_dirs() { | ||||
|           -o -path './staging/*' \ | ||||
|           -o -path './vendor/*' \ | ||||
|         \) -prune \ | ||||
|       \) -name '*_test.go' -print0 | xargs -0n1 dirname | sed "s|^\./|${KUBE_GO_PACKAGE}/|" | LC_ALL=C sort -u | ||||
|       \) -name '*_test.go' -print0 | xargs -0n1 dirname | LC_ALL=C sort -u | ||||
|  | ||||
|     find ./staging -name '*_test.go' -not -path '*/test/integration/*' -prune -print0 | xargs -0n1 dirname | sed 's|^\./staging/src/|./vendor/|' | LC_ALL=C sort -u | ||||
|     find ./staging -name '*_test.go' -not -path '*/test/integration/*' -prune -print0 | xargs -0n1 dirname | LC_ALL=C sort -u | ||||
|   ) | ||||
| } | ||||
|  | ||||
| @@ -165,7 +163,7 @@ for arg; do | ||||
|   fi | ||||
| done | ||||
| if [[ ${#testcases[@]} -eq 0 ]]; then | ||||
|   while IFS='' read -r line; do testcases+=("$line"); done < <(kube::test::find_dirs) | ||||
|   kube::util::read-array testcases < <(kube::test::find_dirs) | ||||
| fi | ||||
| set -- "${testcases[@]+${testcases[@]}}" | ||||
|  | ||||
| @@ -182,46 +180,6 @@ junitFilenamePrefix() { | ||||
|   echo "${KUBE_JUNIT_REPORT_DIR}/junit_$(kube::util::sortable_date)" | ||||
| } | ||||
|  | ||||
| verifyAndSuggestPackagePath() { | ||||
|   local specified_package_path="$1" | ||||
|   local alternative_package_path="$2" | ||||
|   local original_package_path="$3" | ||||
|   local suggestion_package_path="$4" | ||||
|  | ||||
|   if [[ "${specified_package_path}" =~ '/...'$ ]]; then | ||||
|     specified_package_path=${specified_package_path::-4} | ||||
|   fi | ||||
|  | ||||
|   if ! [ -d "${specified_package_path}" ]; then | ||||
|     # Because k8s sets a localized $GOPATH for testing, seeing the actual | ||||
|     # directory can be confusing. Instead, just show $GOPATH if it exists in the | ||||
|     # $specified_package_path. | ||||
|     local printable_package_path | ||||
|     printable_package_path=${specified_package_path//${GOPATH}/\$\{GOPATH\}} | ||||
|     kube::log::error "specified test path '${printable_package_path}' does not exist" | ||||
|  | ||||
|     if [ -d "${alternative_package_path}" ]; then | ||||
|       kube::log::info "try changing \"${original_package_path}\" to \"${suggestion_package_path}\"" | ||||
|     fi | ||||
|     exit 1 | ||||
|   fi | ||||
| } | ||||
|  | ||||
| verifyPathsToPackagesUnderTest() { | ||||
|   local packages_under_test=("$@") | ||||
|  | ||||
|   for package_path in "${packages_under_test[@]}"; do | ||||
|     local local_package_path="${package_path}" | ||||
|     local go_package_path="${GOPATH}/src/${package_path}" | ||||
|  | ||||
|     if [[ "${package_path:0:2}" == "./" ]] ; then | ||||
|       verifyAndSuggestPackagePath "${local_package_path}" "${go_package_path}" "${package_path}" "${package_path:2}" | ||||
|     else | ||||
|       verifyAndSuggestPackagePath "${go_package_path}" "${local_package_path}" "${package_path}" "./${package_path}" | ||||
|     fi | ||||
|   done | ||||
| } | ||||
|  | ||||
| produceJUnitXMLReport() { | ||||
|   local -r junit_filename_prefix=$1 | ||||
|   if [[ -z "${junit_filename_prefix}" ]]; then | ||||
| @@ -234,7 +192,7 @@ produceJUnitXMLReport() { | ||||
|   if ! command -v gotestsum >/dev/null 2>&1; then | ||||
|     kube::log::status "gotestsum not found; installing from hack/tools" | ||||
|     pushd "${KUBE_ROOT}/hack/tools" >/dev/null | ||||
|       GO111MODULE=on go install gotest.tools/gotestsum | ||||
|       go install gotest.tools/gotestsum | ||||
|     popd >/dev/null | ||||
|   fi | ||||
|   gotestsum --junitfile "${junit_xml_filename}" --raw-command cat "${junit_filename_prefix}"*.stdout | ||||
| @@ -245,7 +203,7 @@ produceJUnitXMLReport() { | ||||
|   if ! command -v prune-junit-xml >/dev/null 2>&1; then | ||||
|     kube::log::status "prune-junit-xml not found; installing from hack/tools" | ||||
|     pushd "${KUBE_ROOT}/cmd/prune-junit-xml" >/dev/null | ||||
|       GO111MODULE=on go install . | ||||
|       go install . | ||||
|     popd >/dev/null | ||||
|   fi | ||||
|   prune-junit-xml "${junit_xml_filename}" | ||||
| @@ -257,14 +215,17 @@ runTests() { | ||||
|   local junit_filename_prefix | ||||
|   junit_filename_prefix=$(junitFilenamePrefix) | ||||
|  | ||||
|   verifyPathsToPackagesUnderTest "$@" | ||||
|   # Try to normalize input names. | ||||
|   local -a targets | ||||
|   kube::util::read-array targets < <(kube::golang::normalize_go_targets "$@") | ||||
|  | ||||
|   # If we're not collecting coverage, run all requested tests with one 'go test' | ||||
|   # command, which is much faster. | ||||
|   if [[ ! ${KUBE_COVER} =~ ^[yY]$ ]]; then | ||||
|     kube::log::status "Running tests without code coverage ${KUBE_RACE:+"and with ${KUBE_RACE}"}" | ||||
|     # shellcheck disable=SC2031 | ||||
|     go test "${goflags[@]:+${goflags[@]}}" \ | ||||
|      "${KUBE_TIMEOUT}" "${@}" \ | ||||
|      "${KUBE_TIMEOUT}" "${targets[@]}" \ | ||||
|      "${testargs[@]:+${testargs[@]}}" \ | ||||
|      | tee ${junit_filename_prefix:+"${junit_filename_prefix}.stdout"} \ | ||||
|      | grep --binary-files=text "${go_test_grep_pattern}" && rc=$? || rc=$? | ||||
| @@ -294,18 +255,7 @@ runTests() { | ||||
|   # we spawn a subshell for each PARALLEL process, redirecting the output to | ||||
|   # separate files. | ||||
|  | ||||
|   # ignore paths: | ||||
|   # vendor/k8s.io/code-generator/cmd/generator: is fragile when run under coverage, so ignore it for now. | ||||
|   #                            https://github.com/kubernetes/kubernetes/issues/24967 | ||||
|   # vendor/k8s.io/client-go/1.4/rest: causes cover internal errors | ||||
|   #                            https://github.com/golang/go/issues/16540 | ||||
|   cover_ignore_dirs="vendor/k8s.io/code-generator/cmd/generator|vendor/k8s.io/client-go/1.4/rest" | ||||
|   for path in ${cover_ignore_dirs//|/ }; do | ||||
|       echo -e "skipped\tk8s.io/kubernetes/${path}" | ||||
|   done | ||||
|  | ||||
|   printf "%s\n" "${@}" \ | ||||
|     | grep -Ev ${cover_ignore_dirs} \ | ||||
|     | xargs -I{} -n 1 -P "${KUBE_COVERPROCS}" \ | ||||
|     bash -c "set -o pipefail; _pkg=\"\$0\"; _pkg_out=\${_pkg//\//_}; \ | ||||
|       go test ${goflags[*]:+${goflags[*]}} \ | ||||
|   | ||||
| @@ -36,6 +36,7 @@ if ! ${ALL} ; then | ||||
| fi | ||||
|  | ||||
| BASH_TARGETS=( | ||||
| 	update-go-workspace | ||||
| 	update-codegen | ||||
| 	update-generated-api-compatibility-data | ||||
| 	update-generated-docs | ||||
|   | ||||
| @@ -25,19 +25,19 @@ set -o pipefail | ||||
| KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. | ||||
| source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
|  | ||||
| # Explicitly opt into go modules, even though we're inside a GOPATH directory | ||||
| export GO111MODULE=on | ||||
| # Explicitly set GOFLAGS to ignore vendor, since GOFLAGS=-mod=vendor breaks dependency resolution while rebuilding vendor | ||||
| export GOFLAGS=-mod=mod | ||||
| # Detect problematic GOPROXY settings that prevent lookup of dependencies | ||||
| if [[ "${GOPROXY:-}" == "off" ]]; then | ||||
|   kube::log::error "Cannot run with \$GOPROXY=off" | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| kube::golang::verify_go_version | ||||
| kube::golang::setup_env | ||||
| kube::util::require-jq | ||||
|  | ||||
| # Explicitly set GOFLAGS to ignore vendor, since GOFLAGS=-mod=vendor breaks dependency resolution while rebuilding vendor | ||||
| export GOWORK=off | ||||
| export GOFLAGS=-mod=mod | ||||
|  | ||||
| dep="${1:-}" | ||||
| sha="${2:-}" | ||||
|  | ||||
|   | ||||
							
								
								
									
										6
									
								
								hack/tools/go.work
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								hack/tools/go.work
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| // This is a hack, but it prevents go from climbing further and trying to | ||||
| // reconcile the various deps across the "real" modules and this one. | ||||
|  | ||||
| go 1.22.0 | ||||
|  | ||||
| use . | ||||
							
								
								
									
										197
									
								
								hack/tools/go.work.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								hack/tools/go.work.sum
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,197 @@ | ||||
| cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= | ||||
| cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= | ||||
| cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= | ||||
| cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= | ||||
| cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= | ||||
| cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= | ||||
| cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= | ||||
| cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= | ||||
| cloud.google.com/go/firestore v1.6.1 h1:8rBq3zRjnHx8UtBvaOWqBB1xq9jH6/wltfQLlTMh2Fw= | ||||
| cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= | ||||
| cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= | ||||
| cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= | ||||
| cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= | ||||
| cloud.google.com/go/storage v1.35.1 h1:B59ahL//eDfx2IIKFBeT5Atm9wnNmj3+8xG/W4WB//w= | ||||
| cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= | ||||
| dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= | ||||
| github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= | ||||
| github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= | ||||
| github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= | ||||
| github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= | ||||
| github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= | ||||
| github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= | ||||
| github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= | ||||
| github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= | ||||
| github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= | ||||
| github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU= | ||||
| github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= | ||||
| github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= | ||||
| github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= | ||||
| github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= | ||||
| github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= | ||||
| github.com/cristalhq/acmd v0.11.2 h1:ITIWtBRiYbmzk+i8xQgH2RzfCVMII+dOd0CtGWVIhaU= | ||||
| github.com/cristalhq/acmd v0.11.2/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= | ||||
| github.com/envoyproxy/go-control-plane v0.9.4 h1:rEvIZUSZ3fx39WIi3JkQqQBitGwpELBIYWeBVh6wn+E= | ||||
| github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= | ||||
| github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= | ||||
| github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= | ||||
| github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= | ||||
| github.com/go-kit/log v0.1.0 h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ= | ||||
| github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= | ||||
| github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= | ||||
| github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= | ||||
| github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= | ||||
| github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= | ||||
| github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= | ||||
| github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= | ||||
| github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= | ||||
| github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= | ||||
| github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= | ||||
| github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= | ||||
| github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= | ||||
| github.com/google/martian/v3 v3.0.0 h1:pMen7vLs8nvgEYhywH3KDWJIJTeEr2ULsVWHWYHQyBs= | ||||
| github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= | ||||
| github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= | ||||
| github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= | ||||
| github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | ||||
| github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= | ||||
| github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= | ||||
| github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= | ||||
| github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= | ||||
| github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720 h1:zC34cGQu69FG7qzJ3WiKW244WfhDC3xxYMeNOX2gtUQ= | ||||
| github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= | ||||
| github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= | ||||
| github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= | ||||
| github.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY= | ||||
| github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= | ||||
| github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= | ||||
| github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= | ||||
| github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= | ||||
| github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= | ||||
| github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= | ||||
| github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= | ||||
| github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= | ||||
| github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= | ||||
| github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= | ||||
| github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= | ||||
| github.com/hashicorp/serf v0.9.7 h1:hkdgbqizGQHuU5IPqYM1JdSMV8nKfpuOnZYXssk9muY= | ||||
| github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= | ||||
| github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 h1:UDMh68UUwekSh5iP2OMhRRZJiiBccgV7axzUG8vi56c= | ||||
| github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= | ||||
| github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= | ||||
| github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= | ||||
| github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= | ||||
| github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= | ||||
| github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= | ||||
| github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= | ||||
| github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= | ||||
| github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= | ||||
| github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= | ||||
| github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= | ||||
| github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= | ||||
| github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= | ||||
| github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= | ||||
| github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= | ||||
| github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= | ||||
| github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= | ||||
| github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= | ||||
| github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= | ||||
| github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | ||||
| github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= | ||||
| github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= | ||||
| github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= | ||||
| github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= | ||||
| github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0= | ||||
| github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= | ||||
| github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= | ||||
| github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= | ||||
| github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= | ||||
| github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= | ||||
| github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5 h1:0KqC6/sLy7fDpBdybhVkkv4Yz+PmB7c9Dz9z3dLW804= | ||||
| github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= | ||||
| github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= | ||||
| github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= | ||||
| github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= | ||||
| github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= | ||||
| github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= | ||||
| github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= | ||||
| github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= | ||||
| github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= | ||||
| github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= | ||||
| github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= | ||||
| github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= | ||||
| github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71 h1:CNooiryw5aisadVfzneSZPswRWvnVW8hF1bS/vo8ReI= | ||||
| github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= | ||||
| github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5 h1:CvqZS4QYHBRvx7AeFdimd16HCbLlYsvQMcKDACpJW/c= | ||||
| github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= | ||||
| github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96 h1:J8J/cgLDRuqXJnwIrRDBvtl+LLsdg7De74znW/BRRq4= | ||||
| github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= | ||||
| github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e h1:eTWZyPUnHcuGRDiryS/l2I7FfKjbU3IBx3IjqHPxuKU= | ||||
| github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= | ||||
| github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= | ||||
| github.com/sagikazarmark/crypt v0.6.0 h1:REOEXCs/NFY/1jOCEouMuT4zEniE5YoXbvpC5X/TLF8= | ||||
| github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= | ||||
| github.com/shirou/gopsutil/v3 v3.24.1 h1:R3t6ondCEvmARp3wxODhXMTLC/klMa87h2PHUw5m7QI= | ||||
| github.com/shirou/gopsutil/v3 v3.24.1/go.mod h1:UU7a2MSBQa+kW1uuDq8DeEBS8kmrnQwsv2b5O513rwU= | ||||
| github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= | ||||
| github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= | ||||
| github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= | ||||
| github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= | ||||
| github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= | ||||
| github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= | ||||
| github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= | ||||
| github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= | ||||
| github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= | ||||
| github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= | ||||
| github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTcjMJzCM= | ||||
| github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= | ||||
| github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= | ||||
| github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= | ||||
| github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= | ||||
| github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= | ||||
| github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= | ||||
| go.etcd.io/etcd/api/v3 v3.5.4 h1:OHVyt3TopwtUQ2GKdd5wu3PmmipR4FTwCqoEjSyRdIc= | ||||
| go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= | ||||
| go.etcd.io/etcd/client/pkg/v3 v3.5.4 h1:lrneYvz923dvC14R54XcA7FXoZ3mlGZAgmwhfm7HqOg= | ||||
| go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= | ||||
| go.etcd.io/etcd/client/v2 v2.305.4 h1:Dcx3/MYyfKcPNLpR4VVQUP5KgYrBeJtktBwEKkw08Ao= | ||||
| go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= | ||||
| go.etcd.io/etcd/client/v3 v3.5.4 h1:p83BUL3tAYS0OT/r0qglgc3M1JjhM0diV8DSWAhVXv4= | ||||
| go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= | ||||
| go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= | ||||
| go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= | ||||
| golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= | ||||
| golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= | ||||
| golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= | ||||
| golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= | ||||
| golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= | ||||
| golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= | ||||
| golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808 h1:+Kc94D8UVEVxJnLXp/+FMfqQARZtWHfVrcRtcG8aT3g= | ||||
| golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= | ||||
| golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= | ||||
| golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= | ||||
| golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= | ||||
| golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= | ||||
| google.golang.org/api v0.152.0 h1:t0r1vPnfMc260S2Ci+en7kfCZaLOPs5KI0sVV/6jZrY= | ||||
| google.golang.org/api v0.152.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= | ||||
| google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= | ||||
| google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | ||||
| google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= | ||||
| google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= | ||||
| google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= | ||||
| google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f h1:ultW7fxlIvee4HYrtnaRPon9HpEgFk5zYpmfMgtKB5I= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= | ||||
| google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= | ||||
| google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= | ||||
| gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= | ||||
| gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= | ||||
| k8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok= | ||||
| k8s.io/utils v0.0.0-20210802155522-efc7438f0176 h1:Mx0aa+SUAcNRQbs5jUzV8lkDlGFU8laZsY9jrcVX5SY= | ||||
| rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= | ||||
| rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= | ||||
| rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= | ||||
| @@ -35,7 +35,6 @@ UPDATE_API_KNOWN_VIOLATIONS="${UPDATE_API_KNOWN_VIOLATIONS:-}" | ||||
| API_KNOWN_VIOLATIONS_DIR="${API_KNOWN_VIOLATIONS_DIR:-"${KUBE_ROOT}/api/api-rules"}" | ||||
|  | ||||
| OUT_DIR="_output" | ||||
| PRJ_SRC_PATH="k8s.io/kubernetes" | ||||
| BOILERPLATE_FILENAME="hack/boilerplate/boilerplate.generatego.txt" | ||||
| APPLYCONFIG_PKG="k8s.io/client-go/applyconfigurations" | ||||
|  | ||||
| @@ -49,11 +48,20 @@ if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
|     kube::log::status "DBG: starting generated_files" | ||||
| fi | ||||
|  | ||||
| # Generate a list of directories we don't want to play in. | ||||
| DIRS_TO_AVOID=() | ||||
| kube::util::read-array DIRS_TO_AVOID < <( | ||||
|     git ls-files -cmo --exclude-standard -- ':!:vendor/*' ':(glob)*/**/go.work' \ | ||||
|         | while read -r F; do \ | ||||
|             echo ':!:'"$(dirname "${F}")"; \ | ||||
|         done | ||||
|     ) | ||||
|  | ||||
| function git_find() { | ||||
|     # Similar to find but faster and easier to understand.  We want to include | ||||
|     # modified and untracked files because this might be running against code | ||||
|     # which is not tracked by git yet. | ||||
|     git ls-files -cmo --exclude-standard ':!:vendor/*' "$@" | ||||
|     git ls-files -cmo --exclude-standard ':!:vendor/*' "${DIRS_TO_AVOID[@]}" "$@" | ||||
| } | ||||
|  | ||||
| function git_grep() { | ||||
| @@ -61,17 +69,11 @@ function git_grep() { | ||||
|     # running against code which is not tracked by git yet. | ||||
|     # We need vendor exclusion added at the end since it has to be part of | ||||
|     # the pathspecs which are specified last. | ||||
|     git grep --untracked "$@" ':!:vendor/*' | ||||
|     git grep --untracked "$@" ':!:vendor/*' "${DIRS_TO_AVOID[@]}" | ||||
| } | ||||
|  | ||||
| # Generate a list of all files that have a `+k8s:` comment-tag.  This will be | ||||
| # used to derive lists of files/dirs for generation tools. | ||||
| # | ||||
| # We want to include the "special" vendor directories which are actually part | ||||
| # of the Kubernetes source tree (staging/*) but we need them to be named as | ||||
| # their vendor/* equivalents.  We do not want all of vendor nor | ||||
| # hack/tools/vendor nor even all of vendor/k8s.io - just the subset that lives | ||||
| # in staging. | ||||
| if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
|     kube::log::status "DBG: finding all +k8s: tags" | ||||
| fi | ||||
| @@ -82,7 +84,6 @@ kube::util::read-array ALL_K8S_TAG_FILES < <( | ||||
|         -- \ | ||||
|         ':!:*/testdata/*'              `# not under any testdata` \ | ||||
|         ':(glob)**/*.go'               `# in any *.go file` \ | ||||
|         | sed 's|^staging/src|vendor|' `# see comments above` \ | ||||
|     ) | ||||
| if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
|     kube::log::status "DBG: found ${#ALL_K8S_TAG_FILES[@]} +k8s: tagged files" | ||||
| @@ -125,10 +126,10 @@ function codegen::protobuf() { | ||||
|         | xargs -0 rm -f | ||||
|  | ||||
|     if kube::protoc::check_protoc >/dev/null; then | ||||
|       hack/update-generated-protobuf-dockerized.sh "${apis[@]}" | ||||
|       hack/_update-generated-protobuf-dockerized.sh "${apis[@]}" | ||||
|     else | ||||
|       kube::log::status "protoc ${PROTOC_VERSION} not found (can install with hack/install-protoc.sh); generating containerized..." | ||||
|       build/run.sh hack/update-generated-protobuf-dockerized.sh "${apis[@]}" | ||||
|       build/run.sh hack/_update-generated-protobuf-dockerized.sh "${apis[@]}" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| @@ -144,15 +145,11 @@ function codegen::protobuf() { | ||||
| #               scheme | ||||
| function codegen::deepcopy() { | ||||
|     # Build the tool. | ||||
|     GO111MODULE=on GOPROXY=off go install \ | ||||
|     GOPROXY=off go install \ | ||||
|         k8s.io/code-generator/cmd/deepcopy-gen | ||||
|  | ||||
|     # The result file, in each pkg, of deep-copy generation. | ||||
|     local output_file="${GENERATED_FILE_PREFIX}deepcopy" | ||||
|  | ||||
|     # The tool used to generate deep copies. | ||||
|     local gen_deepcopy_bin | ||||
|     gen_deepcopy_bin="$(kube::util::find-binary "deepcopy-gen")" | ||||
|     local output_file="${GENERATED_FILE_PREFIX}deepcopy.go" | ||||
|  | ||||
|     # Find all the directories that request deep-copy generation. | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
| @@ -169,26 +166,25 @@ function codegen::deepcopy() { | ||||
|  | ||||
|     local tag_pkgs=() | ||||
|     for dir in "${tag_dirs[@]}"; do | ||||
|         tag_pkgs+=("${PRJ_SRC_PATH}/$dir") | ||||
|         tag_pkgs+=("./$dir") | ||||
|     done | ||||
|  | ||||
|     kube::log::status "Generating deepcopy code for ${#tag_pkgs[@]} targets" | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
|         kube::log::status "DBG: running ${gen_deepcopy_bin} for:" | ||||
|         kube::log::status "DBG: running deepcopy-gen for:" | ||||
|         for dir in "${tag_dirs[@]}"; do | ||||
|             kube::log::status "DBG:     $dir" | ||||
|         done | ||||
|     fi | ||||
|  | ||||
|     git_find -z ':(glob)**'/"${output_file}.go" | xargs -0 rm -f | ||||
|     git_find -z ':(glob)**'/"${output_file}" | xargs -0 rm -f | ||||
|  | ||||
|     ./hack/run-in-gopath.sh "${gen_deepcopy_bin}" \ | ||||
|         --v "${KUBE_VERBOSE}" \ | ||||
|         --logtostderr \ | ||||
|     deepcopy-gen \ | ||||
|         -v "${KUBE_VERBOSE}" \ | ||||
|         --go-header-file "${BOILERPLATE_FILENAME}" \ | ||||
|         --output-file-base "${output_file}" \ | ||||
|         --bounding-dirs "${PRJ_SRC_PATH},k8s.io/api" \ | ||||
|         $(printf -- " -i %s" "${tag_pkgs[@]}") \ | ||||
|         --output-file "${output_file}" \ | ||||
|         --bounding-dirs "k8s.io/kubernetes,k8s.io/api" \ | ||||
|         "${tag_pkgs[@]}" \ | ||||
|         "$@" | ||||
|  | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
| @@ -201,17 +197,13 @@ function codegen::deepcopy() { | ||||
| # $2: Path to the directory where types.go for that group version exists. This | ||||
| # is the directory where the file will be generated. | ||||
| function gen_types_swagger_doc() { | ||||
|     # The tool used to generate swagger code. | ||||
|     local swagger_bin | ||||
|     swagger_bin="$(kube::util::find-binary "genswaggertypedocs")" | ||||
|  | ||||
|     local group_version="$1" | ||||
|     local gv_dir="$2" | ||||
|     local tmpfile | ||||
|     tmpfile="${TMPDIR:-/tmp}/types_swagger_doc_generated.$(date +%s).go" | ||||
|  | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
|         kube::log::status "DBG: running ${swagger_bin} for ${group_version} at ${gv_dir}" | ||||
|         kube::log::status "DBG: running genswaggertypedocs for ${group_version} at ${gv_dir}" | ||||
|     fi | ||||
|  | ||||
|     { | ||||
| @@ -236,7 +228,7 @@ function gen_types_swagger_doc() { | ||||
| EOF | ||||
|     } > "${tmpfile}" | ||||
|  | ||||
|     "${swagger_bin}" \ | ||||
|     genswaggertypedocs \ | ||||
|         -s \ | ||||
|         "${gv_dir}/types.go" \ | ||||
|         -f - \ | ||||
| @@ -254,7 +246,7 @@ EOF | ||||
| # first in the case of regenerating everything. | ||||
| function codegen::swagger() { | ||||
|     # Build the tool | ||||
|     GO111MODULE=on GOPROXY=off go install \ | ||||
|     GOPROXY=off go install \ | ||||
|         ./cmd/genswaggertypedocs | ||||
|  | ||||
|     local group_versions=() | ||||
| @@ -277,15 +269,11 @@ function codegen::swagger() { | ||||
| #     // +k8s:prerelease-lifecycle-gen=true | ||||
| function codegen::prerelease() { | ||||
|     # Build the tool. | ||||
|     GO111MODULE=on GOPROXY=off go install \ | ||||
|     GOPROXY=off go install \ | ||||
|         k8s.io/code-generator/cmd/prerelease-lifecycle-gen | ||||
|  | ||||
|     # The result file, in each pkg, of prerelease-lifecycle generation. | ||||
|     local output_file="${GENERATED_FILE_PREFIX}prerelease-lifecycle" | ||||
|  | ||||
|     # The tool used to generate prerelease-lifecycle code. | ||||
|     local gen_prerelease_bin | ||||
|     gen_prerelease_bin="$(kube::util::find-binary "prerelease-lifecycle-gen")" | ||||
|     local output_file="${GENERATED_FILE_PREFIX}prerelease-lifecycle.go" | ||||
|  | ||||
|     # Find all the directories that request prerelease-lifecycle generation. | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
| @@ -302,25 +290,24 @@ function codegen::prerelease() { | ||||
|  | ||||
|     local tag_pkgs=() | ||||
|     for dir in "${tag_dirs[@]}"; do | ||||
|         tag_pkgs+=("${PRJ_SRC_PATH}/$dir") | ||||
|         tag_pkgs+=("./$dir") | ||||
|     done | ||||
|  | ||||
|     kube::log::status "Generating prerelease-lifecycle code for ${#tag_pkgs[@]} targets" | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
|         kube::log::status "DBG: running ${gen_prerelease_bin} for:" | ||||
|         kube::log::status "DBG: running prerelease-lifecycle-gen for:" | ||||
|         for dir in "${tag_dirs[@]}"; do | ||||
|             kube::log::status "DBG:     $dir" | ||||
|         done | ||||
|     fi | ||||
|  | ||||
|     git_find -z ':(glob)**'/"${output_file}.go" | xargs -0 rm -f | ||||
|     git_find -z ':(glob)**'/"${output_file}" | xargs -0 rm -f | ||||
|  | ||||
|     ./hack/run-in-gopath.sh "${gen_prerelease_bin}" \ | ||||
|         --v "${KUBE_VERBOSE}" \ | ||||
|         --logtostderr \ | ||||
|     prerelease-lifecycle-gen \ | ||||
|         -v "${KUBE_VERBOSE}" \ | ||||
|         --go-header-file "${BOILERPLATE_FILENAME}" \ | ||||
|         --output-file-base "${output_file}" \ | ||||
|         $(printf -- " -i %s" "${tag_pkgs[@]}") \ | ||||
|         --output-file "${output_file}" \ | ||||
|         "${tag_pkgs[@]}" \ | ||||
|         "$@" | ||||
|  | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
| @@ -346,15 +333,11 @@ function codegen::prerelease() { | ||||
| #                  for having a defaulter generated | ||||
| function codegen::defaults() { | ||||
|     # Build the tool. | ||||
|     GO111MODULE=on GOPROXY=off go install \ | ||||
|     GOPROXY=off go install \ | ||||
|         k8s.io/code-generator/cmd/defaulter-gen | ||||
|  | ||||
|     # The result file, in each pkg, of defaulter generation. | ||||
|     local output_file="${GENERATED_FILE_PREFIX}defaults" | ||||
|  | ||||
|     # The tool used to generate defaulters. | ||||
|     local gen_defaulter_bin | ||||
|     gen_defaulter_bin="$(kube::util::find-binary "defaulter-gen")" | ||||
|     local output_file="${GENERATED_FILE_PREFIX}defaults.go" | ||||
|  | ||||
|     # All directories that request any form of defaulter generation. | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
| @@ -371,26 +354,24 @@ function codegen::defaults() { | ||||
|  | ||||
|     local tag_pkgs=() | ||||
|     for dir in "${tag_dirs[@]}"; do | ||||
|         tag_pkgs+=("${PRJ_SRC_PATH}/$dir") | ||||
|         tag_pkgs+=("./$dir") | ||||
|     done | ||||
|  | ||||
|     kube::log::status "Generating defaulter code for ${#tag_pkgs[@]} targets" | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
|         kube::log::status "DBG: running ${gen_defaulter_bin} for:" | ||||
|         kube::log::status "DBG: running defaulter-gen for:" | ||||
|         for dir in "${tag_dirs[@]}"; do | ||||
|             kube::log::status "DBG:     $dir" | ||||
|         done | ||||
|     fi | ||||
|  | ||||
|     git_find -z ':(glob)**'/"${output_file}.go" | xargs -0 rm -f | ||||
|     git_find -z ':(glob)**'/"${output_file}" | xargs -0 rm -f | ||||
|  | ||||
|     ./hack/run-in-gopath.sh "${gen_defaulter_bin}" \ | ||||
|         --v "${KUBE_VERBOSE}" \ | ||||
|         --logtostderr \ | ||||
|     defaulter-gen \ | ||||
|         -v "${KUBE_VERBOSE}" \ | ||||
|         --go-header-file "${BOILERPLATE_FILENAME}" \ | ||||
|         --output-file-base "${output_file}" \ | ||||
|         $(printf -- " --extra-peer-dirs %s" "${tag_pkgs[@]}") \ | ||||
|         $(printf -- " -i %s" "${tag_pkgs[@]}") \ | ||||
|         --output-file "${output_file}" \ | ||||
|         "${tag_pkgs[@]}" \ | ||||
|         "$@" | ||||
|  | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
| @@ -421,15 +402,11 @@ function codegen::defaults() { | ||||
| # IDL. | ||||
| function codegen::conversions() { | ||||
|     # Build the tool. | ||||
|     GO111MODULE=on GOPROXY=off go install \ | ||||
|     GOPROXY=off go install \ | ||||
|         k8s.io/code-generator/cmd/conversion-gen | ||||
|  | ||||
|     # The result file, in each pkg, of conversion generation. | ||||
|     local output_file="${GENERATED_FILE_PREFIX}conversion" | ||||
|  | ||||
|     # The tool used to generate conversions. | ||||
|     local gen_conversion_bin | ||||
|     gen_conversion_bin="$(kube::util::find-binary "conversion-gen")" | ||||
|     local output_file="${GENERATED_FILE_PREFIX}conversion.go" | ||||
|  | ||||
|     # All directories that request any form of conversion generation. | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
| @@ -446,7 +423,7 @@ function codegen::conversions() { | ||||
|  | ||||
|     local tag_pkgs=() | ||||
|     for dir in "${tag_dirs[@]}"; do | ||||
|         tag_pkgs+=("${PRJ_SRC_PATH}/$dir") | ||||
|         tag_pkgs+=("./$dir") | ||||
|     done | ||||
|  | ||||
|     local extra_peer_pkgs=( | ||||
| @@ -457,22 +434,20 @@ function codegen::conversions() { | ||||
|  | ||||
|     kube::log::status "Generating conversion code for ${#tag_pkgs[@]} targets" | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
|         kube::log::status "DBG: running ${gen_conversion_bin} for:" | ||||
|         kube::log::status "DBG: running conversion-gen for:" | ||||
|         for dir in "${tag_dirs[@]}"; do | ||||
|             kube::log::status "DBG:     $dir" | ||||
|         done | ||||
|     fi | ||||
|  | ||||
|     git_find -z ':(glob)**'/"${output_file}.go" | xargs -0 rm -f | ||||
|     git_find -z ':(glob)**'/"${output_file}" | xargs -0 rm -f | ||||
|  | ||||
|     ./hack/run-in-gopath.sh "${gen_conversion_bin}" \ | ||||
|         --v "${KUBE_VERBOSE}" \ | ||||
|         --logtostderr \ | ||||
|     conversion-gen \ | ||||
|         -v "${KUBE_VERBOSE}" \ | ||||
|         --go-header-file "${BOILERPLATE_FILENAME}" \ | ||||
|         --output-file-base "${output_file}" \ | ||||
|         --output-file "${output_file}" \ | ||||
|         $(printf -- " --extra-peer-dirs %s" "${extra_peer_pkgs[@]}") \ | ||||
|         $(printf -- " --extra-dirs %s" "${tag_pkgs[@]}") \ | ||||
|         $(printf -- " -i %s" "${tag_pkgs[@]}") \ | ||||
|         "${tag_pkgs[@]}" \ | ||||
|         "$@" | ||||
|  | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
| @@ -505,17 +480,14 @@ function k8s_tag_files_except() { | ||||
| #     // +k8s:openapi-gen=true | ||||
| function codegen::openapi() { | ||||
|     # Build the tool. | ||||
|     GO111MODULE=on GOPROXY=off go install \ | ||||
|         k8s.io/code-generator/cmd/openapi-gen | ||||
|     GOPROXY=off go install \ | ||||
|         k8s.io/kube-openapi/cmd/openapi-gen | ||||
|  | ||||
|     # The result file, in each pkg, of open-api generation. | ||||
|     local output_file="${GENERATED_FILE_PREFIX}openapi" | ||||
|  | ||||
|     # The tool used to generate open apis. | ||||
|     local gen_openapi_bin | ||||
|     gen_openapi_bin="$(kube::util::find-binary "openapi-gen")" | ||||
|     local output_file="${GENERATED_FILE_PREFIX}openapi.go" | ||||
|  | ||||
|     local output_dir="pkg/generated/openapi" | ||||
|     local output_pkg="k8s.io/kubernetes/${output_dir}" | ||||
|     local known_violations_file="${API_KNOWN_VIOLATIONS_DIR}/violation_exceptions.list" | ||||
|  | ||||
|     local report_file="${OUT_DIR}/api_violations.report" | ||||
| @@ -532,8 +504,8 @@ function codegen::openapi() { | ||||
|     local tag_files=() | ||||
|     kube::util::read-array tag_files < <( | ||||
|         k8s_tag_files_except \ | ||||
|             vendor/k8s.io/code-generator \ | ||||
|             vendor/k8s.io/sample-apiserver | ||||
|             staging/src/k8s.io/code-generator \ | ||||
|             staging/src/k8s.io/sample-apiserver | ||||
|         ) | ||||
|  | ||||
|     local tag_dirs=() | ||||
| @@ -548,27 +520,27 @@ function codegen::openapi() { | ||||
|  | ||||
|     local tag_pkgs=() | ||||
|     for dir in "${tag_dirs[@]}"; do | ||||
|         tag_pkgs+=("${PRJ_SRC_PATH}/$dir") | ||||
|         tag_pkgs+=("./$dir") | ||||
|     done | ||||
|  | ||||
|     kube::log::status "Generating openapi code" | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
|         kube::log::status "DBG: running ${gen_openapi_bin} for:" | ||||
|         kube::log::status "DBG: running openapi-gen for:" | ||||
|         for dir in "${tag_dirs[@]}"; do | ||||
|             kube::log::status "DBG:     $dir" | ||||
|         done | ||||
|     fi | ||||
|  | ||||
|     git_find -z ':(glob)pkg/generated/**'/"${output_file}.go" | xargs -0 rm -f | ||||
|     git_find -z ':(glob)pkg/generated/**'/"${output_file}" | xargs -0 rm -f | ||||
|  | ||||
|     ./hack/run-in-gopath.sh "${gen_openapi_bin}" \ | ||||
|         --v "${KUBE_VERBOSE}" \ | ||||
|         --logtostderr \ | ||||
|     openapi-gen \ | ||||
|         -v "${KUBE_VERBOSE}" \ | ||||
|         --go-header-file "${BOILERPLATE_FILENAME}" \ | ||||
|         --output-file-base "${output_file}" \ | ||||
|         --output-package "${PRJ_SRC_PATH}/${output_dir}" \ | ||||
|         --output-file "${output_file}" \ | ||||
|         --output-dir "${output_dir}" \ | ||||
|         --output-pkg "${output_pkg}" \ | ||||
|         --report-filename "${report_file}" \ | ||||
|         $(printf -- " -i %s" "${tag_pkgs[@]}") \ | ||||
|         "${tag_pkgs[@]}" \ | ||||
|         "$@" | ||||
|  | ||||
|     touch "${report_file}" | ||||
| @@ -585,15 +557,10 @@ function codegen::openapi() { | ||||
| } | ||||
|  | ||||
| function codegen::applyconfigs() { | ||||
|     GO111MODULE=on GOPROXY=off go install \ | ||||
|     GOPROXY=off go install \ | ||||
|         k8s.io/kubernetes/pkg/generated/openapi/cmd/models-schema \ | ||||
|         k8s.io/code-generator/cmd/applyconfiguration-gen | ||||
|  | ||||
|     local modelsschema | ||||
|     modelsschema=$(kube::util::find-binary "models-schema") | ||||
|     local applyconfigurationgen | ||||
|     applyconfigurationgen=$(kube::util::find-binary "applyconfiguration-gen") | ||||
|  | ||||
|     local ext_apis=() | ||||
|     kube::util::read-array ext_apis < <( | ||||
|         cd "${KUBE_ROOT}/staging/src" | ||||
| @@ -604,7 +571,7 @@ function codegen::applyconfigs() { | ||||
|  | ||||
|     kube::log::status "Generating apply-config code for ${#ext_apis[@]} targets" | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
|         kube::log::status "DBG: running ${applyconfigurationgen} for:" | ||||
|         kube::log::status "DBG: running applyconfiguration-gen for:" | ||||
|         for api in "${ext_apis[@]}"; do | ||||
|             kube::log::status "DBG:     $api" | ||||
|         done | ||||
| @@ -617,12 +584,13 @@ function codegen::applyconfigs() { | ||||
|         || true) \ | ||||
|         | xargs -0 rm -f | ||||
|  | ||||
|     "${applyconfigurationgen}" \ | ||||
|         --openapi-schema <("${modelsschema}") \ | ||||
|     applyconfiguration-gen \ | ||||
|         -v "${KUBE_VERBOSE}" \ | ||||
|         --openapi-schema <(models-schema) \ | ||||
|         --go-header-file "${BOILERPLATE_FILENAME}" \ | ||||
|         --output-base "${KUBE_ROOT}/vendor" \ | ||||
|         --output-package "${APPLYCONFIG_PKG}" \ | ||||
|         $(printf -- " --input-dirs %s" "${ext_apis[@]}") \ | ||||
|         --output-dir "${KUBE_ROOT}/staging/src/${APPLYCONFIG_PKG}" \ | ||||
|         --output-pkg "${APPLYCONFIG_PKG}" \ | ||||
|         "${ext_apis[@]}" \ | ||||
|         "$@" | ||||
|  | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
| @@ -631,12 +599,9 @@ function codegen::applyconfigs() { | ||||
| } | ||||
|  | ||||
| function codegen::clients() { | ||||
|     GO111MODULE=on GOPROXY=off go install \ | ||||
|     GOPROXY=off go install \ | ||||
|         k8s.io/code-generator/cmd/client-gen | ||||
|  | ||||
|     local clientgen | ||||
|     clientgen=$(kube::util::find-binary "client-gen") | ||||
|  | ||||
|     IFS=" " read -r -a group_versions <<< "${KUBE_AVAILABLE_GROUP_VERSIONS}" | ||||
|     local gv_dirs=() | ||||
|     for gv in "${group_versions[@]}"; do | ||||
| @@ -644,7 +609,7 @@ function codegen::clients() { | ||||
|         local api_dir | ||||
|         api_dir=$(kube::util::group-version-to-pkg-path "${gv}") | ||||
|         local nopkg_dir=${api_dir#pkg/} | ||||
|         nopkg_dir=${nopkg_dir#vendor/k8s.io/api/} | ||||
|         nopkg_dir=${nopkg_dir#staging/src/k8s.io/api/} | ||||
|         local pkg_dir=${nopkg_dir#apis/} | ||||
|  | ||||
|         # skip groups that aren't being served, clients for these don't matter | ||||
| @@ -657,7 +622,7 @@ function codegen::clients() { | ||||
|  | ||||
|     kube::log::status "Generating client code for ${#gv_dirs[@]} targets" | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
|         kube::log::status "DBG: running ${clientgen} for:" | ||||
|         kube::log::status "DBG: running client-gen for:" | ||||
|         for dir in "${gv_dirs[@]}"; do | ||||
|             kube::log::status "DBG:     $dir" | ||||
|         done | ||||
| @@ -670,10 +635,11 @@ function codegen::clients() { | ||||
|         || true) \ | ||||
|         | xargs -0 rm -f | ||||
|  | ||||
|     "${clientgen}" \ | ||||
|     client-gen \ | ||||
|         -v "${KUBE_VERBOSE}" \ | ||||
|         --go-header-file "${BOILERPLATE_FILENAME}" \ | ||||
|         --output-base "${KUBE_ROOT}/vendor" \ | ||||
|         --output-package="k8s.io/client-go" \ | ||||
|         --output-dir "${KUBE_ROOT}/staging/src/k8s.io/client-go" \ | ||||
|         --output-pkg="k8s.io/client-go" \ | ||||
|         --clientset-name="kubernetes" \ | ||||
|         --input-base="k8s.io/api" \ | ||||
|         --apply-configuration-package "${APPLYCONFIG_PKG}" \ | ||||
| @@ -686,12 +652,9 @@ function codegen::clients() { | ||||
| } | ||||
|  | ||||
| function codegen::listers() { | ||||
|     GO111MODULE=on GOPROXY=off go install \ | ||||
|     GOPROXY=off go install \ | ||||
|         k8s.io/code-generator/cmd/lister-gen | ||||
|  | ||||
|     local listergen | ||||
|     listergen=$(kube::util::find-binary "lister-gen") | ||||
|  | ||||
|     local ext_apis=() | ||||
|     kube::util::read-array ext_apis < <( | ||||
|         cd "${KUBE_ROOT}/staging/src" | ||||
| @@ -701,7 +664,7 @@ function codegen::listers() { | ||||
|  | ||||
|     kube::log::status "Generating lister code for ${#ext_apis[@]} targets" | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
|         kube::log::status "DBG: running ${listergen} for:" | ||||
|         kube::log::status "DBG: running lister-gen for:" | ||||
|         for api in "${ext_apis[@]}"; do | ||||
|             kube::log::status "DBG:     $api" | ||||
|         done | ||||
| @@ -714,11 +677,12 @@ function codegen::listers() { | ||||
|         || true) \ | ||||
|         | xargs -0 rm -f | ||||
|  | ||||
|     "${listergen}" \ | ||||
|     lister-gen \ | ||||
|         -v "${KUBE_VERBOSE}" \ | ||||
|         --go-header-file "${BOILERPLATE_FILENAME}" \ | ||||
|         --output-base "${KUBE_ROOT}/vendor" \ | ||||
|         --output-package "k8s.io/client-go/listers" \ | ||||
|         $(printf -- " --input-dirs %s" "${ext_apis[@]}") \ | ||||
|         --output-dir "${KUBE_ROOT}/staging/src/k8s.io/client-go/listers" \ | ||||
|         --output-pkg "k8s.io/client-go/listers" \ | ||||
|         "${ext_apis[@]}" \ | ||||
|         "$@" | ||||
|  | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
| @@ -727,12 +691,9 @@ function codegen::listers() { | ||||
| } | ||||
|  | ||||
| function codegen::informers() { | ||||
|     GO111MODULE=on GOPROXY=off go install \ | ||||
|     GOPROXY=off go install \ | ||||
|         k8s.io/code-generator/cmd/informer-gen | ||||
|  | ||||
|     local informergen | ||||
|     informergen=$(kube::util::find-binary "informer-gen") | ||||
|  | ||||
|     local ext_apis=() | ||||
|     kube::util::read-array ext_apis < <( | ||||
|         cd "${KUBE_ROOT}/staging/src" | ||||
| @@ -742,7 +703,7 @@ function codegen::informers() { | ||||
|  | ||||
|     kube::log::status "Generating informer code for ${#ext_apis[@]} targets" | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
|         kube::log::status "DBG: running ${informergen} for:" | ||||
|         kube::log::status "DBG: running informer-gen for:" | ||||
|         for api in "${ext_apis[@]}"; do | ||||
|             kube::log::status "DBG:     $api" | ||||
|         done | ||||
| @@ -755,14 +716,15 @@ function codegen::informers() { | ||||
|         || true) \ | ||||
|         | xargs -0 rm -f | ||||
|  | ||||
|     "${informergen}" \ | ||||
|     informer-gen \ | ||||
|         -v "${KUBE_VERBOSE}" \ | ||||
|         --go-header-file "${BOILERPLATE_FILENAME}" \ | ||||
|         --output-base "${KUBE_ROOT}/vendor" \ | ||||
|         --output-package "k8s.io/client-go/informers" \ | ||||
|         --output-dir "${KUBE_ROOT}/staging/src/k8s.io/client-go/informers" \ | ||||
|         --output-pkg "k8s.io/client-go/informers" \ | ||||
|         --single-directory \ | ||||
|         --versioned-clientset-package k8s.io/client-go/kubernetes \ | ||||
|         --listers-package k8s.io/client-go/listers \ | ||||
|         $(printf -- " --input-dirs %s" "${ext_apis[@]}") \ | ||||
|         --versioned-clientset-package "k8s.io/client-go/kubernetes" \ | ||||
|         --listers-package "k8s.io/client-go/listers" \ | ||||
|         "${ext_apis[@]}" \ | ||||
|         "$@" | ||||
|  | ||||
|     if [[ "${DBG_CODEGEN}" == 1 ]]; then | ||||
| @@ -779,17 +741,17 @@ function indent() { | ||||
| function codegen::subprojects() { | ||||
|     # Call generation on sub-projects. | ||||
|     local subs=( | ||||
|         vendor/k8s.io/code-generator/examples | ||||
|         vendor/k8s.io/kube-aggregator | ||||
|         vendor/k8s.io/sample-apiserver | ||||
|         vendor/k8s.io/sample-controller | ||||
|         vendor/k8s.io/metrics | ||||
|         vendor/k8s.io/apiextensions-apiserver | ||||
|         vendor/k8s.io/apiextensions-apiserver/examples/client-go | ||||
|         staging/src/k8s.io/code-generator/examples | ||||
|         staging/src/k8s.io/kube-aggregator | ||||
|         staging/src/k8s.io/sample-apiserver | ||||
|         staging/src/k8s.io/sample-controller | ||||
|         staging/src/k8s.io/metrics | ||||
|         staging/src/k8s.io/apiextensions-apiserver | ||||
|         staging/src/k8s.io/apiextensions-apiserver/examples/client-go | ||||
|     ) | ||||
|  | ||||
|     local codegen | ||||
|     codegen="$(pwd)/vendor/k8s.io/code-generator" | ||||
|     codegen="${KUBE_ROOT}/staging/src/k8s.io/code-generator" | ||||
|     for sub in "${subs[@]}"; do | ||||
|         kube::log::status "Generating code for subproject ${sub}" | ||||
|         pushd "${sub}" >/dev/null | ||||
| @@ -834,13 +796,13 @@ function codegen::protobindings() { | ||||
|     done | ||||
|  | ||||
|     if kube::protoc::check_protoc >/dev/null; then | ||||
|       hack/update-generated-proto-bindings-dockerized.sh "${apis[@]}" | ||||
|       hack/_update-generated-proto-bindings-dockerized.sh "${apis[@]}" | ||||
|     else | ||||
|       kube::log::status "protoc ${PROTOC_VERSION} not found (can install with hack/install-protoc.sh); generating containerized..." | ||||
|       # NOTE: All output from this script needs to be copied back to the calling | ||||
|       # source tree.  This is managed in kube::build::copy_output in build/common.sh. | ||||
|       # If the output set is changed update that function. | ||||
|       build/run.sh hack/update-generated-proto-bindings-dockerized.sh "${apis[@]}" | ||||
|       build/run.sh hack/_update-generated-proto-bindings-dockerized.sh "${apis[@]}" | ||||
|     fi | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -23,9 +23,6 @@ source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
|  | ||||
| kube::golang::setup_env | ||||
|  | ||||
| # run in module mode to match test command in readme.md | ||||
| export GO111MODULE=on | ||||
|  | ||||
| # Nuke old files so we don't accidentally carry stuff forward. | ||||
| rm -f staging/src/k8s.io/api/testdata/HEAD/*.{yaml,json,pb} | ||||
| rm -f staging/src/k8s.io/apiextensions-apiserver/pkg/apis/testdata/HEAD/*.{yaml,json,pb} | ||||
|   | ||||
| @@ -26,21 +26,69 @@ KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. | ||||
| source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
|  | ||||
| kube::golang::setup_env | ||||
|  | ||||
| BINS=( | ||||
| 	cmd/gendocs | ||||
| 	cmd/genkubedocs | ||||
| 	cmd/genman | ||||
| 	cmd/genyaml | ||||
| ) | ||||
| make -C "${KUBE_ROOT}" WHAT="${BINS[*]}" | ||||
|  | ||||
| kube::util::ensure-temp-dir | ||||
|  | ||||
| kube::util::gen-docs "${KUBE_TEMP}" | ||||
| BINS=( | ||||
| 	./cmd/gendocs | ||||
| 	./cmd/genkubedocs | ||||
| 	./cmd/genman | ||||
| 	./cmd/genyaml | ||||
| ) | ||||
| GOPROXY=off go install "${BINS[@]}" | ||||
|  | ||||
| # remove all of the old docs | ||||
| kube::util::remove-gen-docs | ||||
| # Run all doc generators. | ||||
| # $1 is the directory to put those generated documents | ||||
| generate_docs() { | ||||
|   local dest="$1" | ||||
|  | ||||
|   mkdir -p "${dest}/docs/user-guide/kubectl/" | ||||
|   gendocs "${dest}/docs/user-guide/kubectl/" | ||||
|  | ||||
|   mkdir -p "${dest}/docs/admin/" | ||||
|   genkubedocs "${dest}/docs/admin/" "kube-apiserver" | ||||
|   genkubedocs "${dest}/docs/admin/" "kube-controller-manager" | ||||
|   genkubedocs "${dest}/docs/admin/" "kube-proxy" | ||||
|   genkubedocs "${dest}/docs/admin/" "kube-scheduler" | ||||
|   genkubedocs "${dest}/docs/admin/" "kubelet" | ||||
|   genkubedocs "${dest}/docs/admin/" "kubeadm" | ||||
|  | ||||
|   mkdir -p "${dest}/docs/man/man1/" | ||||
|   genman "${dest}/docs/man/man1/" "kube-apiserver" | ||||
|   genman "${dest}/docs/man/man1/" "kube-controller-manager" | ||||
|   genman "${dest}/docs/man/man1/" "kube-proxy" | ||||
|   genman "${dest}/docs/man/man1/" "kube-scheduler" | ||||
|   genman "${dest}/docs/man/man1/" "kubelet" | ||||
|   genman "${dest}/docs/man/man1/" "kubectl" | ||||
|   genman "${dest}/docs/man/man1/" "kubeadm" | ||||
|  | ||||
|   mkdir -p "${dest}/docs/yaml/kubectl/" | ||||
|   genyaml "${dest}/docs/yaml/kubectl/" | ||||
|  | ||||
|   # create the list of generated files | ||||
|   pushd "${dest}" > /dev/null || return 1 | ||||
|   touch docs/.generated_docs | ||||
|   find . -type f | cut -sd / -f 2- | LC_ALL=C sort > docs/.generated_docs | ||||
|   popd > /dev/null || return 1 | ||||
| } | ||||
|  | ||||
| # Removes previously generated docs-- we don't want to check them in. $KUBE_ROOT | ||||
| # must be set. | ||||
| remove_generated_docs() { | ||||
|   if [ -e "${KUBE_ROOT}/docs/.generated_docs" ]; then | ||||
|     # remove all of the old docs; we don't want to check them in. | ||||
|     while read -r file; do | ||||
|       rm "${KUBE_ROOT}/${file}" 2>/dev/null || true | ||||
|     done <"${KUBE_ROOT}/docs/.generated_docs" | ||||
|     # The docs/.generated_docs file lists itself, so we don't need to explicitly | ||||
|     # delete it. | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # generate into KUBE_TMP | ||||
| generate_docs "${KUBE_TEMP}" | ||||
|  | ||||
| # remove all of the existing docs in KUBE_ROOT | ||||
| remove_generated_docs | ||||
|  | ||||
| # Copy fresh docs into the repo. | ||||
| # the shopt is so that we get docs/.generated_docs from the glob. | ||||
|   | ||||
							
								
								
									
										44
									
								
								hack/update-go-workspace.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										44
									
								
								hack/update-go-workspace.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| # Copyright 2022 The Kubernetes Authors. | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # This script generates go.work so that it includes all Go packages | ||||
| # in this repo, with a few exceptions. | ||||
|  | ||||
| set -o errexit | ||||
| set -o nounset | ||||
| set -o pipefail | ||||
|  | ||||
| # Go tools really don't like it if you have a symlink in `pwd`. | ||||
| cd "$(pwd -P)" | ||||
|  | ||||
| KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. | ||||
| source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
|  | ||||
| # This sets up the environment, like GOCACHE, which keeps the worktree cleaner. | ||||
| kube::golang::setup_env | ||||
|  | ||||
| cd "${KUBE_ROOT}" | ||||
|  | ||||
| # Avoid issues and remove the workspace files. | ||||
| rm -f go.work go.work.sum | ||||
|  | ||||
| # Generate the workspace. | ||||
| go work init | ||||
| go work edit -use . | ||||
| git ls-files -z ':(glob)./staging/src/k8s.io/*/go.mod' \ | ||||
|     | xargs -0 -n1 dirname -z \ | ||||
|     | xargs -0 -n1 go work edit -use | ||||
| go mod download # generate go.work.sum | ||||
| @@ -23,7 +23,7 @@ set -o pipefail | ||||
| KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. | ||||
| source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
|  | ||||
| kube::golang::verify_go_version | ||||
| kube::golang::setup_env | ||||
|  | ||||
| cd "${KUBE_ROOT}" | ||||
|  | ||||
| @@ -36,6 +36,7 @@ function git_find() { | ||||
|         ':!:*/vendor/*'      `# catches any subdir/vendor/...` \ | ||||
|         ':!:third_party/*'   `# catches third_party/...` \ | ||||
|         ':!:*/third_party/*' `# catches third_party/...` \ | ||||
|         ':!:*/testdata/*'    `# catches any subdir/testdata/...` \ | ||||
|         ':(glob)**/*.go' \ | ||||
|         "$@" | ||||
| } | ||||
|   | ||||
| @@ -25,7 +25,7 @@ set -o pipefail | ||||
| KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. | ||||
| source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
|  | ||||
| kube::golang::verify_go_version | ||||
| kube::golang::setup_env | ||||
|  | ||||
| cd "${KUBE_ROOT}" | ||||
|  | ||||
|   | ||||
| @@ -29,16 +29,13 @@ MODULES=( | ||||
|     staging/src/k8s.io/kms/internal/plugins/_mock | ||||
| ) | ||||
|  | ||||
| # Explicitly opt into go modules, even though we're inside a GOPATH directory | ||||
| export GO111MODULE=on | ||||
|  | ||||
| # Detect problematic GOPROXY settings that prevent lookup of dependencies | ||||
| if [[ "${GOPROXY:-}" == "off" ]]; then | ||||
|   kube::log::error "Cannot run hack/update-internal-modules.sh with \$GOPROXY=off" | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| kube::golang::verify_go_version | ||||
| kube::golang::setup_env | ||||
|  | ||||
| for mod in "${MODULES[@]}"; do | ||||
|   pushd "${KUBE_ROOT}/${mod}" >/dev/null | ||||
|   | ||||
| @@ -18,8 +18,10 @@ set -o errexit | ||||
| set -o nounset | ||||
| set -o pipefail | ||||
|  | ||||
| source hack/lib/util.sh | ||||
| KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. | ||||
| source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
|  | ||||
| kube::golang::setup_env | ||||
| kube::util::require-jq | ||||
| kube::util::ensure_clean_working_dir | ||||
|  | ||||
| @@ -62,9 +64,11 @@ git add . | ||||
| git commit -a -m "Update kubectl kustomize to kyaml/$LATEST_KYAML, cmd/config/$LATEST_CONFIG, api/$LATEST_API, kustomize/$LATEST_KUSTOMIZE" | ||||
|  | ||||
| echo -e "\n${color_blue:?}Verifying kubectl kustomize version${color_norm:?}" | ||||
| make WHAT=cmd/kubectl | ||||
| # We use `make` here intead of `go install` to ensure that all of the | ||||
| # linker-defined values are set. | ||||
| make -C "${KUBE_ROOT}" WHAT=./cmd/kubectl | ||||
|  | ||||
| if [[ $(_output/bin/kubectl version --client -o json | jq -r '.kustomizeVersion') != "$LATEST_KUSTOMIZE" ]]; then | ||||
| if [[ $(kubectl version --client -o json | jq -r '.kustomizeVersion') != "$LATEST_KUSTOMIZE" ]]; then | ||||
|   echo -e "${color_red:?}Unexpected kubectl kustomize version${color_norm:?}" | ||||
|   exit 1 | ||||
| fi | ||||
|   | ||||
| @@ -23,10 +23,7 @@ set -o pipefail | ||||
|  | ||||
| KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. | ||||
| source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
| # Explicitly opt into go modules, even though we're inside a GOPATH directory | ||||
| export GO111MODULE=on | ||||
|  | ||||
| kube::golang::verify_go_version | ||||
| kube::golang::setup_env | ||||
|  | ||||
| echo 'installing mockgen' | ||||
| @@ -34,17 +31,15 @@ pushd "${KUBE_ROOT}/hack/tools" >/dev/null | ||||
|   go install github.com/golang/mock/mockgen | ||||
| popd >/dev/null | ||||
|  | ||||
| function git_find() { | ||||
|   # Similar to find but faster and easier to understand.  We want to include | ||||
|   # modified and untracked files because this might be running against code | ||||
|   # which is not tracked by git yet. | ||||
|   git ls-files -cmo --exclude-standard \ | ||||
| function git_grep() { | ||||
|   git grep --untracked --exclude-standard \ | ||||
|       "$@" \ | ||||
|       ':!:vendor/*'        `# catches vendor/...` \ | ||||
|       ':!:*/vendor/*'      `# catches any subdir/vendor/...` \ | ||||
|       ':!:third_party/*'   `# catches third_party/...` \ | ||||
|       ':!:*/third_party/*' `# catches third_party/...` \ | ||||
|       ':!:*/testdata/*' \ | ||||
|       "$@" | ||||
|       ':!:*/testdata/*'    `# catches any testdata` \ | ||||
|       ':(glob)**/*.go' | ||||
| } | ||||
|  | ||||
| cd "${KUBE_ROOT}" | ||||
| @@ -55,19 +50,12 @@ GENERATED_MOCK_FILE_REGEX="^// Code generated by MockGen. DO NOT EDIT.$" | ||||
| tmp=$(mktemp) | ||||
| kube::util::trap_add "rm -f ${tmp:?}" EXIT | ||||
|  | ||||
| # We use this pattern here rather than `git grep` because we don't really want | ||||
| # to encode the pathspec list in multiple places and anything more complicated | ||||
| # just isn't worth the effort. | ||||
| git_find -z ':(glob)**/*.go' \ | ||||
|     | { xargs -0 grep -l --null "${GENERATED_MOCK_FILE_REGEX}" || true; } \ | ||||
|     | xargs -0 rm -f | ||||
| git_grep -l -z "${GENERATED_MOCK_FILE_REGEX}" | xargs -0 rm -f | ||||
|  | ||||
| echo 'executing go generate command on below files' | ||||
|  | ||||
| git_find -z ':(glob)**/*.go' | while read -r -d $'\0' file; do | ||||
|   test -f "$file" || continue | ||||
|   grep -q "//go:generate mockgen" "$file" || continue | ||||
|  | ||||
| git_grep -l -z "//go:generate mockgen" | while read -r -d $'\0' file; do | ||||
|   echo "- ${file}" | ||||
|   temp_file_name="$(kube::realpath "$(mktemp -t "$(basename "$0").XXXXXX")")" | ||||
|  | ||||
|   # search for build tag used in file | ||||
| @@ -82,7 +70,9 @@ git_find -z ':(glob)**/*.go' | while read -r -d $'\0' file; do | ||||
|     BUILD_TAG_FILE=$temp_file_name go generate -v "$file" | ||||
|   else | ||||
|     # if no +build tag is defined in interface file | ||||
|     go generate -v "$file" | ||||
|     # NOTE: This works around a bug in `go generate` with workspaces, which | ||||
|     # should be fixed in Go 1.22.1. | ||||
|     go -C "$(dirname "$file")" generate "$(basename "$file")" | ||||
|   fi | ||||
| done | ||||
|  | ||||
|   | ||||
| @@ -28,15 +28,12 @@ KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. | ||||
| source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
| source "${KUBE_ROOT}/hack/lib/util.sh" | ||||
|  | ||||
| kube::golang::verify_go_version | ||||
| kube::golang::setup_env | ||||
|  | ||||
| # Ensure that we find the binaries we build before anything else. | ||||
| export GOBIN="${KUBE_OUTPUT_BINPATH}" | ||||
| export GOBIN="${KUBE_OUTPUT_BIN}" | ||||
| PATH="${GOBIN}:${PATH}" | ||||
|  | ||||
| # Explicitly opt into go modules, even though we're inside a GOPATH directory | ||||
| export GO111MODULE=on | ||||
|  | ||||
| # Install golangci-lint | ||||
| echo 'installing net parser converter' | ||||
| pushd "${KUBE_ROOT}/hack/tools" >/dev/null | ||||
| @@ -53,7 +50,8 @@ function git_find() { | ||||
|         ':!:vendor/*'        `# catches vendor/...` \ | ||||
|         ':!:*/vendor/*'      `# catches any subdir/vendor/...` \ | ||||
|         ':!:third_party/*'   `# catches third_party/...` \ | ||||
|         ':!:*/third_party/*' `# catches third_party/...` \ | ||||
|         ':!:*/third_party/*' `# catches any subdir/third_party/...` \ | ||||
|         ':!:*/testdata/*'    `# catches any subdir/testdata/...` \ | ||||
|         ':(glob)**/*.go' \ | ||||
|         "$@" | ||||
| } | ||||
|   | ||||
| @@ -30,6 +30,8 @@ kube::util::require-jq | ||||
| kube::golang::setup_env | ||||
| kube::etcd::install | ||||
|  | ||||
| # We need to call `make` here because that includes all of the compile and link | ||||
| # flags that we use for a production build, which we need for this script. | ||||
| make -C "${KUBE_ROOT}" WHAT=cmd/kube-apiserver | ||||
|  | ||||
| function cleanup() | ||||
| @@ -70,7 +72,7 @@ fi | ||||
| # Start kube-apiserver | ||||
| # omit enums from static openapi snapshots used to generate clients until #109177 is resolved | ||||
| kube::log::status "Starting kube-apiserver" | ||||
| "${KUBE_OUTPUT_HOSTBIN}/kube-apiserver" \ | ||||
| kube-apiserver \ | ||||
|   --bind-address="${API_HOST}" \ | ||||
|   --secure-port="${API_PORT}" \ | ||||
|   --etcd-servers="http://${ETCD_HOST}:${ETCD_PORT}" \ | ||||
|   | ||||
| @@ -27,7 +27,7 @@ source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
| kube::golang::verify_go_version | ||||
|  | ||||
| pushd "${KUBE_ROOT}/hack/tools" >/dev/null | ||||
|     GO111MODULE=on go install github.com/jcchavezs/porto/cmd/porto | ||||
|     go install github.com/jcchavezs/porto/cmd/porto | ||||
| popd >/dev/null | ||||
|  | ||||
| porto --restrict-to-dirs="staging" --restrict-to-files="doc\\.go$" -w "${KUBE_ROOT}" | ||||
|   | ||||
| @@ -135,7 +135,8 @@ process_content () { | ||||
| ############################################################################# | ||||
|  | ||||
| # use modules, and use module info rather than the vendor dir for computing dependencies | ||||
| export GO111MODULE=on | ||||
| kube::golang::setup_env | ||||
| export GOWORK=off | ||||
| export GOFLAGS=-mod=mod | ||||
|  | ||||
| # Check bash version | ||||
|   | ||||
| @@ -24,9 +24,12 @@ cd "$(pwd -P)" | ||||
| KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. | ||||
| source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
|  | ||||
| # Get all the default Go environment. | ||||
| kube::golang::setup_env | ||||
|  | ||||
| # Turn off workspaces until we are ready for them later | ||||
| export GOWORK=off | ||||
| # Explicitly opt into go modules, even though we're inside a GOPATH directory | ||||
| # Explicitly opt into go modules | ||||
| export GO111MODULE=on | ||||
| # Explicitly set GOFLAGS to ignore vendor, since GOFLAGS=-mod=vendor breaks dependency resolution while rebuilding vendor | ||||
| export GOFLAGS=-mod=mod | ||||
| @@ -39,7 +42,6 @@ if [[ "${GOPROXY:-}" == "off" ]]; then | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| kube::golang::verify_go_version | ||||
| kube::util::require-jq | ||||
|  | ||||
| TMP_DIR="${TMP_DIR:-$(mktemp -d /tmp/update-vendor.XXXX)}" | ||||
| @@ -53,6 +55,7 @@ exec 22>&2            # Real stderr, use this explicitly | ||||
| exec 1>"${LOG_FILE}"  # Automatic stdout | ||||
| exec 2>&1             # Automatic stderr | ||||
| set -x                # Trace this script to stderr | ||||
| go env                # For the log | ||||
|  | ||||
| function finish { | ||||
|   ret=$? | ||||
| @@ -403,15 +406,12 @@ hack/update-internal-modules.sh | ||||
|  | ||||
|  | ||||
| # Phase 8: rebuild vendor directory | ||||
| kube::log::status "vendor: running 'go mod vendor'" >&11 | ||||
| go mod vendor | ||||
|  | ||||
| # create a symlink in vendor directory pointing to the staging components. | ||||
| # This lets other packages and tools use the local staging components as if they were vendored. | ||||
| for repo in $(kube::util::list_staging_repos); do | ||||
|   rm -fr "${KUBE_ROOT}/vendor/k8s.io/${repo}" | ||||
|   ln -s "../../staging/src/k8s.io/${repo}" "${KUBE_ROOT}/vendor/k8s.io/${repo}" | ||||
| done | ||||
| ( | ||||
|   kube::log::status "vendor: running 'go work vendor'" >&11 | ||||
|   unset GOWORK | ||||
|   unset GOFLAGS | ||||
|   go work vendor | ||||
| ) | ||||
|  | ||||
| kube::log::status "vendor: updating vendor/LICENSES" >&11 | ||||
| hack/update-vendor-licenses.sh | ||||
|   | ||||
| @@ -28,10 +28,8 @@ cd "${KUBE_ROOT}" | ||||
| find_files() { | ||||
|   find . -not \( \ | ||||
|       \( \ | ||||
|         -wholename './output' \ | ||||
|         -o -wholename './.git' \ | ||||
|         -wholename './.git' \ | ||||
|         -o -wholename './_output' \ | ||||
|         -o -wholename './_gopath' \ | ||||
|         -o -wholename './release' \ | ||||
|         -o -wholename './target' \ | ||||
|         -o -wholename '*/vendor/*' \ | ||||
| @@ -39,5 +37,4 @@ find_files() { | ||||
|     \) -name 'OWNERS*' | ||||
| } | ||||
|  | ||||
| export GO111MODULE=on | ||||
| find_files | xargs go run cmd/yamlfmt/yamlfmt.go | ||||
|   | ||||
| @@ -69,7 +69,7 @@ groups_without_codegen=( | ||||
| 	"imagepolicy" | ||||
| 	"admission" | ||||
| ) | ||||
| client_gen_file="${KUBE_ROOT}/vendor/k8s.io/code-generator/cmd/client-gen/main.go" | ||||
| client_gen_file="${KUBE_ROOT}/staging/src/k8s.io/code-generator/cmd/client-gen/main.go" | ||||
|  | ||||
| for group_dirname in "${group_dirnames[@]}"; do | ||||
| 	if ! grep -q "${group_dirname}/" "${client_gen_file}" ; then | ||||
|   | ||||
| @@ -27,14 +27,9 @@ source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
|  | ||||
| kube::golang::setup_env | ||||
|  | ||||
| BINS=( | ||||
| 	cmd/clicheck | ||||
| ) | ||||
| make -C "${KUBE_ROOT}" WHAT="${BINS[*]}" | ||||
| GOPROXY=off go install ./cmd/clicheck | ||||
|  | ||||
| clicheck=$(kube::util::find-binary "clicheck") | ||||
|  | ||||
| if ! output=$($clicheck 2>&1) | ||||
| if ! output=$(clicheck 2>&1) | ||||
| then | ||||
| 	echo "$output" | ||||
| 	echo | ||||
|   | ||||
| @@ -26,13 +26,13 @@ KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. | ||||
| source "${KUBE_ROOT}/hack/lib/init.sh" | ||||
| source "${KUBE_ROOT}/hack/lib/util.sh" | ||||
|  | ||||
| kube::golang::verify_go_version | ||||
| kube::golang::setup_env | ||||
|  | ||||
| cd "${KUBE_ROOT}" | ||||
|  | ||||
| errors=() | ||||
| # Check conformance tests follow the requirements as https://git.k8s.io/community/contributors/devel/sig-architecture/conformance-tests.md#conformance-test-requirements | ||||
| if ! failedLint=$(GO111MODULE=on GOPROXY=off go run hack/conformance/check_conformance_test_requirements.go "${KUBE_ROOT}"/test/e2e/) | ||||
| if ! failedLint=$(GOPROXY=off go run hack/conformance/check_conformance_test_requirements.go "${KUBE_ROOT}"/test/e2e/) | ||||
| then | ||||
|   errors+=( "${failedLint}" ) | ||||
| fi | ||||
|   | ||||
| @@ -28,19 +28,13 @@ source "${KUBE_ROOT}/hack/lib/util.sh" | ||||
|  | ||||
| kube::golang::setup_env | ||||
|  | ||||
| make -C "${KUBE_ROOT}" WHAT=cmd/genswaggertypedocs | ||||
|  | ||||
| # Find binary | ||||
| genswaggertypedocs=$(kube::util::find-binary "genswaggertypedocs") | ||||
|  | ||||
| result=0 | ||||
| GOPROXY=off go install ./cmd/genswaggertypedocs | ||||
|  | ||||
| find_files() { | ||||
|   find . -not \( \ | ||||
|       \( \ | ||||
|         -wholename './output' \ | ||||
|         -wholename '.git' \ | ||||
|         -o -wholename './_output' \ | ||||
|         -o -wholename './_gopath' \ | ||||
|         -o -wholename './release' \ | ||||
|         -o -wholename './target' \ | ||||
|         -o -wholename '*/third_party/*' \ | ||||
| @@ -70,10 +64,11 @@ kube::util::check-file-in-alphabetical-order "${failure_file}" | ||||
| failing_files=() | ||||
| while IFS='' read -r line; do failing_files+=("$line"); done < <(cat "$failure_file") | ||||
|  | ||||
| result=0 | ||||
| for file in $versioned_api_files; do | ||||
|   if ! kube::util::array_contains "$file" "${failing_files[@]}"; then | ||||
|     gen_swagger_result=0 | ||||
|     $genswaggertypedocs -v -s "${file}" -f - || gen_swagger_result=$? | ||||
|     genswaggertypedocs -v -s "${file}" -f - || gen_swagger_result=$? | ||||
|     if [[ "${gen_swagger_result}" -ne 0 ]]; then | ||||
|       echo "API file: ${file} is missing: ${gen_swagger_result} descriptions" | ||||
|       result=1 | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 Kubernetes Prow Robot
					Kubernetes Prow Robot