123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538 |
- /*
- Copyright 2015 The Kubernetes Authors.
- 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
- import (
- "fmt"
- "reflect"
- v1 "k8s.io/api/core/v1"
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "k8s.io/apimachinery/pkg/conversion"
- "k8s.io/apimachinery/pkg/runtime"
- "k8s.io/apimachinery/pkg/util/validation/field"
- "k8s.io/kubernetes/pkg/apis/apps"
- "k8s.io/kubernetes/pkg/apis/core"
- )
- func addConversionFuncs(scheme *runtime.Scheme) error {
- // Add field conversion funcs.
- err := scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Pod"),
- func(label, value string) (string, string, error) {
- switch label {
- case "metadata.name",
- "metadata.namespace",
- "spec.nodeName",
- "spec.restartPolicy",
- "spec.schedulerName",
- "spec.serviceAccountName",
- "status.phase",
- "status.podIP",
- "status.podIPs",
- "status.nominatedNodeName":
- return label, value, nil
- // This is for backwards compatibility with old v1 clients which send spec.host
- case "spec.host":
- return "spec.nodeName", value, nil
- default:
- return "", "", fmt.Errorf("field label not supported: %s", label)
- }
- },
- )
- if err != nil {
- return err
- }
- err = scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Node"),
- func(label, value string) (string, string, error) {
- switch label {
- case "metadata.name":
- return label, value, nil
- case "spec.unschedulable":
- return label, value, nil
- default:
- return "", "", fmt.Errorf("field label not supported: %s", label)
- }
- },
- )
- if err != nil {
- return err
- }
- err = scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("ReplicationController"),
- func(label, value string) (string, string, error) {
- switch label {
- case "metadata.name",
- "metadata.namespace",
- "status.replicas":
- return label, value, nil
- default:
- return "", "", fmt.Errorf("field label not supported: %s", label)
- }
- })
- if err != nil {
- return err
- }
- if err := AddFieldLabelConversionsForEvent(scheme); err != nil {
- return err
- }
- if err := AddFieldLabelConversionsForNamespace(scheme); err != nil {
- return err
- }
- if err := AddFieldLabelConversionsForSecret(scheme); err != nil {
- return err
- }
- return nil
- }
- func Convert_v1_ReplicationController_To_apps_ReplicaSet(in *v1.ReplicationController, out *apps.ReplicaSet, s conversion.Scope) error {
- out.ObjectMeta = in.ObjectMeta
- if err := Convert_v1_ReplicationControllerSpec_To_apps_ReplicaSetSpec(&in.Spec, &out.Spec, s); err != nil {
- return err
- }
- if err := Convert_v1_ReplicationControllerStatus_To_apps_ReplicaSetStatus(&in.Status, &out.Status, s); err != nil {
- return err
- }
- return nil
- }
- func Convert_v1_ReplicationControllerSpec_To_apps_ReplicaSetSpec(in *v1.ReplicationControllerSpec, out *apps.ReplicaSetSpec, s conversion.Scope) error {
- out.Replicas = *in.Replicas
- out.MinReadySeconds = in.MinReadySeconds
- if in.Selector != nil {
- out.Selector = new(metav1.LabelSelector)
- metav1.Convert_Map_string_To_string_To_v1_LabelSelector(&in.Selector, out.Selector, s)
- }
- if in.Template != nil {
- if err := Convert_v1_PodTemplateSpec_To_core_PodTemplateSpec(in.Template, &out.Template, s); err != nil {
- return err
- }
- }
- return nil
- }
- func Convert_v1_ReplicationControllerStatus_To_apps_ReplicaSetStatus(in *v1.ReplicationControllerStatus, out *apps.ReplicaSetStatus, s conversion.Scope) error {
- out.Replicas = in.Replicas
- out.FullyLabeledReplicas = in.FullyLabeledReplicas
- out.ReadyReplicas = in.ReadyReplicas
- out.AvailableReplicas = in.AvailableReplicas
- out.ObservedGeneration = in.ObservedGeneration
- for _, cond := range in.Conditions {
- out.Conditions = append(out.Conditions, apps.ReplicaSetCondition{
- Type: apps.ReplicaSetConditionType(cond.Type),
- Status: core.ConditionStatus(cond.Status),
- LastTransitionTime: cond.LastTransitionTime,
- Reason: cond.Reason,
- Message: cond.Message,
- })
- }
- return nil
- }
- func Convert_apps_ReplicaSet_To_v1_ReplicationController(in *apps.ReplicaSet, out *v1.ReplicationController, s conversion.Scope) error {
- out.ObjectMeta = in.ObjectMeta
- if err := Convert_apps_ReplicaSetSpec_To_v1_ReplicationControllerSpec(&in.Spec, &out.Spec, s); err != nil {
- fieldErr, ok := err.(*field.Error)
- if !ok {
- return err
- }
- if out.Annotations == nil {
- out.Annotations = make(map[string]string)
- }
- out.Annotations[v1.NonConvertibleAnnotationPrefix+"/"+fieldErr.Field] = reflect.ValueOf(fieldErr.BadValue).String()
- }
- if err := Convert_apps_ReplicaSetStatus_To_v1_ReplicationControllerStatus(&in.Status, &out.Status, s); err != nil {
- return err
- }
- return nil
- }
- func Convert_apps_ReplicaSetSpec_To_v1_ReplicationControllerSpec(in *apps.ReplicaSetSpec, out *v1.ReplicationControllerSpec, s conversion.Scope) error {
- out.Replicas = new(int32)
- *out.Replicas = in.Replicas
- out.MinReadySeconds = in.MinReadySeconds
- var invalidErr error
- if in.Selector != nil {
- invalidErr = metav1.Convert_v1_LabelSelector_To_Map_string_To_string(in.Selector, &out.Selector, s)
- }
- out.Template = new(v1.PodTemplateSpec)
- if err := Convert_core_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, out.Template, s); err != nil {
- return err
- }
- return invalidErr
- }
- func Convert_apps_ReplicaSetStatus_To_v1_ReplicationControllerStatus(in *apps.ReplicaSetStatus, out *v1.ReplicationControllerStatus, s conversion.Scope) error {
- out.Replicas = in.Replicas
- out.FullyLabeledReplicas = in.FullyLabeledReplicas
- out.ReadyReplicas = in.ReadyReplicas
- out.AvailableReplicas = in.AvailableReplicas
- out.ObservedGeneration = in.ObservedGeneration
- for _, cond := range in.Conditions {
- out.Conditions = append(out.Conditions, v1.ReplicationControllerCondition{
- Type: v1.ReplicationControllerConditionType(cond.Type),
- Status: v1.ConditionStatus(cond.Status),
- LastTransitionTime: cond.LastTransitionTime,
- Reason: cond.Reason,
- Message: cond.Message,
- })
- }
- return nil
- }
- func Convert_core_ReplicationControllerSpec_To_v1_ReplicationControllerSpec(in *core.ReplicationControllerSpec, out *v1.ReplicationControllerSpec, s conversion.Scope) error {
- out.Replicas = &in.Replicas
- out.MinReadySeconds = in.MinReadySeconds
- out.Selector = in.Selector
- if in.Template != nil {
- out.Template = new(v1.PodTemplateSpec)
- if err := Convert_core_PodTemplateSpec_To_v1_PodTemplateSpec(in.Template, out.Template, s); err != nil {
- return err
- }
- } else {
- out.Template = nil
- }
- return nil
- }
- func Convert_v1_ReplicationControllerSpec_To_core_ReplicationControllerSpec(in *v1.ReplicationControllerSpec, out *core.ReplicationControllerSpec, s conversion.Scope) error {
- if in.Replicas != nil {
- out.Replicas = *in.Replicas
- }
- out.MinReadySeconds = in.MinReadySeconds
- out.Selector = in.Selector
- if in.Template != nil {
- out.Template = new(core.PodTemplateSpec)
- if err := Convert_v1_PodTemplateSpec_To_core_PodTemplateSpec(in.Template, out.Template, s); err != nil {
- return err
- }
- } else {
- out.Template = nil
- }
- return nil
- }
- func Convert_core_PodTemplateSpec_To_v1_PodTemplateSpec(in *core.PodTemplateSpec, out *v1.PodTemplateSpec, s conversion.Scope) error {
- if err := autoConvert_core_PodTemplateSpec_To_v1_PodTemplateSpec(in, out, s); err != nil {
- return err
- }
- // drop init container annotations so they don't take effect on legacy kubelets.
- // remove this once the oldest supported kubelet no longer honors the annotations over the field.
- out.Annotations = dropInitContainerAnnotations(out.Annotations)
- return nil
- }
- func Convert_v1_PodTemplateSpec_To_core_PodTemplateSpec(in *v1.PodTemplateSpec, out *core.PodTemplateSpec, s conversion.Scope) error {
- if err := autoConvert_v1_PodTemplateSpec_To_core_PodTemplateSpec(in, out, s); err != nil {
- return err
- }
- // drop init container annotations so they don't show up as differences when receiving requests from old clients
- out.Annotations = dropInitContainerAnnotations(out.Annotations)
- return nil
- }
- func Convert_v1_PodStatus_To_core_PodStatus(in *v1.PodStatus, out *core.PodStatus, s conversion.Scope) error {
- if err := autoConvert_v1_PodStatus_To_core_PodStatus(in, out, s); err != nil {
- return err
- }
- // If both fields (v1.PodIPs and v1.PodIP) are provided, then test v1.PodIP == v1.PodIPs[0]
- if (len(in.PodIP) > 0 && len(in.PodIPs) > 0) && (in.PodIP != in.PodIPs[0].IP) {
- return fmt.Errorf("conversion Error: v1.PodIP(%v) != v1.PodIPs[0](%v)", in.PodIP, in.PodIPs[0].IP)
- }
- // at the this point, autoConvert copied v1.PodIPs -> core.PodIPs
- // if v1.PodIPs was empty but v1.PodIP is not, then set core.PodIPs[0] with v1.PodIP
- if len(in.PodIP) > 0 && len(in.PodIPs) == 0 {
- out.PodIPs = []core.PodIP{
- {
- IP: in.PodIP,
- },
- }
- }
- return nil
- }
- func Convert_core_PodStatus_To_v1_PodStatus(in *core.PodStatus, out *v1.PodStatus, s conversion.Scope) error {
- if err := autoConvert_core_PodStatus_To_v1_PodStatus(in, out, s); err != nil {
- return err
- }
- // at the this point autoConvert copied core.PodIPs -> v1.PodIPs
- // v1.PodIP (singular value field, which does not exist in core) needs to
- // be set with core.PodIPs[0]
- if len(in.PodIPs) > 0 {
- out.PodIP = in.PodIPs[0].IP
- }
- return nil
- }
- // The following two v1.PodSpec conversions are done here to support v1.ServiceAccount
- // as an alias for ServiceAccountName.
- func Convert_core_PodSpec_To_v1_PodSpec(in *core.PodSpec, out *v1.PodSpec, s conversion.Scope) error {
- if err := autoConvert_core_PodSpec_To_v1_PodSpec(in, out, s); err != nil {
- return err
- }
- // DeprecatedServiceAccount is an alias for ServiceAccountName.
- out.DeprecatedServiceAccount = in.ServiceAccountName
- if in.SecurityContext != nil {
- // the host namespace fields have to be handled here for backward compatibility
- // with v1.0.0
- out.HostPID = in.SecurityContext.HostPID
- out.HostNetwork = in.SecurityContext.HostNetwork
- out.HostIPC = in.SecurityContext.HostIPC
- out.ShareProcessNamespace = in.SecurityContext.ShareProcessNamespace
- }
- return nil
- }
- func Convert_core_NodeSpec_To_v1_NodeSpec(in *core.NodeSpec, out *v1.NodeSpec, s conversion.Scope) error {
- if err := autoConvert_core_NodeSpec_To_v1_NodeSpec(in, out, s); err != nil {
- return err
- }
- // at the this point autoConvert copied core.PodCIDRs -> v1.PodCIDRs
- // v1.PodCIDR (singular value field, which does not exist in core) needs to
- // be set with core.PodCIDRs[0]
- if len(in.PodCIDRs) > 0 {
- out.PodCIDR = in.PodCIDRs[0]
- }
- return nil
- }
- func Convert_v1_NodeSpec_To_core_NodeSpec(in *v1.NodeSpec, out *core.NodeSpec, s conversion.Scope) error {
- if err := autoConvert_v1_NodeSpec_To_core_NodeSpec(in, out, s); err != nil {
- return err
- }
- // If both fields (v1.PodCIDRs and v1.PodCIDR) are provided, then test v1.PodCIDR == v1.PodCIDRs[0]
- if (len(in.PodCIDR) > 0 && len(in.PodCIDRs) > 0) && (in.PodCIDR != in.PodCIDRs[0]) {
- return fmt.Errorf("conversion Error: v1.PodCIDR(%v) != v1.CIDRs[0](%v)", in.PodCIDR, in.PodCIDRs[0])
- }
- // at the this point, autoConvert copied v1.PodCIDRs -> core.PodCIDRs
- // if v1.PodCIDRs was empty but v1.PodCIDR is not, then set core.PodCIDRs[0] with v1.PodCIDR
- if len(in.PodCIDR) > 0 && len(in.PodCIDRs) == 0 {
- out.PodCIDRs = []string{in.PodCIDR}
- }
- return nil
- }
- func Convert_v1_PodSpec_To_core_PodSpec(in *v1.PodSpec, out *core.PodSpec, s conversion.Scope) error {
- if err := autoConvert_v1_PodSpec_To_core_PodSpec(in, out, s); err != nil {
- return err
- }
- // We support DeprecatedServiceAccount as an alias for ServiceAccountName.
- // If both are specified, ServiceAccountName (the new field) wins.
- if in.ServiceAccountName == "" {
- out.ServiceAccountName = in.DeprecatedServiceAccount
- }
- // the host namespace fields have to be handled specially for backward compatibility
- // with v1.0.0
- if out.SecurityContext == nil {
- out.SecurityContext = new(core.PodSecurityContext)
- }
- out.SecurityContext.HostNetwork = in.HostNetwork
- out.SecurityContext.HostPID = in.HostPID
- out.SecurityContext.HostIPC = in.HostIPC
- out.SecurityContext.ShareProcessNamespace = in.ShareProcessNamespace
- return nil
- }
- func Convert_v1_Pod_To_core_Pod(in *v1.Pod, out *core.Pod, s conversion.Scope) error {
- if err := autoConvert_v1_Pod_To_core_Pod(in, out, s); err != nil {
- return err
- }
- // drop init container annotations so they don't show up as differences when receiving requests from old clients
- out.Annotations = dropInitContainerAnnotations(out.Annotations)
- return nil
- }
- func Convert_core_Pod_To_v1_Pod(in *core.Pod, out *v1.Pod, s conversion.Scope) error {
- if err := autoConvert_core_Pod_To_v1_Pod(in, out, s); err != nil {
- return err
- }
- // drop init container annotations so they don't take effect on legacy kubelets.
- // remove this once the oldest supported kubelet no longer honors the annotations over the field.
- out.Annotations = dropInitContainerAnnotations(out.Annotations)
- return nil
- }
- func Convert_v1_Secret_To_core_Secret(in *v1.Secret, out *core.Secret, s conversion.Scope) error {
- if err := autoConvert_v1_Secret_To_core_Secret(in, out, s); err != nil {
- return err
- }
- // StringData overwrites Data
- if len(in.StringData) > 0 {
- if out.Data == nil {
- out.Data = map[string][]byte{}
- }
- for k, v := range in.StringData {
- out.Data[k] = []byte(v)
- }
- }
- return nil
- }
- // +k8s:conversion-fn=copy-only
- func Convert_v1_ResourceList_To_core_ResourceList(in *v1.ResourceList, out *core.ResourceList, s conversion.Scope) error {
- if *in == nil {
- return nil
- }
- if *out == nil {
- *out = make(core.ResourceList, len(*in))
- }
- for key, val := range *in {
- // Moved to defaults
- // TODO(#18538): We round up resource values to milli scale to maintain API compatibility.
- // In the future, we should instead reject values that need rounding.
- // const milliScale = -3
- // val.RoundUp(milliScale)
- (*out)[core.ResourceName(key)] = val
- }
- return nil
- }
- func AddFieldLabelConversionsForEvent(scheme *runtime.Scheme) error {
- return scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Event"),
- func(label, value string) (string, string, error) {
- switch label {
- case "involvedObject.kind",
- "involvedObject.namespace",
- "involvedObject.name",
- "involvedObject.uid",
- "involvedObject.apiVersion",
- "involvedObject.resourceVersion",
- "involvedObject.fieldPath",
- "reason",
- "source",
- "type",
- "metadata.namespace",
- "metadata.name":
- return label, value, nil
- default:
- return "", "", fmt.Errorf("field label not supported: %s", label)
- }
- })
- }
- func AddFieldLabelConversionsForNamespace(scheme *runtime.Scheme) error {
- return scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Namespace"),
- func(label, value string) (string, string, error) {
- switch label {
- case "status.phase",
- "metadata.name":
- return label, value, nil
- default:
- return "", "", fmt.Errorf("field label not supported: %s", label)
- }
- })
- }
- func AddFieldLabelConversionsForSecret(scheme *runtime.Scheme) error {
- return scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Secret"),
- func(label, value string) (string, string, error) {
- switch label {
- case "type",
- "metadata.namespace",
- "metadata.name":
- return label, value, nil
- default:
- return "", "", fmt.Errorf("field label not supported: %s", label)
- }
- })
- }
- var initContainerAnnotations = map[string]bool{
- "pod.beta.kubernetes.io/init-containers": true,
- "pod.alpha.kubernetes.io/init-containers": true,
- "pod.beta.kubernetes.io/init-container-statuses": true,
- "pod.alpha.kubernetes.io/init-container-statuses": true,
- }
- // dropInitContainerAnnotations returns a copy of the annotations with init container annotations removed,
- // or the original annotations if no init container annotations were present.
- //
- // this can be removed once no clients prior to 1.8 are supported, and no kubelets prior to 1.8 can be run
- // (we don't support kubelets older than 2 versions skewed from the apiserver, but we don't prevent them, either)
- func dropInitContainerAnnotations(oldAnnotations map[string]string) map[string]string {
- if len(oldAnnotations) == 0 {
- return oldAnnotations
- }
- found := false
- for k := range initContainerAnnotations {
- if _, ok := oldAnnotations[k]; ok {
- found = true
- break
- }
- }
- if !found {
- return oldAnnotations
- }
- newAnnotations := make(map[string]string, len(oldAnnotations))
- for k, v := range oldAnnotations {
- if !initContainerAnnotations[k] {
- newAnnotations[k] = v
- }
- }
- return newAnnotations
- }
- // Convert_core_LoadBalancerStatus_To_v1_LoadBalancerStatus is defined outside the autogenerated file for use by other API packages
- func Convert_core_LoadBalancerStatus_To_v1_LoadBalancerStatus(in *core.LoadBalancerStatus, out *v1.LoadBalancerStatus, s conversion.Scope) error {
- return autoConvert_core_LoadBalancerStatus_To_v1_LoadBalancerStatus(in, out, s)
- }
- // Convert_v1_LoadBalancerStatus_To_core_LoadBalancerStatus is defined outside the autogenerated file for use by other API packages
- func Convert_v1_LoadBalancerStatus_To_core_LoadBalancerStatus(in *v1.LoadBalancerStatus, out *core.LoadBalancerStatus, s conversion.Scope) error {
- return autoConvert_v1_LoadBalancerStatus_To_core_LoadBalancerStatus(in, out, s)
- }
- // Convert_core_Volume_To_v1_Volume is defined outside the autogenerated file for use by other API packages
- func Convert_core_Volume_To_v1_Volume(in *core.Volume, out *v1.Volume, s conversion.Scope) error {
- return autoConvert_core_Volume_To_v1_Volume(in, out, s)
- }
- // Convert_v1_Volume_To_core_Volume is defined outside the autogenerated file for use by other API packages
- func Convert_v1_Volume_To_core_Volume(in *v1.Volume, out *core.Volume, s conversion.Scope) error {
- return autoConvert_v1_Volume_To_core_Volume(in, out, s)
- }
- // Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec is defined outside the autogenerated file for use by other API packages
- func Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(in *core.PersistentVolumeSpec, out *v1.PersistentVolumeSpec, s conversion.Scope) error {
- return autoConvert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(in, out, s)
- }
- // Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec is defined outside the autogenerated file for use by other API packages
- func Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(in *v1.PersistentVolumeSpec, out *core.PersistentVolumeSpec, s conversion.Scope) error {
- return autoConvert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(in, out, s)
- }
|