mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-30 06:54:01 +00:00
Merge pull request #8443 from wojtek-t/conversion_improvements
Script for regenerate auto-generated conversions.
This commit is contained in:
commit
2307350d1b
@ -34,7 +34,6 @@ import (
|
||||
|
||||
var (
|
||||
functionDest = flag.StringP("funcDest", "f", "-", "Output for conversion functions; '-' means stdout")
|
||||
namesDest = flag.StringP("nameDest", "n", "-", "Output for function names; '-' means stdout")
|
||||
version = flag.StringP("version", "v", "v1beta3", "Version for conversion.")
|
||||
)
|
||||
|
||||
@ -53,21 +52,11 @@ func main() {
|
||||
defer file.Close()
|
||||
funcOut = file
|
||||
}
|
||||
var nameOut io.Writer
|
||||
if *namesDest == "-" {
|
||||
nameOut = os.Stdout
|
||||
} else {
|
||||
file, err := os.Create(*namesDest)
|
||||
if err != nil {
|
||||
glog.Fatalf("Couldn't open %v: %v", *functionDest, err)
|
||||
}
|
||||
defer file.Close()
|
||||
nameOut = file
|
||||
}
|
||||
|
||||
generator := pkg_runtime.NewConversionGenerator(api.Scheme.Raw())
|
||||
// TODO(wojtek-t): Change the overwrites to a flag.
|
||||
generator.OverwritePackage(*version, "")
|
||||
// TODO(wojtek-t): Get rid of this overwrite.
|
||||
generator.OverwritePackage("api", "newer")
|
||||
for _, knownType := range api.Scheme.KnownTypes(*version) {
|
||||
if err := generator.GenerateConversionsForType(*version, knownType); err != nil {
|
||||
@ -77,7 +66,7 @@ func main() {
|
||||
if err := generator.WriteConversionFunctions(funcOut); err != nil {
|
||||
glog.Fatalf("Error while writing conversion functions: %v", err)
|
||||
}
|
||||
if err := generator.WriteConversionFunctionNames(nameOut); err != nil {
|
||||
if err := generator.RegisterConversionFunctions(funcOut); err != nil {
|
||||
glog.Fatalf("Error while writing conversion functions: %v", err)
|
||||
}
|
||||
}
|
||||
|
57
hack/update-generated-conversions.sh
Executable file
57
hack/update-generated-conversions.sh
Executable file
@ -0,0 +1,57 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright 2015 The Kubernetes Authors All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
# Script to fetch latest swagger spec.
|
||||
# Puts the updated spec at swagger-spec/
|
||||
|
||||
set -o errexit
|
||||
set -o nounset
|
||||
set -o pipefail
|
||||
|
||||
function generate_version() {
|
||||
local version=$1
|
||||
local TMPFILE="/tmp/conversion_generated.$(date +%s).go"
|
||||
|
||||
echo "Generating for version ${version}"
|
||||
|
||||
sed 's/YEAR/2015/' hooks/boilerplate.go.txt > $TMPFILE
|
||||
cat >> $TMPFILE <<EOF
|
||||
package ${version}
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
|
||||
newer "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
|
||||
)
|
||||
|
||||
// AUTO-GENERATED FUNCTIONS START HERE
|
||||
EOF
|
||||
|
||||
go run cmd/kube-conversion/conversion.go -v ${version} -f - >> $TMPFILE
|
||||
|
||||
cat >> $TMPFILE <<EOF
|
||||
// AUTO-GENERATED FUNCTIONS END HERE
|
||||
EOF
|
||||
|
||||
mv $TMPFILE pkg/api/${version}/conversion_generated.go
|
||||
}
|
||||
|
||||
VERSIONS="v1beta3 v1"
|
||||
for ver in $VERSIONS; do
|
||||
generate_version "${ver}"
|
||||
done
|
@ -4475,8 +4475,6 @@ func convert_api_VolumeSource_To_v1_VolumeSource(in *newer.VolumeSource, out *Vo
|
||||
return nil
|
||||
}
|
||||
|
||||
// AUTO-GENERATED FUNCTIONS END HERE
|
||||
|
||||
func init() {
|
||||
err := newer.Scheme.AddGeneratedConversionFuncs(
|
||||
convert_api_AWSElasticBlockStoreVolumeSource_To_v1_AWSElasticBlockStoreVolumeSource,
|
||||
@ -4705,3 +4703,5 @@ func init() {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
// AUTO-GENERATED FUNCTIONS END HERE
|
||||
|
@ -4289,8 +4289,6 @@ func convert_api_VolumeSource_To_v1beta3_VolumeSource(in *newer.VolumeSource, ou
|
||||
return nil
|
||||
}
|
||||
|
||||
// AUTO-GENERATED FUNCTIONS END HERE
|
||||
|
||||
func init() {
|
||||
err := newer.Scheme.AddGeneratedConversionFuncs(
|
||||
convert_api_AWSElasticBlockStoreVolumeSource_To_v1beta3_AWSElasticBlockStoreVolumeSource,
|
||||
@ -4517,3 +4515,5 @@ func init() {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
// AUTO-GENERATED FUNCTIONS END HERE
|
||||
|
@ -33,7 +33,7 @@ import (
|
||||
"github.com/golang/glog"
|
||||
)
|
||||
|
||||
func generateConversions(t *testing.T, version string) (bytes.Buffer, bytes.Buffer) {
|
||||
func generateConversions(t *testing.T, version string) bytes.Buffer {
|
||||
g := runtime.NewConversionGenerator(api.Scheme.Raw())
|
||||
g.OverwritePackage(version, "")
|
||||
g.OverwritePackage("api", "newer")
|
||||
@ -51,17 +51,14 @@ func generateConversions(t *testing.T, version string) (bytes.Buffer, bytes.Buff
|
||||
if err := functionsWriter.Flush(); err != nil {
|
||||
t.Fatalf("error while flushing writer")
|
||||
}
|
||||
|
||||
var names bytes.Buffer
|
||||
namesWriter := bufio.NewWriter(&names)
|
||||
if err := g.WriteConversionFunctionNames(namesWriter); err != nil {
|
||||
if err := g.RegisterConversionFunctions(functionsWriter); err != nil {
|
||||
t.Fatalf("couldn't generate conversion function names: %v", err)
|
||||
}
|
||||
if err := namesWriter.Flush(); err != nil {
|
||||
if err := functionsWriter.Flush(); err != nil {
|
||||
t.Fatalf("error while flushing writer")
|
||||
}
|
||||
|
||||
return functions, names
|
||||
return functions
|
||||
}
|
||||
|
||||
func readLinesUntil(t *testing.T, reader *bufio.Reader, stop string, buffer *bytes.Buffer) error {
|
||||
@ -85,7 +82,7 @@ func readLinesUntil(t *testing.T, reader *bufio.Reader, stop string, buffer *byt
|
||||
return nil
|
||||
}
|
||||
|
||||
func bufferExistingConversions(t *testing.T, fileName string) (bytes.Buffer, bytes.Buffer) {
|
||||
func bufferExistingConversions(t *testing.T, fileName string) bytes.Buffer {
|
||||
file, err := os.Open(fileName)
|
||||
if err != nil {
|
||||
t.Fatalf("couldn't open file %s", fileName)
|
||||
@ -103,18 +100,11 @@ func bufferExistingConversions(t *testing.T, fileName string) (bytes.Buffer, byt
|
||||
if err := readLinesUntil(t, reader, functionsSuffix, &functions); err != nil {
|
||||
t.Fatalf("error while parsing file: %v", err)
|
||||
}
|
||||
|
||||
functionNamesPrefix := "\terr := newer.Scheme.AddGeneratedConversionFuncs(\n"
|
||||
functionNamesSuffix := "\t)\n"
|
||||
if err := readLinesUntil(t, reader, functionNamesPrefix, nil); err != nil {
|
||||
t.Fatalf("error while parsing file: %v", err)
|
||||
_, err = reader.ReadString('\n')
|
||||
if err == nil || err != io.EOF {
|
||||
t.Fatalf("end-of-file expected")
|
||||
}
|
||||
var names bytes.Buffer
|
||||
if err := readLinesUntil(t, reader, functionNamesSuffix, &names); err != nil {
|
||||
t.Fatalf("error while parsing file: %v", err)
|
||||
}
|
||||
|
||||
return functions, names
|
||||
return functions
|
||||
}
|
||||
|
||||
func compareBuffers(t *testing.T, generatedFile string, existing, generated bytes.Buffer) bool {
|
||||
@ -150,20 +140,14 @@ func TestNoManualChangesToGenerateConversions(t *testing.T) {
|
||||
for _, version := range versions {
|
||||
fileName := fmt.Sprintf("../../pkg/api/%s/conversion_generated.go", version)
|
||||
|
||||
existingFunctions, existingNames := bufferExistingConversions(t, fileName)
|
||||
generatedFunctions, generatedNames := generateConversions(t, version)
|
||||
existingFunctions := bufferExistingConversions(t, fileName)
|
||||
generatedFunctions := generateConversions(t, version)
|
||||
|
||||
functionsTxt := fmt.Sprintf("%s.functions.txt", version)
|
||||
ioutil.WriteFile(functionsTxt, generatedFunctions.Bytes(), os.FileMode(0644))
|
||||
|
||||
namesTxt := fmt.Sprintf("%s.names.txt", version)
|
||||
ioutil.WriteFile(namesTxt, generatedNames.Bytes(), os.FileMode(0644))
|
||||
|
||||
if ok := compareBuffers(t, functionsTxt, existingFunctions, generatedFunctions); ok {
|
||||
os.Remove(functionsTxt)
|
||||
}
|
||||
if ok := compareBuffers(t, namesTxt, existingNames, generatedNames); ok {
|
||||
os.Remove(namesTxt)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ import (
|
||||
type ConversionGenerator interface {
|
||||
GenerateConversionsForType(version string, reflection reflect.Type) error
|
||||
WriteConversionFunctions(w io.Writer) error
|
||||
WriteConversionFunctionNames(w io.Writer) error
|
||||
RegisterConversionFunctions(w io.Writer) error
|
||||
OverwritePackage(pkg, overwrite string)
|
||||
}
|
||||
|
||||
@ -263,7 +263,22 @@ func (g *conversionGenerator) WriteConversionFunctions(w io.Writer) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *conversionGenerator) WriteConversionFunctionNames(w io.Writer) error {
|
||||
func (g *conversionGenerator) writeRegisterHeader(b *buffer, indent int) {
|
||||
b.addLine("func init() {\n", indent)
|
||||
b.addLine("err := newer.Scheme.AddGeneratedConversionFuncs(\n", indent+1)
|
||||
}
|
||||
|
||||
func (g *conversionGenerator) writeRegisterFooter(b *buffer, indent int) {
|
||||
b.addLine(")\n", indent+1)
|
||||
b.addLine("if err != nil {\n", indent+1)
|
||||
b.addLine("// If one of the conversion functions is malformed, detect it immediately.\n", indent+2)
|
||||
b.addLine("panic(err)\n", indent+2)
|
||||
b.addLine("}\n", indent+1)
|
||||
b.addLine("}\n", indent)
|
||||
b.addLine("\n", indent)
|
||||
}
|
||||
|
||||
func (g *conversionGenerator) RegisterConversionFunctions(w io.Writer) error {
|
||||
// Write conversion function names alphabetically ordered.
|
||||
var names []string
|
||||
for inType, outType := range g.convertibles {
|
||||
@ -273,10 +288,12 @@ func (g *conversionGenerator) WriteConversionFunctionNames(w io.Writer) error {
|
||||
sort.Strings(names)
|
||||
|
||||
buffer := newBuffer()
|
||||
indent := 2
|
||||
indent := 0
|
||||
g.writeRegisterHeader(buffer, indent)
|
||||
for _, name := range names {
|
||||
buffer.addLine(fmt.Sprintf("%s,\n", name), indent)
|
||||
buffer.addLine(fmt.Sprintf("%s,\n", name), indent+2)
|
||||
}
|
||||
g.writeRegisterFooter(buffer, indent)
|
||||
if err := buffer.flushLines(w); err != nil {
|
||||
return err
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user