Skip to content

Commit

Permalink
Refactor inject package so it will be possible to evolve in a backwar…
Browse files Browse the repository at this point in the history
…d compatible way
  • Loading branch information
pwittrock committed Mar 15, 2018
1 parent a23c01e commit 8f4baff
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 80 deletions.
52 changes: 32 additions & 20 deletions cmd/kubebuilder-gen/internal/controllergen/inject.go
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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{}
Expand Down Expand Up @@ -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 }}
},
Expand All @@ -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
})
}
`
2 changes: 1 addition & 1 deletion cmd/kubebuilder/create/resource/controllertest.go
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
2 changes: 1 addition & 1 deletion cmd/kubebuilder/create/resource/resourcetest.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
2 changes: 1 addition & 1 deletion cmd/kubebuilder/initproject/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
Expand Down
1 change: 0 additions & 1 deletion cmd/kubebuilder/initproject/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
}
Expand Down
63 changes: 11 additions & 52 deletions cmd/kubebuilder/initproject/inject.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
37 changes: 33 additions & 4 deletions pkg/inject/args/args.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
}

0 comments on commit 8f4baff

Please sign in to comment.