/
kube_types_renderer.go
121 lines (101 loc) · 2.84 KB
/
kube_types_renderer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package render
import (
"path/filepath"
)
// renders kubernetes from templates
type KubeCodeRenderer struct {
templateRenderer
// the templates to use for rendering kube kypes
TypesTemplates inputTemplates
// the templates to use for rendering typed kube clients which use the underlying cache
ClientsTemplates inputTemplates
// the templates to use for rendering kube controllers
ControllerTemplates inputTemplates
// the go module of the project
GoModule string
// the relative path to the api dir
// types will render in the package <module>/<apiRoot>/<group>/<version>
ApiRoot string
}
var TypesTemplates = func(skipDeepCopy bool) inputTemplates {
tmpl := inputTemplates{
"code/types/types.gotmpl": {
Path: "types.go",
},
"code/types/register.gotmpl": {
Path: "register.go",
},
"code/types/doc.gotmpl": {
Path: "doc.go",
},
"code/types/zz_generated.deepcopy.gotmpl": {
Path: "zz_generated.deepcopy.go",
},
}
if skipDeepCopy {
delete(tmpl, "code/types/zz_generated.deepcopy.gotmpl")
}
return tmpl
}
var ClientsTemplates = inputTemplates{
"code/types/clients.gotmpl": {
Path: "clients.go",
},
"code/types/type_helpers.gotmpl": {
Path: "type_helpers.go",
},
}
var ControllerTemplates = inputTemplates{
"code/controller/event_handlers.gotmpl": {
Path: "controller/event_handlers.go",
},
"code/controller/reconcilers.gotmpl": {
Path: "controller/reconcilers.go",
},
"code/controller/multicluster_reconcilers.gotmpl": {
Path: "controller/multicluster_reconcilers.go",
},
}
func RenderApiTypes(grp Group) ([]OutFile, error) {
defaultKubeCodeRenderer := KubeCodeRenderer{
templateRenderer: DefaultTemplateRenderer,
TypesTemplates: TypesTemplates(grp.Generators.HasDeepcopy()),
ClientsTemplates: ClientsTemplates,
ControllerTemplates: ControllerTemplates,
GoModule: grp.Module,
ApiRoot: grp.ApiRoot,
}
return defaultKubeCodeRenderer.RenderKubeCode(grp)
}
func (r KubeCodeRenderer) RenderKubeCode(grp Group) ([]OutFile, error) {
templatesToRender := make(inputTemplates)
if grp.RenderTypes {
templatesToRender.add(r.TypesTemplates)
}
if grp.RenderClients {
templatesToRender.add(r.ClientsTemplates)
}
if grp.RenderController {
templatesToRender.add(r.ControllerTemplates)
}
files, err := r.renderCoreTemplates(templatesToRender, grp)
if err != nil {
return nil, err
}
for _, customTemplates := range grp.CustomTemplates {
customFiles, err := r.RenderCustomTemplates(customTemplates.Templates, customTemplates.Funcs, grp)
if err != nil {
return nil, err
}
files = append(files, customFiles...)
}
// prepend output file paths with path to api dir
for i, out := range files {
out.Path = filepath.Join(r.ApiRoot, grp.Group, grp.Version, out.Path)
files[i] = out
}
if grp.MockgenDirective {
PrependMockgenDirective(files)
}
return files, nil
}