Merge pull request #38401 from liggitt/addressable-deep-copy

Automatic merge from submit-queue (batch tested with PRs 36071, 32752, 37998, 38350, 38401)

Pass addressable values to DeepCopy

Extracted from https://github.com/kubernetes/kubernetes/pull/35728

These are the places we are currently calling DeepCopy incorrectly, and we need to fix, even if we don't pick up the changes to DeepCopy in #35728:
* creating a new cloner means we have no generated functions registered
* passing non-addressable values doesn't pick up generated deep copy functions, and forces us into reflective mode
This commit is contained in:
Kubernetes Submit Queue 2016-12-08 16:26:00 -08:00 committed by GitHub
commit b0b6f3c256
46 changed files with 89 additions and 111 deletions

View File

@ -28,7 +28,6 @@ go_library(
"//pkg/client/clientset_generated/release_1_5:go_default_library", "//pkg/client/clientset_generated/release_1_5:go_default_library",
"//pkg/client/record:go_default_library", "//pkg/client/record:go_default_library",
"//pkg/controller:go_default_library", "//pkg/controller:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/types:go_default_library", "//pkg/types:go_default_library",
"//pkg/util/flowcontrol:go_default_library", "//pkg/util/flowcontrol:go_default_library",

View File

@ -34,7 +34,6 @@ import (
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
"k8s.io/kubernetes/pkg/conversion"
pkgruntime "k8s.io/kubernetes/pkg/runtime" pkgruntime "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
"k8s.io/kubernetes/pkg/util/flowcontrol" "k8s.io/kubernetes/pkg/util/flowcontrol"
@ -350,7 +349,7 @@ func (daemonsetcontroller *DaemonSetController) reconcileDaemonSet(namespace str
// Not federated daemonset, ignoring. // Not federated daemonset, ignoring.
return return
} }
baseDaemonSetObj, err := conversion.NewCloner().DeepCopy(baseDaemonSetObjFromStore) baseDaemonSetObj, err := api.Scheme.DeepCopy(baseDaemonSetObjFromStore)
baseDaemonSet, ok := baseDaemonSetObj.(*extensionsv1.DaemonSet) baseDaemonSet, ok := baseDaemonSetObj.(*extensionsv1.DaemonSet)
if err != nil || !ok { if err != nil || !ok {
glog.Errorf("Error in retrieving obj %s from store: %v, %v", daemonsetName, ok, err) glog.Errorf("Error in retrieving obj %s from store: %v, %v", daemonsetName, ok, err)
@ -400,7 +399,7 @@ func (daemonsetcontroller *DaemonSetController) reconcileDaemonSet(namespace str
// Do not modify. Otherwise make a deep copy. // Do not modify. Otherwise make a deep copy.
desiredDaemonSet := &extensionsv1.DaemonSet{ desiredDaemonSet := &extensionsv1.DaemonSet{
ObjectMeta: util.DeepCopyRelevantObjectMeta(baseDaemonSet.ObjectMeta), ObjectMeta: util.DeepCopyRelevantObjectMeta(baseDaemonSet.ObjectMeta),
Spec: util.DeepCopyApiTypeOrPanic(baseDaemonSet.Spec).(extensionsv1.DaemonSetSpec), Spec: *(util.DeepCopyApiTypeOrPanic(&baseDaemonSet.Spec).(*extensionsv1.DaemonSetSpec)),
} }
if !found { if !found {

View File

@ -31,7 +31,6 @@ go_library(
"//pkg/client/clientset_generated/release_1_5:go_default_library", "//pkg/client/clientset_generated/release_1_5:go_default_library",
"//pkg/client/record:go_default_library", "//pkg/client/record:go_default_library",
"//pkg/controller:go_default_library", "//pkg/controller:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/util/flowcontrol:go_default_library", "//pkg/util/flowcontrol:go_default_library",
"//pkg/util/wait:go_default_library", "//pkg/util/wait:go_default_library",

View File

@ -41,7 +41,6 @@ import (
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/flowcontrol" "k8s.io/kubernetes/pkg/util/flowcontrol"
"k8s.io/kubernetes/pkg/util/wait" "k8s.io/kubernetes/pkg/util/wait"
@ -484,7 +483,7 @@ func (fdc *DeploymentController) reconcileDeployment(key string) (reconciliation
// don't delete local deployments for now. Do not reconcile it anymore. // don't delete local deployments for now. Do not reconcile it anymore.
return statusAllOk, nil return statusAllOk, nil
} }
obj, err := conversion.NewCloner().DeepCopy(objFromStore) obj, err := api.Scheme.DeepCopy(objFromStore)
fd, ok := obj.(*extensionsv1.Deployment) fd, ok := obj.(*extensionsv1.Deployment)
if err != nil || !ok { if err != nil || !ok {
glog.Errorf("Error in retrieving obj from store: %v, %v", ok, err) glog.Errorf("Error in retrieving obj from store: %v, %v", ok, err)

View File

@ -28,7 +28,6 @@ go_library(
"//pkg/client/clientset_generated/release_1_5:go_default_library", "//pkg/client/clientset_generated/release_1_5:go_default_library",
"//pkg/client/record:go_default_library", "//pkg/client/record:go_default_library",
"//pkg/controller:go_default_library", "//pkg/controller:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/runtime/schema:go_default_library", "//pkg/runtime/schema:go_default_library",
"//pkg/types:go_default_library", "//pkg/types:go_default_library",

View File

@ -34,7 +34,6 @@ import (
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
"k8s.io/kubernetes/pkg/conversion"
pkgruntime "k8s.io/kubernetes/pkg/runtime" pkgruntime "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime/schema" "k8s.io/kubernetes/pkg/runtime/schema"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
@ -621,7 +620,7 @@ func (ic *IngressController) getMasterCluster() (master *federationapi.Cluster,
*/ */
func (ic *IngressController) updateClusterIngressUIDToMasters(cluster *federationapi.Cluster, fallbackUID string) { func (ic *IngressController) updateClusterIngressUIDToMasters(cluster *federationapi.Cluster, fallbackUID string) {
masterCluster, masterUID, err := ic.getMasterCluster() masterCluster, masterUID, err := ic.getMasterCluster()
clusterObj, clusterErr := conversion.NewCloner().DeepCopy(cluster) // Make a clone so that we don't clobber our input param clusterObj, clusterErr := api.Scheme.DeepCopy(cluster) // Make a clone so that we don't clobber our input param
cluster, ok := clusterObj.(*federationapi.Cluster) cluster, ok := clusterObj.(*federationapi.Cluster)
if clusterErr != nil || !ok { if clusterErr != nil || !ok {
glog.Errorf("Internal error: Failed clone cluster resource while attempting to add master ingress UID annotation (%q = %q) from master cluster %q to cluster %q, will try again later: %v", uidAnnotationKey, masterUID, masterCluster.Name, cluster.Name, err) glog.Errorf("Internal error: Failed clone cluster resource while attempting to add master ingress UID annotation (%q = %q) from master cluster %q to cluster %q, will try again later: %v", uidAnnotationKey, masterUID, masterCluster.Name, cluster.Name, err)
@ -704,7 +703,7 @@ func (ic *IngressController) reconcileIngress(ingress types.NamespacedName) {
glog.V(4).Infof("Ingress %q is not federated. Ignoring.", ingress) glog.V(4).Infof("Ingress %q is not federated. Ignoring.", ingress)
return return
} }
baseIngressObj, err := conversion.NewCloner().DeepCopy(baseIngressObjFromStore) baseIngressObj, err := api.Scheme.DeepCopy(baseIngressObjFromStore)
baseIngress, ok := baseIngressObj.(*extensionsv1beta1.Ingress) baseIngress, ok := baseIngressObj.(*extensionsv1beta1.Ingress)
if err != nil || !ok { if err != nil || !ok {
glog.Errorf("Internal Error %v : Object retrieved from ingressInformerStore with key %q is not of correct type *extensionsv1beta1.Ingress: %v", err, key, baseIngressObj) glog.Errorf("Internal Error %v : Object retrieved from ingressInformerStore with key %q is not of correct type *extensionsv1beta1.Ingress: %v", err, key, baseIngressObj)
@ -757,22 +756,24 @@ func (ic *IngressController) reconcileIngress(ingress types.NamespacedName) {
return return
} }
desiredIngress := &extensionsv1beta1.Ingress{} desiredIngress := &extensionsv1beta1.Ingress{}
objMeta, err := conversion.NewCloner().DeepCopy(baseIngress.ObjectMeta) objMeta, err := api.Scheme.DeepCopy(&baseIngress.ObjectMeta)
if err != nil { if err != nil {
glog.Errorf("Error deep copying ObjectMeta: %v", err) glog.Errorf("Error deep copying ObjectMeta: %v", err)
} }
objSpec, err := conversion.NewCloner().DeepCopy(baseIngress.Spec) objSpec, err := api.Scheme.DeepCopy(&baseIngress.Spec)
if err != nil { if err != nil {
glog.Errorf("Error deep copying Spec: %v", err) glog.Errorf("Error deep copying Spec: %v", err)
} }
desiredIngress.ObjectMeta, ok = objMeta.(v1.ObjectMeta) objMetaCopy, ok := objMeta.(*v1.ObjectMeta)
if !ok { if !ok {
glog.Errorf("Internal error: Failed to cast to v1.ObjectMeta: %v", objMeta) glog.Errorf("Internal error: Failed to cast to *v1.ObjectMeta: %v", objMeta)
} }
desiredIngress.Spec = objSpec.(extensionsv1beta1.IngressSpec) desiredIngress.ObjectMeta = *objMetaCopy
objSpecCopy, ok := objSpec.(*extensionsv1beta1.IngressSpec)
if !ok { if !ok {
glog.Errorf("Internal error: Failed to cast to extensionsv1beta1.Ingressespec: %v", objSpec) glog.Errorf("Internal error: Failed to cast to extensionsv1beta1.Ingressespec: %v", objSpec)
} }
desiredIngress.Spec = *objSpecCopy
glog.V(4).Infof("Desired Ingress: %v", desiredIngress) glog.V(4).Infof("Desired Ingress: %v", desiredIngress)
if !clusterIngressFound { if !clusterIngressFound {
@ -824,7 +825,7 @@ func (ic *IngressController) reconcileIngress(ingress types.NamespacedName) {
return return
} }
if !baseLBStatusExists && clusterLBStatusExists { if !baseLBStatusExists && clusterLBStatusExists {
lbstatusObj, lbErr := conversion.NewCloner().DeepCopy(&clusterIngress.Status.LoadBalancer) lbstatusObj, lbErr := api.Scheme.DeepCopy(&clusterIngress.Status.LoadBalancer)
lbstatus, ok := lbstatusObj.(*v1.LoadBalancerStatus) lbstatus, ok := lbstatusObj.(*v1.LoadBalancerStatus)
if lbErr != nil || !ok { if lbErr != nil || !ok {
glog.Errorf("Internal error: Failed to clone LoadBalancerStatus of %q in cluster %q while attempting to update master loadbalancer ingress status, will try again later. error: %v, Object to be cloned: %v", ingress, cluster.Name, lbErr, lbstatusObj) glog.Errorf("Internal error: Failed to clone LoadBalancerStatus of %q in cluster %q while attempting to update master loadbalancer ingress status, will try again later. error: %v, Object to be cloned: %v", ingress, cluster.Name, lbErr, lbstatusObj)
@ -851,17 +852,17 @@ func (ic *IngressController) reconcileIngress(ingress types.NamespacedName) {
glog.V(4).Infof("Ingress %q in cluster %q does not need an update: cluster ingress is equivalent to federated ingress", ingress, cluster.Name) glog.V(4).Infof("Ingress %q in cluster %q does not need an update: cluster ingress is equivalent to federated ingress", ingress, cluster.Name)
} else { } else {
glog.V(4).Infof("Ingress %s in cluster %s needs an update: cluster ingress %v is not equivalent to federated ingress %v", ingress, cluster.Name, clusterIngress, desiredIngress) glog.V(4).Infof("Ingress %s in cluster %s needs an update: cluster ingress %v is not equivalent to federated ingress %v", ingress, cluster.Name, clusterIngress, desiredIngress)
objMeta, err := conversion.NewCloner().DeepCopy(clusterIngress.ObjectMeta) objMeta, err := api.Scheme.DeepCopy(&clusterIngress.ObjectMeta)
if err != nil { if err != nil {
glog.Errorf("Error deep copying ObjectMeta: %v", err) glog.Errorf("Error deep copying ObjectMeta: %v", err)
ic.deliverIngress(ingress, ic.ingressReviewDelay, true) ic.deliverIngress(ingress, ic.ingressReviewDelay, true)
} }
desiredIngress.ObjectMeta, ok = objMeta.(v1.ObjectMeta) objMetaCopy, ok := objMeta.(*v1.ObjectMeta)
if !ok { if !ok {
glog.Errorf("Internal error: Failed to cast to v1.ObjectMeta: %v", objMeta) glog.Errorf("Internal error: Failed to cast to v1.ObjectMeta: %v", objMeta)
ic.deliverIngress(ingress, ic.ingressReviewDelay, true) ic.deliverIngress(ingress, ic.ingressReviewDelay, true)
} }
desiredIngress.ObjectMeta = *objMetaCopy
// Merge any annotations and labels on the federated ingress onto the underlying cluster ingress, // Merge any annotations and labels on the federated ingress onto the underlying cluster ingress,
// overwriting duplicates. // overwriting duplicates.
if desiredIngress.ObjectMeta.Annotations == nil { if desiredIngress.ObjectMeta.Annotations == nil {

View File

@ -27,7 +27,6 @@ go_library(
"//pkg/client/clientset_generated/release_1_5:go_default_library", "//pkg/client/clientset_generated/release_1_5:go_default_library",
"//pkg/client/record:go_default_library", "//pkg/client/record:go_default_library",
"//pkg/controller:go_default_library", "//pkg/controller:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/util/flowcontrol:go_default_library", "//pkg/util/flowcontrol:go_default_library",
"//pkg/watch:go_default_library", "//pkg/watch:go_default_library",

View File

@ -32,7 +32,6 @@ import (
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/flowcontrol" "k8s.io/kubernetes/pkg/util/flowcontrol"
"k8s.io/kubernetes/pkg/watch" "k8s.io/kubernetes/pkg/watch"
@ -338,7 +337,7 @@ func (nc *NamespaceController) reconcileNamespace(namespace string) {
} }
// Create a copy before modifying the namespace to prevent race condition with // Create a copy before modifying the namespace to prevent race condition with
// other readers of namespace from store. // other readers of namespace from store.
namespaceObj, err := conversion.NewCloner().DeepCopy(namespaceObjFromStore) namespaceObj, err := api.Scheme.DeepCopy(namespaceObjFromStore)
baseNamespace, ok := namespaceObj.(*apiv1.Namespace) baseNamespace, ok := namespaceObj.(*apiv1.Namespace)
if err != nil || !ok { if err != nil || !ok {
glog.Errorf("Error in retrieving obj from store: %v, %v", ok, err) glog.Errorf("Error in retrieving obj from store: %v, %v", ok, err)
@ -390,7 +389,7 @@ func (nc *NamespaceController) reconcileNamespace(namespace string) {
// The object should not be modified. // The object should not be modified.
desiredNamespace := &apiv1.Namespace{ desiredNamespace := &apiv1.Namespace{
ObjectMeta: util.DeepCopyRelevantObjectMeta(baseNamespace.ObjectMeta), ObjectMeta: util.DeepCopyRelevantObjectMeta(baseNamespace.ObjectMeta),
Spec: util.DeepCopyApiTypeOrPanic(baseNamespace.Spec).(apiv1.NamespaceSpec), Spec: *(util.DeepCopyApiTypeOrPanic(&baseNamespace.Spec).(*apiv1.NamespaceSpec)),
} }
glog.V(5).Infof("Desired namespace in underlying clusters: %+v", desiredNamespace) glog.V(5).Infof("Desired namespace in underlying clusters: %+v", desiredNamespace)

View File

@ -31,7 +31,6 @@ go_library(
"//pkg/client/clientset_generated/release_1_5:go_default_library", "//pkg/client/clientset_generated/release_1_5:go_default_library",
"//pkg/client/record:go_default_library", "//pkg/client/record:go_default_library",
"//pkg/controller:go_default_library", "//pkg/controller:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/util/flowcontrol:go_default_library", "//pkg/util/flowcontrol:go_default_library",
"//pkg/util/wait:go_default_library", "//pkg/util/wait:go_default_library",

View File

@ -41,7 +41,6 @@ import (
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/flowcontrol" "k8s.io/kubernetes/pkg/util/flowcontrol"
"k8s.io/kubernetes/pkg/util/wait" "k8s.io/kubernetes/pkg/util/wait"
@ -483,7 +482,7 @@ func (frsc *ReplicaSetController) reconcileReplicaSet(key string) (reconciliatio
// don't delete local replicasets for now. Do not reconcile it anymore. // don't delete local replicasets for now. Do not reconcile it anymore.
return statusAllOk, nil return statusAllOk, nil
} }
obj, err := conversion.NewCloner().DeepCopy(objFromStore) obj, err := api.Scheme.DeepCopy(objFromStore)
frs, ok := obj.(*extensionsv1.ReplicaSet) frs, ok := obj.(*extensionsv1.ReplicaSet)
if err != nil || !ok { if err != nil || !ok {
glog.Errorf("Error in retrieving obj from store: %v, %v", ok, err) glog.Errorf("Error in retrieving obj from store: %v, %v", ok, err)
@ -559,7 +558,7 @@ func (frsc *ReplicaSetController) reconcileReplicaSet(key string) (reconciliatio
// The object can be modified. // The object can be modified.
lrs := &extensionsv1.ReplicaSet{ lrs := &extensionsv1.ReplicaSet{
ObjectMeta: fedutil.DeepCopyRelevantObjectMeta(frs.ObjectMeta), ObjectMeta: fedutil.DeepCopyRelevantObjectMeta(frs.ObjectMeta),
Spec: fedutil.DeepCopyApiTypeOrPanic(frs.Spec).(extensionsv1.ReplicaSetSpec), Spec: *fedutil.DeepCopyApiTypeOrPanic(&frs.Spec).(*extensionsv1.ReplicaSetSpec),
} }
specReplicas := int32(replicas) specReplicas := int32(replicas)
lrs.Spec.Replicas = &specReplicas lrs.Spec.Replicas = &specReplicas

View File

@ -27,7 +27,6 @@ go_library(
"//pkg/client/clientset_generated/release_1_5:go_default_library", "//pkg/client/clientset_generated/release_1_5:go_default_library",
"//pkg/client/record:go_default_library", "//pkg/client/record:go_default_library",
"//pkg/controller:go_default_library", "//pkg/controller:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/types:go_default_library", "//pkg/types:go_default_library",
"//pkg/util/flowcontrol:go_default_library", "//pkg/util/flowcontrol:go_default_library",

View File

@ -32,7 +32,6 @@ import (
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
"k8s.io/kubernetes/pkg/conversion"
pkgruntime "k8s.io/kubernetes/pkg/runtime" pkgruntime "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
"k8s.io/kubernetes/pkg/util/flowcontrol" "k8s.io/kubernetes/pkg/util/flowcontrol"
@ -315,7 +314,7 @@ func (secretcontroller *SecretController) reconcileSecret(secret types.Namespace
// Create a copy before modifying the obj to prevent race condition with // Create a copy before modifying the obj to prevent race condition with
// other readers of obj from store. // other readers of obj from store.
baseSecretObj, err := conversion.NewCloner().DeepCopy(baseSecretObjFromStore) baseSecretObj, err := api.Scheme.DeepCopy(baseSecretObjFromStore)
baseSecret, ok := baseSecretObj.(*apiv1.Secret) baseSecret, ok := baseSecretObj.(*apiv1.Secret)
if err != nil || !ok { if err != nil || !ok {
glog.Errorf("Error in retrieving obj from store: %v, %v", ok, err) glog.Errorf("Error in retrieving obj from store: %v, %v", ok, err)

View File

@ -28,6 +28,7 @@ go_library(
"//federation/pkg/dnsprovider:go_default_library", "//federation/pkg/dnsprovider:go_default_library",
"//federation/pkg/dnsprovider/rrstype:go_default_library", "//federation/pkg/dnsprovider/rrstype:go_default_library",
"//federation/pkg/federation-controller/util:go_default_library", "//federation/pkg/federation-controller/util:go_default_library",
"//pkg/api:go_default_library",
"//pkg/api/errors:go_default_library", "//pkg/api/errors:go_default_library",
"//pkg/api/v1:go_default_library", "//pkg/api/v1:go_default_library",
"//pkg/client/cache:go_default_library", "//pkg/client/cache:go_default_library",
@ -35,7 +36,6 @@ go_library(
"//pkg/client/record:go_default_library", "//pkg/client/record:go_default_library",
"//pkg/client/restclient:go_default_library", "//pkg/client/restclient:go_default_library",
"//pkg/controller:go_default_library", "//pkg/controller:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/util/runtime:go_default_library", "//pkg/util/runtime:go_default_library",
"//pkg/util/sets:go_default_library", "//pkg/util/sets:go_default_library",

View File

@ -28,6 +28,7 @@ import (
federationcache "k8s.io/kubernetes/federation/client/cache" federationcache "k8s.io/kubernetes/federation/client/cache"
fedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_5" fedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_5"
"k8s.io/kubernetes/federation/pkg/dnsprovider" "k8s.io/kubernetes/federation/pkg/dnsprovider"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
v1 "k8s.io/kubernetes/pkg/api/v1" v1 "k8s.io/kubernetes/pkg/api/v1"
cache "k8s.io/kubernetes/pkg/client/cache" cache "k8s.io/kubernetes/pkg/client/cache"
@ -40,8 +41,6 @@ import (
"k8s.io/kubernetes/pkg/util/wait" "k8s.io/kubernetes/pkg/util/wait"
"k8s.io/kubernetes/pkg/util/workqueue" "k8s.io/kubernetes/pkg/util/workqueue"
"k8s.io/kubernetes/pkg/watch" "k8s.io/kubernetes/pkg/watch"
"k8s.io/kubernetes/pkg/conversion"
) )
const ( const (
@ -361,7 +360,7 @@ func (s *ServiceController) processServiceForCluster(cachedService *cachedServic
// should be retried. // should be retried.
func (s *ServiceController) updateFederationService(key string, cachedService *cachedService) (error, bool) { func (s *ServiceController) updateFederationService(key string, cachedService *cachedService) (error, bool) {
// Clone federation service, and create them in underlying k8s cluster // Clone federation service, and create them in underlying k8s cluster
clone, err := conversion.NewCloner().DeepCopy(cachedService.lastState) clone, err := api.Scheme.DeepCopy(cachedService.lastState)
if err != nil { if err != nil {
return err, !retryable return err, !retryable
} }

View File

@ -39,7 +39,6 @@ go_library(
"//pkg/client/unversioned/clientcmd:go_default_library", "//pkg/client/unversioned/clientcmd:go_default_library",
"//pkg/client/unversioned/clientcmd/api:go_default_library", "//pkg/client/unversioned/clientcmd/api:go_default_library",
"//pkg/controller/deployment/util:go_default_library", "//pkg/controller/deployment/util:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/util/flowcontrol:go_default_library", "//pkg/util/flowcontrol:go_default_library",
"//pkg/util/net:go_default_library", "//pkg/util/net:go_default_library",

View File

@ -70,6 +70,6 @@ func DeepCopyDeploymentObjectMeta(meta api_v1.ObjectMeta) api_v1.ObjectMeta {
func DeepCopyDeployment(a *extensions_v1.Deployment) *extensions_v1.Deployment { func DeepCopyDeployment(a *extensions_v1.Deployment) *extensions_v1.Deployment {
return &extensions_v1.Deployment{ return &extensions_v1.Deployment{
ObjectMeta: DeepCopyDeploymentObjectMeta(a.ObjectMeta), ObjectMeta: DeepCopyDeploymentObjectMeta(a.ObjectMeta),
Spec: DeepCopyApiTypeOrPanic(a.Spec).(extensions_v1.DeploymentSpec), Spec: *(DeepCopyApiTypeOrPanic(&a.Spec).(*extensions_v1.DeploymentSpec)),
} }
} }

View File

@ -19,8 +19,8 @@ package util
import ( import (
"reflect" "reflect"
"k8s.io/kubernetes/pkg/api"
api_v1 "k8s.io/kubernetes/pkg/api/v1" api_v1 "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
) )
@ -86,7 +86,7 @@ func ObjectMetaAndSpecEquivalent(a, b runtime.Object) bool {
} }
func DeepCopyApiTypeOrPanic(item interface{}) interface{} { func DeepCopyApiTypeOrPanic(item interface{}) interface{} {
result, err := conversion.NewCloner().DeepCopy(item) result, err := api.Scheme.DeepCopy(item)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -33,7 +33,6 @@ go_library(
"//pkg/client/clientset_generated/release_1_5/typed/core/v1:go_default_library", "//pkg/client/clientset_generated/release_1_5/typed/core/v1:go_default_library",
"//pkg/client/record:go_default_library", "//pkg/client/record:go_default_library",
"//pkg/client/restclient:go_default_library", "//pkg/client/restclient:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",

View File

@ -32,7 +32,6 @@ import (
"k8s.io/kubernetes/pkg/client/cache" "k8s.io/kubernetes/pkg/client/cache"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime/schema" "k8s.io/kubernetes/pkg/runtime/schema"
@ -486,7 +485,7 @@ func GetPodFromTemplate(template *v1.PodTemplateSpec, parentObject runtime.Objec
if controllerRef != nil { if controllerRef != nil {
pod.OwnerReferences = append(pod.OwnerReferences, *controllerRef) pod.OwnerReferences = append(pod.OwnerReferences, *controllerRef)
} }
clone, err := conversion.NewCloner().DeepCopy(&template.Spec) clone, err := api.Scheme.DeepCopy(&template.Spec)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -431,7 +431,7 @@ func TestEqualIgnoreHash(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
runTest := func(t1, t2 v1.PodTemplateSpec, reversed bool) { runTest := func(t1, t2 *v1.PodTemplateSpec, reversed bool) {
// Set up // Set up
t1Copy, err := api.Scheme.DeepCopy(t1) t1Copy, err := api.Scheme.DeepCopy(t1)
if err != nil { if err != nil {
@ -446,7 +446,7 @@ func TestEqualIgnoreHash(t *testing.T) {
reverseString = " (reverse order)" reverseString = " (reverse order)"
} }
// Run // Run
equal, err := equalIgnoreHash(t1, t2) equal, err := equalIgnoreHash(*t1, *t2)
// Check // Check
if err != nil { if err != nil {
t.Errorf("In test case %q%s, expected no error, returned %v", test.test, reverseString, err) t.Errorf("In test case %q%s, expected no error, returned %v", test.test, reverseString, err)
@ -461,9 +461,9 @@ func TestEqualIgnoreHash(t *testing.T) {
t.Errorf("In test case %q%s, unexpected input template modified", test.test, reverseString) t.Errorf("In test case %q%s, unexpected input template modified", test.test, reverseString)
} }
} }
runTest(test.former, test.latter, false) runTest(&test.former, &test.latter, false)
// Test the same case in reverse order // Test the same case in reverse order
runTest(test.latter, test.former, true) runTest(&test.latter, &test.former, true)
} }
} }

View File

@ -644,14 +644,14 @@ func (dc *DisruptionController) buildDisruptedPodMap(pods []*v1.Pod, pdb *policy
// this field correctly, we will prevent the /evict handler from approving an // this field correctly, we will prevent the /evict handler from approving an
// eviction when it may be unsafe to do so. // eviction when it may be unsafe to do so.
func (dc *DisruptionController) failSafe(pdb *policy.PodDisruptionBudget) error { func (dc *DisruptionController) failSafe(pdb *policy.PodDisruptionBudget) error {
obj, err := api.Scheme.DeepCopy(*pdb) obj, err := api.Scheme.DeepCopy(pdb)
if err != nil { if err != nil {
return err return err
} }
newPdb := obj.(policy.PodDisruptionBudget) newPdb := obj.(*policy.PodDisruptionBudget)
newPdb.Status.PodDisruptionsAllowed = 0 newPdb.Status.PodDisruptionsAllowed = 0
return dc.getUpdater()(&newPdb) return dc.getUpdater()(newPdb)
} }
func (dc *DisruptionController) updatePdbStatus(pdb *policy.PodDisruptionBudget, currentHealthy, desiredHealthy, expectedCount int32, func (dc *DisruptionController) updatePdbStatus(pdb *policy.PodDisruptionBudget, currentHealthy, desiredHealthy, expectedCount int32,
@ -675,11 +675,11 @@ func (dc *DisruptionController) updatePdbStatus(pdb *policy.PodDisruptionBudget,
return nil return nil
} }
obj, err := api.Scheme.DeepCopy(*pdb) obj, err := api.Scheme.DeepCopy(pdb)
if err != nil { if err != nil {
return err return err
} }
newPdb := obj.(policy.PodDisruptionBudget) newPdb := obj.(*policy.PodDisruptionBudget)
newPdb.Status = policy.PodDisruptionBudgetStatus{ newPdb.Status = policy.PodDisruptionBudgetStatus{
CurrentHealthy: currentHealthy, CurrentHealthy: currentHealthy,
@ -690,7 +690,7 @@ func (dc *DisruptionController) updatePdbStatus(pdb *policy.PodDisruptionBudget,
ObservedGeneration: pdb.Generation, ObservedGeneration: pdb.Generation,
} }
return dc.getUpdater()(&newPdb) return dc.getUpdater()(newPdb)
} }
// refresh tries to re-GET the given PDB. If there are any errors, it just // refresh tries to re-GET the given PDB. If there are any errors, it just

View File

@ -44,11 +44,11 @@ func (ps *pdbStates) Set(pdb *policy.PodDisruptionBudget) error {
if err != nil { if err != nil {
return err return err
} }
obj, err := api.Scheme.DeepCopy(*pdb) obj, err := api.Scheme.DeepCopy(pdb)
if err != nil { if err != nil {
return err return err
} }
(*ps)[key] = obj.(policy.PodDisruptionBudget) (*ps)[key] = *obj.(*policy.PodDisruptionBudget)
return nil return nil
} }

View File

@ -48,11 +48,11 @@ func updateReplicaSetStatus(c unversionedextensions.ReplicaSetInterface, rs exte
// deep copy to avoid mutation now. // deep copy to avoid mutation now.
// TODO this method need some work. Retry on conflict probably, though I suspect this is stomping status to something it probably shouldn't // TODO this method need some work. Retry on conflict probably, though I suspect this is stomping status to something it probably shouldn't
copyObj, err := api.Scheme.DeepCopy(rs) copyObj, err := api.Scheme.DeepCopy(&rs)
if err != nil { if err != nil {
return err return err
} }
rs = copyObj.(extensions.ReplicaSet) rs = *copyObj.(*extensions.ReplicaSet)
// Save the generation number we acted on, otherwise we might wrongfully indicate // Save the generation number we acted on, otherwise we might wrongfully indicate
// that we've seen a spec update when we retry. // that we've seen a spec update when we retry.

View File

@ -434,18 +434,18 @@ func (adc *attachDetachController) createVolumeSpec(
// Do not return the original volume object, since it's from the shared // Do not return the original volume object, since it's from the shared
// informer it may be mutated by another consumer. // informer it may be mutated by another consumer.
clonedPodVolumeObj, err := api.Scheme.DeepCopy(podVolume) clonedPodVolumeObj, err := api.Scheme.DeepCopy(&podVolume)
if err != nil || clonedPodVolumeObj == nil { if err != nil || clonedPodVolumeObj == nil {
return nil, fmt.Errorf( return nil, fmt.Errorf(
"failed to deep copy %q volume object. err=%v", podVolume.Name, err) "failed to deep copy %q volume object. err=%v", podVolume.Name, err)
} }
clonedPodVolume, ok := clonedPodVolumeObj.(v1.Volume) clonedPodVolume, ok := clonedPodVolumeObj.(*v1.Volume)
if !ok { if !ok {
return nil, fmt.Errorf("failed to cast clonedPodVolume %#v to v1.Volume", clonedPodVolumeObj) return nil, fmt.Errorf("failed to cast clonedPodVolume %#v to v1.Volume", clonedPodVolumeObj)
} }
return volume.NewSpecFromVolume(&clonedPodVolume), nil return volume.NewSpecFromVolume(clonedPodVolume), nil
} }
// getPVCFromCacheExtractPV fetches the PVC object with the given namespace and // getPVCFromCacheExtractPV fetches the PVC object with the given namespace and
@ -526,19 +526,19 @@ func (adc *attachDetachController) getPVSpecFromCache(
// Do not return the object from the informer, since the store is shared it // Do not return the object from the informer, since the store is shared it
// may be mutated by another consumer. // may be mutated by another consumer.
clonedPVObj, err := api.Scheme.DeepCopy(*pv) clonedPVObj, err := api.Scheme.DeepCopy(pv)
if err != nil || clonedPVObj == nil { if err != nil || clonedPVObj == nil {
return nil, fmt.Errorf( return nil, fmt.Errorf(
"failed to deep copy %q PV object. err=%v", name, err) "failed to deep copy %q PV object. err=%v", name, err)
} }
clonedPV, ok := clonedPVObj.(v1.PersistentVolume) clonedPV, ok := clonedPVObj.(*v1.PersistentVolume)
if !ok { if !ok {
return nil, fmt.Errorf( return nil, fmt.Errorf(
"failed to cast %q clonedPV %#v to PersistentVolume", name, pvObj) "failed to cast %q clonedPV %#v to PersistentVolume", name, pvObj)
} }
return volume.NewSpecFromPersistentVolume(&clonedPV, pvcReadOnly), nil return volume.NewSpecFromPersistentVolume(clonedPV, pvcReadOnly), nil
} }
// processVolumesInUse processes the list of volumes marked as "in-use" // processVolumesInUse processes the list of volumes marked as "in-use"

View File

@ -18,11 +18,11 @@ go_library(
], ],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/v1:go_default_library", "//pkg/api/v1:go_default_library",
"//pkg/client/cache:go_default_library", "//pkg/client/cache:go_default_library",
"//pkg/client/clientset_generated/release_1_5:go_default_library", "//pkg/client/clientset_generated/release_1_5:go_default_library",
"//pkg/controller/volume/attachdetach/cache:go_default_library", "//pkg/controller/volume/attachdetach/cache:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/util/strategicpatch:go_default_library", "//pkg/util/strategicpatch:go_default_library",
"//vendor:github.com/golang/glog", "//vendor:github.com/golang/glog",
], ],

View File

@ -24,11 +24,11 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
kcache "k8s.io/kubernetes/pkg/client/cache" kcache "k8s.io/kubernetes/pkg/client/cache"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
"k8s.io/kubernetes/pkg/controller/volume/attachdetach/cache" "k8s.io/kubernetes/pkg/controller/volume/attachdetach/cache"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/util/strategicpatch" "k8s.io/kubernetes/pkg/util/strategicpatch"
) )
@ -76,7 +76,7 @@ func (nsu *nodeStatusUpdater) UpdateNodeStatuses() error {
continue continue
} }
clonedNode, err := conversion.NewCloner().DeepCopy(nodeObj) clonedNode, err := api.Scheme.DeepCopy(nodeObj)
if err != nil { if err != nil {
return fmt.Errorf("error cloning node %q: %v", return fmt.Errorf("error cloning node %q: %v",
nodeName, nodeName,

View File

@ -20,6 +20,7 @@ go_library(
], ],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/errors:go_default_library", "//pkg/api/errors:go_default_library",
"//pkg/api/meta:go_default_library", "//pkg/api/meta:go_default_library",
"//pkg/api/v1:go_default_library", "//pkg/api/v1:go_default_library",
@ -31,7 +32,6 @@ go_library(
"//pkg/client/clientset_generated/release_1_5/typed/core/v1:go_default_library", "//pkg/client/clientset_generated/release_1_5/typed/core/v1:go_default_library",
"//pkg/client/record:go_default_library", "//pkg/client/record:go_default_library",
"//pkg/cloudprovider:go_default_library", "//pkg/cloudprovider:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/types:go_default_library", "//pkg/types:go_default_library",
@ -58,6 +58,7 @@ go_test(
library = "go_default_library", library = "go_default_library",
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/resource:go_default_library", "//pkg/api/resource:go_default_library",
"//pkg/api/testapi:go_default_library", "//pkg/api/testapi:go_default_library",
"//pkg/api/v1:go_default_library", "//pkg/api/v1:go_default_library",
@ -70,7 +71,6 @@ go_test(
"//pkg/client/record:go_default_library", "//pkg/client/record:go_default_library",
"//pkg/client/testing/cache:go_default_library", "//pkg/client/testing/cache:go_default_library",
"//pkg/client/testing/core:go_default_library", "//pkg/client/testing/core:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/types:go_default_library", "//pkg/types:go_default_library",
"//pkg/util/diff:go_default_library", "//pkg/util/diff:go_default_library",

View File

@ -29,6 +29,7 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
@ -41,7 +42,6 @@ import (
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
fcache "k8s.io/kubernetes/pkg/client/testing/cache" fcache "k8s.io/kubernetes/pkg/client/testing/cache"
"k8s.io/kubernetes/pkg/client/testing/core" "k8s.io/kubernetes/pkg/client/testing/core"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
"k8s.io/kubernetes/pkg/util/diff" "k8s.io/kubernetes/pkg/util/diff"
@ -314,7 +314,7 @@ func (r *volumeReactor) checkVolumes(expectedVolumes []*v1.PersistentVolume) err
for _, v := range r.volumes { for _, v := range r.volumes {
// We must clone the volume because of golang race check - it was // We must clone the volume because of golang race check - it was
// written by the controller without any locks on it. // written by the controller without any locks on it.
clone, _ := conversion.NewCloner().DeepCopy(v) clone, _ := api.Scheme.DeepCopy(v)
v = clone.(*v1.PersistentVolume) v = clone.(*v1.PersistentVolume)
v.ResourceVersion = "" v.ResourceVersion = ""
if v.Spec.ClaimRef != nil { if v.Spec.ClaimRef != nil {
@ -345,7 +345,7 @@ func (r *volumeReactor) checkClaims(expectedClaims []*v1.PersistentVolumeClaim)
for _, c := range r.claims { for _, c := range r.claims {
// We must clone the claim because of golang race check - it was // We must clone the claim because of golang race check - it was
// written by the controller without any locks on it. // written by the controller without any locks on it.
clone, _ := conversion.NewCloner().DeepCopy(c) clone, _ := api.Scheme.DeepCopy(c)
c = clone.(*v1.PersistentVolumeClaim) c = clone.(*v1.PersistentVolumeClaim)
c.ResourceVersion = "" c.ResourceVersion = ""
gotMap[c.Name] = c gotMap[c.Name] = c
@ -513,7 +513,7 @@ func (r *volumeReactor) deleteVolumeEvent(volume *v1.PersistentVolume) {
// Generate deletion event. Cloned volume is needed to prevent races (and we // Generate deletion event. Cloned volume is needed to prevent races (and we
// would get a clone from etcd too). // would get a clone from etcd too).
clone, _ := conversion.NewCloner().DeepCopy(volume) clone, _ := api.Scheme.DeepCopy(volume)
volumeClone := clone.(*v1.PersistentVolume) volumeClone := clone.(*v1.PersistentVolume)
r.volumeSource.Delete(volumeClone) r.volumeSource.Delete(volumeClone)
} }
@ -529,7 +529,7 @@ func (r *volumeReactor) deleteClaimEvent(claim *v1.PersistentVolumeClaim) {
// Generate deletion event. Cloned volume is needed to prevent races (and we // Generate deletion event. Cloned volume is needed to prevent races (and we
// would get a clone from etcd too). // would get a clone from etcd too).
clone, _ := conversion.NewCloner().DeepCopy(claim) clone, _ := api.Scheme.DeepCopy(claim)
claimClone := clone.(*v1.PersistentVolumeClaim) claimClone := clone.(*v1.PersistentVolumeClaim)
r.claimSource.Delete(claimClone) r.claimSource.Delete(claimClone)
} }
@ -555,7 +555,7 @@ func (r *volumeReactor) modifyVolumeEvent(volume *v1.PersistentVolume) {
r.volumes[volume.Name] = volume r.volumes[volume.Name] = volume
// Generate deletion event. Cloned volume is needed to prevent races (and we // Generate deletion event. Cloned volume is needed to prevent races (and we
// would get a clone from etcd too). // would get a clone from etcd too).
clone, _ := conversion.NewCloner().DeepCopy(volume) clone, _ := api.Scheme.DeepCopy(volume)
volumeClone := clone.(*v1.PersistentVolume) volumeClone := clone.(*v1.PersistentVolume)
r.volumeSource.Modify(volumeClone) r.volumeSource.Modify(volumeClone)
} }

View File

@ -22,6 +22,7 @@ import (
"strings" "strings"
"time" "time"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1" storage "k8s.io/kubernetes/pkg/apis/storage/v1beta1"
@ -30,7 +31,6 @@ import (
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/cloudprovider"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/util/goroutinemap" "k8s.io/kubernetes/pkg/util/goroutinemap"
vol "k8s.io/kubernetes/pkg/volume" vol "k8s.io/kubernetes/pkg/volume"
@ -467,7 +467,7 @@ func (ctrl *PersistentVolumeController) syncVolume(volume *v1.PersistentVolume)
// This speeds up binding of provisioned volumes - provisioner saves // This speeds up binding of provisioned volumes - provisioner saves
// only the new PV and it expects that next syncClaim will bind the // only the new PV and it expects that next syncClaim will bind the
// claim to it. // claim to it.
clone, err := conversion.NewCloner().DeepCopy(claim) clone, err := api.Scheme.DeepCopy(claim)
if err != nil { if err != nil {
return fmt.Errorf("error cloning claim %q: %v", claimToClaimKey(claim), err) return fmt.Errorf("error cloning claim %q: %v", claimToClaimKey(claim), err)
} }
@ -547,7 +547,7 @@ func (ctrl *PersistentVolumeController) updateClaimStatus(claim *v1.PersistentVo
dirty := false dirty := false
clone, err := conversion.NewCloner().DeepCopy(claim) clone, err := api.Scheme.DeepCopy(claim)
if err != nil { if err != nil {
return nil, fmt.Errorf("Error cloning claim: %v", err) return nil, fmt.Errorf("Error cloning claim: %v", err)
} }
@ -647,7 +647,7 @@ func (ctrl *PersistentVolumeController) updateVolumePhase(volume *v1.PersistentV
return volume, nil return volume, nil
} }
clone, err := conversion.NewCloner().DeepCopy(volume) clone, err := api.Scheme.DeepCopy(volume)
if err != nil { if err != nil {
return nil, fmt.Errorf("Error cloning claim: %v", err) return nil, fmt.Errorf("Error cloning claim: %v", err)
} }
@ -712,7 +712,7 @@ func (ctrl *PersistentVolumeController) bindVolumeToClaim(volume *v1.PersistentV
// The volume from method args can be pointing to watcher cache. We must not // The volume from method args can be pointing to watcher cache. We must not
// modify these, therefore create a copy. // modify these, therefore create a copy.
clone, err := conversion.NewCloner().DeepCopy(volume) clone, err := api.Scheme.DeepCopy(volume)
if err != nil { if err != nil {
return nil, fmt.Errorf("Error cloning pv: %v", err) return nil, fmt.Errorf("Error cloning pv: %v", err)
} }
@ -777,7 +777,7 @@ func (ctrl *PersistentVolumeController) bindClaimToVolume(claim *v1.PersistentVo
// The claim from method args can be pointing to watcher cache. We must not // The claim from method args can be pointing to watcher cache. We must not
// modify these, therefore create a copy. // modify these, therefore create a copy.
clone, err := conversion.NewCloner().DeepCopy(claim) clone, err := api.Scheme.DeepCopy(claim)
if err != nil { if err != nil {
return nil, fmt.Errorf("Error cloning claim: %v", err) return nil, fmt.Errorf("Error cloning claim: %v", err)
} }
@ -877,7 +877,7 @@ func (ctrl *PersistentVolumeController) unbindVolume(volume *v1.PersistentVolume
glog.V(4).Infof("updating PersistentVolume[%s]: rolling back binding from %q", volume.Name, claimrefToClaimKey(volume.Spec.ClaimRef)) glog.V(4).Infof("updating PersistentVolume[%s]: rolling back binding from %q", volume.Name, claimrefToClaimKey(volume.Spec.ClaimRef))
// Save the PV only when any modification is neccessary. // Save the PV only when any modification is neccessary.
clone, err := conversion.NewCloner().DeepCopy(volume) clone, err := api.Scheme.DeepCopy(volume)
if err != nil { if err != nil {
return fmt.Errorf("Error cloning pv: %v", err) return fmt.Errorf("Error cloning pv: %v", err)
} }

View File

@ -21,6 +21,7 @@ import (
"strconv" "strconv"
"time" "time"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
@ -30,7 +31,6 @@ import (
unversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5/typed/core/v1" unversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5/typed/core/v1"
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/cloudprovider"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/goroutinemap" "k8s.io/kubernetes/pkg/util/goroutinemap"
vol "k8s.io/kubernetes/pkg/volume" vol "k8s.io/kubernetes/pkg/volume"
@ -178,7 +178,7 @@ func (ctrl *PersistentVolumeController) initializeCaches(volumeSource, claimSour
// Ignore template volumes from kubernetes 1.2 // Ignore template volumes from kubernetes 1.2
deleted := ctrl.upgradeVolumeFrom1_2(&volume) deleted := ctrl.upgradeVolumeFrom1_2(&volume)
if !deleted { if !deleted {
clone, err := conversion.NewCloner().DeepCopy(&volume) clone, err := api.Scheme.DeepCopy(&volume)
if err != nil { if err != nil {
glog.Errorf("error cloning volume %q: %v", volume.Name, err) glog.Errorf("error cloning volume %q: %v", volume.Name, err)
continue continue
@ -199,7 +199,7 @@ func (ctrl *PersistentVolumeController) initializeCaches(volumeSource, claimSour
return return
} }
for _, claim := range claimList.Items { for _, claim := range claimList.Items {
clone, err := conversion.NewCloner().DeepCopy(&claim) clone, err := api.Scheme.DeepCopy(&claim)
if err != nil { if err != nil {
glog.Errorf("error cloning claim %q: %v", claimToClaimKey(&claim), err) glog.Errorf("error cloning claim %q: %v", claimToClaimKey(&claim), err)
continue continue
@ -504,7 +504,7 @@ func (ctrl *PersistentVolumeController) setClaimProvisioner(claim *v1.Persistent
// The volume from method args can be pointing to watcher cache. We must not // The volume from method args can be pointing to watcher cache. We must not
// modify these, therefore create a copy. // modify these, therefore create a copy.
clone, err := conversion.NewCloner().DeepCopy(claim) clone, err := api.Scheme.DeepCopy(claim)
if err != nil { if err != nil {
return nil, fmt.Errorf("Error cloning pv: %v", err) return nil, fmt.Errorf("Error cloning pv: %v", err)
} }

View File

@ -188,7 +188,6 @@ go_test(
"//pkg/client/restclient:go_default_library", "//pkg/client/restclient:go_default_library",
"//pkg/client/restclient/fake:go_default_library", "//pkg/client/restclient/fake:go_default_library",
"//pkg/client/typed/dynamic:go_default_library", "//pkg/client/typed/dynamic:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/kubectl:go_default_library", "//pkg/kubectl:go_default_library",
"//pkg/kubectl/cmd/testing:go_default_library", "//pkg/kubectl/cmd/testing:go_default_library",
"//pkg/kubectl/cmd/util:go_default_library", "//pkg/kubectl/cmd/util:go_default_library",

View File

@ -41,7 +41,6 @@ import (
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/apis/policy" "k8s.io/kubernetes/pkg/apis/policy"
"k8s.io/kubernetes/pkg/client/restclient/fake" "k8s.io/kubernetes/pkg/client/restclient/fake"
"k8s.io/kubernetes/pkg/conversion"
cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -70,7 +69,7 @@ func TestMain(m *testing.M) {
}, },
Status: api.NodeStatus{}, Status: api.NodeStatus{},
} }
clone, _ := conversion.NewCloner().DeepCopy(node) clone, _ := api.Scheme.DeepCopy(node)
// A copy of the same node, but cordoned. // A copy of the same node, but cordoned.
cordoned_node = clone.(*api.Node) cordoned_node = clone.(*api.Node)

View File

@ -28,7 +28,6 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/client/restclient/fake" "k8s.io/kubernetes/pkg/client/restclient/fake"
"k8s.io/kubernetes/pkg/conversion"
cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -52,7 +51,7 @@ func generateNodeAndTaintedNode(oldTaints []api.Taint, newTaints []api.Taint) (*
}, },
Status: api.NodeStatus{}, Status: api.NodeStatus{},
} }
clone, _ := conversion.NewCloner().DeepCopy(node) clone, _ := api.Scheme.DeepCopy(node)
newTaintsData, _ := json.Marshal(newTaints) newTaintsData, _ := json.Marshal(newTaints)
// A copy of the same node, but tainted. // A copy of the same node, but tainted.

View File

@ -70,7 +70,6 @@ go_test(
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/client/cache:go_default_library", "//pkg/client/cache:go_default_library",
"//pkg/client/record:go_default_library", "//pkg/client/record:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/kubelet/types:go_default_library", "//pkg/kubelet/types:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/securitycontext:go_default_library", "//pkg/securitycontext:go_default_library",

View File

@ -28,7 +28,6 @@ import (
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/conversion"
kubetypes "k8s.io/kubernetes/pkg/kubelet/types" kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
"k8s.io/kubernetes/pkg/securitycontext" "k8s.io/kubernetes/pkg/securitycontext"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
@ -369,7 +368,7 @@ func TestPodUpdateAnnotations(t *testing.T) {
pod.Annotations = make(map[string]string, 0) pod.Annotations = make(map[string]string, 0)
pod.Annotations["kubernetes.io/blah"] = "blah" pod.Annotations["kubernetes.io/blah"] = "blah"
clone, err := conversion.NewCloner().DeepCopy(pod) clone, err := api.Scheme.DeepCopy(pod)
if err != nil { if err != nil {
t.Fatalf("%v", err) t.Fatalf("%v", err)
} }
@ -401,7 +400,7 @@ func TestPodUpdateLabels(t *testing.T) {
pod.Labels = make(map[string]string, 0) pod.Labels = make(map[string]string, 0)
pod.Labels["key"] = "value" pod.Labels["key"] = "value"
clone, err := conversion.NewCloner().DeepCopy(pod) clone, err := api.Scheme.DeepCopy(pod)
if err != nil { if err != nil {
t.Fatalf("%v", err) t.Fatalf("%v", err)
} }

View File

@ -344,20 +344,20 @@ func (dswp *desiredStateOfWorldPopulator) createVolumeSpec(
} }
// Do not return the original volume object, since the source could mutate it // Do not return the original volume object, since the source could mutate it
clonedPodVolumeObj, err := api.Scheme.DeepCopy(podVolume) clonedPodVolumeObj, err := api.Scheme.DeepCopy(&podVolume)
if err != nil || clonedPodVolumeObj == nil { if err != nil || clonedPodVolumeObj == nil {
return nil, "", fmt.Errorf( return nil, "", fmt.Errorf(
"failed to deep copy %q volume object. err=%v", podVolume.Name, err) "failed to deep copy %q volume object. err=%v", podVolume.Name, err)
} }
clonedPodVolume, ok := clonedPodVolumeObj.(v1.Volume) clonedPodVolume, ok := clonedPodVolumeObj.(*v1.Volume)
if !ok { if !ok {
return nil, "", fmt.Errorf( return nil, "", fmt.Errorf(
"failed to cast clonedPodVolume %#v to v1.Volume", "failed to cast clonedPodVolume %#v to v1.Volume",
clonedPodVolumeObj) clonedPodVolumeObj)
} }
return volume.NewSpecFromVolume(&clonedPodVolume), "", nil return volume.NewSpecFromVolume(clonedPodVolume), "", nil
} }
// getPVCExtractPV fetches the PVC object with the given namespace and name from // getPVCExtractPV fetches the PVC object with the given namespace and name from

View File

@ -18,8 +18,8 @@ go_library(
], ],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/v1:go_default_library", "//pkg/api/v1:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/types:go_default_library", "//pkg/types:go_default_library",
"//pkg/util/uuid:go_default_library", "//pkg/util/uuid:go_default_library",
"//pkg/volume:go_default_library", "//pkg/volume:go_default_library",

View File

@ -21,8 +21,8 @@ import (
"os" "os"
"regexp" "regexp"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
"k8s.io/kubernetes/pkg/util/uuid" "k8s.io/kubernetes/pkg/util/uuid"
"k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume"
@ -245,7 +245,7 @@ func (r *hostPathRecycler) GetPath() string {
// Recycle blocks until the pod has completed or any error occurs. // Recycle blocks until the pod has completed or any error occurs.
// HostPath recycling only works in single node clusters and is meant for testing purposes only. // HostPath recycling only works in single node clusters and is meant for testing purposes only.
func (r *hostPathRecycler) Recycle() error { func (r *hostPathRecycler) Recycle() error {
templateClone, err := conversion.NewCloner().DeepCopy(r.config.RecyclerPodTemplate) templateClone, err := api.Scheme.DeepCopy(r.config.RecyclerPodTemplate)
if err != nil { if err != nil {
return err return err
} }

View File

@ -18,8 +18,8 @@ go_library(
], ],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/v1:go_default_library", "//pkg/api/v1:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/types:go_default_library", "//pkg/types:go_default_library",
"//pkg/util/exec:go_default_library", "//pkg/util/exec:go_default_library",
"//pkg/util/mount:go_default_library", "//pkg/util/mount:go_default_library",

View File

@ -22,8 +22,8 @@ import (
"runtime" "runtime"
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
"k8s.io/kubernetes/pkg/util/exec" "k8s.io/kubernetes/pkg/util/exec"
"k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/util/mount"
@ -333,7 +333,7 @@ func (r *nfsRecycler) GetPath() string {
// Recycle recycles/scrubs clean an NFS volume. // Recycle recycles/scrubs clean an NFS volume.
// Recycle blocks until the pod has completed or any error occurs. // Recycle blocks until the pod has completed or any error occurs.
func (r *nfsRecycler) Recycle() error { func (r *nfsRecycler) Recycle() error {
templateClone, err := conversion.NewCloner().DeepCopy(r.config.RecyclerPodTemplate) templateClone, err := api.Scheme.DeepCopy(r.config.RecyclerPodTemplate)
if err != nil { if err != nil {
return err return err
} }

View File

@ -40,7 +40,6 @@ go_test(
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/apis/storage:go_default_library", "//pkg/apis/storage:go_default_library",
"//pkg/apis/storage/util:go_default_library", "//pkg/apis/storage/util:go_default_library",
"//pkg/conversion:go_default_library",
"//vendor:github.com/golang/glog", "//vendor:github.com/golang/glog",
], ],
) )

View File

@ -26,7 +26,6 @@ import (
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/apis/storage"
storageutil "k8s.io/kubernetes/pkg/apis/storage/util" storageutil "k8s.io/kubernetes/pkg/apis/storage/util"
"k8s.io/kubernetes/pkg/conversion"
) )
func TestAdmission(t *testing.T) { func TestAdmission(t *testing.T) {
@ -187,7 +186,7 @@ func TestAdmission(t *testing.T) {
glog.V(4).Infof("starting test %q", test.name) glog.V(4).Infof("starting test %q", test.name)
// clone the claim, it's going to be modified // clone the claim, it's going to be modified
clone, err := conversion.NewCloner().DeepCopy(test.claim) clone, err := api.Scheme.DeepCopy(test.claim)
if err != nil { if err != nil {
t.Fatalf("Cannot clone claim: %v", err) t.Fatalf("Cannot clone claim: %v", err)
} }

View File

@ -150,7 +150,6 @@ go_library(
"//pkg/controller/petset:go_default_library", "//pkg/controller/petset:go_default_library",
"//pkg/controller/replicaset:go_default_library", "//pkg/controller/replicaset:go_default_library",
"//pkg/controller/replication:go_default_library", "//pkg/controller/replication:go_default_library",
"//pkg/conversion:go_default_library",
"//pkg/dns/federation:go_default_library", "//pkg/dns/federation:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/kubectl:go_default_library", "//pkg/kubectl:go_default_library",

View File

@ -23,8 +23,8 @@ import (
"strconv" "strconv"
"time" "time"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/framework"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -172,7 +172,7 @@ var _ = framework.KubeDescribe("[Feature:Federation]", func() {
createBackendPodsOrFail(clusters, nsName, FederatedServicePodName) createBackendPodsOrFail(clusters, nsName, FederatedServicePodName)
service = createServiceOrFail(f.FederationClientset_1_5, nsName, FederatedServiceName) service = createServiceOrFail(f.FederationClientset_1_5, nsName, FederatedServiceName)
obj, err := conversion.NewCloner().DeepCopy(service) obj, err := api.Scheme.DeepCopy(service)
// Cloning shouldn't fail. On the off-chance it does, we // Cloning shouldn't fail. On the off-chance it does, we
// should shallow copy service to serviceShard before // should shallow copy service to serviceShard before
// failing. If we don't do this we will never really // failing. If we don't do this we will never really

View File

@ -27,6 +27,7 @@ import (
"testing" "testing"
"time" "time"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apimachinery/registered"
@ -37,7 +38,6 @@ import (
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
fakecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/fake" fakecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/fake"
persistentvolumecontroller "k8s.io/kubernetes/pkg/controller/volume/persistentvolume" persistentvolumecontroller "k8s.io/kubernetes/pkg/controller/volume/persistentvolume"
"k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume"
volumetest "k8s.io/kubernetes/pkg/volume/testing" volumetest "k8s.io/kubernetes/pkg/volume/testing"
"k8s.io/kubernetes/pkg/watch" "k8s.io/kubernetes/pkg/watch"
@ -243,7 +243,7 @@ func TestPersistentVolumeBindRace(t *testing.T) {
claims := []*v1.PersistentVolumeClaim{} claims := []*v1.PersistentVolumeClaim{}
for counter <= maxClaims { for counter <= maxClaims {
counter += 1 counter += 1
clone, _ := conversion.NewCloner().DeepCopy(pvc) clone, _ := api.Scheme.DeepCopy(pvc)
newPvc, _ := clone.(*v1.PersistentVolumeClaim) newPvc, _ := clone.(*v1.PersistentVolumeClaim)
newPvc.ObjectMeta = v1.ObjectMeta{Name: fmt.Sprintf("fake-pvc-race-%d", counter)} newPvc.ObjectMeta = v1.ObjectMeta{Name: fmt.Sprintf("fake-pvc-race-%d", counter)}
claim, err := testClient.PersistentVolumeClaims(ns.Name).Create(newPvc) claim, err := testClient.PersistentVolumeClaims(ns.Name).Create(newPvc)

View File

@ -738,7 +738,7 @@ func (s *LabelNodePrepareStrategy) PreparePatch(*v1.Node) []byte {
} }
func (s *LabelNodePrepareStrategy) CleanupNode(node *v1.Node) *v1.Node { func (s *LabelNodePrepareStrategy) CleanupNode(node *v1.Node) *v1.Node {
objCopy, err := api.Scheme.DeepCopy(*node) objCopy, err := api.Scheme.Copy(node)
if err != nil { if err != nil {
return &v1.Node{} return &v1.Node{}
} }