Skip to content

Commit

Permalink
Merge pull request kubernetes#8320 from wojtek-t/generated_deep_copy
Browse files Browse the repository at this point in the history
Code to automatically generate functions for DeepCopy
  • Loading branch information
piosz committed May 27, 2015
2 parents ee82d46 + e7dbac5 commit cd2c7e1
Show file tree
Hide file tree
Showing 17 changed files with 7,686 additions and 13 deletions.
File renamed without changes.
82 changes: 82 additions & 0 deletions cmd/gendeepcopy/deep_copy.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
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 main

import (
"io"
"os"
"runtime"
"strings"

"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
_ "github.com/GoogleCloudPlatform/kubernetes/pkg/api/v1"
_ "github.com/GoogleCloudPlatform/kubernetes/pkg/api/v1beta1"
_ "github.com/GoogleCloudPlatform/kubernetes/pkg/api/v1beta2"
_ "github.com/GoogleCloudPlatform/kubernetes/pkg/api/v1beta3"
pkg_runtime "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"

"github.com/golang/glog"
flag "github.com/spf13/pflag"
)

var (
functionDest = flag.StringP("func-dest", "f", "-", "Output for deep copy functions; '-' means stdout")
version = flag.StringP("version", "v", "v1beta3", "Version for deep copies.")
overwrites = flag.StringP("overwrites", "o", "", "Comma-separated overwrites for package names")
)

func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
flag.Parse()

var funcOut io.Writer
if *functionDest == "-" {
funcOut = os.Stdout
} else {
file, err := os.Create(*functionDest)
if err != nil {
glog.Fatalf("Couldn't open %v: %v", *functionDest, err)
}
defer file.Close()
funcOut = file
}

knownVersion := *version
if knownVersion == "api" {
knownVersion = api.Scheme.Raw().InternalVersion
}
generator := pkg_runtime.NewDeepCopyGenerator(api.Scheme.Raw())

for _, overwrite := range strings.Split(*overwrites, ",") {
vals := strings.Split(overwrite, "=")
generator.OverwritePackage(vals[0], vals[1])
}
for _, knownType := range api.Scheme.KnownTypes(knownVersion) {
if err := generator.AddType(knownType); err != nil {
glog.Errorf("error while generating deep copy functions for %v: %v", knownType, err)
}
}
if err := generator.WriteImports(funcOut, *version); err != nil {
glog.Fatalf("error while writing imports: %v", err)
}
if err := generator.WriteDeepCopyFunctions(funcOut); err != nil {
glog.Fatalf("error while writing deep copy functions: %v", err)
}
if err := generator.RegisterDeepCopyFunctions(funcOut, *version); err != nil {
glog.Fatalf("error while registering deep copy functions: %v", err)
}
}
2 changes: 2 additions & 0 deletions hack/lib/golang.sh
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ readonly KUBE_TEST_TARGETS=(
cmd/gendocs
cmd/genman
cmd/genbashcomp
cmd/genconversion
cmd/gendeepcopy
examples/k8petstore/web-server
github.com/onsi/ginkgo/ginkgo
test/e2e/e2e.test
Expand Down
2 changes: 1 addition & 1 deletion hack/update-generated-conversions.sh
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import (
// AUTO-GENERATED FUNCTIONS START HERE
EOF

GOPATH=$(godep path):$GOPATH go run cmd/kube-conversion/conversion.go -v ${version} -f - >> $TMPFILE
GOPATH=$(godep path):$GOPATH go run cmd/genconversion/conversion.go -v ${version} -f - >> $TMPFILE

cat >> $TMPFILE <<EOF
// AUTO-GENERATED FUNCTIONS END HERE
Expand Down
51 changes: 51 additions & 0 deletions hack/update-generated-deep-copies.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/bin/bash

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

set -o errexit
set -o nounset
set -o pipefail

function generate_version() {
local version=$1
local TMPFILE="/tmp/deep_copy_generated.$(date +%s).go"

echo "Generating for version ${version}"

sed 's/YEAR/2015/' hooks/boilerplate.go.txt > $TMPFILE
cat >> $TMPFILE <<EOF
package ${version}
// AUTO-GENERATED FUNCTIONS START HERE
EOF

GOPATH=$(godep path):$GOPATH go run cmd/gendeepcopy/deep_copy.go -v ${version} -f - -o "${version}=" >> $TMPFILE

cat >> $TMPFILE <<EOF
// AUTO-GENERATED FUNCTIONS END HERE
EOF

gofmt -w -s $TMPFILE
if [ "${version}" == "api" ]; then
mv $TMPFILE pkg/api/deep_copy_generated.go
else
mv $TMPFILE pkg/api/${version}/deep_copy_generated.go
fi
}

VERSIONS="api v1beta3 v1"
for ver in $VERSIONS; do
generate_version "${ver}"
done
6 changes: 3 additions & 3 deletions hack/verify-generated-conversions.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,16 @@ KUBE_ROOT=$(dirname "${BASH_SOURCE}")/..
source "${KUBE_ROOT}/hack/lib/init.sh"

kube::golang::setup_env
"${KUBE_ROOT}/hack/build-go.sh" cmd/kube-conversion
"${KUBE_ROOT}/hack/build-go.sh" cmd/genconversion

genconversion=$(kube::util::find-binary "kube-conversion")
genconversion=$(kube::util::find-binary "genconversion")

if [[ ! -x "$genconversion" ]]; then
{
echo "It looks as if you don't have a compiled conversion binary"
echo
echo "If you are running from a clone of the git repo, please run"
echo "'./hack/build-go.sh cmd/kube-conversion'."
echo "'./hack/build-go.sh cmd/genconversion'."
} >&2
exit 1
fi
Expand Down
60 changes: 60 additions & 0 deletions hack/verify-generated-deep-copies.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#!/bin/bash

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

set -o errexit
set -o nounset
set -o pipefail

KUBE_ROOT=$(dirname "${BASH_SOURCE}")/..
source "${KUBE_ROOT}/hack/lib/init.sh"

kube::golang::setup_env
"${KUBE_ROOT}/hack/build-go.sh" cmd/gendeepcopy

genconversion=$(kube::util::find-binary "gendeepcopy")

if [[ ! -x "$genconversion" ]]; then
{
echo "It looks as if you don't have a compiled conversion binary"
echo
echo "If you are running from a clone of the git repo, please run"
echo "'./hack/build-go.sh cmd/gendeepcopy'."
} >&2
exit 1
fi

APIROOT="${KUBE_ROOT}/pkg/api"
TMP_APIROOT="${KUBE_ROOT}/_tmp/api"
_tmp="${KUBE_ROOT}/_tmp"

mkdir -p "${_tmp}"
cp -a "${APIROOT}" "${TMP_APIROOT}"

"${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
Loading

0 comments on commit cd2c7e1

Please sign in to comment.