Merge pull request #12411 from uluyol/expconvcopy-dups

Generate conversions/deep-copies for experimental.
This commit is contained in:
CJ Cullen 2015-08-11 18:07:30 -07:00
commit a77900a114
19 changed files with 661 additions and 374 deletions

View File

@ -8,6 +8,7 @@ matrix:
install: install:
- go get github.com/tools/godep - go get github.com/tools/godep
- go get golang.org/x/tools/cmd/goimports
- ./hack/travis/install-etcd.sh - ./hack/travis/install-etcd.sh
- ./hack/build-go.sh - ./hack/build-go.sh

View File

@ -22,9 +22,12 @@ import (
"os" "os"
"path" "path"
"runtime" "runtime"
"strings"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
_ "k8s.io/kubernetes/pkg/api/v1" _ "k8s.io/kubernetes/pkg/api/v1"
_ "k8s.io/kubernetes/pkg/expapi"
_ "k8s.io/kubernetes/pkg/expapi/v1"
pkg_runtime "k8s.io/kubernetes/pkg/runtime" pkg_runtime "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
@ -32,9 +35,11 @@ import (
flag "github.com/spf13/pflag" flag "github.com/spf13/pflag"
) )
const pkgBase = "k8s.io/kubernetes/pkg"
var ( var (
functionDest = flag.StringP("funcDest", "f", "-", "Output for conversion functions; '-' means stdout") functionDest = flag.StringP("funcDest", "f", "-", "Output for conversion functions; '-' means stdout")
version = flag.StringP("version", "v", "v1", "Version for conversion.") groupVersion = flag.StringP("version", "v", "api/v1", "groupPath/version for conversion.")
) )
func main() { func main() {
@ -53,13 +58,20 @@ func main() {
funcOut = file funcOut = file
} }
generator := pkg_runtime.NewConversionGenerator(api.Scheme.Raw(), path.Join("k8s.io/kubernetes/pkg/api", *version)) group, version := path.Split(*groupVersion)
apiShort := generator.AddImport("k8s.io/kubernetes/pkg/api") group = strings.TrimRight(group, "/")
generator.AddImport("k8s.io/kubernetes/pkg/api/resource")
versionPath := path.Join(pkgBase, group, version)
generator := pkg_runtime.NewConversionGenerator(api.Scheme.Raw(), versionPath)
apiShort := generator.AddImport(path.Join(pkgBase, "api"))
generator.AddImport(path.Join(pkgBase, "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) {
if err := generator.GenerateConversionsForType(*version, knownType); err != nil { if !strings.HasPrefix(knownType.PkgPath(), versionPath) {
continue
}
if err := generator.GenerateConversionsForType(version, knownType); err != nil {
glog.Errorf("error while generating conversion functions for %v: %v", knownType, err) glog.Errorf("error while generating conversion functions for %v: %v", knownType, err)
} }
} }

View File

@ -25,6 +25,8 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
_ "k8s.io/kubernetes/pkg/api/v1" _ "k8s.io/kubernetes/pkg/api/v1"
_ "k8s.io/kubernetes/pkg/expapi"
_ "k8s.io/kubernetes/pkg/expapi/v1"
pkg_runtime "k8s.io/kubernetes/pkg/runtime" pkg_runtime "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
@ -32,9 +34,11 @@ import (
flag "github.com/spf13/pflag" flag "github.com/spf13/pflag"
) )
const pkgBase = "k8s.io/kubernetes/pkg"
var ( var (
functionDest = flag.StringP("func-dest", "f", "-", "Output for deep copy functions; '-' means stdout") functionDest = flag.StringP("funcDest", "f", "-", "Output for deep copy functions; '-' means stdout")
version = flag.StringP("version", "v", "v1", "Version for deep copies.") groupVersion = flag.StringP("version", "v", "", "groupPath/version for deep copies.")
overwrites = flag.StringP("overwrites", "o", "", "Comma-separated overwrites for package names") overwrites = flag.StringP("overwrites", "o", "", "Comma-separated overwrites for package names")
) )
@ -54,15 +58,15 @@ func main() {
funcOut = file funcOut = file
} }
knownVersion := *version group, version := path.Split(*groupVersion)
group = strings.TrimRight(group, "/")
registerTo := "api.Scheme" registerTo := "api.Scheme"
if knownVersion == "api" { if *groupVersion == "api/" {
knownVersion = api.Scheme.Raw().InternalVersion
registerTo = "Scheme" registerTo = "Scheme"
} }
pkgPath := path.Join("k8s.io/kubernetes/pkg/api", knownVersion) versionPath := path.Join(pkgBase, group, version)
generator := pkg_runtime.NewDeepCopyGenerator(api.Scheme.Raw(), pkgPath, util.NewStringSet("k8s.io/kubernetes")) generator := pkg_runtime.NewDeepCopyGenerator(api.Scheme.Raw(), versionPath, util.NewStringSet("k8s.io/kubernetes"))
generator.AddImport("k8s.io/kubernetes/pkg/api") generator.AddImport(path.Join(pkgBase, "api"))
if len(*overwrites) > 0 { if len(*overwrites) > 0 {
for _, overwrite := range strings.Split(*overwrites, ",") { for _, overwrite := range strings.Split(*overwrites, ",") {
@ -73,7 +77,10 @@ func main() {
generator.OverwritePackage(vals[0], vals[1]) generator.OverwritePackage(vals[0], vals[1])
} }
} }
for _, knownType := range api.Scheme.KnownTypes(knownVersion) { for _, knownType := range api.Scheme.KnownTypes(version) {
if !strings.HasPrefix(knownType.PkgPath(), versionPath) {
continue
}
if err := generator.AddType(knownType); err != nil { if err := generator.AddType(knownType); err != nil {
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)
} }

View File

@ -29,11 +29,11 @@ function generate_version() {
local version=$1 local version=$1
local TMPFILE="/tmp/conversion_generated.$(date +%s).go" local TMPFILE="/tmp/conversion_generated.$(date +%s).go"
echo "Generating for version ${version}" echo "Generating for ${version}"
sed 's/YEAR/2015/' hack/boilerplate/boilerplate.go.txt > "$TMPFILE" sed 's/YEAR/2015/' hack/boilerplate/boilerplate.go.txt > "$TMPFILE"
cat >> "$TMPFILE" <<EOF cat >> "$TMPFILE" <<EOF
package ${version} package ${version##*/}
// AUTO-GENERATED FUNCTIONS START HERE // AUTO-GENERATED FUNCTIONS START HERE
EOF EOF
@ -44,14 +44,19 @@ EOF
// AUTO-GENERATED FUNCTIONS END HERE // AUTO-GENERATED FUNCTIONS END HERE
EOF EOF
mv "$TMPFILE" "pkg/api/${version}/conversion_generated.go" env GOPATH=$(godep path):$GOPATH goimports -w "$TMPFILE"
mv "$TMPFILE" "pkg/${version}/conversion_generated.go"
} }
VERSIONS="v1" if ! which goimports >/dev/null; then
for ver in $VERSIONS; do echo "goimports not in path, run go get golang.org/x/tools/cmd/goimports"
# Ensure that the version being processed is registered by setting exit 1
# KUBE_API_VERSIONS. fi
KUBE_API_VERSIONS="${ver}" generate_version "${ver}"
done
# ex: ts=2 sw=2 et filetype=sh DEFAULT_VERSIONS="api/v1 expapi/v1"
VERSIONS=${VERSIONS:-$DEFAULT_VERSIONS}
for ver in $VERSIONS; do
# Ensure that the version being processed is registered by setting
# KUBE_API_VERSIONS.
KUBE_API_VERSIONS="${ver##*/}" generate_version "${ver}"
done

View File

@ -27,22 +27,25 @@ gendeepcopy=$(kube::util::find-binary "gendeepcopy")
function result_file_name() { function result_file_name() {
local version=$1 local version=$1
if [ "${version}" == "api" ]; then echo "pkg/${version}/deep_copy_generated.go"
echo "pkg/api/deep_copy_generated.go"
else
echo "pkg/api/${version}/deep_copy_generated.go"
fi
} }
function generate_version() { function generate_version() {
local version=$1 local version=$1
local TMPFILE="/tmp/deep_copy_generated.$(date +%s).go" local TMPFILE="/tmp/deep_copy_generated.$(date +%s).go"
echo "Generating for version ${version}" echo "Generating for ${version}"
# version is group/version, so use the version number as the package name unless
# this is an internal version, in which case use the group name.
pkgname=${version##*/}
if [[ -z $pkgname ]]; then
pkgname=${version%/*}
fi
sed 's/YEAR/2015/' hack/boilerplate/boilerplate.go.txt > $TMPFILE sed 's/YEAR/2015/' hack/boilerplate/boilerplate.go.txt > $TMPFILE
cat >> $TMPFILE <<EOF cat >> $TMPFILE <<EOF
package ${version} package $pkgname
// AUTO-GENERATED FUNCTIONS START HERE // AUTO-GENERATED FUNCTIONS START HERE
EOF EOF
@ -53,27 +56,24 @@ EOF
// AUTO-GENERATED FUNCTIONS END HERE // AUTO-GENERATED FUNCTIONS END HERE
EOF EOF
gofmt -w -s "$TMPFILE" env GOPATH=$(godep path):$GOPATH goimports -w "$TMPFILE"
mv "$TMPFILE" `result_file_name ${version}` mv "$TMPFILE" `result_file_name ${version}`
} }
function generate_deep_copies() { function generate_deep_copies() {
local versions="api v1" local versions="$@"
# To avoid compile errors, remove the currently existing files. # To avoid compile errors, remove the currently existing files.
for ver in ${versions}; do for ver in ${versions}; do
rm -f `result_file_name ${ver}` rm -f `result_file_name ${ver}`
done done
apiVersions="" for ver in ${versions}; do
for ver in ${versions}; do # Ensure that the version being processed is registered by setting
# Ensure that the version being processed is registered by setting # KUBE_API_VERSIONS.
# KUBE_API_VERSIONS. apiVersions="${ver##*/}"
if [ "${ver}" != "api" ]; then KUBE_API_VERSIONS="${apiVersions}" generate_version "${ver}"
apiVersions="${ver}" done
fi
KUBE_API_VERSIONS="${apiVersions}" generate_version "${ver}"
done
} }
DEFAULT_VERSIONS="api/ api/v1 expapi/ expapi/v1"
VERSIONS=${VERSIONS:-$DEFAULT_VERSIONS}
generate_deep_copies generate_deep_copies
# ex: ts=2 sw=2 et filetype=sh

View File

@ -23,25 +23,31 @@ source "${KUBE_ROOT}/hack/lib/init.sh"
kube::golang::setup_env kube::golang::setup_env
APIROOT="${KUBE_ROOT}/pkg/api" APIROOTS=${APIROOTS:-pkg/api pkg/expapi}
TMP_APIROOT="${KUBE_ROOT}/_tmp/api"
_tmp="${KUBE_ROOT}/_tmp" _tmp="${KUBE_ROOT}/_tmp"
mkdir -p "${_tmp}" cleanup() {
cp -a "${APIROOT}" "${TMP_APIROOT}" rm -rf "${_tmp}"
}
trap "cleanup" EXIT SIGINT
for APIROOT in ${APIROOTS}; do
mkdir -p "${_tmp}/${APIROOT%/*}"
cp -a "${KUBE_ROOT}/${APIROOT}" "${_tmp}/${APIROOT}"
done
"${KUBE_ROOT}/hack/update-generated-conversions.sh" "${KUBE_ROOT}/hack/update-generated-conversions.sh"
echo "diffing ${APIROOT} against freshly generated conversions" for APIROOT in ${APIROOTS}; do
ret=0 TMP_APIROOT="${_tmp}/${APIROOT}"
diff -Naupr -I 'Auto generated by' "${APIROOT}" "${TMP_APIROOT}" || ret=$? echo "diffing ${APIROOT} against freshly generated conversions"
cp -a ${TMP_APIROOT} "${KUBE_ROOT}/pkg" ret=0
rm -rf "${_tmp}" diff -Naupr -I 'Auto generated by' "${KUBE_ROOT}/${APIROOT}" "${TMP_APIROOT}" || ret=$?
if [[ $ret -eq 0 ]] cp -a "${TMP_APIROOT}" "${KUBE_ROOT}/${APIROOT%/*}"
then if [[ $ret -eq 0 ]]; then
echo "${APIROOT} up to date." echo "${APIROOT} up to date."
else else
echo "${APIROOT} is out of date. Please run hack/update-generated-conversions.sh" echo "${APIROOT} is out of date. Please run hack/update-generated-conversions.sh"
exit 1 exit 1
fi fi
done
# ex: ts=2 sw=2 et filetype=sh

View File

@ -25,25 +25,32 @@ kube::golang::setup_env
gendeepcopy=$(kube::util::find-binary "gendeepcopy") gendeepcopy=$(kube::util::find-binary "gendeepcopy")
APIROOT="${KUBE_ROOT}/pkg/api" APIROOTS=${APIROOTS:-pkg/api pkg/expapi}
TMP_APIROOT="${KUBE_ROOT}/_tmp/api"
_tmp="${KUBE_ROOT}/_tmp" _tmp="${KUBE_ROOT}/_tmp"
mkdir -p "${_tmp}" cleanup() {
cp -a "${APIROOT}" "${TMP_APIROOT}" rm -rf "${_tmp}"
}
trap "cleanup" EXIT SIGINT
for APIROOT in ${APIROOTS}; do
mkdir -p "${_tmp}/${APIROOT%/*}"
cp -a "${KUBE_ROOT}/${APIROOT}" "${_tmp}/${APIROOT}"
done
"${KUBE_ROOT}/hack/update-generated-deep-copies.sh" "${KUBE_ROOT}/hack/update-generated-deep-copies.sh"
echo "diffing ${APIROOT} against freshly generated deep copies"
ret=0
diff -Naupr -I 'Auto generated by' "${APIROOT}" "${TMP_APIROOT}" || ret=$?
cp -a ${TMP_APIROOT} "${KUBE_ROOT}/pkg"
rm -rf "${_tmp}"
if [[ $ret -eq 0 ]]
then
echo "${APIROOT} up to date."
else
echo "${APIROOT} is out of date. Please run hack/update-generated-deep-copies.sh"
exit 1
fi
# ex: ts=2 sw=2 et filetype=sh for APIROOT in ${APIROOTS}; do
TMP_APIROOT="${_tmp}/${APIROOT}"
echo "diffing ${APIROOT} against freshly generated deep copies"
ret=0
diff -Naupr -I 'Auto generated by' "${KUBE_ROOT}/${APIROOT}" "${TMP_APIROOT}" || ret=$?
cp -a ${TMP_APIROOT} "${KUBE_ROOT}/${APIROOT%/*}"
if [[ $ret -eq 0 ]]; then
echo "${APIROOT} up to date."
else
echo "${APIROOT} is out of date. Please run hack/update-generated-deep-copies.sh"
exit 1
fi
done

View File

@ -18,6 +18,8 @@ package api
// AUTO-GENERATED FUNCTIONS START HERE // AUTO-GENERATED FUNCTIONS START HERE
import ( import (
time "time"
resource "k8s.io/kubernetes/pkg/api/resource" resource "k8s.io/kubernetes/pkg/api/resource"
conversion "k8s.io/kubernetes/pkg/conversion" conversion "k8s.io/kubernetes/pkg/conversion"
fields "k8s.io/kubernetes/pkg/fields" fields "k8s.io/kubernetes/pkg/fields"
@ -25,7 +27,6 @@ import (
runtime "k8s.io/kubernetes/pkg/runtime" runtime "k8s.io/kubernetes/pkg/runtime"
util "k8s.io/kubernetes/pkg/util" util "k8s.io/kubernetes/pkg/util"
inf "speter.net/go/exp/math/dec/inf" inf "speter.net/go/exp/math/dec/inf"
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 {

View File

@ -18,10 +18,11 @@ package v1
// AUTO-GENERATED FUNCTIONS START HERE // AUTO-GENERATED FUNCTIONS START HERE
import ( import (
reflect "reflect"
api "k8s.io/kubernetes/pkg/api" api "k8s.io/kubernetes/pkg/api"
resource "k8s.io/kubernetes/pkg/api/resource" resource "k8s.io/kubernetes/pkg/api/resource"
conversion "k8s.io/kubernetes/pkg/conversion" conversion "k8s.io/kubernetes/pkg/conversion"
reflect "reflect"
) )
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 {

View File

@ -18,13 +18,14 @@ package v1
// AUTO-GENERATED FUNCTIONS START HERE // AUTO-GENERATED FUNCTIONS START HERE
import ( import (
time "time"
api "k8s.io/kubernetes/pkg/api" api "k8s.io/kubernetes/pkg/api"
resource "k8s.io/kubernetes/pkg/api/resource" resource "k8s.io/kubernetes/pkg/api/resource"
conversion "k8s.io/kubernetes/pkg/conversion" conversion "k8s.io/kubernetes/pkg/conversion"
runtime "k8s.io/kubernetes/pkg/runtime" runtime "k8s.io/kubernetes/pkg/runtime"
util "k8s.io/kubernetes/pkg/util" util "k8s.io/kubernetes/pkg/util"
inf "speter.net/go/exp/math/dec/inf" inf "speter.net/go/exp/math/dec/inf"
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 {

View File

@ -1,19 +0,0 @@
/*
Copyright 2015 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package expapi
func addDeepCopyFuncs() {}

View File

@ -0,0 +1,138 @@
/*
Copyright 2015 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package expapi
// AUTO-GENERATED FUNCTIONS START HERE
import (
time "time"
api "k8s.io/kubernetes/pkg/api"
conversion "k8s.io/kubernetes/pkg/conversion"
util "k8s.io/kubernetes/pkg/util"
)
func deepCopy_api_ObjectMeta(in api.ObjectMeta, out *api.ObjectMeta, c *conversion.Cloner) error {
out.Name = in.Name
out.GenerateName = in.GenerateName
out.Namespace = in.Namespace
out.SelfLink = in.SelfLink
out.UID = in.UID
out.ResourceVersion = in.ResourceVersion
out.Generation = in.Generation
if err := deepCopy_util_Time(in.CreationTimestamp, &out.CreationTimestamp, c); err != nil {
return err
}
if in.DeletionTimestamp != nil {
out.DeletionTimestamp = new(util.Time)
if err := deepCopy_util_Time(*in.DeletionTimestamp, out.DeletionTimestamp, c); err != nil {
return err
}
} else {
out.DeletionTimestamp = nil
}
if in.Labels != nil {
out.Labels = make(map[string]string)
for key, val := range in.Labels {
out.Labels[key] = val
}
} else {
out.Labels = nil
}
if in.Annotations != nil {
out.Annotations = make(map[string]string)
for key, val := range in.Annotations {
out.Annotations[key] = val
}
} else {
out.Annotations = nil
}
return nil
}
func deepCopy_api_TypeMeta(in api.TypeMeta, out *api.TypeMeta, c *conversion.Cloner) error {
out.Kind = in.Kind
out.APIVersion = in.APIVersion
return nil
}
func deepCopy_expapi_ReplicationControllerDummy(in ReplicationControllerDummy, out *ReplicationControllerDummy, c *conversion.Cloner) error {
if err := deepCopy_api_TypeMeta(in.TypeMeta, &out.TypeMeta, c); err != nil {
return err
}
return nil
}
func deepCopy_expapi_Scale(in Scale, out *Scale, c *conversion.Cloner) error {
if err := deepCopy_api_TypeMeta(in.TypeMeta, &out.TypeMeta, c); err != nil {
return err
}
if err := deepCopy_api_ObjectMeta(in.ObjectMeta, &out.ObjectMeta, c); err != nil {
return err
}
if err := deepCopy_expapi_ScaleSpec(in.Spec, &out.Spec, c); err != nil {
return err
}
if err := deepCopy_expapi_ScaleStatus(in.Status, &out.Status, c); err != nil {
return err
}
return nil
}
func deepCopy_expapi_ScaleSpec(in ScaleSpec, out *ScaleSpec, c *conversion.Cloner) error {
out.Replicas = in.Replicas
return nil
}
func deepCopy_expapi_ScaleStatus(in ScaleStatus, out *ScaleStatus, c *conversion.Cloner) error {
out.Replicas = in.Replicas
if in.Selector != nil {
out.Selector = make(map[string]string)
for key, val := range in.Selector {
out.Selector[key] = val
}
} else {
out.Selector = nil
}
return nil
}
func deepCopy_util_Time(in util.Time, out *util.Time, c *conversion.Cloner) error {
if newVal, err := c.DeepCopy(in.Time); err != nil {
return err
} else {
out.Time = newVal.(time.Time)
}
return nil
}
func init() {
err := api.Scheme.AddGeneratedDeepCopyFuncs(
deepCopy_api_ObjectMeta,
deepCopy_api_TypeMeta,
deepCopy_expapi_ReplicationControllerDummy,
deepCopy_expapi_Scale,
deepCopy_expapi_ScaleSpec,
deepCopy_expapi_ScaleStatus,
deepCopy_util_Time,
)
if err != nil {
// if one of the deep copy functions is malformed, detect it immediately.
panic(err)
}
}
// AUTO-GENERATED FUNCTIONS END HERE

View File

@ -0,0 +1,254 @@
/*
Copyright 2015 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1
// AUTO-GENERATED FUNCTIONS START HERE
import (
reflect "reflect"
api "k8s.io/kubernetes/pkg/api"
v1 "k8s.io/kubernetes/pkg/api/v1"
conversion "k8s.io/kubernetes/pkg/conversion"
expapi "k8s.io/kubernetes/pkg/expapi"
)
func convert_api_ObjectMeta_To_v1_ObjectMeta(in *api.ObjectMeta, out *v1.ObjectMeta, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*api.ObjectMeta))(in)
}
out.Name = in.Name
out.GenerateName = in.GenerateName
out.Namespace = in.Namespace
out.SelfLink = in.SelfLink
out.UID = in.UID
out.ResourceVersion = in.ResourceVersion
out.Generation = in.Generation
if err := s.Convert(&in.CreationTimestamp, &out.CreationTimestamp, 0); err != nil {
return err
}
if in.DeletionTimestamp != nil {
if err := s.Convert(&in.DeletionTimestamp, &out.DeletionTimestamp, 0); err != nil {
return err
}
} else {
out.DeletionTimestamp = nil
}
if in.Labels != nil {
out.Labels = make(map[string]string)
for key, val := range in.Labels {
out.Labels[key] = val
}
} else {
out.Labels = nil
}
if in.Annotations != nil {
out.Annotations = make(map[string]string)
for key, val := range in.Annotations {
out.Annotations[key] = val
}
} else {
out.Annotations = nil
}
return nil
}
func convert_api_TypeMeta_To_v1_TypeMeta(in *api.TypeMeta, out *v1.TypeMeta, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*api.TypeMeta))(in)
}
out.Kind = in.Kind
out.APIVersion = in.APIVersion
return nil
}
func convert_v1_ObjectMeta_To_api_ObjectMeta(in *v1.ObjectMeta, out *api.ObjectMeta, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*v1.ObjectMeta))(in)
}
out.Name = in.Name
out.GenerateName = in.GenerateName
out.Namespace = in.Namespace
out.SelfLink = in.SelfLink
out.UID = in.UID
out.ResourceVersion = in.ResourceVersion
out.Generation = in.Generation
if err := s.Convert(&in.CreationTimestamp, &out.CreationTimestamp, 0); err != nil {
return err
}
if in.DeletionTimestamp != nil {
if err := s.Convert(&in.DeletionTimestamp, &out.DeletionTimestamp, 0); err != nil {
return err
}
} else {
out.DeletionTimestamp = nil
}
if in.Labels != nil {
out.Labels = make(map[string]string)
for key, val := range in.Labels {
out.Labels[key] = val
}
} else {
out.Labels = nil
}
if in.Annotations != nil {
out.Annotations = make(map[string]string)
for key, val := range in.Annotations {
out.Annotations[key] = val
}
} else {
out.Annotations = nil
}
return nil
}
func convert_v1_TypeMeta_To_api_TypeMeta(in *v1.TypeMeta, out *api.TypeMeta, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*v1.TypeMeta))(in)
}
out.Kind = in.Kind
out.APIVersion = in.APIVersion
return nil
}
func convert_expapi_ReplicationControllerDummy_To_v1_ReplicationControllerDummy(in *expapi.ReplicationControllerDummy, out *ReplicationControllerDummy, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*expapi.ReplicationControllerDummy))(in)
}
if err := convert_api_TypeMeta_To_v1_TypeMeta(&in.TypeMeta, &out.TypeMeta, s); err != nil {
return err
}
return nil
}
func convert_expapi_Scale_To_v1_Scale(in *expapi.Scale, out *Scale, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*expapi.Scale))(in)
}
if err := convert_api_TypeMeta_To_v1_TypeMeta(&in.TypeMeta, &out.TypeMeta, s); err != nil {
return err
}
if err := convert_api_ObjectMeta_To_v1_ObjectMeta(&in.ObjectMeta, &out.ObjectMeta, s); err != nil {
return err
}
if err := convert_expapi_ScaleSpec_To_v1_ScaleSpec(&in.Spec, &out.Spec, s); err != nil {
return err
}
if err := convert_expapi_ScaleStatus_To_v1_ScaleStatus(&in.Status, &out.Status, s); err != nil {
return err
}
return nil
}
func convert_expapi_ScaleSpec_To_v1_ScaleSpec(in *expapi.ScaleSpec, out *ScaleSpec, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*expapi.ScaleSpec))(in)
}
out.Replicas = in.Replicas
return nil
}
func convert_expapi_ScaleStatus_To_v1_ScaleStatus(in *expapi.ScaleStatus, out *ScaleStatus, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*expapi.ScaleStatus))(in)
}
out.Replicas = in.Replicas
if in.Selector != nil {
out.Selector = make(map[string]string)
for key, val := range in.Selector {
out.Selector[key] = val
}
} else {
out.Selector = nil
}
return nil
}
func convert_v1_ReplicationControllerDummy_To_expapi_ReplicationControllerDummy(in *ReplicationControllerDummy, out *expapi.ReplicationControllerDummy, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*ReplicationControllerDummy))(in)
}
if err := convert_v1_TypeMeta_To_api_TypeMeta(&in.TypeMeta, &out.TypeMeta, s); err != nil {
return err
}
return nil
}
func convert_v1_Scale_To_expapi_Scale(in *Scale, out *expapi.Scale, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*Scale))(in)
}
if err := convert_v1_TypeMeta_To_api_TypeMeta(&in.TypeMeta, &out.TypeMeta, s); err != nil {
return err
}
if err := convert_v1_ObjectMeta_To_api_ObjectMeta(&in.ObjectMeta, &out.ObjectMeta, s); err != nil {
return err
}
if err := convert_v1_ScaleSpec_To_expapi_ScaleSpec(&in.Spec, &out.Spec, s); err != nil {
return err
}
if err := convert_v1_ScaleStatus_To_expapi_ScaleStatus(&in.Status, &out.Status, s); err != nil {
return err
}
return nil
}
func convert_v1_ScaleSpec_To_expapi_ScaleSpec(in *ScaleSpec, out *expapi.ScaleSpec, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*ScaleSpec))(in)
}
out.Replicas = in.Replicas
return nil
}
func convert_v1_ScaleStatus_To_expapi_ScaleStatus(in *ScaleStatus, out *expapi.ScaleStatus, s conversion.Scope) error {
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*ScaleStatus))(in)
}
out.Replicas = in.Replicas
if in.Selector != nil {
out.Selector = make(map[string]string)
for key, val := range in.Selector {
out.Selector[key] = val
}
} else {
out.Selector = nil
}
return nil
}
func init() {
err := api.Scheme.AddGeneratedConversionFuncs(
convert_api_ObjectMeta_To_v1_ObjectMeta,
convert_api_TypeMeta_To_v1_TypeMeta,
convert_expapi_ReplicationControllerDummy_To_v1_ReplicationControllerDummy,
convert_expapi_ScaleSpec_To_v1_ScaleSpec,
convert_expapi_ScaleStatus_To_v1_ScaleStatus,
convert_expapi_Scale_To_v1_Scale,
convert_v1_ObjectMeta_To_api_ObjectMeta,
convert_v1_ReplicationControllerDummy_To_expapi_ReplicationControllerDummy,
convert_v1_ScaleSpec_To_expapi_ScaleSpec,
convert_v1_ScaleStatus_To_expapi_ScaleStatus,
convert_v1_Scale_To_expapi_Scale,
convert_v1_TypeMeta_To_api_TypeMeta,
)
if err != nil {
// If one of the conversion functions is malformed, detect it immediately.
panic(err)
}
}
// AUTO-GENERATED FUNCTIONS END HERE

View File

@ -1,19 +0,0 @@
/*
Copyright 2015 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1
func addDeepCopyFuncs() {}

View File

@ -0,0 +1,139 @@
/*
Copyright 2015 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1
// AUTO-GENERATED FUNCTIONS START HERE
import (
time "time"
api "k8s.io/kubernetes/pkg/api"
v1 "k8s.io/kubernetes/pkg/api/v1"
conversion "k8s.io/kubernetes/pkg/conversion"
util "k8s.io/kubernetes/pkg/util"
)
func deepCopy_v1_ObjectMeta(in v1.ObjectMeta, out *v1.ObjectMeta, c *conversion.Cloner) error {
out.Name = in.Name
out.GenerateName = in.GenerateName
out.Namespace = in.Namespace
out.SelfLink = in.SelfLink
out.UID = in.UID
out.ResourceVersion = in.ResourceVersion
out.Generation = in.Generation
if err := deepCopy_util_Time(in.CreationTimestamp, &out.CreationTimestamp, c); err != nil {
return err
}
if in.DeletionTimestamp != nil {
out.DeletionTimestamp = new(util.Time)
if err := deepCopy_util_Time(*in.DeletionTimestamp, out.DeletionTimestamp, c); err != nil {
return err
}
} else {
out.DeletionTimestamp = nil
}
if in.Labels != nil {
out.Labels = make(map[string]string)
for key, val := range in.Labels {
out.Labels[key] = val
}
} else {
out.Labels = nil
}
if in.Annotations != nil {
out.Annotations = make(map[string]string)
for key, val := range in.Annotations {
out.Annotations[key] = val
}
} else {
out.Annotations = nil
}
return nil
}
func deepCopy_v1_TypeMeta(in v1.TypeMeta, out *v1.TypeMeta, c *conversion.Cloner) error {
out.Kind = in.Kind
out.APIVersion = in.APIVersion
return nil
}
func deepCopy_v1_ReplicationControllerDummy(in ReplicationControllerDummy, out *ReplicationControllerDummy, c *conversion.Cloner) error {
if err := deepCopy_v1_TypeMeta(in.TypeMeta, &out.TypeMeta, c); err != nil {
return err
}
return nil
}
func deepCopy_v1_Scale(in Scale, out *Scale, c *conversion.Cloner) error {
if err := deepCopy_v1_TypeMeta(in.TypeMeta, &out.TypeMeta, c); err != nil {
return err
}
if err := deepCopy_v1_ObjectMeta(in.ObjectMeta, &out.ObjectMeta, c); err != nil {
return err
}
if err := deepCopy_v1_ScaleSpec(in.Spec, &out.Spec, c); err != nil {
return err
}
if err := deepCopy_v1_ScaleStatus(in.Status, &out.Status, c); err != nil {
return err
}
return nil
}
func deepCopy_v1_ScaleSpec(in ScaleSpec, out *ScaleSpec, c *conversion.Cloner) error {
out.Replicas = in.Replicas
return nil
}
func deepCopy_v1_ScaleStatus(in ScaleStatus, out *ScaleStatus, c *conversion.Cloner) error {
out.Replicas = in.Replicas
if in.Selector != nil {
out.Selector = make(map[string]string)
for key, val := range in.Selector {
out.Selector[key] = val
}
} else {
out.Selector = nil
}
return nil
}
func deepCopy_util_Time(in util.Time, out *util.Time, c *conversion.Cloner) error {
if newVal, err := c.DeepCopy(in.Time); err != nil {
return err
} else {
out.Time = newVal.(time.Time)
}
return nil
}
func init() {
err := api.Scheme.AddGeneratedDeepCopyFuncs(
deepCopy_v1_ObjectMeta,
deepCopy_v1_TypeMeta,
deepCopy_v1_ReplicationControllerDummy,
deepCopy_v1_Scale,
deepCopy_v1_ScaleSpec,
deepCopy_v1_ScaleStatus,
deepCopy_util_Time,
)
if err != nil {
// if one of the deep copy functions is malformed, detect it immediately.
panic(err)
}
}
// AUTO-GENERATED FUNCTIONS END HERE

View File

@ -24,7 +24,6 @@ import (
var Codec = runtime.CodecFor(api.Scheme, "v1") var Codec = runtime.CodecFor(api.Scheme, "v1")
func init() { func init() {
addDeepCopyFuncs()
addConversionFuncs() addConversionFuncs()
addDefaultingFuncs() addDefaultingFuncs()
addKnownTypes() addKnownTypes()

View File

@ -1,152 +0,0 @@
/*
Copyright 2015 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package runtime_test
import (
"bufio"
"bytes"
"fmt"
"io"
"io/ioutil"
"os"
"path"
"testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi"
_ "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util"
)
func generateConversions(t *testing.T, version string) bytes.Buffer {
g := runtime.NewConversionGenerator(api.Scheme.Raw(), path.Join("k8s.io/kubernetes/pkg/api", version))
apiShort := g.AddImport("k8s.io/kubernetes/pkg/api")
g.AddImport("k8s.io/kubernetes/pkg/api/resource")
// TODO(wojtek-t): Change the overwrites to a flag.
g.OverwritePackage(version, "")
for _, knownType := range api.Scheme.KnownTypes(version) {
if err := g.GenerateConversionsForType(version, knownType); err != nil {
t.Fatalf("error while generating conversion functions for %v: %v", knownType, err)
}
}
g.RepackImports(util.NewStringSet())
var functions bytes.Buffer
functionsWriter := bufio.NewWriter(&functions)
if err := g.WriteImports(functionsWriter); err != nil {
t.Fatalf("error while writing imports: %v", err)
}
if err := g.WriteConversionFunctions(functionsWriter); err != nil {
t.Fatalf("couldn't generate conversion functions: %v", err)
}
if err := g.RegisterConversionFunctions(functionsWriter, fmt.Sprintf("%s.Scheme", apiShort)); err != nil {
t.Fatalf("couldn't generate conversion function names: %v", err)
}
if err := functionsWriter.Flush(); err != nil {
t.Fatalf("error while flushing writer")
}
return functions
}
func readLinesUntil(t *testing.T, reader *bufio.Reader, stop string, buffer *bytes.Buffer) error {
for {
line, err := reader.ReadString('\n')
if err == io.EOF {
return fmt.Errorf("'%s' line not found", stop)
}
if err != nil {
t.Fatalf("error while reading file: %v", err)
}
if line == stop {
break
}
if buffer != nil {
if _, err := buffer.WriteString(line); err != nil {
t.Fatalf("error while buffering line")
}
}
}
return nil
}
func bufferExistingGeneratedCode(t *testing.T, fileName string) bytes.Buffer {
file, err := os.Open(fileName)
if err != nil {
t.Fatalf("couldn't open file %s", fileName)
}
defer file.Close()
reader := bufio.NewReader(file)
functionsPrefix := "// AUTO-GENERATED FUNCTIONS START HERE\n"
functionsSuffix := "// AUTO-GENERATED FUNCTIONS END HERE\n"
if err := readLinesUntil(t, reader, functionsPrefix, nil); err != nil {
t.Fatalf("error while parsing file: %v", err)
}
var functions bytes.Buffer
if err := readLinesUntil(t, reader, functionsSuffix, &functions); err != nil {
t.Fatalf("error while parsing file: %v", err)
}
_, err = reader.ReadString('\n')
if err == nil || err != io.EOF {
t.Fatalf("end-of-file expected")
}
return functions
}
func compareBuffers(t *testing.T, generatedFile string, existing, generated bytes.Buffer) bool {
ok := true
for {
existingLine, existingErr := existing.ReadString('\n')
generatedLine, generatedErr := generated.ReadString('\n')
if existingErr == io.EOF && generatedErr == io.EOF {
break
}
if existingErr != generatedErr {
ok = false
t.Errorf("reading errors: existing %v generated %v", existingErr, generatedErr)
return ok
}
if existingErr != nil {
ok = false
t.Errorf("error while reading: %v", existingErr)
}
if existingLine != generatedLine {
ok = false
diff := fmt.Sprintf("\nexpected: %s\n got: %s", generatedLine, existingLine)
t.Errorf("please update conversion functions; generated: %s; first diff: %s", generatedFile, diff)
return ok
}
}
return ok
}
func TestNoManualChangesToGenerateConversions(t *testing.T) {
version := testapi.Version()
fileName := fmt.Sprintf("../../pkg/api/%s/conversion_generated.go", version)
existingFunctions := bufferExistingGeneratedCode(t, fileName)
generatedFunctions := generateConversions(t, version)
functionsTxt := fmt.Sprintf("%s.functions.txt", version)
ioutil.WriteFile(functionsTxt, generatedFunctions.Bytes(), os.FileMode(0644))
if ok := compareBuffers(t, functionsTxt, existingFunctions, generatedFunctions); ok {
os.Remove(functionsTxt)
}
}

View File

@ -1,95 +0,0 @@
/*
Copyright 2015 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package runtime_test
import (
"bufio"
"bytes"
"fmt"
"io/ioutil"
"os"
"path"
"testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi"
_ "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util"
"github.com/golang/glog"
)
func generateDeepCopies(t *testing.T, version string) bytes.Buffer {
testedVersion := version
registerTo := "api.Scheme"
if testedVersion == "api" {
testedVersion = api.Scheme.Raw().InternalVersion
registerTo = "Scheme"
}
g := runtime.NewDeepCopyGenerator(api.Scheme.Raw(), path.Join("k8s.io/kubernetes/pkg/api", testedVersion), util.NewStringSet("k8s.io/kubernetes"))
g.AddImport("k8s.io/kubernetes/pkg/api")
g.OverwritePackage(version, "")
for _, knownType := range api.Scheme.KnownTypes(testedVersion) {
if err := g.AddType(knownType); err != nil {
glog.Errorf("error while generating deep-copy functions for %v: %v", knownType, err)
}
}
var functions bytes.Buffer
functionsWriter := bufio.NewWriter(&functions)
g.RepackImports()
if err := g.WriteImports(functionsWriter); err != nil {
t.Fatalf("couldn't generate deep-copy function imports: %v", err)
}
if err := g.WriteDeepCopyFunctions(functionsWriter); err != nil {
t.Fatalf("couldn't generate deep-copy functions: %v", err)
}
if err := g.RegisterDeepCopyFunctions(functionsWriter, registerTo); err != nil {
t.Fatalf("couldn't generate deep-copy function names: %v", err)
}
if err := functionsWriter.Flush(); err != nil {
t.Fatalf("error while flushing writer")
}
return functions
}
func TestNoManualChangesToGenerateDeepCopies(t *testing.T) {
versions := []string{"api", testapi.Version()}
for _, version := range versions {
fileName := ""
if version == "api" {
fileName = "../../pkg/api/deep_copy_generated.go"
} else {
fileName = fmt.Sprintf("../../pkg/api/%s/deep_copy_generated.go", version)
}
existingFunctions := bufferExistingGeneratedCode(t, fileName)
generatedFunctions := generateDeepCopies(t, version)
functionsTxt := fmt.Sprintf("%s.deep_copy.txt", version)
ioutil.WriteFile(functionsTxt, generatedFunctions.Bytes(), os.FileMode(0644))
if ok := compareBuffers(t, functionsTxt, existingFunctions, generatedFunctions); ok {
os.Remove(functionsTxt)
}
}
}

View File

@ -21,6 +21,7 @@ before_install:
install: install:
- go get golang.org/x/tools/cmd/cover - go get golang.org/x/tools/cmd/cover
- go get golang.org/x/tools/cmd/goimports
- go get github.com/mattn/goveralls - go get github.com/mattn/goveralls
- go get github.com/tools/godep - go get github.com/tools/godep
- ./hack/travis/install-etcd.sh - ./hack/travis/install-etcd.sh