...

Source file src/k8s.io/kubernetes/pkg/apis/apps/v1beta2/conversion.go

Documentation: k8s.io/kubernetes/pkg/apis/apps/v1beta2

     1  /*
     2  Copyright 2016 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package v1beta2
    18  
    19  import (
    20  	"fmt"
    21  	"strconv"
    22  
    23  	appsv1beta2 "k8s.io/api/apps/v1beta2"
    24  	corev1 "k8s.io/api/core/v1"
    25  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    26  	"k8s.io/apimachinery/pkg/conversion"
    27  	"k8s.io/apimachinery/pkg/labels"
    28  	"k8s.io/apimachinery/pkg/runtime"
    29  	"k8s.io/kubernetes/pkg/apis/apps"
    30  	autoscaling "k8s.io/kubernetes/pkg/apis/autoscaling"
    31  	"k8s.io/kubernetes/pkg/apis/core"
    32  )
    33  
    34  func addConversionFuncs(scheme *runtime.Scheme) error {
    35  	// Add field label conversions for kinds having selectable nothing but ObjectMeta fields.
    36  	if err := scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("StatefulSet"),
    37  		func(label, value string) (string, string, error) {
    38  			switch label {
    39  			case "metadata.name", "metadata.namespace", "status.successful":
    40  				return label, value, nil
    41  			default:
    42  				return "", "", fmt.Errorf("field label not supported for appsv1beta2.StatefulSet: %s", label)
    43  			}
    44  		}); err != nil {
    45  		return err
    46  	}
    47  
    48  	return nil
    49  }
    50  
    51  func Convert_autoscaling_ScaleStatus_To_v1beta2_ScaleStatus(in *autoscaling.ScaleStatus, out *appsv1beta2.ScaleStatus, s conversion.Scope) error {
    52  	out.Replicas = int32(in.Replicas)
    53  	out.TargetSelector = in.Selector
    54  
    55  	out.Selector = nil
    56  	selector, err := metav1.ParseToLabelSelector(in.Selector)
    57  	if err != nil {
    58  		return fmt.Errorf("failed to parse selector: %v", err)
    59  	}
    60  	if len(selector.MatchExpressions) == 0 {
    61  		out.Selector = selector.MatchLabels
    62  	}
    63  
    64  	return nil
    65  }
    66  
    67  func Convert_v1beta2_ScaleStatus_To_autoscaling_ScaleStatus(in *appsv1beta2.ScaleStatus, out *autoscaling.ScaleStatus, s conversion.Scope) error {
    68  	out.Replicas = in.Replicas
    69  
    70  	// Normally when 2 fields map to the same internal value we favor the old field, since
    71  	// old clients can't be expected to know about new fields but clients that know about the
    72  	// new field can be expected to know about the old field (though that's not quite true, due
    73  	// to kubectl apply). However, these fields are readonly, so any non-nil value should work.
    74  	if in.TargetSelector != "" {
    75  		out.Selector = in.TargetSelector
    76  	} else if in.Selector != nil {
    77  		set := labels.Set{}
    78  		for key, val := range in.Selector {
    79  			set[key] = val
    80  		}
    81  		out.Selector = labels.SelectorFromSet(set).String()
    82  	} else {
    83  		out.Selector = ""
    84  	}
    85  	return nil
    86  }
    87  
    88  // Convert_apps_DeploymentSpec_To_v1beta2_DeploymentSpec is defined here, because public
    89  // conversion is not auto-generated due to existing warnings.
    90  func Convert_apps_DeploymentSpec_To_v1beta2_DeploymentSpec(in *apps.DeploymentSpec, out *appsv1beta2.DeploymentSpec, s conversion.Scope) error {
    91  	if err := autoConvert_apps_DeploymentSpec_To_v1beta2_DeploymentSpec(in, out, s); err != nil {
    92  		return err
    93  	}
    94  	return nil
    95  }
    96  
    97  func Convert_v1beta2_Deployment_To_apps_Deployment(in *appsv1beta2.Deployment, out *apps.Deployment, s conversion.Scope) error {
    98  	if err := autoConvert_v1beta2_Deployment_To_apps_Deployment(in, out, s); err != nil {
    99  		return err
   100  	}
   101  
   102  	// Copy annotation to deprecated rollbackTo field for roundtrip
   103  	// TODO: remove this conversion after we delete extensions/v1beta1 and apps/v1beta1 Deployment
   104  	if revision := in.Annotations[appsv1beta2.DeprecatedRollbackTo]; revision != "" {
   105  		if revision64, err := strconv.ParseInt(revision, 10, 64); err != nil {
   106  			return fmt.Errorf("failed to parse annotation[%s]=%s as int64: %v", appsv1beta2.DeprecatedRollbackTo, revision, err)
   107  		} else {
   108  			out.Spec.RollbackTo = new(apps.RollbackConfig)
   109  			out.Spec.RollbackTo.Revision = revision64
   110  		}
   111  		out.Annotations = deepCopyStringMap(out.Annotations)
   112  		delete(out.Annotations, appsv1beta2.DeprecatedRollbackTo)
   113  	} else {
   114  		out.Spec.RollbackTo = nil
   115  	}
   116  
   117  	return nil
   118  }
   119  
   120  func Convert_apps_Deployment_To_v1beta2_Deployment(in *apps.Deployment, out *appsv1beta2.Deployment, s conversion.Scope) error {
   121  	if err := autoConvert_apps_Deployment_To_v1beta2_Deployment(in, out, s); err != nil {
   122  		return err
   123  	}
   124  
   125  	out.Annotations = deepCopyStringMap(out.Annotations) // deep copy because we modify annotations below
   126  	// Copy deprecated rollbackTo field to annotation for roundtrip
   127  	// TODO: remove this conversion after we delete extensions/v1beta1 and apps/v1beta1 Deployment
   128  	if in.Spec.RollbackTo != nil {
   129  		if out.Annotations == nil {
   130  			out.Annotations = make(map[string]string)
   131  		}
   132  		out.Annotations[appsv1beta2.DeprecatedRollbackTo] = strconv.FormatInt(in.Spec.RollbackTo.Revision, 10)
   133  	} else {
   134  		delete(out.Annotations, appsv1beta2.DeprecatedRollbackTo)
   135  	}
   136  
   137  	return nil
   138  }
   139  
   140  func Convert_apps_DaemonSet_To_v1beta2_DaemonSet(in *apps.DaemonSet, out *appsv1beta2.DaemonSet, s conversion.Scope) error {
   141  	if err := autoConvert_apps_DaemonSet_To_v1beta2_DaemonSet(in, out, s); err != nil {
   142  		return err
   143  	}
   144  
   145  	out.Annotations = deepCopyStringMap(out.Annotations)
   146  	out.Annotations[appsv1beta2.DeprecatedTemplateGeneration] = strconv.FormatInt(in.Spec.TemplateGeneration, 10)
   147  	return nil
   148  }
   149  
   150  // Convert_apps_DaemonSetSpec_To_v1beta2_DaemonSetSpec is defined here, because public
   151  // conversion is not auto-generated due to existing warnings.
   152  func Convert_apps_DaemonSetSpec_To_v1beta2_DaemonSetSpec(in *apps.DaemonSetSpec, out *appsv1beta2.DaemonSetSpec, s conversion.Scope) error {
   153  	if err := autoConvert_apps_DaemonSetSpec_To_v1beta2_DaemonSetSpec(in, out, s); err != nil {
   154  		return err
   155  	}
   156  	return nil
   157  }
   158  
   159  func Convert_v1beta2_DaemonSet_To_apps_DaemonSet(in *appsv1beta2.DaemonSet, out *apps.DaemonSet, s conversion.Scope) error {
   160  	if err := autoConvert_v1beta2_DaemonSet_To_apps_DaemonSet(in, out, s); err != nil {
   161  		return err
   162  	}
   163  
   164  	if value, ok := in.Annotations[appsv1beta2.DeprecatedTemplateGeneration]; ok {
   165  		if value64, err := strconv.ParseInt(value, 10, 64); err != nil {
   166  			return err
   167  		} else {
   168  			out.Spec.TemplateGeneration = value64
   169  			out.Annotations = deepCopyStringMap(out.Annotations)
   170  			delete(out.Annotations, appsv1beta2.DeprecatedTemplateGeneration)
   171  		}
   172  	}
   173  
   174  	return nil
   175  }
   176  
   177  func deepCopyStringMap(m map[string]string) map[string]string {
   178  	ret := make(map[string]string, len(m))
   179  	for k, v := range m {
   180  		ret[k] = v
   181  	}
   182  	return ret
   183  }
   184  
   185  // Convert_v1beta2_StatefulSetSpec_To_apps_StatefulSetSpec augments auto-conversion to preserve < 1.17 behavior
   186  // setting apiVersion/kind in nested persistent volume claim objects.
   187  func Convert_v1beta2_StatefulSetSpec_To_apps_StatefulSetSpec(in *appsv1beta2.StatefulSetSpec, out *apps.StatefulSetSpec, s conversion.Scope) error {
   188  	if err := autoConvert_v1beta2_StatefulSetSpec_To_apps_StatefulSetSpec(in, out, s); err != nil {
   189  		return err
   190  	}
   191  	// set APIVersion/Kind to behave the same as reflective conversion < 1.17.
   192  	// see https://issue.k8s.io/87583
   193  	if out.VolumeClaimTemplates != nil {
   194  		// copy so we don't modify the input
   195  		templatesCopy := make([]core.PersistentVolumeClaim, len(out.VolumeClaimTemplates))
   196  		copy(templatesCopy, out.VolumeClaimTemplates)
   197  		out.VolumeClaimTemplates = templatesCopy
   198  		for i := range out.VolumeClaimTemplates {
   199  			out.VolumeClaimTemplates[i].APIVersion = ""
   200  			out.VolumeClaimTemplates[i].Kind = ""
   201  		}
   202  	}
   203  	return nil
   204  }
   205  
   206  // Convert_apps_StatefulSetSpec_To_v1beta2_StatefulSetSpec augments auto-conversion to preserve < 1.17 behavior
   207  // setting apiVersion/kind in nested persistent volume claim objects.
   208  func Convert_apps_StatefulSetSpec_To_v1beta2_StatefulSetSpec(in *apps.StatefulSetSpec, out *appsv1beta2.StatefulSetSpec, s conversion.Scope) error {
   209  	if err := autoConvert_apps_StatefulSetSpec_To_v1beta2_StatefulSetSpec(in, out, s); err != nil {
   210  		return err
   211  	}
   212  	// set APIVersion/Kind to behave the same as reflective conversion < 1.17.
   213  	// see https://issue.k8s.io/87583
   214  	if out.VolumeClaimTemplates != nil {
   215  		// copy so we don't modify the input
   216  		templatesCopy := make([]corev1.PersistentVolumeClaim, len(out.VolumeClaimTemplates))
   217  		copy(templatesCopy, out.VolumeClaimTemplates)
   218  		out.VolumeClaimTemplates = templatesCopy
   219  		for i := range out.VolumeClaimTemplates {
   220  			out.VolumeClaimTemplates[i].APIVersion = "v1"
   221  			out.VolumeClaimTemplates[i].Kind = "PersistentVolumeClaim"
   222  		}
   223  	}
   224  	return nil
   225  }
   226  

View as plain text