Skip to content

Commit 2312841

Browse files
committed
Merge pull request kubernetes#7431 from wojtek-t/conversion_chains
Prepare for chaining autogenerated conversion methods
2 parents 6f5e081 + fc6fb09 commit 2312841

File tree

4 files changed

+3047
-2573
lines changed

4 files changed

+3047
-2573
lines changed

cmd/kube-conversion/conversion.go

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"io"
2121
"os"
2222
"runtime"
23-
"strings"
2423

2524
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
2625
_ "github.com/GoogleCloudPlatform/kubernetes/pkg/api/v1beta1"
@@ -33,39 +32,51 @@ import (
3332
)
3433

3534
var (
36-
outputDest = flag.StringP("output", "o", "-", "Output destination; '-' means stdout")
37-
versions = flag.StringP("versions", "v", "v1beta3", "Comma separated list of versions for conversion.")
35+
functionDest = flag.StringP("funcDest", "f", "-", "Output for conversion functions; '-' means stdout")
36+
namesDest = flag.StringP("nameDest", "n", "-", "Output for function names; '-' means stdout")
37+
version = flag.StringP("version", "v", "v1beta3", "Version for conversion.")
3838
)
3939

4040
func main() {
4141
runtime.GOMAXPROCS(runtime.NumCPU())
4242
flag.Parse()
4343

44-
var out io.Writer
45-
if *outputDest == "-" {
46-
out = os.Stdout
44+
var funcOut io.Writer
45+
if *functionDest == "-" {
46+
funcOut = os.Stdout
4747
} else {
48-
file, err := os.Create(*outputDest)
48+
file, err := os.Create(*functionDest)
4949
if err != nil {
50-
glog.Fatalf("Couldn't open %v: %v", *outputDest, err)
50+
glog.Fatalf("Couldn't open %v: %v", *functionDest, err)
5151
}
5252
defer file.Close()
53-
out = file
53+
funcOut = file
5454
}
55-
56-
versionsForConversion := strings.Split(*versions, ",")
57-
for _, version := range versionsForConversion {
58-
generator := conversion.NewGenerator(api.Scheme.Raw())
59-
// TODO(wojtek-t): Change the overwrites to a flag.
60-
generator.OverwritePackage(version, "")
61-
generator.OverwritePackage("api", "newer")
62-
for _, knownType := range api.Scheme.KnownTypes(version) {
63-
if err := generator.GenerateConversionsForType(version, knownType); err != nil {
64-
glog.Errorf("error while generating conversion functions for %v: %v", knownType, err)
65-
}
55+
var nameOut io.Writer
56+
if *namesDest == "-" {
57+
nameOut = os.Stdout
58+
} else {
59+
file, err := os.Create(*namesDest)
60+
if err != nil {
61+
glog.Fatalf("Couldn't open %v: %v", *functionDest, err)
6662
}
67-
if err := generator.WriteConversionFunctions(out); err != nil {
68-
glog.Fatalf("Error while writing conversion functions: %v", err)
63+
defer file.Close()
64+
nameOut = file
65+
}
66+
67+
generator := conversion.NewGenerator(api.Scheme.Raw())
68+
// TODO(wojtek-t): Change the overwrites to a flag.
69+
generator.OverwritePackage(*version, "")
70+
generator.OverwritePackage("api", "newer")
71+
for _, knownType := range api.Scheme.KnownTypes(*version) {
72+
if err := generator.GenerateConversionsForType(*version, knownType); err != nil {
73+
glog.Errorf("error while generating conversion functions for %v: %v", knownType, err)
6974
}
7075
}
76+
if err := generator.WriteConversionFunctions(funcOut); err != nil {
77+
glog.Fatalf("Error while writing conversion functions: %v", err)
78+
}
79+
if err := generator.WriteConversionFunctionNames(nameOut); err != nil {
80+
glog.Fatalf("Error while writing conversion functions: %v", err)
81+
}
7182
}

docs/devel/api_changes.md

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,9 +222,24 @@ types, structural change in particular - you must add some logic to convert
222222
versioned APIs to and from the internal representation. If you see errors from
223223
the `serialization_test`, it may indicate the need for explicit conversions.
224224

225+
Performance of conversions very heavily influence performance of apiserver.
226+
Thus, we are auto-generating conversion functions that are much more efficient
227+
than the generic ones (which are based on reflections and thus are highly
228+
inefficient).
229+
225230
The conversion code resides with each versioned API -
226-
`pkg/api/<version>/conversion.go`. Unsurprisingly, this also requires you to
227-
add tests to `pkg/api/<version>/conversion_test.go`.
231+
`pkg/api/<version>/conversion.go`. To regenerate conversion functions:
232+
- run
233+
```
234+
$ go run cmd/kube-conversion/conversion.go -v <version> -f <file1.txt> -n <file2.txt>
235+
```
236+
- replace all conversion functions (convert\* functions) in the above file
237+
with the contents of \<file1.txt\>
238+
- replace arguments of `newer.Scheme.AddGeneratedConversionFuncs`
239+
with the contents of \<file2.txt\>
240+
241+
Unsurprisingly, this also requires you to add tests to
242+
`pkg/api/<version>/conversion_test.go`.
228243

229244
## Update the fuzzer
230245

0 commit comments

Comments
 (0)