From 7448cc04e18800c46a1ba7dcccf2d66ac763835a Mon Sep 17 00:00:00 2001 From: Wojciech Tyczynski Date: Fri, 1 Apr 2016 19:18:54 +0200 Subject: [PATCH] Switch to new generator --- .../conversion-gen/generators/conversion.go | 38 +++++++++++++++---- cmd/libs/go2idl/conversion-gen/main.go | 12 ++++++ cmd/libs/go2idl/parser/parse.go | 30 +++++++++++++-- cmd/libs/go2idl/types/types.go | 3 ++ .../update-generated-conversions.sh | 2 +- pkg/api/v1/doc.go | 1 + .../v1beta1/conversion_generated.go | 2 + pkg/apis/authorization/v1beta1/doc.go | 18 +++++++++ .../autoscaling/v1/conversion_generated.go | 2 + pkg/apis/autoscaling/v1/doc.go | 18 +++++++++ pkg/apis/batch/v1/conversion.go | 18 +-------- pkg/apis/batch/v1/conversion_generated.go | 2 + pkg/apis/batch/v1/doc.go | 18 +++++++++ .../v1alpha1/conversion_generated.go | 2 + pkg/apis/componentconfig/v1alpha1/doc.go | 18 +++++++++ pkg/apis/extensions/v1beta1/conversion.go | 17 +-------- .../v1beta1/conversion_generated.go | 2 + pkg/apis/extensions/v1beta1/doc.go | 18 +++++++++ .../metrics/v1alpha1/conversion_generated.go | 2 + pkg/apis/metrics/v1alpha1/doc.go | 18 +++++++++ 20 files changed, 197 insertions(+), 44 deletions(-) create mode 100644 pkg/apis/authorization/v1beta1/doc.go create mode 100644 pkg/apis/autoscaling/v1/doc.go create mode 100644 pkg/apis/batch/v1/doc.go create mode 100644 pkg/apis/componentconfig/v1alpha1/doc.go create mode 100644 pkg/apis/extensions/v1beta1/doc.go create mode 100644 pkg/apis/metrics/v1alpha1/doc.go diff --git a/cmd/libs/go2idl/conversion-gen/generators/conversion.go b/cmd/libs/go2idl/conversion-gen/generators/conversion.go index 21771916285..613a55f14a2 100644 --- a/cmd/libs/go2idl/conversion-gen/generators/conversion.go +++ b/cmd/libs/go2idl/conversion-gen/generators/conversion.go @@ -57,9 +57,20 @@ func DefaultNameSystem() string { return "public" } +var fallbackPackages = []string{ + "k8s.io/kubernetes/pkg/api/unversioned", + "k8s.io/kubernetes/pkg/apis/extensions", +} + func getInternalTypeFor(context *generator.Context, t *types.Type) (*types.Type, bool) { internalPackage := filepath.Dir(t.Name.Package) if !context.Universe.Package(internalPackage).Has(t.Name.Name) { + for _, fallbackPackage := range fallbackPackages { + if fallbackPackage == t.Name.Package || !context.Universe.Package(fallbackPackage).Has(t.Name.Name) { + continue + } + return context.Universe.Package(fallbackPackage).Type(t.Name.Name), true + } return nil, false } return context.Universe.Package(internalPackage).Type(t.Name.Name), true @@ -149,13 +160,21 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat // (in the directory one above) and can be automatically converted to. for _, p := range context.Universe { path := p.Path - // TODO: Only a subset of InputDirs is actually where we would like - // to generate conversions, the rest of files are added, because either - // conversion methods are generated there or they contain types - // necessary for conversions. if !inputs.Has(path) { continue } + // Only generate conversions for package which explicitly requested it + // byt setting "+genversion=true" in their doc.go file. + filtered := false + for _, comment := range p.DocComments { + comment := strings.Trim(comment, "//") + if types.ExtractCommentTags("+", comment)["genconversion"] == "true" { + filtered = true + } + } + if !filtered { + continue + } convertibleType := false for _, t := range p.Types { @@ -166,6 +185,10 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat // There is no corresponding type in the internal package. continue } + // We won't be able to convert to private type. + if namer.IsPrivateGoName(internalType.Name.Name) { + continue + } // If we can generate conversion in any direction, we should // generate this package. if isConvertible(t, internalType, preexisting) || isConvertible(internalType, t, preexisting) { @@ -308,10 +331,11 @@ func (g *genConversion) Namers(c *generator.Context) namer.NameSystems { func (g *genConversion) convertibleOnlyWithinPackage(inType, outType *types.Type) bool { var t *types.Type + var other *types.Type if inType.Name.Package == g.targetPackage { - t = inType + t, other = inType, outType } else { - t = outType + t, other = outType, inType } if t.Name.Package != g.targetPackage { @@ -325,7 +349,7 @@ func (g *genConversion) convertibleOnlyWithinPackage(inType, outType *types.Type return false } // Also, filter out private types. - if namer.IsPrivateGoName(t.Name.Name) { + if namer.IsPrivateGoName(other.Name.Name) { return false } return true diff --git a/cmd/libs/go2idl/conversion-gen/main.go b/cmd/libs/go2idl/conversion-gen/main.go index 489cbbf5a97..907283f5cc1 100644 --- a/cmd/libs/go2idl/conversion-gen/main.go +++ b/cmd/libs/go2idl/conversion-gen/main.go @@ -35,6 +35,18 @@ func main() { arguments.InputDirs = []string{ "k8s.io/kubernetes/pkg/api/v1", "k8s.io/kubernetes/pkg/api", + "k8s.io/kubernetes/pkg/apis/authorization", + "k8s.io/kubernetes/pkg/apis/authorization/v1beta1", + "k8s.io/kubernetes/pkg/apis/autoscaling", + "k8s.io/kubernetes/pkg/apis/autoscaling/v1", + "k8s.io/kubernetes/pkg/apis/batch", + "k8s.io/kubernetes/pkg/apis/batch/v1", + "k8s.io/kubernetes/pkg/apis/componentconfig", + "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1", + "k8s.io/kubernetes/pkg/apis/extensions", + "k8s.io/kubernetes/pkg/apis/extensions/v1beta1", + "k8s.io/kubernetes/pkg/apis/metrics", + "k8s.io/kubernetes/pkg/apis/metrics/v1alpha1", "k8s.io/kubernetes/pkg/conversion", "k8s.io/kubernetes/pkg/runtime", } diff --git a/cmd/libs/go2idl/parser/parse.go b/cmd/libs/go2idl/parser/parse.go index 7addec2b45d..f6d85729876 100644 --- a/cmd/libs/go2idl/parser/parse.go +++ b/cmd/libs/go2idl/parser/parse.go @@ -42,7 +42,7 @@ type Builder struct { fset *token.FileSet // map of package id to list of parsed files - parsed map[string][]*ast.File + parsed map[string][]parsedFile // Set by makePackages, used by importer() and friends. pkgs map[string]*tc.Package @@ -58,6 +58,12 @@ type Builder struct { importGraph map[string]map[string]struct{} } +// parsedFile is for tracking files with name +type parsedFile struct { + name string + file *ast.File +} + // key type for finding comments. type fileLine struct { file string @@ -79,7 +85,7 @@ func New() *Builder { context: &c, buildInfo: map[string]*build.Package{}, fset: token.NewFileSet(), - parsed: map[string][]*ast.File{}, + parsed: map[string][]parsedFile{}, userRequested: map[string]bool{}, endLineToCommentGroup: map[fileLine]*ast.CommentGroup{}, importGraph: map[string]map[string]struct{}{}, @@ -135,7 +141,7 @@ func (b *Builder) addFile(name string, src []byte, userRequested bool) error { return err } pkg := filepath.Dir(name) - b.parsed[pkg] = append(b.parsed[pkg], p) + b.parsed[pkg] = append(b.parsed[pkg], parsedFile{name, p}) b.userRequested[pkg] = userRequested for _, c := range p.Comments { position := b.fset.Position(c.End()) @@ -272,10 +278,14 @@ func (b *Builder) typeCheckPackage(id string) (*tc.Package, error) { // already processing this package. return nil, fmt.Errorf("circular dependency for %q", id) } - files, ok := b.parsed[id] + parsedFiles, ok := b.parsed[id] if !ok { return nil, fmt.Errorf("No files for pkg %q: %#v", id, b.parsed) } + files := make([]*ast.File, len(parsedFiles)) + for i := range parsedFiles { + files[i] = parsedFiles[i].file + } b.pkgs[id] = nil c := tc.Config{ IgnoreFuncBodies: true, @@ -325,6 +335,18 @@ func (b *Builder) FindTypes() (types.Universe, error) { // *packages* they depend on. continue } + + for _, f := range b.parsed[pkgPath] { + if strings.HasSuffix(f.name, "/doc.go") { + if f.file.Doc != nil { + tp := u.Package(pkgPath) + for _, c := range f.file.Doc.List { + tp.DocComments = append(tp.DocComments, c.Text) + } + } + } + } + s := pkg.Scope() for _, n := range s.Names() { obj := s.Lookup(n) diff --git a/cmd/libs/go2idl/types/types.go b/cmd/libs/go2idl/types/types.go index e6794ac9921..8cfae13adcc 100644 --- a/cmd/libs/go2idl/types/types.go +++ b/cmd/libs/go2idl/types/types.go @@ -89,6 +89,9 @@ type Package struct { // 'package x' line. Name string + // Comments from doc.go file. + DocComments []string + // Types within this package, indexed by their name (*not* including // package name). Types map[string]*Type diff --git a/hack/after-build/update-generated-conversions.sh b/hack/after-build/update-generated-conversions.sh index 22c1ed1f306..84259c2b83b 100755 --- a/hack/after-build/update-generated-conversions.sh +++ b/hack/after-build/update-generated-conversions.sh @@ -43,7 +43,7 @@ EOF } # TODO(lavalamp): get this list by listing the pkg/apis/ directory? -DEFAULT_GROUP_VERSIONS="authorization/v1beta1 autoscaling/v1 batch/v1 extensions/v1beta1 componentconfig/v1alpha1 metrics/v1alpha1" +DEFAULT_GROUP_VERSIONS="" VERSIONS=${VERSIONS:-$DEFAULT_GROUP_VERSIONS} for ver in $VERSIONS; do # Ensure that the version being processed is registered by setting diff --git a/pkg/api/v1/doc.go b/pkg/api/v1/doc.go index 84569e9f228..bf85d77a169 100644 --- a/pkg/api/v1/doc.go +++ b/pkg/api/v1/doc.go @@ -15,4 +15,5 @@ limitations under the License. */ // Package v1 is the v1 version of the API. +// +genconversion=true package v1 diff --git a/pkg/apis/authorization/v1beta1/conversion_generated.go b/pkg/apis/authorization/v1beta1/conversion_generated.go index 2a0daee203c..1b58dc1fc9c 100644 --- a/pkg/apis/authorization/v1beta1/conversion_generated.go +++ b/pkg/apis/authorization/v1beta1/conversion_generated.go @@ -1,3 +1,5 @@ +// +build !ignore_autogenerated + /* Copyright 2015 The Kubernetes Authors All rights reserved. diff --git a/pkg/apis/authorization/v1beta1/doc.go b/pkg/apis/authorization/v1beta1/doc.go new file mode 100644 index 00000000000..cfdb87c53d8 --- /dev/null +++ b/pkg/apis/authorization/v1beta1/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2016 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. +*/ + +// +genconversion=true +package v1beta1 diff --git a/pkg/apis/autoscaling/v1/conversion_generated.go b/pkg/apis/autoscaling/v1/conversion_generated.go index f55d38fd948..6983ac19057 100644 --- a/pkg/apis/autoscaling/v1/conversion_generated.go +++ b/pkg/apis/autoscaling/v1/conversion_generated.go @@ -1,3 +1,5 @@ +// +build !ignore_autogenerated + /* Copyright 2015 The Kubernetes Authors All rights reserved. diff --git a/pkg/apis/autoscaling/v1/doc.go b/pkg/apis/autoscaling/v1/doc.go new file mode 100644 index 00000000000..1c67cc3a94c --- /dev/null +++ b/pkg/apis/autoscaling/v1/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2016 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. +*/ + +// +genconversion=true +package v1 diff --git a/pkg/apis/batch/v1/conversion.go b/pkg/apis/batch/v1/conversion.go index c1a77ee8e92..aeb705ec2f3 100644 --- a/pkg/apis/batch/v1/conversion.go +++ b/pkg/apis/batch/v1/conversion.go @@ -20,17 +20,12 @@ import ( "fmt" "k8s.io/kubernetes/pkg/api" - v1 "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/conversion" "k8s.io/kubernetes/pkg/runtime" ) func addConversionFuncs(scheme *runtime.Scheme) { // Add non-generated conversion functions - err := scheme.AddConversionFuncs( - Convert_api_PodSpec_To_v1_PodSpec, - Convert_v1_PodSpec_To_api_PodSpec, - ) + err := scheme.AddConversionFuncs() if err != nil { // If one of the conversion functions is malformed, detect it immediately. panic(err) @@ -50,14 +45,3 @@ func addConversionFuncs(scheme *runtime.Scheme) { panic(err) } } - -// The following two PodSpec conversions functions where copied from pkg/api/conversion.go -// for the generated functions to work properly. -// This should be fixed: https://github.com/kubernetes/kubernetes/issues/12977 -func Convert_api_PodSpec_To_v1_PodSpec(in *api.PodSpec, out *v1.PodSpec, s conversion.Scope) error { - return v1.Convert_api_PodSpec_To_v1_PodSpec(in, out, s) -} - -func Convert_v1_PodSpec_To_api_PodSpec(in *v1.PodSpec, out *api.PodSpec, s conversion.Scope) error { - return v1.Convert_v1_PodSpec_To_api_PodSpec(in, out, s) -} diff --git a/pkg/apis/batch/v1/conversion_generated.go b/pkg/apis/batch/v1/conversion_generated.go index 9a7b4876f60..bc474ca81a8 100644 --- a/pkg/apis/batch/v1/conversion_generated.go +++ b/pkg/apis/batch/v1/conversion_generated.go @@ -1,3 +1,5 @@ +// +build !ignore_autogenerated + /* Copyright 2015 The Kubernetes Authors All rights reserved. diff --git a/pkg/apis/batch/v1/doc.go b/pkg/apis/batch/v1/doc.go new file mode 100644 index 00000000000..1c67cc3a94c --- /dev/null +++ b/pkg/apis/batch/v1/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2016 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. +*/ + +// +genconversion=true +package v1 diff --git a/pkg/apis/componentconfig/v1alpha1/conversion_generated.go b/pkg/apis/componentconfig/v1alpha1/conversion_generated.go index 9a5ce35ee57..90bd1c74d04 100644 --- a/pkg/apis/componentconfig/v1alpha1/conversion_generated.go +++ b/pkg/apis/componentconfig/v1alpha1/conversion_generated.go @@ -1,3 +1,5 @@ +// +build !ignore_autogenerated + /* Copyright 2015 The Kubernetes Authors All rights reserved. diff --git a/pkg/apis/componentconfig/v1alpha1/doc.go b/pkg/apis/componentconfig/v1alpha1/doc.go new file mode 100644 index 00000000000..65a03a2093d --- /dev/null +++ b/pkg/apis/componentconfig/v1alpha1/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2016 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. +*/ + +// +genconversion=true +package v1alpha1 diff --git a/pkg/apis/extensions/v1beta1/conversion.go b/pkg/apis/extensions/v1beta1/conversion.go index 5f4841cb431..683495d2d4a 100644 --- a/pkg/apis/extensions/v1beta1/conversion.go +++ b/pkg/apis/extensions/v1beta1/conversion.go @@ -32,8 +32,6 @@ import ( func addConversionFuncs(scheme *runtime.Scheme) { // Add non-generated conversion functions err := scheme.AddConversionFuncs( - Convert_api_PodSpec_To_v1_PodSpec, - Convert_v1_PodSpec_To_api_PodSpec, Convert_extensions_ScaleStatus_To_v1beta1_ScaleStatus, Convert_v1beta1_ScaleStatus_To_extensions_ScaleStatus, Convert_extensions_DeploymentSpec_To_v1beta1_DeploymentSpec, @@ -84,17 +82,6 @@ func addConversionFuncs(scheme *runtime.Scheme) { } } -// The following two PodSpec conversions functions where copied from pkg/api/conversion.go -// for the generated functions to work properly. -// This should be fixed: https://github.com/kubernetes/kubernetes/issues/12977 -func Convert_api_PodSpec_To_v1_PodSpec(in *api.PodSpec, out *v1.PodSpec, s conversion.Scope) error { - return v1.Convert_api_PodSpec_To_v1_PodSpec(in, out, s) -} - -func Convert_v1_PodSpec_To_api_PodSpec(in *v1.PodSpec, out *api.PodSpec, s conversion.Scope) error { - return v1.Convert_v1_PodSpec_To_api_PodSpec(in, out, s) -} - func Convert_extensions_ScaleStatus_To_v1beta1_ScaleStatus(in *extensions.ScaleStatus, out *ScaleStatus, s conversion.Scope) error { if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { defaulting.(func(*extensions.ScaleStatus))(in) @@ -371,7 +358,7 @@ func Convert_extensions_JobSpec_To_v1beta1_JobSpec(in *extensions.JobSpec, out * } // END non-standard conversion - if err := Convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { + if err := v1.Convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { return err } return nil @@ -423,7 +410,7 @@ func Convert_v1beta1_JobSpec_To_extensions_JobSpec(in *JobSpec, out *extensions. } // END non-standard conversion - if err := Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { + if err := v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { return err } return nil diff --git a/pkg/apis/extensions/v1beta1/conversion_generated.go b/pkg/apis/extensions/v1beta1/conversion_generated.go index 9d870935fcb..dd6dd4f7bd8 100644 --- a/pkg/apis/extensions/v1beta1/conversion_generated.go +++ b/pkg/apis/extensions/v1beta1/conversion_generated.go @@ -1,3 +1,5 @@ +// +build !ignore_autogenerated + /* Copyright 2015 The Kubernetes Authors All rights reserved. diff --git a/pkg/apis/extensions/v1beta1/doc.go b/pkg/apis/extensions/v1beta1/doc.go new file mode 100644 index 00000000000..cfdb87c53d8 --- /dev/null +++ b/pkg/apis/extensions/v1beta1/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2016 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. +*/ + +// +genconversion=true +package v1beta1 diff --git a/pkg/apis/metrics/v1alpha1/conversion_generated.go b/pkg/apis/metrics/v1alpha1/conversion_generated.go index 928d2ca5740..0093e249918 100644 --- a/pkg/apis/metrics/v1alpha1/conversion_generated.go +++ b/pkg/apis/metrics/v1alpha1/conversion_generated.go @@ -1,3 +1,5 @@ +// +build !ignore_autogenerated + /* Copyright 2015 The Kubernetes Authors All rights reserved. diff --git a/pkg/apis/metrics/v1alpha1/doc.go b/pkg/apis/metrics/v1alpha1/doc.go new file mode 100644 index 00000000000..65a03a2093d --- /dev/null +++ b/pkg/apis/metrics/v1alpha1/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2016 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. +*/ + +// +genconversion=true +package v1alpha1