diff --git a/cmd/kubebuilder-gen/internal/controllergen/inject.go b/cmd/kubebuilder-gen/internal/controllergen/inject.go index c06a987f231..70163859f06 100644 --- a/cmd/kubebuilder-gen/internal/controllergen/inject.go +++ b/cmd/kubebuilder-gen/internal/controllergen/inject.go @@ -46,7 +46,6 @@ func (d *injectGenerator) Imports(c *generator.Context) []string { "time", "github.com/kubernetes-sigs/kubebuilder/pkg/controller", "k8s.io/client-go/rest", - "github.com/kubernetes-sigs/kubebuilder/pkg/controller", repo + "/pkg/controller/sharedinformers", repo + "/pkg/client/informers_generated/externalversions", repo + "/pkg/inject/args", @@ -65,12 +64,12 @@ func (d *injectGenerator) Imports(c *generator.Context) []string { libs := map[string]string{} for i := range d.APIS.Informers { - libs[i.Group + i.Version] = "k8s.io/api/" +i.Group + "/" + i.Version - } + libs[i.Group+i.Version] = "k8s.io/api/" + i.Group + "/" + i.Version + } - for i, d := range libs { - im = append(im, fmt.Sprintf("%s \"%s\"", i, d)) - } + for i, d := range libs { + im = append(im, fmt.Sprintf("%s \"%s\"", i, d)) + } // Import package for each API groupversion gvk := map[string]string{} @@ -101,42 +100,50 @@ func (d *injectGenerator) Finalize(context *generator.Context, w io.Writer) erro var injectAPITemplate = ` func init() { // Inject Informers - SetInformers = func(arguments args.InjectArgs) { + Inject = append(Inject, func(arguments args.InjectArgs) error { + Injector.ControllerManager = arguments.ControllerManager + {{ range $group := .APIS.Groups }}{{ range $version := $group.Versions }}{{ range $res := $version.Resources -}} - arguments.ControllerManager.AddInformerProvider(&{{.Group}}{{.Version}}.{{.Kind}}{}, arguments.Informers.{{title .Group}}().{{title .Version}}().{{plural .Kind}}()) + if err := arguments.ControllerManager.AddInformerProvider(&{{.Group}}{{.Version}}.{{.Kind}}{}, arguments.Informers.{{title .Group}}().{{title .Version}}().{{plural .Kind}}()); err != nil { + return err + } {{ end }}{{ end }}{{ end }} // Add Kubernetes informers {{ range $informer, $found := .APIS.Informers -}} - arguments.ControllerManager.AddInformerProvider(&{{$informer.Group}}{{$informer.Version}}.{{$informer.Kind}}{}, arguments.KubernetesInformers.{{title $informer.Group}}().{{title $informer.Version}}().{{plural $informer.Kind}}()) + if err := arguments.ControllerManager.AddInformerProvider(&{{$informer.Group}}{{$informer.Version}}.{{$informer.Kind}}{}, arguments.KubernetesInformers.{{title $informer.Group}}().{{title $informer.Version}}().{{plural $informer.Kind}}()); err != nil { + return err + } {{ end }} - } - - - // Inject Controllers - {{ range $c := .Controllers -}} - Controllers = append(Controllers, {{ $c.Pkg.Name }}.ProvideController) - {{ end -}} + {{ range $c := .Controllers -}} + if c, err := {{ $c.Pkg.Name }}.ProvideController(arguments); err != nil { + return err + } else { + arguments.ControllerManager.AddController(c) + } + {{ end -}} + return nil + }) // Inject CRDs {{ range $group := .APIS.Groups -}} {{ range $version := $group.Versions -}} {{ range $res := $version.Resources -}} - CRDs = append(CRDs, &{{ $group.Group }}{{ $version.Version }}.{{$res.Kind}}CRD) + Injector.CRDs = append(Injector.CRDs, &{{ $group.Group }}{{ $version.Version }}.{{$res.Kind}}CRD) {{ end }}{{ end }}{{ end -}} // Inject PolicyRules {{ range $group := .APIS.Groups -}} - PolicyRules = append(PolicyRules, rbacv1.PolicyRule{ + Injector.PolicyRules = append(Injector.PolicyRules, rbacv1.PolicyRule{ APIGroups: []string{"{{ $group.Group }}.{{ $group.Domain }}"}, Resources: []string{"*"}, Verbs: []string{"*"}, }) {{ end -}} {{ range $rule := .APIS.GetRules -}} - PolicyRules = append(PolicyRules, rbacv1.PolicyRule{ + Injector.PolicyRules = append(Injector.PolicyRules, rbacv1.PolicyRule{ APIGroups: []string{ {{ range $group := $rule.APIGroups -}}"{{ $group }}",{{ end }} }, @@ -153,10 +160,15 @@ func init() { // Inject GroupVersions {{ range $group := .APIS.Groups -}} {{ range $version := $group.Versions -}} - GroupVersions = append(GroupVersions, schema.GroupVersion{ + Injector.GroupVersions = append(Injector.GroupVersions, schema.GroupVersion{ Group: "{{ $group.Group }}.{{ $group.Domain }}", Version: "{{ $version.Version }}", }) {{ end }}{{ end -}} + + Injector.RunFns = append(Injector.RunFns, func(arguments run.RunArguments) error { + Injector.ControllerManager.RunInformersAndControllers(arguments) + return nil + }) } ` diff --git a/cmd/kubebuilder/create/resource/controllertest.go b/cmd/kubebuilder/create/resource/controllertest.go index 44412a94e80..1b5d019b708 100644 --- a/cmd/kubebuilder/create/resource/controllertest.go +++ b/cmd/kubebuilder/create/resource/controllertest.go @@ -73,7 +73,7 @@ func TestBee(t *testing.T) { } var _ = BeforeSuite(func() { - testenv = &test.TestEnvironment{CRDs: inject.CRDs} + testenv = &test.TestEnvironment{CRDs: inject.Injector.CRDs} var err error config, err = testenv.Start() Expect(err).NotTo(HaveOccurred()) diff --git a/cmd/kubebuilder/create/resource/resourcetest.go b/cmd/kubebuilder/create/resource/resourcetest.go index 2bda2b0cb48..a2721f3e964 100644 --- a/cmd/kubebuilder/create/resource/resourcetest.go +++ b/cmd/kubebuilder/create/resource/resourcetest.go @@ -65,7 +65,7 @@ func Test{{title .Version}}(t *testing.T) { } var _ = BeforeSuite(func() { - testenv = &test.TestEnvironment{CRDs: inject.CRDs} + testenv = &test.TestEnvironment{CRDs: inject.Injector.CRDs} var err error config, err = testenv.Start() diff --git a/cmd/kubebuilder/initproject/controller.go b/cmd/kubebuilder/initproject/controller.go index 6cdc17eed83..e03c7462fa1 100644 --- a/cmd/kubebuilder/initproject/controller.go +++ b/cmd/kubebuilder/initproject/controller.go @@ -70,7 +70,7 @@ func main() { config := configlib.GetConfigOrDie() if *installCRDs { - if err := install.NewInstaller(config).Install(&InstallStrategy{crds: inject.CRDs}); err != nil { + if err := install.NewInstaller(config).Install(&InstallStrategy{crds: inject.Injector.CRDs}); err != nil { log.Fatalf("Could not create CRDs: %v", err) } } diff --git a/cmd/kubebuilder/initproject/init.go b/cmd/kubebuilder/initproject/init.go index 7e46353a4d5..0727d78f2c1 100644 --- a/cmd/kubebuilder/initproject/init.go +++ b/cmd/kubebuilder/initproject/init.go @@ -67,7 +67,6 @@ func runInitRepo(cmd *cobra.Command, args []string) { filepath.Join("hack"), filepath.Join("pkg"), filepath.Join("pkg", "controller"), - filepath.Join("pkg", "controller", "args"), filepath.Join("pkg", "inject"), //filepath.Join("pkg", "openapi"), } diff --git a/cmd/kubebuilder/initproject/inject.go b/cmd/kubebuilder/initproject/inject.go index f51ef2ea84c..63aa72d5443 100644 --- a/cmd/kubebuilder/initproject/inject.go +++ b/cmd/kubebuilder/initproject/inject.go @@ -39,73 +39,32 @@ var injectControllerTemplate = `{{.BoilerPlate}} package inject import ( - "github.com/kubernetes-sigs/kubebuilder/pkg/controller" "github.com/kubernetes-sigs/kubebuilder/pkg/inject/run" - apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" - rbacv1 "k8s.io/api/rbac/v1" - "k8s.io/apimachinery/pkg/runtime/schema" + injectargs "github.com/kubernetes-sigs/kubebuilder/pkg/inject/args" "{{.Repo}}/pkg/inject/args" ) var ( - CRDs = []*apiextensionsv1beta1.CustomResourceDefinition{} + // Inject is used to add items to the Injector + Inject []func(args.InjectArgs) error - PolicyRules = []rbacv1.PolicyRule{} - - GroupVersions = []schema.GroupVersion{} - - - // Controllers provides the controllers to run - // Should be set by code generation in this package. - Controllers = []func(args args.InjectArgs) (*controller.GenericController, error){} - - RunningControllers = map[string]*controller.GenericController{} - - // SetInformers adds the informers for the apis defined in this project. - // Should be set by code generation in this package. - SetInformers func(args.InjectArgs) - - // Inject may be set by generated code - Inject func(args.InjectArgs) error - - // Run may be set by generated code - Run func(run.RunArguments) error + // Injector runs items + Injector injectargs.Injector ) // RunAll starts all of the informers and Controllers -func RunAll(options run.RunArguments, arguments args.InjectArgs) error { - if Inject != nil { - if err := Inject(arguments); err != nil { - return err - } - } - if SetInformers != nil { - SetInformers(arguments) - } - for _, fn := range Controllers { - if c, err := fn(arguments); err != nil { - return err - } else { - arguments.ControllerManager.AddController(c) - } - } - arguments.ControllerManager.RunInformersAndControllers(options) - - if Run != nil { - if err := Run(options); err != nil { +func RunAll(rargs run.RunArguments, iargs args.InjectArgs) error { + // Run functions to initialize injector + for _, i := range Inject { + if err := i(iargs); err != nil { return err } } - <-options.Stop + Injector.Run(rargs) + <-rargs.Stop return nil } - -type Injector struct {} - -func (Injector) GetCRDs() []*apiextensionsv1beta1.CustomResourceDefinition {return CRDs} -func (Injector) GetPolicyRules() []rbacv1.PolicyRule {return PolicyRules} -func (Injector) GetGroupVersions() []schema.GroupVersion {return GroupVersions} ` func doArgs(boilerplate string) bool { diff --git a/pkg/inject/args/args.go b/pkg/inject/args/args.go index 997603be9e9..10791ea4a14 100644 --- a/pkg/inject/args/args.go +++ b/pkg/inject/args/args.go @@ -17,13 +17,17 @@ limitations under the License. package args import ( - "time" + "time" "github.com/kubernetes-sigs/kubebuilder/pkg/admission" "github.com/kubernetes-sigs/kubebuilder/pkg/controller" + "github.com/kubernetes-sigs/kubebuilder/pkg/inject/run" + rbacv1 "k8s.io/api/rbac/v1" + apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" - "k8s.io/client-go/informers" ) // InjectArgs are the common arguments for initializing controllers and admission hooks @@ -46,12 +50,37 @@ type InjectArgs struct { // CreateInjectArgs returns new arguments for initializing objects func CreateInjectArgs(config *rest.Config) InjectArgs { - cs := kubernetes.NewForConfigOrDie(config) + cs := kubernetes.NewForConfigOrDie(config) return InjectArgs{ Config: config, KubernetesClientSet: cs, - KubernetesInformers: informers.NewSharedInformerFactory(cs, 2 * time.Minute), + KubernetesInformers: informers.NewSharedInformerFactory(cs, 2*time.Minute), ControllerManager: &controller.ControllerManager{}, AdmissionHandler: &admission.AdmissionManager{}, } } + +type Injector struct { + CRDs []*apiextensionsv1beta1.CustomResourceDefinition + PolicyRules []rbacv1.PolicyRule + GroupVersions []schema.GroupVersion + Runnables []Runnable + RunFns []RunFn + ControllerManager *controller.ControllerManager +} + +func (i Injector) Run(a run.RunArguments) error { + for _, r := range i.Runnables { + go r.Run(a) + } + for _, r := range i.RunFns { + go r(a) + } + return nil +} + +type RunFn func(arguments run.RunArguments) error + +type Runnable interface { + Run(arguments run.RunArguments) error +}