Revert "Revert "Improve conversion to support multiple packages""

This reverts commit 94a387d5d1.
This commit is contained in:
Clayton Coleman 2015-07-30 15:15:14 -04:00
parent 33278e7910
commit 0f9fdcafea
8 changed files with 389 additions and 139 deletions

View File

@ -17,13 +17,16 @@ limitations under the License.
package main package main
import ( import (
"fmt"
"io" "io"
"os" "os"
"path"
"runtime" "runtime"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api" "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
_ "github.com/GoogleCloudPlatform/kubernetes/pkg/api/v1" _ "github.com/GoogleCloudPlatform/kubernetes/pkg/api/v1"
pkg_runtime "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" pkg_runtime "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
"github.com/golang/glog" "github.com/golang/glog"
flag "github.com/spf13/pflag" flag "github.com/spf13/pflag"
@ -50,7 +53,9 @@ func main() {
funcOut = file funcOut = file
} }
generator := pkg_runtime.NewConversionGenerator(api.Scheme.Raw()) generator := pkg_runtime.NewConversionGenerator(api.Scheme.Raw(), path.Join("github.com/GoogleCloudPlatform/kubernetes/pkg/api", *version))
apiShort := generator.AddImport("github.com/GoogleCloudPlatform/kubernetes/pkg/api")
generator.AddImport("github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource")
// TODO(wojtek-t): Change the overwrites to a flag. // TODO(wojtek-t): Change the overwrites to a flag.
generator.OverwritePackage(*version, "") generator.OverwritePackage(*version, "")
for _, knownType := range api.Scheme.KnownTypes(*version) { for _, knownType := range api.Scheme.KnownTypes(*version) {
@ -58,10 +63,14 @@ func main() {
glog.Errorf("error while generating conversion functions for %v: %v", knownType, err) glog.Errorf("error while generating conversion functions for %v: %v", knownType, err)
} }
} }
generator.RepackImports(util.NewStringSet())
if err := generator.WriteImports(funcOut); err != nil {
glog.Fatalf("error while writing imports: %v", err)
}
if err := generator.WriteConversionFunctions(funcOut); err != nil { if err := generator.WriteConversionFunctions(funcOut); err != nil {
glog.Fatalf("Error while writing conversion functions: %v", err) glog.Fatalf("Error while writing conversion functions: %v", err)
} }
if err := generator.RegisterConversionFunctions(funcOut); err != nil { if err := generator.RegisterConversionFunctions(funcOut, fmt.Sprintf("%s.Scheme", apiShort)); err != nil {
glog.Fatalf("Error while writing conversion functions: %v", err) glog.Fatalf("Error while writing conversion functions: %v", err)
} }
} }

View File

@ -19,12 +19,14 @@ package main
import ( import (
"io" "io"
"os" "os"
"path"
"runtime" "runtime"
"strings" "strings"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api" "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
_ "github.com/GoogleCloudPlatform/kubernetes/pkg/api/v1" _ "github.com/GoogleCloudPlatform/kubernetes/pkg/api/v1"
pkg_runtime "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" pkg_runtime "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
"github.com/golang/glog" "github.com/golang/glog"
flag "github.com/spf13/pflag" flag "github.com/spf13/pflag"
@ -53,10 +55,14 @@ func main() {
} }
knownVersion := *version knownVersion := *version
registerTo := "api.Scheme"
if knownVersion == "api" { if knownVersion == "api" {
knownVersion = api.Scheme.Raw().InternalVersion knownVersion = api.Scheme.Raw().InternalVersion
registerTo = "Scheme"
} }
generator := pkg_runtime.NewDeepCopyGenerator(api.Scheme.Raw()) pkgPath := path.Join("github.com/GoogleCloudPlatform/kubernetes/pkg/api", knownVersion)
generator := pkg_runtime.NewDeepCopyGenerator(api.Scheme.Raw(), pkgPath, util.NewStringSet("github.com/GoogleCloudPlatform/kubernetes"))
generator.AddImport("github.com/GoogleCloudPlatform/kubernetes/pkg/api")
for _, overwrite := range strings.Split(*overwrites, ",") { for _, overwrite := range strings.Split(*overwrites, ",") {
vals := strings.Split(overwrite, "=") vals := strings.Split(overwrite, "=")
@ -67,13 +73,14 @@ func main() {
glog.Errorf("error while generating deep copy functions for %v: %v", knownType, err) glog.Errorf("error while generating deep copy functions for %v: %v", knownType, err)
} }
} }
if err := generator.WriteImports(funcOut, *version); err != nil { generator.RepackImports()
if err := generator.WriteImports(funcOut); err != nil {
glog.Fatalf("error while writing imports: %v", err) glog.Fatalf("error while writing imports: %v", err)
} }
if err := generator.WriteDeepCopyFunctions(funcOut); err != nil { if err := generator.WriteDeepCopyFunctions(funcOut); err != nil {
glog.Fatalf("error while writing deep copy functions: %v", err) glog.Fatalf("error while writing deep copy functions: %v", err)
} }
if err := generator.RegisterDeepCopyFunctions(funcOut, *version); err != nil { if err := generator.RegisterDeepCopyFunctions(funcOut, registerTo); err != nil {
glog.Fatalf("error while registering deep copy functions: %v", err) glog.Fatalf("error while registering deep copy functions: %v", err)
} }
} }

View File

@ -33,14 +33,6 @@ function generate_version() {
cat >> $TMPFILE <<EOF cat >> $TMPFILE <<EOF
package ${version} package ${version}
import (
"reflect"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource"
"github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
)
// AUTO-GENERATED FUNCTIONS START HERE // AUTO-GENERATED FUNCTIONS START HERE
EOF EOF

View File

@ -18,14 +18,14 @@ package api
// AUTO-GENERATED FUNCTIONS START HERE // AUTO-GENERATED FUNCTIONS START HERE
import ( import (
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource" resource "github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource"
"github.com/GoogleCloudPlatform/kubernetes/pkg/conversion" conversion "github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
"github.com/GoogleCloudPlatform/kubernetes/pkg/fields" fields "github.com/GoogleCloudPlatform/kubernetes/pkg/fields"
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels" labels "github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" runtime "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util" util "github.com/GoogleCloudPlatform/kubernetes/pkg/util"
"speter.net/go/exp/math/dec/inf" inf "speter.net/go/exp/math/dec/inf"
"time" time "time"
) )
func deepCopy_api_AWSElasticBlockStoreVolumeSource(in AWSElasticBlockStoreVolumeSource, out *AWSElasticBlockStoreVolumeSource, c *conversion.Cloner) error { func deepCopy_api_AWSElasticBlockStoreVolumeSource(in AWSElasticBlockStoreVolumeSource, out *AWSElasticBlockStoreVolumeSource, c *conversion.Cloner) error {
@ -587,7 +587,7 @@ func deepCopy_api_LimitRange(in LimitRange, out *LimitRange, c *conversion.Clone
func deepCopy_api_LimitRangeItem(in LimitRangeItem, out *LimitRangeItem, c *conversion.Cloner) error { func deepCopy_api_LimitRangeItem(in LimitRangeItem, out *LimitRangeItem, c *conversion.Cloner) error {
out.Type = in.Type out.Type = in.Type
if in.Max != nil { if in.Max != nil {
out.Max = make(map[ResourceName]resource.Quantity) out.Max = make(ResourceList)
for key, val := range in.Max { for key, val := range in.Max {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -599,7 +599,7 @@ func deepCopy_api_LimitRangeItem(in LimitRangeItem, out *LimitRangeItem, c *conv
out.Max = nil out.Max = nil
} }
if in.Min != nil { if in.Min != nil {
out.Min = make(map[ResourceName]resource.Quantity) out.Min = make(ResourceList)
for key, val := range in.Min { for key, val := range in.Min {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -611,7 +611,7 @@ func deepCopy_api_LimitRangeItem(in LimitRangeItem, out *LimitRangeItem, c *conv
out.Min = nil out.Min = nil
} }
if in.Default != nil { if in.Default != nil {
out.Default = make(map[ResourceName]resource.Quantity) out.Default = make(ResourceList)
for key, val := range in.Default { for key, val := range in.Default {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -857,7 +857,7 @@ func deepCopy_api_NodeSpec(in NodeSpec, out *NodeSpec, c *conversion.Cloner) err
func deepCopy_api_NodeStatus(in NodeStatus, out *NodeStatus, c *conversion.Cloner) error { func deepCopy_api_NodeStatus(in NodeStatus, out *NodeStatus, c *conversion.Cloner) error {
if in.Capacity != nil { if in.Capacity != nil {
out.Capacity = make(map[ResourceName]resource.Quantity) out.Capacity = make(ResourceList)
for key, val := range in.Capacity { for key, val := range in.Capacity {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1041,7 +1041,7 @@ func deepCopy_api_PersistentVolumeClaimStatus(in PersistentVolumeClaimStatus, ou
out.AccessModes = nil out.AccessModes = nil
} }
if in.Capacity != nil { if in.Capacity != nil {
out.Capacity = make(map[ResourceName]resource.Quantity) out.Capacity = make(ResourceList)
for key, val := range in.Capacity { for key, val := range in.Capacity {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1143,7 +1143,7 @@ func deepCopy_api_PersistentVolumeSource(in PersistentVolumeSource, out *Persist
func deepCopy_api_PersistentVolumeSpec(in PersistentVolumeSpec, out *PersistentVolumeSpec, c *conversion.Cloner) error { func deepCopy_api_PersistentVolumeSpec(in PersistentVolumeSpec, out *PersistentVolumeSpec, c *conversion.Cloner) error {
if in.Capacity != nil { if in.Capacity != nil {
out.Capacity = make(map[ResourceName]resource.Quantity) out.Capacity = make(ResourceList)
for key, val := range in.Capacity { for key, val := range in.Capacity {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1571,7 +1571,7 @@ func deepCopy_api_ResourceQuotaList(in ResourceQuotaList, out *ResourceQuotaList
func deepCopy_api_ResourceQuotaSpec(in ResourceQuotaSpec, out *ResourceQuotaSpec, c *conversion.Cloner) error { func deepCopy_api_ResourceQuotaSpec(in ResourceQuotaSpec, out *ResourceQuotaSpec, c *conversion.Cloner) error {
if in.Hard != nil { if in.Hard != nil {
out.Hard = make(map[ResourceName]resource.Quantity) out.Hard = make(ResourceList)
for key, val := range in.Hard { for key, val := range in.Hard {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1587,7 +1587,7 @@ func deepCopy_api_ResourceQuotaSpec(in ResourceQuotaSpec, out *ResourceQuotaSpec
func deepCopy_api_ResourceQuotaStatus(in ResourceQuotaStatus, out *ResourceQuotaStatus, c *conversion.Cloner) error { func deepCopy_api_ResourceQuotaStatus(in ResourceQuotaStatus, out *ResourceQuotaStatus, c *conversion.Cloner) error {
if in.Hard != nil { if in.Hard != nil {
out.Hard = make(map[ResourceName]resource.Quantity) out.Hard = make(ResourceList)
for key, val := range in.Hard { for key, val := range in.Hard {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1599,7 +1599,7 @@ func deepCopy_api_ResourceQuotaStatus(in ResourceQuotaStatus, out *ResourceQuota
out.Hard = nil out.Hard = nil
} }
if in.Used != nil { if in.Used != nil {
out.Used = make(map[ResourceName]resource.Quantity) out.Used = make(ResourceList)
for key, val := range in.Used { for key, val := range in.Used {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1615,7 +1615,7 @@ func deepCopy_api_ResourceQuotaStatus(in ResourceQuotaStatus, out *ResourceQuota
func deepCopy_api_ResourceRequirements(in ResourceRequirements, out *ResourceRequirements, c *conversion.Cloner) error { func deepCopy_api_ResourceRequirements(in ResourceRequirements, out *ResourceRequirements, c *conversion.Cloner) error {
if in.Limits != nil { if in.Limits != nil {
out.Limits = make(map[ResourceName]resource.Quantity) out.Limits = make(ResourceList)
for key, val := range in.Limits { for key, val := range in.Limits {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1627,7 +1627,7 @@ func deepCopy_api_ResourceRequirements(in ResourceRequirements, out *ResourceReq
out.Limits = nil out.Limits = nil
} }
if in.Requests != nil { if in.Requests != nil {
out.Requests = make(map[ResourceName]resource.Quantity) out.Requests = make(ResourceList)
for key, val := range in.Requests { for key, val := range in.Requests {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {

View File

@ -16,15 +16,14 @@ limitations under the License.
package v1 package v1
// AUTO-GENERATED FUNCTIONS START HERE
import ( import (
"reflect" api "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
resource "github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api" conversion "github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource" reflect "reflect"
"github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
) )
// AUTO-GENERATED FUNCTIONS START HERE
func convert_api_AWSElasticBlockStoreVolumeSource_To_v1_AWSElasticBlockStoreVolumeSource(in *api.AWSElasticBlockStoreVolumeSource, out *AWSElasticBlockStoreVolumeSource, s conversion.Scope) error { func convert_api_AWSElasticBlockStoreVolumeSource_To_v1_AWSElasticBlockStoreVolumeSource(in *api.AWSElasticBlockStoreVolumeSource, out *AWSElasticBlockStoreVolumeSource, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*api.AWSElasticBlockStoreVolumeSource))(in) defaulting.(func(*api.AWSElasticBlockStoreVolumeSource))(in)
@ -692,7 +691,7 @@ func convert_api_LimitRangeItem_To_v1_LimitRangeItem(in *api.LimitRangeItem, out
} }
out.Type = LimitType(in.Type) out.Type = LimitType(in.Type)
if in.Max != nil { if in.Max != nil {
out.Max = make(map[ResourceName]resource.Quantity) out.Max = make(ResourceList)
for key, val := range in.Max { for key, val := range in.Max {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -704,7 +703,7 @@ func convert_api_LimitRangeItem_To_v1_LimitRangeItem(in *api.LimitRangeItem, out
out.Max = nil out.Max = nil
} }
if in.Min != nil { if in.Min != nil {
out.Min = make(map[ResourceName]resource.Quantity) out.Min = make(ResourceList)
for key, val := range in.Min { for key, val := range in.Min {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -716,7 +715,7 @@ func convert_api_LimitRangeItem_To_v1_LimitRangeItem(in *api.LimitRangeItem, out
out.Min = nil out.Min = nil
} }
if in.Default != nil { if in.Default != nil {
out.Default = make(map[ResourceName]resource.Quantity) out.Default = make(ResourceList)
for key, val := range in.Default { for key, val := range in.Default {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -1006,7 +1005,7 @@ func convert_api_NodeStatus_To_v1_NodeStatus(in *api.NodeStatus, out *NodeStatus
defaulting.(func(*api.NodeStatus))(in) defaulting.(func(*api.NodeStatus))(in)
} }
if in.Capacity != nil { if in.Capacity != nil {
out.Capacity = make(map[ResourceName]resource.Quantity) out.Capacity = make(ResourceList)
for key, val := range in.Capacity { for key, val := range in.Capacity {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -1216,7 +1215,7 @@ func convert_api_PersistentVolumeClaimStatus_To_v1_PersistentVolumeClaimStatus(i
out.AccessModes = nil out.AccessModes = nil
} }
if in.Capacity != nil { if in.Capacity != nil {
out.Capacity = make(map[ResourceName]resource.Quantity) out.Capacity = make(ResourceList)
for key, val := range in.Capacity { for key, val := range in.Capacity {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -1330,7 +1329,7 @@ func convert_api_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(in *api.Persist
defaulting.(func(*api.PersistentVolumeSpec))(in) defaulting.(func(*api.PersistentVolumeSpec))(in)
} }
if in.Capacity != nil { if in.Capacity != nil {
out.Capacity = make(map[ResourceName]resource.Quantity) out.Capacity = make(ResourceList)
for key, val := range in.Capacity { for key, val := range in.Capacity {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -1735,7 +1734,7 @@ func convert_api_ResourceQuotaSpec_To_v1_ResourceQuotaSpec(in *api.ResourceQuota
defaulting.(func(*api.ResourceQuotaSpec))(in) defaulting.(func(*api.ResourceQuotaSpec))(in)
} }
if in.Hard != nil { if in.Hard != nil {
out.Hard = make(map[ResourceName]resource.Quantity) out.Hard = make(ResourceList)
for key, val := range in.Hard { for key, val := range in.Hard {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -1754,7 +1753,7 @@ func convert_api_ResourceQuotaStatus_To_v1_ResourceQuotaStatus(in *api.ResourceQ
defaulting.(func(*api.ResourceQuotaStatus))(in) defaulting.(func(*api.ResourceQuotaStatus))(in)
} }
if in.Hard != nil { if in.Hard != nil {
out.Hard = make(map[ResourceName]resource.Quantity) out.Hard = make(ResourceList)
for key, val := range in.Hard { for key, val := range in.Hard {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -1766,7 +1765,7 @@ func convert_api_ResourceQuotaStatus_To_v1_ResourceQuotaStatus(in *api.ResourceQ
out.Hard = nil out.Hard = nil
} }
if in.Used != nil { if in.Used != nil {
out.Used = make(map[ResourceName]resource.Quantity) out.Used = make(ResourceList)
for key, val := range in.Used { for key, val := range in.Used {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -1785,7 +1784,7 @@ func convert_api_ResourceRequirements_To_v1_ResourceRequirements(in *api.Resourc
defaulting.(func(*api.ResourceRequirements))(in) defaulting.(func(*api.ResourceRequirements))(in)
} }
if in.Limits != nil { if in.Limits != nil {
out.Limits = make(map[ResourceName]resource.Quantity) out.Limits = make(ResourceList)
for key, val := range in.Limits { for key, val := range in.Limits {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -1797,7 +1796,7 @@ func convert_api_ResourceRequirements_To_v1_ResourceRequirements(in *api.Resourc
out.Limits = nil out.Limits = nil
} }
if in.Requests != nil { if in.Requests != nil {
out.Requests = make(map[ResourceName]resource.Quantity) out.Requests = make(ResourceList)
for key, val := range in.Requests { for key, val := range in.Requests {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -2942,7 +2941,7 @@ func convert_v1_LimitRangeItem_To_api_LimitRangeItem(in *LimitRangeItem, out *ap
} }
out.Type = api.LimitType(in.Type) out.Type = api.LimitType(in.Type)
if in.Max != nil { if in.Max != nil {
out.Max = make(map[api.ResourceName]resource.Quantity) out.Max = make(api.ResourceList)
for key, val := range in.Max { for key, val := range in.Max {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -2954,7 +2953,7 @@ func convert_v1_LimitRangeItem_To_api_LimitRangeItem(in *LimitRangeItem, out *ap
out.Max = nil out.Max = nil
} }
if in.Min != nil { if in.Min != nil {
out.Min = make(map[api.ResourceName]resource.Quantity) out.Min = make(api.ResourceList)
for key, val := range in.Min { for key, val := range in.Min {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -2966,7 +2965,7 @@ func convert_v1_LimitRangeItem_To_api_LimitRangeItem(in *LimitRangeItem, out *ap
out.Min = nil out.Min = nil
} }
if in.Default != nil { if in.Default != nil {
out.Default = make(map[api.ResourceName]resource.Quantity) out.Default = make(api.ResourceList)
for key, val := range in.Default { for key, val := range in.Default {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -3256,7 +3255,7 @@ func convert_v1_NodeStatus_To_api_NodeStatus(in *NodeStatus, out *api.NodeStatus
defaulting.(func(*NodeStatus))(in) defaulting.(func(*NodeStatus))(in)
} }
if in.Capacity != nil { if in.Capacity != nil {
out.Capacity = make(map[api.ResourceName]resource.Quantity) out.Capacity = make(api.ResourceList)
for key, val := range in.Capacity { for key, val := range in.Capacity {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -3466,7 +3465,7 @@ func convert_v1_PersistentVolumeClaimStatus_To_api_PersistentVolumeClaimStatus(i
out.AccessModes = nil out.AccessModes = nil
} }
if in.Capacity != nil { if in.Capacity != nil {
out.Capacity = make(map[api.ResourceName]resource.Quantity) out.Capacity = make(api.ResourceList)
for key, val := range in.Capacity { for key, val := range in.Capacity {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -3580,7 +3579,7 @@ func convert_v1_PersistentVolumeSpec_To_api_PersistentVolumeSpec(in *PersistentV
defaulting.(func(*PersistentVolumeSpec))(in) defaulting.(func(*PersistentVolumeSpec))(in)
} }
if in.Capacity != nil { if in.Capacity != nil {
out.Capacity = make(map[api.ResourceName]resource.Quantity) out.Capacity = make(api.ResourceList)
for key, val := range in.Capacity { for key, val := range in.Capacity {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -3985,7 +3984,7 @@ func convert_v1_ResourceQuotaSpec_To_api_ResourceQuotaSpec(in *ResourceQuotaSpec
defaulting.(func(*ResourceQuotaSpec))(in) defaulting.(func(*ResourceQuotaSpec))(in)
} }
if in.Hard != nil { if in.Hard != nil {
out.Hard = make(map[api.ResourceName]resource.Quantity) out.Hard = make(api.ResourceList)
for key, val := range in.Hard { for key, val := range in.Hard {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -4004,7 +4003,7 @@ func convert_v1_ResourceQuotaStatus_To_api_ResourceQuotaStatus(in *ResourceQuota
defaulting.(func(*ResourceQuotaStatus))(in) defaulting.(func(*ResourceQuotaStatus))(in)
} }
if in.Hard != nil { if in.Hard != nil {
out.Hard = make(map[api.ResourceName]resource.Quantity) out.Hard = make(api.ResourceList)
for key, val := range in.Hard { for key, val := range in.Hard {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -4016,7 +4015,7 @@ func convert_v1_ResourceQuotaStatus_To_api_ResourceQuotaStatus(in *ResourceQuota
out.Hard = nil out.Hard = nil
} }
if in.Used != nil { if in.Used != nil {
out.Used = make(map[api.ResourceName]resource.Quantity) out.Used = make(api.ResourceList)
for key, val := range in.Used { for key, val := range in.Used {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -4035,7 +4034,7 @@ func convert_v1_ResourceRequirements_To_api_ResourceRequirements(in *ResourceReq
defaulting.(func(*ResourceRequirements))(in) defaulting.(func(*ResourceRequirements))(in)
} }
if in.Limits != nil { if in.Limits != nil {
out.Limits = make(map[api.ResourceName]resource.Quantity) out.Limits = make(api.ResourceList)
for key, val := range in.Limits { for key, val := range in.Limits {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {
@ -4047,7 +4046,7 @@ func convert_v1_ResourceRequirements_To_api_ResourceRequirements(in *ResourceReq
out.Limits = nil out.Limits = nil
} }
if in.Requests != nil { if in.Requests != nil {
out.Requests = make(map[api.ResourceName]resource.Quantity) out.Requests = make(api.ResourceList)
for key, val := range in.Requests { for key, val := range in.Requests {
newVal := resource.Quantity{} newVal := resource.Quantity{}
if err := s.Convert(&val, &newVal, 0); err != nil { if err := s.Convert(&val, &newVal, 0); err != nil {

View File

@ -18,13 +18,13 @@ package v1
// AUTO-GENERATED FUNCTIONS START HERE // AUTO-GENERATED FUNCTIONS START HERE
import ( import (
"github.com/GoogleCloudPlatform/kubernetes/pkg/api" api "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource" resource "github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource"
"github.com/GoogleCloudPlatform/kubernetes/pkg/conversion" conversion "github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" runtime "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util" util "github.com/GoogleCloudPlatform/kubernetes/pkg/util"
"speter.net/go/exp/math/dec/inf" inf "speter.net/go/exp/math/dec/inf"
"time" time "time"
) )
func deepCopy_resource_Quantity(in resource.Quantity, out *resource.Quantity, c *conversion.Cloner) error { func deepCopy_resource_Quantity(in resource.Quantity, out *resource.Quantity, c *conversion.Cloner) error {
@ -600,7 +600,7 @@ func deepCopy_v1_LimitRange(in LimitRange, out *LimitRange, c *conversion.Cloner
func deepCopy_v1_LimitRangeItem(in LimitRangeItem, out *LimitRangeItem, c *conversion.Cloner) error { func deepCopy_v1_LimitRangeItem(in LimitRangeItem, out *LimitRangeItem, c *conversion.Cloner) error {
out.Type = in.Type out.Type = in.Type
if in.Max != nil { if in.Max != nil {
out.Max = make(map[ResourceName]resource.Quantity) out.Max = make(ResourceList)
for key, val := range in.Max { for key, val := range in.Max {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -612,7 +612,7 @@ func deepCopy_v1_LimitRangeItem(in LimitRangeItem, out *LimitRangeItem, c *conve
out.Max = nil out.Max = nil
} }
if in.Min != nil { if in.Min != nil {
out.Min = make(map[ResourceName]resource.Quantity) out.Min = make(ResourceList)
for key, val := range in.Min { for key, val := range in.Min {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -624,7 +624,7 @@ func deepCopy_v1_LimitRangeItem(in LimitRangeItem, out *LimitRangeItem, c *conve
out.Min = nil out.Min = nil
} }
if in.Default != nil { if in.Default != nil {
out.Default = make(map[ResourceName]resource.Quantity) out.Default = make(ResourceList)
for key, val := range in.Default { for key, val := range in.Default {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -860,7 +860,7 @@ func deepCopy_v1_NodeSpec(in NodeSpec, out *NodeSpec, c *conversion.Cloner) erro
func deepCopy_v1_NodeStatus(in NodeStatus, out *NodeStatus, c *conversion.Cloner) error { func deepCopy_v1_NodeStatus(in NodeStatus, out *NodeStatus, c *conversion.Cloner) error {
if in.Capacity != nil { if in.Capacity != nil {
out.Capacity = make(map[ResourceName]resource.Quantity) out.Capacity = make(ResourceList)
for key, val := range in.Capacity { for key, val := range in.Capacity {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1044,7 +1044,7 @@ func deepCopy_v1_PersistentVolumeClaimStatus(in PersistentVolumeClaimStatus, out
out.AccessModes = nil out.AccessModes = nil
} }
if in.Capacity != nil { if in.Capacity != nil {
out.Capacity = make(map[ResourceName]resource.Quantity) out.Capacity = make(ResourceList)
for key, val := range in.Capacity { for key, val := range in.Capacity {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1146,7 +1146,7 @@ func deepCopy_v1_PersistentVolumeSource(in PersistentVolumeSource, out *Persiste
func deepCopy_v1_PersistentVolumeSpec(in PersistentVolumeSpec, out *PersistentVolumeSpec, c *conversion.Cloner) error { func deepCopy_v1_PersistentVolumeSpec(in PersistentVolumeSpec, out *PersistentVolumeSpec, c *conversion.Cloner) error {
if in.Capacity != nil { if in.Capacity != nil {
out.Capacity = make(map[ResourceName]resource.Quantity) out.Capacity = make(ResourceList)
for key, val := range in.Capacity { for key, val := range in.Capacity {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1580,7 +1580,7 @@ func deepCopy_v1_ResourceQuotaList(in ResourceQuotaList, out *ResourceQuotaList,
func deepCopy_v1_ResourceQuotaSpec(in ResourceQuotaSpec, out *ResourceQuotaSpec, c *conversion.Cloner) error { func deepCopy_v1_ResourceQuotaSpec(in ResourceQuotaSpec, out *ResourceQuotaSpec, c *conversion.Cloner) error {
if in.Hard != nil { if in.Hard != nil {
out.Hard = make(map[ResourceName]resource.Quantity) out.Hard = make(ResourceList)
for key, val := range in.Hard { for key, val := range in.Hard {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1596,7 +1596,7 @@ func deepCopy_v1_ResourceQuotaSpec(in ResourceQuotaSpec, out *ResourceQuotaSpec,
func deepCopy_v1_ResourceQuotaStatus(in ResourceQuotaStatus, out *ResourceQuotaStatus, c *conversion.Cloner) error { func deepCopy_v1_ResourceQuotaStatus(in ResourceQuotaStatus, out *ResourceQuotaStatus, c *conversion.Cloner) error {
if in.Hard != nil { if in.Hard != nil {
out.Hard = make(map[ResourceName]resource.Quantity) out.Hard = make(ResourceList)
for key, val := range in.Hard { for key, val := range in.Hard {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1608,7 +1608,7 @@ func deepCopy_v1_ResourceQuotaStatus(in ResourceQuotaStatus, out *ResourceQuotaS
out.Hard = nil out.Hard = nil
} }
if in.Used != nil { if in.Used != nil {
out.Used = make(map[ResourceName]resource.Quantity) out.Used = make(ResourceList)
for key, val := range in.Used { for key, val := range in.Used {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1624,7 +1624,7 @@ func deepCopy_v1_ResourceQuotaStatus(in ResourceQuotaStatus, out *ResourceQuotaS
func deepCopy_v1_ResourceRequirements(in ResourceRequirements, out *ResourceRequirements, c *conversion.Cloner) error { func deepCopy_v1_ResourceRequirements(in ResourceRequirements, out *ResourceRequirements, c *conversion.Cloner) error {
if in.Limits != nil { if in.Limits != nil {
out.Limits = make(map[ResourceName]resource.Quantity) out.Limits = make(ResourceList)
for key, val := range in.Limits { for key, val := range in.Limits {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
@ -1636,7 +1636,7 @@ func deepCopy_v1_ResourceRequirements(in ResourceRequirements, out *ResourceRequ
out.Limits = nil out.Limits = nil
} }
if in.Requests != nil { if in.Requests != nil {
out.Requests = make(map[ResourceName]resource.Quantity) out.Requests = make(ResourceList)
for key, val := range in.Requests { for key, val := range in.Requests {
newVal := new(resource.Quantity) newVal := new(resource.Quantity)
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil { if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {

View File

@ -19,40 +19,69 @@ package runtime
import ( import (
"fmt" "fmt"
"io" "io"
"path"
"reflect" "reflect"
"sort" "sort"
"strings" "strings"
"github.com/GoogleCloudPlatform/kubernetes/pkg/conversion" "github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
) )
type ConversionGenerator interface { type ConversionGenerator interface {
GenerateConversionsForType(version string, reflection reflect.Type) error GenerateConversionsForType(version string, reflection reflect.Type) error
WriteConversionFunctions(w io.Writer) error WriteConversionFunctions(w io.Writer) error
RegisterConversionFunctions(w io.Writer) error RegisterConversionFunctions(w io.Writer, pkg string) error
AddImport(pkg string) string
RepackImports(exclude util.StringSet)
WriteImports(w io.Writer) error
OverwritePackage(pkg, overwrite string) OverwritePackage(pkg, overwrite string)
AssumePrivateConversions()
} }
func NewConversionGenerator(scheme *conversion.Scheme) ConversionGenerator { func NewConversionGenerator(scheme *conversion.Scheme, targetPkg string) ConversionGenerator {
return &conversionGenerator{ g := &conversionGenerator{
scheme: scheme, scheme: scheme,
targetPkg: targetPkg,
convertibles: make(map[reflect.Type]reflect.Type), convertibles: make(map[reflect.Type]reflect.Type),
pkgOverwrites: make(map[string]string), pkgOverwrites: make(map[string]string),
imports: make(map[string]string),
shortImports: make(map[string]string),
} }
g.targetPackage(targetPkg)
g.AddImport("reflect")
g.AddImport("github.com/GoogleCloudPlatform/kubernetes/pkg/conversion")
return g
} }
var complexTypes []reflect.Kind = []reflect.Kind{reflect.Map, reflect.Ptr, reflect.Slice, reflect.Interface, reflect.Struct} var complexTypes []reflect.Kind = []reflect.Kind{reflect.Map, reflect.Ptr, reflect.Slice, reflect.Interface, reflect.Struct}
type conversionGenerator struct { type conversionGenerator struct {
scheme *conversion.Scheme scheme *conversion.Scheme
targetPkg string
convertibles map[reflect.Type]reflect.Type convertibles map[reflect.Type]reflect.Type
// If pkgOverwrites is set for a given package name, that package name // If pkgOverwrites is set for a given package name, that package name
// will be replaced while writing conversion function. If empty, package // will be replaced while writing conversion function. If empty, package
// name will be omitted. // name will be omitted.
pkgOverwrites map[string]string pkgOverwrites map[string]string
// map of package names to shortname
imports map[string]string
// map of short names to package names
shortImports map[string]string
// A buffer that is used for storing lines that needs to be written. // A buffer that is used for storing lines that needs to be written.
linesToPrint []string linesToPrint []string
// if true, we assume conversions on the scheme are not available to us in the current package
assumePrivateConversions bool
}
func (g *conversionGenerator) AssumePrivateConversions() {
g.assumePrivateConversions = true
}
func (g *conversionGenerator) AddImport(pkg string) string {
return g.addImportByPath(pkg)
} }
func (g *conversionGenerator) GenerateConversionsForType(version string, reflection reflect.Type) error { func (g *conversionGenerator) GenerateConversionsForType(version string, reflection reflect.Type) error {
@ -94,6 +123,10 @@ func (g *conversionGenerator) generateConversionsBetween(inType, outType reflect
} }
return fmt.Errorf("cannot convert types of different kinds: %v %v", inType, outType) return fmt.Errorf("cannot convert types of different kinds: %v %v", inType, outType)
} }
g.addImportByPath(inType.PkgPath())
g.addImportByPath(outType.PkgPath())
// We should be able to generate conversions both sides. // We should be able to generate conversions both sides.
switch inType.Kind() { switch inType.Kind() {
case reflect.Map: case reflect.Map:
@ -155,11 +188,15 @@ func isComplexType(reflection reflect.Type) bool {
func (g *conversionGenerator) generateConversionsForMap(inType, outType reflect.Type) error { func (g *conversionGenerator) generateConversionsForMap(inType, outType reflect.Type) error {
inKey := inType.Key() inKey := inType.Key()
outKey := outType.Key() outKey := outType.Key()
g.addImportByPath(inKey.PkgPath())
g.addImportByPath(outKey.PkgPath())
if err := g.generateConversionsBetween(inKey, outKey); err != nil { if err := g.generateConversionsBetween(inKey, outKey); err != nil {
return err return err
} }
inValue := inType.Elem() inValue := inType.Elem()
outValue := outType.Elem() outValue := outType.Elem()
g.addImportByPath(inKey.PkgPath())
g.addImportByPath(outKey.PkgPath())
if err := g.generateConversionsBetween(inValue, outValue); err != nil { if err := g.generateConversionsBetween(inValue, outValue); err != nil {
return err return err
} }
@ -238,6 +275,54 @@ func (s byName) Swap(i, j int) {
s[i], s[j] = s[j], s[i] s[i], s[j] = s[j], s[i]
} }
func (g *conversionGenerator) targetPackage(pkg string) {
g.imports[pkg] = ""
g.shortImports[""] = pkg
}
func (g *conversionGenerator) RepackImports(exclude util.StringSet) {
var packages []string
for key := range g.imports {
packages = append(packages, key)
}
sort.Strings(packages)
g.imports = make(map[string]string)
g.shortImports = make(map[string]string)
g.targetPackage(g.targetPkg)
for _, pkg := range packages {
if !exclude.Has(pkg) {
g.addImportByPath(pkg)
}
}
}
func (g *conversionGenerator) WriteImports(w io.Writer) error {
var packages []string
for key := range g.imports {
packages = append(packages, key)
}
sort.Strings(packages)
buffer := newBuffer()
indent := 0
buffer.addLine("import (\n", indent)
for _, importPkg := range packages {
if len(importPkg) == 0 {
continue
}
if len(g.imports[importPkg]) == 0 {
continue
}
buffer.addLine(fmt.Sprintf("%s \"%s\"\n", g.imports[importPkg], importPkg), indent+1)
}
buffer.addLine(")\n", indent)
buffer.addLine("\n", indent)
if err := buffer.flushLines(w); err != nil {
return err
}
return nil
}
func (g *conversionGenerator) WriteConversionFunctions(w io.Writer) error { func (g *conversionGenerator) WriteConversionFunctions(w io.Writer) error {
// It's desired to print conversion functions always in the same order // It's desired to print conversion functions always in the same order
// (e.g. for better tracking of what has really been added). // (e.g. for better tracking of what has really been added).
@ -265,9 +350,9 @@ func (g *conversionGenerator) WriteConversionFunctions(w io.Writer) error {
return nil return nil
} }
func (g *conversionGenerator) writeRegisterHeader(b *buffer, indent int) { func (g *conversionGenerator) writeRegisterHeader(b *buffer, pkg string, indent int) {
b.addLine("func init() {\n", indent) b.addLine("func init() {\n", indent)
b.addLine("err := api.Scheme.AddGeneratedConversionFuncs(\n", indent+1) b.addLine(fmt.Sprintf("err := %s.AddGeneratedConversionFuncs(\n", pkg), indent+1)
} }
func (g *conversionGenerator) writeRegisterFooter(b *buffer, indent int) { func (g *conversionGenerator) writeRegisterFooter(b *buffer, indent int) {
@ -280,7 +365,7 @@ func (g *conversionGenerator) writeRegisterFooter(b *buffer, indent int) {
b.addLine("\n", indent) b.addLine("\n", indent)
} }
func (g *conversionGenerator) RegisterConversionFunctions(w io.Writer) error { func (g *conversionGenerator) RegisterConversionFunctions(w io.Writer, pkg string) error {
// Write conversion function names alphabetically ordered. // Write conversion function names alphabetically ordered.
var names []string var names []string
for inType, outType := range g.convertibles { for inType, outType := range g.convertibles {
@ -290,7 +375,7 @@ func (g *conversionGenerator) RegisterConversionFunctions(w io.Writer) error {
buffer := newBuffer() buffer := newBuffer()
indent := 0 indent := 0
g.writeRegisterHeader(buffer, indent) g.writeRegisterHeader(buffer, pkg, indent)
for _, name := range names { for _, name := range names {
buffer.addLine(fmt.Sprintf("%s,\n", name), indent+2) buffer.addLine(fmt.Sprintf("%s,\n", name), indent+2)
} }
@ -301,32 +386,74 @@ func (g *conversionGenerator) RegisterConversionFunctions(w io.Writer) error {
return nil return nil
} }
func (g *conversionGenerator) addImportByPath(pkg string) string {
if name, ok := g.imports[pkg]; ok {
return name
}
name := path.Base(pkg)
if _, ok := g.shortImports[name]; !ok {
g.imports[pkg] = name
g.shortImports[name] = pkg
return name
}
if dirname := path.Base(path.Dir(pkg)); len(dirname) > 0 {
name = dirname + name
if _, ok := g.shortImports[name]; !ok {
g.imports[pkg] = name
g.shortImports[name] = pkg
return name
}
if subdirname := path.Base(path.Dir(path.Dir(pkg))); len(subdirname) > 0 {
name = subdirname + name
if _, ok := g.shortImports[name]; !ok {
g.imports[pkg] = name
g.shortImports[name] = pkg
return name
}
}
}
for i := 2; i < 100; i++ {
generatedName := fmt.Sprintf("%s%d", name, i)
if _, ok := g.shortImports[generatedName]; !ok {
g.imports[pkg] = generatedName
g.shortImports[generatedName] = pkg
return generatedName
}
}
panic(fmt.Sprintf("unable to find a unique name for the package path %q: %v", pkg, g.shortImports))
}
func (g *conversionGenerator) typeName(inType reflect.Type) string { func (g *conversionGenerator) typeName(inType reflect.Type) string {
switch inType.Kind() { switch inType.Kind() {
case reflect.Map:
return fmt.Sprintf("map[%s]%s", g.typeName(inType.Key()), g.typeName(inType.Elem()))
case reflect.Slice: case reflect.Slice:
return fmt.Sprintf("[]%s", g.typeName(inType.Elem())) return fmt.Sprintf("[]%s", g.typeName(inType.Elem()))
case reflect.Ptr: case reflect.Ptr:
return fmt.Sprintf("*%s", g.typeName(inType.Elem())) return fmt.Sprintf("*%s", g.typeName(inType.Elem()))
case reflect.Map:
if len(inType.Name()) == 0 {
return fmt.Sprintf("map[%s]%s", g.typeName(inType.Key()), g.typeName(inType.Elem()))
}
fallthrough
default: default:
typeWithPkg := fmt.Sprintf("%s", inType) pkg, name := inType.PkgPath(), inType.Name()
slices := strings.Split(typeWithPkg, ".") if len(name) == 0 && inType.Kind() == reflect.Struct {
if len(slices) == 1 { return "struct{}"
}
if len(pkg) == 0 {
// Default package. // Default package.
return slices[0] return name
} }
if len(slices) == 2 { if val, found := g.pkgOverwrites[pkg]; found {
pkg := slices[0] pkg = val
if val, found := g.pkgOverwrites[pkg]; found {
pkg = val
}
if pkg != "" {
pkg = pkg + "."
}
return pkg + slices[1]
} }
panic("Incorrect type name: " + typeWithPkg) if len(pkg) == 0 {
return name
}
short := g.addImportByPath(pkg)
if len(short) > 0 {
return fmt.Sprintf("%s.%s", short, name)
}
return name
} }
} }
@ -658,6 +785,10 @@ func (g *conversionGenerator) existsDedicatedConversionFunction(inType, outType
// unnamed. Thus we return false here. // unnamed. Thus we return false here.
return false return false
} }
// TODO: no way to handle private conversions in different packages
if g.assumePrivateConversions {
return false
}
return g.scheme.Converter().HasConversionFunc(inType, outType) return g.scheme.Converter().HasConversionFunc(inType, outType)
} }

View File

@ -19,6 +19,7 @@ package runtime
import ( import (
"fmt" "fmt"
"io" "io"
"path"
"reflect" "reflect"
"sort" "sort"
"strings" "strings"
@ -38,9 +39,20 @@ type DeepCopyGenerator interface {
// functions for this type and all nested types will be generated. // functions for this type and all nested types will be generated.
AddType(inType reflect.Type) error AddType(inType reflect.Type) error
// ReplaceType registers a type that should be used instead of the type
// with the provided pkgPath and name.
ReplaceType(pkgPath, name string, in interface{})
// AddImport registers a package name with the generator and returns its
// short name.
AddImport(pkgPath string) string
// RepackImports creates a stable ordering of import short names
RepackImports()
// Writes all imports that are necessary for deep-copy function and // Writes all imports that are necessary for deep-copy function and
// their registration. // their registration.
WriteImports(w io.Writer, pkg string) error WriteImports(w io.Writer) error
// Writes deel-copy functions for all types added via AddType() method // Writes deel-copy functions for all types added via AddType() method
// and their nested types. // and their nested types.
@ -57,20 +69,80 @@ type DeepCopyGenerator interface {
OverwritePackage(pkg, overwrite string) OverwritePackage(pkg, overwrite string)
} }
func NewDeepCopyGenerator(scheme *conversion.Scheme) DeepCopyGenerator { func NewDeepCopyGenerator(scheme *conversion.Scheme, targetPkg string, include util.StringSet) DeepCopyGenerator {
return &deepCopyGenerator{ g := &deepCopyGenerator{
scheme: scheme, scheme: scheme,
targetPkg: targetPkg,
copyables: make(map[reflect.Type]bool), copyables: make(map[reflect.Type]bool),
imports: util.StringSet{}, imports: make(map[string]string),
shortImports: make(map[string]string),
pkgOverwrites: make(map[string]string), pkgOverwrites: make(map[string]string),
replace: make(map[pkgPathNamePair]reflect.Type),
include: include,
} }
g.targetPackage(targetPkg)
g.AddImport("github.com/GoogleCloudPlatform/kubernetes/pkg/conversion")
return g
}
type pkgPathNamePair struct {
PkgPath string
Name string
} }
type deepCopyGenerator struct { type deepCopyGenerator struct {
scheme *conversion.Scheme scheme *conversion.Scheme
copyables map[reflect.Type]bool targetPkg string
imports util.StringSet copyables map[reflect.Type]bool
// map of package names to shortname
imports map[string]string
// map of short names to package names
shortImports map[string]string
pkgOverwrites map[string]string pkgOverwrites map[string]string
replace map[pkgPathNamePair]reflect.Type
include util.StringSet
}
func (g *deepCopyGenerator) addImportByPath(pkg string) string {
if name, ok := g.imports[pkg]; ok {
return name
}
name := path.Base(pkg)
if _, ok := g.shortImports[name]; !ok {
g.imports[pkg] = name
g.shortImports[name] = pkg
return name
}
if dirname := path.Base(path.Dir(pkg)); len(dirname) > 0 {
name = dirname + name
if _, ok := g.shortImports[name]; !ok {
g.imports[pkg] = name
g.shortImports[name] = pkg
return name
}
if subdirname := path.Base(path.Dir(path.Dir(pkg))); len(subdirname) > 0 {
name = subdirname + name
if _, ok := g.shortImports[name]; !ok {
g.imports[pkg] = name
g.shortImports[name] = pkg
return name
}
}
}
for i := 2; i < 100; i++ {
generatedName := fmt.Sprintf("%s%d", name, i)
if _, ok := g.shortImports[generatedName]; !ok {
g.imports[pkg] = generatedName
g.shortImports[generatedName] = pkg
return generatedName
}
}
panic(fmt.Sprintf("unable to find a unique name for the package path %q: %v", pkg, g.shortImports))
}
func (g *deepCopyGenerator) targetPackage(pkg string) {
g.imports[pkg] = ""
g.shortImports[""] = pkg
} }
func (g *deepCopyGenerator) addAllRecursiveTypes(inType reflect.Type) error { func (g *deepCopyGenerator) addAllRecursiveTypes(inType reflect.Type) error {
@ -90,11 +162,18 @@ func (g *deepCopyGenerator) addAllRecursiveTypes(inType reflect.Type) error {
return err return err
} }
case reflect.Interface: case reflect.Interface:
g.imports.Insert(inType.PkgPath()) g.addImportByPath(inType.PkgPath())
return nil return nil
case reflect.Struct: case reflect.Struct:
g.imports.Insert(inType.PkgPath()) g.addImportByPath(inType.PkgPath())
if !strings.HasPrefix(inType.PkgPath(), "github.com/GoogleCloudPlatform/kubernetes") { found := false
for s := range g.include {
if strings.HasPrefix(inType.PkgPath(), s) {
found = true
break
}
}
if !found {
return nil return nil
} }
for i := 0; i < inType.NumField(); i++ { for i := 0; i < inType.NumField(); i++ {
@ -110,6 +189,15 @@ func (g *deepCopyGenerator) addAllRecursiveTypes(inType reflect.Type) error {
return nil return nil
} }
func (g *deepCopyGenerator) AddImport(pkg string) string {
return g.addImportByPath(pkg)
}
// ReplaceType registers a replacement type to be used instead of the named type
func (g *deepCopyGenerator) ReplaceType(pkgPath, name string, t interface{}) {
g.replace[pkgPathNamePair{pkgPath, name}] = reflect.TypeOf(t)
}
func (g *deepCopyGenerator) AddType(inType reflect.Type) error { func (g *deepCopyGenerator) AddType(inType reflect.Type) error {
if inType.Kind() != reflect.Struct { if inType.Kind() != reflect.Struct {
return fmt.Errorf("non-struct copies are not supported") return fmt.Errorf("non-struct copies are not supported")
@ -117,10 +205,23 @@ func (g *deepCopyGenerator) AddType(inType reflect.Type) error {
return g.addAllRecursiveTypes(inType) return g.addAllRecursiveTypes(inType)
} }
func (g *deepCopyGenerator) WriteImports(w io.Writer, pkg string) error { func (g *deepCopyGenerator) RepackImports() {
var packages []string
for key := range g.imports {
packages = append(packages, key)
}
sort.Strings(packages)
g.imports = make(map[string]string)
g.shortImports = make(map[string]string)
g.targetPackage(g.targetPkg)
for _, pkg := range packages {
g.addImportByPath(pkg)
}
}
func (g *deepCopyGenerator) WriteImports(w io.Writer) error {
var packages []string var packages []string
packages = append(packages, "github.com/GoogleCloudPlatform/kubernetes/pkg/api")
packages = append(packages, "github.com/GoogleCloudPlatform/kubernetes/pkg/conversion")
for key := range g.imports { for key := range g.imports {
packages = append(packages, key) packages = append(packages, key)
} }
@ -130,10 +231,13 @@ func (g *deepCopyGenerator) WriteImports(w io.Writer, pkg string) error {
indent := 0 indent := 0
buffer.addLine("import (\n", indent) buffer.addLine("import (\n", indent)
for _, importPkg := range packages { for _, importPkg := range packages {
if strings.HasSuffix(importPkg, pkg) { if len(importPkg) == 0 {
continue continue
} }
buffer.addLine(fmt.Sprintf("\"%s\"\n", importPkg), indent+1) if len(g.imports[importPkg]) == 0 {
continue
}
buffer.addLine(fmt.Sprintf("%s \"%s\"\n", g.imports[importPkg], importPkg), indent+1)
} }
buffer.addLine(")\n", indent) buffer.addLine(")\n", indent)
buffer.addLine("\n", indent) buffer.addLine("\n", indent)
@ -159,35 +263,47 @@ func (s byPkgAndName) Swap(i, j int) {
s[i], s[j] = s[j], s[i] s[i], s[j] = s[j], s[i]
} }
func (g *deepCopyGenerator) typeName(inType reflect.Type) string { func (g *deepCopyGenerator) nameForType(inType reflect.Type) string {
switch inType.Kind() { switch inType.Kind() {
case reflect.Map:
return fmt.Sprintf("map[%s]%s", g.typeName(inType.Key()), g.typeName(inType.Elem()))
case reflect.Slice: case reflect.Slice:
return fmt.Sprintf("[]%s", g.typeName(inType.Elem())) return fmt.Sprintf("[]%s", g.typeName(inType.Elem()))
case reflect.Ptr: case reflect.Ptr:
return fmt.Sprintf("*%s", g.typeName(inType.Elem())) return fmt.Sprintf("*%s", g.typeName(inType.Elem()))
case reflect.Map:
if len(inType.Name()) == 0 {
return fmt.Sprintf("map[%s]%s", g.typeName(inType.Key()), g.typeName(inType.Elem()))
}
fallthrough
default: default:
typeWithPkg := fmt.Sprintf("%s", inType) pkg, name := inType.PkgPath(), inType.Name()
slices := strings.Split(typeWithPkg, ".") if len(name) == 0 && inType.Kind() == reflect.Struct {
if len(slices) == 1 { return "struct{}"
}
if len(pkg) == 0 {
// Default package. // Default package.
return slices[0] return name
} }
if len(slices) == 2 { if val, found := g.pkgOverwrites[pkg]; found {
pkg := slices[0] pkg = val
if val, found := g.pkgOverwrites[pkg]; found {
pkg = val
}
if pkg != "" {
pkg = pkg + "."
}
return pkg + slices[1]
} }
panic("Incorrect type name: " + typeWithPkg) if len(pkg) == 0 {
return name
}
short := g.addImportByPath(pkg)
if len(short) > 0 {
return fmt.Sprintf("%s.%s", short, name)
}
return name
} }
} }
func (g *deepCopyGenerator) typeName(inType reflect.Type) string {
if t, ok := g.replace[pkgPathNamePair{inType.PkgPath(), inType.Name()}]; ok {
return g.nameForType(t)
}
return g.nameForType(inType)
}
func (g *deepCopyGenerator) deepCopyFunctionName(inType reflect.Type) string { func (g *deepCopyGenerator) deepCopyFunctionName(inType reflect.Type) string {
funcNameFormat := "deepCopy_%s_%s" funcNameFormat := "deepCopy_%s_%s"
inPkg := packageForName(inType) inPkg := packageForName(inType)
@ -442,12 +558,8 @@ func (g *deepCopyGenerator) writeDeepCopyForType(b *buffer, inType reflect.Type,
func (g *deepCopyGenerator) writeRegisterHeader(b *buffer, pkg string, indent int) { func (g *deepCopyGenerator) writeRegisterHeader(b *buffer, pkg string, indent int) {
b.addLine("func init() {\n", indent) b.addLine("func init() {\n", indent)
registerFormat := "err := %sScheme.AddGeneratedDeepCopyFuncs(\n" registerFormat := "err := %s.AddGeneratedDeepCopyFuncs(\n"
if pkg == "api" { b.addLine(fmt.Sprintf(registerFormat, pkg), indent+1)
b.addLine(fmt.Sprintf(registerFormat, ""), indent+1)
} else {
b.addLine(fmt.Sprintf(registerFormat, "api."), indent+1)
}
} }
func (g *deepCopyGenerator) writeRegisterFooter(b *buffer, indent int) { func (g *deepCopyGenerator) writeRegisterFooter(b *buffer, indent int) {