diff --git a/cmd/importverifier/importverifier.go b/cmd/importverifier/importverifier.go index 5503c41a9be..17de6a69c99 100644 --- a/cmd/importverifier/importverifier.go +++ b/cmd/importverifier/importverifier.go @@ -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 ", 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 diff --git a/hack/verify-imports.sh b/hack/verify-imports.sh index 8941c370640..50269f94068 100755 --- a/hack/verify-imports.sh +++ b/hack/verify-imports.sh @@ -26,7 +26,7 @@ set -o pipefail KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. source "${KUBE_ROOT}/hack/lib/init.sh" -kube::golang::old::setup_env +kube::golang::new::setup_env make -C "${KUBE_ROOT}" WHAT=cmd/importverifier diff --git a/staging/publishing/import-restrictions.yaml b/staging/publishing/import-restrictions.yaml index 0c1c12cd810..a846e5229f5 100644 --- a/staging/publishing/import-restrictions.yaml +++ b/staging/publishing/import-restrictions.yaml @@ -1,4 +1,4 @@ -- baseImportPath: "./pkg/apis/core/" +- baseImportPath: "./pkg/apis/core" allowedImports: - k8s.io/apimachinery - k8s.io/apiserver/pkg/util/feature @@ -21,7 +21,7 @@ ignoredSubTrees: - "./pkg/apis/core/validation" -- baseImportPath: "./vendor/k8s.io/cli-runtime/pkg/genericclioptions/" +- baseImportPath: "./staging/src/k8s.io/cli-runtime/pkg/genericclioptions" allowedImports: - k8s.io/apimachinery - k8s.io/client-go @@ -33,7 +33,7 @@ - k8s.io/cli-runtime/pkg/kustomize - k8s.io/utils/pointer -- baseImportPath: "./vendor/k8s.io/apimachinery/" +- baseImportPath: "./staging/src/k8s.io/apimachinery" allowedImports: - k8s.io/apimachinery - k8s.io/kube-openapi @@ -42,22 +42,22 @@ - k8s.io/utils/strings - k8s.io/klog -- baseImportPath: "./vendor/k8s.io/api/" +- baseImportPath: "./staging/src/k8s.io/api" allowedImports: - k8s.io/api - k8s.io/apimachinery - k8s.io/klog -- baseImportPath: "./vendor/k8s.io/code-generator/" +- baseImportPath: "./staging/src/k8s.io/code-generator" ignoredSubTrees: - - "./vendor/k8s.io/code-generator/examples" + - "./staging/src/k8s.io/code-generator/examples" allowedImports: - k8s.io/gengo - k8s.io/code-generator - k8s.io/kube-openapi - k8s.io/klog -- baseImportPath: "./vendor/k8s.io/component-base/" +- baseImportPath: "./staging/src/k8s.io/component-base" allowedImports: - k8s.io/apimachinery - k8s.io/component-base @@ -66,7 +66,7 @@ - k8s.io/klog - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/client-go/" +- baseImportPath: "./staging/src/k8s.io/client-go" allowedImports: - k8s.io/api - k8s.io/apimachinery @@ -77,30 +77,30 @@ # prevent core machinery from taking explicit v1 references unless # necessary -- baseImportPath: "./vendor/k8s.io/client-go/rest/" +- baseImportPath: "./staging/src/k8s.io/client-go/rest" excludeTests: true allowedImports: - k8s.io/apimachinery - k8s.io/client-go - k8s.io/klog - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/client-go/tools/" +- baseImportPath: "./staging/src/k8s.io/client-go/tools" excludeTests: true ignoredSubTrees: - - "./vendor/k8s.io/client-go/tools/cache/testing" - - "./vendor/k8s.io/client-go/tools/leaderelection/resourcelock" - - "./vendor/k8s.io/client-go/tools/portforward" - - "./vendor/k8s.io/client-go/tools/record" - - "./vendor/k8s.io/client-go/tools/events" - - "./vendor/k8s.io/client-go/tools/reference" - - "./vendor/k8s.io/client-go/tools/remotecommand" + - "./staging/src/k8s.io/client-go/tools/cache/testing" + - "./staging/src/k8s.io/client-go/tools/leaderelection/resourcelock" + - "./staging/src/k8s.io/client-go/tools/portforward" + - "./staging/src/k8s.io/client-go/tools/record" + - "./staging/src/k8s.io/client-go/tools/events" + - "./staging/src/k8s.io/client-go/tools/reference" + - "./staging/src/k8s.io/client-go/tools/remotecommand" allowedImports: - k8s.io/apimachinery - k8s.io/client-go - k8s.io/klog - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/apiserver/" +- baseImportPath: "./staging/src/k8s.io/apiserver" allowedImports: - k8s.io/api - k8s.io/apimachinery @@ -112,7 +112,7 @@ - k8s.io/klog - k8s.io/kms -- baseImportPath: "./vendor/k8s.io/metrics/" +- baseImportPath: "./staging/src/k8s.io/metrics" allowedImports: - k8s.io/api - k8s.io/apimachinery @@ -121,7 +121,7 @@ - k8s.io/metrics - k8s.io/klog -- baseImportPath: "./vendor/k8s.io/kube-aggregator/" +- baseImportPath: "./staging/src/k8s.io/kube-aggregator" allowedImports: - k8s.io/api - k8s.io/apimachinery @@ -134,7 +134,7 @@ - k8s.io/klog - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/kubectl/" +- baseImportPath: "./staging/src/k8s.io/kubectl" allowedImports: - k8s.io/api - k8s.io/apimachinery @@ -148,7 +148,7 @@ - k8s.io/utils - k8s.io/klog -- baseImportPath: "./vendor/k8s.io/sample-apiserver/" +- baseImportPath: "./staging/src/k8s.io/sample-apiserver" allowedImports: - k8s.io/api - k8s.io/apimachinery @@ -161,7 +161,7 @@ - k8s.io/utils/net - k8s.io/klog -- baseImportPath: "./vendor/k8s.io/apiextensions-apiserver/" +- baseImportPath: "./staging/src/k8s.io/apiextensions-apiserver" allowedImports: - k8s.io/api - k8s.io/apiextensions-apiserver @@ -174,21 +174,21 @@ - k8s.io/kube-openapi - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/kube-openapi/" +- baseImportPath: "./vendor/k8s.io/kube-openapi" allowedImports: - k8s.io/kube-openapi - k8s.io/gengo - k8s.io/klog - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/sample-cli-plugin/" +- baseImportPath: "./staging/src/k8s.io/sample-cli-plugin" allowedImports: - k8s.io/api - k8s.io/cli-runtime - k8s.io/client-go - k8s.io/sample-cli-plugin -- baseImportPath: "./vendor/k8s.io/kube-controller-manager/" +- baseImportPath: "./staging/src/k8s.io/kube-controller-manager" allowedImports: - k8s.io/apimachinery - k8s.io/cloud-provider @@ -197,14 +197,14 @@ - k8s.io/klog - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/kube-proxy/" +- baseImportPath: "./staging/src/k8s.io/kube-proxy" allowedImports: - k8s.io/apimachinery - k8s.io/component-base - k8s.io/klog - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/kube-scheduler/" +- baseImportPath: "./staging/src/k8s.io/kube-scheduler" allowedImports: - k8s.io/api - k8s.io/apimachinery @@ -213,7 +213,7 @@ - k8s.io/kube-scheduler - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/kubelet/" +- baseImportPath: "./staging/src/k8s.io/kubelet" allowedImports: - k8s.io/api - k8s.io/apimachinery @@ -225,14 +225,14 @@ - k8s.io/kubelet - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/cluster-bootstrap/" +- baseImportPath: "./staging/src/k8s.io/cluster-bootstrap" allowedImports: - k8s.io/api - k8s.io/apimachinery - k8s.io/cluster-bootstrap - k8s.io/klog -- baseImportPath: "./vendor/k8s.io/cloud-provider/" +- baseImportPath: "./staging/src/k8s.io/cloud-provider" allowedImports: - k8s.io/api - k8s.io/apimachinery @@ -245,7 +245,7 @@ - k8s.io/klog - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/dynamic-resource-allocation/" +- baseImportPath: "./staging/src/k8s.io/dynamic-resource-allocation" allowedImports: - k8s.io/api - k8s.io/apimachinery @@ -255,7 +255,7 @@ - k8s.io/kubelet - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/legacy-cloud-providers/" +- baseImportPath: "./staging/src/k8s.io/legacy-cloud-providers" allowedImports: - k8s.io/api - k8s.io/apimachinery @@ -271,14 +271,14 @@ - k8s.io/component-base/metrics - k8s.io/component-base/metrics/legacyregistry -- baseImportPath: "./vendor/k8s.io/csi-translation-lib/" +- baseImportPath: "./staging/src/k8s.io/csi-translation-lib" allowedImports: - k8s.io/api - k8s.io/apimachinery - k8s.io/klog - k8s.io/csi-translation-lib -- baseImportPath: "./vendor/k8s.io/component-helpers/" +- baseImportPath: "./staging/src/k8s.io/component-helpers" allowedImports: - k8s.io/api - k8s.io/apimachinery @@ -287,7 +287,7 @@ - k8s.io/klog - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/pod-security-admission/" +- baseImportPath: "./staging/src/k8s.io/pod-security-admission" allowedImports: - k8s.io/api - k8s.io/apimachinery @@ -299,11 +299,11 @@ - k8s.io/pod-security-admission - k8s.io/utils -- baseImportPath: "./vendor/k8s.io/kms/" +- baseImportPath: "./staging/src/k8s.io/kms" allowedImports: - k8s.io/kms -- baseImportPath: "./vendor/k8s.io/endpointslice/" +- baseImportPath: "./staging/src/k8s.io/endpointslice" allowedImports: - k8s.io/api - k8s.io/apimachinery