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
package apigen
import (
"bytes"
"fmt"
"go/format"
"path"
)
const generatedHeader = "// Code generated by socialweb-apigen. DO NOT EDIT.\n\n"
func RegisterFile(m *Model) string {
return path.Join(m.Dir, "zz_generated.register.go")
}
func ConditionsFile(m *Model) string {
return path.Join(m.Dir, "zz_generated.conditions.go")
}
func (m *Model) RegisterGo() ([]byte, error) {
var b bytes.Buffer
b.WriteString(generatedHeader)
fmt.Fprintf(&b, "package %s\n\n", m.Package)
b.WriteString("import (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n)\n\n")
b.WriteString("var (\n\tSchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)\n\tAddToScheme = SchemeBuilder.AddToScheme\n)\n\n")
b.WriteString("const (\n")
for _, r := range m.Resources {
fmt.Fprintf(&b, "\t%sResource = %q\n", r.Kind, r.Plural)
}
b.WriteString(")\n\n")
b.WriteString("var (\n")
for _, r := range m.Resources {
fmt.Fprintf(&b, "\t%sGVR = GroupVersion.WithResource(%sResource)\n", r.Kind, r.Kind)
}
b.WriteString(")\n\n")
b.WriteString("func addKnownTypes(scheme *runtime.Scheme) error {\n\tscheme.AddKnownTypes(\n\t\tGroupVersion,\n")
for _, r := range m.Resources {
fmt.Fprintf(&b, "\t\t&%s{},\n\t\t&%s{},\n", r.Kind, r.ListKind)
}
b.WriteString("\t)\n\tmetav1.AddToGroupVersion(scheme, GroupVersion)\n\treturn nil\n}\n")
for _, r := range m.Resources {
for _, name := range []string{r.Kind, r.ListKind} {
fmt.Fprintf(&b, "\nfunc (in *%s) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n", name)
}
}
return formatGo(RegisterFile(m), b.Bytes())
}
func (m *Model) ConditionsGo() ([]byte, bool, error) {
var kinds []string
for _, r := range m.Resources {
if r.Conditions {
kinds = append(kinds, r.Kind)
}
}
if len(kinds) == 0 {
return nil, false, nil
}
var b bytes.Buffer
b.WriteString(generatedHeader)
fmt.Fprintf(&b, "package %s\n\n", m.Package)
b.WriteString("import (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n")
for _, k := range kinds {
fmt.Fprintf(&b, "\nfunc (in *%s) GetConditions() []metav1.Condition {\n\treturn in.Status.Conditions\n}\n", k)
fmt.Fprintf(&b, "\nfunc (in *%s) SetConditions(conditions []metav1.Condition) {\n\tin.Status.Conditions = conditions\n}\n", k)
}
data, err := formatGo(ConditionsFile(m), b.Bytes())
return data, true, err
}
func formatGo(name string, src []byte) ([]byte, error) {
out, err := format.Source(src)
if err != nil {
return nil, fmt.Errorf("%s: %w", name, err)
}
return out, nil
}