mirror of https://github.com/knative/caching.git
Auto-update dependencies (#196)
Produced via: `dep ensure -update knative.dev/test-infra knative.dev/pkg` /assign n3wscott /cc n3wscott
This commit is contained in:
parent
5dcbd8b57e
commit
070d8a0d12
|
@ -966,7 +966,7 @@
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:26325ee882afecdb033204b8f2d8e69f0d939f5bcc1a1b151233a7d78d74f7dc"
|
digest = "1:0fdbfd5bd4573f59828ede757341dd6905ab4fdb0df9fd0aa8ead8fb93900e52"
|
||||||
name = "knative.dev/pkg"
|
name = "knative.dev/pkg"
|
||||||
packages = [
|
packages = [
|
||||||
"apis",
|
"apis",
|
||||||
|
@ -985,7 +985,7 @@
|
||||||
"metrics/metricskey",
|
"metrics/metricskey",
|
||||||
]
|
]
|
||||||
pruneopts = "T"
|
pruneopts = "T"
|
||||||
revision = "7ddd3b6a42f6c3db48561e5d9525c66b546bab01"
|
revision = "b9974987c245c4996a7d1299c3d162a4b0b0ad5e"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
|
@ -996,7 +996,7 @@
|
||||||
"tools/dep-collector",
|
"tools/dep-collector",
|
||||||
]
|
]
|
||||||
pruneopts = "UT"
|
pruneopts = "UT"
|
||||||
revision = "7086222c769000dd2122c44de8f43bbb335ad81a"
|
revision = "77b975af074880c49957946a6d861e063e11f232"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:8730e0150dfb2b7e173890c8b9868e7a273082ef8e39f4940e3506a481cf895c"
|
digest = "1:8730e0150dfb2b7e173890c8b9868e7a273082ef8e39f4940e3506a481cf895c"
|
||||||
|
|
|
@ -1478,6 +1478,7 @@
|
||||||
"k8s.io/code-generator/cmd/defaulter-gen",
|
"k8s.io/code-generator/cmd/defaulter-gen",
|
||||||
"k8s.io/code-generator/cmd/informer-gen",
|
"k8s.io/code-generator/cmd/informer-gen",
|
||||||
"k8s.io/code-generator/cmd/lister-gen",
|
"k8s.io/code-generator/cmd/lister-gen",
|
||||||
|
"k8s.io/code-generator/pkg/namer",
|
||||||
"k8s.io/code-generator/pkg/util",
|
"k8s.io/code-generator/pkg/util",
|
||||||
"k8s.io/gengo/args",
|
"k8s.io/gengo/args",
|
||||||
"k8s.io/gengo/generator",
|
"k8s.io/gengo/generator",
|
||||||
|
|
|
@ -27,6 +27,7 @@ import (
|
||||||
type CustomArgs struct {
|
type CustomArgs struct {
|
||||||
VersionedClientSetPackage string
|
VersionedClientSetPackage string
|
||||||
ExternalVersionsInformersPackage string
|
ExternalVersionsInformersPackage string
|
||||||
|
ListersPackage string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDefaults returns default arguments for the generator.
|
// NewDefaults returns default arguments for the generator.
|
||||||
|
@ -41,6 +42,7 @@ func NewDefaults() (*args.GeneratorArgs, *CustomArgs) {
|
||||||
func (ca *CustomArgs) AddFlags(fs *pflag.FlagSet) {
|
func (ca *CustomArgs) AddFlags(fs *pflag.FlagSet) {
|
||||||
fs.StringVar(&ca.VersionedClientSetPackage, "versioned-clientset-package", ca.VersionedClientSetPackage, "the full package name for the versioned injection clientset to use")
|
fs.StringVar(&ca.VersionedClientSetPackage, "versioned-clientset-package", ca.VersionedClientSetPackage, "the full package name for the versioned injection clientset to use")
|
||||||
fs.StringVar(&ca.ExternalVersionsInformersPackage, "external-versions-informers-package", ca.ExternalVersionsInformersPackage, "the full package name for the external versions injection informer to use")
|
fs.StringVar(&ca.ExternalVersionsInformersPackage, "external-versions-informers-package", ca.ExternalVersionsInformersPackage, "the full package name for the external versions injection informer to use")
|
||||||
|
fs.StringVar(&ca.ListersPackage, "listers-package", ca.ListersPackage, "the full package name for client listers to use")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate checks the given arguments.
|
// Validate checks the given arguments.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2019 The Kubernetes Authors.
|
Copyright 2019 The Knative Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2019 The Kubernetes Authors.
|
Copyright 2019 The Knative Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2019 The Kubernetes Authors.
|
Copyright 2019 The Knative Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2019 The Kubernetes Authors.
|
Copyright 2019 The Knative Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2019 The Kubernetes Authors.
|
Copyright 2019 The Knative Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
|
@ -19,6 +19,7 @@ package generators
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
codegennamer "k8s.io/code-generator/pkg/namer"
|
||||||
"k8s.io/gengo/namer"
|
"k8s.io/gengo/namer"
|
||||||
"k8s.io/gengo/types"
|
"k8s.io/gengo/types"
|
||||||
)
|
)
|
||||||
|
@ -28,13 +29,26 @@ func NameSystems() namer.NameSystems {
|
||||||
pluralExceptions := map[string]string{
|
pluralExceptions := map[string]string{
|
||||||
"Endpoints": "Endpoints",
|
"Endpoints": "Endpoints",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
publicPluralNamer := namer.NewPublicPluralNamer(pluralExceptions)
|
||||||
|
|
||||||
|
publicNamer := &ExceptionNamer{
|
||||||
|
Exceptions: map[string]string{},
|
||||||
|
KeyFunc: func(t *types.Type) string {
|
||||||
|
return t.Name.Package + "." + t.Name.Name
|
||||||
|
},
|
||||||
|
Delegate: namer.NewPublicNamer(0),
|
||||||
|
}
|
||||||
|
|
||||||
return namer.NameSystems{
|
return namer.NameSystems{
|
||||||
"public": namer.NewPublicNamer(0),
|
"public": namer.NewPublicNamer(0),
|
||||||
"private": namer.NewPrivateNamer(0),
|
"private": namer.NewPrivateNamer(0),
|
||||||
"raw": namer.NewRawNamer("", nil),
|
"raw": namer.NewRawNamer("", nil),
|
||||||
"publicPlural": namer.NewPublicPluralNamer(pluralExceptions),
|
"publicPlural": publicPluralNamer,
|
||||||
"allLowercasePlural": namer.NewAllLowercasePluralNamer(pluralExceptions),
|
"allLowercasePlural": namer.NewAllLowercasePluralNamer(pluralExceptions),
|
||||||
"lowercaseSingular": &lowercaseSingularNamer{},
|
"lowercaseSingular": &lowercaseSingularNamer{},
|
||||||
|
"apiGroup": codegennamer.NewTagOverrideNamer("publicPlural", publicPluralNamer),
|
||||||
|
"versionedClientset": &versionedClientsetNamer{public: publicNamer},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,6 +60,22 @@ func (n *lowercaseSingularNamer) Name(t *types.Type) string {
|
||||||
return strings.ToLower(t.Name.Name)
|
return strings.ToLower(t.Name.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type versionedClientsetNamer struct {
|
||||||
|
public *ExceptionNamer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *versionedClientsetNamer) Name(t *types.Type) string {
|
||||||
|
// Turns type into a GroupVersion type string based on package.
|
||||||
|
parts := strings.Split(t.Name.Package, "/")
|
||||||
|
group := parts[len(parts)-2]
|
||||||
|
version := parts[len(parts)-1]
|
||||||
|
|
||||||
|
g := r.public.Name(&types.Type{Name: types.Name{Name: group, Package: t.Name.Package}})
|
||||||
|
v := r.public.Name(&types.Type{Name: types.Name{Name: version, Package: t.Name.Package}})
|
||||||
|
|
||||||
|
return g + v
|
||||||
|
}
|
||||||
|
|
||||||
// DefaultNameSystem returns the default name system for ordering the types to be
|
// DefaultNameSystem returns the default name system for ordering the types to be
|
||||||
// processed by the generators in this package.
|
// processed by the generators in this package.
|
||||||
func DefaultNameSystem() string {
|
func DefaultNameSystem() string {
|
||||||
|
|
|
@ -17,7 +17,6 @@ limitations under the License.
|
||||||
package generators
|
package generators
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -87,6 +86,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
|
||||||
|
|
||||||
var typesWithInformers []*types.Type
|
var typesWithInformers []*types.Type
|
||||||
var duckTypes []*types.Type
|
var duckTypes []*types.Type
|
||||||
|
var reconcilerTypes []*types.Type
|
||||||
for _, t := range p.Types {
|
for _, t := range p.Types {
|
||||||
tags := MustParseClientGenTags(append(t.SecondClosestCommentLines, t.CommentLines...))
|
tags := MustParseClientGenTags(append(t.SecondClosestCommentLines, t.CommentLines...))
|
||||||
if tags.NeedsInformerInjection() {
|
if tags.NeedsInformerInjection() {
|
||||||
|
@ -95,6 +95,9 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
|
||||||
if tags.NeedsDuckInjection() {
|
if tags.NeedsDuckInjection() {
|
||||||
duckTypes = append(duckTypes, t)
|
duckTypes = append(duckTypes, t)
|
||||||
}
|
}
|
||||||
|
if tags.NeedsReconciler() {
|
||||||
|
reconcilerTypes = append(reconcilerTypes, t)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
groupVersionsEntry, ok := targetGroupVersions[groupPackageName]
|
groupVersionsEntry, ok := targetGroupVersions[groupPackageName]
|
||||||
|
@ -122,6 +125,14 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
|
||||||
// Generate a duck-typed informer for each type.
|
// Generate a duck-typed informer for each type.
|
||||||
packageList = append(packageList, versionDuckPackages(versionPackagePath, groupPackageName, gv, groupGoNames[groupPackageName], boilerplate, duckTypes, customArgs)...)
|
packageList = append(packageList, versionDuckPackages(versionPackagePath, groupPackageName, gv, groupGoNames[groupPackageName], boilerplate, duckTypes, customArgs)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(reconcilerTypes) != 0 {
|
||||||
|
orderer := namer.Orderer{Namer: namer.NewPrivateNamer(0)}
|
||||||
|
reconcilerTypes = orderer.OrderTypes(reconcilerTypes)
|
||||||
|
|
||||||
|
// Generate a reconciler and controller for each type.
|
||||||
|
packageList = append(packageList, reconcilerPackages(versionPackagePath, groupPackageName, gv, groupGoNames[groupPackageName], boilerplate, reconcilerTypes, customArgs)...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return packageList
|
return packageList
|
||||||
|
@ -131,7 +142,8 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
|
||||||
type Tags struct {
|
type Tags struct {
|
||||||
util.Tags
|
util.Tags
|
||||||
|
|
||||||
GenerateDuck bool
|
GenerateDuck bool
|
||||||
|
GenerateReconciler bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t Tags) NeedsInformerInjection() bool {
|
func (t Tags) NeedsInformerInjection() bool {
|
||||||
|
@ -142,6 +154,10 @@ func (t Tags) NeedsDuckInjection() bool {
|
||||||
return t.GenerateDuck
|
return t.GenerateDuck
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t Tags) NeedsReconciler() bool {
|
||||||
|
return t.GenerateReconciler
|
||||||
|
}
|
||||||
|
|
||||||
// MustParseClientGenTags calls ParseClientGenTags but instead of returning error it panics.
|
// MustParseClientGenTags calls ParseClientGenTags but instead of returning error it panics.
|
||||||
func MustParseClientGenTags(lines []string) Tags {
|
func MustParseClientGenTags(lines []string) Tags {
|
||||||
ret := Tags{
|
ret := Tags{
|
||||||
|
@ -151,6 +167,7 @@ func MustParseClientGenTags(lines []string) Tags {
|
||||||
values := types.ExtractCommentTags("+", lines)
|
values := types.ExtractCommentTags("+", lines)
|
||||||
// log.Printf("GOT values %v", values)
|
// log.Printf("GOT values %v", values)
|
||||||
_, ret.GenerateDuck = values["genduck"]
|
_, ret.GenerateDuck = values["genduck"]
|
||||||
|
_, ret.GenerateReconciler = values["genreconciler"]
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
@ -203,7 +220,7 @@ func versionClientsPackages(basePackage string, boilerplate []byte, customArgs *
|
||||||
// Fake
|
// Fake
|
||||||
vers = append(vers, &generator.DefaultPackage{
|
vers = append(vers, &generator.DefaultPackage{
|
||||||
PackageName: "fake",
|
PackageName: "fake",
|
||||||
PackagePath: packagePath + "/fake",
|
PackagePath: filepath.Join(packagePath, "fake"),
|
||||||
HeaderText: boilerplate,
|
HeaderText: boilerplate,
|
||||||
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
||||||
|
|
||||||
|
@ -212,9 +229,9 @@ func versionClientsPackages(basePackage string, boilerplate []byte, customArgs *
|
||||||
DefaultGen: generator.DefaultGen{
|
DefaultGen: generator.DefaultGen{
|
||||||
OptionalName: "fake",
|
OptionalName: "fake",
|
||||||
},
|
},
|
||||||
outputPackage: packagePath + "/fake",
|
outputPackage: filepath.Join(packagePath, "fake"),
|
||||||
imports: generator.NewImportTracker(),
|
imports: generator.NewImportTracker(),
|
||||||
fakeClientPkg: customArgs.VersionedClientSetPackage + "/fake",
|
fakeClientPkg: filepath.Join(customArgs.VersionedClientSetPackage, "fake"),
|
||||||
clientInjectionPkg: packagePath,
|
clientInjectionPkg: packagePath,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -246,7 +263,7 @@ func versionFactoryPackages(basePackage string, boilerplate []byte, customArgs *
|
||||||
OptionalName: "factory",
|
OptionalName: "factory",
|
||||||
},
|
},
|
||||||
outputPackage: packagePath,
|
outputPackage: packagePath,
|
||||||
cachingClientSetPackage: fmt.Sprintf("%s/client", basePackage),
|
cachingClientSetPackage: filepath.Join(basePackage, "client"),
|
||||||
sharedInformerFactoryPackage: customArgs.ExternalVersionsInformersPackage,
|
sharedInformerFactoryPackage: customArgs.ExternalVersionsInformersPackage,
|
||||||
imports: generator.NewImportTracker(),
|
imports: generator.NewImportTracker(),
|
||||||
})
|
})
|
||||||
|
@ -262,7 +279,7 @@ func versionFactoryPackages(basePackage string, boilerplate []byte, customArgs *
|
||||||
// Fake
|
// Fake
|
||||||
vers = append(vers, &generator.DefaultPackage{
|
vers = append(vers, &generator.DefaultPackage{
|
||||||
PackageName: "fake",
|
PackageName: "fake",
|
||||||
PackagePath: packagePath + "/fake",
|
PackagePath: filepath.Join(packagePath, "fake"),
|
||||||
HeaderText: boilerplate,
|
HeaderText: boilerplate,
|
||||||
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
||||||
|
|
||||||
|
@ -271,9 +288,9 @@ func versionFactoryPackages(basePackage string, boilerplate []byte, customArgs *
|
||||||
DefaultGen: generator.DefaultGen{
|
DefaultGen: generator.DefaultGen{
|
||||||
OptionalName: "fake",
|
OptionalName: "fake",
|
||||||
},
|
},
|
||||||
outputPackage: packagePath + "/fake",
|
outputPackage: filepath.Join(packagePath, "fake"),
|
||||||
factoryInjectionPkg: packagePath,
|
factoryInjectionPkg: packagePath,
|
||||||
fakeClientInjectionPkg: fmt.Sprintf("%s/client/fake", basePackage),
|
fakeClientInjectionPkg: filepath.Join(basePackage, "client", "fake"),
|
||||||
sharedInformerFactoryPackage: customArgs.ExternalVersionsInformersPackage,
|
sharedInformerFactoryPackage: customArgs.ExternalVersionsInformersPackage,
|
||||||
imports: generator.NewImportTracker(),
|
imports: generator.NewImportTracker(),
|
||||||
})
|
})
|
||||||
|
@ -333,7 +350,7 @@ func versionInformerPackages(basePackage string, groupPkgName string, gv clientg
|
||||||
// Fake
|
// Fake
|
||||||
vers = append(vers, &generator.DefaultPackage{
|
vers = append(vers, &generator.DefaultPackage{
|
||||||
PackageName: "fake",
|
PackageName: "fake",
|
||||||
PackagePath: packagePath + "/fake",
|
PackagePath: filepath.Join(packagePath, "fake"),
|
||||||
HeaderText: boilerplate,
|
HeaderText: boilerplate,
|
||||||
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
||||||
// Impl
|
// Impl
|
||||||
|
@ -341,13 +358,13 @@ func versionInformerPackages(basePackage string, groupPkgName string, gv clientg
|
||||||
DefaultGen: generator.DefaultGen{
|
DefaultGen: generator.DefaultGen{
|
||||||
OptionalName: "fake",
|
OptionalName: "fake",
|
||||||
},
|
},
|
||||||
outputPackage: packagePath + "/fake",
|
outputPackage: filepath.Join(packagePath, "fake"),
|
||||||
imports: generator.NewImportTracker(),
|
imports: generator.NewImportTracker(),
|
||||||
typeToGenerate: t,
|
typeToGenerate: t,
|
||||||
groupVersion: gv,
|
groupVersion: gv,
|
||||||
groupGoName: groupGoName,
|
groupGoName: groupGoName,
|
||||||
informerInjectionPkg: packagePath,
|
informerInjectionPkg: packagePath,
|
||||||
fakeFactoryInjectionPkg: factoryPackagePath + "/fake",
|
fakeFactoryInjectionPkg: filepath.Join(factoryPackagePath, "fake"),
|
||||||
})
|
})
|
||||||
|
|
||||||
return generators
|
return generators
|
||||||
|
@ -361,6 +378,126 @@ func versionInformerPackages(basePackage string, groupPkgName string, gv clientg
|
||||||
return vers
|
return vers
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func reconcilerPackages(basePackage string, groupPkgName string, gv clientgentypes.GroupVersion, groupGoName string, boilerplate []byte, typesToGenerate []*types.Type, customArgs *informergenargs.CustomArgs) []generator.Package {
|
||||||
|
packagePath := filepath.Join(basePackage, "reconciler", groupPkgName, strings.ToLower(gv.Version.NonEmpty()))
|
||||||
|
|
||||||
|
vers := make([]generator.Package, 0, len(typesToGenerate))
|
||||||
|
|
||||||
|
for _, t := range typesToGenerate {
|
||||||
|
// Fix for golang iterator bug.
|
||||||
|
t := t
|
||||||
|
|
||||||
|
packagePath := filepath.Join(packagePath, strings.ToLower(t.Name.Name))
|
||||||
|
|
||||||
|
clientPackagePath := filepath.Join(basePackage, "client")
|
||||||
|
informerPackagePath := filepath.Join(basePackage, "informers", groupPkgName, strings.ToLower(gv.Version.NonEmpty()), strings.ToLower(t.Name.Name))
|
||||||
|
|
||||||
|
listerPackagePath := filepath.Join(customArgs.ListersPackage, groupPkgName, strings.ToLower(gv.Version.NonEmpty()))
|
||||||
|
|
||||||
|
// Controller
|
||||||
|
vers = append(vers, &generator.DefaultPackage{
|
||||||
|
PackageName: strings.ToLower(t.Name.Name),
|
||||||
|
PackagePath: packagePath,
|
||||||
|
HeaderText: boilerplate,
|
||||||
|
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
||||||
|
// Impl
|
||||||
|
generators = append(generators, &reconcilerControllerGenerator{
|
||||||
|
DefaultGen: generator.DefaultGen{
|
||||||
|
OptionalName: "controller",
|
||||||
|
},
|
||||||
|
outputPackage: packagePath,
|
||||||
|
imports: generator.NewImportTracker(),
|
||||||
|
clientPkg: clientPackagePath,
|
||||||
|
informerPackagePath: informerPackagePath,
|
||||||
|
schemePkg: filepath.Join(customArgs.VersionedClientSetPackage, "scheme"),
|
||||||
|
})
|
||||||
|
|
||||||
|
return generators
|
||||||
|
},
|
||||||
|
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
||||||
|
tags := MustParseClientGenTags(append(t.SecondClosestCommentLines, t.CommentLines...))
|
||||||
|
return tags.NeedsReconciler()
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Controller Stub
|
||||||
|
vers = append(vers, &generator.DefaultPackage{
|
||||||
|
PackageName: strings.ToLower(t.Name.Name),
|
||||||
|
PackagePath: filepath.Join(packagePath, "stub"),
|
||||||
|
HeaderText: boilerplate,
|
||||||
|
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
||||||
|
// Impl
|
||||||
|
generators = append(generators, &reconcilerControllerStubGenerator{
|
||||||
|
DefaultGen: generator.DefaultGen{
|
||||||
|
OptionalName: "controller",
|
||||||
|
},
|
||||||
|
reconcilerPkg: packagePath,
|
||||||
|
outputPackage: filepath.Join(packagePath, "stub"),
|
||||||
|
imports: generator.NewImportTracker(),
|
||||||
|
informerPackagePath: informerPackagePath,
|
||||||
|
})
|
||||||
|
|
||||||
|
return generators
|
||||||
|
},
|
||||||
|
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
||||||
|
tags := MustParseClientGenTags(append(t.SecondClosestCommentLines, t.CommentLines...))
|
||||||
|
return tags.NeedsReconciler()
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Reconciler
|
||||||
|
vers = append(vers, &generator.DefaultPackage{
|
||||||
|
PackageName: strings.ToLower(t.Name.Name),
|
||||||
|
PackagePath: packagePath,
|
||||||
|
HeaderText: boilerplate,
|
||||||
|
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
||||||
|
// Impl
|
||||||
|
generators = append(generators, &reconcilerReconcilerGenerator{
|
||||||
|
DefaultGen: generator.DefaultGen{
|
||||||
|
OptionalName: "reconciler",
|
||||||
|
},
|
||||||
|
outputPackage: packagePath,
|
||||||
|
imports: generator.NewImportTracker(),
|
||||||
|
clientsetPkg: customArgs.VersionedClientSetPackage,
|
||||||
|
listerName: t.Name.Name + "Lister",
|
||||||
|
listerPkg: listerPackagePath,
|
||||||
|
})
|
||||||
|
|
||||||
|
return generators
|
||||||
|
},
|
||||||
|
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
||||||
|
tags := MustParseClientGenTags(append(t.SecondClosestCommentLines, t.CommentLines...))
|
||||||
|
return tags.NeedsReconciler()
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Reconciler Stub
|
||||||
|
vers = append(vers, &generator.DefaultPackage{
|
||||||
|
PackageName: strings.ToLower(t.Name.Name),
|
||||||
|
PackagePath: filepath.Join(packagePath, "stub"),
|
||||||
|
HeaderText: boilerplate,
|
||||||
|
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
||||||
|
// Impl
|
||||||
|
generators = append(generators, &reconcilerReconcilerStubGenerator{
|
||||||
|
DefaultGen: generator.DefaultGen{
|
||||||
|
OptionalName: "reconciler",
|
||||||
|
},
|
||||||
|
reconcilerPkg: packagePath,
|
||||||
|
outputPackage: filepath.Join(packagePath, "stub"),
|
||||||
|
imports: generator.NewImportTracker(),
|
||||||
|
})
|
||||||
|
|
||||||
|
return generators
|
||||||
|
},
|
||||||
|
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
||||||
|
tags := MustParseClientGenTags(append(t.SecondClosestCommentLines, t.CommentLines...))
|
||||||
|
return tags.NeedsReconciler()
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return vers
|
||||||
|
}
|
||||||
|
|
||||||
func versionDuckPackages(basePackage string, groupPkgName string, gv clientgentypes.GroupVersion, groupGoName string, boilerplate []byte, typesToGenerate []*types.Type, customArgs *informergenargs.CustomArgs) []generator.Package {
|
func versionDuckPackages(basePackage string, groupPkgName string, gv clientgentypes.GroupVersion, groupGoName string, boilerplate []byte, typesToGenerate []*types.Type, customArgs *informergenargs.CustomArgs) []generator.Package {
|
||||||
packagePath := filepath.Join(basePackage, "ducks", groupPkgName, strings.ToLower(gv.Version.NonEmpty()))
|
packagePath := filepath.Join(basePackage, "ducks", groupPkgName, strings.ToLower(gv.Version.NonEmpty()))
|
||||||
|
|
||||||
|
@ -370,7 +507,7 @@ func versionDuckPackages(basePackage string, groupPkgName string, gv clientgenty
|
||||||
// Fix for golang iterator bug.
|
// Fix for golang iterator bug.
|
||||||
t := t
|
t := t
|
||||||
|
|
||||||
packagePath := packagePath + "/" + strings.ToLower(t.Name.Name)
|
packagePath := filepath.Join(packagePath, strings.ToLower(t.Name.Name))
|
||||||
|
|
||||||
// Impl
|
// Impl
|
||||||
vers = append(vers, &generator.DefaultPackage{
|
vers = append(vers, &generator.DefaultPackage{
|
||||||
|
@ -401,7 +538,7 @@ func versionDuckPackages(basePackage string, groupPkgName string, gv clientgenty
|
||||||
// Fake
|
// Fake
|
||||||
vers = append(vers, &generator.DefaultPackage{
|
vers = append(vers, &generator.DefaultPackage{
|
||||||
PackageName: "fake",
|
PackageName: "fake",
|
||||||
PackagePath: packagePath + "/fake",
|
PackagePath: filepath.Join(packagePath, "fake"),
|
||||||
HeaderText: boilerplate,
|
HeaderText: boilerplate,
|
||||||
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
||||||
// Impl
|
// Impl
|
||||||
|
@ -409,7 +546,7 @@ func versionDuckPackages(basePackage string, groupPkgName string, gv clientgenty
|
||||||
DefaultGen: generator.DefaultGen{
|
DefaultGen: generator.DefaultGen{
|
||||||
OptionalName: "fake",
|
OptionalName: "fake",
|
||||||
},
|
},
|
||||||
outputPackage: packagePath + "/fake",
|
outputPackage: filepath.Join(packagePath, "fake"),
|
||||||
imports: generator.NewImportTracker(),
|
imports: generator.NewImportTracker(),
|
||||||
typeToGenerate: t,
|
typeToGenerate: t,
|
||||||
groupVersion: gv,
|
groupVersion: gv,
|
||||||
|
|
131
vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller.go
vendored
Normal file
131
vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller.go
vendored
Normal file
|
@ -0,0 +1,131 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020 The Knative 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 generators
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"k8s.io/gengo/generator"
|
||||||
|
"k8s.io/gengo/namer"
|
||||||
|
"k8s.io/gengo/types"
|
||||||
|
"k8s.io/klog"
|
||||||
|
)
|
||||||
|
|
||||||
|
// reconcilerControllerGenerator produces a file for setting up the reconciler
|
||||||
|
// with injection.
|
||||||
|
type reconcilerControllerGenerator struct {
|
||||||
|
generator.DefaultGen
|
||||||
|
outputPackage string
|
||||||
|
imports namer.ImportTracker
|
||||||
|
filtered bool
|
||||||
|
|
||||||
|
clientPkg string
|
||||||
|
schemePkg string
|
||||||
|
informerPackagePath string
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ generator.Generator = (*reconcilerControllerGenerator)(nil)
|
||||||
|
|
||||||
|
func (g *reconcilerControllerGenerator) Filter(c *generator.Context, t *types.Type) bool {
|
||||||
|
// We generate a single client, so return true once.
|
||||||
|
if !g.filtered {
|
||||||
|
g.filtered = true
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *reconcilerControllerGenerator) Namers(c *generator.Context) namer.NameSystems {
|
||||||
|
return namer.NameSystems{
|
||||||
|
"raw": namer.NewRawNamer(g.outputPackage, g.imports),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *reconcilerControllerGenerator) Imports(c *generator.Context) (imports []string) {
|
||||||
|
imports = append(imports, g.imports.ImportLines()...)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *reconcilerControllerGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
||||||
|
sw := generator.NewSnippetWriter(w, c, "{{", "}}")
|
||||||
|
|
||||||
|
klog.V(5).Infof("processing type %v", t)
|
||||||
|
|
||||||
|
m := map[string]interface{}{
|
||||||
|
"type": t,
|
||||||
|
"controllerImpl": c.Universe.Type(types.Name{
|
||||||
|
Package: "knative.dev/pkg/controller",
|
||||||
|
Name: "Impl",
|
||||||
|
}),
|
||||||
|
"loggingFromContext": c.Universe.Function(types.Name{
|
||||||
|
Package: "knative.dev/pkg/logging",
|
||||||
|
Name: "FromContext",
|
||||||
|
}),
|
||||||
|
"corev1EventSource": c.Universe.Function(types.Name{
|
||||||
|
Package: "k8s.io/api/core/v1",
|
||||||
|
Name: "EventSource",
|
||||||
|
}),
|
||||||
|
"clientGet": c.Universe.Function(types.Name{
|
||||||
|
Package: g.clientPkg,
|
||||||
|
Name: "Get",
|
||||||
|
}),
|
||||||
|
"informerGet": c.Universe.Function(types.Name{
|
||||||
|
Package: g.informerPackagePath,
|
||||||
|
Name: "Get",
|
||||||
|
}),
|
||||||
|
"schemeScheme": c.Universe.Function(types.Name{
|
||||||
|
Package: "k8s.io/client-go/kubernetes/scheme",
|
||||||
|
Name: "Scheme",
|
||||||
|
}),
|
||||||
|
"schemeAddToScheme": c.Universe.Function(types.Name{
|
||||||
|
Package: g.schemePkg,
|
||||||
|
Name: "Scheme",
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
|
||||||
|
sw.Do(reconcilerControllerNewImpl, m)
|
||||||
|
|
||||||
|
return sw.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
var reconcilerControllerNewImpl = `
|
||||||
|
const (
|
||||||
|
defaultControllerAgentName = "{{.type|lowercaseSingular}}-controller"
|
||||||
|
defaultFinalizerName = "{{.type|lowercaseSingular}}"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewImpl(ctx context.Context, r Interface) *{{.controllerImpl|raw}} {
|
||||||
|
logger := {{.loggingFromContext|raw}}(ctx)
|
||||||
|
|
||||||
|
{{.type|lowercaseSingular}}Informer := {{.informerGet|raw}}(ctx)
|
||||||
|
|
||||||
|
c := &reconcilerImpl{
|
||||||
|
Client: {{.clientGet|raw}}(ctx),
|
||||||
|
Lister: {{.type|lowercaseSingular}}Informer.Lister(),
|
||||||
|
Recorder: record.NewBroadcaster().NewRecorder(
|
||||||
|
scheme.Scheme, {{.corev1EventSource|raw}}{Component: defaultControllerAgentName}),
|
||||||
|
FinalizerName: defaultFinalizerName,
|
||||||
|
reconciler: r,
|
||||||
|
}
|
||||||
|
impl := controller.NewImpl(c, logger, "{{.type|allLowercasePlural}}")
|
||||||
|
|
||||||
|
return impl
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
{{.schemeAddToScheme|raw}}({{.schemeScheme|raw}})
|
||||||
|
}
|
||||||
|
`
|
114
vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller_stub.go
vendored
Normal file
114
vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller_stub.go
vendored
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020 The Knative 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 generators
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"k8s.io/gengo/generator"
|
||||||
|
"k8s.io/gengo/namer"
|
||||||
|
"k8s.io/gengo/types"
|
||||||
|
"k8s.io/klog"
|
||||||
|
)
|
||||||
|
|
||||||
|
// reconcilerControllerStubGenerator produces a file of the stub of the
|
||||||
|
// controller for a custom impl with injection.
|
||||||
|
type reconcilerControllerStubGenerator struct {
|
||||||
|
generator.DefaultGen
|
||||||
|
outputPackage string
|
||||||
|
imports namer.ImportTracker
|
||||||
|
filtered bool
|
||||||
|
|
||||||
|
reconcilerPkg string
|
||||||
|
informerPackagePath string
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ generator.Generator = (*reconcilerControllerStubGenerator)(nil)
|
||||||
|
|
||||||
|
func (g *reconcilerControllerStubGenerator) Filter(c *generator.Context, t *types.Type) bool {
|
||||||
|
// We generate a single client, so return true once.
|
||||||
|
if !g.filtered {
|
||||||
|
g.filtered = true
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *reconcilerControllerStubGenerator) Namers(c *generator.Context) namer.NameSystems {
|
||||||
|
return namer.NameSystems{
|
||||||
|
"raw": namer.NewRawNamer(g.outputPackage, g.imports),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *reconcilerControllerStubGenerator) Imports(c *generator.Context) (imports []string) {
|
||||||
|
imports = append(imports, g.imports.ImportLines()...)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *reconcilerControllerStubGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
||||||
|
sw := generator.NewSnippetWriter(w, c, "{{", "}}")
|
||||||
|
|
||||||
|
klog.V(5).Infof("processing type %v", t)
|
||||||
|
|
||||||
|
m := map[string]interface{}{
|
||||||
|
"type": t,
|
||||||
|
"informerGet": c.Universe.Function(types.Name{
|
||||||
|
Package: g.informerPackagePath,
|
||||||
|
Name: "Get",
|
||||||
|
}),
|
||||||
|
"controllerImpl": c.Universe.Type(types.Name{Package: "knative.dev/pkg/controller", Name: "Impl"}),
|
||||||
|
"reconcilerNewImpl": c.Universe.Type(types.Name{
|
||||||
|
Package: g.reconcilerPkg,
|
||||||
|
Name: "NewImpl",
|
||||||
|
}),
|
||||||
|
"loggingFromContext": c.Universe.Function(types.Name{
|
||||||
|
Package: "knative.dev/pkg/logging",
|
||||||
|
Name: "FromContext",
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
|
||||||
|
sw.Do(reconcilerControllerStub, m)
|
||||||
|
|
||||||
|
return sw.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
var reconcilerControllerStub = `
|
||||||
|
// TODO: PLEASE COPY AND MODIFY THIS FILE AS A STARTING POINT
|
||||||
|
|
||||||
|
// NewController creates a Reconciler for {{.type|public}} and returns the result of NewImpl.
|
||||||
|
func NewController(
|
||||||
|
ctx context.Context,
|
||||||
|
cmw configmap.Watcher,
|
||||||
|
) *{{.controllerImpl|raw}} {
|
||||||
|
logger := {{.loggingFromContext|raw}}(ctx)
|
||||||
|
|
||||||
|
{{.type|lowercaseSingular}}Informer := {{.informerGet|raw}}(ctx)
|
||||||
|
|
||||||
|
// TODO: setup additional informers here.
|
||||||
|
|
||||||
|
r := &Reconciler{}
|
||||||
|
impl := {{.reconcilerNewImpl|raw}}(ctx, r)
|
||||||
|
|
||||||
|
logger.Info("Setting up event handlers.")
|
||||||
|
|
||||||
|
{{.type|lowercaseSingular}}Informer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
|
||||||
|
|
||||||
|
// TODO: add additional informer event handlers here.
|
||||||
|
|
||||||
|
return impl
|
||||||
|
}
|
||||||
|
`
|
356
vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler.go
vendored
Normal file
356
vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler.go
vendored
Normal file
|
@ -0,0 +1,356 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020 The Knative 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 generators
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"k8s.io/gengo/generator"
|
||||||
|
"k8s.io/gengo/namer"
|
||||||
|
"k8s.io/gengo/types"
|
||||||
|
"k8s.io/klog"
|
||||||
|
)
|
||||||
|
|
||||||
|
// reconcilerReconcilerGenerator produces a reconciler struct for the given type.
|
||||||
|
type reconcilerReconcilerGenerator struct {
|
||||||
|
generator.DefaultGen
|
||||||
|
outputPackage string
|
||||||
|
imports namer.ImportTracker
|
||||||
|
filtered bool
|
||||||
|
clientsetPkg string
|
||||||
|
listerName string
|
||||||
|
listerPkg string
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ generator.Generator = (*reconcilerReconcilerGenerator)(nil)
|
||||||
|
|
||||||
|
func (g *reconcilerReconcilerGenerator) Filter(c *generator.Context, t *types.Type) bool {
|
||||||
|
// We generate a single client, so return true once.
|
||||||
|
if !g.filtered {
|
||||||
|
g.filtered = true
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *reconcilerReconcilerGenerator) Namers(c *generator.Context) namer.NameSystems {
|
||||||
|
return namer.NameSystems{
|
||||||
|
"raw": namer.NewRawNamer(g.outputPackage, g.imports),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *reconcilerReconcilerGenerator) Imports(c *generator.Context) (imports []string) {
|
||||||
|
imports = append(imports, g.imports.ImportLines()...)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *reconcilerReconcilerGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
||||||
|
sw := generator.NewSnippetWriter(w, c, "{{", "}}")
|
||||||
|
|
||||||
|
klog.V(5).Infof("processing type %v", t)
|
||||||
|
|
||||||
|
m := map[string]interface{}{
|
||||||
|
"type": t,
|
||||||
|
|
||||||
|
"controllerImpl": c.Universe.Type(types.Name{
|
||||||
|
Package: "knative.dev/pkg/controller",
|
||||||
|
Name: "Impl",
|
||||||
|
}),
|
||||||
|
"controllerReconciler": c.Universe.Type(types.Name{
|
||||||
|
Package: "knative.dev/pkg/controller",
|
||||||
|
Name: "Reconciler",
|
||||||
|
}),
|
||||||
|
"corev1EventSource": c.Universe.Function(types.Name{
|
||||||
|
Package: "k8s.io/api/core/v1",
|
||||||
|
Name: "EventSource",
|
||||||
|
}),
|
||||||
|
"corev1EventTypeNormal": c.Universe.Type(types.Name{
|
||||||
|
Package: "k8s.io/api/core/v1",
|
||||||
|
Name: "EventTypeNormal",
|
||||||
|
}),
|
||||||
|
"corev1EventTypeWarning": c.Universe.Type(types.Name{
|
||||||
|
Package: "k8s.io/api/core/v1",
|
||||||
|
Name: "EventTypeWarning",
|
||||||
|
}),
|
||||||
|
"reconcilerEvent": c.Universe.Type(types.Name{Package: "knative.dev/pkg/reconciler", Name: "Event"}),
|
||||||
|
"reconcilerReconcilerEvent": c.Universe.Type(types.Name{Package: "knative.dev/pkg/reconciler", Name: "ReconcilerEvent"}),
|
||||||
|
// Deps
|
||||||
|
"clientsetInterface": c.Universe.Type(types.Name{Name: "Interface", Package: g.clientsetPkg}),
|
||||||
|
"resourceLister": c.Universe.Type(types.Name{Name: g.listerName, Package: g.listerPkg}),
|
||||||
|
// K8s types
|
||||||
|
"recordEventRecorder": c.Universe.Type(types.Name{Name: "EventRecorder", Package: "k8s.io/client-go/tools/record"}),
|
||||||
|
// methods
|
||||||
|
"loggingFromContext": c.Universe.Function(types.Name{
|
||||||
|
Package: "knative.dev/pkg/logging",
|
||||||
|
Name: "FromContext",
|
||||||
|
}),
|
||||||
|
"cacheSplitMetaNamespaceKey": c.Universe.Function(types.Name{
|
||||||
|
Package: "k8s.io/client-go/tools/cache",
|
||||||
|
Name: "SplitMetaNamespaceKey",
|
||||||
|
}),
|
||||||
|
"retryRetryOnConflict": c.Universe.Function(types.Name{
|
||||||
|
Package: "k8s.io/client-go/util/retry",
|
||||||
|
Name: "RetryOnConflict",
|
||||||
|
}),
|
||||||
|
"apierrsIsNotFound": c.Universe.Function(types.Name{
|
||||||
|
Package: "k8s.io/apimachinery/pkg/api/errors",
|
||||||
|
Name: "IsNotFound",
|
||||||
|
}),
|
||||||
|
"metav1GetOptions": c.Universe.Function(types.Name{
|
||||||
|
Package: "k8s.io/apimachinery/pkg/apis/meta/v1",
|
||||||
|
Name: "GetOptions",
|
||||||
|
}),
|
||||||
|
"zapSugaredLogger": c.Universe.Type(types.Name{
|
||||||
|
Package: "go.uber.org/zap",
|
||||||
|
Name: "SugaredLogger",
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
|
||||||
|
sw.Do(reconcilerInterfaceFactory, m)
|
||||||
|
sw.Do(reconcilerNewReconciler, m)
|
||||||
|
sw.Do(reconcilerImplFactory, m)
|
||||||
|
sw.Do(reconcilerStatusFactory, m)
|
||||||
|
// TODO(n3wscott): Follow-up to add support for managing finalizers.
|
||||||
|
// sw.Do(reconcilerFinalizerFactory, m)
|
||||||
|
|
||||||
|
return sw.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
var reconcilerInterfaceFactory = `
|
||||||
|
// Interface defines the strongly typed interfaces to be implemented by a
|
||||||
|
// controller reconciling {{.type|raw}}.
|
||||||
|
type Interface interface {
|
||||||
|
// ReconcileKind implements custom logic to reconcile {{.type|raw}}. Any changes
|
||||||
|
// to the objects .Status or .Finalizers will be propagated to the stored
|
||||||
|
// object. It is recommended that implementors do not call any update calls
|
||||||
|
// for the Kind inside of ReconcileKind, it is the responsibility of the calling
|
||||||
|
// controller to propagate those properties.
|
||||||
|
ReconcileKind(ctx context.Context, o *{{.type|raw}}) {{.reconcilerEvent|raw}}
|
||||||
|
}
|
||||||
|
|
||||||
|
// reconcilerImpl implements controller.Reconciler for {{.type|raw}} resources.
|
||||||
|
type reconcilerImpl struct {
|
||||||
|
// Client is used to write back status updates.
|
||||||
|
Client {{.clientsetInterface|raw}}
|
||||||
|
|
||||||
|
// Listers index properties about resources
|
||||||
|
Lister {{.resourceLister|raw}}
|
||||||
|
|
||||||
|
// Recorder is an event recorder for recording Event resources to the
|
||||||
|
// Kubernetes API.
|
||||||
|
Recorder {{.recordEventRecorder|raw}}
|
||||||
|
|
||||||
|
// FinalizerName is the name of the finalizer to use when finalizing the
|
||||||
|
// resource.
|
||||||
|
FinalizerName string
|
||||||
|
|
||||||
|
// reconciler is the implementation of the business logic of the resource.
|
||||||
|
reconciler Interface
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that our Reconciler implements controller.Reconciler
|
||||||
|
var _ controller.Reconciler = (*reconcilerImpl)(nil)
|
||||||
|
|
||||||
|
`
|
||||||
|
|
||||||
|
var reconcilerNewReconciler = `
|
||||||
|
func NewReconciler(ctx context.Context, logger *{{.zapSugaredLogger|raw}}, client {{.clientsetInterface|raw}}, lister {{.resourceLister|raw}}, recorder {{.recordEventRecorder|raw}}, r Interface) {{.controllerReconciler|raw}} {
|
||||||
|
return &reconcilerImpl{
|
||||||
|
Client: client,
|
||||||
|
Lister: lister,
|
||||||
|
Recorder: recorder,
|
||||||
|
FinalizerName: defaultFinalizerName,
|
||||||
|
reconciler: r,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
var reconcilerImplFactory = `
|
||||||
|
// Reconcile implements controller.Reconciler
|
||||||
|
func (r *reconcilerImpl) Reconcile(ctx context.Context, key string) error {
|
||||||
|
logger := {{.loggingFromContext|raw}}(ctx)
|
||||||
|
|
||||||
|
// Convert the namespace/name string into a distinct namespace and name
|
||||||
|
namespace, name, err := {{.cacheSplitMetaNamespaceKey|raw}}(key)
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("invalid resource key: %s", key)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(n3wscott): this is needed for serving.
|
||||||
|
// If our controller has configuration state, we'd "freeze" it and
|
||||||
|
// attach the frozen configuration to the context.
|
||||||
|
// ctx = r.configStore.ToContext(ctx)
|
||||||
|
|
||||||
|
// Get the resource with this namespace/name.
|
||||||
|
original, err := r.Lister.{{.type|apiGroup}}(namespace).Get(name)
|
||||||
|
if {{.apierrsIsNotFound|raw}}(err) {
|
||||||
|
// The resource may no longer exist, in which case we stop processing.
|
||||||
|
logger.Errorf("resource %q no longer exists", key)
|
||||||
|
return nil
|
||||||
|
} else if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Don't modify the informers copy.
|
||||||
|
resource := original.DeepCopy()
|
||||||
|
|
||||||
|
// Reconcile this copy of the resource and then write back any status
|
||||||
|
// updates regardless of whether the reconciliation errored out.
|
||||||
|
reconcileEvent := r.reconciler.ReconcileKind(ctx, resource)
|
||||||
|
|
||||||
|
// TODO(n3wscott): Follow-up to add support for managing finalizers.
|
||||||
|
// Synchronize the finalizers.
|
||||||
|
//if equality.Semantic.DeepEqual(original.Finalizers, resource.Finalizers) {
|
||||||
|
// // If we didn't change finalizers then don't call updateFinalizers.
|
||||||
|
//} else if _, updated, fErr := r.updateFinalizers(ctx, resource); fErr != nil {
|
||||||
|
// logger.Warnw("Failed to update finalizers", zap.Error(fErr))
|
||||||
|
// r.Recorder.Eventf(resource, {{.corev1EventTypeWarning|raw}}, "UpdateFailed",
|
||||||
|
// "Failed to update finalizers for %q: %v", resource.Name, fErr)
|
||||||
|
// return fErr
|
||||||
|
//} else if updated {
|
||||||
|
// // There was a difference and updateFinalizers said it updated and did not return an error.
|
||||||
|
// r.Recorder.Eventf(resource, {{.corev1EventTypeNormal|raw}}, "Updated", "Updated %q finalizers", resource.GetName())
|
||||||
|
//}
|
||||||
|
|
||||||
|
// Synchronize the status.
|
||||||
|
if equality.Semantic.DeepEqual(original.Status, resource.Status) {
|
||||||
|
// If we didn't change anything then don't call updateStatus.
|
||||||
|
// This is important because the copy we loaded from the injectionInformer's
|
||||||
|
// cache may be stale and we don't want to overwrite a prior update
|
||||||
|
// to status with this stale state.
|
||||||
|
} else if err = r.updateStatus(original, resource); err != nil {
|
||||||
|
logger.Warnw("Failed to update resource status", zap.Error(err))
|
||||||
|
r.Recorder.Eventf(resource, {{.corev1EventTypeWarning|raw}}, "UpdateFailed",
|
||||||
|
"Failed to update status for %q: %v", resource.Name, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Report the reconciler event, if any.
|
||||||
|
if reconcileEvent != nil {
|
||||||
|
logger.Errorw("ReconcileKind returned an event", zap.Error(reconcileEvent))
|
||||||
|
var event *{{.reconcilerReconcilerEvent|raw}}
|
||||||
|
if reconciler.EventAs(reconcileEvent, &event) {
|
||||||
|
r.Recorder.Eventf(resource, event.EventType, event.Reason, event.Format, event.Args...)
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
r.Recorder.Event(resource, {{.corev1EventTypeWarning|raw}}, "InternalError", reconcileEvent.Error())
|
||||||
|
return reconcileEvent.Error()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
var reconcilerStatusFactory = `
|
||||||
|
func (r *reconcilerImpl) updateStatus(existing *{{.type|raw}}, desired *{{.type|raw}}) error {
|
||||||
|
existing = existing.DeepCopy()
|
||||||
|
return RetryUpdateConflicts(func(attempts int) (err error) {
|
||||||
|
// The first iteration tries to use the injectionInformer's state, subsequent attempts fetch the latest state via API.
|
||||||
|
if attempts > 0 {
|
||||||
|
existing, err = r.Client.{{.type|versionedClientset}}().{{.type|apiGroup}}(desired.Namespace).Get(desired.Name, {{.metav1GetOptions|raw}}{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there's nothing to update, just return.
|
||||||
|
if reflect.DeepEqual(existing.Status, desired.Status) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
existing.Status = desired.Status
|
||||||
|
_, err = r.Client.{{.type|versionedClientset}}().{{.type|apiGroup}}(existing.Namespace).UpdateStatus(existing)
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: move this to knative.dev/pkg/reconciler
|
||||||
|
// RetryUpdateConflicts retries the inner function if it returns conflict errors.
|
||||||
|
// This can be used to retry status updates without constantly reenqueuing keys.
|
||||||
|
func RetryUpdateConflicts(updater func(int) error) error {
|
||||||
|
attempts := 0
|
||||||
|
return {{.retryRetryOnConflict|raw}}(retry.DefaultRetry, func() error {
|
||||||
|
err := updater(attempts)
|
||||||
|
attempts++
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
var reconcilerFinalizerFactory = `
|
||||||
|
// Update the Finalizers of the resource.
|
||||||
|
func (r *reconcilerImpl) updateFinalizers(ctx context.Context, desired *{{.type|raw}}) (*{{.type|raw}}, bool, error) {
|
||||||
|
actual, err := r.Lister.{{.type|apiGroup}}(desired.Namespace).Get(desired.Name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't modify the informers copy.
|
||||||
|
existing := actual.DeepCopy()
|
||||||
|
|
||||||
|
var finalizers []string
|
||||||
|
|
||||||
|
// If there's nothing to update, just return.
|
||||||
|
existingFinalizers := sets.NewString(existing.Finalizers...)
|
||||||
|
desiredFinalizers := sets.NewString(desired.Finalizers...)
|
||||||
|
|
||||||
|
if desiredFinalizers.Has(r.FinalizerName) {
|
||||||
|
if existingFinalizers.Has(r.FinalizerName) {
|
||||||
|
// Nothing to do.
|
||||||
|
return desired, false, nil
|
||||||
|
}
|
||||||
|
// Add the finalizer.
|
||||||
|
finalizers = append(existing.Finalizers, r.FinalizerName)
|
||||||
|
} else {
|
||||||
|
if !existingFinalizers.Has(r.FinalizerName) {
|
||||||
|
// Nothing to do.
|
||||||
|
return desired, false, nil
|
||||||
|
}
|
||||||
|
// Remove the finalizer.
|
||||||
|
existingFinalizers.Delete(r.FinalizerName)
|
||||||
|
finalizers = existingFinalizers.List()
|
||||||
|
}
|
||||||
|
|
||||||
|
mergePatch := map[string]interface{}{
|
||||||
|
"metadata": map[string]interface{}{
|
||||||
|
"finalizers": finalizers,
|
||||||
|
"resourceVersion": existing.ResourceVersion,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
patch, err := json.Marshal(mergePatch)
|
||||||
|
if err != nil {
|
||||||
|
return desired, false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
update, err := r.Client.{{.type|versionedClientset}}().{{.type|apiGroup}}(desired.Namespace).Patch(existing.Name, types.MergePatchType, patch)
|
||||||
|
return update, true, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *reconcilerImpl) setFinalizer(a *{{.type|raw}}) {
|
||||||
|
finalizers := sets.NewString(a.Finalizers...)
|
||||||
|
finalizers.Insert(r.FinalizerName)
|
||||||
|
a.Finalizers = finalizers.List()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *reconcilerImpl) unsetFinalizer(a *{{.type|raw}}) {
|
||||||
|
finalizers := sets.NewString(a.Finalizers...)
|
||||||
|
finalizers.Delete(r.FinalizerName)
|
||||||
|
a.Finalizers = finalizers.List()
|
||||||
|
}
|
||||||
|
`
|
122
vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler_stub.go
vendored
Normal file
122
vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler_stub.go
vendored
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020 The Knative 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 generators
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"k8s.io/gengo/generator"
|
||||||
|
"k8s.io/gengo/namer"
|
||||||
|
"k8s.io/gengo/types"
|
||||||
|
"k8s.io/klog"
|
||||||
|
)
|
||||||
|
|
||||||
|
// reconcilerReconcilerStubGenerator produces a file of the stub of how to
|
||||||
|
// implement the reconciler.
|
||||||
|
type reconcilerReconcilerStubGenerator struct {
|
||||||
|
generator.DefaultGen
|
||||||
|
outputPackage string
|
||||||
|
imports namer.ImportTracker
|
||||||
|
filtered bool
|
||||||
|
|
||||||
|
reconcilerPkg string
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ generator.Generator = (*reconcilerReconcilerStubGenerator)(nil)
|
||||||
|
|
||||||
|
func (g *reconcilerReconcilerStubGenerator) Filter(c *generator.Context, t *types.Type) bool {
|
||||||
|
// We generate a single client, so return true once.
|
||||||
|
if !g.filtered {
|
||||||
|
g.filtered = true
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *reconcilerReconcilerStubGenerator) Namers(c *generator.Context) namer.NameSystems {
|
||||||
|
return namer.NameSystems{
|
||||||
|
"raw": namer.NewRawNamer(g.outputPackage, g.imports),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *reconcilerReconcilerStubGenerator) Imports(c *generator.Context) (imports []string) {
|
||||||
|
imports = append(imports, g.imports.ImportLines()...)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *reconcilerReconcilerStubGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
||||||
|
sw := generator.NewSnippetWriter(w, c, "{{", "}}")
|
||||||
|
|
||||||
|
klog.V(5).Infof("processing type %v", t)
|
||||||
|
|
||||||
|
m := map[string]interface{}{
|
||||||
|
"type": t,
|
||||||
|
"reconcilerEvent": c.Universe.Type(types.Name{
|
||||||
|
Package: "knative.dev/pkg/reconciler",
|
||||||
|
Name: "Event",
|
||||||
|
}),
|
||||||
|
"reconcilerNewEvent": c.Universe.Function(types.Name{
|
||||||
|
Package: "knative.dev/pkg/reconciler",
|
||||||
|
Name: "NewEvent",
|
||||||
|
}),
|
||||||
|
"reconcilerInterface": c.Universe.Type(types.Name{
|
||||||
|
Package: g.reconcilerPkg,
|
||||||
|
Name: "Interface",
|
||||||
|
}),
|
||||||
|
"corev1EventTypeNormal": c.Universe.Type(types.Name{
|
||||||
|
Package: "k8s.io/api/core/v1",
|
||||||
|
Name: "EventTypeNormal",
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
|
||||||
|
sw.Do(reconcilerReconcilerStub, m)
|
||||||
|
|
||||||
|
return sw.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
var reconcilerReconcilerStub = `
|
||||||
|
// TODO: PLEASE COPY AND MODIFY THIS FILE AS A STARTING POINT
|
||||||
|
|
||||||
|
// newReconciledNormal makes a new reconciler event with event type Normal, and
|
||||||
|
// reason {{.type|public}}Reconciled.
|
||||||
|
func newReconciledNormal(namespace, name string) reconciler.Event {
|
||||||
|
return {{.reconcilerNewEvent|raw}}({{.corev1EventTypeNormal|raw}}, "{{.type|public}}Reconciled", "{{.type|public}} reconciled: \"%s/%s\"", namespace, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reconciler implements controller.Reconciler for {{.type|public}} resources.
|
||||||
|
type Reconciler struct {
|
||||||
|
// TODO: add additional requirements here.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that our Reconciler implements Interface
|
||||||
|
var _ {{.reconcilerInterface|raw}} = (*Reconciler)(nil)
|
||||||
|
|
||||||
|
// ReconcileKind implements Interface.ReconcileKind.
|
||||||
|
func (r *Reconciler) ReconcileKind(ctx context.Context, o *{{.type|raw}}) {{.reconcilerEvent|raw}} {
|
||||||
|
if o.GetDeletionTimestamp() != nil {
|
||||||
|
// Check for a DeletionTimestamp. If present, elide the normal reconcile logic.
|
||||||
|
// When a controller needs finalizer handling, it would go here.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
o.Status.InitializeConditions()
|
||||||
|
|
||||||
|
// TODO: add custom reconciliation logic here.
|
||||||
|
|
||||||
|
o.Status.ObservedGeneration = o.Generation
|
||||||
|
return newReconciledNormal(o.Namespace, o.Name)
|
||||||
|
}
|
||||||
|
`
|
|
@ -80,6 +80,10 @@ if grep -qw "injection" <<<"${GENS}"; then
|
||||||
EXTERNAL_INFORMER_PKG="${CLIENT_PKG}/informers/externalversions"
|
EXTERNAL_INFORMER_PKG="${CLIENT_PKG}/informers/externalversions"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ -z "${LISTERS_PKG:-}" ]]; then
|
||||||
|
LISTERS_PKG="${CLIENT_PKG}/listers"
|
||||||
|
fi
|
||||||
|
|
||||||
echo "Generating injection for ${GROUPS_WITH_VERSIONS} at ${OUTPUT_PKG}"
|
echo "Generating injection for ${GROUPS_WITH_VERSIONS} at ${OUTPUT_PKG}"
|
||||||
|
|
||||||
# Clear old injection
|
# Clear old injection
|
||||||
|
@ -89,7 +93,7 @@ if grep -qw "injection" <<<"${GENS}"; then
|
||||||
--input-dirs $(codegen::join , "${FQ_APIS[@]}") \
|
--input-dirs $(codegen::join , "${FQ_APIS[@]}") \
|
||||||
--versioned-clientset-package ${VERSIONED_CLIENTSET_PKG} \
|
--versioned-clientset-package ${VERSIONED_CLIENTSET_PKG} \
|
||||||
--external-versions-informers-package ${EXTERNAL_INFORMER_PKG} \
|
--external-versions-informers-package ${EXTERNAL_INFORMER_PKG} \
|
||||||
|
--listers-package ${LISTERS_PKG} \
|
||||||
--output-package ${OUTPUT_PKG} \
|
--output-package ${OUTPUT_PKG} \
|
||||||
"$@"
|
"$@"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue