Skip to content

Commit 435f946

Browse files
committed
Template mixins
Signed-off-by: Adrian Orive <[email protected]>
1 parent 6987a7f commit 435f946

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+189
-186
lines changed

pkg/model/file/template.go

Lines changed: 72 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ limitations under the License.
1616

1717
package file
1818

19+
import (
20+
"sigs.k8s.io/kubebuilder/pkg/model/resource"
21+
)
22+
1923
// Input is the input for scaffolding a file
2024
type Input struct {
2125
// Path is the file to write
@@ -26,68 +30,98 @@ type Input struct {
2630

2731
// TemplateBody is the template body to execute
2832
TemplateBody string
33+
}
2934

30-
// Boilerplate is the contents of a Boilerplate go header file
31-
Boilerplate string
35+
// HasDomain allows the domain to be used on a template
36+
type HasDomain interface {
37+
// InjectDomain sets the template domain
38+
InjectDomain(string)
39+
}
3240

41+
// DomainMixin provides templates with a injectable domain field
42+
type DomainMixin struct {
3343
// Domain is the domain for the APIs
3444
Domain string
45+
}
3546

36-
// Repo is the go project package
37-
Repo string
47+
// InjectDomain implements HasDomain
48+
func (m *DomainMixin) InjectDomain(domain string) {
49+
if m.Domain == "" {
50+
m.Domain = domain
51+
}
52+
}
3853

39-
// MultiGroup is the multi-group boolean from the PROJECT file
40-
MultiGroup bool
54+
// HasRepository allows the repository to be used on a template
55+
type HasRepository interface {
56+
// InjectRepository sets the template repository
57+
InjectRepository(string)
4158
}
4259

43-
// Domain allows a domain to be set on an object
44-
type Domain interface {
45-
// SetDomain sets the domain
46-
SetDomain(string)
60+
// RepositoryMixin provides templates with a injectable repository field
61+
type RepositoryMixin struct {
62+
// Repo is the go project package path
63+
Repo string
4764
}
4865

49-
// SetDomain sets the domain
50-
func (i *Input) SetDomain(d string) {
51-
if i.Domain == "" {
52-
i.Domain = d
66+
// InjectRepository implements HasRepository
67+
func (m *RepositoryMixin) InjectRepository(repository string) {
68+
if m.Repo == "" {
69+
m.Repo = repository
5370
}
5471
}
5572

56-
// Repo allows a repo to be set on an object
57-
type Repo interface {
58-
// SetRepo sets the repo
59-
SetRepo(string)
73+
// HasMultiGroup allows the multi-group flag to be used on a template
74+
type HasMultiGroup interface {
75+
// InjectMultiGroup sets the template multi-group flag
76+
InjectMultiGroup(bool)
6077
}
6178

62-
// SetRepo sets the repo
63-
func (i *Input) SetRepo(r string) {
64-
if i.Repo == "" {
65-
i.Repo = r
66-
}
79+
// MultiGroupMixin provides templates with a injectable multi-group flag field
80+
type MultiGroupMixin struct {
81+
// MultiGroup is the multi-group flag
82+
MultiGroup bool
83+
}
84+
85+
// InjectMultiGroup implements HasMultiGroup
86+
func (m *MultiGroupMixin) InjectMultiGroup(flag bool) {
87+
m.MultiGroup = flag
6788
}
6889

69-
// Boilerplate allows boilerplate text to be set on an object
70-
type Boilerplate interface {
71-
// SetBoilerplate sets the boilerplate text
72-
SetBoilerplate(string)
90+
// HasBoilerplate allows a boilerplate to be used on a template
91+
type HasBoilerplate interface {
92+
// InjectBoilerplate sets the template boilerplate
93+
InjectBoilerplate(string)
7394
}
7495

75-
// SetBoilerplate sets the boilerplate text
76-
func (i *Input) SetBoilerplate(b string) {
77-
if i.Boilerplate == "" {
78-
i.Boilerplate = b
96+
// BoilerplateMixin provides templates with a injectable boilerplate field
97+
type BoilerplateMixin struct {
98+
// Boilerplate is the contents of a Boilerplate go header file
99+
Boilerplate string
100+
}
101+
102+
// InjectBoilerplate implements HasBoilerplate
103+
func (m *BoilerplateMixin) InjectBoilerplate(boilerplate string) {
104+
if m.Boilerplate == "" {
105+
m.Boilerplate = boilerplate
79106
}
80107
}
81108

82-
// MultiGroup allows the project version to be set on an object
83-
type MultiGroup interface {
84-
// SetVersion sets the project version
85-
SetMultiGroup(value bool)
109+
// HasResource allows a resource to be used on a template
110+
type HasResource interface {
111+
// InjectResource sets the template resource
112+
InjectResource(*resource.Resource)
86113
}
87114

88-
// SetVersion sets the MultiGroup value
89-
func (i *Input) SetMultiGroup(v bool) {
90-
i.MultiGroup = v
115+
// ResourceMixin provides templates with a injectable resource field
116+
type ResourceMixin struct {
117+
Resource *resource.Resource
118+
}
119+
120+
// InjectResource implements HasResource
121+
func (m *ResourceMixin) InjectResource(res *resource.Resource) {
122+
if m.Resource == nil {
123+
m.Resource = res
124+
}
91125
}
92126

93127
// Template is a scaffoldable file template

pkg/model/universe.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,24 @@ func WithResource(resource *resource.Resource) UniverseOption {
8181
func (u Universe) InjectInto(t file.Template) {
8282
// Inject project configuration
8383
if u.Config != nil {
84-
if templateWithDomain, ok := t.(file.Domain); ok {
85-
templateWithDomain.SetDomain(u.Config.Domain)
84+
if templateWithDomain, hasDomain := t.(file.HasDomain); hasDomain {
85+
templateWithDomain.InjectDomain(u.Config.Domain)
8686
}
87-
if templateWithRepository, ok := t.(file.Repo); ok {
88-
templateWithRepository.SetRepo(u.Config.Repo)
87+
if templateWithRepository, hasRepository := t.(file.HasRepository); hasRepository {
88+
templateWithRepository.InjectRepository(u.Config.Repo)
8989
}
90-
if templateWithMultiGroup, ok := t.(file.MultiGroup); ok {
91-
templateWithMultiGroup.SetMultiGroup(u.Config.MultiGroup)
90+
if templateWithMultiGroup, hasMultiGroup := t.(file.HasMultiGroup); hasMultiGroup {
91+
templateWithMultiGroup.InjectMultiGroup(u.Config.MultiGroup)
9292
}
9393
}
9494
// Inject boilerplate
95-
if templateWithBoilerplate, ok := t.(file.Boilerplate); ok {
96-
templateWithBoilerplate.SetBoilerplate(u.Boilerplate)
95+
if templateWithBoilerplate, hasBoilerplate := t.(file.HasBoilerplate); hasBoilerplate {
96+
templateWithBoilerplate.InjectBoilerplate(u.Boilerplate)
97+
}
98+
// Inject resource
99+
if u.Resource != nil {
100+
if templateWithResource, hasResource := t.(file.HasResource); hasResource {
101+
templateWithResource.InjectResource(u.Resource)
102+
}
97103
}
98104
}

pkg/scaffold/api.go

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,14 @@ func (s *apiScaffolder) scaffoldV1() error {
9393

9494
if err := machinery.NewScaffold().Execute(
9595
s.newUniverse(),
96-
&crdv1.Register{Resource: s.resource},
97-
&crdv1.Types{Resource: s.resource},
98-
&crdv1.VersionSuiteTest{Resource: s.resource},
99-
&crdv1.TypesTest{Resource: s.resource},
100-
&crdv1.Doc{Resource: s.resource},
101-
&crdv1.Group{Resource: s.resource},
102-
&crdv1.AddToScheme{Resource: s.resource},
103-
&crdv1.CRDSample{Resource: s.resource},
96+
&crdv1.Register{},
97+
&crdv1.Types{},
98+
&crdv1.VersionSuiteTest{},
99+
&crdv1.TypesTest{},
100+
&crdv1.Doc{},
101+
&crdv1.Group{},
102+
&crdv1.AddToScheme{},
103+
&crdv1.CRDSample{},
104104
); err != nil {
105105
return fmt.Errorf("error scaffolding APIs: %v", err)
106106
}
@@ -120,10 +120,10 @@ func (s *apiScaffolder) scaffoldV1() error {
120120

121121
if err := machinery.NewScaffold().Execute(
122122
s.newUniverse(),
123-
&controllerv1.Controller{Resource: s.resource},
124-
&controllerv1.AddController{Resource: s.resource},
125-
&controllerv1.Test{Resource: s.resource},
126-
&controllerv1.SuiteTest{Resource: s.resource},
123+
&controllerv1.Controller{},
124+
&controllerv1.AddController{},
125+
&controllerv1.Test{},
126+
&controllerv1.SuiteTest{},
127127
); err != nil {
128128
return fmt.Errorf("error scaffolding controller: %v", err)
129129
}
@@ -151,18 +151,18 @@ func (s *apiScaffolder) scaffoldV2() error {
151151

152152
if err := machinery.NewScaffold(s.plugins...).Execute(
153153
s.newUniverse(),
154-
&templatesv2.Types{Resource: s.resource},
155-
&templatesv2.Group{Resource: s.resource},
156-
&templatesv2.CRDSample{Resource: s.resource},
157-
&templatesv2.CRDEditorRole{Resource: s.resource},
158-
&templatesv2.CRDViewerRole{Resource: s.resource},
159-
&crdv2.EnableWebhookPatch{Resource: s.resource},
160-
&crdv2.EnableCAInjectionPatch{Resource: s.resource},
154+
&templatesv2.Types{},
155+
&templatesv2.Group{},
156+
&templatesv2.CRDSample{},
157+
&templatesv2.CRDEditorRole{},
158+
&templatesv2.CRDViewerRole{},
159+
&crdv2.EnableWebhookPatch{},
160+
&crdv2.EnableCAInjectionPatch{},
161161
); err != nil {
162162
return fmt.Errorf("error scaffolding APIs: %v", err)
163163
}
164164

165-
kustomizationFile := &crdv2.Kustomization{Resource: s.resource}
165+
kustomizationFile := &crdv2.Kustomization{}
166166
if err := machinery.NewScaffold().Execute(
167167
s.newUniverse(),
168168
kustomizationFile,
@@ -192,11 +192,11 @@ func (s *apiScaffolder) scaffoldV2() error {
192192
fmt.Sprintf("%s_controller.go", strings.ToLower(s.resource.Kind))))
193193
}
194194

195-
suiteTestFile := &controllerv2.SuiteTest{Resource: s.resource}
195+
suiteTestFile := &controllerv2.SuiteTest{}
196196
if err := machinery.NewScaffold(s.plugins...).Execute(
197197
s.newUniverse(),
198198
suiteTestFile,
199-
&controllerv2.Controller{Resource: s.resource},
199+
&controllerv2.Controller{},
200200
); err != nil {
201201
return fmt.Errorf("error scaffolding controller: %v", err)
202202
}

pkg/scaffold/internal/templates/v1/boilerplate.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ var _ file.Template = &Boilerplate{}
2929
// Boilerplate scaffolds a boilerplate header file.
3030
type Boilerplate struct {
3131
file.Input
32+
file.BoilerplateMixin
3233

3334
// License is the License type to write
3435
License string

pkg/scaffold/internal/templates/v1/controller/add.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,16 @@ import (
2222
"strings"
2323

2424
"sigs.k8s.io/kubebuilder/pkg/model/file"
25-
"sigs.k8s.io/kubebuilder/pkg/model/resource"
2625
)
2726

2827
var _ file.Template = &AddController{}
2928

3029
// AddController scaffolds adds a new Controller.
3130
type AddController struct {
3231
file.Input
33-
34-
// Resource is a resource in the API group
35-
Resource *resource.Resource
32+
file.RepositoryMixin
33+
file.BoilerplateMixin
34+
file.ResourceMixin
3635
}
3736

3837
// GetInput implements input.Template

pkg/scaffold/internal/templates/v1/controller/controller.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,15 @@ import (
2121
"strings"
2222

2323
"sigs.k8s.io/kubebuilder/pkg/model/file"
24-
"sigs.k8s.io/kubebuilder/pkg/model/resource"
2524
)
2625

2726
var _ file.Template = &Controller{}
2827

2928
// Controller scaffolds a Controller for a Resource
3029
type Controller struct {
3130
file.Input
32-
33-
// Resource is the Resource to make the Controller for
34-
Resource *resource.Resource
31+
file.BoilerplateMixin
32+
file.ResourceMixin
3533
}
3634

3735
// GetInput implements input.Template

pkg/scaffold/internal/templates/v1/controller/controllersuitetest.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,16 @@ import (
2121
"strings"
2222

2323
"sigs.k8s.io/kubebuilder/pkg/model/file"
24-
"sigs.k8s.io/kubebuilder/pkg/model/resource"
2524
)
2625

2726
var _ file.Template = &SuiteTest{}
2827

2928
// SuiteTest scaffolds a SuiteTest
3029
type SuiteTest struct {
3130
file.Input
32-
33-
// Resource is the Resource to make the Controller for
34-
Resource *resource.Resource
31+
file.RepositoryMixin
32+
file.BoilerplateMixin
33+
file.ResourceMixin
3534
}
3635

3736
// GetInput implements input.Template

pkg/scaffold/internal/templates/v1/controller/controllertest.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,15 @@ import (
2121
"strings"
2222

2323
"sigs.k8s.io/kubebuilder/pkg/model/file"
24-
"sigs.k8s.io/kubebuilder/pkg/model/resource"
2524
)
2625

2726
var _ file.Template = &Test{}
2827

2928
// Test scaffolds a Controller Test
3029
type Test struct {
3130
file.Input
32-
33-
// Resource is the Resource to make the Controller for
34-
Resource *resource.Resource
31+
file.BoilerplateMixin
32+
file.ResourceMixin
3533
}
3634

3735
// GetInput implements input.Template

pkg/scaffold/internal/templates/v1/crd/addtoscheme.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,15 @@ import (
2121
"path/filepath"
2222

2323
"sigs.k8s.io/kubebuilder/pkg/model/file"
24-
"sigs.k8s.io/kubebuilder/pkg/model/resource"
2524
)
2625

2726
var _ file.Template = &AddToScheme{}
2827

2928
// AddToScheme scaffolds the code to add the resource to a SchemeBuilder.
3029
type AddToScheme struct {
3130
file.Input
32-
33-
// Resource is a resource in the API group
34-
Resource *resource.Resource
31+
file.BoilerplateMixin
32+
file.ResourceMixin
3533
}
3634

3735
// GetInput implements input.Template

pkg/scaffold/internal/templates/v1/crd/crd_sample.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"strings"
2323

2424
"sigs.k8s.io/kubebuilder/pkg/model/file"
25-
"sigs.k8s.io/kubebuilder/pkg/model/resource"
2625
)
2726

2827
var _ file.Template = &CRDSample{}
@@ -31,9 +30,7 @@ var _ file.Template = &CRDSample{}
3130
// nolint:golint
3231
type CRDSample struct {
3332
file.Input
34-
35-
// Resource is a resource in the API group
36-
Resource *resource.Resource
33+
file.ResourceMixin
3734
}
3835

3936
// GetInput implements input.Template

0 commit comments

Comments
 (0)