mirror of
https://github.com/TECHNOFAB11/zfs-localpv.git
synced 2025-12-13 06:50:10 +01:00
refact(deps): bump k8s and client-go deps to version v0.20.2 (#294)
Signed-off-by: prateekpandey14 <prateek.pandey@mayadata.io>
This commit is contained in:
parent
533e17a9aa
commit
b1aa6ab51a
2196 changed files with 306727 additions and 251810 deletions
2
vendor/k8s.io/gengo/examples/deepcopy-gen/generators/deepcopy.go
generated
vendored
2
vendor/k8s.io/gengo/examples/deepcopy-gen/generators/deepcopy.go
generated
vendored
|
|
@ -29,7 +29,7 @@ import (
|
|||
"k8s.io/gengo/namer"
|
||||
"k8s.io/gengo/types"
|
||||
|
||||
"k8s.io/klog"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
|
||||
// CustomArgs is used tby the go2idl framework to pass args specific to this
|
||||
|
|
|
|||
279
vendor/k8s.io/gengo/examples/defaulter-gen/generators/defaulter.go
generated
vendored
279
vendor/k8s.io/gengo/examples/defaulter-gen/generators/defaulter.go
generated
vendored
|
|
@ -18,6 +18,7 @@ package generators
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"path/filepath"
|
||||
|
|
@ -29,7 +30,7 @@ import (
|
|||
"k8s.io/gengo/namer"
|
||||
"k8s.io/gengo/types"
|
||||
|
||||
"k8s.io/klog"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
|
||||
// CustomArgs is used tby the go2idl framework to pass args specific to this
|
||||
|
|
@ -38,16 +39,45 @@ type CustomArgs struct {
|
|||
ExtraPeerDirs []string // Always consider these as last-ditch possibilities for conversions.
|
||||
}
|
||||
|
||||
var typeZeroValue = map[string]interface{}{
|
||||
"uint": 0.,
|
||||
"uint8": 0.,
|
||||
"uint16": 0.,
|
||||
"uint32": 0.,
|
||||
"uint64": 0.,
|
||||
"int": 0.,
|
||||
"int8": 0.,
|
||||
"int16": 0.,
|
||||
"int32": 0.,
|
||||
"int64": 0.,
|
||||
"byte": 0,
|
||||
"float64": 0.,
|
||||
"float32": 0.,
|
||||
"bool": false,
|
||||
"time.Time": "",
|
||||
"string": "",
|
||||
"integer": 0.,
|
||||
"number": 0.,
|
||||
"boolean": false,
|
||||
"[]byte": "", // base64 encoded characters
|
||||
"interface{}": interface{}(nil),
|
||||
}
|
||||
|
||||
// These are the comment tags that carry parameters for defaulter generation.
|
||||
const tagName = "k8s:defaulter-gen"
|
||||
const intputTagName = "k8s:defaulter-gen-input"
|
||||
const inputTagName = "k8s:defaulter-gen-input"
|
||||
const defaultTagName = "default"
|
||||
|
||||
func extractDefaultTag(comments []string) []string {
|
||||
return types.ExtractCommentTags("+", comments)[defaultTagName]
|
||||
}
|
||||
|
||||
func extractTag(comments []string) []string {
|
||||
return types.ExtractCommentTags("+", comments)[tagName]
|
||||
}
|
||||
|
||||
func extractInputTag(comments []string) []string {
|
||||
return types.ExtractCommentTags("+", comments)[intputTagName]
|
||||
return types.ExtractCommentTags("+", comments)[inputTagName]
|
||||
}
|
||||
|
||||
func checkTag(comments []string, require ...string) bool {
|
||||
|
|
@ -248,7 +278,11 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
|
|||
shouldCreateObjectDefaulterFn := func(t *types.Type) bool {
|
||||
if defaults, ok := existingDefaulters[t]; ok && defaults.object != nil {
|
||||
// A default generator is defined
|
||||
klog.V(5).Infof(" an object defaulter already exists as %s", defaults.base.Name)
|
||||
baseTypeName := "<unknown>"
|
||||
if defaults.base != nil {
|
||||
baseTypeName = defaults.base.Name.String()
|
||||
}
|
||||
klog.V(5).Infof(" an object defaulter already exists as %s", baseTypeName)
|
||||
return false
|
||||
}
|
||||
// opt-out
|
||||
|
|
@ -397,6 +431,112 @@ func newCallTreeForType(existingDefaulters, newDefaulters defaulterFuncMap) *cal
|
|||
}
|
||||
}
|
||||
|
||||
func resolveTypeAndDepth(t *types.Type) (*types.Type, int) {
|
||||
var prev *types.Type
|
||||
depth := 0
|
||||
for prev != t {
|
||||
prev = t
|
||||
if t.Kind == types.Alias {
|
||||
t = t.Underlying
|
||||
} else if t.Kind == types.Pointer {
|
||||
t = t.Elem
|
||||
depth += 1
|
||||
}
|
||||
}
|
||||
return t, depth
|
||||
}
|
||||
|
||||
// getNestedDefault returns the first default value when resolving alias types
|
||||
func getNestedDefault(t *types.Type) string {
|
||||
var prev *types.Type
|
||||
for prev != t {
|
||||
prev = t
|
||||
defaultMap := extractDefaultTag(t.CommentLines)
|
||||
if len(defaultMap) == 1 && defaultMap[0] != "" {
|
||||
return defaultMap[0]
|
||||
}
|
||||
if t.Kind == types.Alias {
|
||||
t = t.Underlying
|
||||
} else if t.Kind == types.Pointer {
|
||||
t = t.Elem
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func mustEnforceDefault(t *types.Type, depth int, omitEmpty bool) (interface{}, error) {
|
||||
if depth > 0 {
|
||||
return nil, nil
|
||||
}
|
||||
switch t.Kind {
|
||||
case types.Pointer, types.Map, types.Slice, types.Array, types.Interface:
|
||||
return nil, nil
|
||||
case types.Struct:
|
||||
return map[string]interface{}{}, nil
|
||||
case types.Builtin:
|
||||
if !omitEmpty {
|
||||
if zero, ok := typeZeroValue[t.String()]; ok {
|
||||
return zero, nil
|
||||
} else {
|
||||
return nil, fmt.Errorf("please add type %v to typeZeroValue struct", t)
|
||||
}
|
||||
}
|
||||
return nil, nil
|
||||
default:
|
||||
return nil, fmt.Errorf("not sure how to enforce default for %v", t.Kind)
|
||||
}
|
||||
}
|
||||
|
||||
func populateDefaultValue(node *callNode, t *types.Type, tags string, commentLines []string) *callNode {
|
||||
defaultMap := extractDefaultTag(commentLines)
|
||||
var defaultString string
|
||||
if len(defaultMap) == 1 {
|
||||
defaultString = defaultMap[0]
|
||||
}
|
||||
|
||||
t, depth := resolveTypeAndDepth(t)
|
||||
if depth > 0 && defaultString == "" {
|
||||
defaultString = getNestedDefault(t)
|
||||
}
|
||||
if len(defaultMap) > 1 {
|
||||
klog.Fatalf("Found more than one default tag for %v", t.Kind)
|
||||
} else if len(defaultMap) == 0 {
|
||||
return node
|
||||
}
|
||||
var defaultValue interface{}
|
||||
if err := json.Unmarshal([]byte(defaultString), &defaultValue); err != nil {
|
||||
klog.Fatalf("Failed to unmarshal default: %v", err)
|
||||
}
|
||||
|
||||
omitEmpty := strings.Contains(reflect.StructTag(tags).Get("json"), "omitempty")
|
||||
if enforced, err := mustEnforceDefault(t, depth, omitEmpty); err != nil {
|
||||
klog.Fatal(err)
|
||||
} else if enforced != nil {
|
||||
if defaultValue != nil {
|
||||
if reflect.DeepEqual(defaultValue, enforced) {
|
||||
// If the default value annotation matches the default value for the type,
|
||||
// do not generate any defaulting function
|
||||
return node
|
||||
} else {
|
||||
enforcedJSON, _ := json.Marshal(enforced)
|
||||
klog.Fatalf("Invalid default value (%#v) for non-pointer/non-omitempty. If specified, must be: %v", defaultValue, string(enforcedJSON))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// callNodes are not automatically generated for primitive types. Generate one if the callNode does not exist
|
||||
if node == nil {
|
||||
node = &callNode{}
|
||||
node.markerOnly = true
|
||||
}
|
||||
|
||||
node.defaultIsPrimitive = t.IsPrimitive()
|
||||
node.defaultType = t.String()
|
||||
node.defaultValue = defaultString
|
||||
node.defaultDepth = depth
|
||||
return node
|
||||
}
|
||||
|
||||
// build creates a tree of paths to fields (based on how they would be accessed in Go - pointer, elem,
|
||||
// slice, or key) and the functions that should be invoked on each field. An in-order traversal of the resulting tree
|
||||
// can be used to generate a Go function that invokes each nested function on the appropriate type. The return
|
||||
|
|
@ -469,12 +609,19 @@ func (c *callTreeForType) build(t *types.Type, root bool) *callNode {
|
|||
child.elem = true
|
||||
}
|
||||
parent.children = append(parent.children, *child)
|
||||
} else if member := populateDefaultValue(nil, t.Elem, "", t.Elem.CommentLines); member != nil {
|
||||
member.index = true
|
||||
parent.children = append(parent.children, *member)
|
||||
}
|
||||
case types.Map:
|
||||
if child := c.build(t.Elem, false); child != nil {
|
||||
child.key = true
|
||||
parent.children = append(parent.children, *child)
|
||||
} else if member := populateDefaultValue(nil, t.Elem, "", t.Elem.CommentLines); member != nil {
|
||||
member.key = true
|
||||
parent.children = append(parent.children, *member)
|
||||
}
|
||||
|
||||
case types.Struct:
|
||||
for _, field := range t.Members {
|
||||
name := field.Name
|
||||
|
|
@ -487,7 +634,11 @@ func (c *callTreeForType) build(t *types.Type, root bool) *callNode {
|
|||
}
|
||||
if child := c.build(field.Type, false); child != nil {
|
||||
child.field = name
|
||||
populateDefaultValue(child, field.Type, field.Tags, field.CommentLines)
|
||||
parent.children = append(parent.children, *child)
|
||||
} else if member := populateDefaultValue(nil, field.Type, field.Tags, field.CommentLines); member != nil {
|
||||
member.field = name
|
||||
parent.children = append(parent.children, *member)
|
||||
}
|
||||
}
|
||||
case types.Alias:
|
||||
|
|
@ -672,6 +823,27 @@ type callNode struct {
|
|||
call []*types.Type
|
||||
// children is the child call nodes that must also be traversed
|
||||
children []callNode
|
||||
|
||||
// defaultValue is the defaultValue of a callNode struct
|
||||
// Only primitive types and pointer types are eligible to have a default value
|
||||
defaultValue string
|
||||
|
||||
// defaultIsPrimitive is used to determine how to assign the default value.
|
||||
// Primitive types will be directly assigned while complex types will use JSON unmarshalling
|
||||
defaultIsPrimitive bool
|
||||
|
||||
// markerOnly is true if the callNode exists solely to fill in a default value
|
||||
markerOnly bool
|
||||
|
||||
// defaultDepth is used to determine pointer level of the default value
|
||||
// For example 1 corresponds to setting a default value and taking its pointer while
|
||||
// 2 corresponds to setting a default value and taking its pointer's pointer
|
||||
// 0 implies that no pointers are used
|
||||
defaultDepth int
|
||||
|
||||
// defaultType is the type of the default value.
|
||||
// Only populated if defaultIsPrimitive is true
|
||||
defaultType string
|
||||
}
|
||||
|
||||
// CallNodeVisitorFunc is a function for visiting a call tree. ancestors is the list of all parents
|
||||
|
|
@ -727,6 +899,85 @@ func (n *callNode) writeCalls(varName string, isVarPointer bool, sw *generator.S
|
|||
}
|
||||
}
|
||||
|
||||
func (n *callNode) writeDefaulter(varName string, index string, isVarPointer bool, sw *generator.SnippetWriter) {
|
||||
if n.defaultValue == "" {
|
||||
return
|
||||
}
|
||||
varPointer := varName
|
||||
if !isVarPointer {
|
||||
varPointer = "&" + varPointer
|
||||
}
|
||||
|
||||
args := generator.Args{
|
||||
"defaultValue": n.defaultValue,
|
||||
"varPointer": varPointer,
|
||||
"varName": varName,
|
||||
"index": index,
|
||||
"varDepth": n.defaultDepth,
|
||||
"varType": n.defaultType,
|
||||
}
|
||||
|
||||
if n.index {
|
||||
sw.Do("if reflect.ValueOf($.var$[$.index$]).IsZero() {\n", generator.Args{"var": varName, "index": index})
|
||||
if n.defaultIsPrimitive {
|
||||
if n.defaultDepth > 0 {
|
||||
sw.Do("var ptrVar$.varDepth$ $.varType$ = $.defaultValue$\n", args)
|
||||
for i := n.defaultDepth; i > 0; i-- {
|
||||
sw.Do("ptrVar$.ptri$ := &ptrVar$.i$\n", generator.Args{"i": fmt.Sprintf("%d", i), "ptri": fmt.Sprintf("%d", (i - 1))})
|
||||
}
|
||||
sw.Do("$.varName$[$.index$] = ptrVar0", args)
|
||||
} else {
|
||||
sw.Do("$.varName$[$.index$] = $.defaultValue$", args)
|
||||
}
|
||||
} else {
|
||||
sw.Do("if err := json.Unmarshal([]byte(`$.defaultValue$`), $.varPointer$[$.index$]); err != nil {\n", args)
|
||||
sw.Do("panic(err)\n", nil)
|
||||
sw.Do("}\n", nil)
|
||||
}
|
||||
} else if n.key {
|
||||
mapDefaultVar := index + "_default"
|
||||
args["mapDefaultVar"] = mapDefaultVar
|
||||
sw.Do("if reflect.ValueOf($.var$[$.index$]).IsZero() {\n", generator.Args{"var": varName, "index": index})
|
||||
|
||||
if n.defaultIsPrimitive {
|
||||
if n.defaultDepth > 0 {
|
||||
sw.Do("var ptrVar$.varDepth$ $.varType$ = $.defaultValue$\n", args)
|
||||
for i := n.defaultDepth; i > 0; i-- {
|
||||
sw.Do("ptrVar$.ptri$ := &ptrVar$.i$\n", generator.Args{"i": fmt.Sprintf("%d", i), "ptri": fmt.Sprintf("%d", (i - 1))})
|
||||
}
|
||||
sw.Do("$.varName$[$.index$] = ptrVar0", args)
|
||||
} else {
|
||||
sw.Do("$.varName$[$.index$] = $.defaultValue$", args)
|
||||
}
|
||||
} else {
|
||||
sw.Do("$.mapDefaultVar$ := $.varName$[$.index$]\n", args)
|
||||
sw.Do("if err := json.Unmarshal([]byte(`$.defaultValue$`), &$.mapDefaultVar$); err != nil {\n", args)
|
||||
sw.Do("panic(err)\n", nil)
|
||||
sw.Do("}\n", nil)
|
||||
sw.Do("$.varName$[$.index$] = $.mapDefaultVar$\n", args)
|
||||
}
|
||||
} else {
|
||||
sw.Do("if reflect.ValueOf($.var$).IsZero() {\n", generator.Args{"var": varName})
|
||||
|
||||
if n.defaultIsPrimitive {
|
||||
if n.defaultDepth > 0 {
|
||||
sw.Do("var ptrVar$.varDepth$ $.varType$ = $.defaultValue$\n", args)
|
||||
for i := n.defaultDepth; i > 0; i-- {
|
||||
sw.Do("ptrVar$.ptri$ := &ptrVar$.i$\n", generator.Args{"i": fmt.Sprintf("%d", i), "ptri": fmt.Sprintf("%d", (i - 1))})
|
||||
}
|
||||
sw.Do("$.varName$ = ptrVar0", args)
|
||||
} else {
|
||||
sw.Do("$.varName$ = $.defaultValue$", args)
|
||||
}
|
||||
} else {
|
||||
sw.Do("if err := json.Unmarshal([]byte(`$.defaultValue$`), $.varPointer$); err != nil {\n", args)
|
||||
sw.Do("panic(err)\n", nil)
|
||||
sw.Do("}\n", nil)
|
||||
}
|
||||
}
|
||||
sw.Do("}\n", nil)
|
||||
}
|
||||
|
||||
// WriteMethod performs an in-order traversal of the calltree, generating loops and if blocks as necessary
|
||||
// to correctly turn the call tree into a method body that invokes all calls on all child nodes of the call tree.
|
||||
// Depth is used to generate local variables at the proper depth.
|
||||
|
|
@ -754,19 +1005,31 @@ func (n *callNode) WriteMethod(varName string, depth int, ancestors []*callNode,
|
|||
switch {
|
||||
case n.index:
|
||||
sw.Do("for $.index$ := range $.var$ {\n", vars)
|
||||
if n.elem {
|
||||
sw.Do("$.local$ := $.var$[$.index$]\n", vars)
|
||||
} else {
|
||||
sw.Do("$.local$ := &$.var$[$.index$]\n", vars)
|
||||
if !n.markerOnly {
|
||||
if n.elem {
|
||||
sw.Do("$.local$ := $.var$[$.index$]\n", vars)
|
||||
} else {
|
||||
sw.Do("$.local$ := &$.var$[$.index$]\n", vars)
|
||||
}
|
||||
}
|
||||
|
||||
n.writeDefaulter(varName, index, isPointer, sw)
|
||||
n.writeCalls(local, true, sw)
|
||||
for i := range n.children {
|
||||
n.children[i].WriteMethod(local, depth+1, append(ancestors, n), sw)
|
||||
}
|
||||
sw.Do("}\n", nil)
|
||||
case n.key:
|
||||
if n.defaultValue != "" {
|
||||
// Map keys are typed and cannot share the same index variable as arrays and other maps
|
||||
index = index + "_" + ancestors[len(ancestors)-1].field
|
||||
vars["index"] = index
|
||||
sw.Do("for $.index$ := range $.var$ {\n", vars)
|
||||
n.writeDefaulter(varName, index, isPointer, sw)
|
||||
sw.Do("}\n", nil)
|
||||
}
|
||||
default:
|
||||
n.writeDefaulter(varName, index, isPointer, sw)
|
||||
n.writeCalls(varName, isPointer, sw)
|
||||
for i := range n.children {
|
||||
n.children[i].WriteMethod(varName, depth, append(ancestors, n), sw)
|
||||
|
|
|
|||
217
vendor/k8s.io/gengo/examples/import-boss/generators/import_restrict.go
generated
vendored
217
vendor/k8s.io/gengo/examples/import-boss/generators/import_restrict.go
generated
vendored
|
|
@ -33,11 +33,13 @@ import (
|
|||
"k8s.io/gengo/generator"
|
||||
"k8s.io/gengo/namer"
|
||||
"k8s.io/gengo/types"
|
||||
"sigs.k8s.io/yaml"
|
||||
|
||||
"k8s.io/klog"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
|
||||
const (
|
||||
goModFile = "go.mod"
|
||||
importBossFileType = "import-boss"
|
||||
)
|
||||
|
||||
|
|
@ -58,7 +60,7 @@ func DefaultNameSystem() string {
|
|||
func Packages(c *generator.Context, arguments *args.GeneratorArgs) generator.Packages {
|
||||
pkgs := generator.Packages{}
|
||||
c.FileTypes = map[string]generator.FileType{
|
||||
importBossFileType: importRuleFile{},
|
||||
importBossFileType: importRuleFile{c},
|
||||
}
|
||||
|
||||
for _, p := range c.Universe {
|
||||
|
|
@ -70,6 +72,7 @@ func Packages(c *generator.Context, arguments *args.GeneratorArgs) generator.Pac
|
|||
pkgs = append(pkgs, &generator.DefaultPackage{
|
||||
PackageName: p.Name,
|
||||
PackagePath: p.Path,
|
||||
Source: p.SourcePath,
|
||||
// GeneratorFunc returns a list of generators. Each generator makes a
|
||||
// single file.
|
||||
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
||||
|
|
@ -96,10 +99,19 @@ type Rule struct {
|
|||
ForbiddenPrefixes []string
|
||||
}
|
||||
|
||||
type InverseRule struct {
|
||||
Rule
|
||||
// True if the rule is to be applied to transitive imports.
|
||||
Transitive bool
|
||||
}
|
||||
|
||||
type fileFormat struct {
|
||||
CurrentImports []string
|
||||
|
||||
Rules []Rule
|
||||
Rules []Rule
|
||||
InverseRules []InverseRule
|
||||
|
||||
path string
|
||||
}
|
||||
|
||||
func readFile(path string) (*fileFormat, error) {
|
||||
|
|
@ -109,10 +121,11 @@ func readFile(path string) (*fileFormat, error) {
|
|||
}
|
||||
|
||||
var current fileFormat
|
||||
err = json.Unmarshal(currentBytes, ¤t)
|
||||
err = yaml.Unmarshal(currentBytes, ¤t)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("couldn't unmarshal %v: %v", path, err)
|
||||
}
|
||||
current.path = path
|
||||
return ¤t, nil
|
||||
}
|
||||
|
||||
|
|
@ -131,10 +144,12 @@ func writeFile(path string, ff *fileFormat) error {
|
|||
}
|
||||
|
||||
// This does the actual checking, since it knows the literal destination file.
|
||||
type importRuleFile struct{}
|
||||
type importRuleFile struct {
|
||||
context *generator.Context
|
||||
}
|
||||
|
||||
func (importRuleFile) AssembleFile(f *generator.File, path string) error {
|
||||
return nil
|
||||
func (irf importRuleFile) AssembleFile(f *generator.File, path string) error {
|
||||
return irf.VerifyFile(f, path)
|
||||
}
|
||||
|
||||
// TODO: make a flag to enable this, or expose this information in some other way.
|
||||
|
|
@ -169,62 +184,99 @@ func removeLastDir(path string) (newPath, removedDir string) {
|
|||
return filepath.Join(filepath.Dir(dir), file), filepath.Base(dir)
|
||||
}
|
||||
|
||||
// Keep going up a directory until we find an .import-restrictions file.
|
||||
func recursiveRead(path string) (*fileFormat, string, error) {
|
||||
// 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
|
||||
}
|
||||
|
||||
// recursiveRead collects all '.import-restriction' files, between the current directory,
|
||||
// and the package root when Go modules are enabled, or $GOPATH/src when they are not.
|
||||
func recursiveRead(path string) ([]*fileFormat, error) {
|
||||
restrictionFiles := make([]*fileFormat, 0)
|
||||
|
||||
for {
|
||||
if _, err := os.Stat(path); err == nil {
|
||||
ff, err := readFile(path)
|
||||
return ff, path, err
|
||||
rules, err := readFile(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
restrictionFiles = append(restrictionFiles, rules)
|
||||
}
|
||||
|
||||
nextPath, removedDir := removeLastDir(path)
|
||||
if nextPath == path || removedDir == "src" {
|
||||
if nextPath == path || isGoModRoot(path) || removedDir == "src" {
|
||||
break
|
||||
}
|
||||
|
||||
path = nextPath
|
||||
}
|
||||
return nil, "", nil
|
||||
|
||||
return restrictionFiles, nil
|
||||
}
|
||||
|
||||
func (importRuleFile) VerifyFile(f *generator.File, path string) error {
|
||||
rules, actualPath, err := recursiveRead(path)
|
||||
func (irf importRuleFile) VerifyFile(f *generator.File, path string) error {
|
||||
restrictionFiles, err := recursiveRead(filepath.Join(f.PackageSourcePath, f.Name))
|
||||
if err != nil {
|
||||
return fmt.Errorf("error finding rules file: %v", err)
|
||||
}
|
||||
|
||||
if rules == nil {
|
||||
// No restrictions on this directory.
|
||||
return nil
|
||||
if err := irf.verifyRules(restrictionFiles, f); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return irf.verifyInverseRules(restrictionFiles, f)
|
||||
}
|
||||
|
||||
func (irf importRuleFile) verifyRules(restrictionFiles []*fileFormat, f *generator.File) error {
|
||||
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 fmt.Errorf("regexp `%s` in file %q doesn't compile: %v", r.SelectorRegexp, restrictionFile.path, err)
|
||||
}
|
||||
|
||||
selectors[i] = append(selectors[i], re)
|
||||
}
|
||||
}
|
||||
|
||||
forbiddenImports := map[string]string{}
|
||||
allowedMismatchedImports := []string{}
|
||||
for _, r := range rules.Rules {
|
||||
re, err := regexp.Compile(r.SelectorRegexp)
|
||||
if err != nil {
|
||||
return fmt.Errorf("regexp `%s` in file %q doesn't compile: %v", r.SelectorRegexp, actualPath, err)
|
||||
}
|
||||
for v := range f.Imports {
|
||||
klog.V(4).Infof("Checking %v matches %v: %v\n", r.SelectorRegexp, v, re.MatchString(v))
|
||||
if !re.MatchString(v) {
|
||||
continue
|
||||
}
|
||||
for _, forbidden := range r.ForbiddenPrefixes {
|
||||
klog.V(4).Infof("Checking %v against %v\n", v, forbidden)
|
||||
if strings.HasPrefix(v, forbidden) {
|
||||
forbiddenImports[v] = forbidden
|
||||
|
||||
for v := range f.Imports {
|
||||
explicitlyAllowed := false
|
||||
|
||||
NextRestrictionFiles:
|
||||
for i, rules := range restrictionFiles {
|
||||
for j, r := range rules.Rules {
|
||||
matching := selectors[i][j].MatchString(v)
|
||||
klog.V(5).Infof("Checking %v matches %v: %v\n", r.SelectorRegexp, v, matching)
|
||||
if !matching {
|
||||
continue
|
||||
}
|
||||
}
|
||||
found := false
|
||||
for _, allowed := range r.AllowedPrefixes {
|
||||
klog.V(4).Infof("Checking %v against %v\n", v, allowed)
|
||||
if strings.HasPrefix(v, allowed) {
|
||||
found = true
|
||||
break
|
||||
for _, forbidden := range r.ForbiddenPrefixes {
|
||||
klog.V(4).Infof("Checking %v against %v\n", v, forbidden)
|
||||
if strings.HasPrefix(v, forbidden) {
|
||||
forbiddenImports[v] = forbidden
|
||||
}
|
||||
}
|
||||
for _, allowed := range r.AllowedPrefixes {
|
||||
klog.V(4).Infof("Checking %v against %v\n", v, allowed)
|
||||
if strings.HasPrefix(v, allowed) {
|
||||
explicitlyAllowed = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !explicitlyAllowed {
|
||||
allowedMismatchedImports = append(allowedMismatchedImports, v)
|
||||
} else {
|
||||
klog.V(2).Infof("%v importing %v allowed by %v\n", f.PackagePath, v, restrictionFiles[i].path)
|
||||
break NextRestrictionFiles
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
allowedMismatchedImports = append(allowedMismatchedImports, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -243,8 +295,85 @@ func (importRuleFile) VerifyFile(f *generator.File, path string) error {
|
|||
}
|
||||
return errors.New(errorBuilder.String())
|
||||
}
|
||||
if len(rules.Rules) > 0 {
|
||||
klog.V(2).Infof("%v passes rules found in %v\n", path, actualPath)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// verifyInverseRules checks that all packages that import a package are allowed to import it.
|
||||
func (irf importRuleFile) verifyInverseRules(restrictionFiles []*fileFormat, f *generator.File) error {
|
||||
// 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 fmt.Errorf("regexp `%s` in file %q doesn't compile: %v", r.SelectorRegexp, restrictionFile.path, err)
|
||||
}
|
||||
|
||||
selectors[i] = append(selectors[i], re)
|
||||
}
|
||||
}
|
||||
|
||||
directImport := map[string]bool{}
|
||||
for _, imp := range irf.context.IncomingImports()[f.PackagePath] {
|
||||
directImport[imp] = true
|
||||
}
|
||||
|
||||
forbiddenImports := map[string]string{}
|
||||
allowedMismatchedImports := []string{}
|
||||
|
||||
for _, v := range irf.context.TransitiveIncomingImports()[f.PackagePath] {
|
||||
explicitlyAllowed := false
|
||||
|
||||
NextRestrictionFiles:
|
||||
for i, rules := range restrictionFiles {
|
||||
for j, r := range rules.InverseRules {
|
||||
if !r.Transitive && !directImport[v] {
|
||||
continue
|
||||
}
|
||||
|
||||
re := selectors[i][j]
|
||||
matching := re.MatchString(v)
|
||||
klog.V(4).Infof("Checking %v matches %v (importing %v: %v\n", r.SelectorRegexp, v, f.PackagePath, matching)
|
||||
if !matching {
|
||||
continue
|
||||
}
|
||||
for _, forbidden := range r.ForbiddenPrefixes {
|
||||
klog.V(4).Infof("Checking %v against %v\n", v, forbidden)
|
||||
if strings.HasPrefix(v, forbidden) {
|
||||
forbiddenImports[v] = forbidden
|
||||
}
|
||||
}
|
||||
for _, allowed := range r.AllowedPrefixes {
|
||||
klog.V(4).Infof("Checking %v against %v\n", v, allowed)
|
||||
if strings.HasPrefix(v, allowed) {
|
||||
explicitlyAllowed = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !explicitlyAllowed {
|
||||
allowedMismatchedImports = append(allowedMismatchedImports, v)
|
||||
} else {
|
||||
klog.V(2).Infof("%v importing %v allowed by %v\n", v, f.PackagePath, restrictionFiles[i].path)
|
||||
break NextRestrictionFiles
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if len(forbiddenImports) > 0 || len(allowedMismatchedImports) > 0 {
|
||||
var errorBuilder strings.Builder
|
||||
for i, f := range forbiddenImports {
|
||||
fmt.Fprintf(&errorBuilder, "(inverse): import %v has forbidden prefix %v\n", i, f)
|
||||
}
|
||||
if len(allowedMismatchedImports) > 0 {
|
||||
sort.Sort(sort.StringSlice(allowedMismatchedImports))
|
||||
fmt.Fprintf(&errorBuilder, "(inverse): the following imports did not match any allowed prefix:\n")
|
||||
for _, i := range allowedMismatchedImports {
|
||||
fmt.Fprintf(&errorBuilder, " %v\n", i)
|
||||
}
|
||||
}
|
||||
return errors.New(errorBuilder.String())
|
||||
}
|
||||
|
||||
return nil
|
||||
|
|
|
|||
4
vendor/k8s.io/gengo/examples/set-gen/generators/sets.go
generated
vendored
4
vendor/k8s.io/gengo/examples/set-gen/generators/sets.go
generated
vendored
|
|
@ -25,7 +25,7 @@ import (
|
|||
"k8s.io/gengo/namer"
|
||||
"k8s.io/gengo/types"
|
||||
|
||||
"k8s.io/klog"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
|
||||
// NameSystems returns the name system used by the generators in this package.
|
||||
|
|
@ -187,7 +187,7 @@ type $.type|public$ map[$.type|raw$]Empty
|
|||
|
||||
// New$.type|public$ creates a $.type|public$ from a list of values.
|
||||
func New$.type|public$(items ...$.type|raw$) $.type|public$ {
|
||||
ss := $.type|public${}
|
||||
ss := make($.type|public$, len(items))
|
||||
ss.Insert(items...)
|
||||
return ss
|
||||
}
|
||||
|
|
|
|||
2
vendor/k8s.io/gengo/examples/set-gen/generators/tags.go
generated
vendored
2
vendor/k8s.io/gengo/examples/set-gen/generators/tags.go
generated
vendored
|
|
@ -18,7 +18,7 @@ package generators
|
|||
|
||||
import (
|
||||
"k8s.io/gengo/types"
|
||||
"k8s.io/klog"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
|
||||
// extractBoolTagOrDie gets the comment-tags for the key and asserts that, if
|
||||
|
|
|
|||
2
vendor/k8s.io/gengo/examples/set-gen/sets/byte.go
generated
vendored
2
vendor/k8s.io/gengo/examples/set-gen/sets/byte.go
generated
vendored
|
|
@ -28,7 +28,7 @@ type Byte map[byte]Empty
|
|||
|
||||
// NewByte creates a Byte from a list of values.
|
||||
func NewByte(items ...byte) Byte {
|
||||
ss := Byte{}
|
||||
ss := make(Byte, len(items))
|
||||
ss.Insert(items...)
|
||||
return ss
|
||||
}
|
||||
|
|
|
|||
2
vendor/k8s.io/gengo/examples/set-gen/sets/int.go
generated
vendored
2
vendor/k8s.io/gengo/examples/set-gen/sets/int.go
generated
vendored
|
|
@ -28,7 +28,7 @@ type Int map[int]Empty
|
|||
|
||||
// NewInt creates a Int from a list of values.
|
||||
func NewInt(items ...int) Int {
|
||||
ss := Int{}
|
||||
ss := make(Int, len(items))
|
||||
ss.Insert(items...)
|
||||
return ss
|
||||
}
|
||||
|
|
|
|||
2
vendor/k8s.io/gengo/examples/set-gen/sets/int64.go
generated
vendored
2
vendor/k8s.io/gengo/examples/set-gen/sets/int64.go
generated
vendored
|
|
@ -28,7 +28,7 @@ type Int64 map[int64]Empty
|
|||
|
||||
// NewInt64 creates a Int64 from a list of values.
|
||||
func NewInt64(items ...int64) Int64 {
|
||||
ss := Int64{}
|
||||
ss := make(Int64, len(items))
|
||||
ss.Insert(items...)
|
||||
return ss
|
||||
}
|
||||
|
|
|
|||
2
vendor/k8s.io/gengo/examples/set-gen/sets/string.go
generated
vendored
2
vendor/k8s.io/gengo/examples/set-gen/sets/string.go
generated
vendored
|
|
@ -28,7 +28,7 @@ type String map[string]Empty
|
|||
|
||||
// NewString creates a String from a list of values.
|
||||
func NewString(items ...string) String {
|
||||
ss := String{}
|
||||
ss := make(String, len(items))
|
||||
ss.Insert(items...)
|
||||
return ss
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue