mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-11-03 23:40:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			543 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			543 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
/*
 | 
						|
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 and differ, then PodIP is authoritative for compatibility with older kubelets
 | 
						|
	if (len(in.PodIP) > 0 && len(in.PodIPs) > 0) && (in.PodIP != in.PodIPs[0].IP) {
 | 
						|
		out.PodIPs = []core.PodIP{
 | 
						|
			{
 | 
						|
				IP: in.PodIP,
 | 
						|
			},
 | 
						|
		}
 | 
						|
	}
 | 
						|
	// 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 and differ, then PodCIDR is authoritative for compatibility with older clients
 | 
						|
	if (len(in.PodCIDR) > 0 && len(in.PodCIDRs) > 0) && (in.PodCIDR != in.PodCIDRs[0]) {
 | 
						|
		out.PodCIDRs = []string{in.PodCIDR}
 | 
						|
	}
 | 
						|
 | 
						|
	// 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",
 | 
						|
				"reportingComponent",
 | 
						|
				"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)
 | 
						|
}
 |