From 0181ac61dad0022ffb85a4210067bb1faa0596ac Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Tue, 24 May 2016 12:03:05 -0400 Subject: [PATCH 1/3] DeepCopy should only generate types in k8s.io/kubernetes Also make generation more selective (require opt in) to prevent lots of unnecessary generated deep copies. --- cmd/libs/go2idl/args/args.go | 1 + .../deepcopy-gen/generators/deepcopy.go | 116 +++++++++++++++--- cmd/libs/go2idl/deepcopy-gen/main.go | 18 +++ pkg/api/resource/quantity.go | 1 + pkg/runtime/types.go | 3 + pkg/util/intstr/intstr.go | 1 + 6 files changed, 121 insertions(+), 19 deletions(-) diff --git a/cmd/libs/go2idl/args/args.go b/cmd/libs/go2idl/args/args.go index 9ca3497a496..85384975326 100644 --- a/cmd/libs/go2idl/args/args.go +++ b/cmd/libs/go2idl/args/args.go @@ -97,6 +97,7 @@ func (g *GeneratorArgs) NewBuilder() (*parser.Builder, error) { b.AddBuildTags("ignore_autogenerated") for _, d := range g.InputDirs { + d = strings.TrimLeft(d, "+-*") if g.Recursive { if err := b.AddDirRecursive(d); err != nil { return nil, fmt.Errorf("unable to add directory %q: %v", d, err) diff --git a/cmd/libs/go2idl/deepcopy-gen/generators/deepcopy.go b/cmd/libs/go2idl/deepcopy-gen/generators/deepcopy.go index d4cd5460e93..f6798d27194 100644 --- a/cmd/libs/go2idl/deepcopy-gen/generators/deepcopy.go +++ b/cmd/libs/go2idl/deepcopy-gen/generators/deepcopy.go @@ -19,6 +19,7 @@ package generators import ( "fmt" "io" + "path" "path/filepath" "strings" @@ -31,6 +32,15 @@ import ( "github.com/golang/glog" ) +// Constraints is a set of optional limitations on what deep copy will generate. +type Constraints struct { + // PackageConstraints is an optional set of package prefixes that constrain which types + // will have inline deep copy methods generated for. Any type outside of these packages + // (if specified) will not have a function generated and will result in a call to the + // cloner.DeepCopy method. + PackageConstraints []string +} + // TODO: This is created only to reduce number of changes in a single PR. // Remove it and use PublicNamer instead. func deepCopyNamer() *namer.NameStrategy { @@ -62,7 +72,32 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat glog.Fatalf("Failed loading boilerplate: %v", err) } - inputs := sets.NewString(arguments.InputDirs...) + initInputs := sets.NewString() + explicitInputs := sets.NewString() + inputs := sets.NewString() + for _, s := range arguments.InputDirs { + switch { + case strings.HasPrefix(s, "+"): + // packages with '+' prefix get functions generated for everything except gencopy=false, but + // no init function + s = strings.TrimPrefix(s, "+") + inputs.Insert(s) + case strings.HasPrefix(s, "-"): + // packages with '-' prefix only get functions generated for those with gencopy=true + s = strings.TrimPrefix(s, "-") + inputs.Insert(s) + explicitInputs.Insert(s) + default: + inputs.Insert(s) + initInputs.Insert(s) + } + } + + var restrictRange []string + if c, ok := arguments.CustomArgs.(Constraints); ok { + restrictRange = c.PackageConstraints + } + packages := generator.Packages{} header := append([]byte( `// +build !ignore_autogenerated @@ -76,11 +111,29 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat for _, p := range context.Universe { copyableType := false for _, t := range p.Types { - if copyableWithinPackage(t) && inputs.Has(t.Name.Package) { + if copyableWithinPackage(t, explicitInputs.Has(t.Name.Package)) && inputs.Has(t.Name.Package) { copyableType = true } } if copyableType { + // TODO: replace this with a more sophisticated algorithm that generates private copy methods + // (like auto_DeepCopy_...) for any type that is outside of the PackageConstraints. That would + // avoid having to make a reflection call. + canInlineTypeFn := func(c *generator.Context, t *types.Type) bool { + // types must be public structs or have a custom DeepCopy_ already defined + if !copyableWithinPackage(t, explicitInputs.Has(t.Name.Package)) && !publicCopyFunctionDefined(c, t) { + return false + } + + // only packages within the restricted range can be inlined + for _, s := range restrictRange { + if strings.HasPrefix(t.Name.Package, s) { + return true + } + } + return false + } + path := p.Path packages = append(packages, &generator.DefaultPackage{ @@ -90,7 +143,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{} generators = append( - generators, NewGenDeepCopy("deep_copy_generated", path, inputs.Has(path))) + generators, NewGenDeepCopy("deep_copy_generated", path, initInputs.Has(path), explicitInputs.Has(path), canInlineTypeFn)) return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { @@ -102,6 +155,9 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat return packages } +// CanInlineTypeFunc should return true if the provided type can be converted to a function call +type CanInlineTypeFunc func(*generator.Context, *types.Type) bool + const ( apiPackagePath = "k8s.io/kubernetes/pkg/api" conversionPackagePath = "k8s.io/kubernetes/pkg/conversion" @@ -110,23 +166,30 @@ const ( // genDeepCopy produces a file with autogenerated deep-copy functions. type genDeepCopy struct { generator.DefaultGen - targetPackage string - imports namer.ImportTracker - typesForInit []*types.Type - generateInitFunc bool + + targetPackage string + imports namer.ImportTracker + typesForInit []*types.Type + generateInitFunc bool + requireExplicitTag bool + canInlineTypeFn CanInlineTypeFunc + + context *generator.Context globalVariables map[string]interface{} } -func NewGenDeepCopy(sanitizedName, targetPackage string, generateInitFunc bool) generator.Generator { +func NewGenDeepCopy(sanitizedName, targetPackage string, generateInitFunc, requireExplicitTag bool, canInlineTypeFn CanInlineTypeFunc) generator.Generator { return &genDeepCopy{ DefaultGen: generator.DefaultGen{ OptionalName: sanitizedName, }, - targetPackage: targetPackage, - imports: generator.NewImportTracker(), - typesForInit: make([]*types.Type, 0), - generateInitFunc: generateInitFunc, + targetPackage: targetPackage, + imports: generator.NewImportTracker(), + typesForInit: make([]*types.Type, 0), + generateInitFunc: generateInitFunc, + requireExplicitTag: requireExplicitTag, + canInlineTypeFn: canInlineTypeFn, } } @@ -137,15 +200,29 @@ func (g *genDeepCopy) Namers(c *generator.Context) namer.NameSystems { func (g *genDeepCopy) Filter(c *generator.Context, t *types.Type) bool { // Filter out all types not copyable within the package. - copyable := copyableWithinPackage(t) + copyable := copyableWithinPackage(t, g.requireExplicitTag) if copyable { g.typesForInit = append(g.typesForInit, t) } return copyable } -func copyableWithinPackage(t *types.Type) bool { - if types.ExtractCommentTags("+", t.CommentLines)["gencopy"] == "false" { +// publicCopyFunctionDefined returns true if a DeepCopy function has already been defined in a given +// package, which allows more efficient deep copy implementations to be defined by the caller. +func publicCopyFunctionDefined(c *generator.Context, t *types.Type) bool { + p, ok := c.Universe[t.Name.Package] + if !ok { + return false + } + return p.Functions["DeepCopy_"+path.Base(t.Name.Package)+"_"+t.Name.Name] != nil +} + +func copyableWithinPackage(t *types.Type, explicitCopyRequired bool) bool { + tag := types.ExtractCommentTags("+", t.CommentLines)["gencopy"] + if tag == "false" { + return false + } + if explicitCopyRequired && tag != "true" { return false } // TODO: Consider generating functions for other kinds too. @@ -204,6 +281,7 @@ func (g *genDeepCopy) funcNameTmpl(t *types.Type) string { } func (g *genDeepCopy) Init(c *generator.Context, w io.Writer) error { + g.context = c cloner := c.Universe.Type(types.Name{Package: conversionPackagePath, Name: "Cloner"}) g.imports.AddType(cloner) g.globalVariables = map[string]interface{}{ @@ -282,7 +360,7 @@ func (g *genDeepCopy) doMap(t *types.Type, sw *generator.SnippetWriter) { if t.Elem.IsAssignable() { sw.Do("(*out)[key] = val\n", nil) } else { - if copyableWithinPackage(t.Elem) { + if g.canInlineTypeFn(g.context, t.Elem) { sw.Do("newVal := new($.|raw$)\n", t.Elem) funcName := g.funcNameTmpl(t.Elem) sw.Do(fmt.Sprintf("if err := %s(val, newVal, c); err != nil {\n", funcName), argsFromType(t.Elem)) @@ -313,7 +391,7 @@ func (g *genDeepCopy) doSlice(t *types.Type, sw *generator.SnippetWriter) { sw.Do("for i := range in {\n", nil) if t.Elem.IsAssignable() { sw.Do("(*out)[i] = in[i]\n", nil) - } else if copyableWithinPackage(t.Elem) { + } else if g.canInlineTypeFn(g.context, t.Elem) { funcName := g.funcNameTmpl(t.Elem) sw.Do(fmt.Sprintf("if err := %s(in[i], &(*out)[i], c); err != nil {\n", funcName), argsFromType(t.Elem)) sw.Do("return err\n", nil) @@ -346,7 +424,7 @@ func (g *genDeepCopy) doStruct(t *types.Type, sw *generator.SnippetWriter) { sw.Do("out.$.name$ = nil\n", args) sw.Do("}\n", nil) case types.Struct: - if copyableWithinPackage(m.Type) { + if g.canInlineTypeFn(g.context, m.Type) { funcName := g.funcNameTmpl(m.Type) sw.Do(fmt.Sprintf("if err := %s(in.$.name$, &out.$.name$, c); err != nil {\n", funcName), args) sw.Do("return err\n", nil) @@ -383,7 +461,7 @@ func (g *genDeepCopy) doPointer(t *types.Type, sw *generator.SnippetWriter) { sw.Do("*out = new($.Elem|raw$)\n", t) if t.Elem.Kind == types.Builtin { sw.Do("**out = *in", nil) - } else if copyableWithinPackage(t.Elem) { + } else if g.canInlineTypeFn(g.context, t.Elem) { funcName := g.funcNameTmpl(t.Elem) sw.Do(fmt.Sprintf("if err := %s(*in, *out, c); err != nil {\n", funcName), argsFromType(t.Elem)) sw.Do("return err\n", nil) diff --git a/cmd/libs/go2idl/deepcopy-gen/main.go b/cmd/libs/go2idl/deepcopy-gen/main.go index 4d39c8a1c13..b0cc9725dbf 100644 --- a/cmd/libs/go2idl/deepcopy-gen/main.go +++ b/cmd/libs/go2idl/deepcopy-gen/main.go @@ -31,6 +31,11 @@ import ( func main() { arguments := args.Default() + arguments.CustomArgs = generators.Constraints{ + // Types outside of this package will be inlined. + PackageConstraints: []string{"k8s.io/kubernetes/"}, + } + // Override defaults. These are Kubernetes specific input locations. arguments.InputDirs = []string{ "k8s.io/kubernetes/pkg/api", @@ -56,6 +61,19 @@ func main() { "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1", "k8s.io/kubernetes/federation/apis/federation", "k8s.io/kubernetes/federation/apis/federation/v1alpha1", + + // generate all types, but do not register them + "+k8s.io/kubernetes/pkg/api/unversioned", + + "-k8s.io/kubernetes/pkg/api/meta", + "-k8s.io/kubernetes/pkg/api/meta/metatypes", + "-k8s.io/kubernetes/pkg/api/resource", + "-k8s.io/kubernetes/pkg/conversion", + "-k8s.io/kubernetes/pkg/labels", + "-k8s.io/kubernetes/pkg/runtime", + "-k8s.io/kubernetes/pkg/runtime/serializer", + "-k8s.io/kubernetes/pkg/util/intstr", + "-k8s.io/kubernetes/pkg/util/sets", } if err := arguments.Execute( diff --git a/pkg/api/resource/quantity.go b/pkg/api/resource/quantity.go index ddff16436d1..8784bb19a50 100644 --- a/pkg/api/resource/quantity.go +++ b/pkg/api/resource/quantity.go @@ -87,6 +87,7 @@ import ( // writing some sort of special handling code in the hopes that that will // cause implementors to also use a fixed point implementation. // +// +gencopy=false // +protobuf=true // +protobuf.embed=string // +protobuf.options.marshal=false diff --git a/pkg/runtime/types.go b/pkg/runtime/types.go index 33f7c3630fa..e646d2afaf9 100644 --- a/pkg/runtime/types.go +++ b/pkg/runtime/types.go @@ -40,6 +40,7 @@ import ( // TypeMeta is provided here for convenience. You may use it directly from this package or define // your own with the same fields. // +// +gencopy=true // +protobuf=true type TypeMeta struct { APIVersion string `json:"apiVersion,omitempty" yaml:"apiVersion,omitempty" protobuf:"bytes,1,opt,name=apiVersion"` @@ -92,6 +93,7 @@ const ( // in the Object. (TODO: In the case where the object is of an unknown type, a // runtime.Unknown object will be created and stored.) // +// +gencopy=true // +protobuf=true type RawExtension struct { // Raw is the underlying serialization of this object. @@ -109,6 +111,7 @@ type RawExtension struct { // TODO: Make this object have easy access to field based accessors and settors for // metadata and field mutatation. // +// +gencopy=true // +protobuf=true type Unknown struct { TypeMeta `json:",inline" protobuf:"bytes,1,opt,name=typeMeta"` diff --git a/pkg/util/intstr/intstr.go b/pkg/util/intstr/intstr.go index 3724a717fb1..53bc0fc7e62 100644 --- a/pkg/util/intstr/intstr.go +++ b/pkg/util/intstr/intstr.go @@ -32,6 +32,7 @@ import ( // accept a name or number. // TODO: Rename to Int32OrString // +// +gencopy=true // +protobuf=true // +protobuf.options.(gogoproto.goproto_stringer)=false type IntOrString struct { From 460726c67d50cf23bc0a34edeb0f7401be5c4414 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Mon, 6 Jun 2016 16:13:48 -0400 Subject: [PATCH 2/3] Use inline assignment on string alias deep copies --- cmd/libs/go2idl/deepcopy-gen/generators/deepcopy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/libs/go2idl/deepcopy-gen/generators/deepcopy.go b/cmd/libs/go2idl/deepcopy-gen/generators/deepcopy.go index f6798d27194..0c88a1c8777 100644 --- a/cmd/libs/go2idl/deepcopy-gen/generators/deepcopy.go +++ b/cmd/libs/go2idl/deepcopy-gen/generators/deepcopy.go @@ -459,7 +459,7 @@ func (g *genDeepCopy) doInterface(t *types.Type, sw *generator.SnippetWriter) { func (g *genDeepCopy) doPointer(t *types.Type, sw *generator.SnippetWriter) { sw.Do("*out = new($.Elem|raw$)\n", t) - if t.Elem.Kind == types.Builtin { + if t.Elem.IsAssignable() { sw.Do("**out = *in", nil) } else if g.canInlineTypeFn(g.context, t.Elem) { funcName := g.funcNameTmpl(t.Elem) From e1dc3ef93365b3e75767e28a41c6aefbe41fc20c Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Mon, 6 Jun 2016 13:29:48 -0400 Subject: [PATCH 3/3] Remove unused deep_copies --- pkg/api/deep_copy_generated.go | 6 +- pkg/api/meta/deep_copy_generated.go | 154 --------------- pkg/api/meta/metatypes/deep_copy_generated.go | 37 ---- pkg/api/resource/generated.proto | 1 + pkg/api/unversioned/deep_copy_generated.go | 3 +- pkg/api/v1/deep_copy_generated.go | 6 +- pkg/apis/extensions/deep_copy_generated.go | 6 +- .../extensions/v1beta1/deep_copy_generated.go | 6 +- pkg/conversion/deep_copy_generated.go | 185 ------------------ pkg/labels/deep_copy_generated.go | 45 ----- pkg/runtime/deep_copy_generated.go | 113 ++--------- pkg/runtime/generated.proto | 3 + pkg/runtime/serializer/deep_copy_generated.go | 80 -------- pkg/util/intstr/generated.proto | 1 + pkg/util/sets/deep_copy_generated.go | 29 --- 15 files changed, 24 insertions(+), 651 deletions(-) delete mode 100644 pkg/api/meta/deep_copy_generated.go delete mode 100644 pkg/api/meta/metatypes/deep_copy_generated.go delete mode 100644 pkg/conversion/deep_copy_generated.go delete mode 100644 pkg/labels/deep_copy_generated.go delete mode 100644 pkg/runtime/serializer/deep_copy_generated.go delete mode 100644 pkg/util/sets/deep_copy_generated.go diff --git a/pkg/api/deep_copy_generated.go b/pkg/api/deep_copy_generated.go index 7ceea68b1ff..8501160ecf7 100644 --- a/pkg/api/deep_copy_generated.go +++ b/pkg/api/deep_copy_generated.go @@ -2480,11 +2480,7 @@ func DeepCopy_api_Preconditions(in Preconditions, out *Preconditions, c *convers if in.UID != nil { in, out := in.UID, &out.UID *out = new(types.UID) - if newVal, err := c.DeepCopy(*in); err != nil { - return err - } else { - **out = newVal.(types.UID) - } + **out = *in } else { out.UID = nil } diff --git a/pkg/api/meta/deep_copy_generated.go b/pkg/api/meta/deep_copy_generated.go deleted file mode 100644 index 8fbea282355..00000000000 --- a/pkg/api/meta/deep_copy_generated.go +++ /dev/null @@ -1,154 +0,0 @@ -// +build !ignore_autogenerated - -/* -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. -*/ - -// This file was autogenerated by deepcopy-gen. Do not edit it manually! - -package meta - -import ( - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - conversion "k8s.io/kubernetes/pkg/conversion" - runtime "k8s.io/kubernetes/pkg/runtime" -) - -func DeepCopy_meta_DefaultRESTMapper(in DefaultRESTMapper, out *DefaultRESTMapper, c *conversion.Cloner) error { - if in.defaultGroupVersions != nil { - in, out := in.defaultGroupVersions, &out.defaultGroupVersions - *out = make([]unversioned.GroupVersion, len(in)) - for i := range in { - if err := unversioned.DeepCopy_unversioned_GroupVersion(in[i], &(*out)[i], c); err != nil { - return err - } - } - } else { - out.defaultGroupVersions = nil - } - if in.resourceToKind != nil { - in, out := in.resourceToKind, &out.resourceToKind - *out = make(map[unversioned.GroupVersionResource]unversioned.GroupVersionKind) - for range in { - // FIXME: Copying unassignable keys unsupported unversioned.GroupVersionResource - } - } else { - out.resourceToKind = nil - } - if in.kindToPluralResource != nil { - in, out := in.kindToPluralResource, &out.kindToPluralResource - *out = make(map[unversioned.GroupVersionKind]unversioned.GroupVersionResource) - for range in { - // FIXME: Copying unassignable keys unsupported unversioned.GroupVersionKind - } - } else { - out.kindToPluralResource = nil - } - if in.kindToScope != nil { - in, out := in.kindToScope, &out.kindToScope - *out = make(map[unversioned.GroupVersionKind]RESTScope) - for range in { - // FIXME: Copying unassignable keys unsupported unversioned.GroupVersionKind - } - } else { - out.kindToScope = nil - } - if in.singularToPlural != nil { - in, out := in.singularToPlural, &out.singularToPlural - *out = make(map[unversioned.GroupVersionResource]unversioned.GroupVersionResource) - for range in { - // FIXME: Copying unassignable keys unsupported unversioned.GroupVersionResource - } - } else { - out.singularToPlural = nil - } - if in.pluralToSingular != nil { - in, out := in.pluralToSingular, &out.pluralToSingular - *out = make(map[unversioned.GroupVersionResource]unversioned.GroupVersionResource) - for range in { - // FIXME: Copying unassignable keys unsupported unversioned.GroupVersionResource - } - } else { - out.pluralToSingular = nil - } - if in.interfacesFunc == nil { - out.interfacesFunc = nil - } else if newVal, err := c.DeepCopy(in.interfacesFunc); err != nil { - return err - } else { - out.interfacesFunc = newVal.(VersionInterfacesFunc) - } - if in.aliasToResource != nil { - in, out := in.aliasToResource, &out.aliasToResource - *out = make(map[string][]string) - for key, val := range in { - if newVal, err := c.DeepCopy(val); err != nil { - return err - } else { - (*out)[key] = newVal.([]string) - } - } - } else { - out.aliasToResource = nil - } - return nil -} - -func DeepCopy_meta_RESTMapping(in RESTMapping, out *RESTMapping, c *conversion.Cloner) error { - out.Resource = in.Resource - if err := unversioned.DeepCopy_unversioned_GroupVersionKind(in.GroupVersionKind, &out.GroupVersionKind, c); err != nil { - return err - } - if in.Scope == nil { - out.Scope = nil - } else if newVal, err := c.DeepCopy(in.Scope); err != nil { - return err - } else { - out.Scope = newVal.(RESTScope) - } - if in.ObjectConvertor == nil { - out.ObjectConvertor = nil - } else if newVal, err := c.DeepCopy(in.ObjectConvertor); err != nil { - return err - } else { - out.ObjectConvertor = newVal.(runtime.ObjectConvertor) - } - if in.MetadataAccessor == nil { - out.MetadataAccessor = nil - } else if newVal, err := c.DeepCopy(in.MetadataAccessor); err != nil { - return err - } else { - out.MetadataAccessor = newVal.(MetadataAccessor) - } - return nil -} - -func DeepCopy_meta_VersionInterfaces(in VersionInterfaces, out *VersionInterfaces, c *conversion.Cloner) error { - if in.ObjectConvertor == nil { - out.ObjectConvertor = nil - } else if newVal, err := c.DeepCopy(in.ObjectConvertor); err != nil { - return err - } else { - out.ObjectConvertor = newVal.(runtime.ObjectConvertor) - } - if in.MetadataAccessor == nil { - out.MetadataAccessor = nil - } else if newVal, err := c.DeepCopy(in.MetadataAccessor); err != nil { - return err - } else { - out.MetadataAccessor = newVal.(MetadataAccessor) - } - return nil -} diff --git a/pkg/api/meta/metatypes/deep_copy_generated.go b/pkg/api/meta/metatypes/deep_copy_generated.go deleted file mode 100644 index 5033d2494cc..00000000000 --- a/pkg/api/meta/metatypes/deep_copy_generated.go +++ /dev/null @@ -1,37 +0,0 @@ -// +build !ignore_autogenerated - -/* -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. -*/ - -// This file was autogenerated by deepcopy-gen. Do not edit it manually! - -package metatypes - -import ( - conversion "k8s.io/kubernetes/pkg/conversion" -) - -func DeepCopy_metatypes_OwnerReference(in OwnerReference, out *OwnerReference, c *conversion.Cloner) error { - out.APIVersion = in.APIVersion - out.Kind = in.Kind - out.UID = in.UID - out.Name = in.Name - if in.Controller != nil { - value := *in.Controller - out.Controller = &value - } - return nil -} diff --git a/pkg/api/resource/generated.proto b/pkg/api/resource/generated.proto index 8a1376c32e1..e1c2a3d6080 100644 --- a/pkg/api/resource/generated.proto +++ b/pkg/api/resource/generated.proto @@ -83,6 +83,7 @@ option go_package = "resource"; // writing some sort of special handling code in the hopes that that will // cause implementors to also use a fixed point implementation. // +// +gencopy=false // +protobuf=true // +protobuf.embed=string // +protobuf.options.marshal=false diff --git a/pkg/api/unversioned/deep_copy_generated.go b/pkg/api/unversioned/deep_copy_generated.go index c4a551d657b..ff8f1f0d66f 100644 --- a/pkg/api/unversioned/deep_copy_generated.go +++ b/pkg/api/unversioned/deep_copy_generated.go @@ -21,9 +21,8 @@ limitations under the License. package unversioned import ( - "time" - conversion "k8s.io/kubernetes/pkg/conversion" + time "time" ) func DeepCopy_unversioned_APIGroup(in APIGroup, out *APIGroup, c *conversion.Cloner) error { diff --git a/pkg/api/v1/deep_copy_generated.go b/pkg/api/v1/deep_copy_generated.go index 9059bc8bd80..a4cb2c8fd3b 100644 --- a/pkg/api/v1/deep_copy_generated.go +++ b/pkg/api/v1/deep_copy_generated.go @@ -2428,11 +2428,7 @@ func DeepCopy_v1_Preconditions(in Preconditions, out *Preconditions, c *conversi if in.UID != nil { in, out := in.UID, &out.UID *out = new(types.UID) - if newVal, err := c.DeepCopy(*in); err != nil { - return err - } else { - **out = newVal.(types.UID) - } + **out = *in } else { out.UID = nil } diff --git a/pkg/apis/extensions/deep_copy_generated.go b/pkg/apis/extensions/deep_copy_generated.go index 0d365411787..118d478c28b 100644 --- a/pkg/apis/extensions/deep_copy_generated.go +++ b/pkg/apis/extensions/deep_copy_generated.go @@ -576,11 +576,7 @@ func DeepCopy_extensions_NetworkPolicyPort(in NetworkPolicyPort, out *NetworkPol if in.Protocol != nil { in, out := in.Protocol, &out.Protocol *out = new(api.Protocol) - if newVal, err := c.DeepCopy(*in); err != nil { - return err - } else { - **out = newVal.(api.Protocol) - } + **out = *in } else { out.Protocol = nil } diff --git a/pkg/apis/extensions/v1beta1/deep_copy_generated.go b/pkg/apis/extensions/v1beta1/deep_copy_generated.go index dd33d0d08f5..32debd197f0 100644 --- a/pkg/apis/extensions/v1beta1/deep_copy_generated.go +++ b/pkg/apis/extensions/v1beta1/deep_copy_generated.go @@ -888,11 +888,7 @@ func DeepCopy_v1beta1_NetworkPolicyPort(in NetworkPolicyPort, out *NetworkPolicy if in.Protocol != nil { in, out := in.Protocol, &out.Protocol *out = new(v1.Protocol) - if newVal, err := c.DeepCopy(*in); err != nil { - return err - } else { - **out = newVal.(v1.Protocol) - } + **out = *in } else { out.Protocol = nil } diff --git a/pkg/conversion/deep_copy_generated.go b/pkg/conversion/deep_copy_generated.go deleted file mode 100644 index 717feaf18f2..00000000000 --- a/pkg/conversion/deep_copy_generated.go +++ /dev/null @@ -1,185 +0,0 @@ -// +build !ignore_autogenerated - -/* -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. -*/ - -// This file was autogenerated by deepcopy-gen. Do not edit it manually! - -package conversion - -import ( - forked_reflect "k8s.io/kubernetes/third_party/forked/reflect" - reflect "reflect" -) - -func DeepCopy_conversion_Cloner(in Cloner, out *Cloner, c *Cloner) error { - if in.deepCopyFuncs != nil { - in, out := in.deepCopyFuncs, &out.deepCopyFuncs - *out = make(map[reflect.Type]reflect.Value) - for range in { - // FIXME: Copying unassignable keys unsupported reflect.Type - } - } else { - out.deepCopyFuncs = nil - } - if in.generatedDeepCopyFuncs != nil { - in, out := in.generatedDeepCopyFuncs, &out.generatedDeepCopyFuncs - *out = make(map[reflect.Type]reflect.Value) - for range in { - // FIXME: Copying unassignable keys unsupported reflect.Type - } - } else { - out.generatedDeepCopyFuncs = nil - } - return nil -} - -func DeepCopy_conversion_ConversionFuncs(in ConversionFuncs, out *ConversionFuncs, c *Cloner) error { - if in.fns != nil { - in, out := in.fns, &out.fns - *out = make(map[typePair]reflect.Value) - for range in { - // FIXME: Copying unassignable keys unsupported typePair - } - } else { - out.fns = nil - } - return nil -} - -func DeepCopy_conversion_Converter(in Converter, out *Converter, c *Cloner) error { - if err := DeepCopy_conversion_ConversionFuncs(in.conversionFuncs, &out.conversionFuncs, c); err != nil { - return err - } - if err := DeepCopy_conversion_ConversionFuncs(in.generatedConversionFuncs, &out.generatedConversionFuncs, c); err != nil { - return err - } - if in.genericConversions != nil { - in, out := in.genericConversions, &out.genericConversions - *out = make([]GenericConversionFunc, len(in)) - for i := range in { - if newVal, err := c.DeepCopy(in[i]); err != nil { - return err - } else { - (*out)[i] = newVal.(GenericConversionFunc) - } - } - } else { - out.genericConversions = nil - } - if in.ignoredConversions != nil { - in, out := in.ignoredConversions, &out.ignoredConversions - *out = make(map[typePair]struct{}) - for range in { - // FIXME: Copying unassignable keys unsupported typePair - } - } else { - out.ignoredConversions = nil - } - if in.structFieldDests != nil { - in, out := in.structFieldDests, &out.structFieldDests - *out = make(map[typeNamePair][]typeNamePair) - for range in { - // FIXME: Copying unassignable keys unsupported typeNamePair - } - } else { - out.structFieldDests = nil - } - if in.structFieldSources != nil { - in, out := in.structFieldSources, &out.structFieldSources - *out = make(map[typeNamePair][]typeNamePair) - for range in { - // FIXME: Copying unassignable keys unsupported typeNamePair - } - } else { - out.structFieldSources = nil - } - if in.defaultingFuncs != nil { - in, out := in.defaultingFuncs, &out.defaultingFuncs - *out = make(map[reflect.Type]reflect.Value) - for range in { - // FIXME: Copying unassignable keys unsupported reflect.Type - } - } else { - out.defaultingFuncs = nil - } - if in.defaultingInterfaces != nil { - in, out := in.defaultingInterfaces, &out.defaultingInterfaces - *out = make(map[reflect.Type]interface{}) - for range in { - // FIXME: Copying unassignable keys unsupported reflect.Type - } - } else { - out.defaultingInterfaces = nil - } - if in.inputFieldMappingFuncs != nil { - in, out := in.inputFieldMappingFuncs, &out.inputFieldMappingFuncs - *out = make(map[reflect.Type]FieldMappingFunc) - for range in { - // FIXME: Copying unassignable keys unsupported reflect.Type - } - } else { - out.inputFieldMappingFuncs = nil - } - if in.inputDefaultFlags != nil { - in, out := in.inputDefaultFlags, &out.inputDefaultFlags - *out = make(map[reflect.Type]FieldMatchingFlags) - for range in { - // FIXME: Copying unassignable keys unsupported reflect.Type - } - } else { - out.inputDefaultFlags = nil - } - if in.Debug == nil { - out.Debug = nil - } else if newVal, err := c.DeepCopy(in.Debug); err != nil { - return err - } else { - out.Debug = newVal.(DebugLogger) - } - if in.nameFunc == nil { - out.nameFunc = nil - } else if newVal, err := c.DeepCopy(in.nameFunc); err != nil { - return err - } else { - out.nameFunc = newVal.(func(reflect.Type) string) - } - return nil -} - -func DeepCopy_conversion_Equalities(in Equalities, out *Equalities, c *Cloner) error { - if in.Equalities != nil { - in, out := in.Equalities, &out.Equalities - *out = make(forked_reflect.Equalities) - for range in { - // FIXME: Copying unassignable keys unsupported reflect.Type - } - } else { - out.Equalities = nil - } - return nil -} - -func DeepCopy_conversion_Meta(in Meta, out *Meta, c *Cloner) error { - if in.KeyNameMapping == nil { - out.KeyNameMapping = nil - } else if newVal, err := c.DeepCopy(in.KeyNameMapping); err != nil { - return err - } else { - out.KeyNameMapping = newVal.(FieldMappingFunc) - } - return nil -} diff --git a/pkg/labels/deep_copy_generated.go b/pkg/labels/deep_copy_generated.go deleted file mode 100644 index e48099d2df4..00000000000 --- a/pkg/labels/deep_copy_generated.go +++ /dev/null @@ -1,45 +0,0 @@ -// +build !ignore_autogenerated - -/* -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. -*/ - -// This file was autogenerated by deepcopy-gen. Do not edit it manually! - -package labels - -import ( - conversion "k8s.io/kubernetes/pkg/conversion" - sets "k8s.io/kubernetes/pkg/util/sets" -) - -func DeepCopy_labels_Requirement(in Requirement, out *Requirement, c *conversion.Cloner) error { - out.key = in.key - out.operator = in.operator - if in.strValues != nil { - in, out := in.strValues, &out.strValues - *out = make(sets.String) - for key, val := range in { - newVal := new(sets.Empty) - if err := sets.DeepCopy_sets_Empty(val, newVal, c); err != nil { - return err - } - (*out)[key] = *newVal - } - } else { - out.strValues = nil - } - return nil -} diff --git a/pkg/runtime/deep_copy_generated.go b/pkg/runtime/deep_copy_generated.go index 988b9740177..fad426daa68 100644 --- a/pkg/runtime/deep_copy_generated.go +++ b/pkg/runtime/deep_copy_generated.go @@ -21,9 +21,7 @@ limitations under the License. package runtime import ( - unversioned "k8s.io/kubernetes/pkg/api/unversioned" conversion "k8s.io/kubernetes/pkg/conversion" - reflect "reflect" ) func DeepCopy_runtime_RawExtension(in RawExtension, out *RawExtension, c *conversion.Cloner) error { @@ -44,107 +42,24 @@ func DeepCopy_runtime_RawExtension(in RawExtension, out *RawExtension, c *conver return nil } -func DeepCopy_runtime_Scheme(in Scheme, out *Scheme, c *conversion.Cloner) error { - if in.gvkToType != nil { - in, out := in.gvkToType, &out.gvkToType - *out = make(map[unversioned.GroupVersionKind]reflect.Type) - for range in { - // FIXME: Copying unassignable keys unsupported unversioned.GroupVersionKind - } - } else { - out.gvkToType = nil - } - if in.typeToGVK != nil { - in, out := in.typeToGVK, &out.typeToGVK - *out = make(map[reflect.Type][]unversioned.GroupVersionKind) - for range in { - // FIXME: Copying unassignable keys unsupported reflect.Type - } - } else { - out.typeToGVK = nil - } - if in.unversionedTypes != nil { - in, out := in.unversionedTypes, &out.unversionedTypes - *out = make(map[reflect.Type]unversioned.GroupVersionKind) - for range in { - // FIXME: Copying unassignable keys unsupported reflect.Type - } - } else { - out.unversionedTypes = nil - } - if in.unversionedKinds != nil { - in, out := in.unversionedKinds, &out.unversionedKinds - *out = make(map[string]reflect.Type) - for key, val := range in { - if newVal, err := c.DeepCopy(val); err != nil { - return err - } else { - (*out)[key] = newVal.(reflect.Type) - } - } - } else { - out.unversionedKinds = nil - } - if in.fieldLabelConversionFuncs != nil { - in, out := in.fieldLabelConversionFuncs, &out.fieldLabelConversionFuncs - *out = make(map[string]map[string]FieldLabelConversionFunc) - for key, val := range in { - if newVal, err := c.DeepCopy(val); err != nil { - return err - } else { - (*out)[key] = newVal.(map[string]FieldLabelConversionFunc) - } - } - } else { - out.fieldLabelConversionFuncs = nil - } - if in.converter != nil { - in, out := in.converter, &out.converter - *out = new(conversion.Converter) - if err := conversion.DeepCopy_conversion_Converter(*in, *out, c); err != nil { - return err - } - } else { - out.converter = nil - } - if in.cloner != nil { - in, out := in.cloner, &out.cloner - *out = new(conversion.Cloner) - if err := conversion.DeepCopy_conversion_Cloner(*in, *out, c); err != nil { - return err - } - } else { - out.cloner = nil - } +func DeepCopy_runtime_TypeMeta(in TypeMeta, out *TypeMeta, c *conversion.Cloner) error { + out.APIVersion = in.APIVersion + out.Kind = in.Kind return nil } -func DeepCopy_runtime_SerializerInfo(in SerializerInfo, out *SerializerInfo, c *conversion.Cloner) error { - if in.Serializer == nil { - out.Serializer = nil - } else if newVal, err := c.DeepCopy(in.Serializer); err != nil { - return err - } else { - out.Serializer = newVal.(Serializer) - } - out.EncodesAsText = in.EncodesAsText - out.MediaType = in.MediaType - return nil -} - -func DeepCopy_runtime_StreamSerializerInfo(in StreamSerializerInfo, out *StreamSerializerInfo, c *conversion.Cloner) error { - if err := DeepCopy_runtime_SerializerInfo(in.SerializerInfo, &out.SerializerInfo, c); err != nil { - return err - } - if in.Framer == nil { - out.Framer = nil - } else if newVal, err := c.DeepCopy(in.Framer); err != nil { - return err - } else { - out.Framer = newVal.(Framer) - } - if err := DeepCopy_runtime_SerializerInfo(in.Embedded, &out.Embedded, c); err != nil { +func DeepCopy_runtime_Unknown(in Unknown, out *Unknown, c *conversion.Cloner) error { + if err := DeepCopy_runtime_TypeMeta(in.TypeMeta, &out.TypeMeta, c); err != nil { return err } + if in.Raw != nil { + in, out := in.Raw, &out.Raw + *out = make([]byte, len(in)) + copy(*out, in) + } else { + out.Raw = nil + } + out.ContentEncoding = in.ContentEncoding + out.ContentType = in.ContentType return nil } diff --git a/pkg/runtime/generated.proto b/pkg/runtime/generated.proto index c878b49968d..852721228fc 100644 --- a/pkg/runtime/generated.proto +++ b/pkg/runtime/generated.proto @@ -69,6 +69,7 @@ option go_package = "runtime"; // in the Object. (TODO: In the case where the object is of an unknown type, a // runtime.Unknown object will be created and stored.) // +// +gencopy=true // +protobuf=true message RawExtension { // Raw is the underlying serialization of this object. @@ -88,6 +89,7 @@ message RawExtension { // TypeMeta is provided here for convenience. You may use it directly from this package or define // your own with the same fields. // +// +gencopy=true // +protobuf=true message TypeMeta { optional string apiVersion = 1; @@ -101,6 +103,7 @@ message TypeMeta { // TODO: Make this object have easy access to field based accessors and settors for // metadata and field mutatation. // +// +gencopy=true // +protobuf=true message Unknown { optional TypeMeta typeMeta = 1; diff --git a/pkg/runtime/serializer/deep_copy_generated.go b/pkg/runtime/serializer/deep_copy_generated.go deleted file mode 100644 index afeecabc2bd..00000000000 --- a/pkg/runtime/serializer/deep_copy_generated.go +++ /dev/null @@ -1,80 +0,0 @@ -// +build !ignore_autogenerated - -/* -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. -*/ - -// This file was autogenerated by deepcopy-gen. Do not edit it manually! - -package serializer - -import ( - conversion "k8s.io/kubernetes/pkg/conversion" - runtime "k8s.io/kubernetes/pkg/runtime" -) - -func DeepCopy_serializer_CodecFactory(in CodecFactory, out *CodecFactory, c *conversion.Cloner) error { - if in.scheme != nil { - in, out := in.scheme, &out.scheme - *out = new(runtime.Scheme) - if err := runtime.DeepCopy_runtime_Scheme(*in, *out, c); err != nil { - return err - } - } else { - out.scheme = nil - } - if in.serializers != nil { - in, out := in.serializers, &out.serializers - *out = make([]serializerType, len(in)) - for i := range in { - if newVal, err := c.DeepCopy(in[i]); err != nil { - return err - } else { - (*out)[i] = newVal.(serializerType) - } - } - } else { - out.serializers = nil - } - if in.universal == nil { - out.universal = nil - } else if newVal, err := c.DeepCopy(in.universal); err != nil { - return err - } else { - out.universal = newVal.(runtime.Decoder) - } - if in.accepts != nil { - in, out := in.accepts, &out.accepts - *out = make([]string, len(in)) - copy(*out, in) - } else { - out.accepts = nil - } - if in.streamingAccepts != nil { - in, out := in.streamingAccepts, &out.streamingAccepts - *out = make([]string, len(in)) - copy(*out, in) - } else { - out.streamingAccepts = nil - } - if in.legacySerializer == nil { - out.legacySerializer = nil - } else if newVal, err := c.DeepCopy(in.legacySerializer); err != nil { - return err - } else { - out.legacySerializer = newVal.(runtime.Serializer) - } - return nil -} diff --git a/pkg/util/intstr/generated.proto b/pkg/util/intstr/generated.proto index 834a20db900..32ad1b6b1be 100644 --- a/pkg/util/intstr/generated.proto +++ b/pkg/util/intstr/generated.proto @@ -30,6 +30,7 @@ option go_package = "intstr"; // accept a name or number. // TODO: Rename to Int32OrString // +// +gencopy=true // +protobuf=true // +protobuf.options.(gogoproto.goproto_stringer)=false message IntOrString { diff --git a/pkg/util/sets/deep_copy_generated.go b/pkg/util/sets/deep_copy_generated.go deleted file mode 100644 index f11c387441d..00000000000 --- a/pkg/util/sets/deep_copy_generated.go +++ /dev/null @@ -1,29 +0,0 @@ -// +build !ignore_autogenerated - -/* -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. -*/ - -// This file was autogenerated by deepcopy-gen. Do not edit it manually! - -package sets - -import ( - conversion "k8s.io/kubernetes/pkg/conversion" -) - -func DeepCopy_sets_Empty(in Empty, out *Empty, c *conversion.Cloner) error { - return nil -}