summaryrefslogtreecommitdiff
path: root/vendor/k8s.io/kubernetes/pkg/apis/core
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/k8s.io/kubernetes/pkg/apis/core')
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/annotation_key_constants.go92
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/doc.go24
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/field_constants.go38
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/helper/helpers.go597
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/install/install.go67
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/json.go28
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/objectreference.go34
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/pods/helpers.go63
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/register.go99
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/resource.go62
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/taint.go36
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/toleration.go30
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/types.go4656
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/v1/conversion.go619
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/v1/defaults.go413
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/v1/doc.go23
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/helpers.go450
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/v1/register.go46
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go5686
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.defaults.go638
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/validation/doc.go19
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/validation/events.go129
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go5066
-rw-r--r--vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go5952
24 files changed, 24867 insertions, 0 deletions
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/annotation_key_constants.go b/vendor/k8s.io/kubernetes/pkg/apis/core/annotation_key_constants.go
new file mode 100644
index 000000000..131fdd990
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/annotation_key_constants.go
@@ -0,0 +1,92 @@
+/*
+Copyright 2017 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.
+*/
+
+// This file should be consistent with pkg/api/v1/annotation_key_constants.go.
+
+package core
+
+const (
+ // ImagePolicyFailedOpenKey is added to pods created by failing open when the image policy
+ // webhook backend fails.
+ ImagePolicyFailedOpenKey string = "alpha.image-policy.k8s.io/failed-open"
+
+ // PodPresetOptOutAnnotationKey represents the annotation key for a pod to exempt itself from pod preset manipulation
+ PodPresetOptOutAnnotationKey string = "podpreset.admission.kubernetes.io/exclude"
+
+ // MirrorAnnotationKey represents the annotation key set by kubelets when creating mirror pods
+ MirrorPodAnnotationKey string = "kubernetes.io/config.mirror"
+
+ // TolerationsAnnotationKey represents the key of tolerations data (json serialized)
+ // in the Annotations of a Pod.
+ TolerationsAnnotationKey string = "scheduler.alpha.kubernetes.io/tolerations"
+
+ // TaintsAnnotationKey represents the key of taints data (json serialized)
+ // in the Annotations of a Node.
+ TaintsAnnotationKey string = "scheduler.alpha.kubernetes.io/taints"
+
+ // SeccompPodAnnotationKey represents the key of a seccomp profile applied
+ // to all containers of a pod.
+ SeccompPodAnnotationKey string = "seccomp.security.alpha.kubernetes.io/pod"
+
+ // SeccompContainerAnnotationKeyPrefix represents the key of a seccomp profile applied
+ // to one container of a pod.
+ SeccompContainerAnnotationKeyPrefix string = "container.seccomp.security.alpha.kubernetes.io/"
+
+ // PreferAvoidPodsAnnotationKey represents the key of preferAvoidPods data (json serialized)
+ // in the Annotations of a Node.
+ PreferAvoidPodsAnnotationKey string = "scheduler.alpha.kubernetes.io/preferAvoidPods"
+
+ // SysctlsPodAnnotationKey represents the key of sysctls which are set for the infrastructure
+ // container of a pod. The annotation value is a comma separated list of sysctl_name=value
+ // key-value pairs. Only a limited set of whitelisted and isolated sysctls is supported by
+ // the kubelet. Pods with other sysctls will fail to launch.
+ SysctlsPodAnnotationKey string = "security.alpha.kubernetes.io/sysctls"
+
+ // UnsafeSysctlsPodAnnotationKey represents the key of sysctls which are set for the infrastructure
+ // container of a pod. The annotation value is a comma separated list of sysctl_name=value
+ // key-value pairs. Unsafe sysctls must be explicitly enabled for a kubelet. They are properly
+ // namespaced to a pod or a container, but their isolation is usually unclear or weak. Their use
+ // is at-your-own-risk. Pods that attempt to set an unsafe sysctl that is not enabled for a kubelet
+ // will fail to launch.
+ UnsafeSysctlsPodAnnotationKey string = "security.alpha.kubernetes.io/unsafe-sysctls"
+
+ // ObjectTTLAnnotations represents a suggestion for kubelet for how long it can cache
+ // an object (e.g. secret, config map) before fetching it again from apiserver.
+ // This annotation can be attached to node.
+ ObjectTTLAnnotationKey string = "node.alpha.kubernetes.io/ttl"
+
+ // BootstrapCheckpointAnnotationKey represents a Resource (Pod) that should be checkpointed by
+ // the kubelet prior to running
+ BootstrapCheckpointAnnotationKey string = "node.kubernetes.io/bootstrap-checkpoint"
+
+ // annotation key prefix used to identify non-convertible json paths.
+ NonConvertibleAnnotationPrefix = "non-convertible.kubernetes.io"
+
+ kubectlPrefix = "kubectl.kubernetes.io/"
+
+ // LastAppliedConfigAnnotation is the annotation used to store the previous
+ // configuration of a resource for use in a three way diff by UpdateApplyAnnotation.
+ LastAppliedConfigAnnotation = kubectlPrefix + "last-applied-configuration"
+
+ // AnnotationLoadBalancerSourceRangesKey is the key of the annotation on a service to set allowed ingress ranges on their LoadBalancers
+ //
+ // It should be a comma-separated list of CIDRs, e.g. `0.0.0.0/0` to
+ // allow full access (the default) or `18.0.0.0/8,56.0.0.0/8` to allow
+ // access only from the CIDRs currently allocated to MIT & the USPS.
+ //
+ // Not all cloud providers support this annotation, though AWS & GCE do.
+ AnnotationLoadBalancerSourceRangesKey = "service.beta.kubernetes.io/load-balancer-source-ranges"
+)
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/doc.go b/vendor/k8s.io/kubernetes/pkg/apis/core/doc.go
new file mode 100644
index 000000000..6017bfdab
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/doc.go
@@ -0,0 +1,24 @@
+/*
+Copyright 2014 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.
+*/
+
+// +k8s:deepcopy-gen=package
+
+// Package api contains the latest (or "internal") version of the
+// Kubernetes API objects. This is the API objects as represented in memory.
+// The contract presented to clients is located in the versioned packages,
+// which are sub-directories. The first one is "v1". Those packages
+// describe how a particular version is serialized to storage/network.
+package core // import "k8s.io/kubernetes/pkg/apis/core"
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/field_constants.go b/vendor/k8s.io/kubernetes/pkg/apis/core/field_constants.go
new file mode 100644
index 000000000..a26f80568
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/field_constants.go
@@ -0,0 +1,38 @@
+/*
+Copyright 2016 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 core
+
+// Field path constants that are specific to the internal API
+// representation.
+const (
+ NodeUnschedulableField = "spec.unschedulable"
+ ObjectNameField = "metadata.name"
+ PodHostField = "spec.nodeName"
+ PodStatusField = "status.phase"
+ SecretTypeField = "type"
+
+ EventReasonField = "action"
+ EventSourceField = "reportingComponent"
+ EventTypeField = "type"
+ EventInvolvedKindField = "involvedObject.kind"
+ EventInvolvedNamespaceField = "involvedObject.namespace"
+ EventInvolvedNameField = "involvedObject.name"
+ EventInvolvedUIDField = "involvedObject.uid"
+ EventInvolvedAPIVersionField = "involvedObject.apiVersion"
+ EventInvolvedResourceVersionField = "involvedObject.resourceVersion"
+ EventInvolvedFieldPathField = "involvedObject.fieldPath"
+)
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/helper/helpers.go b/vendor/k8s.io/kubernetes/pkg/apis/core/helper/helpers.go
new file mode 100644
index 000000000..96899f184
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/helper/helpers.go
@@ -0,0 +1,597 @@
+/*
+Copyright 2014 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 helper
+
+import (
+ "encoding/json"
+ "fmt"
+ "strings"
+
+ "k8s.io/apimachinery/pkg/api/resource"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/conversion"
+ "k8s.io/apimachinery/pkg/fields"
+ "k8s.io/apimachinery/pkg/labels"
+ "k8s.io/apimachinery/pkg/selection"
+ "k8s.io/apimachinery/pkg/util/sets"
+ "k8s.io/apimachinery/pkg/util/validation"
+ "k8s.io/kubernetes/pkg/apis/core"
+)
+
+// IsHugePageResourceName returns true if the resource name has the huge page
+// resource prefix.
+func IsHugePageResourceName(name core.ResourceName) bool {
+ return strings.HasPrefix(string(name), core.ResourceHugePagesPrefix)
+}
+
+// IsQuotaHugePageResourceName returns true if the resource name has the quota
+// related huge page resource prefix.
+func IsQuotaHugePageResourceName(name core.ResourceName) bool {
+ return strings.HasPrefix(string(name), core.ResourceHugePagesPrefix) || strings.HasPrefix(string(name), core.ResourceRequestsHugePagesPrefix)
+}
+
+// HugePageResourceName returns a ResourceName with the canonical hugepage
+// prefix prepended for the specified page size. The page size is converted
+// to its canonical representation.
+func HugePageResourceName(pageSize resource.Quantity) core.ResourceName {
+ return core.ResourceName(fmt.Sprintf("%s%s", core.ResourceHugePagesPrefix, pageSize.String()))
+}
+
+// HugePageSizeFromResourceName returns the page size for the specified huge page
+// resource name. If the specified input is not a valid huge page resource name
+// an error is returned.
+func HugePageSizeFromResourceName(name core.ResourceName) (resource.Quantity, error) {
+ if !IsHugePageResourceName(name) {
+ return resource.Quantity{}, fmt.Errorf("resource name: %s is not valid hugepage name", name)
+ }
+ pageSize := strings.TrimPrefix(string(name), core.ResourceHugePagesPrefix)
+ return resource.ParseQuantity(pageSize)
+}
+
+// NonConvertibleFields iterates over the provided map and filters out all but
+// any keys with the "non-convertible.kubernetes.io" prefix.
+func NonConvertibleFields(annotations map[string]string) map[string]string {
+ nonConvertibleKeys := map[string]string{}
+ for key, value := range annotations {
+ if strings.HasPrefix(key, core.NonConvertibleAnnotationPrefix) {
+ nonConvertibleKeys[key] = value
+ }
+ }
+ return nonConvertibleKeys
+}
+
+// Semantic can do semantic deep equality checks for core objects.
+// Example: apiequality.Semantic.DeepEqual(aPod, aPodWithNonNilButEmptyMaps) == true
+var Semantic = conversion.EqualitiesOrDie(
+ func(a, b resource.Quantity) bool {
+ // Ignore formatting, only care that numeric value stayed the same.
+ // TODO: if we decide it's important, it should be safe to start comparing the format.
+ //
+ // Uninitialized quantities are equivalent to 0 quantities.
+ return a.Cmp(b) == 0
+ },
+ func(a, b metav1.MicroTime) bool {
+ return a.UTC() == b.UTC()
+ },
+ func(a, b metav1.Time) bool {
+ return a.UTC() == b.UTC()
+ },
+ func(a, b labels.Selector) bool {
+ return a.String() == b.String()
+ },
+ func(a, b fields.Selector) bool {
+ return a.String() == b.String()
+ },
+)
+
+var standardResourceQuotaScopes = sets.NewString(
+ string(core.ResourceQuotaScopeTerminating),
+ string(core.ResourceQuotaScopeNotTerminating),
+ string(core.ResourceQuotaScopeBestEffort),
+ string(core.ResourceQuotaScopeNotBestEffort),
+)
+
+// IsStandardResourceQuotaScope returns true if the scope is a standard value
+func IsStandardResourceQuotaScope(str string) bool {
+ return standardResourceQuotaScopes.Has(str)
+}
+
+var podObjectCountQuotaResources = sets.NewString(
+ string(core.ResourcePods),
+)
+
+var podComputeQuotaResources = sets.NewString(
+ string(core.ResourceCPU),
+ string(core.ResourceMemory),
+ string(core.ResourceLimitsCPU),
+ string(core.ResourceLimitsMemory),
+ string(core.ResourceRequestsCPU),
+ string(core.ResourceRequestsMemory),
+)
+
+// IsResourceQuotaScopeValidForResource returns true if the resource applies to the specified scope
+func IsResourceQuotaScopeValidForResource(scope core.ResourceQuotaScope, resource string) bool {
+ switch scope {
+ case core.ResourceQuotaScopeTerminating, core.ResourceQuotaScopeNotTerminating, core.ResourceQuotaScopeNotBestEffort:
+ return podObjectCountQuotaResources.Has(resource) || podComputeQuotaResources.Has(resource)
+ case core.ResourceQuotaScopeBestEffort:
+ return podObjectCountQuotaResources.Has(resource)
+ default:
+ return true
+ }
+}
+
+var standardContainerResources = sets.NewString(
+ string(core.ResourceCPU),
+ string(core.ResourceMemory),
+ string(core.ResourceEphemeralStorage),
+)
+
+// IsStandardContainerResourceName returns true if the container can make a resource request
+// for the specified resource
+func IsStandardContainerResourceName(str string) bool {
+ return standardContainerResources.Has(str) || IsHugePageResourceName(core.ResourceName(str))
+}
+
+// IsExtendedResourceName returns true if:
+// 1. the resource name is not in the default namespace;
+// 2. resource name does not have "requests." prefix,
+// to avoid confusion with the convention in quota
+// 3. it satisfies the rules in IsQualifiedName() after converted into quota resource name
+func IsExtendedResourceName(name core.ResourceName) bool {
+ if IsDefaultNamespaceResource(name) || strings.HasPrefix(string(name), core.DefaultResourceRequestsPrefix) {
+ return false
+ }
+ // Ensure it satisfies the rules in IsQualifiedName() after converted into quota resource name
+ nameForQuota := fmt.Sprintf("%s%s", core.DefaultResourceRequestsPrefix, string(name))
+ if errs := validation.IsQualifiedName(string(nameForQuota)); len(errs) != 0 {
+ return false
+ }
+ return true
+}
+
+// IsDefaultNamespaceResource returns true if the resource name is in the
+// *kubernetes.io/ namespace. Partially-qualified (unprefixed) names are
+// implicitly in the kubernetes.io/ namespace.
+func IsDefaultNamespaceResource(name core.ResourceName) bool {
+ return !strings.Contains(string(name), "/") ||
+ strings.Contains(string(name), core.ResourceDefaultNamespacePrefix)
+}
+
+var overcommitBlacklist = sets.NewString(string(core.ResourceNvidiaGPU))
+
+// IsOvercommitAllowed returns true if the resource is in the default
+// namespace and not blacklisted.
+func IsOvercommitAllowed(name core.ResourceName) bool {
+ return IsDefaultNamespaceResource(name) &&
+ !IsHugePageResourceName(name) &&
+ !overcommitBlacklist.Has(string(name))
+}
+
+var standardLimitRangeTypes = sets.NewString(
+ string(core.LimitTypePod),
+ string(core.LimitTypeContainer),
+ string(core.LimitTypePersistentVolumeClaim),
+)
+
+// IsStandardLimitRangeType returns true if the type is Pod or Container
+func IsStandardLimitRangeType(str string) bool {
+ return standardLimitRangeTypes.Has(str)
+}
+
+var standardQuotaResources = sets.NewString(
+ string(core.ResourceCPU),
+ string(core.ResourceMemory),
+ string(core.ResourceEphemeralStorage),
+ string(core.ResourceRequestsCPU),
+ string(core.ResourceRequestsMemory),
+ string(core.ResourceRequestsStorage),
+ string(core.ResourceRequestsEphemeralStorage),
+ string(core.ResourceLimitsCPU),
+ string(core.ResourceLimitsMemory),
+ string(core.ResourceLimitsEphemeralStorage),
+ string(core.ResourcePods),
+ string(core.ResourceQuotas),
+ string(core.ResourceServices),
+ string(core.ResourceReplicationControllers),
+ string(core.ResourceSecrets),
+ string(core.ResourcePersistentVolumeClaims),
+ string(core.ResourceConfigMaps),
+ string(core.ResourceServicesNodePorts),
+ string(core.ResourceServicesLoadBalancers),
+)
+
+// IsStandardQuotaResourceName returns true if the resource is known to
+// the quota tracking system
+func IsStandardQuotaResourceName(str string) bool {
+ return standardQuotaResources.Has(str) || IsQuotaHugePageResourceName(core.ResourceName(str))
+}
+
+var standardResources = sets.NewString(
+ string(core.ResourceCPU),
+ string(core.ResourceMemory),
+ string(core.ResourceEphemeralStorage),
+ string(core.ResourceRequestsCPU),
+ string(core.ResourceRequestsMemory),
+ string(core.ResourceRequestsEphemeralStorage),
+ string(core.ResourceLimitsCPU),
+ string(core.ResourceLimitsMemory),
+ string(core.ResourceLimitsEphemeralStorage),
+ string(core.ResourcePods),
+ string(core.ResourceQuotas),
+ string(core.ResourceServices),
+ string(core.ResourceReplicationControllers),
+ string(core.ResourceSecrets),
+ string(core.ResourceConfigMaps),
+ string(core.ResourcePersistentVolumeClaims),
+ string(core.ResourceStorage),
+ string(core.ResourceRequestsStorage),
+ string(core.ResourceServicesNodePorts),
+ string(core.ResourceServicesLoadBalancers),
+)
+
+// IsStandardResourceName returns true if the resource is known to the system
+func IsStandardResourceName(str string) bool {
+ return standardResources.Has(str) || IsQuotaHugePageResourceName(core.ResourceName(str))
+}
+
+var integerResources = sets.NewString(
+ string(core.ResourcePods),
+ string(core.ResourceQuotas),
+ string(core.ResourceServices),
+ string(core.ResourceReplicationControllers),
+ string(core.ResourceSecrets),
+ string(core.ResourceConfigMaps),
+ string(core.ResourcePersistentVolumeClaims),
+ string(core.ResourceServicesNodePorts),
+ string(core.ResourceServicesLoadBalancers),
+)
+
+// IsIntegerResourceName returns true if the resource is measured in integer values
+func IsIntegerResourceName(str string) bool {
+ return integerResources.Has(str) || IsExtendedResourceName(core.ResourceName(str))
+}
+
+// this function aims to check if the service's ClusterIP is set or not
+// the objective is not to perform validation here
+func IsServiceIPSet(service *core.Service) bool {
+ return service.Spec.ClusterIP != core.ClusterIPNone && service.Spec.ClusterIP != ""
+}
+
+var standardFinalizers = sets.NewString(
+ string(core.FinalizerKubernetes),
+ metav1.FinalizerOrphanDependents,
+ metav1.FinalizerDeleteDependents,
+)
+
+func IsStandardFinalizerName(str string) bool {
+ return standardFinalizers.Has(str)
+}
+
+// AddToNodeAddresses appends the NodeAddresses to the passed-by-pointer slice,
+// only if they do not already exist
+func AddToNodeAddresses(addresses *[]core.NodeAddress, addAddresses ...core.NodeAddress) {
+ for _, add := range addAddresses {
+ exists := false
+ for _, existing := range *addresses {
+ if existing.Address == add.Address && existing.Type == add.Type {
+ exists = true
+ break
+ }
+ }
+ if !exists {
+ *addresses = append(*addresses, add)
+ }
+ }
+}
+
+// TODO: make method on LoadBalancerStatus?
+func LoadBalancerStatusEqual(l, r *core.LoadBalancerStatus) bool {
+ return ingressSliceEqual(l.Ingress, r.Ingress)
+}
+
+func ingressSliceEqual(lhs, rhs []core.LoadBalancerIngress) bool {
+ if len(lhs) != len(rhs) {
+ return false
+ }
+ for i := range lhs {
+ if !ingressEqual(&lhs[i], &rhs[i]) {
+ return false
+ }
+ }
+ return true
+}
+
+func ingressEqual(lhs, rhs *core.LoadBalancerIngress) bool {
+ if lhs.IP != rhs.IP {
+ return false
+ }
+ if lhs.Hostname != rhs.Hostname {
+ return false
+ }
+ return true
+}
+
+// TODO: make method on LoadBalancerStatus?
+func LoadBalancerStatusDeepCopy(lb *core.LoadBalancerStatus) *core.LoadBalancerStatus {
+ c := &core.LoadBalancerStatus{}
+ c.Ingress = make([]core.LoadBalancerIngress, len(lb.Ingress))
+ for i := range lb.Ingress {
+ c.Ingress[i] = lb.Ingress[i]
+ }
+ return c
+}
+
+// GetAccessModesAsString returns a string representation of an array of access modes.
+// modes, when present, are always in the same order: RWO,ROX,RWX.
+func GetAccessModesAsString(modes []core.PersistentVolumeAccessMode) string {
+ modes = removeDuplicateAccessModes(modes)
+ modesStr := []string{}
+ if containsAccessMode(modes, core.ReadWriteOnce) {
+ modesStr = append(modesStr, "RWO")
+ }
+ if containsAccessMode(modes, core.ReadOnlyMany) {
+ modesStr = append(modesStr, "ROX")
+ }
+ if containsAccessMode(modes, core.ReadWriteMany) {
+ modesStr = append(modesStr, "RWX")
+ }
+ return strings.Join(modesStr, ",")
+}
+
+// GetAccessModesAsString returns an array of AccessModes from a string created by GetAccessModesAsString
+func GetAccessModesFromString(modes string) []core.PersistentVolumeAccessMode {
+ strmodes := strings.Split(modes, ",")
+ accessModes := []core.PersistentVolumeAccessMode{}
+ for _, s := range strmodes {
+ s = strings.Trim(s, " ")
+ switch {
+ case s == "RWO":
+ accessModes = append(accessModes, core.ReadWriteOnce)
+ case s == "ROX":
+ accessModes = append(accessModes, core.ReadOnlyMany)
+ case s == "RWX":
+ accessModes = append(accessModes, core.ReadWriteMany)
+ }
+ }
+ return accessModes
+}
+
+// removeDuplicateAccessModes returns an array of access modes without any duplicates
+func removeDuplicateAccessModes(modes []core.PersistentVolumeAccessMode) []core.PersistentVolumeAccessMode {
+ accessModes := []core.PersistentVolumeAccessMode{}
+ for _, m := range modes {
+ if !containsAccessMode(accessModes, m) {
+ accessModes = append(accessModes, m)
+ }
+ }
+ return accessModes
+}
+
+func containsAccessMode(modes []core.PersistentVolumeAccessMode, mode core.PersistentVolumeAccessMode) bool {
+ for _, m := range modes {
+ if m == mode {
+ return true
+ }
+ }
+ return false
+}
+
+// NodeSelectorRequirementsAsSelector converts the []NodeSelectorRequirement core type into a struct that implements
+// labels.Selector.
+func NodeSelectorRequirementsAsSelector(nsm []core.NodeSelectorRequirement) (labels.Selector, error) {
+ if len(nsm) == 0 {
+ return labels.Nothing(), nil
+ }
+ selector := labels.NewSelector()
+ for _, expr := range nsm {
+ var op selection.Operator
+ switch expr.Operator {
+ case core.NodeSelectorOpIn:
+ op = selection.In
+ case core.NodeSelectorOpNotIn:
+ op = selection.NotIn
+ case core.NodeSelectorOpExists:
+ op = selection.Exists
+ case core.NodeSelectorOpDoesNotExist:
+ op = selection.DoesNotExist
+ case core.NodeSelectorOpGt:
+ op = selection.GreaterThan
+ case core.NodeSelectorOpLt:
+ op = selection.LessThan
+ default:
+ return nil, fmt.Errorf("%q is not a valid node selector operator", expr.Operator)
+ }
+ r, err := labels.NewRequirement(expr.Key, op, expr.Values)
+ if err != nil {
+ return nil, err
+ }
+ selector = selector.Add(*r)
+ }
+ return selector, nil
+}
+
+// GetTolerationsFromPodAnnotations gets the json serialized tolerations data from Pod.Annotations
+// and converts it to the []Toleration type in core.
+func GetTolerationsFromPodAnnotations(annotations map[string]string) ([]core.Toleration, error) {
+ var tolerations []core.Toleration
+ if len(annotations) > 0 && annotations[core.TolerationsAnnotationKey] != "" {
+ err := json.Unmarshal([]byte(annotations[core.TolerationsAnnotationKey]), &tolerations)
+ if err != nil {
+ return tolerations, err
+ }
+ }
+ return tolerations, nil
+}
+
+// AddOrUpdateTolerationInPod tries to add a toleration to the pod's toleration list.
+// Returns true if something was updated, false otherwise.
+func AddOrUpdateTolerationInPod(pod *core.Pod, toleration *core.Toleration) bool {
+ podTolerations := pod.Spec.Tolerations
+
+ var newTolerations []core.Toleration
+ updated := false
+ for i := range podTolerations {
+ if toleration.MatchToleration(&podTolerations[i]) {
+ if Semantic.DeepEqual(toleration, podTolerations[i]) {
+ return false
+ }
+ newTolerations = append(newTolerations, *toleration)
+ updated = true
+ continue
+ }
+
+ newTolerations = append(newTolerations, podTolerations[i])
+ }
+
+ if !updated {
+ newTolerations = append(newTolerations, *toleration)
+ }
+
+ pod.Spec.Tolerations = newTolerations
+ return true
+}
+
+// GetTaintsFromNodeAnnotations gets the json serialized taints data from Pod.Annotations
+// and converts it to the []Taint type in core.
+func GetTaintsFromNodeAnnotations(annotations map[string]string) ([]core.Taint, error) {
+ var taints []core.Taint
+ if len(annotations) > 0 && annotations[core.TaintsAnnotationKey] != "" {
+ err := json.Unmarshal([]byte(annotations[core.TaintsAnnotationKey]), &taints)
+ if err != nil {
+ return []core.Taint{}, err
+ }
+ }
+ return taints, nil
+}
+
+// SysctlsFromPodAnnotations parses the sysctl annotations into a slice of safe Sysctls
+// and a slice of unsafe Sysctls. This is only a convenience wrapper around
+// SysctlsFromPodAnnotation.
+func SysctlsFromPodAnnotations(a map[string]string) ([]core.Sysctl, []core.Sysctl, error) {
+ safe, err := SysctlsFromPodAnnotation(a[core.SysctlsPodAnnotationKey])
+ if err != nil {
+ return nil, nil, err
+ }
+ unsafe, err := SysctlsFromPodAnnotation(a[core.UnsafeSysctlsPodAnnotationKey])
+ if err != nil {
+ return nil, nil, err
+ }
+
+ return safe, unsafe, nil
+}
+
+// SysctlsFromPodAnnotation parses an annotation value into a slice of Sysctls.
+func SysctlsFromPodAnnotation(annotation string) ([]core.Sysctl, error) {
+ if len(annotation) == 0 {
+ return nil, nil
+ }
+
+ kvs := strings.Split(annotation, ",")
+ sysctls := make([]core.Sysctl, len(kvs))
+ for i, kv := range kvs {
+ cs := strings.Split(kv, "=")
+ if len(cs) != 2 || len(cs[0]) == 0 {
+ return nil, fmt.Errorf("sysctl %q not of the format sysctl_name=value", kv)
+ }
+ sysctls[i].Name = cs[0]
+ sysctls[i].Value = cs[1]
+ }
+ return sysctls, nil
+}
+
+// PodAnnotationsFromSysctls creates an annotation value for a slice of Sysctls.
+func PodAnnotationsFromSysctls(sysctls []core.Sysctl) string {
+ if len(sysctls) == 0 {
+ return ""
+ }
+
+ kvs := make([]string, len(sysctls))
+ for i := range sysctls {
+ kvs[i] = fmt.Sprintf("%s=%s", sysctls[i].Name, sysctls[i].Value)
+ }
+ return strings.Join(kvs, ",")
+}
+
+// GetPersistentVolumeClass returns StorageClassName.
+func GetPersistentVolumeClass(volume *core.PersistentVolume) string {
+ // Use beta annotation first
+ if class, found := volume.Annotations[core.BetaStorageClassAnnotation]; found {
+ return class
+ }
+
+ return volume.Spec.StorageClassName
+}
+
+// GetPersistentVolumeClaimClass returns StorageClassName. If no storage class was
+// requested, it returns "".
+func GetPersistentVolumeClaimClass(claim *core.PersistentVolumeClaim) string {
+ // Use beta annotation first
+ if class, found := claim.Annotations[core.BetaStorageClassAnnotation]; found {
+ return class
+ }
+
+ if claim.Spec.StorageClassName != nil {
+ return *claim.Spec.StorageClassName
+ }
+
+ return ""
+}
+
+// PersistentVolumeClaimHasClass returns true if given claim has set StorageClassName field.
+func PersistentVolumeClaimHasClass(claim *core.PersistentVolumeClaim) bool {
+ // Use beta annotation first
+ if _, found := claim.Annotations[core.BetaStorageClassAnnotation]; found {
+ return true
+ }
+
+ if claim.Spec.StorageClassName != nil {
+ return true
+ }
+
+ return false
+}
+
+// GetStorageNodeAffinityFromAnnotation gets the json serialized data from PersistentVolume.Annotations
+// and converts it to the NodeAffinity type in core.
+// TODO: update when storage node affinity graduates to beta
+func GetStorageNodeAffinityFromAnnotation(annotations map[string]string) (*core.NodeAffinity, error) {
+ if len(annotations) > 0 && annotations[core.AlphaStorageNodeAffinityAnnotation] != "" {
+ var affinity core.NodeAffinity
+ err := json.Unmarshal([]byte(annotations[core.AlphaStorageNodeAffinityAnnotation]), &affinity)
+ if err != nil {
+ return nil, err
+ }
+ return &affinity, nil
+ }
+ return nil, nil
+}
+
+// Converts NodeAffinity type to Alpha annotation for use in PersistentVolumes
+// TODO: update when storage node affinity graduates to beta
+func StorageNodeAffinityToAlphaAnnotation(annotations map[string]string, affinity *core.NodeAffinity) error {
+ if affinity == nil {
+ return nil
+ }
+
+ json, err := json.Marshal(*affinity)
+ if err != nil {
+ return err
+ }
+ annotations[core.AlphaStorageNodeAffinityAnnotation] = string(json)
+ return nil
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/install/install.go b/vendor/k8s.io/kubernetes/pkg/apis/core/install/install.go
new file mode 100644
index 000000000..cae514ec7
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/install/install.go
@@ -0,0 +1,67 @@
+/*
+Copyright 2014 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 install installs the v1 monolithic api, making it available as an
+// option to all of the API encoding/decoding machinery.
+package install
+
+import (
+ "k8s.io/apimachinery/pkg/apimachinery/announced"
+ "k8s.io/apimachinery/pkg/apimachinery/registered"
+ "k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/util/sets"
+ "k8s.io/kubernetes/pkg/api/legacyscheme"
+ "k8s.io/kubernetes/pkg/apis/core"
+ "k8s.io/kubernetes/pkg/apis/core/v1"
+)
+
+func init() {
+ Install(legacyscheme.GroupFactoryRegistry, legacyscheme.Registry, legacyscheme.Scheme)
+}
+
+// Install registers the API group and adds types to a scheme
+func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) {
+ if err := announced.NewGroupMetaFactory(
+ &announced.GroupMetaFactoryArgs{
+ GroupName: core.GroupName,
+ VersionPreferenceOrder: []string{v1.SchemeGroupVersion.Version},
+ AddInternalObjectsToScheme: core.AddToScheme,
+ RootScopedKinds: sets.NewString(
+ "Node",
+ "Namespace",
+ "PersistentVolume",
+ "ComponentStatus",
+ ),
+ IgnoredKinds: sets.NewString(
+ "ListOptions",
+ "DeleteOptions",
+ "Status",
+ "PodLogOptions",
+ "PodExecOptions",
+ "PodAttachOptions",
+ "PodPortForwardOptions",
+ "PodProxyOptions",
+ "NodeProxyOptions",
+ "ServiceProxyOptions",
+ ),
+ },
+ announced.VersionToSchemeFunc{
+ v1.SchemeGroupVersion.Version: v1.AddToScheme,
+ },
+ ).Announce(groupFactoryRegistry).RegisterAndEnable(registry, scheme); err != nil {
+ panic(err)
+ }
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/json.go b/vendor/k8s.io/kubernetes/pkg/apis/core/json.go
new file mode 100644
index 000000000..937cd056c
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/json.go
@@ -0,0 +1,28 @@
+/*
+Copyright 2017 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 core
+
+import "encoding/json"
+
+// This file implements json marshaling/unmarshaling interfaces on objects that are currently marshaled into annotations
+// to prevent anyone from marshaling these internal structs.
+
+var _ = json.Marshaler(&AvoidPods{})
+var _ = json.Unmarshaler(&AvoidPods{})
+
+func (AvoidPods) MarshalJSON() ([]byte, error) { panic("do not marshal internal struct") }
+func (*AvoidPods) UnmarshalJSON([]byte) error { panic("do not unmarshal to internal struct") }
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/objectreference.go b/vendor/k8s.io/kubernetes/pkg/apis/core/objectreference.go
new file mode 100644
index 000000000..55b27f30b
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/objectreference.go
@@ -0,0 +1,34 @@
+/*
+Copyright 2017 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.
+*/
+
+//TODO: consider making these methods functions, because we don't want helper
+//functions in the k8s.io/api repo.
+
+package core
+
+import (
+ "k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+func (obj *ObjectReference) SetGroupVersionKind(gvk schema.GroupVersionKind) {
+ obj.APIVersion, obj.Kind = gvk.ToAPIVersionAndKind()
+}
+
+func (obj *ObjectReference) GroupVersionKind() schema.GroupVersionKind {
+ return schema.FromAPIVersionAndKind(obj.APIVersion, obj.Kind)
+}
+
+func (obj *ObjectReference) GetObjectKind() schema.ObjectKind { return obj }
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/pods/helpers.go b/vendor/k8s.io/kubernetes/pkg/apis/core/pods/helpers.go
new file mode 100644
index 000000000..cf199cee7
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/pods/helpers.go
@@ -0,0 +1,63 @@
+/*
+Copyright 2017 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 pods
+
+import (
+ "fmt"
+
+ "k8s.io/kubernetes/pkg/fieldpath"
+)
+
+// ConvertDownwardAPIFieldLabel converts the specified downward API field label
+// and its value in the pod of the specified version to the internal version,
+// and returns the converted label and value. This function returns an error if
+// the conversion fails.
+func ConvertDownwardAPIFieldLabel(version, label, value string) (string, string, error) {
+ if version != "v1" {
+ return "", "", fmt.Errorf("unsupported pod version: %s", version)
+ }
+
+ if path, _, ok := fieldpath.SplitMaybeSubscriptedPath(label); ok {
+ switch path {
+ case "metadata.annotations", "metadata.labels":
+ return label, value, nil
+ default:
+ return "", "", fmt.Errorf("field label does not support subscript: %s", label)
+ }
+ }
+
+ switch label {
+ case "metadata.annotations",
+ "metadata.labels",
+ "metadata.name",
+ "metadata.namespace",
+ "metadata.uid",
+ "spec.nodeName",
+ "spec.restartPolicy",
+ "spec.serviceAccountName",
+ "spec.schedulerName",
+ "status.phase",
+ "status.hostIP",
+ "status.podIP":
+ 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)
+ }
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/register.go b/vendor/k8s.io/kubernetes/pkg/apis/core/register.go
new file mode 100644
index 000000000..2784cbe15
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/register.go
@@ -0,0 +1,99 @@
+/*
+Copyright 2014 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 core
+
+import (
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+// GroupName is the group name use in this package
+const GroupName = ""
+
+// SchemeGroupVersion is group version used to register these objects
+var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal}
+
+// Kind takes an unqualified kind and returns a Group qualified GroupKind
+func Kind(kind string) schema.GroupKind {
+ return SchemeGroupVersion.WithKind(kind).GroupKind()
+}
+
+// Resource takes an unqualified resource and returns a Group qualified GroupResource
+func Resource(resource string) schema.GroupResource {
+ return SchemeGroupVersion.WithResource(resource).GroupResource()
+}
+
+var (
+ SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
+ AddToScheme = SchemeBuilder.AddToScheme
+)
+
+func addKnownTypes(scheme *runtime.Scheme) error {
+ if err := scheme.AddIgnoredConversionType(&metav1.TypeMeta{}, &metav1.TypeMeta{}); err != nil {
+ return err
+ }
+ scheme.AddKnownTypes(SchemeGroupVersion,
+ &Pod{},
+ &PodList{},
+ &PodStatusResult{},
+ &PodTemplate{},
+ &PodTemplateList{},
+ &ReplicationControllerList{},
+ &ReplicationController{},
+ &ServiceList{},
+ &Service{},
+ &ServiceProxyOptions{},
+ &NodeList{},
+ &Node{},
+ &NodeConfigSource{},
+ &NodeProxyOptions{},
+ &Endpoints{},
+ &EndpointsList{},
+ &Binding{},
+ &Event{},
+ &EventList{},
+ &List{},
+ &LimitRange{},
+ &LimitRangeList{},
+ &ResourceQuota{},
+ &ResourceQuotaList{},
+ &Namespace{},
+ &NamespaceList{},
+ &ServiceAccount{},
+ &ServiceAccountList{},
+ &Secret{},
+ &SecretList{},
+ &PersistentVolume{},
+ &PersistentVolumeList{},
+ &PersistentVolumeClaim{},
+ &PersistentVolumeClaimList{},
+ &PodAttachOptions{},
+ &PodLogOptions{},
+ &PodExecOptions{},
+ &PodPortForwardOptions{},
+ &PodProxyOptions{},
+ &ComponentStatus{},
+ &ComponentStatusList{},
+ &SerializedReference{},
+ &RangeAllocation{},
+ &ConfigMap{},
+ &ConfigMapList{},
+ )
+
+ return nil
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/resource.go b/vendor/k8s.io/kubernetes/pkg/apis/core/resource.go
new file mode 100644
index 000000000..1910cd921
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/resource.go
@@ -0,0 +1,62 @@
+/*
+Copyright 2017 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 core
+
+import (
+ "k8s.io/apimachinery/pkg/api/resource"
+)
+
+func (self ResourceName) String() string {
+ return string(self)
+}
+
+// Returns the CPU limit if specified.
+func (self *ResourceList) Cpu() *resource.Quantity {
+ if val, ok := (*self)[ResourceCPU]; ok {
+ return &val
+ }
+ return &resource.Quantity{Format: resource.DecimalSI}
+}
+
+// Returns the Memory limit if specified.
+func (self *ResourceList) Memory() *resource.Quantity {
+ if val, ok := (*self)[ResourceMemory]; ok {
+ return &val
+ }
+ return &resource.Quantity{Format: resource.BinarySI}
+}
+
+func (self *ResourceList) Pods() *resource.Quantity {
+ if val, ok := (*self)[ResourcePods]; ok {
+ return &val
+ }
+ return &resource.Quantity{}
+}
+
+func (self *ResourceList) NvidiaGPU() *resource.Quantity {
+ if val, ok := (*self)[ResourceNvidiaGPU]; ok {
+ return &val
+ }
+ return &resource.Quantity{}
+}
+
+func (self *ResourceList) StorageEphemeral() *resource.Quantity {
+ if val, ok := (*self)[ResourceEphemeralStorage]; ok {
+ return &val
+ }
+ return &resource.Quantity{}
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/taint.go b/vendor/k8s.io/kubernetes/pkg/apis/core/taint.go
new file mode 100644
index 000000000..ae1feb74d
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/taint.go
@@ -0,0 +1,36 @@
+/*
+Copyright 2017 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.
+*/
+
+//TODO: consider making these methods functions, because we don't want helper
+//functions in the k8s.io/api repo.
+
+package core
+
+import "fmt"
+
+// MatchTaint checks if the taint matches taintToMatch. Taints are unique by key:effect,
+// if the two taints have same key:effect, regard as they match.
+func (t *Taint) MatchTaint(taintToMatch Taint) bool {
+ return t.Key == taintToMatch.Key && t.Effect == taintToMatch.Effect
+}
+
+// taint.ToString() converts taint struct to string in format key=value:effect or key:effect.
+func (t *Taint) ToString() string {
+ if len(t.Value) == 0 {
+ return fmt.Sprintf("%v:%v", t.Key, t.Effect)
+ }
+ return fmt.Sprintf("%v=%v:%v", t.Key, t.Value, t.Effect)
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/toleration.go b/vendor/k8s.io/kubernetes/pkg/apis/core/toleration.go
new file mode 100644
index 000000000..1dfbc9f1b
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/toleration.go
@@ -0,0 +1,30 @@
+/*
+Copyright 2017 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.
+*/
+
+//TODO: consider making these methods functions, because we don't want helper
+//functions in the k8s.io/api repo.
+
+package core
+
+// MatchToleration checks if the toleration matches tolerationToMatch. Tolerations are unique by <key,effect,operator,value>,
+// if the two tolerations have same <key,effect,operator,value> combination, regard as they match.
+// TODO: uniqueness check for tolerations in api validations.
+func (t *Toleration) MatchToleration(tolerationToMatch *Toleration) bool {
+ return t.Key == tolerationToMatch.Key &&
+ t.Effect == tolerationToMatch.Effect &&
+ t.Operator == tolerationToMatch.Operator &&
+ t.Value == tolerationToMatch.Value
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/types.go b/vendor/k8s.io/kubernetes/pkg/apis/core/types.go
new file mode 100644
index 000000000..a112791b1
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/types.go
@@ -0,0 +1,4656 @@
+/*
+Copyright 2014 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 core
+
+import (
+ "k8s.io/apimachinery/pkg/api/resource"
+ metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/fields"
+ "k8s.io/apimachinery/pkg/labels"
+ "k8s.io/apimachinery/pkg/types"
+ "k8s.io/apimachinery/pkg/util/intstr"
+)
+
+// Common string formats
+// ---------------------
+// Many fields in this API have formatting requirements. The commonly used
+// formats are defined here.
+//
+// C_IDENTIFIER: This is a string that conforms to the definition of an "identifier"
+// in the C language. This is captured by the following regex:
+// [A-Za-z_][A-Za-z0-9_]*
+// This defines the format, but not the length restriction, which should be
+// specified at the definition of any field of this type.
+//
+// DNS_LABEL: This is a string, no more than 63 characters long, that conforms
+// to the definition of a "label" in RFCs 1035 and 1123. This is captured
+// by the following regex:
+// [a-z0-9]([-a-z0-9]*[a-z0-9])?
+//
+// DNS_SUBDOMAIN: This is a string, no more than 253 characters long, that conforms
+// to the definition of a "subdomain" in RFCs 1035 and 1123. This is captured
+// by the following regex:
+// [a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*
+// or more simply:
+// DNS_LABEL(\.DNS_LABEL)*
+//
+// IANA_SVC_NAME: This is a string, no more than 15 characters long, that
+// conforms to the definition of IANA service name in RFC 6335.
+// It must contains at least one letter [a-z] and it must contains only [a-z0-9-].
+// Hypens ('-') cannot be leading or trailing character of the string
+// and cannot be adjacent to other hyphens.
+
+// ObjectMeta is metadata that all persisted resources must have, which includes all objects
+// users must create.
+// DEPRECATED: Use k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta instead - this type will be removed soon.
+type ObjectMeta struct {
+ // Name is unique within a namespace. Name is required when creating resources, although
+ // some resources may allow a client to request the generation of an appropriate name
+ // automatically. Name is primarily intended for creation idempotence and configuration
+ // definition.
+ // +optional
+ Name string
+
+ // GenerateName indicates that the name should be made unique by the server prior to persisting
+ // it. A non-empty value for the field indicates the name will be made unique (and the name
+ // returned to the client will be different than the name passed). The value of this field will
+ // be combined with a unique suffix on the server if the Name field has not been provided.
+ // The provided value must be valid within the rules for Name, and may be truncated by the length
+ // of the suffix required to make the value unique on the server.
+ //
+ // If this field is specified, and Name is not present, the server will NOT return a 409 if the
+ // generated name exists - instead, it will either return 201 Created or 500 with Reason
+ // ServerTimeout indicating a unique name could not be found in the time allotted, and the client
+ // should retry (optionally after the time indicated in the Retry-After header).
+ // +optional
+ GenerateName string
+
+ // Namespace defines the space within which name must be unique. An empty namespace is
+ // equivalent to the "default" namespace, but "default" is the canonical representation.
+ // Not all objects are required to be scoped to a namespace - the value of this field for
+ // those objects will be empty.
+ // +optional
+ Namespace string
+
+ // SelfLink is a URL representing this object.
+ // +optional
+ SelfLink string
+
+ // UID is the unique in time and space value for this object. It is typically generated by
+ // the server on successful creation of a resource and is not allowed to change on PUT
+ // operations.
+ // +optional
+ UID types.UID
+
+ // An opaque value that represents the version of this resource. May be used for optimistic
+ // concurrency, change detection, and the watch operation on a resource or set of resources.
+ // Clients must treat these values as opaque and values may only be valid for a particular
+ // resource or set of resources. Only servers will generate resource versions.
+ // +optional
+ ResourceVersion string
+
+ // A sequence number representing a specific generation of the desired state.
+ // Populated by the system. Read-only.
+ // +optional
+ Generation int64
+
+ // CreationTimestamp is a timestamp representing the server time when this object was
+ // created. It is not guaranteed to be set in happens-before order across separate operations.
+ // Clients may not set this value. It is represented in RFC3339 form and is in UTC.
+ // +optional
+ CreationTimestamp metav1.Time
+
+ // DeletionTimestamp is RFC 3339 date and time at which this resource will be deleted. This
+ // field is set by the server when a graceful deletion is requested by the user, and is not
+ // directly settable by a client. The resource is expected to be deleted (no longer visible
+ // from resource lists, and not reachable by name) after the time in this field. Once set,
+ // this value may not be unset or be set further into the future, although it may be shortened
+ // or the resource may be deleted prior to this time. For example, a user may request that
+ // a pod is deleted in 30 seconds. The Kubelet will react by sending a graceful termination
+ // signal to the containers in the pod. After that 30 seconds, the Kubelet will send a hard
+ // termination signal (SIGKILL) to the container and after cleanup, remove the pod from the
+ // API. In the presence of network partitions, this object may still exist after this
+ // timestamp, until an administrator or automated process can determine the resource is
+ // fully terminated.
+ // If not set, graceful deletion of the object has not been requested.
+ //
+ // Populated by the system when a graceful deletion is requested.
+ // Read-only.
+ // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
+ // +optional
+ DeletionTimestamp *metav1.Time
+
+ // DeletionGracePeriodSeconds records the graceful deletion value set when graceful deletion
+ // was requested. Represents the most recent grace period, and may only be shortened once set.
+ // +optional
+ DeletionGracePeriodSeconds *int64
+
+ // Labels are key value pairs that may be used to scope and select individual resources.
+ // Label keys are of the form:
+ // label-key ::= prefixed-name | name
+ // prefixed-name ::= prefix '/' name
+ // prefix ::= DNS_SUBDOMAIN
+ // name ::= DNS_LABEL
+ // The prefix is optional. If the prefix is not specified, the key is assumed to be private
+ // to the user. Other system components that wish to use labels must specify a prefix. The
+ // "kubernetes.io/" prefix is reserved for use by kubernetes components.
+ // +optional
+ Labels map[string]string
+
+ // Annotations are unstructured key value data stored with a resource that may be set by
+ // external tooling. They are not queryable and should be preserved when modifying
+ // objects. Annotation keys have the same formatting restrictions as Label keys. See the
+ // comments on Labels for details.
+ // +optional
+ Annotations map[string]string
+
+ // List of objects depended by this object. If ALL objects in the list have
+ // been deleted, this object will be garbage collected. If this object is managed by a controller,
+ // then an entry in this list will point to this controller, with the controller field set to true.
+ // There cannot be more than one managing controller.
+ // +optional
+ OwnerReferences []metav1.OwnerReference
+
+ // An initializer is a controller which enforces some system invariant at object creation time.
+ // This field is a list of initializers that have not yet acted on this object. If nil or empty,
+ // this object has been completely initialized. Otherwise, the object is considered uninitialized
+ // and is hidden (in list/watch and get calls) from clients that haven't explicitly asked to
+ // observe uninitialized objects.
+ //
+ // When an object is created, the system will populate this list with the current set of initializers.
+ // Only privileged users may set or modify this list. Once it is empty, it may not be modified further
+ // by any user.
+ Initializers *metav1.Initializers
+
+ // Must be empty before the object is deleted from the registry. Each entry
+ // is an identifier for the responsible component that will remove the entry
+ // from the list. If the deletionTimestamp of the object is non-nil, entries
+ // in this list can only be removed.
+ // +optional
+ Finalizers []string
+
+ // The name of the cluster which the object belongs to.
+ // This is used to distinguish resources with same name and namespace in different clusters.
+ // This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.
+ // +optional
+ ClusterName string
+}
+
+const (
+ // NamespaceDefault means the object is in the default namespace which is applied when not specified by clients
+ NamespaceDefault string = "default"
+ // NamespaceAll is the default argument to specify on a context when you want to list or filter resources across all namespaces
+ NamespaceAll string = ""
+ // NamespaceNone is the argument for a context when there is no namespace.
+ NamespaceNone string = ""
+ // NamespaceSystem is the system namespace where we place system components.
+ NamespaceSystem string = "kube-system"
+ // NamespacePublic is the namespace where we place public info (ConfigMaps)
+ NamespacePublic string = "kube-public"
+ // TerminationMessagePathDefault means the default path to capture the application termination message running in a container
+ TerminationMessagePathDefault string = "/dev/termination-log"
+)
+
+// Volume represents a named volume in a pod that may be accessed by any containers in the pod.
+type Volume struct {
+ // Required: This must be a DNS_LABEL. Each volume in a pod must have
+ // a unique name.
+ Name string
+ // The VolumeSource represents the location and type of a volume to mount.
+ // This is optional for now. If not specified, the Volume is implied to be an EmptyDir.
+ // This implied behavior is deprecated and will be removed in a future version.
+ // +optional
+ VolumeSource
+}
+
+// VolumeSource represents the source location of a volume to mount.
+// Only one of its members may be specified.
+type VolumeSource struct {
+ // HostPath represents file or directory on the host machine that is
+ // directly exposed to the container. This is generally used for system
+ // agents or other privileged things that are allowed to see the host
+ // machine. Most containers will NOT need this.
+ // ---
+ // TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not
+ // mount host directories as read/write.
+ // +optional
+ HostPath *HostPathVolumeSource
+ // EmptyDir represents a temporary directory that shares a pod's lifetime.
+ // +optional
+ EmptyDir *EmptyDirVolumeSource
+ // GCEPersistentDisk represents a GCE Disk resource that is attached to a
+ // kubelet's host machine and then exposed to the pod.
+ // +optional
+ GCEPersistentDisk *GCEPersistentDiskVolumeSource
+ // AWSElasticBlockStore represents an AWS EBS disk that is attached to a
+ // kubelet's host machine and then exposed to the pod.
+ // +optional
+ AWSElasticBlockStore *AWSElasticBlockStoreVolumeSource
+ // GitRepo represents a git repository at a particular revision.
+ // +optional
+ GitRepo *GitRepoVolumeSource
+ // Secret represents a secret that should populate this volume.
+ // +optional
+ Secret *SecretVolumeSource
+ // NFS represents an NFS mount on the host that shares a pod's lifetime
+ // +optional
+ NFS *NFSVolumeSource
+ // ISCSIVolumeSource represents an ISCSI Disk resource that is attached to a
+ // kubelet's host machine and then exposed to the pod.
+ // +optional
+ ISCSI *ISCSIVolumeSource
+ // Glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime
+ // +optional
+ Glusterfs *GlusterfsVolumeSource
+ // PersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace
+ // +optional
+ PersistentVolumeClaim *PersistentVolumeClaimVolumeSource
+ // RBD represents a Rados Block Device mount on the host that shares a pod's lifetime
+ // +optional
+ RBD *RBDVolumeSource
+
+ // Quobyte represents a Quobyte mount on the host that shares a pod's lifetime
+ // +optional
+ Quobyte *QuobyteVolumeSource
+
+ // FlexVolume represents a generic volume resource that is
+ // provisioned/attached using an exec based plugin.
+ // +optional
+ FlexVolume *FlexVolumeSource
+
+ // Cinder represents a cinder volume attached and mounted on kubelets host machine
+ // +optional
+ Cinder *CinderVolumeSource
+
+ // CephFS represents a Cephfs mount on the host that shares a pod's lifetime
+ // +optional
+ CephFS *CephFSVolumeSource
+
+ // Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running
+ // +optional
+ Flocker *FlockerVolumeSource
+
+ // DownwardAPI represents metadata about the pod that should populate this volume
+ // +optional
+ DownwardAPI *DownwardAPIVolumeSource
+ // FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod.
+ // +optional
+ FC *FCVolumeSource
+ // AzureFile represents an Azure File Service mount on the host and bind mount to the pod.
+ // +optional
+ AzureFile *AzureFileVolumeSource
+ // ConfigMap represents a configMap that should populate this volume
+ // +optional
+ ConfigMap *ConfigMapVolumeSource
+ // VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine
+ // +optional
+ VsphereVolume *VsphereVirtualDiskVolumeSource
+ // AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.
+ // +optional
+ AzureDisk *AzureDiskVolumeSource
+ // PhotonPersistentDisk represents a Photon Controller persistent disk attached and mounted on kubelets host machine
+ PhotonPersistentDisk *PhotonPersistentDiskVolumeSource
+ // Items for all in one resources secrets, configmaps, and downward API
+ Projected *ProjectedVolumeSource
+ // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine
+ // +optional
+ PortworxVolume *PortworxVolumeSource
+ // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.
+ // +optional
+ ScaleIO *ScaleIOVolumeSource
+ // StorageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod
+ // +optional
+ StorageOS *StorageOSVolumeSource
+}
+
+// Similar to VolumeSource but meant for the administrator who creates PVs.
+// Exactly one of its members must be set.
+type PersistentVolumeSource struct {
+ // GCEPersistentDisk represents a GCE Disk resource that is attached to a
+ // kubelet's host machine and then exposed to the pod.
+ // +optional
+ GCEPersistentDisk *GCEPersistentDiskVolumeSource
+ // AWSElasticBlockStore represents an AWS EBS disk that is attached to a
+ // kubelet's host machine and then exposed to the pod.
+ // +optional
+ AWSElasticBlockStore *AWSElasticBlockStoreVolumeSource
+ // HostPath represents a directory on the host.
+ // Provisioned by a developer or tester.
+ // This is useful for single-node development and testing only!
+ // On-host storage is not supported in any way and WILL NOT WORK in a multi-node cluster.
+ // +optional
+ HostPath *HostPathVolumeSource
+ // Glusterfs represents a Glusterfs volume that is attached to a host and exposed to the pod
+ // +optional
+ Glusterfs *GlusterfsVolumeSource
+ // NFS represents an NFS mount on the host that shares a pod's lifetime
+ // +optional
+ NFS *NFSVolumeSource
+ // RBD represents a Rados Block Device mount on the host that shares a pod's lifetime
+ // +optional
+ RBD *RBDPersistentVolumeSource
+ // Quobyte represents a Quobyte mount on the host that shares a pod's lifetime
+ // +optional
+ Quobyte *QuobyteVolumeSource
+ // ISCSIPersistentVolumeSource represents an ISCSI resource that is attached to a
+ // kubelet's host machine and then exposed to the pod.
+ // +optional
+ ISCSI *ISCSIPersistentVolumeSource
+ // FlexVolume represents a generic volume resource that is
+ // provisioned/attached using an exec based plugin.
+ // +optional
+ FlexVolume *FlexPersistentVolumeSource
+ // Cinder represents a cinder volume attached and mounted on kubelets host machine
+ // +optional
+ Cinder *CinderVolumeSource
+ // CephFS represents a Ceph FS mount on the host that shares a pod's lifetime
+ // +optional
+ CephFS *CephFSPersistentVolumeSource
+ // FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod.
+ // +optional
+ FC *FCVolumeSource
+ // Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running
+ // +optional
+ Flocker *FlockerVolumeSource
+ // AzureFile represents an Azure File Service mount on the host and bind mount to the pod.
+ // +optional
+ AzureFile *AzureFilePersistentVolumeSource
+ // VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine
+ // +optional
+ VsphereVolume *VsphereVirtualDiskVolumeSource
+ // AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.
+ // +optional
+ AzureDisk *AzureDiskVolumeSource
+ // PhotonPersistentDisk represents a Photon Controller persistent disk attached and mounted on kubelets host machine
+ PhotonPersistentDisk *PhotonPersistentDiskVolumeSource
+ // PortworxVolume represents a portworx volume attached and mounted on kubelets host machine
+ // +optional
+ PortworxVolume *PortworxVolumeSource
+ // ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.
+ // +optional
+ ScaleIO *ScaleIOPersistentVolumeSource
+ // Local represents directly-attached storage with node affinity
+ // +optional
+ Local *LocalVolumeSource
+ // StorageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod
+ // More info: https://releases.k8s.io/HEAD/examples/volumes/storageos/README.md
+ // +optional
+ StorageOS *StorageOSPersistentVolumeSource
+ // CSI (Container Storage Interface) represents storage that handled by an external CSI driver (Beta feature).
+ // +optional
+ CSI *CSIPersistentVolumeSource
+}
+
+type PersistentVolumeClaimVolumeSource struct {
+ // ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume
+ ClaimName string
+ // Optional: Defaults to false (read/write). ReadOnly here
+ // will force the ReadOnly setting in VolumeMounts
+ // +optional
+ ReadOnly bool
+}
+
+const (
+ // BetaStorageClassAnnotation represents the beta/previous StorageClass annotation.
+ // It's deprecated and will be removed in a future release. (#51440)
+ BetaStorageClassAnnotation = "volume.beta.kubernetes.io/storage-class"
+
+ // MountOptionAnnotation defines mount option annotation used in PVs
+ MountOptionAnnotation = "volume.beta.kubernetes.io/mount-options"
+
+ // AlphaStorageNodeAffinityAnnotation defines node affinity policies for a PersistentVolume.
+ // Value is a string of the json representation of type NodeAffinity
+ AlphaStorageNodeAffinityAnnotation = "volume.alpha.kubernetes.io/node-affinity"
+)
+
+// +genclient
+// +genclient:nonNamespaced
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+type PersistentVolume struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ //Spec defines a persistent volume owned by the cluster
+ // +optional
+ Spec PersistentVolumeSpec
+
+ // Status represents the current information about persistent volume.
+ // +optional
+ Status PersistentVolumeStatus
+}
+
+type PersistentVolumeSpec struct {
+ // Resources represents the actual resources of the volume
+ Capacity ResourceList
+ // Source represents the location and type of a volume to mount.
+ PersistentVolumeSource
+ // AccessModes contains all ways the volume can be mounted
+ // +optional
+ AccessModes []PersistentVolumeAccessMode
+ // ClaimRef is part of a bi-directional binding between PersistentVolume and PersistentVolumeClaim.
+ // ClaimRef is expected to be non-nil when bound.
+ // claim.VolumeName is the authoritative bind between PV and PVC.
+ // When set to non-nil value, PVC.Spec.Selector of the referenced PVC is
+ // ignored, i.e. labels of this PV do not need to match PVC selector.
+ // +optional
+ ClaimRef *ObjectReference
+ // Optional: what happens to a persistent volume when released from its claim.
+ // +optional
+ PersistentVolumeReclaimPolicy PersistentVolumeReclaimPolicy
+ // Name of StorageClass to which this persistent volume belongs. Empty value
+ // means that this volume does not belong to any StorageClass.
+ // +optional
+ StorageClassName string
+ // A list of mount options, e.g. ["ro", "soft"]. Not validated - mount will
+ // simply fail if one is invalid.
+ // +optional
+ MountOptions []string
+ // volumeMode defines if a volume is intended to be used with a formatted filesystem
+ // or to remain in raw block state. Value of Filesystem is implied when not included in spec.
+ // This is an alpha feature and may change in the future.
+ // +optional
+ VolumeMode *PersistentVolumeMode
+ // NodeAffinity defines constraints that limit what nodes this volume can be accessed from.
+ // This field influences the scheduling of pods that use this volume.
+ // +optional
+ NodeAffinity *VolumeNodeAffinity
+}
+
+// VolumeNodeAffinity defines constraints that limit what nodes this volume can be accessed from.
+type VolumeNodeAffinity struct {
+ // Required specifies hard node constraints that must be met.
+ Required *NodeSelector
+}
+
+// PersistentVolumeReclaimPolicy describes a policy for end-of-life maintenance of persistent volumes
+type PersistentVolumeReclaimPolicy string
+
+const (
+ // PersistentVolumeReclaimRecycle means the volume will be recycled back into the pool of unbound persistent volumes on release from its claim.
+ // The volume plugin must support Recycling.
+ // DEPRECATED: The PersistentVolumeReclaimRecycle called Recycle is being deprecated. See announcement here: https://groups.google.com/forum/#!topic/kubernetes-dev/uexugCza84I
+ PersistentVolumeReclaimRecycle PersistentVolumeReclaimPolicy = "Recycle"
+ // PersistentVolumeReclaimDelete means the volume will be deleted from Kubernetes on release from its claim.
+ // The volume plugin must support Deletion.
+ PersistentVolumeReclaimDelete PersistentVolumeReclaimPolicy = "Delete"
+ // PersistentVolumeReclaimRetain means the volume will be left in its current phase (Released) for manual reclamation by the administrator.
+ // The default policy is Retain.
+ PersistentVolumeReclaimRetain PersistentVolumeReclaimPolicy = "Retain"
+)
+
+// PersistentVolumeMode describes how a volume is intended to be consumed, either Block or Filesystem.
+type PersistentVolumeMode string
+
+const (
+ // PersistentVolumeBlock means the volume will not be formatted with a filesystem and will remain a raw block device.
+ PersistentVolumeBlock PersistentVolumeMode = "Block"
+ // PersistentVolumeFilesystem means the volume will be or is formatted with a filesystem.
+ PersistentVolumeFilesystem PersistentVolumeMode = "Filesystem"
+)
+
+type PersistentVolumeStatus struct {
+ // Phase indicates if a volume is available, bound to a claim, or released by a claim
+ // +optional
+ Phase PersistentVolumePhase
+ // A human-readable message indicating details about why the volume is in this state.
+ // +optional
+ Message string
+ // Reason is a brief CamelCase string that describes any failure and is meant for machine parsing and tidy display in the CLI
+ // +optional
+ Reason string
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+type PersistentVolumeList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+ Items []PersistentVolume
+}
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PersistentVolumeClaim is a user's request for and claim to a persistent volume
+type PersistentVolumeClaim struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // Spec defines the volume requested by a pod author
+ // +optional
+ Spec PersistentVolumeClaimSpec
+
+ // Status represents the current information about a claim
+ // +optional
+ Status PersistentVolumeClaimStatus
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+type PersistentVolumeClaimList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+ Items []PersistentVolumeClaim
+}
+
+// PersistentVolumeClaimSpec describes the common attributes of storage devices
+// and allows a Source for provider-specific attributes
+type PersistentVolumeClaimSpec struct {
+ // Contains the types of access modes required
+ // +optional
+ AccessModes []PersistentVolumeAccessMode
+ // A label query over volumes to consider for binding. This selector is
+ // ignored when VolumeName is set
+ // +optional
+ Selector *metav1.LabelSelector
+ // Resources represents the minimum resources required
+ // +optional
+ Resources ResourceRequirements
+ // VolumeName is the binding reference to the PersistentVolume backing this
+ // claim. When set to non-empty value Selector is not evaluated
+ // +optional
+ VolumeName string
+ // Name of the StorageClass required by the claim.
+ // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1
+ // +optional
+ StorageClassName *string
+ // volumeMode defines what type of volume is required by the claim.
+ // Value of Filesystem is implied when not included in claim spec.
+ // This is an alpha feature and may change in the future.
+ // +optional
+ VolumeMode *PersistentVolumeMode
+}
+
+type PersistentVolumeClaimConditionType string
+
+// These are valid conditions of Pvc
+const (
+ // An user trigger resize of pvc has been started
+ PersistentVolumeClaimResizing PersistentVolumeClaimConditionType = "Resizing"
+ // PersistentVolumeClaimFileSystemResizePending - controller resize is finished and a file system resize is pending on node
+ PersistentVolumeClaimFileSystemResizePending PersistentVolumeClaimConditionType = "FileSystemResizePending"
+)
+
+type PersistentVolumeClaimCondition struct {
+ Type PersistentVolumeClaimConditionType
+ Status ConditionStatus
+ // +optional
+ LastProbeTime metav1.Time
+ // +optional
+ LastTransitionTime metav1.Time
+ // +optional
+ Reason string
+ // +optional
+ Message string
+}
+
+type PersistentVolumeClaimStatus struct {
+ // Phase represents the current phase of PersistentVolumeClaim
+ // +optional
+ Phase PersistentVolumeClaimPhase
+ // AccessModes contains all ways the volume backing the PVC can be mounted
+ // +optional
+ AccessModes []PersistentVolumeAccessMode
+ // Represents the actual resources of the underlying volume
+ // +optional
+ Capacity ResourceList
+ // +optional
+ Conditions []PersistentVolumeClaimCondition
+}
+
+type PersistentVolumeAccessMode string
+
+const (
+ // can be mounted read/write mode to exactly 1 host
+ ReadWriteOnce PersistentVolumeAccessMode = "ReadWriteOnce"
+ // can be mounted in read-only mode to many hosts
+ ReadOnlyMany PersistentVolumeAccessMode = "ReadOnlyMany"
+ // can be mounted in read/write mode to many hosts
+ ReadWriteMany PersistentVolumeAccessMode = "ReadWriteMany"
+)
+
+type PersistentVolumePhase string
+
+const (
+ // used for PersistentVolumes that are not available
+ VolumePending PersistentVolumePhase = "Pending"
+ // used for PersistentVolumes that are not yet bound
+ // Available volumes are held by the binder and matched to PersistentVolumeClaims
+ VolumeAvailable PersistentVolumePhase = "Available"
+ // used for PersistentVolumes that are bound
+ VolumeBound PersistentVolumePhase = "Bound"
+ // used for PersistentVolumes where the bound PersistentVolumeClaim was deleted
+ // released volumes must be recycled before becoming available again
+ // this phase is used by the persistent volume claim binder to signal to another process to reclaim the resource
+ VolumeReleased PersistentVolumePhase = "Released"
+ // used for PersistentVolumes that failed to be correctly recycled or deleted after being released from a claim
+ VolumeFailed PersistentVolumePhase = "Failed"
+)
+
+type PersistentVolumeClaimPhase string
+
+const (
+ // used for PersistentVolumeClaims that are not yet bound
+ ClaimPending PersistentVolumeClaimPhase = "Pending"
+ // used for PersistentVolumeClaims that are bound
+ ClaimBound PersistentVolumeClaimPhase = "Bound"
+ // used for PersistentVolumeClaims that lost their underlying
+ // PersistentVolume. The claim was bound to a PersistentVolume and this
+ // volume does not exist any longer and all data on it was lost.
+ ClaimLost PersistentVolumeClaimPhase = "Lost"
+)
+
+type HostPathType string
+
+const (
+ // For backwards compatible, leave it empty if unset
+ HostPathUnset HostPathType = ""
+ // If nothing exists at the given path, an empty directory will be created there
+ // as needed with file mode 0755, having the same group and ownership with Kubelet.
+ HostPathDirectoryOrCreate HostPathType = "DirectoryOrCreate"
+ // A directory must exist at the given path
+ HostPathDirectory HostPathType = "Directory"
+ // If nothing exists at the given path, an empty file will be created there
+ // as needed with file mode 0644, having the same group and ownership with Kubelet.
+ HostPathFileOrCreate HostPathType = "FileOrCreate"
+ // A file must exist at the given path
+ HostPathFile HostPathType = "File"
+ // A UNIX socket must exist at the given path
+ HostPathSocket HostPathType = "Socket"
+ // A character device must exist at the given path
+ HostPathCharDev HostPathType = "CharDevice"
+ // A block device must exist at the given path
+ HostPathBlockDev HostPathType = "BlockDevice"
+)
+
+// Represents a host path mapped into a pod.
+// Host path volumes do not support ownership management or SELinux relabeling.
+type HostPathVolumeSource struct {
+ // If the path is a symlink, it will follow the link to the real path.
+ Path string
+ // Defaults to ""
+ Type *HostPathType
+}
+
+// Represents an empty directory for a pod.
+// Empty directory volumes support ownership management and SELinux relabeling.
+type EmptyDirVolumeSource struct {
+ // TODO: Longer term we want to represent the selection of underlying
+ // media more like a scheduling problem - user says what traits they
+ // need, we give them a backing store that satisfies that. For now
+ // this will cover the most common needs.
+ // Optional: what type of storage medium should back this directory.
+ // The default is "" which means to use the node's default medium.
+ // +optional
+ Medium StorageMedium
+ // Total amount of local storage required for this EmptyDir volume.
+ // The size limit is also applicable for memory medium.
+ // The maximum usage on memory medium EmptyDir would be the minimum value between
+ // the SizeLimit specified here and the sum of memory limits of all containers in a pod.
+ // The default is nil which means that the limit is undefined.
+ // More info: http://kubernetes.io/docs/user-guide/volumes#emptydir
+ // +optional
+ SizeLimit *resource.Quantity
+}
+
+// StorageMedium defines ways that storage can be allocated to a volume.
+type StorageMedium string
+
+const (
+ StorageMediumDefault StorageMedium = "" // use whatever the default is for the node
+ StorageMediumMemory StorageMedium = "Memory" // use memory (tmpfs)
+ StorageMediumHugePages StorageMedium = "HugePages" // use hugepages
+)
+
+// Protocol defines network protocols supported for things like container ports.
+type Protocol string
+
+const (
+ // ProtocolTCP is the TCP protocol.
+ ProtocolTCP Protocol = "TCP"
+ // ProtocolUDP is the UDP protocol.
+ ProtocolUDP Protocol = "UDP"
+)
+
+// Represents a Persistent Disk resource in Google Compute Engine.
+//
+// A GCE PD must exist before mounting to a container. The disk must
+// also be in the same GCE project and zone as the kubelet. A GCE PD
+// can only be mounted as read/write once or read-only many times. GCE
+// PDs support ownership management and SELinux relabeling.
+type GCEPersistentDiskVolumeSource struct {
+ // Unique name of the PD resource. Used to identify the disk in GCE
+ PDName string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // TODO: how do we prevent errors in the filesystem from compromising the machine
+ // +optional
+ FSType string
+ // Optional: Partition on the disk to mount.
+ // If omitted, kubelet will attempt to mount the device name.
+ // Ex. For /dev/sda1, this field is "1", for /dev/sda, this field is 0 or empty.
+ // +optional
+ Partition int32
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+}
+
+// Represents an ISCSI disk.
+// ISCSI volumes can only be mounted as read/write once.
+// ISCSI volumes support ownership management and SELinux relabeling.
+type ISCSIVolumeSource struct {
+ // Required: iSCSI target portal
+ // the portal is either an IP or ip_addr:port if port is other than default (typically TCP ports 860 and 3260)
+ // +optional
+ TargetPortal string
+ // Required: target iSCSI Qualified Name
+ // +optional
+ IQN string
+ // Required: iSCSI target lun number
+ // +optional
+ Lun int32
+ // Optional: Defaults to 'default' (tcp). iSCSI interface name that uses an iSCSI transport.
+ // +optional
+ ISCSIInterface string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // TODO: how do we prevent errors in the filesystem from compromising the machine
+ // +optional
+ FSType string
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+ // Optional: list of iSCSI target portal ips for high availability.
+ // the portal is either an IP or ip_addr:port if port is other than default (typically TCP ports 860 and 3260)
+ // +optional
+ Portals []string
+ // Optional: whether support iSCSI Discovery CHAP authentication
+ // +optional
+ DiscoveryCHAPAuth bool
+ // Optional: whether support iSCSI Session CHAP authentication
+ // +optional
+ SessionCHAPAuth bool
+ // Optional: CHAP secret for iSCSI target and initiator authentication.
+ // The secret is used if either DiscoveryCHAPAuth or SessionCHAPAuth is true
+ // +optional
+ SecretRef *LocalObjectReference
+ // Optional: Custom initiator name per volume.
+ // If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface
+ // <target portal>:<volume name> will be created for the connection.
+ // +optional
+ InitiatorName *string
+}
+
+// ISCSIPersistentVolumeSource represents an ISCSI disk.
+// ISCSI volumes can only be mounted as read/write once.
+// ISCSI volumes support ownership management and SELinux relabeling.
+type ISCSIPersistentVolumeSource struct {
+ // Required: iSCSI target portal
+ // the portal is either an IP or ip_addr:port if port is other than default (typically TCP ports 860 and 3260)
+ // +optional
+ TargetPortal string
+ // Required: target iSCSI Qualified Name
+ // +optional
+ IQN string
+ // Required: iSCSI target lun number
+ // +optional
+ Lun int32
+ // Optional: Defaults to 'default' (tcp). iSCSI interface name that uses an iSCSI transport.
+ // +optional
+ ISCSIInterface string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // TODO: how do we prevent errors in the filesystem from compromising the machine
+ // +optional
+ FSType string
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+ // Optional: list of iSCSI target portal ips for high availability.
+ // the portal is either an IP or ip_addr:port if port is other than default (typically TCP ports 860 and 3260)
+ // +optional
+ Portals []string
+ // Optional: whether support iSCSI Discovery CHAP authentication
+ // +optional
+ DiscoveryCHAPAuth bool
+ // Optional: whether support iSCSI Session CHAP authentication
+ // +optional
+ SessionCHAPAuth bool
+ // Optional: CHAP secret for iSCSI target and initiator authentication.
+ // The secret is used if either DiscoveryCHAPAuth or SessionCHAPAuth is true
+ // +optional
+ SecretRef *SecretReference
+ // Optional: Custom initiator name per volume.
+ // If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface
+ // <target portal>:<volume name> will be created for the connection.
+ // +optional
+ InitiatorName *string
+}
+
+// Represents a Fibre Channel volume.
+// Fibre Channel volumes can only be mounted as read/write once.
+// Fibre Channel volumes support ownership management and SELinux relabeling.
+type FCVolumeSource struct {
+ // Optional: FC target worldwide names (WWNs)
+ // +optional
+ TargetWWNs []string
+ // Optional: FC target lun number
+ // +optional
+ Lun *int32
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // TODO: how do we prevent errors in the filesystem from compromising the machine
+ // +optional
+ FSType string
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+ // Optional: FC volume World Wide Identifiers (WWIDs)
+ // Either WWIDs or TargetWWNs and Lun must be set, but not both simultaneously.
+ // +optional
+ WWIDs []string
+}
+
+// FlexPersistentVolumeSource represents a generic persistent volume resource that is
+// provisioned/attached using an exec based plugin.
+type FlexPersistentVolumeSource struct {
+ // Driver is the name of the driver to use for this volume.
+ Driver string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script.
+ // +optional
+ FSType string
+ // Optional: SecretRef is reference to the secret object containing
+ // sensitive information to pass to the plugin scripts. This may be
+ // empty if no secret object is specified. If the secret object
+ // contains more than one secret, all secrets are passed to the plugin
+ // scripts.
+ // +optional
+ SecretRef *SecretReference
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+ // Optional: Extra driver options if any.
+ // +optional
+ Options map[string]string
+}
+
+// FlexVolume represents a generic volume resource that is
+// provisioned/attached using an exec based plugin.
+type FlexVolumeSource struct {
+ // Driver is the name of the driver to use for this volume.
+ Driver string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script.
+ // +optional
+ FSType string
+ // Optional: SecretRef is reference to the secret object containing
+ // sensitive information to pass to the plugin scripts. This may be
+ // empty if no secret object is specified. If the secret object
+ // contains more than one secret, all secrets are passed to the plugin
+ // scripts.
+ // +optional
+ SecretRef *LocalObjectReference
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+ // Optional: Extra driver options if any.
+ // +optional
+ Options map[string]string
+}
+
+// Represents a Persistent Disk resource in AWS.
+//
+// An AWS EBS disk must exist before mounting to a container. The disk
+// must also be in the same AWS zone as the kubelet. An AWS EBS disk
+// can only be mounted as read/write once. AWS EBS volumes support
+// ownership management and SELinux relabeling.
+type AWSElasticBlockStoreVolumeSource struct {
+ // Unique id of the persistent disk resource. Used to identify the disk in AWS
+ VolumeID string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // TODO: how do we prevent errors in the filesystem from compromising the machine
+ // +optional
+ FSType string
+ // Optional: Partition on the disk to mount.
+ // If omitted, kubelet will attempt to mount the device name.
+ // Ex. For /dev/sda1, this field is "1", for /dev/sda, this field is 0 or empty.
+ // +optional
+ Partition int32
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+}
+
+// Represents a volume that is populated with the contents of a git repository.
+// Git repo volumes do not support ownership management.
+// Git repo volumes support SELinux relabeling.
+type GitRepoVolumeSource struct {
+ // Repository URL
+ Repository string
+ // Commit hash, this is optional
+ // +optional
+ Revision string
+ // Clone target, this is optional
+ // Must not contain or start with '..'. If '.' is supplied, the volume directory will be the
+ // git repository. Otherwise, if specified, the volume will contain the git repository in
+ // the subdirectory with the given name.
+ // +optional
+ Directory string
+ // TODO: Consider credentials here.
+}
+
+// Adapts a Secret into a volume.
+//
+// The contents of the target Secret's Data field will be presented in a volume
+// as files using the keys in the Data field as the file names.
+// Secret volumes support ownership management and SELinux relabeling.
+type SecretVolumeSource struct {
+ // Name of the secret in the pod's namespace to use.
+ // +optional
+ SecretName string
+ // If unspecified, each key-value pair in the Data field of the referenced
+ // Secret will be projected into the volume as a file whose name is the
+ // key and content is the value. If specified, the listed keys will be
+ // projected into the specified paths, and unlisted keys will not be
+ // present. If a key is specified which is not present in the Secret,
+ // the volume setup will error unless it is marked optional. Paths must be
+ // relative and may not contain the '..' path or start with '..'.
+ // +optional
+ Items []KeyToPath
+ // Mode bits to use on created files by default. Must be a value between
+ // 0 and 0777.
+ // Directories within the path are not affected by this setting.
+ // This might be in conflict with other options that affect the file
+ // mode, like fsGroup, and the result can be other mode bits set.
+ // +optional
+ DefaultMode *int32
+ // Specify whether the Secret or its key must be defined
+ // +optional
+ Optional *bool
+}
+
+// Adapts a secret into a projected volume.
+//
+// The contents of the target Secret's Data field will be presented in a
+// projected volume as files using the keys in the Data field as the file names.
+// Note that this is identical to a secret volume source without the default
+// mode.
+type SecretProjection struct {
+ LocalObjectReference
+ // If unspecified, each key-value pair in the Data field of the referenced
+ // Secret will be projected into the volume as a file whose name is the
+ // key and content is the value. If specified, the listed keys will be
+ // projected into the specified paths, and unlisted keys will not be
+ // present. If a key is specified which is not present in the Secret,
+ // the volume setup will error unless it is marked optional. Paths must be
+ // relative and may not contain the '..' path or start with '..'.
+ // +optional
+ Items []KeyToPath
+ // Specify whether the Secret or its key must be defined
+ // +optional
+ Optional *bool
+}
+
+// Represents an NFS mount that lasts the lifetime of a pod.
+// NFS volumes do not support ownership management or SELinux relabeling.
+type NFSVolumeSource struct {
+ // Server is the hostname or IP address of the NFS server
+ Server string
+
+ // Path is the exported NFS share
+ Path string
+
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the NFS export to be mounted with read-only permissions
+ // +optional
+ ReadOnly bool
+}
+
+// Represents a Quobyte mount that lasts the lifetime of a pod.
+// Quobyte volumes do not support ownership management or SELinux relabeling.
+type QuobyteVolumeSource struct {
+ // Registry represents a single or multiple Quobyte Registry services
+ // specified as a string as host:port pair (multiple entries are separated with commas)
+ // which acts as the central registry for volumes
+ Registry string
+
+ // Volume is a string that references an already created Quobyte volume by name.
+ Volume string
+
+ // Defaults to false (read/write). ReadOnly here will force
+ // the Quobyte to be mounted with read-only permissions
+ // +optional
+ ReadOnly bool
+
+ // User to map volume access to
+ // Defaults to the root user
+ // +optional
+ User string
+
+ // Group to map volume access to
+ // Default is no group
+ // +optional
+ Group string
+}
+
+// Represents a Glusterfs mount that lasts the lifetime of a pod.
+// Glusterfs volumes do not support ownership management or SELinux relabeling.
+type GlusterfsVolumeSource struct {
+ // Required: EndpointsName is the endpoint name that details Glusterfs topology
+ EndpointsName string
+
+ // Required: Path is the Glusterfs volume path
+ Path string
+
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the Glusterfs to be mounted with read-only permissions
+ // +optional
+ ReadOnly bool
+}
+
+// Represents a Rados Block Device mount that lasts the lifetime of a pod.
+// RBD volumes support ownership management and SELinux relabeling.
+type RBDVolumeSource struct {
+ // Required: CephMonitors is a collection of Ceph monitors
+ CephMonitors []string
+ // Required: RBDImage is the rados image name
+ RBDImage string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // TODO: how do we prevent errors in the filesystem from compromising the machine
+ // +optional
+ FSType string
+ // Optional: RadosPool is the rados pool name,default is rbd
+ // +optional
+ RBDPool string
+ // Optional: RBDUser is the rados user name, default is admin
+ // +optional
+ RadosUser string
+ // Optional: Keyring is the path to key ring for RBDUser, default is /etc/ceph/keyring
+ // +optional
+ Keyring string
+ // Optional: SecretRef is name of the authentication secret for RBDUser, default is nil.
+ // +optional
+ SecretRef *LocalObjectReference
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+}
+
+// Represents a Rados Block Device mount that lasts the lifetime of a pod.
+// RBD volumes support ownership management and SELinux relabeling.
+type RBDPersistentVolumeSource struct {
+ // Required: CephMonitors is a collection of Ceph monitors
+ CephMonitors []string
+ // Required: RBDImage is the rados image name
+ RBDImage string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // TODO: how do we prevent errors in the filesystem from compromising the machine
+ // +optional
+ FSType string
+ // Optional: RadosPool is the rados pool name,default is rbd
+ // +optional
+ RBDPool string
+ // Optional: RBDUser is the rados user name, default is admin
+ // +optional
+ RadosUser string
+ // Optional: Keyring is the path to key ring for RBDUser, default is /etc/ceph/keyring
+ // +optional
+ Keyring string
+ // Optional: SecretRef is reference to the authentication secret for User, default is empty.
+ // +optional
+ SecretRef *SecretReference
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+}
+
+// Represents a cinder volume resource in Openstack. A Cinder volume
+// must exist before mounting to a container. The volume must also be
+// in the same region as the kubelet. Cinder volumes support ownership
+// management and SELinux relabeling.
+type CinderVolumeSource struct {
+ // Unique id of the volume used to identify the cinder volume
+ VolumeID string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // +optional
+ FSType string
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+}
+
+// Represents a Ceph Filesystem mount that lasts the lifetime of a pod
+// Cephfs volumes do not support ownership management or SELinux relabeling.
+type CephFSVolumeSource struct {
+ // Required: Monitors is a collection of Ceph monitors
+ Monitors []string
+ // Optional: Used as the mounted root, rather than the full Ceph tree, default is /
+ // +optional
+ Path string
+ // Optional: User is the rados user name, default is admin
+ // +optional
+ User string
+ // Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret
+ // +optional
+ SecretFile string
+ // Optional: SecretRef is reference to the authentication secret for User, default is empty.
+ // +optional
+ SecretRef *LocalObjectReference
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+}
+
+// SecretReference represents a Secret Reference. It has enough information to retrieve secret
+// in any namespace
+type SecretReference struct {
+ // Name is unique within a namespace to reference a secret resource.
+ // +optional
+ Name string
+ // Namespace defines the space within which the secret name must be unique.
+ // +optional
+ Namespace string
+}
+
+// Represents a Ceph Filesystem mount that lasts the lifetime of a pod
+// Cephfs volumes do not support ownership management or SELinux relabeling.
+type CephFSPersistentVolumeSource struct {
+ // Required: Monitors is a collection of Ceph monitors
+ Monitors []string
+ // Optional: Used as the mounted root, rather than the full Ceph tree, default is /
+ // +optional
+ Path string
+ // Optional: User is the rados user name, default is admin
+ // +optional
+ User string
+ // Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret
+ // +optional
+ SecretFile string
+ // Optional: SecretRef is reference to the authentication secret for User, default is empty.
+ // +optional
+ SecretRef *SecretReference
+ // Optional: Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+}
+
+// Represents a Flocker volume mounted by the Flocker agent.
+// One and only one of datasetName and datasetUUID should be set.
+// Flocker volumes do not support ownership management or SELinux relabeling.
+type FlockerVolumeSource struct {
+ // Name of the dataset stored as metadata -> name on the dataset for Flocker
+ // should be considered as deprecated
+ // +optional
+ DatasetName string
+ // UUID of the dataset. This is unique identifier of a Flocker dataset
+ // +optional
+ DatasetUUID string
+}
+
+// Represents a volume containing downward API info.
+// Downward API volumes support ownership management and SELinux relabeling.
+type DownwardAPIVolumeSource struct {
+ // Items is a list of DownwardAPIVolume file
+ // +optional
+ Items []DownwardAPIVolumeFile
+ // Mode bits to use on created files by default. Must be a value between
+ // 0 and 0777.
+ // Directories within the path are not affected by this setting.
+ // This might be in conflict with other options that affect the file
+ // mode, like fsGroup, and the result can be other mode bits set.
+ // +optional
+ DefaultMode *int32
+}
+
+// Represents a single file containing information from the downward API
+type DownwardAPIVolumeFile struct {
+ // Required: Path is the relative path name of the file to be created. Must not be absolute or contain the '..' path. Must be utf-8 encoded. The first item of the relative path must not start with '..'
+ Path string
+ // Required: Selects a field of the pod: only annotations, labels, name, namespace and uid are supported.
+ // +optional
+ FieldRef *ObjectFieldSelector
+ // Selects a resource of the container: only resources limits and requests
+ // (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.
+ // +optional
+ ResourceFieldRef *ResourceFieldSelector
+ // Optional: mode bits to use on this file, must be a value between 0
+ // and 0777. If not specified, the volume defaultMode will be used.
+ // This might be in conflict with other options that affect the file
+ // mode, like fsGroup, and the result can be other mode bits set.
+ // +optional
+ Mode *int32
+}
+
+// Represents downward API info for projecting into a projected volume.
+// Note that this is identical to a downwardAPI volume source without the default
+// mode.
+type DownwardAPIProjection struct {
+ // Items is a list of DownwardAPIVolume file
+ // +optional
+ Items []DownwardAPIVolumeFile
+}
+
+// AzureFile represents an Azure File Service mount on the host and bind mount to the pod.
+type AzureFileVolumeSource struct {
+ // the name of secret that contains Azure Storage Account Name and Key
+ SecretName string
+ // Share Name
+ ShareName string
+ // Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+}
+
+// AzureFile represents an Azure File Service mount on the host and bind mount to the pod.
+type AzureFilePersistentVolumeSource struct {
+ // the name of secret that contains Azure Storage Account Name and Key
+ SecretName string
+ // Share Name
+ ShareName string
+ // Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+ // the namespace of the secret that contains Azure Storage Account Name and Key
+ // default is the same as the Pod
+ // +optional
+ SecretNamespace *string
+}
+
+// Represents a vSphere volume resource.
+type VsphereVirtualDiskVolumeSource struct {
+ // Path that identifies vSphere volume vmdk
+ VolumePath string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // +optional
+ FSType string
+ // Storage Policy Based Management (SPBM) profile name.
+ // +optional
+ StoragePolicyName string
+ // Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName.
+ // +optional
+ StoragePolicyID string
+}
+
+// Represents a Photon Controller persistent disk resource.
+type PhotonPersistentDiskVolumeSource struct {
+ // ID that identifies Photon Controller persistent disk
+ PdID string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ FSType string
+}
+
+// PortworxVolumeSource represents a Portworx volume resource.
+type PortworxVolumeSource struct {
+ // VolumeID uniquely identifies a Portworx volume
+ VolumeID string
+ // FSType represents the filesystem type to mount
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified.
+ // +optional
+ FSType string
+ // Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+}
+
+type AzureDataDiskCachingMode string
+type AzureDataDiskKind string
+
+const (
+ AzureDataDiskCachingNone AzureDataDiskCachingMode = "None"
+ AzureDataDiskCachingReadOnly AzureDataDiskCachingMode = "ReadOnly"
+ AzureDataDiskCachingReadWrite AzureDataDiskCachingMode = "ReadWrite"
+
+ AzureSharedBlobDisk AzureDataDiskKind = "Shared"
+ AzureDedicatedBlobDisk AzureDataDiskKind = "Dedicated"
+ AzureManagedDisk AzureDataDiskKind = "Managed"
+)
+
+// AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.
+type AzureDiskVolumeSource struct {
+ // The Name of the data disk in the blob storage
+ DiskName string
+ // The URI of the data disk in the blob storage
+ DataDiskURI string
+ // Host Caching mode: None, Read Only, Read Write.
+ // +optional
+ CachingMode *AzureDataDiskCachingMode
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // +optional
+ FSType *string
+ // Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly *bool
+ // Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared
+ Kind *AzureDataDiskKind
+}
+
+// ScaleIOVolumeSource represents a persistent ScaleIO volume
+type ScaleIOVolumeSource struct {
+ // The host address of the ScaleIO API Gateway.
+ Gateway string
+ // The name of the storage system as configured in ScaleIO.
+ System string
+ // SecretRef references to the secret for ScaleIO user and other
+ // sensitive information. If this is not provided, Login operation will fail.
+ SecretRef *LocalObjectReference
+ // Flag to enable/disable SSL communication with Gateway, default false
+ // +optional
+ SSLEnabled bool
+ // The name of the ScaleIO Protection Domain for the configured storage.
+ // +optional
+ ProtectionDomain string
+ // The ScaleIO Storage Pool associated with the protection domain.
+ // +optional
+ StoragePool string
+ // Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.
+ // +optional
+ StorageMode string
+ // The name of a volume already created in the ScaleIO system
+ // that is associated with this volume source.
+ VolumeName string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // +optional
+ FSType string
+ // Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+}
+
+// ScaleIOPersistentVolumeSource represents a persistent ScaleIO volume that can be defined
+// by a an admin via a storage class, for instance.
+type ScaleIOPersistentVolumeSource struct {
+ // The host address of the ScaleIO API Gateway.
+ Gateway string
+ // The name of the storage system as configured in ScaleIO.
+ System string
+ // SecretRef references to the secret for ScaleIO user and other
+ // sensitive information. If this is not provided, Login operation will fail.
+ SecretRef *SecretReference
+ // Flag to enable/disable SSL communication with Gateway, default false
+ // +optional
+ SSLEnabled bool
+ // The name of the ScaleIO Protection Domain for the configured storage.
+ // +optional
+ ProtectionDomain string
+ // The ScaleIO Storage Pool associated with the protection domain.
+ // +optional
+ StoragePool string
+ // Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.
+ // +optional
+ StorageMode string
+ // The name of a volume created in the ScaleIO system
+ // that is associated with this volume source.
+ VolumeName string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // +optional
+ FSType string
+ // Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+}
+
+// Represents a StorageOS persistent volume resource.
+type StorageOSVolumeSource struct {
+ // VolumeName is the human-readable name of the StorageOS volume. Volume
+ // names are only unique within a namespace.
+ VolumeName string
+ // VolumeNamespace specifies the scope of the volume within StorageOS. If no
+ // namespace is specified then the Pod's namespace will be used. This allows the
+ // Kubernetes name scoping to be mirrored within StorageOS for tighter integration.
+ // Set VolumeName to any name to override the default behaviour.
+ // Set to "default" if you are not using namespaces within StorageOS.
+ // Namespaces that do not pre-exist within StorageOS will be created.
+ // +optional
+ VolumeNamespace string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // +optional
+ FSType string
+ // Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+ // SecretRef specifies the secret to use for obtaining the StorageOS API
+ // credentials. If not specified, default values will be attempted.
+ // +optional
+ SecretRef *LocalObjectReference
+}
+
+// Represents a StorageOS persistent volume resource.
+type StorageOSPersistentVolumeSource struct {
+ // VolumeName is the human-readable name of the StorageOS volume. Volume
+ // names are only unique within a namespace.
+ VolumeName string
+ // VolumeNamespace specifies the scope of the volume within StorageOS. If no
+ // namespace is specified then the Pod's namespace will be used. This allows the
+ // Kubernetes name scoping to be mirrored within StorageOS for tighter integration.
+ // Set VolumeName to any name to override the default behaviour.
+ // Set to "default" if you are not using namespaces within StorageOS.
+ // Namespaces that do not pre-exist within StorageOS will be created.
+ // +optional
+ VolumeNamespace string
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // +optional
+ FSType string
+ // Defaults to false (read/write). ReadOnly here will force
+ // the ReadOnly setting in VolumeMounts.
+ // +optional
+ ReadOnly bool
+ // SecretRef specifies the secret to use for obtaining the StorageOS API
+ // credentials. If not specified, default values will be attempted.
+ // +optional
+ SecretRef *ObjectReference
+}
+
+// Adapts a ConfigMap into a volume.
+//
+// The contents of the target ConfigMap's Data field will be presented in a
+// volume as files using the keys in the Data field as the file names, unless
+// the items element is populated with specific mappings of keys to paths.
+// ConfigMap volumes support ownership management and SELinux relabeling.
+type ConfigMapVolumeSource struct {
+ LocalObjectReference
+ // If unspecified, each key-value pair in the Data field of the referenced
+ // ConfigMap will be projected into the volume as a file whose name is the
+ // key and content is the value. If specified, the listed keys will be
+ // projected into the specified paths, and unlisted keys will not be
+ // present. If a key is specified which is not present in the ConfigMap,
+ // the volume setup will error unless it is marked optional. Paths must be
+ // relative and may not contain the '..' path or start with '..'.
+ // +optional
+ Items []KeyToPath
+ // Mode bits to use on created files by default. Must be a value between
+ // 0 and 0777.
+ // Directories within the path are not affected by this setting.
+ // This might be in conflict with other options that affect the file
+ // mode, like fsGroup, and the result can be other mode bits set.
+ // +optional
+ DefaultMode *int32
+ // Specify whether the ConfigMap or it's keys must be defined
+ // +optional
+ Optional *bool
+}
+
+// Adapts a ConfigMap into a projected volume.
+//
+// The contents of the target ConfigMap's Data field will be presented in a
+// projected volume as files using the keys in the Data field as the file names,
+// unless the items element is populated with specific mappings of keys to paths.
+// Note that this is identical to a configmap volume source without the default
+// mode.
+type ConfigMapProjection struct {
+ LocalObjectReference
+ // If unspecified, each key-value pair in the Data field of the referenced
+ // ConfigMap will be projected into the volume as a file whose name is the
+ // key and content is the value. If specified, the listed keys will be
+ // projected into the specified paths, and unlisted keys will not be
+ // present. If a key is specified which is not present in the ConfigMap,
+ // the volume setup will error unless it is marked optional. Paths must be
+ // relative and may not contain the '..' path or start with '..'.
+ // +optional
+ Items []KeyToPath
+ // Specify whether the ConfigMap or it's keys must be defined
+ // +optional
+ Optional *bool
+}
+
+// Represents a projected volume source
+type ProjectedVolumeSource struct {
+ // list of volume projections
+ Sources []VolumeProjection
+ // Mode bits to use on created files by default. Must be a value between
+ // 0 and 0777.
+ // Directories within the path are not affected by this setting.
+ // This might be in conflict with other options that affect the file
+ // mode, like fsGroup, and the result can be other mode bits set.
+ // +optional
+ DefaultMode *int32
+}
+
+// Projection that may be projected along with other supported volume types
+type VolumeProjection struct {
+ // all types below are the supported types for projection into the same volume
+
+ // information about the secret data to project
+ Secret *SecretProjection
+ // information about the downwardAPI data to project
+ DownwardAPI *DownwardAPIProjection
+ // information about the configMap data to project
+ ConfigMap *ConfigMapProjection
+}
+
+// Maps a string key to a path within a volume.
+type KeyToPath struct {
+ // The key to project.
+ Key string
+
+ // The relative path of the file to map the key to.
+ // May not be an absolute path.
+ // May not contain the path element '..'.
+ // May not start with the string '..'.
+ Path string
+ // Optional: mode bits to use on this file, should be a value between 0
+ // and 0777. If not specified, the volume defaultMode will be used.
+ // This might be in conflict with other options that affect the file
+ // mode, like fsGroup, and the result can be other mode bits set.
+ // +optional
+ Mode *int32
+}
+
+// Local represents directly-attached storage with node affinity
+type LocalVolumeSource struct {
+ // The full path to the volume on the node
+ // For alpha, this path must be a directory
+ // Once block as a source is supported, then this path can point to a block device
+ Path string
+}
+
+// Represents storage that is managed by an external CSI volume driver (Beta feature)
+type CSIPersistentVolumeSource struct {
+ // Driver is the name of the driver to use for this volume.
+ // Required.
+ Driver string
+
+ // VolumeHandle is the unique volume name returned by the CSI volume
+ // plugin’s CreateVolume to refer to the volume on all subsequent calls.
+ // Required.
+ VolumeHandle string
+
+ // Optional: The value to pass to ControllerPublishVolumeRequest.
+ // Defaults to false (read/write).
+ // +optional
+ ReadOnly bool
+
+ // Filesystem type to mount.
+ // Must be a filesystem type supported by the host operating system.
+ // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
+ // +optional
+ FSType string
+
+ // Attributes of the volume to publish.
+ // +optional
+ VolumeAttributes map[string]string
+
+ // ControllerPublishSecretRef is a reference to the secret object containing
+ // sensitive information to pass to the CSI driver to complete the CSI
+ // ControllerPublishVolume and ControllerUnpublishVolume calls.
+ // This field is optional, and may be empty if no secret is required. If the
+ // secret object contains more than one secret, all secrets are passed.
+ // +optional
+ ControllerPublishSecretRef *SecretReference
+
+ // NodeStageSecretRef is a reference to the secret object containing sensitive
+ // information to pass to the CSI driver to complete the CSI NodeStageVolume
+ // and NodeStageVolume and NodeUnstageVolume calls.
+ // This field is optional, and may be empty if no secret is required. If the
+ // secret object contains more than one secret, all secrets are passed.
+ // +optional
+ NodeStageSecretRef *SecretReference
+
+ // NodePublishSecretRef is a reference to the secret object containing
+ // sensitive information to pass to the CSI driver to complete the CSI
+ // NodePublishVolume and NodeUnpublishVolume calls.
+ // This field is optional, and may be empty if no secret is required. If the
+ // secret object contains more than one secret, all secrets are passed.
+ // +optional
+ NodePublishSecretRef *SecretReference
+}
+
+// ContainerPort represents a network port in a single container
+type ContainerPort struct {
+ // Optional: If specified, this must be an IANA_SVC_NAME Each named port
+ // in a pod must have a unique name.
+ // +optional
+ Name string
+ // Optional: If specified, this must be a valid port number, 0 < x < 65536.
+ // If HostNetwork is specified, this must match ContainerPort.
+ // +optional
+ HostPort int32
+ // Required: This must be a valid port number, 0 < x < 65536.
+ ContainerPort int32
+ // Required: Supports "TCP" and "UDP".
+ // +optional
+ Protocol Protocol
+ // Optional: What host IP to bind the external port to.
+ // +optional
+ HostIP string
+}
+
+// VolumeMount describes a mounting of a Volume within a container.
+type VolumeMount struct {
+ // Required: This must match the Name of a Volume [above].
+ Name string
+ // Optional: Defaults to false (read-write).
+ // +optional
+ ReadOnly bool
+ // Required. If the path is not an absolute path (e.g. some/path) it
+ // will be prepended with the appropriate root prefix for the operating
+ // system. On Linux this is '/', on Windows this is 'C:\'.
+ MountPath string
+ // Path within the volume from which the container's volume should be mounted.
+ // Defaults to "" (volume's root).
+ // +optional
+ SubPath string
+ // mountPropagation determines how mounts are propagated from the host
+ // to container and the other way around.
+ // When not set, MountPropagationHostToContainer is used.
+ // This field is alpha in 1.8 and can be reworked or removed in a future
+ // release.
+ // +optional
+ MountPropagation *MountPropagationMode
+}
+
+// MountPropagationMode describes mount propagation.
+type MountPropagationMode string
+
+const (
+ // MountPropagationHostToContainer means that the volume in a container will
+ // receive new mounts from the host or other containers, but filesystems
+ // mounted inside the container won't be propagated to the host or other
+ // containers.
+ // Note that this mode is recursively applied to all mounts in the volume
+ // ("rslave" in Linux terminology).
+ MountPropagationHostToContainer MountPropagationMode = "HostToContainer"
+ // MountPropagationBidirectional means that the volume in a container will
+ // receive new mounts from the host or other containers, and its own mounts
+ // will be propagated from the container to the host or other containers.
+ // Note that this mode is recursively applied to all mounts in the volume
+ // ("rshared" in Linux terminology).
+ MountPropagationBidirectional MountPropagationMode = "Bidirectional"
+)
+
+// VolumeDevice describes a mapping of a raw block device within a container.
+type VolumeDevice struct {
+ // name must match the name of a persistentVolumeClaim in the pod
+ Name string
+ // devicePath is the path inside of the container that the device will be mapped to.
+ DevicePath string
+}
+
+// EnvVar represents an environment variable present in a Container.
+type EnvVar struct {
+ // Required: This must be a C_IDENTIFIER.
+ Name string
+ // Optional: no more than one of the following may be specified.
+ // Optional: Defaults to ""; variable references $(VAR_NAME) are expanded
+ // using the previous defined environment variables in the container and
+ // any service environment variables. If a variable cannot be resolved,
+ // the reference in the input string will be unchanged. The $(VAR_NAME)
+ // syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped
+ // references will never be expanded, regardless of whether the variable
+ // exists or not.
+ // +optional
+ Value string
+ // Optional: Specifies a source the value of this var should come from.
+ // +optional
+ ValueFrom *EnvVarSource
+}
+
+// EnvVarSource represents a source for the value of an EnvVar.
+// Only one of its fields may be set.
+type EnvVarSource struct {
+ // Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations,
+ // metadata.uid, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.
+ // +optional
+ FieldRef *ObjectFieldSelector
+ // Selects a resource of the container: only resources limits and requests
+ // (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.
+ // +optional
+ ResourceFieldRef *ResourceFieldSelector
+ // Selects a key of a ConfigMap.
+ // +optional
+ ConfigMapKeyRef *ConfigMapKeySelector
+ // Selects a key of a secret in the pod's namespace.
+ // +optional
+ SecretKeyRef *SecretKeySelector
+}
+
+// ObjectFieldSelector selects an APIVersioned field of an object.
+type ObjectFieldSelector struct {
+ // Required: Version of the schema the FieldPath is written in terms of.
+ // If no value is specified, it will be defaulted to the APIVersion of the
+ // enclosing object.
+ APIVersion string
+ // Required: Path of the field to select in the specified API version
+ FieldPath string
+}
+
+// ResourceFieldSelector represents container resources (cpu, memory) and their output format
+type ResourceFieldSelector struct {
+ // Container name: required for volumes, optional for env vars
+ // +optional
+ ContainerName string
+ // Required: resource to select
+ Resource string
+ // Specifies the output format of the exposed resources, defaults to "1"
+ // +optional
+ Divisor resource.Quantity
+}
+
+// Selects a key from a ConfigMap.
+type ConfigMapKeySelector struct {
+ // The ConfigMap to select from.
+ LocalObjectReference
+ // The key to select.
+ Key string
+ // Specify whether the ConfigMap or it's key must be defined
+ // +optional
+ Optional *bool
+}
+
+// SecretKeySelector selects a key of a Secret.
+type SecretKeySelector struct {
+ // The name of the secret in the pod's namespace to select from.
+ LocalObjectReference
+ // The key of the secret to select from. Must be a valid secret key.
+ Key string
+ // Specify whether the Secret or it's key must be defined
+ // +optional
+ Optional *bool
+}
+
+// EnvFromSource represents the source of a set of ConfigMaps
+type EnvFromSource struct {
+ // An optional identifier to prepend to each key in the ConfigMap.
+ // +optional
+ Prefix string
+ // The ConfigMap to select from.
+ //+optional
+ ConfigMapRef *ConfigMapEnvSource
+ // The Secret to select from.
+ //+optional
+ SecretRef *SecretEnvSource
+}
+
+// ConfigMapEnvSource selects a ConfigMap to populate the environment
+// variables with.
+//
+// The contents of the target ConfigMap's Data field will represent the
+// key-value pairs as environment variables.
+type ConfigMapEnvSource struct {
+ // The ConfigMap to select from.
+ LocalObjectReference
+ // Specify whether the ConfigMap must be defined
+ // +optional
+ Optional *bool
+}
+
+// SecretEnvSource selects a Secret to populate the environment
+// variables with.
+//
+// The contents of the target Secret's Data field will represent the
+// key-value pairs as environment variables.
+type SecretEnvSource struct {
+ // The Secret to select from.
+ LocalObjectReference
+ // Specify whether the Secret must be defined
+ // +optional
+ Optional *bool
+}
+
+// HTTPHeader describes a custom header to be used in HTTP probes
+type HTTPHeader struct {
+ // The header field name
+ Name string
+ // The header field value
+ Value string
+}
+
+// HTTPGetAction describes an action based on HTTP Get requests.
+type HTTPGetAction struct {
+ // Optional: Path to access on the HTTP server.
+ // +optional
+ Path string
+ // Required: Name or number of the port to access on the container.
+ // +optional
+ Port intstr.IntOrString
+ // Optional: Host name to connect to, defaults to the pod IP. You
+ // probably want to set "Host" in httpHeaders instead.
+ // +optional
+ Host string
+ // Optional: Scheme to use for connecting to the host, defaults to HTTP.
+ // +optional
+ Scheme URIScheme
+ // Optional: Custom headers to set in the request. HTTP allows repeated headers.
+ // +optional
+ HTTPHeaders []HTTPHeader
+}
+
+// URIScheme identifies the scheme used for connection to a host for Get actions
+type URIScheme string
+
+const (
+ // URISchemeHTTP means that the scheme used will be http://
+ URISchemeHTTP URIScheme = "HTTP"
+ // URISchemeHTTPS means that the scheme used will be https://
+ URISchemeHTTPS URIScheme = "HTTPS"
+)
+
+// TCPSocketAction describes an action based on opening a socket
+type TCPSocketAction struct {
+ // Required: Port to connect to.
+ // +optional
+ Port intstr.IntOrString
+ // Optional: Host name to connect to, defaults to the pod IP.
+ // +optional
+ Host string
+}
+
+// ExecAction describes a "run in container" action.
+type ExecAction struct {
+ // Command is the command line to execute inside the container, the working directory for the
+ // command is root ('/') in the container's filesystem. The command is simply exec'd, it is
+ // not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use
+ // a shell, you need to explicitly call out to that shell.
+ // +optional
+ Command []string
+}
+
+// Probe describes a health check to be performed against a container to determine whether it is
+// alive or ready to receive traffic.
+type Probe struct {
+ // The action taken to determine the health of a container
+ Handler
+ // Length of time before health checking is activated. In seconds.
+ // +optional
+ InitialDelaySeconds int32
+ // Length of time before health checking times out. In seconds.
+ // +optional
+ TimeoutSeconds int32
+ // How often (in seconds) to perform the probe.
+ // +optional
+ PeriodSeconds int32
+ // Minimum consecutive successes for the probe to be considered successful after having failed.
+ // Must be 1 for liveness.
+ // +optional
+ SuccessThreshold int32
+ // Minimum consecutive failures for the probe to be considered failed after having succeeded.
+ // +optional
+ FailureThreshold int32
+}
+
+// PullPolicy describes a policy for if/when to pull a container image
+type PullPolicy string
+
+const (
+ // PullAlways means that kubelet always attempts to pull the latest image. Container will fail If the pull fails.
+ PullAlways PullPolicy = "Always"
+ // PullNever means that kubelet never pulls an image, but only uses a local image. Container will fail if the image isn't present
+ PullNever PullPolicy = "Never"
+ // PullIfNotPresent means that kubelet pulls if the image isn't present on disk. Container will fail if the image isn't present and the pull fails.
+ PullIfNotPresent PullPolicy = "IfNotPresent"
+)
+
+// TerminationMessagePolicy describes how termination messages are retrieved from a container.
+type TerminationMessagePolicy string
+
+const (
+ // TerminationMessageReadFile is the default behavior and will set the container status message to
+ // the contents of the container's terminationMessagePath when the container exits.
+ TerminationMessageReadFile TerminationMessagePolicy = "File"
+ // TerminationMessageFallbackToLogsOnError will read the most recent contents of the container logs
+ // for the container status message when the container exits with an error and the
+ // terminationMessagePath has no contents.
+ TerminationMessageFallbackToLogsOnError TerminationMessagePolicy = "FallbackToLogsOnError"
+)
+
+// Capability represent POSIX capabilities type
+type Capability string
+
+// Capabilities represent POSIX capabilities that can be added or removed to a running container.
+type Capabilities struct {
+ // Added capabilities
+ // +optional
+ Add []Capability
+ // Removed capabilities
+ // +optional
+ Drop []Capability
+}
+
+// ResourceRequirements describes the compute resource requirements.
+type ResourceRequirements struct {
+ // Limits describes the maximum amount of compute resources allowed.
+ // +optional
+ Limits ResourceList
+ // Requests describes the minimum amount of compute resources required.
+ // If Request is omitted for a container, it defaults to Limits if that is explicitly specified,
+ // otherwise to an implementation-defined value
+ // +optional
+ Requests ResourceList
+}
+
+// Container represents a single container that is expected to be run on the host.
+type Container struct {
+ // Required: This must be a DNS_LABEL. Each container in a pod must
+ // have a unique name.
+ Name string
+ // Required.
+ Image string
+ // Optional: The docker image's entrypoint is used if this is not provided; cannot be updated.
+ // Variable references $(VAR_NAME) are expanded using the container's environment. If a variable
+ // cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax
+ // can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
+ // regardless of whether the variable exists or not.
+ // +optional
+ Command []string
+ // Optional: The docker image's cmd is used if this is not provided; cannot be updated.
+ // Variable references $(VAR_NAME) are expanded using the container's environment. If a variable
+ // cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax
+ // can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
+ // regardless of whether the variable exists or not.
+ // +optional
+ Args []string
+ // Optional: Defaults to Docker's default.
+ // +optional
+ WorkingDir string
+ // +optional
+ Ports []ContainerPort
+ // List of sources to populate environment variables in the container.
+ // The keys defined within a source must be a C_IDENTIFIER. All invalid keys
+ // will be reported as an event when the container is starting. When a key exists in multiple
+ // sources, the value associated with the last source will take precedence.
+ // Values defined by an Env with a duplicate key will take precedence.
+ // Cannot be updated.
+ // +optional
+ EnvFrom []EnvFromSource
+ // +optional
+ Env []EnvVar
+ // Compute resource requirements.
+ // +optional
+ Resources ResourceRequirements
+ // +optional
+ VolumeMounts []VolumeMount
+ // volumeDevices is the list of block devices to be used by the container.
+ // This is an alpha feature and may change in the future.
+ // +optional
+ VolumeDevices []VolumeDevice
+ // +optional
+ LivenessProbe *Probe
+ // +optional
+ ReadinessProbe *Probe
+ // +optional
+ Lifecycle *Lifecycle
+ // Required.
+ // +optional
+ TerminationMessagePath string
+ // +optional
+ TerminationMessagePolicy TerminationMessagePolicy
+ // Required: Policy for pulling images for this container
+ ImagePullPolicy PullPolicy
+ // Optional: SecurityContext defines the security options the container should be run with.
+ // If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.
+ // +optional
+ SecurityContext *SecurityContext
+
+ // Variables for interactive containers, these have very specialized use-cases (e.g. debugging)
+ // and shouldn't be used for general purpose containers.
+ // +optional
+ Stdin bool
+ // +optional
+ StdinOnce bool
+ // +optional
+ TTY bool
+}
+
+// Handler defines a specific action that should be taken
+// TODO: pass structured data to these actions, and document that data here.
+type Handler struct {
+ // One and only one of the following should be specified.
+ // Exec specifies the action to take.
+ // +optional
+ Exec *ExecAction
+ // HTTPGet specifies the http request to perform.
+ // +optional
+ HTTPGet *HTTPGetAction
+ // TCPSocket specifies an action involving a TCP port.
+ // TODO: implement a realistic TCP lifecycle hook
+ // +optional
+ TCPSocket *TCPSocketAction
+}
+
+// Lifecycle describes actions that the management system should take in response to container lifecycle
+// events. For the PostStart and PreStop lifecycle handlers, management of the container blocks
+// until the action is complete, unless the container process fails, in which case the handler is aborted.
+type Lifecycle struct {
+ // PostStart is called immediately after a container is created. If the handler fails, the container
+ // is terminated and restarted.
+ // +optional
+ PostStart *Handler
+ // PreStop is called immediately before a container is terminated. The reason for termination is
+ // passed to the handler. Regardless of the outcome of the handler, the container is eventually terminated.
+ // +optional
+ PreStop *Handler
+}
+
+// The below types are used by kube_client and api_server.
+
+type ConditionStatus string
+
+// These are valid condition statuses. "ConditionTrue" means a resource is in the condition;
+// "ConditionFalse" means a resource is not in the condition; "ConditionUnknown" means kubernetes
+// can't decide if a resource is in the condition or not. In the future, we could add other
+// intermediate conditions, e.g. ConditionDegraded.
+const (
+ ConditionTrue ConditionStatus = "True"
+ ConditionFalse ConditionStatus = "False"
+ ConditionUnknown ConditionStatus = "Unknown"
+)
+
+type ContainerStateWaiting struct {
+ // A brief CamelCase string indicating details about why the container is in waiting state.
+ // +optional
+ Reason string
+ // A human-readable message indicating details about why the container is in waiting state.
+ // +optional
+ Message string
+}
+
+type ContainerStateRunning struct {
+ // +optional
+ StartedAt metav1.Time
+}
+
+type ContainerStateTerminated struct {
+ ExitCode int32
+ // +optional
+ Signal int32
+ // +optional
+ Reason string
+ // +optional
+ Message string
+ // +optional
+ StartedAt metav1.Time
+ // +optional
+ FinishedAt metav1.Time
+ // +optional
+ ContainerID string
+}
+
+// ContainerState holds a possible state of container.
+// Only one of its members may be specified.
+// If none of them is specified, the default one is ContainerStateWaiting.
+type ContainerState struct {
+ // +optional
+ Waiting *ContainerStateWaiting
+ // +optional
+ Running *ContainerStateRunning
+ // +optional
+ Terminated *ContainerStateTerminated
+}
+
+type ContainerStatus struct {
+ // Each container in a pod must have a unique name.
+ Name string
+ // +optional
+ State ContainerState
+ // +optional
+ LastTerminationState ContainerState
+ // Ready specifies whether the container has passed its readiness check.
+ Ready bool
+ // Note that this is calculated from dead containers. But those containers are subject to
+ // garbage collection. This value will get capped at 5 by GC.
+ RestartCount int32
+ Image string
+ ImageID string
+ // +optional
+ ContainerID string
+}
+
+// PodPhase is a label for the condition of a pod at the current time.
+type PodPhase string
+
+// These are the valid statuses of pods.
+const (
+ // PodPending means the pod has been accepted by the system, but one or more of the containers
+ // has not been started. This includes time before being bound to a node, as well as time spent
+ // pulling images onto the host.
+ PodPending PodPhase = "Pending"
+ // PodRunning means the pod has been bound to a node and all of the containers have been started.
+ // At least one container is still running or is in the process of being restarted.
+ PodRunning PodPhase = "Running"
+ // PodSucceeded means that all containers in the pod have voluntarily terminated
+ // with a container exit code of 0, and the system is not going to restart any of these containers.
+ PodSucceeded PodPhase = "Succeeded"
+ // PodFailed means that all containers in the pod have terminated, and at least one container has
+ // terminated in a failure (exited with a non-zero exit code or was stopped by the system).
+ PodFailed PodPhase = "Failed"
+ // PodUnknown means that for some reason the state of the pod could not be obtained, typically due
+ // to an error in communicating with the host of the pod.
+ PodUnknown PodPhase = "Unknown"
+)
+
+type PodConditionType string
+
+// These are valid conditions of pod.
+const (
+ // PodScheduled represents status of the scheduling process for this pod.
+ PodScheduled PodConditionType = "PodScheduled"
+ // PodReady means the pod is able to service requests and should be added to the
+ // load balancing pools of all matching services.
+ PodReady PodConditionType = "Ready"
+ // PodInitialized means that all init containers in the pod have started successfully.
+ PodInitialized PodConditionType = "Initialized"
+ // PodReasonUnschedulable reason in PodScheduled PodCondition means that the scheduler
+ // can't schedule the pod right now, for example due to insufficient resources in the cluster.
+ PodReasonUnschedulable = "Unschedulable"
+)
+
+type PodCondition struct {
+ Type PodConditionType
+ Status ConditionStatus
+ // +optional
+ LastProbeTime metav1.Time
+ // +optional
+ LastTransitionTime metav1.Time
+ // +optional
+ Reason string
+ // +optional
+ Message string
+}
+
+// RestartPolicy describes how the container should be restarted.
+// Only one of the following restart policies may be specified.
+// If none of the following policies is specified, the default one
+// is RestartPolicyAlways.
+type RestartPolicy string
+
+const (
+ RestartPolicyAlways RestartPolicy = "Always"
+ RestartPolicyOnFailure RestartPolicy = "OnFailure"
+ RestartPolicyNever RestartPolicy = "Never"
+)
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PodList is a list of Pods.
+type PodList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ Items []Pod
+}
+
+// DNSPolicy defines how a pod's DNS will be configured.
+type DNSPolicy string
+
+const (
+ // DNSClusterFirstWithHostNet indicates that the pod should use cluster DNS
+ // first, if it is available, then fall back on the default
+ // (as determined by kubelet) DNS settings.
+ DNSClusterFirstWithHostNet DNSPolicy = "ClusterFirstWithHostNet"
+
+ // DNSClusterFirst indicates that the pod should use cluster DNS
+ // first unless hostNetwork is true, if it is available, then
+ // fall back on the default (as determined by kubelet) DNS settings.
+ DNSClusterFirst DNSPolicy = "ClusterFirst"
+
+ // DNSDefault indicates that the pod should use the default (as
+ // determined by kubelet) DNS settings.
+ DNSDefault DNSPolicy = "Default"
+
+ // DNSNone indicates that the pod should use empty DNS settings. DNS
+ // parameters such as nameservers and search paths should be defined via
+ // DNSConfig.
+ DNSNone DNSPolicy = "None"
+)
+
+// A node selector represents the union of the results of one or more label queries
+// over a set of nodes; that is, it represents the OR of the selectors represented
+// by the node selector terms.
+type NodeSelector struct {
+ //Required. A list of node selector terms. The terms are ORed.
+ NodeSelectorTerms []NodeSelectorTerm
+}
+
+// A null or empty node selector term matches no objects.
+type NodeSelectorTerm struct {
+ //Required. A list of node selector requirements. The requirements are ANDed.
+ MatchExpressions []NodeSelectorRequirement
+}
+
+// A node selector requirement is a selector that contains values, a key, and an operator
+// that relates the key and values.
+type NodeSelectorRequirement struct {
+ // The label key that the selector applies to.
+ Key string
+ // Represents a key's relationship to a set of values.
+ // Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
+ Operator NodeSelectorOperator
+ // An array of string values. If the operator is In or NotIn,
+ // the values array must be non-empty. If the operator is Exists or DoesNotExist,
+ // the values array must be empty. If the operator is Gt or Lt, the values
+ // array must have a single element, which will be interpreted as an integer.
+ // This array is replaced during a strategic merge patch.
+ // +optional
+ Values []string
+}
+
+// A node selector operator is the set of operators that can be used in
+// a node selector requirement.
+type NodeSelectorOperator string
+
+const (
+ NodeSelectorOpIn NodeSelectorOperator = "In"
+ NodeSelectorOpNotIn NodeSelectorOperator = "NotIn"
+ NodeSelectorOpExists NodeSelectorOperator = "Exists"
+ NodeSelectorOpDoesNotExist NodeSelectorOperator = "DoesNotExist"
+ NodeSelectorOpGt NodeSelectorOperator = "Gt"
+ NodeSelectorOpLt NodeSelectorOperator = "Lt"
+)
+
+// Affinity is a group of affinity scheduling rules.
+type Affinity struct {
+ // Describes node affinity scheduling rules for the pod.
+ // +optional
+ NodeAffinity *NodeAffinity
+ // Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).
+ // +optional
+ PodAffinity *PodAffinity
+ // Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).
+ // +optional
+ PodAntiAffinity *PodAntiAffinity
+}
+
+// Pod affinity is a group of inter pod affinity scheduling rules.
+type PodAffinity struct {
+ // NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented.
+ // If the affinity requirements specified by this field are not met at
+ // scheduling time, the pod will not be scheduled onto the node.
+ // If the affinity requirements specified by this field cease to be met
+ // at some point during pod execution (e.g. due to a pod label update), the
+ // system will try to eventually evict the pod from its node.
+ // When there are multiple elements, the lists of nodes corresponding to each
+ // podAffinityTerm are intersected, i.e. all terms must be satisfied.
+ // +optional
+ // RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm
+
+ // If the affinity requirements specified by this field are not met at
+ // scheduling time, the pod will not be scheduled onto the node.
+ // If the affinity requirements specified by this field cease to be met
+ // at some point during pod execution (e.g. due to a pod label update), the
+ // system may or may not try to eventually evict the pod from its node.
+ // When there are multiple elements, the lists of nodes corresponding to each
+ // podAffinityTerm are intersected, i.e. all terms must be satisfied.
+ // +optional
+ RequiredDuringSchedulingIgnoredDuringExecution []PodAffinityTerm
+ // The scheduler will prefer to schedule pods to nodes that satisfy
+ // the affinity expressions specified by this field, but it may choose
+ // a node that violates one or more of the expressions. The node that is
+ // most preferred is the one with the greatest sum of weights, i.e.
+ // for each node that meets all of the scheduling requirements (resource
+ // request, requiredDuringScheduling affinity expressions, etc.),
+ // compute a sum by iterating through the elements of this field and adding
+ // "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the
+ // node(s) with the highest sum are the most preferred.
+ // +optional
+ PreferredDuringSchedulingIgnoredDuringExecution []WeightedPodAffinityTerm
+}
+
+// Pod anti affinity is a group of inter pod anti affinity scheduling rules.
+type PodAntiAffinity struct {
+ // NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented.
+ // If the anti-affinity requirements specified by this field are not met at
+ // scheduling time, the pod will not be scheduled onto the node.
+ // If the anti-affinity requirements specified by this field cease to be met
+ // at some point during pod execution (e.g. due to a pod label update), the
+ // system will try to eventually evict the pod from its node.
+ // When there are multiple elements, the lists of nodes corresponding to each
+ // podAffinityTerm are intersected, i.e. all terms must be satisfied.
+ // +optional
+ // RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm
+
+ // If the anti-affinity requirements specified by this field are not met at
+ // scheduling time, the pod will not be scheduled onto the node.
+ // If the anti-affinity requirements specified by this field cease to be met
+ // at some point during pod execution (e.g. due to a pod label update), the
+ // system may or may not try to eventually evict the pod from its node.
+ // When there are multiple elements, the lists of nodes corresponding to each
+ // podAffinityTerm are intersected, i.e. all terms must be satisfied.
+ // +optional
+ RequiredDuringSchedulingIgnoredDuringExecution []PodAffinityTerm
+ // The scheduler will prefer to schedule pods to nodes that satisfy
+ // the anti-affinity expressions specified by this field, but it may choose
+ // a node that violates one or more of the expressions. The node that is
+ // most preferred is the one with the greatest sum of weights, i.e.
+ // for each node that meets all of the scheduling requirements (resource
+ // request, requiredDuringScheduling anti-affinity expressions, etc.),
+ // compute a sum by iterating through the elements of this field and adding
+ // "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the
+ // node(s) with the highest sum are the most preferred.
+ // +optional
+ PreferredDuringSchedulingIgnoredDuringExecution []WeightedPodAffinityTerm
+}
+
+// The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)
+type WeightedPodAffinityTerm struct {
+ // weight associated with matching the corresponding podAffinityTerm,
+ // in the range 1-100.
+ Weight int32
+ // Required. A pod affinity term, associated with the corresponding weight.
+ PodAffinityTerm PodAffinityTerm
+}
+
+// Defines a set of pods (namely those matching the labelSelector
+// relative to the given namespace(s)) that this pod should be
+// co-located (affinity) or not co-located (anti-affinity) with,
+// where co-located is defined as running on a node whose value of
+// the label with key <topologyKey> matches that of any node on which
+// a pod of the set of pods is running.
+type PodAffinityTerm struct {
+ // A label query over a set of resources, in this case pods.
+ // +optional
+ LabelSelector *metav1.LabelSelector
+ // namespaces specifies which namespaces the labelSelector applies to (matches against);
+ // null or empty list means "this pod's namespace"
+ // +optional
+ Namespaces []string
+ // This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching
+ // the labelSelector in the specified namespaces, where co-located is defined as running on a node
+ // whose value of the label with key topologyKey matches that of any node on which any of the
+ // selected pods is running.
+ // Empty topologyKey is not allowed.
+ TopologyKey string
+}
+
+// Node affinity is a group of node affinity scheduling rules.
+type NodeAffinity struct {
+ // NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented.
+ // If the affinity requirements specified by this field are not met at
+ // scheduling time, the pod will not be scheduled onto the node.
+ // If the affinity requirements specified by this field cease to be met
+ // at some point during pod execution (e.g. due to an update), the system
+ // will try to eventually evict the pod from its node.
+ // +optional
+ // RequiredDuringSchedulingRequiredDuringExecution *NodeSelector
+
+ // If the affinity requirements specified by this field are not met at
+ // scheduling time, the pod will not be scheduled onto the node.
+ // If the affinity requirements specified by this field cease to be met
+ // at some point during pod execution (e.g. due to an update), the system
+ // may or may not try to eventually evict the pod from its node.
+ // +optional
+ RequiredDuringSchedulingIgnoredDuringExecution *NodeSelector
+ // The scheduler will prefer to schedule pods to nodes that satisfy
+ // the affinity expressions specified by this field, but it may choose
+ // a node that violates one or more of the expressions. The node that is
+ // most preferred is the one with the greatest sum of weights, i.e.
+ // for each node that meets all of the scheduling requirements (resource
+ // request, requiredDuringScheduling affinity expressions, etc.),
+ // compute a sum by iterating through the elements of this field and adding
+ // "weight" to the sum if the node matches the corresponding matchExpressions; the
+ // node(s) with the highest sum are the most preferred.
+ // +optional
+ PreferredDuringSchedulingIgnoredDuringExecution []PreferredSchedulingTerm
+}
+
+// An empty preferred scheduling term matches all objects with implicit weight 0
+// (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).
+type PreferredSchedulingTerm struct {
+ // Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.
+ Weight int32
+ // A node selector term, associated with the corresponding weight.
+ Preference NodeSelectorTerm
+}
+
+// The node this Taint is attached to has the "effect" on
+// any pod that does not tolerate the Taint.
+type Taint struct {
+ // Required. The taint key to be applied to a node.
+ Key string
+ // Required. The taint value corresponding to the taint key.
+ // +optional
+ Value string
+ // Required. The effect of the taint on pods
+ // that do not tolerate the taint.
+ // Valid effects are NoSchedule, PreferNoSchedule and NoExecute.
+ Effect TaintEffect
+ // TimeAdded represents the time at which the taint was added.
+ // It is only written for NoExecute taints.
+ // +optional
+ TimeAdded *metav1.Time
+}
+
+type TaintEffect string
+
+const (
+ // Do not allow new pods to schedule onto the node unless they tolerate the taint,
+ // but allow all pods submitted to Kubelet without going through the scheduler
+ // to start, and allow all already-running pods to continue running.
+ // Enforced by the scheduler.
+ TaintEffectNoSchedule TaintEffect = "NoSchedule"
+ // Like TaintEffectNoSchedule, but the scheduler tries not to schedule
+ // new pods onto the node, rather than prohibiting new pods from scheduling
+ // onto the node entirely. Enforced by the scheduler.
+ TaintEffectPreferNoSchedule TaintEffect = "PreferNoSchedule"
+ // NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented.
+ // Like TaintEffectNoSchedule, but additionally do not allow pods submitted to
+ // Kubelet without going through the scheduler to start.
+ // Enforced by Kubelet and the scheduler.
+ // TaintEffectNoScheduleNoAdmit TaintEffect = "NoScheduleNoAdmit"
+
+ // Evict any already-running pods that do not tolerate the taint.
+ // Currently enforced by NodeController.
+ TaintEffectNoExecute TaintEffect = "NoExecute"
+)
+
+// The pod this Toleration is attached to tolerates any taint that matches
+// the triple <key,value,effect> using the matching operator <operator>.
+type Toleration struct {
+ // Key is the taint key that the toleration applies to. Empty means match all taint keys.
+ // If the key is empty, operator must be Exists; this combination means to match all values and all keys.
+ // +optional
+ Key string
+ // Operator represents a key's relationship to the value.
+ // Valid operators are Exists and Equal. Defaults to Equal.
+ // Exists is equivalent to wildcard for value, so that a pod can
+ // tolerate all taints of a particular category.
+ // +optional
+ Operator TolerationOperator
+ // Value is the taint value the toleration matches to.
+ // If the operator is Exists, the value should be empty, otherwise just a regular string.
+ // +optional
+ Value string
+ // Effect indicates the taint effect to match. Empty means match all taint effects.
+ // When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.
+ // +optional
+ Effect TaintEffect
+ // TolerationSeconds represents the period of time the toleration (which must be
+ // of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,
+ // it is not set, which means tolerate the taint forever (do not evict). Zero and
+ // negative values will be treated as 0 (evict immediately) by the system.
+ // +optional
+ TolerationSeconds *int64
+}
+
+// A toleration operator is the set of operators that can be used in a toleration.
+type TolerationOperator string
+
+const (
+ TolerationOpExists TolerationOperator = "Exists"
+ TolerationOpEqual TolerationOperator = "Equal"
+)
+
+// PodSpec is a description of a pod
+type PodSpec struct {
+ Volumes []Volume
+ // List of initialization containers belonging to the pod.
+ InitContainers []Container
+ // List of containers belonging to the pod.
+ Containers []Container
+ // +optional
+ RestartPolicy RestartPolicy
+ // Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request.
+ // Value must be non-negative integer. The value zero indicates delete immediately.
+ // If this value is nil, the default grace period will be used instead.
+ // The grace period is the duration in seconds after the processes running in the pod are sent
+ // a termination signal and the time when the processes are forcibly halted with a kill signal.
+ // Set this value longer than the expected cleanup time for your process.
+ // +optional
+ TerminationGracePeriodSeconds *int64
+ // Optional duration in seconds relative to the StartTime that the pod may be active on a node
+ // before the system actively tries to terminate the pod; value must be positive integer
+ // +optional
+ ActiveDeadlineSeconds *int64
+ // Set DNS policy for the pod.
+ // Defaults to "ClusterFirst".
+ // Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'.
+ // DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy.
+ // To have DNS options set along with hostNetwork, you have to specify DNS policy
+ // explicitly to 'ClusterFirstWithHostNet'.
+ // +optional
+ DNSPolicy DNSPolicy
+ // NodeSelector is a selector which must be true for the pod to fit on a node
+ // +optional
+ NodeSelector map[string]string
+
+ // ServiceAccountName is the name of the ServiceAccount to use to run this pod
+ // The pod will be allowed to use secrets referenced by the ServiceAccount
+ ServiceAccountName string
+ // AutomountServiceAccountToken indicates whether a service account token should be automatically mounted.
+ // +optional
+ AutomountServiceAccountToken *bool
+
+ // NodeName is a request to schedule this pod onto a specific node. If it is non-empty,
+ // the scheduler simply schedules this pod onto that node, assuming that it fits resource
+ // requirements.
+ // +optional
+ NodeName string
+ // SecurityContext holds pod-level security attributes and common container settings.
+ // Optional: Defaults to empty. See type description for default values of each field.
+ // +optional
+ SecurityContext *PodSecurityContext
+ // ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec.
+ // If specified, these secrets will be passed to individual puller implementations for them to use. For example,
+ // in the case of docker, only DockerConfig type secrets are honored.
+ // +optional
+ ImagePullSecrets []LocalObjectReference
+ // Specifies the hostname of the Pod.
+ // If not specified, the pod's hostname will be set to a system-defined value.
+ // +optional
+ Hostname string
+ // If specified, the fully qualified Pod hostname will be "<hostname>.<subdomain>.<pod namespace>.svc.<cluster domain>".
+ // If not specified, the pod will not have a domainname at all.
+ // +optional
+ Subdomain string
+ // If specified, the pod's scheduling constraints
+ // +optional
+ Affinity *Affinity
+ // If specified, the pod will be dispatched by specified scheduler.
+ // If not specified, the pod will be dispatched by default scheduler.
+ // +optional
+ SchedulerName string
+ // If specified, the pod's tolerations.
+ // +optional
+ Tolerations []Toleration
+ // HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts
+ // file if specified. This is only valid for non-hostNetwork pods.
+ // +optional
+ HostAliases []HostAlias
+ // If specified, indicates the pod's priority. "system-node-critical" and
+ // "system-cluster-critical" are two special keywords which indicate the
+ // highest priorities with the former being the highest priority. Any other
+ // name must be defined by creating a PriorityClass object with that name.
+ // If not specified, the pod priority will be default or zero if there is no
+ // default.
+ // +optional
+ PriorityClassName string
+ // The priority value. Various system components use this field to find the
+ // priority of the pod. When Priority Admission Controller is enabled, it
+ // prevents users from setting this field. The admission controller populates
+ // this field from PriorityClassName.
+ // The higher the value, the higher the priority.
+ // +optional
+ Priority *int32
+ // Specifies the DNS parameters of a pod.
+ // Parameters specified here will be merged to the generated DNS
+ // configuration based on DNSPolicy.
+ // +optional
+ DNSConfig *PodDNSConfig
+}
+
+// HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the
+// pod's hosts file.
+type HostAlias struct {
+ IP string
+ Hostnames []string
+}
+
+// Sysctl defines a kernel parameter to be set
+type Sysctl struct {
+ // Name of a property to set
+ Name string
+ // Value of a property to set
+ Value string
+}
+
+// PodSecurityContext holds pod-level security attributes and common container settings.
+// Some fields are also present in container.securityContext. Field values of
+// container.securityContext take precedence over field values of PodSecurityContext.
+type PodSecurityContext struct {
+ // Use the host's network namespace. If this option is set, the ports that will be
+ // used must be specified.
+ // Optional: Default to false
+ // +k8s:conversion-gen=false
+ // +optional
+ HostNetwork bool
+ // Use the host's pid namespace.
+ // Optional: Default to false.
+ // +k8s:conversion-gen=false
+ // +optional
+ HostPID bool
+ // Use the host's ipc namespace.
+ // Optional: Default to false.
+ // +k8s:conversion-gen=false
+ // +optional
+ HostIPC bool
+ // Share a single process namespace between all of the containers in a pod.
+ // When this is set containers will be able to view and signal processes from other containers
+ // in the same pod, and the first process in each container will not be assigned PID 1.
+ // HostPID and ShareProcessNamespace cannot both be set.
+ // Optional: Default to false.
+ // This field is alpha-level and is honored only by servers that enable the PodShareProcessNamespace feature.
+ // +k8s:conversion-gen=false
+ // +optional
+ ShareProcessNamespace *bool
+ // The SELinux context to be applied to all containers.
+ // If unspecified, the container runtime will allocate a random SELinux context for each
+ // container. May also be set in SecurityContext. If set in
+ // both SecurityContext and PodSecurityContext, the value specified in SecurityContext
+ // takes precedence for that container.
+ // +optional
+ SELinuxOptions *SELinuxOptions
+ // The UID to run the entrypoint of the container process.
+ // Defaults to user specified in image metadata if unspecified.
+ // May also be set in SecurityContext. If set in both SecurityContext and
+ // PodSecurityContext, the value specified in SecurityContext takes precedence
+ // for that container.
+ // +optional
+ RunAsUser *int64
+ // Indicates that the container must run as a non-root user.
+ // If true, the Kubelet will validate the image at runtime to ensure that it
+ // does not run as UID 0 (root) and fail to start the container if it does.
+ // If unset or false, no such validation will be performed.
+ // May also be set in SecurityContext. If set in both SecurityContext and
+ // PodSecurityContext, the value specified in SecurityContext takes precedence.
+ // +optional
+ RunAsNonRoot *bool
+ // A list of groups applied to the first process run in each container, in addition
+ // to the container's primary GID. If unspecified, no groups will be added to
+ // any container.
+ // +optional
+ SupplementalGroups []int64
+ // A special supplemental group that applies to all containers in a pod.
+ // Some volume types allow the Kubelet to change the ownership of that volume
+ // to be owned by the pod:
+ //
+ // 1. The owning GID will be the FSGroup
+ // 2. The setgid bit is set (new files created in the volume will be owned by FSGroup)
+ // 3. The permission bits are OR'd with rw-rw----
+ //
+ // If unset, the Kubelet will not modify the ownership and permissions of any volume.
+ // +optional
+ FSGroup *int64
+}
+
+// PodQOSClass defines the supported qos classes of Pods.
+type PodQOSClass string
+
+const (
+ // PodQOSGuaranteed is the Guaranteed qos class.
+ PodQOSGuaranteed PodQOSClass = "Guaranteed"
+ // PodQOSBurstable is the Burstable qos class.
+ PodQOSBurstable PodQOSClass = "Burstable"
+ // PodQOSBestEffort is the BestEffort qos class.
+ PodQOSBestEffort PodQOSClass = "BestEffort"
+)
+
+// PodDNSConfig defines the DNS parameters of a pod in addition to
+// those generated from DNSPolicy.
+type PodDNSConfig struct {
+ // A list of DNS name server IP addresses.
+ // This will be appended to the base nameservers generated from DNSPolicy.
+ // Duplicated nameservers will be removed.
+ // +optional
+ Nameservers []string
+ // A list of DNS search domains for host-name lookup.
+ // This will be appended to the base search paths generated from DNSPolicy.
+ // Duplicated search paths will be removed.
+ // +optional
+ Searches []string
+ // A list of DNS resolver options.
+ // This will be merged with the base options generated from DNSPolicy.
+ // Duplicated entries will be removed. Resolution options given in Options
+ // will override those that appear in the base DNSPolicy.
+ // +optional
+ Options []PodDNSConfigOption
+}
+
+// PodDNSConfigOption defines DNS resolver options of a pod.
+type PodDNSConfigOption struct {
+ // Required.
+ Name string
+ // +optional
+ Value *string
+}
+
+// PodStatus represents information about the status of a pod. Status may trail the actual
+// state of a system.
+type PodStatus struct {
+ // +optional
+ Phase PodPhase
+ // +optional
+ Conditions []PodCondition
+ // A human readable message indicating details about why the pod is in this state.
+ // +optional
+ Message string
+ // A brief CamelCase message indicating details about why the pod is in this state. e.g. 'Evicted'
+ // +optional
+ Reason string
+ // nominatedNodeName is set when this pod preempts other pods on the node, but it cannot be
+ // scheduled right away as preemption victims receive their graceful termination periods.
+ // This field does not guarantee that the pod will be scheduled on this node. Scheduler may decide
+ // to place the pod elsewhere if other nodes become available sooner. Scheduler may also decide to
+ // give the resources on this node to a higher priority pod that is created after preemption.
+ // +optional
+ NominatedNodeName string
+
+ // +optional
+ HostIP string
+ // +optional
+ PodIP string
+
+ // Date and time at which the object was acknowledged by the Kubelet.
+ // This is before the Kubelet pulled the container image(s) for the pod.
+ // +optional
+ StartTime *metav1.Time
+ // +optional
+ QOSClass PodQOSClass
+
+ // The list has one entry per init container in the manifest. The most recent successful
+ // init container will have ready = true, the most recently started container will have
+ // startTime set.
+ // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-and-container-status
+ InitContainerStatuses []ContainerStatus
+ // The list has one entry per container in the manifest. Each entry is
+ // currently the output of `docker inspect`. This output format is *not*
+ // final and should not be relied upon.
+ // TODO: Make real decisions about what our info should look like. Re-enable fuzz test
+ // when we have done this.
+ // +optional
+ ContainerStatuses []ContainerStatus
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PodStatusResult is a wrapper for PodStatus returned by kubelet that can be encode/decoded
+type PodStatusResult struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+ // Status represents the current information about a pod. This data may not be up
+ // to date.
+ // +optional
+ Status PodStatus
+}
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Pod is a collection of containers, used as either input (create, update) or as output (list, get).
+type Pod struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // Spec defines the behavior of a pod.
+ // +optional
+ Spec PodSpec
+
+ // Status represents the current information about a pod. This data may not be up
+ // to date.
+ // +optional
+ Status PodStatus
+}
+
+// PodTemplateSpec describes the data a pod should have when created from a template
+type PodTemplateSpec struct {
+ // Metadata of the pods created from this template.
+ // +optional
+ metav1.ObjectMeta
+
+ // Spec defines the behavior of a pod.
+ // +optional
+ Spec PodSpec
+}
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PodTemplate describes a template for creating copies of a predefined pod.
+type PodTemplate struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // Template defines the pods that will be created from this pod template
+ // +optional
+ Template PodTemplateSpec
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PodTemplateList is a list of PodTemplates.
+type PodTemplateList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ Items []PodTemplate
+}
+
+// ReplicationControllerSpec is the specification of a replication controller.
+// As the internal representation of a replication controller, it may have either
+// a TemplateRef or a Template set.
+type ReplicationControllerSpec struct {
+ // Replicas is the number of desired replicas.
+ Replicas int32
+
+ // Minimum number of seconds for which a newly created pod should be ready
+ // without any of its container crashing, for it to be considered available.
+ // Defaults to 0 (pod will be considered available as soon as it is ready)
+ // +optional
+ MinReadySeconds int32
+
+ // Selector is a label query over pods that should match the Replicas count.
+ Selector map[string]string
+
+ // TemplateRef is a reference to an object that describes the pod that will be created if
+ // insufficient replicas are detected. This reference is ignored if a Template is set.
+ // Must be set before converting to a versioned API object
+ // +optional
+ //TemplateRef *ObjectReference
+
+ // Template is the object that describes the pod that will be created if
+ // insufficient replicas are detected. Internally, this takes precedence over a
+ // TemplateRef.
+ // +optional
+ Template *PodTemplateSpec
+}
+
+// ReplicationControllerStatus represents the current status of a replication
+// controller.
+type ReplicationControllerStatus struct {
+ // Replicas is the number of actual replicas.
+ Replicas int32
+
+ // The number of pods that have labels matching the labels of the pod template of the replication controller.
+ // +optional
+ FullyLabeledReplicas int32
+
+ // The number of ready replicas for this replication controller.
+ // +optional
+ ReadyReplicas int32
+
+ // The number of available replicas (ready for at least minReadySeconds) for this replication controller.
+ // +optional
+ AvailableReplicas int32
+
+ // ObservedGeneration is the most recent generation observed by the controller.
+ // +optional
+ ObservedGeneration int64
+
+ // Represents the latest available observations of a replication controller's current state.
+ // +optional
+ Conditions []ReplicationControllerCondition
+}
+
+type ReplicationControllerConditionType string
+
+// These are valid conditions of a replication controller.
+const (
+ // ReplicationControllerReplicaFailure is added in a replication controller when one of its pods
+ // fails to be created due to insufficient quota, limit ranges, pod security policy, node selectors,
+ // etc. or deleted due to kubelet being down or finalizers are failing.
+ ReplicationControllerReplicaFailure ReplicationControllerConditionType = "ReplicaFailure"
+)
+
+// ReplicationControllerCondition describes the state of a replication controller at a certain point.
+type ReplicationControllerCondition struct {
+ // Type of replication controller condition.
+ Type ReplicationControllerConditionType
+ // Status of the condition, one of True, False, Unknown.
+ Status ConditionStatus
+ // The last time the condition transitioned from one status to another.
+ // +optional
+ LastTransitionTime metav1.Time
+ // The reason for the condition's last transition.
+ // +optional
+ Reason string
+ // A human readable message indicating details about the transition.
+ // +optional
+ Message string
+}
+
+// +genclient
+// +genclient:method=GetScale,verb=get,subresource=scale,result=k8s.io/kubernetes/pkg/apis/autoscaling.Scale
+// +genclient:method=UpdateScale,verb=update,subresource=scale,input=k8s.io/kubernetes/pkg/apis/autoscaling.Scale,result=k8s.io/kubernetes/pkg/apis/autoscaling.Scale
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// ReplicationController represents the configuration of a replication controller.
+type ReplicationController struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // Spec defines the desired behavior of this replication controller.
+ // +optional
+ Spec ReplicationControllerSpec
+
+ // Status is the current status of this replication controller. This data may be
+ // out of date by some window of time.
+ // +optional
+ Status ReplicationControllerStatus
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// ReplicationControllerList is a collection of replication controllers.
+type ReplicationControllerList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ Items []ReplicationController
+}
+
+const (
+ // ClusterIPNone - do not assign a cluster IP
+ // no proxying required and no environment variables should be created for pods
+ ClusterIPNone = "None"
+)
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// ServiceList holds a list of services.
+type ServiceList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ Items []Service
+}
+
+// Session Affinity Type string
+type ServiceAffinity string
+
+const (
+ // ServiceAffinityClientIP is the Client IP based.
+ ServiceAffinityClientIP ServiceAffinity = "ClientIP"
+
+ // ServiceAffinityNone - no session affinity.
+ ServiceAffinityNone ServiceAffinity = "None"
+)
+
+const (
+ // DefaultClientIPServiceAffinitySeconds is the default timeout seconds
+ // of Client IP based session affinity - 3 hours.
+ DefaultClientIPServiceAffinitySeconds int32 = 10800
+ // MaxClientIPServiceAffinitySeconds is the max timeout seconds
+ // of Client IP based session affinity - 1 day.
+ MaxClientIPServiceAffinitySeconds int32 = 86400
+)
+
+// SessionAffinityConfig represents the configurations of session affinity.
+type SessionAffinityConfig struct {
+ // clientIP contains the configurations of Client IP based session affinity.
+ // +optional
+ ClientIP *ClientIPConfig
+}
+
+// ClientIPConfig represents the configurations of Client IP based session affinity.
+type ClientIPConfig struct {
+ // timeoutSeconds specifies the seconds of ClientIP type session sticky time.
+ // The value must be >0 && <=86400(for 1 day) if ServiceAffinity == "ClientIP".
+ // Default value is 10800(for 3 hours).
+ // +optional
+ TimeoutSeconds *int32
+}
+
+// Service Type string describes ingress methods for a service
+type ServiceType string
+
+const (
+ // ServiceTypeClusterIP means a service will only be accessible inside the
+ // cluster, via the ClusterIP.
+ ServiceTypeClusterIP ServiceType = "ClusterIP"
+
+ // ServiceTypeNodePort means a service will be exposed on one port of
+ // every node, in addition to 'ClusterIP' type.
+ ServiceTypeNodePort ServiceType = "NodePort"
+
+ // ServiceTypeLoadBalancer means a service will be exposed via an
+ // external load balancer (if the cloud provider supports it), in addition
+ // to 'NodePort' type.
+ ServiceTypeLoadBalancer ServiceType = "LoadBalancer"
+
+ // ServiceTypeExternalName means a service consists of only a reference to
+ // an external name that kubedns or equivalent will return as a CNAME
+ // record, with no exposing or proxying of any pods involved.
+ ServiceTypeExternalName ServiceType = "ExternalName"
+)
+
+// Service External Traffic Policy Type string
+type ServiceExternalTrafficPolicyType string
+
+const (
+ // ServiceExternalTrafficPolicyTypeLocal specifies node-local endpoints behavior.
+ ServiceExternalTrafficPolicyTypeLocal ServiceExternalTrafficPolicyType = "Local"
+ // ServiceExternalTrafficPolicyTypeCluster specifies cluster-wide (legacy) behavior.
+ ServiceExternalTrafficPolicyTypeCluster ServiceExternalTrafficPolicyType = "Cluster"
+)
+
+// ServiceStatus represents the current status of a service
+type ServiceStatus struct {
+ // LoadBalancer contains the current status of the load-balancer,
+ // if one is present.
+ // +optional
+ LoadBalancer LoadBalancerStatus
+}
+
+// LoadBalancerStatus represents the status of a load-balancer
+type LoadBalancerStatus struct {
+ // Ingress is a list containing ingress points for the load-balancer;
+ // traffic intended for the service should be sent to these ingress points.
+ // +optional
+ Ingress []LoadBalancerIngress
+}
+
+// LoadBalancerIngress represents the status of a load-balancer ingress point:
+// traffic intended for the service should be sent to an ingress point.
+type LoadBalancerIngress struct {
+ // IP is set for load-balancer ingress points that are IP based
+ // (typically GCE or OpenStack load-balancers)
+ // +optional
+ IP string
+
+ // Hostname is set for load-balancer ingress points that are DNS based
+ // (typically AWS load-balancers)
+ // +optional
+ Hostname string
+}
+
+// ServiceSpec describes the attributes that a user creates on a service
+type ServiceSpec struct {
+ // Type determines how the Service is exposed. Defaults to ClusterIP. Valid
+ // options are ExternalName, ClusterIP, NodePort, and LoadBalancer.
+ // "ExternalName" maps to the specified externalName.
+ // "ClusterIP" allocates a cluster-internal IP address for load-balancing to
+ // endpoints. Endpoints are determined by the selector or if that is not
+ // specified, by manual construction of an Endpoints object. If clusterIP is
+ // "None", no virtual IP is allocated and the endpoints are published as a
+ // set of endpoints rather than a stable IP.
+ // "NodePort" builds on ClusterIP and allocates a port on every node which
+ // routes to the clusterIP.
+ // "LoadBalancer" builds on NodePort and creates an
+ // external load-balancer (if supported in the current cloud) which routes
+ // to the clusterIP.
+ // More info: https://kubernetes.io/docs/concepts/services-networking/service/
+ // +optional
+ Type ServiceType
+
+ // Required: The list of ports that are exposed by this service.
+ Ports []ServicePort
+
+ // Route service traffic to pods with label keys and values matching this
+ // selector. If empty or not present, the service is assumed to have an
+ // external process managing its endpoints, which Kubernetes will not
+ // modify. Only applies to types ClusterIP, NodePort, and LoadBalancer.
+ // Ignored if type is ExternalName.
+ // More info: https://kubernetes.io/docs/concepts/services-networking/service/
+ Selector map[string]string
+
+ // ClusterIP is the IP address of the service and is usually assigned
+ // randomly by the master. If an address is specified manually and is not in
+ // use by others, it will be allocated to the service; otherwise, creation
+ // of the service will fail. This field can not be changed through updates.
+ // Valid values are "None", empty string (""), or a valid IP address. "None"
+ // can be specified for headless services when proxying is not required.
+ // Only applies to types ClusterIP, NodePort, and LoadBalancer. Ignored if
+ // type is ExternalName.
+ // More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies
+ // +optional
+ ClusterIP string
+
+ // ExternalName is the external reference that kubedns or equivalent will
+ // return as a CNAME record for this service. No proxying will be involved.
+ // Must be a valid RFC-1123 hostname (https://tools.ietf.org/html/rfc1123)
+ // and requires Type to be ExternalName.
+ ExternalName string
+
+ // ExternalIPs are used by external load balancers, or can be set by
+ // users to handle external traffic that arrives at a node.
+ // +optional
+ ExternalIPs []string
+
+ // Only applies to Service Type: LoadBalancer
+ // LoadBalancer will get created with the IP specified in this field.
+ // This feature depends on whether the underlying cloud-provider supports specifying
+ // the loadBalancerIP when a load balancer is created.
+ // This field will be ignored if the cloud-provider does not support the feature.
+ // +optional
+ LoadBalancerIP string
+
+ // Optional: Supports "ClientIP" and "None". Used to maintain session affinity.
+ // +optional
+ SessionAffinity ServiceAffinity
+
+ // sessionAffinityConfig contains the configurations of session affinity.
+ // +optional
+ SessionAffinityConfig *SessionAffinityConfig
+
+ // Optional: If specified and supported by the platform, this will restrict traffic through the cloud-provider
+ // load-balancer will be restricted to the specified client IPs. This field will be ignored if the
+ // cloud-provider does not support the feature."
+ // +optional
+ LoadBalancerSourceRanges []string
+
+ // externalTrafficPolicy denotes if this Service desires to route external
+ // traffic to node-local or cluster-wide endpoints. "Local" preserves the
+ // client source IP and avoids a second hop for LoadBalancer and Nodeport
+ // type services, but risks potentially imbalanced traffic spreading.
+ // "Cluster" obscures the client source IP and may cause a second hop to
+ // another node, but should have good overall load-spreading.
+ // +optional
+ ExternalTrafficPolicy ServiceExternalTrafficPolicyType
+
+ // healthCheckNodePort specifies the healthcheck nodePort for the service.
+ // If not specified, HealthCheckNodePort is created by the service api
+ // backend with the allocated nodePort. Will use user-specified nodePort value
+ // if specified by the client. Only effects when Type is set to LoadBalancer
+ // and ExternalTrafficPolicy is set to Local.
+ // +optional
+ HealthCheckNodePort int32
+
+ // publishNotReadyAddresses, when set to true, indicates that DNS implementations
+ // must publish the notReadyAddresses of subsets for the Endpoints associated with
+ // the Service. The default value is false.
+ // The primary use case for setting this field is to use a StatefulSet's Headless Service
+ // to propagate SRV records for its Pods without respect to their readiness for purpose
+ // of peer discovery.
+ // This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints
+ // when that annotation is deprecated and all clients have been converted to use this
+ // field.
+ // +optional
+ PublishNotReadyAddresses bool
+}
+
+type ServicePort struct {
+ // Optional if only one ServicePort is defined on this service: The
+ // name of this port within the service. This must be a DNS_LABEL.
+ // All ports within a ServiceSpec must have unique names. This maps to
+ // the 'Name' field in EndpointPort objects.
+ Name string
+
+ // The IP protocol for this port. Supports "TCP" and "UDP".
+ Protocol Protocol
+
+ // The port that will be exposed on the service.
+ Port int32
+
+ // Optional: The target port on pods selected by this service. If this
+ // is a string, it will be looked up as a named port in the target
+ // Pod's container ports. If this is not specified, the value
+ // of the 'port' field is used (an identity map).
+ // This field is ignored for services with clusterIP=None, and should be
+ // omitted or set equal to the 'port' field.
+ TargetPort intstr.IntOrString
+
+ // The port on each node on which this service is exposed.
+ // Default is to auto-allocate a port if the ServiceType of this Service requires one.
+ NodePort int32
+}
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Service is a named abstraction of software service (for example, mysql) consisting of local port
+// (for example 3306) that the proxy listens on, and the selector that determines which pods
+// will answer requests sent through the proxy.
+type Service struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // Spec defines the behavior of a service.
+ // +optional
+ Spec ServiceSpec
+
+ // Status represents the current status of a service.
+ // +optional
+ Status ServiceStatus
+}
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// ServiceAccount binds together:
+// * a name, understood by users, and perhaps by peripheral systems, for an identity
+// * a principal that can be authenticated and authorized
+// * a set of secrets
+type ServiceAccount struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // Secrets is the list of secrets allowed to be used by pods running using this ServiceAccount
+ Secrets []ObjectReference
+
+ // ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images
+ // in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets
+ // can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet.
+ // +optional
+ ImagePullSecrets []LocalObjectReference
+
+ // AutomountServiceAccountToken indicates whether pods running as this service account should have an API token automatically mounted.
+ // Can be overridden at the pod level.
+ // +optional
+ AutomountServiceAccountToken *bool
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// ServiceAccountList is a list of ServiceAccount objects
+type ServiceAccountList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ Items []ServiceAccount
+}
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Endpoints is a collection of endpoints that implement the actual service. Example:
+// Name: "mysvc",
+// Subsets: [
+// {
+// Addresses: [{"ip": "10.10.1.1"}, {"ip": "10.10.2.2"}],
+// Ports: [{"name": "a", "port": 8675}, {"name": "b", "port": 309}]
+// },
+// {
+// Addresses: [{"ip": "10.10.3.3"}],
+// Ports: [{"name": "a", "port": 93}, {"name": "b", "port": 76}]
+// },
+// ]
+type Endpoints struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // The set of all endpoints is the union of all subsets.
+ Subsets []EndpointSubset
+}
+
+// EndpointSubset is a group of addresses with a common set of ports. The
+// expanded set of endpoints is the Cartesian product of Addresses x Ports.
+// For example, given:
+// {
+// Addresses: [{"ip": "10.10.1.1"}, {"ip": "10.10.2.2"}],
+// Ports: [{"name": "a", "port": 8675}, {"name": "b", "port": 309}]
+// }
+// The resulting set of endpoints can be viewed as:
+// a: [ 10.10.1.1:8675, 10.10.2.2:8675 ],
+// b: [ 10.10.1.1:309, 10.10.2.2:309 ]
+type EndpointSubset struct {
+ Addresses []EndpointAddress
+ NotReadyAddresses []EndpointAddress
+ Ports []EndpointPort
+}
+
+// EndpointAddress is a tuple that describes single IP address.
+type EndpointAddress struct {
+ // The IP of this endpoint.
+ // IPv6 is also accepted but not fully supported on all platforms. Also, certain
+ // kubernetes components, like kube-proxy, are not IPv6 ready.
+ // TODO: This should allow hostname or IP, see #4447.
+ IP string
+ // Optional: Hostname of this endpoint
+ // Meant to be used by DNS servers etc.
+ // +optional
+ Hostname string
+ // Optional: Node hosting this endpoint. This can be used to determine endpoints local to a node.
+ // +optional
+ NodeName *string
+ // Optional: The kubernetes object related to the entry point.
+ TargetRef *ObjectReference
+}
+
+// EndpointPort is a tuple that describes a single port.
+type EndpointPort struct {
+ // The name of this port (corresponds to ServicePort.Name). Optional
+ // if only one port is defined. Must be a DNS_LABEL.
+ Name string
+
+ // The port number.
+ Port int32
+
+ // The IP protocol for this port.
+ Protocol Protocol
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// EndpointsList is a list of endpoints.
+type EndpointsList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ Items []Endpoints
+}
+
+// NodeSpec describes the attributes that a node is created with.
+type NodeSpec struct {
+ // PodCIDR represents the pod IP range assigned to the node
+ // Note: assigning IP ranges to nodes might need to be revisited when we support migratable IPs.
+ // +optional
+ PodCIDR string
+
+ // External ID of the node assigned by some machine database (e.g. a cloud provider)
+ // +optional
+ ExternalID string
+
+ // ID of the node assigned by the cloud provider
+ // Note: format is "<ProviderName>://<ProviderSpecificNodeID>"
+ // +optional
+ ProviderID string
+
+ // Unschedulable controls node schedulability of new pods. By default node is schedulable.
+ // +optional
+ Unschedulable bool
+
+ // If specified, the node's taints.
+ // +optional
+ Taints []Taint
+
+ // If specified, the source to get node configuration from
+ // The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field
+ // +optional
+ ConfigSource *NodeConfigSource
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// NodeConfigSource specifies a source of node configuration. Exactly one subfield must be non-nil.
+type NodeConfigSource struct {
+ metav1.TypeMeta
+ ConfigMapRef *ObjectReference
+}
+
+// DaemonEndpoint contains information about a single Daemon endpoint.
+type DaemonEndpoint struct {
+ /*
+ The port tag was not properly in quotes in earlier releases, so it must be
+ uppercase for backwards compatibility (since it was falling back to var name of
+ 'Port').
+ */
+
+ // Port number of the given endpoint.
+ Port int32
+}
+
+// NodeDaemonEndpoints lists ports opened by daemons running on the Node.
+type NodeDaemonEndpoints struct {
+ // Endpoint on which Kubelet is listening.
+ // +optional
+ KubeletEndpoint DaemonEndpoint
+}
+
+// NodeSystemInfo is a set of ids/uuids to uniquely identify the node.
+type NodeSystemInfo struct {
+ // MachineID reported by the node. For unique machine identification
+ // in the cluster this field is preferred. Learn more from man(5)
+ // machine-id: http://man7.org/linux/man-pages/man5/machine-id.5.html
+ MachineID string
+ // SystemUUID reported by the node. For unique machine identification
+ // MachineID is preferred. This field is specific to Red Hat hosts
+ // https://access.redhat.com/documentation/en-US/Red_Hat_Subscription_Management/1/html/RHSM/getting-system-uuid.html
+ SystemUUID string
+ // Boot ID reported by the node.
+ BootID string
+ // Kernel Version reported by the node.
+ KernelVersion string
+ // OS Image reported by the node.
+ OSImage string
+ // ContainerRuntime Version reported by the node.
+ ContainerRuntimeVersion string
+ // Kubelet Version reported by the node.
+ KubeletVersion string
+ // KubeProxy Version reported by the node.
+ KubeProxyVersion string
+ // The Operating System reported by the node
+ OperatingSystem string
+ // The Architecture reported by the node
+ Architecture string
+}
+
+// NodeStatus is information about the current status of a node.
+type NodeStatus struct {
+ // Capacity represents the total resources of a node.
+ // +optional
+ Capacity ResourceList
+ // Allocatable represents the resources of a node that are available for scheduling.
+ // +optional
+ Allocatable ResourceList
+ // NodePhase is the current lifecycle phase of the node.
+ // +optional
+ Phase NodePhase
+ // Conditions is an array of current node conditions.
+ // +optional
+ Conditions []NodeCondition
+ // Queried from cloud provider, if available.
+ // +optional
+ Addresses []NodeAddress
+ // Endpoints of daemons running on the Node.
+ // +optional
+ DaemonEndpoints NodeDaemonEndpoints
+ // Set of ids/uuids to uniquely identify the node.
+ // +optional
+ NodeInfo NodeSystemInfo
+ // List of container images on this node
+ // +optional
+ Images []ContainerImage
+ // List of attachable volumes in use (mounted) by the node.
+ // +optional
+ VolumesInUse []UniqueVolumeName
+ // List of volumes that are attached to the node.
+ // +optional
+ VolumesAttached []AttachedVolume
+}
+
+type UniqueVolumeName string
+
+// AttachedVolume describes a volume attached to a node
+type AttachedVolume struct {
+ // Name of the attached volume
+ Name UniqueVolumeName
+
+ // DevicePath represents the device path where the volume should be available
+ DevicePath string
+}
+
+// AvoidPods describes pods that should avoid this node. This is the value for a
+// Node annotation with key scheduler.alpha.kubernetes.io/preferAvoidPods and
+// will eventually become a field of NodeStatus.
+type AvoidPods struct {
+ // Bounded-sized list of signatures of pods that should avoid this node, sorted
+ // in timestamp order from oldest to newest. Size of the slice is unspecified.
+ // +optional
+ PreferAvoidPods []PreferAvoidPodsEntry
+}
+
+// Describes a class of pods that should avoid this node.
+type PreferAvoidPodsEntry struct {
+ // The class of pods.
+ PodSignature PodSignature
+ // Time at which this entry was added to the list.
+ // +optional
+ EvictionTime metav1.Time
+ // (brief) reason why this entry was added to the list.
+ // +optional
+ Reason string
+ // Human readable message indicating why this entry was added to the list.
+ // +optional
+ Message string
+}
+
+// Describes the class of pods that should avoid this node.
+// Exactly one field should be set.
+type PodSignature struct {
+ // Reference to controller whose pods should avoid this node.
+ // +optional
+ PodController *metav1.OwnerReference
+}
+
+// Describe a container image
+type ContainerImage struct {
+ // Names by which this image is known.
+ Names []string
+ // The size of the image in bytes.
+ // +optional
+ SizeBytes int64
+}
+
+type NodePhase string
+
+// These are the valid phases of node.
+const (
+ // NodePending means the node has been created/added by the system, but not configured.
+ NodePending NodePhase = "Pending"
+ // NodeRunning means the node has been configured and has Kubernetes components running.
+ NodeRunning NodePhase = "Running"
+ // NodeTerminated means the node has been removed from the cluster.
+ NodeTerminated NodePhase = "Terminated"
+)
+
+type NodeConditionType string
+
+// These are valid conditions of node. Currently, we don't have enough information to decide
+// node condition. In the future, we will add more. The proposed set of conditions are:
+// NodeReady, NodeReachable
+const (
+ // NodeReady means kubelet is healthy and ready to accept pods.
+ NodeReady NodeConditionType = "Ready"
+ // NodeOutOfDisk means the kubelet will not accept new pods due to insufficient free disk
+ // space on the node.
+ NodeOutOfDisk NodeConditionType = "OutOfDisk"
+ // NodeMemoryPressure means the kubelet is under pressure due to insufficient available memory.
+ NodeMemoryPressure NodeConditionType = "MemoryPressure"
+ // NodeDiskPressure means the kubelet is under pressure due to insufficient available disk.
+ NodeDiskPressure NodeConditionType = "DiskPressure"
+ // NodeNetworkUnavailable means that network for the node is not correctly configured.
+ NodeNetworkUnavailable NodeConditionType = "NetworkUnavailable"
+ // NodeKubeletConfigOk indicates whether the kubelet is correctly configured
+ NodeKubeletConfigOk NodeConditionType = "KubeletConfigOk"
+)
+
+type NodeCondition struct {
+ Type NodeConditionType
+ Status ConditionStatus
+ // +optional
+ LastHeartbeatTime metav1.Time
+ // +optional
+ LastTransitionTime metav1.Time
+ // +optional
+ Reason string
+ // +optional
+ Message string
+}
+
+type NodeAddressType string
+
+const (
+ NodeHostName NodeAddressType = "Hostname"
+ NodeExternalIP NodeAddressType = "ExternalIP"
+ NodeInternalIP NodeAddressType = "InternalIP"
+ NodeExternalDNS NodeAddressType = "ExternalDNS"
+ NodeInternalDNS NodeAddressType = "InternalDNS"
+)
+
+type NodeAddress struct {
+ Type NodeAddressType
+ Address string
+}
+
+// NodeResources is an object for conveying resource information about a node.
+// see http://releases.k8s.io/HEAD/docs/design/resources.md for more details.
+type NodeResources struct {
+ // Capacity represents the available resources of a node
+ // +optional
+ Capacity ResourceList
+}
+
+// ResourceName is the name identifying various resources in a ResourceList.
+type ResourceName string
+
+// Resource names must be not more than 63 characters, consisting of upper- or lower-case alphanumeric characters,
+// with the -, _, and . characters allowed anywhere, except the first or last character.
+// The default convention, matching that for annotations, is to use lower-case names, with dashes, rather than
+// camel case, separating compound words.
+// Fully-qualified resource typenames are constructed from a DNS-style subdomain, followed by a slash `/` and a name.
+const (
+ // CPU, in cores. (500m = .5 cores)
+ ResourceCPU ResourceName = "cpu"
+ // Memory, in bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024)
+ ResourceMemory ResourceName = "memory"
+ // Volume size, in bytes (e,g. 5Gi = 5GiB = 5 * 1024 * 1024 * 1024)
+ ResourceStorage ResourceName = "storage"
+ // Local ephemeral storage, in bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024)
+ // The resource name for ResourceEphemeralStorage is alpha and it can change across releases.
+ ResourceEphemeralStorage ResourceName = "ephemeral-storage"
+ // NVIDIA GPU, in devices. Alpha, might change: although fractional and allowing values >1, only one whole device per node is assigned.
+ ResourceNvidiaGPU ResourceName = "alpha.kubernetes.io/nvidia-gpu"
+)
+
+const (
+ // Default namespace prefix.
+ ResourceDefaultNamespacePrefix = "kubernetes.io/"
+ // Name prefix for huge page resources (alpha).
+ ResourceHugePagesPrefix = "hugepages-"
+)
+
+// ResourceList is a set of (resource name, quantity) pairs.
+type ResourceList map[ResourceName]resource.Quantity
+
+// +genclient
+// +genclient:nonNamespaced
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Node is a worker node in Kubernetes
+// The name of the node according to etcd is in ObjectMeta.Name.
+type Node struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // Spec defines the behavior of a node.
+ // +optional
+ Spec NodeSpec
+
+ // Status describes the current status of a Node
+ // +optional
+ Status NodeStatus
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// NodeList is a list of nodes.
+type NodeList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ Items []Node
+}
+
+// NamespaceSpec describes the attributes on a Namespace
+type NamespaceSpec struct {
+ // Finalizers is an opaque list of values that must be empty to permanently remove object from storage
+ Finalizers []FinalizerName
+}
+
+// FinalizerName is the name identifying a finalizer during namespace lifecycle.
+type FinalizerName string
+
+// These are internal finalizer values to Kubernetes, must be qualified name unless defined here or
+// in metav1.
+const (
+ FinalizerKubernetes FinalizerName = "kubernetes"
+)
+
+// NamespaceStatus is information about the current status of a Namespace.
+type NamespaceStatus struct {
+ // Phase is the current lifecycle phase of the namespace.
+ // +optional
+ Phase NamespacePhase
+}
+
+type NamespacePhase string
+
+// These are the valid phases of a namespace.
+const (
+ // NamespaceActive means the namespace is available for use in the system
+ NamespaceActive NamespacePhase = "Active"
+ // NamespaceTerminating means the namespace is undergoing graceful termination
+ NamespaceTerminating NamespacePhase = "Terminating"
+)
+
+// +genclient
+// +genclient:nonNamespaced
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// A namespace provides a scope for Names.
+// Use of multiple namespaces is optional
+type Namespace struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // Spec defines the behavior of the Namespace.
+ // +optional
+ Spec NamespaceSpec
+
+ // Status describes the current status of a Namespace
+ // +optional
+ Status NamespaceStatus
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// NamespaceList is a list of Namespaces.
+type NamespaceList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ Items []Namespace
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Binding ties one object to another; for example, a pod is bound to a node by a scheduler.
+// Deprecated in 1.7, please use the bindings subresource of pods instead.
+type Binding struct {
+ metav1.TypeMeta
+ // ObjectMeta describes the object that is being bound.
+ // +optional
+ metav1.ObjectMeta
+
+ // Target is the object to bind to.
+ Target ObjectReference
+}
+
+// Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.
+type Preconditions struct {
+ // Specifies the target UID.
+ // +optional
+ UID *types.UID
+}
+
+// DeletionPropagation decides whether and how garbage collection will be performed.
+type DeletionPropagation string
+
+const (
+ // Orphans the dependents.
+ DeletePropagationOrphan DeletionPropagation = "Orphan"
+ // Deletes the object from the key-value store, the garbage collector will delete the dependents in the background.
+ DeletePropagationBackground DeletionPropagation = "Background"
+ // The object exists in the key-value store until the garbage collector deletes all the dependents whose ownerReference.blockOwnerDeletion=true from the key-value store.
+ // API sever will put the "DeletingDependents" finalizer on the object, and sets its deletionTimestamp.
+ // This policy is cascading, i.e., the dependents will be deleted with Foreground.
+ DeletePropagationForeground DeletionPropagation = "Foreground"
+)
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// DeleteOptions may be provided when deleting an API object
+// DEPRECATED: This type has been moved to meta/v1 and will be removed soon.
+type DeleteOptions struct {
+ metav1.TypeMeta
+
+ // Optional duration in seconds before the object should be deleted. Value must be non-negative integer.
+ // The value zero indicates delete immediately. If this value is nil, the default grace period for the
+ // specified type will be used.
+ // +optional
+ GracePeriodSeconds *int64
+
+ // Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be
+ // returned.
+ // +optional
+ Preconditions *Preconditions
+
+ // Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7.
+ // Should the dependent objects be orphaned. If true/false, the "orphan"
+ // finalizer will be added to/removed from the object's finalizers list.
+ // Either this field or PropagationPolicy may be set, but not both.
+ // +optional
+ OrphanDependents *bool
+
+ // Whether and how garbage collection will be performed.
+ // Either this field or OrphanDependents may be set, but not both.
+ // The default policy is decided by the existing finalizer set in the
+ // metadata.finalizers and the resource-specific default policy.
+ // Acceptable values are: 'Orphan' - orphan the dependents; 'Background' -
+ // allow the garbage collector to delete the dependents in the background;
+ // 'Foreground' - a cascading policy that deletes all dependents in the
+ // foreground.
+ // +optional
+ PropagationPolicy *DeletionPropagation
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// ListOptions is the query options to a standard REST list call, and has future support for
+// watch calls.
+// DEPRECATED: This type has been moved to meta/v1 and will be removed soon.
+type ListOptions struct {
+ metav1.TypeMeta
+
+ // A selector based on labels
+ LabelSelector labels.Selector
+ // A selector based on fields
+ FieldSelector fields.Selector
+
+ // If true, partially initialized resources are included in the response.
+ IncludeUninitialized bool
+
+ // If true, watch for changes to this list
+ Watch bool
+ // When specified with a watch call, shows changes that occur after that particular version of a resource.
+ // Defaults to changes from the beginning of history.
+ // When specified for list:
+ // - if unset, then the result is returned from remote storage based on quorum-read flag;
+ // - if it's 0, then we simply return what we currently have in cache, no guarantee;
+ // - if set to non zero, then the result is at least as fresh as given rv.
+ ResourceVersion string
+ // Timeout for the list/watch call.
+ TimeoutSeconds *int64
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PodLogOptions is the query options for a Pod's logs REST call
+type PodLogOptions struct {
+ metav1.TypeMeta
+
+ // Container for which to return logs
+ Container string
+ // If true, follow the logs for the pod
+ Follow bool
+ // If true, return previous terminated container logs
+ Previous bool
+ // A relative time in seconds before the current time from which to show logs. If this value
+ // precedes the time a pod was started, only logs since the pod start will be returned.
+ // If this value is in the future, no logs will be returned.
+ // Only one of sinceSeconds or sinceTime may be specified.
+ SinceSeconds *int64
+ // An RFC3339 timestamp from which to show logs. If this value
+ // precedes the time a pod was started, only logs since the pod start will be returned.
+ // If this value is in the future, no logs will be returned.
+ // Only one of sinceSeconds or sinceTime may be specified.
+ SinceTime *metav1.Time
+ // If true, add an RFC3339 or RFC3339Nano timestamp at the beginning of every line
+ // of log output.
+ Timestamps bool
+ // If set, the number of lines from the end of the logs to show. If not specified,
+ // logs are shown from the creation of the container or sinceSeconds or sinceTime
+ TailLines *int64
+ // If set, the number of bytes to read from the server before terminating the
+ // log output. This may not display a complete final line of logging, and may return
+ // slightly more or slightly less than the specified limit.
+ LimitBytes *int64
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PodAttachOptions is the query options to a Pod's remote attach call
+// TODO: merge w/ PodExecOptions below for stdin, stdout, etc
+type PodAttachOptions struct {
+ metav1.TypeMeta
+
+ // Stdin if true indicates that stdin is to be redirected for the attach call
+ // +optional
+ Stdin bool
+
+ // Stdout if true indicates that stdout is to be redirected for the attach call
+ // +optional
+ Stdout bool
+
+ // Stderr if true indicates that stderr is to be redirected for the attach call
+ // +optional
+ Stderr bool
+
+ // TTY if true indicates that a tty will be allocated for the attach call
+ // +optional
+ TTY bool
+
+ // Container to attach to.
+ // +optional
+ Container string
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PodExecOptions is the query options to a Pod's remote exec call
+type PodExecOptions struct {
+ metav1.TypeMeta
+
+ // Stdin if true indicates that stdin is to be redirected for the exec call
+ Stdin bool
+
+ // Stdout if true indicates that stdout is to be redirected for the exec call
+ Stdout bool
+
+ // Stderr if true indicates that stderr is to be redirected for the exec call
+ Stderr bool
+
+ // TTY if true indicates that a tty will be allocated for the exec call
+ TTY bool
+
+ // Container in which to execute the command.
+ Container string
+
+ // Command is the remote command to execute; argv array; not executed within a shell.
+ Command []string
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PodPortForwardOptions is the query options to a Pod's port forward call
+type PodPortForwardOptions struct {
+ metav1.TypeMeta
+
+ // The list of ports to forward
+ // +optional
+ Ports []int32
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PodProxyOptions is the query options to a Pod's proxy call
+type PodProxyOptions struct {
+ metav1.TypeMeta
+
+ // Path is the URL path to use for the current proxy request
+ Path string
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// NodeProxyOptions is the query options to a Node's proxy call
+type NodeProxyOptions struct {
+ metav1.TypeMeta
+
+ // Path is the URL path to use for the current proxy request
+ Path string
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// ServiceProxyOptions is the query options to a Service's proxy call.
+type ServiceProxyOptions struct {
+ metav1.TypeMeta
+
+ // Path is the part of URLs that include service endpoints, suffixes,
+ // and parameters to use for the current proxy request to service.
+ // For example, the whole request URL is
+ // http://localhost/api/v1/namespaces/kube-system/services/elasticsearch-logging/_search?q=user:kimchy.
+ // Path is _search?q=user:kimchy.
+ Path string
+}
+
+// ObjectReference contains enough information to let you inspect or modify the referred object.
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+type ObjectReference struct {
+ // +optional
+ Kind string
+ // +optional
+ Namespace string
+ // +optional
+ Name string
+ // +optional
+ UID types.UID
+ // +optional
+ APIVersion string
+ // +optional
+ ResourceVersion string
+
+ // Optional. If referring to a piece of an object instead of an entire object, this string
+ // should contain information to identify the sub-object. For example, if the object
+ // reference is to a container within a pod, this would take on a value like:
+ // "spec.containers{name}" (where "name" refers to the name of the container that triggered
+ // the event) or if no container name is specified "spec.containers[2]" (container with
+ // index 2 in this pod). This syntax is chosen only to have some well-defined way of
+ // referencing a part of an object.
+ // TODO: this design is not final and this field is subject to change in the future.
+ // +optional
+ FieldPath string
+}
+
+// LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace.
+type LocalObjectReference struct {
+ //TODO: Add other useful fields. apiVersion, kind, uid?
+ Name string
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+type SerializedReference struct {
+ metav1.TypeMeta
+ // +optional
+ Reference ObjectReference
+}
+
+type EventSource struct {
+ // Component from which the event is generated.
+ // +optional
+ Component string
+ // Node name on which the event is generated.
+ // +optional
+ Host string
+}
+
+// Valid values for event types (new types could be added in future)
+const (
+ // Information only and will not cause any problems
+ EventTypeNormal string = "Normal"
+ // These events are to warn that something might go wrong
+ EventTypeWarning string = "Warning"
+)
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Event is a report of an event somewhere in the cluster.
+// TODO: Decide whether to store these separately or with the object they apply to.
+type Event struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // Required. The object that this event is about. Mapped to events.Event.regarding
+ // +optional
+ InvolvedObject ObjectReference
+
+ // Optional; this should be a short, machine understandable string that gives the reason
+ // for this event being generated. For example, if the event is reporting that a container
+ // can't start, the Reason might be "ImageNotFound".
+ // TODO: provide exact specification for format.
+ // +optional
+ Reason string
+
+ // Optional. A human-readable description of the status of this operation.
+ // TODO: decide on maximum length. Mapped to events.Event.note
+ // +optional
+ Message string
+
+ // Optional. The component reporting this event. Should be a short machine understandable string.
+ // +optional
+ Source EventSource
+
+ // The time at which the event was first recorded. (Time of server receipt is in TypeMeta.)
+ // +optional
+ FirstTimestamp metav1.Time
+
+ // The time at which the most recent occurrence of this event was recorded.
+ // +optional
+ LastTimestamp metav1.Time
+
+ // The number of times this event has occurred.
+ // +optional
+ Count int32
+
+ // Type of this event (Normal, Warning), new types could be added in the future.
+ // +optional
+ Type string
+
+ // Time when this Event was first observed.
+ // +optional
+ EventTime metav1.MicroTime
+
+ // Data about the Event series this event represents or nil if it's a singleton Event.
+ // +optional
+ Series *EventSeries
+
+ // What action was taken/failed regarding to the Regarding object.
+ // +optional
+ Action string
+
+ // Optional secondary object for more complex actions.
+ // +optional
+ Related *ObjectReference
+
+ // Name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`.
+ // +optional
+ ReportingController string
+
+ // ID of the controller instance, e.g. `kubelet-xyzf`.
+ // +optional
+ ReportingInstance string
+}
+
+type EventSeries struct {
+ // Number of occurrences in this series up to the last heartbeat time
+ Count int32
+ // Time of the last occurrence observed
+ LastObservedTime metav1.MicroTime
+ // State of this Series: Ongoing or Finished
+ State EventSeriesState
+}
+
+type EventSeriesState string
+
+const (
+ EventSeriesStateOngoing EventSeriesState = "Ongoing"
+ EventSeriesStateFinished EventSeriesState = "Finished"
+ EventSeriesStateUnknown EventSeriesState = "Unknown"
+)
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// EventList is a list of events.
+type EventList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ Items []Event
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// List holds a list of objects, which may not be known by the server.
+type List metainternalversion.List
+
+// A type of object that is limited
+type LimitType string
+
+const (
+ // Limit that applies to all pods in a namespace
+ LimitTypePod LimitType = "Pod"
+ // Limit that applies to all containers in a namespace
+ LimitTypeContainer LimitType = "Container"
+ // Limit that applies to all persistent volume claims in a namespace
+ LimitTypePersistentVolumeClaim LimitType = "PersistentVolumeClaim"
+)
+
+// LimitRangeItem defines a min/max usage limit for any resource that matches on kind
+type LimitRangeItem struct {
+ // Type of resource that this limit applies to
+ // +optional
+ Type LimitType
+ // Max usage constraints on this kind by resource name
+ // +optional
+ Max ResourceList
+ // Min usage constraints on this kind by resource name
+ // +optional
+ Min ResourceList
+ // Default resource requirement limit value by resource name.
+ // +optional
+ Default ResourceList
+ // DefaultRequest resource requirement request value by resource name.
+ // +optional
+ DefaultRequest ResourceList
+ // MaxLimitRequestRatio represents the max burst value for the named resource
+ // +optional
+ MaxLimitRequestRatio ResourceList
+}
+
+// LimitRangeSpec defines a min/max usage limit for resources that match on kind
+type LimitRangeSpec struct {
+ // Limits is the list of LimitRangeItem objects that are enforced
+ Limits []LimitRangeItem
+}
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// LimitRange sets resource usage limits for each kind of resource in a Namespace
+type LimitRange struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // Spec defines the limits enforced
+ // +optional
+ Spec LimitRangeSpec
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// LimitRangeList is a list of LimitRange items.
+type LimitRangeList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ // Items is a list of LimitRange objects
+ Items []LimitRange
+}
+
+// The following identify resource constants for Kubernetes object types
+const (
+ // Pods, number
+ ResourcePods ResourceName = "pods"
+ // Services, number
+ ResourceServices ResourceName = "services"
+ // ReplicationControllers, number
+ ResourceReplicationControllers ResourceName = "replicationcontrollers"
+ // ResourceQuotas, number
+ ResourceQuotas ResourceName = "resourcequotas"
+ // ResourceSecrets, number
+ ResourceSecrets ResourceName = "secrets"
+ // ResourceConfigMaps, number
+ ResourceConfigMaps ResourceName = "configmaps"
+ // ResourcePersistentVolumeClaims, number
+ ResourcePersistentVolumeClaims ResourceName = "persistentvolumeclaims"
+ // ResourceServicesNodePorts, number
+ ResourceServicesNodePorts ResourceName = "services.nodeports"
+ // ResourceServicesLoadBalancers, number
+ ResourceServicesLoadBalancers ResourceName = "services.loadbalancers"
+ // CPU request, in cores. (500m = .5 cores)
+ ResourceRequestsCPU ResourceName = "requests.cpu"
+ // Memory request, in bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024)
+ ResourceRequestsMemory ResourceName = "requests.memory"
+ // Storage request, in bytes
+ ResourceRequestsStorage ResourceName = "requests.storage"
+ // Local ephemeral storage request, in bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024)
+ ResourceRequestsEphemeralStorage ResourceName = "requests.ephemeral-storage"
+ // CPU limit, in cores. (500m = .5 cores)
+ ResourceLimitsCPU ResourceName = "limits.cpu"
+ // Memory limit, in bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024)
+ ResourceLimitsMemory ResourceName = "limits.memory"
+ // Local ephemeral storage limit, in bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024)
+ ResourceLimitsEphemeralStorage ResourceName = "limits.ephemeral-storage"
+)
+
+// The following identify resource prefix for Kubernetes object types
+const (
+ // HugePages request, in bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024)
+ // As burst is not supported for HugePages, we would only quota its request, and ignore the limit.
+ ResourceRequestsHugePagesPrefix = "requests.hugepages-"
+ // Default resource requests prefix
+ DefaultResourceRequestsPrefix = "requests."
+)
+
+// A ResourceQuotaScope defines a filter that must match each object tracked by a quota
+type ResourceQuotaScope string
+
+const (
+ // Match all pod objects where spec.activeDeadlineSeconds
+ ResourceQuotaScopeTerminating ResourceQuotaScope = "Terminating"
+ // Match all pod objects where !spec.activeDeadlineSeconds
+ ResourceQuotaScopeNotTerminating ResourceQuotaScope = "NotTerminating"
+ // Match all pod objects that have best effort quality of service
+ ResourceQuotaScopeBestEffort ResourceQuotaScope = "BestEffort"
+ // Match all pod objects that do not have best effort quality of service
+ ResourceQuotaScopeNotBestEffort ResourceQuotaScope = "NotBestEffort"
+)
+
+// ResourceQuotaSpec defines the desired hard limits to enforce for Quota
+type ResourceQuotaSpec struct {
+ // Hard is the set of desired hard limits for each named resource
+ // +optional
+ Hard ResourceList
+ // A collection of filters that must match each object tracked by a quota.
+ // If not specified, the quota matches all objects.
+ // +optional
+ Scopes []ResourceQuotaScope
+}
+
+// ResourceQuotaStatus defines the enforced hard limits and observed use
+type ResourceQuotaStatus struct {
+ // Hard is the set of enforced hard limits for each named resource
+ // +optional
+ Hard ResourceList
+ // Used is the current observed total usage of the resource in the namespace
+ // +optional
+ Used ResourceList
+}
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// ResourceQuota sets aggregate quota restrictions enforced per namespace
+type ResourceQuota struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // Spec defines the desired quota
+ // +optional
+ Spec ResourceQuotaSpec
+
+ // Status defines the actual enforced quota and its current usage
+ // +optional
+ Status ResourceQuotaStatus
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// ResourceQuotaList is a list of ResourceQuota items
+type ResourceQuotaList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ // Items is a list of ResourceQuota objects
+ Items []ResourceQuota
+}
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Secret holds secret data of a certain type. The total bytes of the values in
+// the Data field must be less than MaxSecretSize bytes.
+type Secret struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // Data contains the secret data. Each key must consist of alphanumeric
+ // characters, '-', '_' or '.'. The serialized form of the secret data is a
+ // base64 encoded string, representing the arbitrary (possibly non-string)
+ // data value here.
+ // +optional
+ Data map[string][]byte
+
+ // Used to facilitate programmatic handling of secret data.
+ // +optional
+ Type SecretType
+}
+
+const MaxSecretSize = 1 * 1024 * 1024
+
+type SecretType string
+
+const (
+ // SecretTypeOpaque is the default; arbitrary user-defined data
+ SecretTypeOpaque SecretType = "Opaque"
+
+ // SecretTypeServiceAccountToken contains a token that identifies a service account to the API
+ //
+ // Required fields:
+ // - Secret.Annotations["kubernetes.io/service-account.name"] - the name of the ServiceAccount the token identifies
+ // - Secret.Annotations["kubernetes.io/service-account.uid"] - the UID of the ServiceAccount the token identifies
+ // - Secret.Data["token"] - a token that identifies the service account to the API
+ SecretTypeServiceAccountToken SecretType = "kubernetes.io/service-account-token"
+
+ // ServiceAccountNameKey is the key of the required annotation for SecretTypeServiceAccountToken secrets
+ ServiceAccountNameKey = "kubernetes.io/service-account.name"
+ // ServiceAccountUIDKey is the key of the required annotation for SecretTypeServiceAccountToken secrets
+ ServiceAccountUIDKey = "kubernetes.io/service-account.uid"
+ // ServiceAccountTokenKey is the key of the required data for SecretTypeServiceAccountToken secrets
+ ServiceAccountTokenKey = "token"
+ // ServiceAccountKubeconfigKey is the key of the optional kubeconfig data for SecretTypeServiceAccountToken secrets
+ ServiceAccountKubeconfigKey = "kubernetes.kubeconfig"
+ // ServiceAccountRootCAKey is the key of the optional root certificate authority for SecretTypeServiceAccountToken secrets
+ ServiceAccountRootCAKey = "ca.crt"
+ // ServiceAccountNamespaceKey is the key of the optional namespace to use as the default for namespaced API calls
+ ServiceAccountNamespaceKey = "namespace"
+
+ // SecretTypeDockercfg contains a dockercfg file that follows the same format rules as ~/.dockercfg
+ //
+ // Required fields:
+ // - Secret.Data[".dockercfg"] - a serialized ~/.dockercfg file
+ SecretTypeDockercfg SecretType = "kubernetes.io/dockercfg"
+
+ // DockerConfigKey is the key of the required data for SecretTypeDockercfg secrets
+ DockerConfigKey = ".dockercfg"
+
+ // SecretTypeDockerConfigJson contains a dockercfg file that follows the same format rules as ~/.docker/config.json
+ //
+ // Required fields:
+ // - Secret.Data[".dockerconfigjson"] - a serialized ~/.docker/config.json file
+ SecretTypeDockerConfigJson SecretType = "kubernetes.io/dockerconfigjson"
+
+ // DockerConfigJsonKey is the key of the required data for SecretTypeDockerConfigJson secrets
+ DockerConfigJsonKey = ".dockerconfigjson"
+
+ // SecretTypeBasicAuth contains data needed for basic authentication.
+ //
+ // Required at least one of fields:
+ // - Secret.Data["username"] - username used for authentication
+ // - Secret.Data["password"] - password or token needed for authentication
+ SecretTypeBasicAuth SecretType = "kubernetes.io/basic-auth"
+
+ // BasicAuthUsernameKey is the key of the username for SecretTypeBasicAuth secrets
+ BasicAuthUsernameKey = "username"
+ // BasicAuthPasswordKey is the key of the password or token for SecretTypeBasicAuth secrets
+ BasicAuthPasswordKey = "password"
+
+ // SecretTypeSSHAuth contains data needed for SSH authentication.
+ //
+ // Required field:
+ // - Secret.Data["ssh-privatekey"] - private SSH key needed for authentication
+ SecretTypeSSHAuth SecretType = "kubernetes.io/ssh-auth"
+
+ // SSHAuthPrivateKey is the key of the required SSH private key for SecretTypeSSHAuth secrets
+ SSHAuthPrivateKey = "ssh-privatekey"
+
+ // SecretTypeTLS contains information about a TLS client or server secret. It
+ // is primarily used with TLS termination of the Ingress resource, but may be
+ // used in other types.
+ //
+ // Required fields:
+ // - Secret.Data["tls.key"] - TLS private key.
+ // Secret.Data["tls.crt"] - TLS certificate.
+ // TODO: Consider supporting different formats, specifying CA/destinationCA.
+ SecretTypeTLS SecretType = "kubernetes.io/tls"
+
+ // TLSCertKey is the key for tls certificates in a TLS secret.
+ TLSCertKey = "tls.crt"
+ // TLSPrivateKeyKey is the key for the private key field in a TLS secret.
+ TLSPrivateKeyKey = "tls.key"
+ // SecretTypeBootstrapToken is used during the automated bootstrap process (first
+ // implemented by kubeadm). It stores tokens that are used to sign well known
+ // ConfigMaps. They are used for authn.
+ SecretTypeBootstrapToken SecretType = "bootstrap.kubernetes.io/token"
+)
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+type SecretList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ Items []Secret
+}
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// ConfigMap holds configuration data for components or applications to consume.
+type ConfigMap struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // Data contains the configuration data.
+ // Each key must consist of alphanumeric characters, '-', '_' or '.'.
+ // Values with non-UTF-8 byte sequences must use the BinaryData field.
+ // The keys stored in Data must not overlap with the keys in
+ // the BinaryData field, this is enforced during validation process.
+ // +optional
+ Data map[string]string
+
+ // BinaryData contains the binary data.
+ // Each key must consist of alphanumeric characters, '-', '_' or '.'.
+ // BinaryData can contain byte sequences that are not in the UTF-8 range.
+ // The keys stored in BinaryData must not overlap with the ones in
+ // the Data field, this is enforced during validation process.
+ // Using this field will require 1.10+ apiserver and
+ // kubelet.
+ // +optional
+ BinaryData map[string][]byte
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// ConfigMapList is a resource containing a list of ConfigMap objects.
+type ConfigMapList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ // Items is the list of ConfigMaps.
+ Items []ConfigMap
+}
+
+// These constants are for remote command execution and port forwarding and are
+// used by both the client side and server side components.
+//
+// This is probably not the ideal place for them, but it didn't seem worth it
+// to create pkg/exec and pkg/portforward just to contain a single file with
+// constants in it. Suggestions for more appropriate alternatives are
+// definitely welcome!
+const (
+ // Enable stdin for remote command execution
+ ExecStdinParam = "input"
+ // Enable stdout for remote command execution
+ ExecStdoutParam = "output"
+ // Enable stderr for remote command execution
+ ExecStderrParam = "error"
+ // Enable TTY for remote command execution
+ ExecTTYParam = "tty"
+ // Command to run for remote command execution
+ ExecCommandParam = "command"
+
+ // Name of header that specifies stream type
+ StreamType = "streamType"
+ // Value for streamType header for stdin stream
+ StreamTypeStdin = "stdin"
+ // Value for streamType header for stdout stream
+ StreamTypeStdout = "stdout"
+ // Value for streamType header for stderr stream
+ StreamTypeStderr = "stderr"
+ // Value for streamType header for data stream
+ StreamTypeData = "data"
+ // Value for streamType header for error stream
+ StreamTypeError = "error"
+ // Value for streamType header for terminal resize stream
+ StreamTypeResize = "resize"
+
+ // Name of header that specifies the port being forwarded
+ PortHeader = "port"
+ // Name of header that specifies a request ID used to associate the error
+ // and data streams for a single forwarded connection
+ PortForwardRequestIDHeader = "requestID"
+)
+
+// Type and constants for component health validation.
+type ComponentConditionType string
+
+// These are the valid conditions for the component.
+const (
+ ComponentHealthy ComponentConditionType = "Healthy"
+)
+
+type ComponentCondition struct {
+ Type ComponentConditionType
+ Status ConditionStatus
+ // +optional
+ Message string
+ // +optional
+ Error string
+}
+
+// +genclient
+// +genclient:nonNamespaced
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// ComponentStatus (and ComponentStatusList) holds the cluster validation info.
+type ComponentStatus struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+
+ // +optional
+ Conditions []ComponentCondition
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+type ComponentStatusList struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ListMeta
+
+ Items []ComponentStatus
+}
+
+// SecurityContext holds security configuration that will be applied to a container.
+// Some fields are present in both SecurityContext and PodSecurityContext. When both
+// are set, the values in SecurityContext take precedence.
+type SecurityContext struct {
+ // The capabilities to add/drop when running containers.
+ // Defaults to the default set of capabilities granted by the container runtime.
+ // +optional
+ Capabilities *Capabilities
+ // Run container in privileged mode.
+ // Processes in privileged containers are essentially equivalent to root on the host.
+ // Defaults to false.
+ // +optional
+ Privileged *bool
+ // The SELinux context to be applied to the container.
+ // If unspecified, the container runtime will allocate a random SELinux context for each
+ // container. May also be set in PodSecurityContext. If set in both SecurityContext and
+ // PodSecurityContext, the value specified in SecurityContext takes precedence.
+ // +optional
+ SELinuxOptions *SELinuxOptions
+ // The UID to run the entrypoint of the container process.
+ // Defaults to user specified in image metadata if unspecified.
+ // May also be set in PodSecurityContext. If set in both SecurityContext and
+ // PodSecurityContext, the value specified in SecurityContext takes precedence.
+ // +optional
+ RunAsUser *int64
+ // Indicates that the container must run as a non-root user.
+ // If true, the Kubelet will validate the image at runtime to ensure that it
+ // does not run as UID 0 (root) and fail to start the container if it does.
+ // If unset or false, no such validation will be performed.
+ // May also be set in PodSecurityContext. If set in both SecurityContext and
+ // PodSecurityContext, the value specified in SecurityContext takes precedence.
+ // +optional
+ RunAsNonRoot *bool
+ // The read-only root filesystem allows you to restrict the locations that an application can write
+ // files to, ensuring the persistent data can only be written to mounts.
+ // +optional
+ ReadOnlyRootFilesystem *bool
+ // AllowPrivilegeEscalation controls whether a process can gain more
+ // privileges than its parent process. This bool directly controls if
+ // the no_new_privs flag will be set on the container process.
+ // +optional
+ AllowPrivilegeEscalation *bool
+}
+
+// SELinuxOptions are the labels to be applied to the container.
+type SELinuxOptions struct {
+ // SELinux user label
+ // +optional
+ User string
+ // SELinux role label
+ // +optional
+ Role string
+ // SELinux type label
+ // +optional
+ Type string
+ // SELinux level label.
+ // +optional
+ Level string
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// RangeAllocation is an opaque API object (not exposed to end users) that can be persisted to record
+// the global allocation state of the cluster. The schema of Range and Data generic, in that Range
+// should be a string representation of the inputs to a range (for instance, for IP allocation it
+// might be a CIDR) and Data is an opaque blob understood by an allocator which is typically a
+// binary range. Consumers should use annotations to record additional information (schema version,
+// data encoding hints). A range allocation should *ALWAYS* be recreatable at any time by observation
+// of the cluster, thus the object is less strongly typed than most.
+type RangeAllocation struct {
+ metav1.TypeMeta
+ // +optional
+ metav1.ObjectMeta
+ // A string representing a unique label for a range of resources, such as a CIDR "10.0.0.0/8" or
+ // port range "10000-30000". Range is not strongly schema'd here. The Range is expected to define
+ // a start and end unless there is an implicit end.
+ Range string
+ // A byte array representing the serialized state of a range allocation. Additional clarifiers on
+ // the type or format of data should be represented with annotations. For IP allocations, this is
+ // represented as a bit array starting at the base IP of the CIDR in Range, with each bit representing
+ // a single allocated address (the fifth bit on CIDR 10.0.0.0/8 is 10.0.0.4).
+ Data []byte
+}
+
+const (
+ // "default-scheduler" is the name of default scheduler.
+ DefaultSchedulerName = "default-scheduler"
+
+ // RequiredDuringScheduling affinity is not symmetric, but there is an implicit PreferredDuringScheduling affinity rule
+ // corresponding to every RequiredDuringScheduling affinity rule.
+ // When the --hard-pod-affinity-weight scheduler flag is not specified,
+ // DefaultHardPodAffinityWeight defines the weight of the implicit PreferredDuringScheduling affinity rule.
+ DefaultHardPodAffinitySymmetricWeight int32 = 1
+)
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/conversion.go
new file mode 100644
index 000000000..d888ebca4
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/conversion.go
@@ -0,0 +1,619 @@
+/*
+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"
+
+ "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/core"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+)
+
+// This is a "fast-path" that avoids reflection for common types. It focuses on the objects that are
+// converted the most in the cluster.
+// TODO: generate one of these for every external API group - this is to prove the impact
+func addFastPathConversionFuncs(scheme *runtime.Scheme) error {
+ scheme.AddGenericConversionFunc(func(objA, objB interface{}, s conversion.Scope) (bool, error) {
+ switch a := objA.(type) {
+ case *v1.Pod:
+ switch b := objB.(type) {
+ case *core.Pod:
+ return true, Convert_v1_Pod_To_core_Pod(a, b, s)
+ }
+ case *core.Pod:
+ switch b := objB.(type) {
+ case *v1.Pod:
+ return true, Convert_core_Pod_To_v1_Pod(a, b, s)
+ }
+
+ case *v1.Event:
+ switch b := objB.(type) {
+ case *core.Event:
+ return true, Convert_v1_Event_To_core_Event(a, b, s)
+ }
+ case *core.Event:
+ switch b := objB.(type) {
+ case *v1.Event:
+ return true, Convert_core_Event_To_v1_Event(a, b, s)
+ }
+
+ case *v1.ReplicationController:
+ switch b := objB.(type) {
+ case *core.ReplicationController:
+ return true, Convert_v1_ReplicationController_To_core_ReplicationController(a, b, s)
+ }
+ case *core.ReplicationController:
+ switch b := objB.(type) {
+ case *v1.ReplicationController:
+ return true, Convert_core_ReplicationController_To_v1_ReplicationController(a, b, s)
+ }
+
+ case *v1.Node:
+ switch b := objB.(type) {
+ case *core.Node:
+ return true, Convert_v1_Node_To_core_Node(a, b, s)
+ }
+ case *core.Node:
+ switch b := objB.(type) {
+ case *v1.Node:
+ return true, Convert_core_Node_To_v1_Node(a, b, s)
+ }
+
+ case *v1.Namespace:
+ switch b := objB.(type) {
+ case *core.Namespace:
+ return true, Convert_v1_Namespace_To_core_Namespace(a, b, s)
+ }
+ case *core.Namespace:
+ switch b := objB.(type) {
+ case *v1.Namespace:
+ return true, Convert_core_Namespace_To_v1_Namespace(a, b, s)
+ }
+
+ case *v1.Service:
+ switch b := objB.(type) {
+ case *core.Service:
+ return true, Convert_v1_Service_To_core_Service(a, b, s)
+ }
+ case *core.Service:
+ switch b := objB.(type) {
+ case *v1.Service:
+ return true, Convert_core_Service_To_v1_Service(a, b, s)
+ }
+
+ case *v1.Endpoints:
+ switch b := objB.(type) {
+ case *core.Endpoints:
+ return true, Convert_v1_Endpoints_To_core_Endpoints(a, b, s)
+ }
+ case *core.Endpoints:
+ switch b := objB.(type) {
+ case *v1.Endpoints:
+ return true, Convert_core_Endpoints_To_v1_Endpoints(a, b, s)
+ }
+
+ case *metav1.WatchEvent:
+ switch b := objB.(type) {
+ case *metav1.InternalEvent:
+ return true, metav1.Convert_versioned_Event_to_versioned_InternalEvent(a, b, s)
+ }
+ case *metav1.InternalEvent:
+ switch b := objB.(type) {
+ case *metav1.WatchEvent:
+ return true, metav1.Convert_versioned_InternalEvent_to_versioned_Event(a, b, s)
+ }
+ }
+ return false, nil
+ })
+ return nil
+}
+
+func addConversionFuncs(scheme *runtime.Scheme) error {
+ // Add non-generated conversion functions
+ err := scheme.AddConversionFuncs(
+ Convert_core_Pod_To_v1_Pod,
+ Convert_core_PodSpec_To_v1_PodSpec,
+ Convert_core_ReplicationControllerSpec_To_v1_ReplicationControllerSpec,
+ Convert_core_ServiceSpec_To_v1_ServiceSpec,
+ Convert_v1_Pod_To_core_Pod,
+ Convert_v1_PodSpec_To_core_PodSpec,
+ Convert_v1_ReplicationControllerSpec_To_core_ReplicationControllerSpec,
+ Convert_v1_Secret_To_core_Secret,
+ Convert_v1_ServiceSpec_To_core_ServiceSpec,
+ Convert_v1_ResourceList_To_core_ResourceList,
+ Convert_v1_ReplicationController_to_extensions_ReplicaSet,
+ Convert_v1_ReplicationControllerSpec_to_extensions_ReplicaSetSpec,
+ Convert_v1_ReplicationControllerStatus_to_extensions_ReplicaSetStatus,
+ Convert_extensions_ReplicaSet_to_v1_ReplicationController,
+ Convert_extensions_ReplicaSetSpec_to_v1_ReplicationControllerSpec,
+ Convert_extensions_ReplicaSetStatus_to_v1_ReplicationControllerStatus,
+ )
+ if err != nil {
+ return err
+ }
+
+ // Add field conversion funcs.
+ err = scheme.AddFieldLabelConversionFunc("v1", "Pod",
+ func(label, value string) (string, string, error) {
+ switch label {
+ case "metadata.name",
+ "metadata.namespace",
+ "spec.nodeName",
+ "spec.restartPolicy",
+ "spec.schedulerName",
+ "status.phase",
+ "status.podIP",
+ "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("v1", "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("v1", "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_extensions_ReplicaSet(in *v1.ReplicationController, out *extensions.ReplicaSet, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_ReplicationControllerSpec_to_extensions_ReplicaSetSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_v1_ReplicationControllerStatus_to_extensions_ReplicaSetStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+func Convert_v1_ReplicationControllerSpec_to_extensions_ReplicaSetSpec(in *v1.ReplicationControllerSpec, out *extensions.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_to_unversioned_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_extensions_ReplicaSetStatus(in *v1.ReplicationControllerStatus, out *extensions.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, extensions.ReplicaSetCondition{
+ Type: extensions.ReplicaSetConditionType(cond.Type),
+ Status: core.ConditionStatus(cond.Status),
+ LastTransitionTime: cond.LastTransitionTime,
+ Reason: cond.Reason,
+ Message: cond.Message,
+ })
+ }
+ return nil
+}
+
+func Convert_extensions_ReplicaSet_to_v1_ReplicationController(in *extensions.ReplicaSet, out *v1.ReplicationController, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_extensions_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_extensions_ReplicaSetStatus_to_v1_ReplicationControllerStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+func Convert_extensions_ReplicaSetSpec_to_v1_ReplicationControllerSpec(in *extensions.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_unversioned_LabelSelector_to_map(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_extensions_ReplicaSetStatus_to_v1_ReplicationControllerStatus(in *extensions.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
+}
+
+// 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_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
+}
+func Convert_core_SecurityContext_To_v1_SecurityContext(in *core.SecurityContext, out *v1.SecurityContext, s conversion.Scope) error {
+ if in.Capabilities != nil {
+ out.Capabilities = new(v1.Capabilities)
+ if err := Convert_core_Capabilities_To_v1_Capabilities(in.Capabilities, out.Capabilities, s); err != nil {
+ return err
+ }
+ } else {
+ out.Capabilities = nil
+ }
+ out.Privileged = in.Privileged
+ if in.SELinuxOptions != nil {
+ out.SELinuxOptions = new(v1.SELinuxOptions)
+ if err := Convert_core_SELinuxOptions_To_v1_SELinuxOptions(in.SELinuxOptions, out.SELinuxOptions, s); err != nil {
+ return err
+ }
+ } else {
+ out.SELinuxOptions = nil
+ }
+ out.RunAsUser = in.RunAsUser
+ out.RunAsNonRoot = in.RunAsNonRoot
+ out.ReadOnlyRootFilesystem = in.ReadOnlyRootFilesystem
+ out.AllowPrivilegeEscalation = in.AllowPrivilegeEscalation
+ return nil
+}
+
+func Convert_core_PodSecurityContext_To_v1_PodSecurityContext(in *core.PodSecurityContext, out *v1.PodSecurityContext, s conversion.Scope) error {
+ out.SupplementalGroups = in.SupplementalGroups
+ if in.SELinuxOptions != nil {
+ out.SELinuxOptions = new(v1.SELinuxOptions)
+ if err := Convert_core_SELinuxOptions_To_v1_SELinuxOptions(in.SELinuxOptions, out.SELinuxOptions, s); err != nil {
+ return err
+ }
+ } else {
+ out.SELinuxOptions = nil
+ }
+ out.RunAsUser = in.RunAsUser
+ out.RunAsNonRoot = in.RunAsNonRoot
+ out.FSGroup = in.FSGroup
+ return nil
+}
+
+func Convert_v1_PodSecurityContext_To_core_PodSecurityContext(in *v1.PodSecurityContext, out *core.PodSecurityContext, s conversion.Scope) error {
+ out.SupplementalGroups = in.SupplementalGroups
+ if in.SELinuxOptions != nil {
+ out.SELinuxOptions = new(core.SELinuxOptions)
+ if err := Convert_v1_SELinuxOptions_To_core_SELinuxOptions(in.SELinuxOptions, out.SELinuxOptions, s); err != nil {
+ return err
+ }
+ } else {
+ out.SELinuxOptions = nil
+ }
+ out.RunAsUser = in.RunAsUser
+ out.RunAsNonRoot = in.RunAsNonRoot
+ out.FSGroup = in.FSGroup
+ 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("v1", "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("v1", "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("v1", "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
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/defaults.go
new file mode 100644
index 000000000..c2aeafc3d
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/defaults.go
@@ -0,0 +1,413 @@
+/*
+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 (
+ "k8s.io/api/core/v1"
+ "k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/util/intstr"
+ utilfeature "k8s.io/apiserver/pkg/util/feature"
+ "k8s.io/kubernetes/pkg/features"
+ "k8s.io/kubernetes/pkg/util/parsers"
+ utilpointer "k8s.io/kubernetes/pkg/util/pointer"
+)
+
+func addDefaultingFuncs(scheme *runtime.Scheme) error {
+ return RegisterDefaults(scheme)
+}
+
+func SetDefaults_ResourceList(obj *v1.ResourceList) {
+ for key, val := range *obj {
+ // 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)
+
+ (*obj)[v1.ResourceName(key)] = val
+ }
+}
+
+func SetDefaults_ReplicationController(obj *v1.ReplicationController) {
+ var labels map[string]string
+ if obj.Spec.Template != nil {
+ labels = obj.Spec.Template.Labels
+ }
+ // TODO: support templates defined elsewhere when we support them in the API
+ if labels != nil {
+ if len(obj.Spec.Selector) == 0 {
+ obj.Spec.Selector = labels
+ }
+ if len(obj.Labels) == 0 {
+ obj.Labels = labels
+ }
+ }
+ if obj.Spec.Replicas == nil {
+ obj.Spec.Replicas = new(int32)
+ *obj.Spec.Replicas = 1
+ }
+}
+func SetDefaults_Volume(obj *v1.Volume) {
+ if utilpointer.AllPtrFieldsNil(&obj.VolumeSource) {
+ obj.VolumeSource = v1.VolumeSource{
+ EmptyDir: &v1.EmptyDirVolumeSource{},
+ }
+ }
+}
+func SetDefaults_ContainerPort(obj *v1.ContainerPort) {
+ if obj.Protocol == "" {
+ obj.Protocol = v1.ProtocolTCP
+ }
+}
+func SetDefaults_Container(obj *v1.Container) {
+ if obj.ImagePullPolicy == "" {
+ // Ignore error and assume it has been validated elsewhere
+ _, tag, _, _ := parsers.ParseImageName(obj.Image)
+
+ // Check image tag
+ if tag == "latest" {
+ obj.ImagePullPolicy = v1.PullAlways
+ } else {
+ obj.ImagePullPolicy = v1.PullIfNotPresent
+ }
+ }
+ if obj.TerminationMessagePath == "" {
+ obj.TerminationMessagePath = v1.TerminationMessagePathDefault
+ }
+ if obj.TerminationMessagePolicy == "" {
+ obj.TerminationMessagePolicy = v1.TerminationMessageReadFile
+ }
+}
+func SetDefaults_Service(obj *v1.Service) {
+ if obj.Spec.SessionAffinity == "" {
+ obj.Spec.SessionAffinity = v1.ServiceAffinityNone
+ }
+ if obj.Spec.SessionAffinity == v1.ServiceAffinityNone {
+ obj.Spec.SessionAffinityConfig = nil
+ }
+ if obj.Spec.SessionAffinity == v1.ServiceAffinityClientIP {
+ if obj.Spec.SessionAffinityConfig == nil || obj.Spec.SessionAffinityConfig.ClientIP == nil || obj.Spec.SessionAffinityConfig.ClientIP.TimeoutSeconds == nil {
+ timeoutSeconds := v1.DefaultClientIPServiceAffinitySeconds
+ obj.Spec.SessionAffinityConfig = &v1.SessionAffinityConfig{
+ ClientIP: &v1.ClientIPConfig{
+ TimeoutSeconds: &timeoutSeconds,
+ },
+ }
+ }
+ }
+ if obj.Spec.Type == "" {
+ obj.Spec.Type = v1.ServiceTypeClusterIP
+ }
+ for i := range obj.Spec.Ports {
+ sp := &obj.Spec.Ports[i]
+ if sp.Protocol == "" {
+ sp.Protocol = v1.ProtocolTCP
+ }
+ if sp.TargetPort == intstr.FromInt(0) || sp.TargetPort == intstr.FromString("") {
+ sp.TargetPort = intstr.FromInt(int(sp.Port))
+ }
+ }
+ // Defaults ExternalTrafficPolicy field for NodePort / LoadBalancer service
+ // to Global for consistency.
+ if (obj.Spec.Type == v1.ServiceTypeNodePort ||
+ obj.Spec.Type == v1.ServiceTypeLoadBalancer) &&
+ obj.Spec.ExternalTrafficPolicy == "" {
+ obj.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster
+ }
+}
+func SetDefaults_Pod(obj *v1.Pod) {
+ // If limits are specified, but requests are not, default requests to limits
+ // This is done here rather than a more specific defaulting pass on v1.ResourceRequirements
+ // because we only want this defaulting semantic to take place on a v1.Pod and not a v1.PodTemplate
+ for i := range obj.Spec.Containers {
+ // set requests to limits if requests are not specified, but limits are
+ if obj.Spec.Containers[i].Resources.Limits != nil {
+ if obj.Spec.Containers[i].Resources.Requests == nil {
+ obj.Spec.Containers[i].Resources.Requests = make(v1.ResourceList)
+ }
+ for key, value := range obj.Spec.Containers[i].Resources.Limits {
+ if _, exists := obj.Spec.Containers[i].Resources.Requests[key]; !exists {
+ obj.Spec.Containers[i].Resources.Requests[key] = *(value.Copy())
+ }
+ }
+ }
+ }
+ for i := range obj.Spec.InitContainers {
+ if obj.Spec.InitContainers[i].Resources.Limits != nil {
+ if obj.Spec.InitContainers[i].Resources.Requests == nil {
+ obj.Spec.InitContainers[i].Resources.Requests = make(v1.ResourceList)
+ }
+ for key, value := range obj.Spec.InitContainers[i].Resources.Limits {
+ if _, exists := obj.Spec.InitContainers[i].Resources.Requests[key]; !exists {
+ obj.Spec.InitContainers[i].Resources.Requests[key] = *(value.Copy())
+ }
+ }
+ }
+ }
+}
+func SetDefaults_PodSpec(obj *v1.PodSpec) {
+ if obj.DNSPolicy == "" {
+ obj.DNSPolicy = v1.DNSClusterFirst
+ }
+ if obj.RestartPolicy == "" {
+ obj.RestartPolicy = v1.RestartPolicyAlways
+ }
+ if obj.HostNetwork {
+ defaultHostNetworkPorts(&obj.Containers)
+ defaultHostNetworkPorts(&obj.InitContainers)
+ }
+ if obj.SecurityContext == nil {
+ obj.SecurityContext = &v1.PodSecurityContext{}
+ }
+ if obj.TerminationGracePeriodSeconds == nil {
+ period := int64(v1.DefaultTerminationGracePeriodSeconds)
+ obj.TerminationGracePeriodSeconds = &period
+ }
+ if obj.SchedulerName == "" {
+ obj.SchedulerName = v1.DefaultSchedulerName
+ }
+}
+func SetDefaults_Probe(obj *v1.Probe) {
+ if obj.TimeoutSeconds == 0 {
+ obj.TimeoutSeconds = 1
+ }
+ if obj.PeriodSeconds == 0 {
+ obj.PeriodSeconds = 10
+ }
+ if obj.SuccessThreshold == 0 {
+ obj.SuccessThreshold = 1
+ }
+ if obj.FailureThreshold == 0 {
+ obj.FailureThreshold = 3
+ }
+}
+func SetDefaults_SecretVolumeSource(obj *v1.SecretVolumeSource) {
+ if obj.DefaultMode == nil {
+ perm := int32(v1.SecretVolumeSourceDefaultMode)
+ obj.DefaultMode = &perm
+ }
+}
+func SetDefaults_ConfigMapVolumeSource(obj *v1.ConfigMapVolumeSource) {
+ if obj.DefaultMode == nil {
+ perm := int32(v1.ConfigMapVolumeSourceDefaultMode)
+ obj.DefaultMode = &perm
+ }
+}
+func SetDefaults_DownwardAPIVolumeSource(obj *v1.DownwardAPIVolumeSource) {
+ if obj.DefaultMode == nil {
+ perm := int32(v1.DownwardAPIVolumeSourceDefaultMode)
+ obj.DefaultMode = &perm
+ }
+}
+func SetDefaults_Secret(obj *v1.Secret) {
+ if obj.Type == "" {
+ obj.Type = v1.SecretTypeOpaque
+ }
+}
+func SetDefaults_ProjectedVolumeSource(obj *v1.ProjectedVolumeSource) {
+ if obj.DefaultMode == nil {
+ perm := int32(v1.ProjectedVolumeSourceDefaultMode)
+ obj.DefaultMode = &perm
+ }
+}
+func SetDefaults_PersistentVolume(obj *v1.PersistentVolume) {
+ if obj.Status.Phase == "" {
+ obj.Status.Phase = v1.VolumePending
+ }
+ if obj.Spec.PersistentVolumeReclaimPolicy == "" {
+ obj.Spec.PersistentVolumeReclaimPolicy = v1.PersistentVolumeReclaimRetain
+ }
+ if obj.Spec.VolumeMode == nil && utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) {
+ obj.Spec.VolumeMode = new(v1.PersistentVolumeMode)
+ *obj.Spec.VolumeMode = v1.PersistentVolumeFilesystem
+ }
+}
+func SetDefaults_PersistentVolumeClaim(obj *v1.PersistentVolumeClaim) {
+ if obj.Status.Phase == "" {
+ obj.Status.Phase = v1.ClaimPending
+ }
+ if obj.Spec.VolumeMode == nil && utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) {
+ obj.Spec.VolumeMode = new(v1.PersistentVolumeMode)
+ *obj.Spec.VolumeMode = v1.PersistentVolumeFilesystem
+ }
+}
+func SetDefaults_ISCSIVolumeSource(obj *v1.ISCSIVolumeSource) {
+ if obj.ISCSIInterface == "" {
+ obj.ISCSIInterface = "default"
+ }
+}
+func SetDefaults_ISCSIPersistentVolumeSource(obj *v1.ISCSIPersistentVolumeSource) {
+ if obj.ISCSIInterface == "" {
+ obj.ISCSIInterface = "default"
+ }
+}
+func SetDefaults_AzureDiskVolumeSource(obj *v1.AzureDiskVolumeSource) {
+ if obj.CachingMode == nil {
+ obj.CachingMode = new(v1.AzureDataDiskCachingMode)
+ *obj.CachingMode = v1.AzureDataDiskCachingReadWrite
+ }
+ if obj.Kind == nil {
+ obj.Kind = new(v1.AzureDataDiskKind)
+ *obj.Kind = v1.AzureSharedBlobDisk
+ }
+ if obj.FSType == nil {
+ obj.FSType = new(string)
+ *obj.FSType = "ext4"
+ }
+ if obj.ReadOnly == nil {
+ obj.ReadOnly = new(bool)
+ *obj.ReadOnly = false
+ }
+}
+func SetDefaults_Endpoints(obj *v1.Endpoints) {
+ for i := range obj.Subsets {
+ ss := &obj.Subsets[i]
+ for i := range ss.Ports {
+ ep := &ss.Ports[i]
+ if ep.Protocol == "" {
+ ep.Protocol = v1.ProtocolTCP
+ }
+ }
+ }
+}
+func SetDefaults_HTTPGetAction(obj *v1.HTTPGetAction) {
+ if obj.Path == "" {
+ obj.Path = "/"
+ }
+ if obj.Scheme == "" {
+ obj.Scheme = v1.URISchemeHTTP
+ }
+}
+func SetDefaults_NamespaceStatus(obj *v1.NamespaceStatus) {
+ if obj.Phase == "" {
+ obj.Phase = v1.NamespaceActive
+ }
+}
+func SetDefaults_Node(obj *v1.Node) {
+ if obj.Spec.ExternalID == "" {
+ obj.Spec.ExternalID = obj.Name
+ }
+}
+func SetDefaults_NodeStatus(obj *v1.NodeStatus) {
+ if obj.Allocatable == nil && obj.Capacity != nil {
+ obj.Allocatable = make(v1.ResourceList, len(obj.Capacity))
+ for key, value := range obj.Capacity {
+ obj.Allocatable[key] = *(value.Copy())
+ }
+ obj.Allocatable = obj.Capacity
+ }
+}
+func SetDefaults_ObjectFieldSelector(obj *v1.ObjectFieldSelector) {
+ if obj.APIVersion == "" {
+ obj.APIVersion = "v1"
+ }
+}
+func SetDefaults_LimitRangeItem(obj *v1.LimitRangeItem) {
+ // for container limits, we apply default values
+ if obj.Type == v1.LimitTypeContainer {
+
+ if obj.Default == nil {
+ obj.Default = make(v1.ResourceList)
+ }
+ if obj.DefaultRequest == nil {
+ obj.DefaultRequest = make(v1.ResourceList)
+ }
+
+ // If a default limit is unspecified, but the max is specified, default the limit to the max
+ for key, value := range obj.Max {
+ if _, exists := obj.Default[key]; !exists {
+ obj.Default[key] = *(value.Copy())
+ }
+ }
+ // If a default limit is specified, but the default request is not, default request to limit
+ for key, value := range obj.Default {
+ if _, exists := obj.DefaultRequest[key]; !exists {
+ obj.DefaultRequest[key] = *(value.Copy())
+ }
+ }
+ // If a default request is not specified, but the min is provided, default request to the min
+ for key, value := range obj.Min {
+ if _, exists := obj.DefaultRequest[key]; !exists {
+ obj.DefaultRequest[key] = *(value.Copy())
+ }
+ }
+ }
+}
+func SetDefaults_ConfigMap(obj *v1.ConfigMap) {
+ if obj.Data == nil {
+ obj.Data = make(map[string]string)
+ }
+}
+
+// With host networking default all container ports to host ports.
+func defaultHostNetworkPorts(containers *[]v1.Container) {
+ for i := range *containers {
+ for j := range (*containers)[i].Ports {
+ if (*containers)[i].Ports[j].HostPort == 0 {
+ (*containers)[i].Ports[j].HostPort = (*containers)[i].Ports[j].ContainerPort
+ }
+ }
+ }
+}
+
+func SetDefaults_RBDVolumeSource(obj *v1.RBDVolumeSource) {
+ if obj.RBDPool == "" {
+ obj.RBDPool = "rbd"
+ }
+ if obj.RadosUser == "" {
+ obj.RadosUser = "admin"
+ }
+ if obj.Keyring == "" {
+ obj.Keyring = "/etc/ceph/keyring"
+ }
+}
+
+func SetDefaults_RBDPersistentVolumeSource(obj *v1.RBDPersistentVolumeSource) {
+ if obj.RBDPool == "" {
+ obj.RBDPool = "rbd"
+ }
+ if obj.RadosUser == "" {
+ obj.RadosUser = "admin"
+ }
+ if obj.Keyring == "" {
+ obj.Keyring = "/etc/ceph/keyring"
+ }
+}
+
+func SetDefaults_ScaleIOVolumeSource(obj *v1.ScaleIOVolumeSource) {
+ if obj.StorageMode == "" {
+ obj.StorageMode = "ThinProvisioned"
+ }
+ if obj.FSType == "" {
+ obj.FSType = "xfs"
+ }
+}
+
+func SetDefaults_ScaleIOPersistentVolumeSource(obj *v1.ScaleIOPersistentVolumeSource) {
+ if obj.StorageMode == "" {
+ obj.StorageMode = "ThinProvisioned"
+ }
+ if obj.FSType == "" {
+ obj.FSType = "xfs"
+ }
+}
+
+func SetDefaults_HostPathVolumeSource(obj *v1.HostPathVolumeSource) {
+ typeVol := v1.HostPathUnset
+ if obj.Type == nil {
+ obj.Type = &typeVol
+ }
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/doc.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/doc.go
new file mode 100644
index 000000000..454e30183
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/doc.go
@@ -0,0 +1,23 @@
+/*
+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.
+*/
+
+// +k8s:conversion-gen=k8s.io/kubernetes/pkg/apis/core
+// +k8s:conversion-gen-external-types=k8s.io/api/core/v1
+// +k8s:defaulter-gen=TypeMeta
+// +k8s:defaulter-gen-input=../../../../vendor/k8s.io/api/core/v1
+
+// Package v1 is the v1 version of the API.
+package v1 // import "k8s.io/kubernetes/pkg/apis/core/v1"
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/helpers.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/helpers.go
new file mode 100644
index 000000000..bb6d9385f
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/helpers.go
@@ -0,0 +1,450 @@
+/*
+Copyright 2014 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 helper
+
+import (
+ "encoding/json"
+ "fmt"
+ "strings"
+
+ "k8s.io/api/core/v1"
+ "k8s.io/apimachinery/pkg/api/resource"
+ "k8s.io/apimachinery/pkg/labels"
+ "k8s.io/apimachinery/pkg/selection"
+ "k8s.io/apimachinery/pkg/util/sets"
+ "k8s.io/apimachinery/pkg/util/validation"
+ "k8s.io/kubernetes/pkg/apis/core/helper"
+)
+
+// IsExtendedResourceName returns true if:
+// 1. the resource name is not in the default namespace;
+// 2. resource name does not have "requests." prefix,
+// to avoid confusion with the convention in quota
+// 3. it satisfies the rules in IsQualifiedName() after converted into quota resource name
+func IsExtendedResourceName(name v1.ResourceName) bool {
+ if IsDefaultNamespaceResource(name) || strings.HasPrefix(string(name), v1.DefaultResourceRequestsPrefix) {
+ return false
+ }
+ // Ensure it satisfies the rules in IsQualifiedName() after converted into quota resource name
+ nameForQuota := fmt.Sprintf("%s%s", v1.DefaultResourceRequestsPrefix, string(name))
+ if errs := validation.IsQualifiedName(string(nameForQuota)); len(errs) != 0 {
+ return false
+ }
+ return true
+}
+
+// IsDefaultNamespaceResource returns true if the resource name is in the
+// *kubernetes.io/ namespace. Partially-qualified (unprefixed) names are
+// implicitly in the kubernetes.io/ namespace.
+func IsDefaultNamespaceResource(name v1.ResourceName) bool {
+ return !strings.Contains(string(name), "/") ||
+ strings.Contains(string(name), v1.ResourceDefaultNamespacePrefix)
+
+}
+
+// IsHugePageResourceName returns true if the resource name has the huge page
+// resource prefix.
+func IsHugePageResourceName(name v1.ResourceName) bool {
+ return strings.HasPrefix(string(name), v1.ResourceHugePagesPrefix)
+}
+
+// HugePageResourceName returns a ResourceName with the canonical hugepage
+// prefix prepended for the specified page size. The page size is converted
+// to its canonical representation.
+func HugePageResourceName(pageSize resource.Quantity) v1.ResourceName {
+ return v1.ResourceName(fmt.Sprintf("%s%s", v1.ResourceHugePagesPrefix, pageSize.String()))
+}
+
+// HugePageSizeFromResourceName returns the page size for the specified huge page
+// resource name. If the specified input is not a valid huge page resource name
+// an error is returned.
+func HugePageSizeFromResourceName(name v1.ResourceName) (resource.Quantity, error) {
+ if !IsHugePageResourceName(name) {
+ return resource.Quantity{}, fmt.Errorf("resource name: %s is not valid hugepage name", name)
+ }
+ pageSize := strings.TrimPrefix(string(name), v1.ResourceHugePagesPrefix)
+ return resource.ParseQuantity(pageSize)
+}
+
+var overcommitBlacklist = sets.NewString(string(v1.ResourceNvidiaGPU))
+
+// IsOvercommitAllowed returns true if the resource is in the default
+// namespace and not blacklisted and is not hugepages.
+func IsOvercommitAllowed(name v1.ResourceName) bool {
+ return IsDefaultNamespaceResource(name) &&
+ !IsHugePageResourceName(name) &&
+ !overcommitBlacklist.Has(string(name))
+}
+
+// Extended and Hugepages resources
+func IsScalarResourceName(name v1.ResourceName) bool {
+ return IsExtendedResourceName(name) || IsHugePageResourceName(name)
+}
+
+// this function aims to check if the service's ClusterIP is set or not
+// the objective is not to perform validation here
+func IsServiceIPSet(service *v1.Service) bool {
+ return service.Spec.ClusterIP != v1.ClusterIPNone && service.Spec.ClusterIP != ""
+}
+
+// AddToNodeAddresses appends the NodeAddresses to the passed-by-pointer slice,
+// only if they do not already exist
+func AddToNodeAddresses(addresses *[]v1.NodeAddress, addAddresses ...v1.NodeAddress) {
+ for _, add := range addAddresses {
+ exists := false
+ for _, existing := range *addresses {
+ if existing.Address == add.Address && existing.Type == add.Type {
+ exists = true
+ break
+ }
+ }
+ if !exists {
+ *addresses = append(*addresses, add)
+ }
+ }
+}
+
+// TODO: make method on LoadBalancerStatus?
+func LoadBalancerStatusEqual(l, r *v1.LoadBalancerStatus) bool {
+ return ingressSliceEqual(l.Ingress, r.Ingress)
+}
+
+func ingressSliceEqual(lhs, rhs []v1.LoadBalancerIngress) bool {
+ if len(lhs) != len(rhs) {
+ return false
+ }
+ for i := range lhs {
+ if !ingressEqual(&lhs[i], &rhs[i]) {
+ return false
+ }
+ }
+ return true
+}
+
+func ingressEqual(lhs, rhs *v1.LoadBalancerIngress) bool {
+ if lhs.IP != rhs.IP {
+ return false
+ }
+ if lhs.Hostname != rhs.Hostname {
+ return false
+ }
+ return true
+}
+
+// TODO: make method on LoadBalancerStatus?
+func LoadBalancerStatusDeepCopy(lb *v1.LoadBalancerStatus) *v1.LoadBalancerStatus {
+ c := &v1.LoadBalancerStatus{}
+ c.Ingress = make([]v1.LoadBalancerIngress, len(lb.Ingress))
+ for i := range lb.Ingress {
+ c.Ingress[i] = lb.Ingress[i]
+ }
+ return c
+}
+
+// GetAccessModesAsString returns a string representation of an array of access modes.
+// modes, when present, are always in the same order: RWO,ROX,RWX.
+func GetAccessModesAsString(modes []v1.PersistentVolumeAccessMode) string {
+ modes = removeDuplicateAccessModes(modes)
+ modesStr := []string{}
+ if containsAccessMode(modes, v1.ReadWriteOnce) {
+ modesStr = append(modesStr, "RWO")
+ }
+ if containsAccessMode(modes, v1.ReadOnlyMany) {
+ modesStr = append(modesStr, "ROX")
+ }
+ if containsAccessMode(modes, v1.ReadWriteMany) {
+ modesStr = append(modesStr, "RWX")
+ }
+ return strings.Join(modesStr, ",")
+}
+
+// GetAccessModesAsString returns an array of AccessModes from a string created by GetAccessModesAsString
+func GetAccessModesFromString(modes string) []v1.PersistentVolumeAccessMode {
+ strmodes := strings.Split(modes, ",")
+ accessModes := []v1.PersistentVolumeAccessMode{}
+ for _, s := range strmodes {
+ s = strings.Trim(s, " ")
+ switch {
+ case s == "RWO":
+ accessModes = append(accessModes, v1.ReadWriteOnce)
+ case s == "ROX":
+ accessModes = append(accessModes, v1.ReadOnlyMany)
+ case s == "RWX":
+ accessModes = append(accessModes, v1.ReadWriteMany)
+ }
+ }
+ return accessModes
+}
+
+// removeDuplicateAccessModes returns an array of access modes without any duplicates
+func removeDuplicateAccessModes(modes []v1.PersistentVolumeAccessMode) []v1.PersistentVolumeAccessMode {
+ accessModes := []v1.PersistentVolumeAccessMode{}
+ for _, m := range modes {
+ if !containsAccessMode(accessModes, m) {
+ accessModes = append(accessModes, m)
+ }
+ }
+ return accessModes
+}
+
+func containsAccessMode(modes []v1.PersistentVolumeAccessMode, mode v1.PersistentVolumeAccessMode) bool {
+ for _, m := range modes {
+ if m == mode {
+ return true
+ }
+ }
+ return false
+}
+
+// NodeSelectorRequirementsAsSelector converts the []NodeSelectorRequirement api type into a struct that implements
+// labels.Selector.
+func NodeSelectorRequirementsAsSelector(nsm []v1.NodeSelectorRequirement) (labels.Selector, error) {
+ if len(nsm) == 0 {
+ return labels.Nothing(), nil
+ }
+ selector := labels.NewSelector()
+ for _, expr := range nsm {
+ var op selection.Operator
+ switch expr.Operator {
+ case v1.NodeSelectorOpIn:
+ op = selection.In
+ case v1.NodeSelectorOpNotIn:
+ op = selection.NotIn
+ case v1.NodeSelectorOpExists:
+ op = selection.Exists
+ case v1.NodeSelectorOpDoesNotExist:
+ op = selection.DoesNotExist
+ case v1.NodeSelectorOpGt:
+ op = selection.GreaterThan
+ case v1.NodeSelectorOpLt:
+ op = selection.LessThan
+ default:
+ return nil, fmt.Errorf("%q is not a valid node selector operator", expr.Operator)
+ }
+ r, err := labels.NewRequirement(expr.Key, op, expr.Values)
+ if err != nil {
+ return nil, err
+ }
+ selector = selector.Add(*r)
+ }
+ return selector, nil
+}
+
+// AddOrUpdateTolerationInPodSpec tries to add a toleration to the toleration list in PodSpec.
+// Returns true if something was updated, false otherwise.
+func AddOrUpdateTolerationInPodSpec(spec *v1.PodSpec, toleration *v1.Toleration) bool {
+ podTolerations := spec.Tolerations
+
+ var newTolerations []v1.Toleration
+ updated := false
+ for i := range podTolerations {
+ if toleration.MatchToleration(&podTolerations[i]) {
+ if helper.Semantic.DeepEqual(toleration, podTolerations[i]) {
+ return false
+ }
+ newTolerations = append(newTolerations, *toleration)
+ updated = true
+ continue
+ }
+
+ newTolerations = append(newTolerations, podTolerations[i])
+ }
+
+ if !updated {
+ newTolerations = append(newTolerations, *toleration)
+ }
+
+ spec.Tolerations = newTolerations
+ return true
+}
+
+// AddOrUpdateTolerationInPod tries to add a toleration to the pod's toleration list.
+// Returns true if something was updated, false otherwise.
+func AddOrUpdateTolerationInPod(pod *v1.Pod, toleration *v1.Toleration) bool {
+ return AddOrUpdateTolerationInPodSpec(&pod.Spec, toleration)
+}
+
+// TolerationsTolerateTaint checks if taint is tolerated by any of the tolerations.
+func TolerationsTolerateTaint(tolerations []v1.Toleration, taint *v1.Taint) bool {
+ for i := range tolerations {
+ if tolerations[i].ToleratesTaint(taint) {
+ return true
+ }
+ }
+ return false
+}
+
+type taintsFilterFunc func(*v1.Taint) bool
+
+// TolerationsTolerateTaintsWithFilter checks if given tolerations tolerates
+// all the taints that apply to the filter in given taint list.
+func TolerationsTolerateTaintsWithFilter(tolerations []v1.Toleration, taints []v1.Taint, applyFilter taintsFilterFunc) bool {
+ if len(taints) == 0 {
+ return true
+ }
+
+ for i := range taints {
+ if applyFilter != nil && !applyFilter(&taints[i]) {
+ continue
+ }
+
+ if !TolerationsTolerateTaint(tolerations, &taints[i]) {
+ return false
+ }
+ }
+
+ return true
+}
+
+// Returns true and list of Tolerations matching all Taints if all are tolerated, or false otherwise.
+func GetMatchingTolerations(taints []v1.Taint, tolerations []v1.Toleration) (bool, []v1.Toleration) {
+ if len(taints) == 0 {
+ return true, []v1.Toleration{}
+ }
+ if len(tolerations) == 0 && len(taints) > 0 {
+ return false, []v1.Toleration{}
+ }
+ result := []v1.Toleration{}
+ for i := range taints {
+ tolerated := false
+ for j := range tolerations {
+ if tolerations[j].ToleratesTaint(&taints[i]) {
+ result = append(result, tolerations[j])
+ tolerated = true
+ break
+ }
+ }
+ if !tolerated {
+ return false, []v1.Toleration{}
+ }
+ }
+ return true, result
+}
+
+func GetAvoidPodsFromNodeAnnotations(annotations map[string]string) (v1.AvoidPods, error) {
+ var avoidPods v1.AvoidPods
+ if len(annotations) > 0 && annotations[v1.PreferAvoidPodsAnnotationKey] != "" {
+ err := json.Unmarshal([]byte(annotations[v1.PreferAvoidPodsAnnotationKey]), &avoidPods)
+ if err != nil {
+ return avoidPods, err
+ }
+ }
+ return avoidPods, nil
+}
+
+// SysctlsFromPodAnnotations parses the sysctl annotations into a slice of safe Sysctls
+// and a slice of unsafe Sysctls. This is only a convenience wrapper around
+// SysctlsFromPodAnnotation.
+func SysctlsFromPodAnnotations(a map[string]string) ([]v1.Sysctl, []v1.Sysctl, error) {
+ safe, err := SysctlsFromPodAnnotation(a[v1.SysctlsPodAnnotationKey])
+ if err != nil {
+ return nil, nil, err
+ }
+ unsafe, err := SysctlsFromPodAnnotation(a[v1.UnsafeSysctlsPodAnnotationKey])
+ if err != nil {
+ return nil, nil, err
+ }
+
+ return safe, unsafe, nil
+}
+
+// SysctlsFromPodAnnotation parses an annotation value into a slice of Sysctls.
+func SysctlsFromPodAnnotation(annotation string) ([]v1.Sysctl, error) {
+ if len(annotation) == 0 {
+ return nil, nil
+ }
+
+ kvs := strings.Split(annotation, ",")
+ sysctls := make([]v1.Sysctl, len(kvs))
+ for i, kv := range kvs {
+ cs := strings.Split(kv, "=")
+ if len(cs) != 2 || len(cs[0]) == 0 {
+ return nil, fmt.Errorf("sysctl %q not of the format sysctl_name=value", kv)
+ }
+ sysctls[i].Name = cs[0]
+ sysctls[i].Value = cs[1]
+ }
+ return sysctls, nil
+}
+
+// PodAnnotationsFromSysctls creates an annotation value for a slice of Sysctls.
+func PodAnnotationsFromSysctls(sysctls []v1.Sysctl) string {
+ if len(sysctls) == 0 {
+ return ""
+ }
+
+ kvs := make([]string, len(sysctls))
+ for i := range sysctls {
+ kvs[i] = fmt.Sprintf("%s=%s", sysctls[i].Name, sysctls[i].Value)
+ }
+ return strings.Join(kvs, ",")
+}
+
+// GetPersistentVolumeClass returns StorageClassName.
+func GetPersistentVolumeClass(volume *v1.PersistentVolume) string {
+ // Use beta annotation first
+ if class, found := volume.Annotations[v1.BetaStorageClassAnnotation]; found {
+ return class
+ }
+
+ return volume.Spec.StorageClassName
+}
+
+// GetPersistentVolumeClaimClass returns StorageClassName. If no storage class was
+// requested, it returns "".
+func GetPersistentVolumeClaimClass(claim *v1.PersistentVolumeClaim) string {
+ // Use beta annotation first
+ if class, found := claim.Annotations[v1.BetaStorageClassAnnotation]; found {
+ return class
+ }
+
+ if claim.Spec.StorageClassName != nil {
+ return *claim.Spec.StorageClassName
+ }
+
+ return ""
+}
+
+// GetStorageNodeAffinityFromAnnotation gets the json serialized data from PersistentVolume.Annotations
+// and converts it to the NodeAffinity type in api.
+// TODO: update when storage node affinity graduates to beta
+func GetStorageNodeAffinityFromAnnotation(annotations map[string]string) (*v1.NodeAffinity, error) {
+ if len(annotations) > 0 && annotations[v1.AlphaStorageNodeAffinityAnnotation] != "" {
+ var affinity v1.NodeAffinity
+ err := json.Unmarshal([]byte(annotations[v1.AlphaStorageNodeAffinityAnnotation]), &affinity)
+ if err != nil {
+ return nil, err
+ }
+ return &affinity, nil
+ }
+ return nil, nil
+}
+
+// Converts NodeAffinity type to Alpha annotation for use in PersistentVolumes
+// TODO: update when storage node affinity graduates to beta
+func StorageNodeAffinityToAlphaAnnotation(annotations map[string]string, affinity *v1.NodeAffinity) error {
+ if affinity == nil {
+ return nil
+ }
+
+ json, err := json.Marshal(*affinity)
+ if err != nil {
+ return err
+ }
+ annotations[v1.AlphaStorageNodeAffinityAnnotation] = string(json)
+ return nil
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/register.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/register.go
new file mode 100644
index 000000000..79611beab
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/register.go
@@ -0,0 +1,46 @@
+/*
+Copyright 2017 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 (
+ "k8s.io/api/core/v1"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+var (
+ localSchemeBuilder = &v1.SchemeBuilder
+ AddToScheme = localSchemeBuilder.AddToScheme
+)
+
+func init() {
+ // We only register manually written functions here. The registration of the
+ // generated functions takes place in the generated files. The separation
+ // makes the code compile even when the generated files are missing.
+ localSchemeBuilder.Register(addDefaultingFuncs, addConversionFuncs, addFastPathConversionFuncs)
+}
+
+// TODO: remove these global varialbes
+// GroupName is the group name use in this package
+const GroupName = ""
+
+// SchemeGroupVersion is group version used to register these objects
+var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"}
+
+// Resource takes an unqualified resource and returns a Group qualified GroupResource
+func Resource(resource string) schema.GroupResource {
+ return SchemeGroupVersion.WithResource(resource).GroupResource()
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go
new file mode 100644
index 000000000..17773f26e
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go
@@ -0,0 +1,5686 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright 2018 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.
+*/
+
+// Code generated by conversion-gen. DO NOT EDIT.
+
+package v1
+
+import (
+ unsafe "unsafe"
+
+ v1 "k8s.io/api/core/v1"
+ resource "k8s.io/apimachinery/pkg/api/resource"
+ meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ conversion "k8s.io/apimachinery/pkg/conversion"
+ runtime "k8s.io/apimachinery/pkg/runtime"
+ types "k8s.io/apimachinery/pkg/types"
+ core "k8s.io/kubernetes/pkg/apis/core"
+)
+
+func init() {
+ localSchemeBuilder.Register(RegisterConversions)
+}
+
+// RegisterConversions adds conversion functions to the given scheme.
+// Public to allow building arbitrary schemes.
+func RegisterConversions(scheme *runtime.Scheme) error {
+ return scheme.AddGeneratedConversionFuncs(
+ Convert_v1_AWSElasticBlockStoreVolumeSource_To_core_AWSElasticBlockStoreVolumeSource,
+ Convert_core_AWSElasticBlockStoreVolumeSource_To_v1_AWSElasticBlockStoreVolumeSource,
+ Convert_v1_Affinity_To_core_Affinity,
+ Convert_core_Affinity_To_v1_Affinity,
+ Convert_v1_AttachedVolume_To_core_AttachedVolume,
+ Convert_core_AttachedVolume_To_v1_AttachedVolume,
+ Convert_v1_AvoidPods_To_core_AvoidPods,
+ Convert_core_AvoidPods_To_v1_AvoidPods,
+ Convert_v1_AzureDiskVolumeSource_To_core_AzureDiskVolumeSource,
+ Convert_core_AzureDiskVolumeSource_To_v1_AzureDiskVolumeSource,
+ Convert_v1_AzureFilePersistentVolumeSource_To_core_AzureFilePersistentVolumeSource,
+ Convert_core_AzureFilePersistentVolumeSource_To_v1_AzureFilePersistentVolumeSource,
+ Convert_v1_AzureFileVolumeSource_To_core_AzureFileVolumeSource,
+ Convert_core_AzureFileVolumeSource_To_v1_AzureFileVolumeSource,
+ Convert_v1_Binding_To_core_Binding,
+ Convert_core_Binding_To_v1_Binding,
+ Convert_v1_CSIPersistentVolumeSource_To_core_CSIPersistentVolumeSource,
+ Convert_core_CSIPersistentVolumeSource_To_v1_CSIPersistentVolumeSource,
+ Convert_v1_Capabilities_To_core_Capabilities,
+ Convert_core_Capabilities_To_v1_Capabilities,
+ Convert_v1_CephFSPersistentVolumeSource_To_core_CephFSPersistentVolumeSource,
+ Convert_core_CephFSPersistentVolumeSource_To_v1_CephFSPersistentVolumeSource,
+ Convert_v1_CephFSVolumeSource_To_core_CephFSVolumeSource,
+ Convert_core_CephFSVolumeSource_To_v1_CephFSVolumeSource,
+ Convert_v1_CinderVolumeSource_To_core_CinderVolumeSource,
+ Convert_core_CinderVolumeSource_To_v1_CinderVolumeSource,
+ Convert_v1_ClientIPConfig_To_core_ClientIPConfig,
+ Convert_core_ClientIPConfig_To_v1_ClientIPConfig,
+ Convert_v1_ComponentCondition_To_core_ComponentCondition,
+ Convert_core_ComponentCondition_To_v1_ComponentCondition,
+ Convert_v1_ComponentStatus_To_core_ComponentStatus,
+ Convert_core_ComponentStatus_To_v1_ComponentStatus,
+ Convert_v1_ComponentStatusList_To_core_ComponentStatusList,
+ Convert_core_ComponentStatusList_To_v1_ComponentStatusList,
+ Convert_v1_ConfigMap_To_core_ConfigMap,
+ Convert_core_ConfigMap_To_v1_ConfigMap,
+ Convert_v1_ConfigMapEnvSource_To_core_ConfigMapEnvSource,
+ Convert_core_ConfigMapEnvSource_To_v1_ConfigMapEnvSource,
+ Convert_v1_ConfigMapKeySelector_To_core_ConfigMapKeySelector,
+ Convert_core_ConfigMapKeySelector_To_v1_ConfigMapKeySelector,
+ Convert_v1_ConfigMapList_To_core_ConfigMapList,
+ Convert_core_ConfigMapList_To_v1_ConfigMapList,
+ Convert_v1_ConfigMapProjection_To_core_ConfigMapProjection,
+ Convert_core_ConfigMapProjection_To_v1_ConfigMapProjection,
+ Convert_v1_ConfigMapVolumeSource_To_core_ConfigMapVolumeSource,
+ Convert_core_ConfigMapVolumeSource_To_v1_ConfigMapVolumeSource,
+ Convert_v1_Container_To_core_Container,
+ Convert_core_Container_To_v1_Container,
+ Convert_v1_ContainerImage_To_core_ContainerImage,
+ Convert_core_ContainerImage_To_v1_ContainerImage,
+ Convert_v1_ContainerPort_To_core_ContainerPort,
+ Convert_core_ContainerPort_To_v1_ContainerPort,
+ Convert_v1_ContainerState_To_core_ContainerState,
+ Convert_core_ContainerState_To_v1_ContainerState,
+ Convert_v1_ContainerStateRunning_To_core_ContainerStateRunning,
+ Convert_core_ContainerStateRunning_To_v1_ContainerStateRunning,
+ Convert_v1_ContainerStateTerminated_To_core_ContainerStateTerminated,
+ Convert_core_ContainerStateTerminated_To_v1_ContainerStateTerminated,
+ Convert_v1_ContainerStateWaiting_To_core_ContainerStateWaiting,
+ Convert_core_ContainerStateWaiting_To_v1_ContainerStateWaiting,
+ Convert_v1_ContainerStatus_To_core_ContainerStatus,
+ Convert_core_ContainerStatus_To_v1_ContainerStatus,
+ Convert_v1_DaemonEndpoint_To_core_DaemonEndpoint,
+ Convert_core_DaemonEndpoint_To_v1_DaemonEndpoint,
+ Convert_v1_DeleteOptions_To_core_DeleteOptions,
+ Convert_core_DeleteOptions_To_v1_DeleteOptions,
+ Convert_v1_DownwardAPIProjection_To_core_DownwardAPIProjection,
+ Convert_core_DownwardAPIProjection_To_v1_DownwardAPIProjection,
+ Convert_v1_DownwardAPIVolumeFile_To_core_DownwardAPIVolumeFile,
+ Convert_core_DownwardAPIVolumeFile_To_v1_DownwardAPIVolumeFile,
+ Convert_v1_DownwardAPIVolumeSource_To_core_DownwardAPIVolumeSource,
+ Convert_core_DownwardAPIVolumeSource_To_v1_DownwardAPIVolumeSource,
+ Convert_v1_EmptyDirVolumeSource_To_core_EmptyDirVolumeSource,
+ Convert_core_EmptyDirVolumeSource_To_v1_EmptyDirVolumeSource,
+ Convert_v1_EndpointAddress_To_core_EndpointAddress,
+ Convert_core_EndpointAddress_To_v1_EndpointAddress,
+ Convert_v1_EndpointPort_To_core_EndpointPort,
+ Convert_core_EndpointPort_To_v1_EndpointPort,
+ Convert_v1_EndpointSubset_To_core_EndpointSubset,
+ Convert_core_EndpointSubset_To_v1_EndpointSubset,
+ Convert_v1_Endpoints_To_core_Endpoints,
+ Convert_core_Endpoints_To_v1_Endpoints,
+ Convert_v1_EndpointsList_To_core_EndpointsList,
+ Convert_core_EndpointsList_To_v1_EndpointsList,
+ Convert_v1_EnvFromSource_To_core_EnvFromSource,
+ Convert_core_EnvFromSource_To_v1_EnvFromSource,
+ Convert_v1_EnvVar_To_core_EnvVar,
+ Convert_core_EnvVar_To_v1_EnvVar,
+ Convert_v1_EnvVarSource_To_core_EnvVarSource,
+ Convert_core_EnvVarSource_To_v1_EnvVarSource,
+ Convert_v1_Event_To_core_Event,
+ Convert_core_Event_To_v1_Event,
+ Convert_v1_EventList_To_core_EventList,
+ Convert_core_EventList_To_v1_EventList,
+ Convert_v1_EventSeries_To_core_EventSeries,
+ Convert_core_EventSeries_To_v1_EventSeries,
+ Convert_v1_EventSource_To_core_EventSource,
+ Convert_core_EventSource_To_v1_EventSource,
+ Convert_v1_ExecAction_To_core_ExecAction,
+ Convert_core_ExecAction_To_v1_ExecAction,
+ Convert_v1_FCVolumeSource_To_core_FCVolumeSource,
+ Convert_core_FCVolumeSource_To_v1_FCVolumeSource,
+ Convert_v1_FlexPersistentVolumeSource_To_core_FlexPersistentVolumeSource,
+ Convert_core_FlexPersistentVolumeSource_To_v1_FlexPersistentVolumeSource,
+ Convert_v1_FlexVolumeSource_To_core_FlexVolumeSource,
+ Convert_core_FlexVolumeSource_To_v1_FlexVolumeSource,
+ Convert_v1_FlockerVolumeSource_To_core_FlockerVolumeSource,
+ Convert_core_FlockerVolumeSource_To_v1_FlockerVolumeSource,
+ Convert_v1_GCEPersistentDiskVolumeSource_To_core_GCEPersistentDiskVolumeSource,
+ Convert_core_GCEPersistentDiskVolumeSource_To_v1_GCEPersistentDiskVolumeSource,
+ Convert_v1_GitRepoVolumeSource_To_core_GitRepoVolumeSource,
+ Convert_core_GitRepoVolumeSource_To_v1_GitRepoVolumeSource,
+ Convert_v1_GlusterfsVolumeSource_To_core_GlusterfsVolumeSource,
+ Convert_core_GlusterfsVolumeSource_To_v1_GlusterfsVolumeSource,
+ Convert_v1_HTTPGetAction_To_core_HTTPGetAction,
+ Convert_core_HTTPGetAction_To_v1_HTTPGetAction,
+ Convert_v1_HTTPHeader_To_core_HTTPHeader,
+ Convert_core_HTTPHeader_To_v1_HTTPHeader,
+ Convert_v1_Handler_To_core_Handler,
+ Convert_core_Handler_To_v1_Handler,
+ Convert_v1_HostAlias_To_core_HostAlias,
+ Convert_core_HostAlias_To_v1_HostAlias,
+ Convert_v1_HostPathVolumeSource_To_core_HostPathVolumeSource,
+ Convert_core_HostPathVolumeSource_To_v1_HostPathVolumeSource,
+ Convert_v1_ISCSIPersistentVolumeSource_To_core_ISCSIPersistentVolumeSource,
+ Convert_core_ISCSIPersistentVolumeSource_To_v1_ISCSIPersistentVolumeSource,
+ Convert_v1_ISCSIVolumeSource_To_core_ISCSIVolumeSource,
+ Convert_core_ISCSIVolumeSource_To_v1_ISCSIVolumeSource,
+ Convert_v1_KeyToPath_To_core_KeyToPath,
+ Convert_core_KeyToPath_To_v1_KeyToPath,
+ Convert_v1_Lifecycle_To_core_Lifecycle,
+ Convert_core_Lifecycle_To_v1_Lifecycle,
+ Convert_v1_LimitRange_To_core_LimitRange,
+ Convert_core_LimitRange_To_v1_LimitRange,
+ Convert_v1_LimitRangeItem_To_core_LimitRangeItem,
+ Convert_core_LimitRangeItem_To_v1_LimitRangeItem,
+ Convert_v1_LimitRangeList_To_core_LimitRangeList,
+ Convert_core_LimitRangeList_To_v1_LimitRangeList,
+ Convert_v1_LimitRangeSpec_To_core_LimitRangeSpec,
+ Convert_core_LimitRangeSpec_To_v1_LimitRangeSpec,
+ Convert_v1_List_To_core_List,
+ Convert_core_List_To_v1_List,
+ Convert_v1_ListOptions_To_core_ListOptions,
+ Convert_core_ListOptions_To_v1_ListOptions,
+ Convert_v1_LoadBalancerIngress_To_core_LoadBalancerIngress,
+ Convert_core_LoadBalancerIngress_To_v1_LoadBalancerIngress,
+ Convert_v1_LoadBalancerStatus_To_core_LoadBalancerStatus,
+ Convert_core_LoadBalancerStatus_To_v1_LoadBalancerStatus,
+ Convert_v1_LocalObjectReference_To_core_LocalObjectReference,
+ Convert_core_LocalObjectReference_To_v1_LocalObjectReference,
+ Convert_v1_LocalVolumeSource_To_core_LocalVolumeSource,
+ Convert_core_LocalVolumeSource_To_v1_LocalVolumeSource,
+ Convert_v1_NFSVolumeSource_To_core_NFSVolumeSource,
+ Convert_core_NFSVolumeSource_To_v1_NFSVolumeSource,
+ Convert_v1_Namespace_To_core_Namespace,
+ Convert_core_Namespace_To_v1_Namespace,
+ Convert_v1_NamespaceList_To_core_NamespaceList,
+ Convert_core_NamespaceList_To_v1_NamespaceList,
+ Convert_v1_NamespaceSpec_To_core_NamespaceSpec,
+ Convert_core_NamespaceSpec_To_v1_NamespaceSpec,
+ Convert_v1_NamespaceStatus_To_core_NamespaceStatus,
+ Convert_core_NamespaceStatus_To_v1_NamespaceStatus,
+ Convert_v1_Node_To_core_Node,
+ Convert_core_Node_To_v1_Node,
+ Convert_v1_NodeAddress_To_core_NodeAddress,
+ Convert_core_NodeAddress_To_v1_NodeAddress,
+ Convert_v1_NodeAffinity_To_core_NodeAffinity,
+ Convert_core_NodeAffinity_To_v1_NodeAffinity,
+ Convert_v1_NodeCondition_To_core_NodeCondition,
+ Convert_core_NodeCondition_To_v1_NodeCondition,
+ Convert_v1_NodeConfigSource_To_core_NodeConfigSource,
+ Convert_core_NodeConfigSource_To_v1_NodeConfigSource,
+ Convert_v1_NodeDaemonEndpoints_To_core_NodeDaemonEndpoints,
+ Convert_core_NodeDaemonEndpoints_To_v1_NodeDaemonEndpoints,
+ Convert_v1_NodeList_To_core_NodeList,
+ Convert_core_NodeList_To_v1_NodeList,
+ Convert_v1_NodeProxyOptions_To_core_NodeProxyOptions,
+ Convert_core_NodeProxyOptions_To_v1_NodeProxyOptions,
+ Convert_v1_NodeResources_To_core_NodeResources,
+ Convert_core_NodeResources_To_v1_NodeResources,
+ Convert_v1_NodeSelector_To_core_NodeSelector,
+ Convert_core_NodeSelector_To_v1_NodeSelector,
+ Convert_v1_NodeSelectorRequirement_To_core_NodeSelectorRequirement,
+ Convert_core_NodeSelectorRequirement_To_v1_NodeSelectorRequirement,
+ Convert_v1_NodeSelectorTerm_To_core_NodeSelectorTerm,
+ Convert_core_NodeSelectorTerm_To_v1_NodeSelectorTerm,
+ Convert_v1_NodeSpec_To_core_NodeSpec,
+ Convert_core_NodeSpec_To_v1_NodeSpec,
+ Convert_v1_NodeStatus_To_core_NodeStatus,
+ Convert_core_NodeStatus_To_v1_NodeStatus,
+ Convert_v1_NodeSystemInfo_To_core_NodeSystemInfo,
+ Convert_core_NodeSystemInfo_To_v1_NodeSystemInfo,
+ Convert_v1_ObjectFieldSelector_To_core_ObjectFieldSelector,
+ Convert_core_ObjectFieldSelector_To_v1_ObjectFieldSelector,
+ Convert_v1_ObjectMeta_To_core_ObjectMeta,
+ Convert_core_ObjectMeta_To_v1_ObjectMeta,
+ Convert_v1_ObjectReference_To_core_ObjectReference,
+ Convert_core_ObjectReference_To_v1_ObjectReference,
+ Convert_v1_PersistentVolume_To_core_PersistentVolume,
+ Convert_core_PersistentVolume_To_v1_PersistentVolume,
+ Convert_v1_PersistentVolumeClaim_To_core_PersistentVolumeClaim,
+ Convert_core_PersistentVolumeClaim_To_v1_PersistentVolumeClaim,
+ Convert_v1_PersistentVolumeClaimCondition_To_core_PersistentVolumeClaimCondition,
+ Convert_core_PersistentVolumeClaimCondition_To_v1_PersistentVolumeClaimCondition,
+ Convert_v1_PersistentVolumeClaimList_To_core_PersistentVolumeClaimList,
+ Convert_core_PersistentVolumeClaimList_To_v1_PersistentVolumeClaimList,
+ Convert_v1_PersistentVolumeClaimSpec_To_core_PersistentVolumeClaimSpec,
+ Convert_core_PersistentVolumeClaimSpec_To_v1_PersistentVolumeClaimSpec,
+ Convert_v1_PersistentVolumeClaimStatus_To_core_PersistentVolumeClaimStatus,
+ Convert_core_PersistentVolumeClaimStatus_To_v1_PersistentVolumeClaimStatus,
+ Convert_v1_PersistentVolumeClaimVolumeSource_To_core_PersistentVolumeClaimVolumeSource,
+ Convert_core_PersistentVolumeClaimVolumeSource_To_v1_PersistentVolumeClaimVolumeSource,
+ Convert_v1_PersistentVolumeList_To_core_PersistentVolumeList,
+ Convert_core_PersistentVolumeList_To_v1_PersistentVolumeList,
+ Convert_v1_PersistentVolumeSource_To_core_PersistentVolumeSource,
+ Convert_core_PersistentVolumeSource_To_v1_PersistentVolumeSource,
+ Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec,
+ Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec,
+ Convert_v1_PersistentVolumeStatus_To_core_PersistentVolumeStatus,
+ Convert_core_PersistentVolumeStatus_To_v1_PersistentVolumeStatus,
+ Convert_v1_PhotonPersistentDiskVolumeSource_To_core_PhotonPersistentDiskVolumeSource,
+ Convert_core_PhotonPersistentDiskVolumeSource_To_v1_PhotonPersistentDiskVolumeSource,
+ Convert_v1_Pod_To_core_Pod,
+ Convert_core_Pod_To_v1_Pod,
+ Convert_v1_PodAffinity_To_core_PodAffinity,
+ Convert_core_PodAffinity_To_v1_PodAffinity,
+ Convert_v1_PodAffinityTerm_To_core_PodAffinityTerm,
+ Convert_core_PodAffinityTerm_To_v1_PodAffinityTerm,
+ Convert_v1_PodAntiAffinity_To_core_PodAntiAffinity,
+ Convert_core_PodAntiAffinity_To_v1_PodAntiAffinity,
+ Convert_v1_PodAttachOptions_To_core_PodAttachOptions,
+ Convert_core_PodAttachOptions_To_v1_PodAttachOptions,
+ Convert_v1_PodCondition_To_core_PodCondition,
+ Convert_core_PodCondition_To_v1_PodCondition,
+ Convert_v1_PodDNSConfig_To_core_PodDNSConfig,
+ Convert_core_PodDNSConfig_To_v1_PodDNSConfig,
+ Convert_v1_PodDNSConfigOption_To_core_PodDNSConfigOption,
+ Convert_core_PodDNSConfigOption_To_v1_PodDNSConfigOption,
+ Convert_v1_PodExecOptions_To_core_PodExecOptions,
+ Convert_core_PodExecOptions_To_v1_PodExecOptions,
+ Convert_v1_PodList_To_core_PodList,
+ Convert_core_PodList_To_v1_PodList,
+ Convert_v1_PodLogOptions_To_core_PodLogOptions,
+ Convert_core_PodLogOptions_To_v1_PodLogOptions,
+ Convert_v1_PodPortForwardOptions_To_core_PodPortForwardOptions,
+ Convert_core_PodPortForwardOptions_To_v1_PodPortForwardOptions,
+ Convert_v1_PodProxyOptions_To_core_PodProxyOptions,
+ Convert_core_PodProxyOptions_To_v1_PodProxyOptions,
+ Convert_v1_PodSecurityContext_To_core_PodSecurityContext,
+ Convert_core_PodSecurityContext_To_v1_PodSecurityContext,
+ Convert_v1_PodSignature_To_core_PodSignature,
+ Convert_core_PodSignature_To_v1_PodSignature,
+ Convert_v1_PodSpec_To_core_PodSpec,
+ Convert_core_PodSpec_To_v1_PodSpec,
+ Convert_v1_PodStatus_To_core_PodStatus,
+ Convert_core_PodStatus_To_v1_PodStatus,
+ Convert_v1_PodStatusResult_To_core_PodStatusResult,
+ Convert_core_PodStatusResult_To_v1_PodStatusResult,
+ Convert_v1_PodTemplate_To_core_PodTemplate,
+ Convert_core_PodTemplate_To_v1_PodTemplate,
+ Convert_v1_PodTemplateList_To_core_PodTemplateList,
+ Convert_core_PodTemplateList_To_v1_PodTemplateList,
+ Convert_v1_PodTemplateSpec_To_core_PodTemplateSpec,
+ Convert_core_PodTemplateSpec_To_v1_PodTemplateSpec,
+ Convert_v1_PortworxVolumeSource_To_core_PortworxVolumeSource,
+ Convert_core_PortworxVolumeSource_To_v1_PortworxVolumeSource,
+ Convert_v1_Preconditions_To_core_Preconditions,
+ Convert_core_Preconditions_To_v1_Preconditions,
+ Convert_v1_PreferAvoidPodsEntry_To_core_PreferAvoidPodsEntry,
+ Convert_core_PreferAvoidPodsEntry_To_v1_PreferAvoidPodsEntry,
+ Convert_v1_PreferredSchedulingTerm_To_core_PreferredSchedulingTerm,
+ Convert_core_PreferredSchedulingTerm_To_v1_PreferredSchedulingTerm,
+ Convert_v1_Probe_To_core_Probe,
+ Convert_core_Probe_To_v1_Probe,
+ Convert_v1_ProjectedVolumeSource_To_core_ProjectedVolumeSource,
+ Convert_core_ProjectedVolumeSource_To_v1_ProjectedVolumeSource,
+ Convert_v1_QuobyteVolumeSource_To_core_QuobyteVolumeSource,
+ Convert_core_QuobyteVolumeSource_To_v1_QuobyteVolumeSource,
+ Convert_v1_RBDPersistentVolumeSource_To_core_RBDPersistentVolumeSource,
+ Convert_core_RBDPersistentVolumeSource_To_v1_RBDPersistentVolumeSource,
+ Convert_v1_RBDVolumeSource_To_core_RBDVolumeSource,
+ Convert_core_RBDVolumeSource_To_v1_RBDVolumeSource,
+ Convert_v1_RangeAllocation_To_core_RangeAllocation,
+ Convert_core_RangeAllocation_To_v1_RangeAllocation,
+ Convert_v1_ReplicationController_To_core_ReplicationController,
+ Convert_core_ReplicationController_To_v1_ReplicationController,
+ Convert_v1_ReplicationControllerCondition_To_core_ReplicationControllerCondition,
+ Convert_core_ReplicationControllerCondition_To_v1_ReplicationControllerCondition,
+ Convert_v1_ReplicationControllerList_To_core_ReplicationControllerList,
+ Convert_core_ReplicationControllerList_To_v1_ReplicationControllerList,
+ Convert_v1_ReplicationControllerSpec_To_core_ReplicationControllerSpec,
+ Convert_core_ReplicationControllerSpec_To_v1_ReplicationControllerSpec,
+ Convert_v1_ReplicationControllerStatus_To_core_ReplicationControllerStatus,
+ Convert_core_ReplicationControllerStatus_To_v1_ReplicationControllerStatus,
+ Convert_v1_ResourceFieldSelector_To_core_ResourceFieldSelector,
+ Convert_core_ResourceFieldSelector_To_v1_ResourceFieldSelector,
+ Convert_v1_ResourceQuota_To_core_ResourceQuota,
+ Convert_core_ResourceQuota_To_v1_ResourceQuota,
+ Convert_v1_ResourceQuotaList_To_core_ResourceQuotaList,
+ Convert_core_ResourceQuotaList_To_v1_ResourceQuotaList,
+ Convert_v1_ResourceQuotaSpec_To_core_ResourceQuotaSpec,
+ Convert_core_ResourceQuotaSpec_To_v1_ResourceQuotaSpec,
+ Convert_v1_ResourceQuotaStatus_To_core_ResourceQuotaStatus,
+ Convert_core_ResourceQuotaStatus_To_v1_ResourceQuotaStatus,
+ Convert_v1_ResourceRequirements_To_core_ResourceRequirements,
+ Convert_core_ResourceRequirements_To_v1_ResourceRequirements,
+ Convert_v1_SELinuxOptions_To_core_SELinuxOptions,
+ Convert_core_SELinuxOptions_To_v1_SELinuxOptions,
+ Convert_v1_ScaleIOPersistentVolumeSource_To_core_ScaleIOPersistentVolumeSource,
+ Convert_core_ScaleIOPersistentVolumeSource_To_v1_ScaleIOPersistentVolumeSource,
+ Convert_v1_ScaleIOVolumeSource_To_core_ScaleIOVolumeSource,
+ Convert_core_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource,
+ Convert_v1_Secret_To_core_Secret,
+ Convert_core_Secret_To_v1_Secret,
+ Convert_v1_SecretEnvSource_To_core_SecretEnvSource,
+ Convert_core_SecretEnvSource_To_v1_SecretEnvSource,
+ Convert_v1_SecretKeySelector_To_core_SecretKeySelector,
+ Convert_core_SecretKeySelector_To_v1_SecretKeySelector,
+ Convert_v1_SecretList_To_core_SecretList,
+ Convert_core_SecretList_To_v1_SecretList,
+ Convert_v1_SecretProjection_To_core_SecretProjection,
+ Convert_core_SecretProjection_To_v1_SecretProjection,
+ Convert_v1_SecretReference_To_core_SecretReference,
+ Convert_core_SecretReference_To_v1_SecretReference,
+ Convert_v1_SecretVolumeSource_To_core_SecretVolumeSource,
+ Convert_core_SecretVolumeSource_To_v1_SecretVolumeSource,
+ Convert_v1_SecurityContext_To_core_SecurityContext,
+ Convert_core_SecurityContext_To_v1_SecurityContext,
+ Convert_v1_SerializedReference_To_core_SerializedReference,
+ Convert_core_SerializedReference_To_v1_SerializedReference,
+ Convert_v1_Service_To_core_Service,
+ Convert_core_Service_To_v1_Service,
+ Convert_v1_ServiceAccount_To_core_ServiceAccount,
+ Convert_core_ServiceAccount_To_v1_ServiceAccount,
+ Convert_v1_ServiceAccountList_To_core_ServiceAccountList,
+ Convert_core_ServiceAccountList_To_v1_ServiceAccountList,
+ Convert_v1_ServiceList_To_core_ServiceList,
+ Convert_core_ServiceList_To_v1_ServiceList,
+ Convert_v1_ServicePort_To_core_ServicePort,
+ Convert_core_ServicePort_To_v1_ServicePort,
+ Convert_v1_ServiceProxyOptions_To_core_ServiceProxyOptions,
+ Convert_core_ServiceProxyOptions_To_v1_ServiceProxyOptions,
+ Convert_v1_ServiceSpec_To_core_ServiceSpec,
+ Convert_core_ServiceSpec_To_v1_ServiceSpec,
+ Convert_v1_ServiceStatus_To_core_ServiceStatus,
+ Convert_core_ServiceStatus_To_v1_ServiceStatus,
+ Convert_v1_SessionAffinityConfig_To_core_SessionAffinityConfig,
+ Convert_core_SessionAffinityConfig_To_v1_SessionAffinityConfig,
+ Convert_v1_StorageOSPersistentVolumeSource_To_core_StorageOSPersistentVolumeSource,
+ Convert_core_StorageOSPersistentVolumeSource_To_v1_StorageOSPersistentVolumeSource,
+ Convert_v1_StorageOSVolumeSource_To_core_StorageOSVolumeSource,
+ Convert_core_StorageOSVolumeSource_To_v1_StorageOSVolumeSource,
+ Convert_v1_Sysctl_To_core_Sysctl,
+ Convert_core_Sysctl_To_v1_Sysctl,
+ Convert_v1_TCPSocketAction_To_core_TCPSocketAction,
+ Convert_core_TCPSocketAction_To_v1_TCPSocketAction,
+ Convert_v1_Taint_To_core_Taint,
+ Convert_core_Taint_To_v1_Taint,
+ Convert_v1_Toleration_To_core_Toleration,
+ Convert_core_Toleration_To_v1_Toleration,
+ Convert_v1_Volume_To_core_Volume,
+ Convert_core_Volume_To_v1_Volume,
+ Convert_v1_VolumeDevice_To_core_VolumeDevice,
+ Convert_core_VolumeDevice_To_v1_VolumeDevice,
+ Convert_v1_VolumeMount_To_core_VolumeMount,
+ Convert_core_VolumeMount_To_v1_VolumeMount,
+ Convert_v1_VolumeNodeAffinity_To_core_VolumeNodeAffinity,
+ Convert_core_VolumeNodeAffinity_To_v1_VolumeNodeAffinity,
+ Convert_v1_VolumeProjection_To_core_VolumeProjection,
+ Convert_core_VolumeProjection_To_v1_VolumeProjection,
+ Convert_v1_VolumeSource_To_core_VolumeSource,
+ Convert_core_VolumeSource_To_v1_VolumeSource,
+ Convert_v1_VsphereVirtualDiskVolumeSource_To_core_VsphereVirtualDiskVolumeSource,
+ Convert_core_VsphereVirtualDiskVolumeSource_To_v1_VsphereVirtualDiskVolumeSource,
+ Convert_v1_WeightedPodAffinityTerm_To_core_WeightedPodAffinityTerm,
+ Convert_core_WeightedPodAffinityTerm_To_v1_WeightedPodAffinityTerm,
+ )
+}
+
+func autoConvert_v1_AWSElasticBlockStoreVolumeSource_To_core_AWSElasticBlockStoreVolumeSource(in *v1.AWSElasticBlockStoreVolumeSource, out *core.AWSElasticBlockStoreVolumeSource, s conversion.Scope) error {
+ out.VolumeID = in.VolumeID
+ out.FSType = in.FSType
+ out.Partition = in.Partition
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_AWSElasticBlockStoreVolumeSource_To_core_AWSElasticBlockStoreVolumeSource is an autogenerated conversion function.
+func Convert_v1_AWSElasticBlockStoreVolumeSource_To_core_AWSElasticBlockStoreVolumeSource(in *v1.AWSElasticBlockStoreVolumeSource, out *core.AWSElasticBlockStoreVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_AWSElasticBlockStoreVolumeSource_To_core_AWSElasticBlockStoreVolumeSource(in, out, s)
+}
+
+func autoConvert_core_AWSElasticBlockStoreVolumeSource_To_v1_AWSElasticBlockStoreVolumeSource(in *core.AWSElasticBlockStoreVolumeSource, out *v1.AWSElasticBlockStoreVolumeSource, s conversion.Scope) error {
+ out.VolumeID = in.VolumeID
+ out.FSType = in.FSType
+ out.Partition = in.Partition
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_AWSElasticBlockStoreVolumeSource_To_v1_AWSElasticBlockStoreVolumeSource is an autogenerated conversion function.
+func Convert_core_AWSElasticBlockStoreVolumeSource_To_v1_AWSElasticBlockStoreVolumeSource(in *core.AWSElasticBlockStoreVolumeSource, out *v1.AWSElasticBlockStoreVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_AWSElasticBlockStoreVolumeSource_To_v1_AWSElasticBlockStoreVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_Affinity_To_core_Affinity(in *v1.Affinity, out *core.Affinity, s conversion.Scope) error {
+ out.NodeAffinity = (*core.NodeAffinity)(unsafe.Pointer(in.NodeAffinity))
+ out.PodAffinity = (*core.PodAffinity)(unsafe.Pointer(in.PodAffinity))
+ out.PodAntiAffinity = (*core.PodAntiAffinity)(unsafe.Pointer(in.PodAntiAffinity))
+ return nil
+}
+
+// Convert_v1_Affinity_To_core_Affinity is an autogenerated conversion function.
+func Convert_v1_Affinity_To_core_Affinity(in *v1.Affinity, out *core.Affinity, s conversion.Scope) error {
+ return autoConvert_v1_Affinity_To_core_Affinity(in, out, s)
+}
+
+func autoConvert_core_Affinity_To_v1_Affinity(in *core.Affinity, out *v1.Affinity, s conversion.Scope) error {
+ out.NodeAffinity = (*v1.NodeAffinity)(unsafe.Pointer(in.NodeAffinity))
+ out.PodAffinity = (*v1.PodAffinity)(unsafe.Pointer(in.PodAffinity))
+ out.PodAntiAffinity = (*v1.PodAntiAffinity)(unsafe.Pointer(in.PodAntiAffinity))
+ return nil
+}
+
+// Convert_core_Affinity_To_v1_Affinity is an autogenerated conversion function.
+func Convert_core_Affinity_To_v1_Affinity(in *core.Affinity, out *v1.Affinity, s conversion.Scope) error {
+ return autoConvert_core_Affinity_To_v1_Affinity(in, out, s)
+}
+
+func autoConvert_v1_AttachedVolume_To_core_AttachedVolume(in *v1.AttachedVolume, out *core.AttachedVolume, s conversion.Scope) error {
+ out.Name = core.UniqueVolumeName(in.Name)
+ out.DevicePath = in.DevicePath
+ return nil
+}
+
+// Convert_v1_AttachedVolume_To_core_AttachedVolume is an autogenerated conversion function.
+func Convert_v1_AttachedVolume_To_core_AttachedVolume(in *v1.AttachedVolume, out *core.AttachedVolume, s conversion.Scope) error {
+ return autoConvert_v1_AttachedVolume_To_core_AttachedVolume(in, out, s)
+}
+
+func autoConvert_core_AttachedVolume_To_v1_AttachedVolume(in *core.AttachedVolume, out *v1.AttachedVolume, s conversion.Scope) error {
+ out.Name = v1.UniqueVolumeName(in.Name)
+ out.DevicePath = in.DevicePath
+ return nil
+}
+
+// Convert_core_AttachedVolume_To_v1_AttachedVolume is an autogenerated conversion function.
+func Convert_core_AttachedVolume_To_v1_AttachedVolume(in *core.AttachedVolume, out *v1.AttachedVolume, s conversion.Scope) error {
+ return autoConvert_core_AttachedVolume_To_v1_AttachedVolume(in, out, s)
+}
+
+func autoConvert_v1_AvoidPods_To_core_AvoidPods(in *v1.AvoidPods, out *core.AvoidPods, s conversion.Scope) error {
+ out.PreferAvoidPods = *(*[]core.PreferAvoidPodsEntry)(unsafe.Pointer(&in.PreferAvoidPods))
+ return nil
+}
+
+// Convert_v1_AvoidPods_To_core_AvoidPods is an autogenerated conversion function.
+func Convert_v1_AvoidPods_To_core_AvoidPods(in *v1.AvoidPods, out *core.AvoidPods, s conversion.Scope) error {
+ return autoConvert_v1_AvoidPods_To_core_AvoidPods(in, out, s)
+}
+
+func autoConvert_core_AvoidPods_To_v1_AvoidPods(in *core.AvoidPods, out *v1.AvoidPods, s conversion.Scope) error {
+ out.PreferAvoidPods = *(*[]v1.PreferAvoidPodsEntry)(unsafe.Pointer(&in.PreferAvoidPods))
+ return nil
+}
+
+// Convert_core_AvoidPods_To_v1_AvoidPods is an autogenerated conversion function.
+func Convert_core_AvoidPods_To_v1_AvoidPods(in *core.AvoidPods, out *v1.AvoidPods, s conversion.Scope) error {
+ return autoConvert_core_AvoidPods_To_v1_AvoidPods(in, out, s)
+}
+
+func autoConvert_v1_AzureDiskVolumeSource_To_core_AzureDiskVolumeSource(in *v1.AzureDiskVolumeSource, out *core.AzureDiskVolumeSource, s conversion.Scope) error {
+ out.DiskName = in.DiskName
+ out.DataDiskURI = in.DataDiskURI
+ out.CachingMode = (*core.AzureDataDiskCachingMode)(unsafe.Pointer(in.CachingMode))
+ out.FSType = (*string)(unsafe.Pointer(in.FSType))
+ out.ReadOnly = (*bool)(unsafe.Pointer(in.ReadOnly))
+ out.Kind = (*core.AzureDataDiskKind)(unsafe.Pointer(in.Kind))
+ return nil
+}
+
+// Convert_v1_AzureDiskVolumeSource_To_core_AzureDiskVolumeSource is an autogenerated conversion function.
+func Convert_v1_AzureDiskVolumeSource_To_core_AzureDiskVolumeSource(in *v1.AzureDiskVolumeSource, out *core.AzureDiskVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_AzureDiskVolumeSource_To_core_AzureDiskVolumeSource(in, out, s)
+}
+
+func autoConvert_core_AzureDiskVolumeSource_To_v1_AzureDiskVolumeSource(in *core.AzureDiskVolumeSource, out *v1.AzureDiskVolumeSource, s conversion.Scope) error {
+ out.DiskName = in.DiskName
+ out.DataDiskURI = in.DataDiskURI
+ out.CachingMode = (*v1.AzureDataDiskCachingMode)(unsafe.Pointer(in.CachingMode))
+ out.FSType = (*string)(unsafe.Pointer(in.FSType))
+ out.ReadOnly = (*bool)(unsafe.Pointer(in.ReadOnly))
+ out.Kind = (*v1.AzureDataDiskKind)(unsafe.Pointer(in.Kind))
+ return nil
+}
+
+// Convert_core_AzureDiskVolumeSource_To_v1_AzureDiskVolumeSource is an autogenerated conversion function.
+func Convert_core_AzureDiskVolumeSource_To_v1_AzureDiskVolumeSource(in *core.AzureDiskVolumeSource, out *v1.AzureDiskVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_AzureDiskVolumeSource_To_v1_AzureDiskVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_AzureFilePersistentVolumeSource_To_core_AzureFilePersistentVolumeSource(in *v1.AzureFilePersistentVolumeSource, out *core.AzureFilePersistentVolumeSource, s conversion.Scope) error {
+ out.SecretName = in.SecretName
+ out.ShareName = in.ShareName
+ out.ReadOnly = in.ReadOnly
+ out.SecretNamespace = (*string)(unsafe.Pointer(in.SecretNamespace))
+ return nil
+}
+
+// Convert_v1_AzureFilePersistentVolumeSource_To_core_AzureFilePersistentVolumeSource is an autogenerated conversion function.
+func Convert_v1_AzureFilePersistentVolumeSource_To_core_AzureFilePersistentVolumeSource(in *v1.AzureFilePersistentVolumeSource, out *core.AzureFilePersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_AzureFilePersistentVolumeSource_To_core_AzureFilePersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_core_AzureFilePersistentVolumeSource_To_v1_AzureFilePersistentVolumeSource(in *core.AzureFilePersistentVolumeSource, out *v1.AzureFilePersistentVolumeSource, s conversion.Scope) error {
+ out.SecretName = in.SecretName
+ out.ShareName = in.ShareName
+ out.ReadOnly = in.ReadOnly
+ out.SecretNamespace = (*string)(unsafe.Pointer(in.SecretNamespace))
+ return nil
+}
+
+// Convert_core_AzureFilePersistentVolumeSource_To_v1_AzureFilePersistentVolumeSource is an autogenerated conversion function.
+func Convert_core_AzureFilePersistentVolumeSource_To_v1_AzureFilePersistentVolumeSource(in *core.AzureFilePersistentVolumeSource, out *v1.AzureFilePersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_AzureFilePersistentVolumeSource_To_v1_AzureFilePersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_AzureFileVolumeSource_To_core_AzureFileVolumeSource(in *v1.AzureFileVolumeSource, out *core.AzureFileVolumeSource, s conversion.Scope) error {
+ out.SecretName = in.SecretName
+ out.ShareName = in.ShareName
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_AzureFileVolumeSource_To_core_AzureFileVolumeSource is an autogenerated conversion function.
+func Convert_v1_AzureFileVolumeSource_To_core_AzureFileVolumeSource(in *v1.AzureFileVolumeSource, out *core.AzureFileVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_AzureFileVolumeSource_To_core_AzureFileVolumeSource(in, out, s)
+}
+
+func autoConvert_core_AzureFileVolumeSource_To_v1_AzureFileVolumeSource(in *core.AzureFileVolumeSource, out *v1.AzureFileVolumeSource, s conversion.Scope) error {
+ out.SecretName = in.SecretName
+ out.ShareName = in.ShareName
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_AzureFileVolumeSource_To_v1_AzureFileVolumeSource is an autogenerated conversion function.
+func Convert_core_AzureFileVolumeSource_To_v1_AzureFileVolumeSource(in *core.AzureFileVolumeSource, out *v1.AzureFileVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_AzureFileVolumeSource_To_v1_AzureFileVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_Binding_To_core_Binding(in *v1.Binding, out *core.Binding, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_ObjectReference_To_core_ObjectReference(&in.Target, &out.Target, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_Binding_To_core_Binding is an autogenerated conversion function.
+func Convert_v1_Binding_To_core_Binding(in *v1.Binding, out *core.Binding, s conversion.Scope) error {
+ return autoConvert_v1_Binding_To_core_Binding(in, out, s)
+}
+
+func autoConvert_core_Binding_To_v1_Binding(in *core.Binding, out *v1.Binding, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_ObjectReference_To_v1_ObjectReference(&in.Target, &out.Target, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_Binding_To_v1_Binding is an autogenerated conversion function.
+func Convert_core_Binding_To_v1_Binding(in *core.Binding, out *v1.Binding, s conversion.Scope) error {
+ return autoConvert_core_Binding_To_v1_Binding(in, out, s)
+}
+
+func autoConvert_v1_CSIPersistentVolumeSource_To_core_CSIPersistentVolumeSource(in *v1.CSIPersistentVolumeSource, out *core.CSIPersistentVolumeSource, s conversion.Scope) error {
+ out.Driver = in.Driver
+ out.VolumeHandle = in.VolumeHandle
+ out.ReadOnly = in.ReadOnly
+ out.FSType = in.FSType
+ out.VolumeAttributes = *(*map[string]string)(unsafe.Pointer(&in.VolumeAttributes))
+ out.ControllerPublishSecretRef = (*core.SecretReference)(unsafe.Pointer(in.ControllerPublishSecretRef))
+ out.NodeStageSecretRef = (*core.SecretReference)(unsafe.Pointer(in.NodeStageSecretRef))
+ out.NodePublishSecretRef = (*core.SecretReference)(unsafe.Pointer(in.NodePublishSecretRef))
+ return nil
+}
+
+// Convert_v1_CSIPersistentVolumeSource_To_core_CSIPersistentVolumeSource is an autogenerated conversion function.
+func Convert_v1_CSIPersistentVolumeSource_To_core_CSIPersistentVolumeSource(in *v1.CSIPersistentVolumeSource, out *core.CSIPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_CSIPersistentVolumeSource_To_core_CSIPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_core_CSIPersistentVolumeSource_To_v1_CSIPersistentVolumeSource(in *core.CSIPersistentVolumeSource, out *v1.CSIPersistentVolumeSource, s conversion.Scope) error {
+ out.Driver = in.Driver
+ out.VolumeHandle = in.VolumeHandle
+ out.ReadOnly = in.ReadOnly
+ out.FSType = in.FSType
+ out.VolumeAttributes = *(*map[string]string)(unsafe.Pointer(&in.VolumeAttributes))
+ out.ControllerPublishSecretRef = (*v1.SecretReference)(unsafe.Pointer(in.ControllerPublishSecretRef))
+ out.NodeStageSecretRef = (*v1.SecretReference)(unsafe.Pointer(in.NodeStageSecretRef))
+ out.NodePublishSecretRef = (*v1.SecretReference)(unsafe.Pointer(in.NodePublishSecretRef))
+ return nil
+}
+
+// Convert_core_CSIPersistentVolumeSource_To_v1_CSIPersistentVolumeSource is an autogenerated conversion function.
+func Convert_core_CSIPersistentVolumeSource_To_v1_CSIPersistentVolumeSource(in *core.CSIPersistentVolumeSource, out *v1.CSIPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_CSIPersistentVolumeSource_To_v1_CSIPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_Capabilities_To_core_Capabilities(in *v1.Capabilities, out *core.Capabilities, s conversion.Scope) error {
+ out.Add = *(*[]core.Capability)(unsafe.Pointer(&in.Add))
+ out.Drop = *(*[]core.Capability)(unsafe.Pointer(&in.Drop))
+ return nil
+}
+
+// Convert_v1_Capabilities_To_core_Capabilities is an autogenerated conversion function.
+func Convert_v1_Capabilities_To_core_Capabilities(in *v1.Capabilities, out *core.Capabilities, s conversion.Scope) error {
+ return autoConvert_v1_Capabilities_To_core_Capabilities(in, out, s)
+}
+
+func autoConvert_core_Capabilities_To_v1_Capabilities(in *core.Capabilities, out *v1.Capabilities, s conversion.Scope) error {
+ out.Add = *(*[]v1.Capability)(unsafe.Pointer(&in.Add))
+ out.Drop = *(*[]v1.Capability)(unsafe.Pointer(&in.Drop))
+ return nil
+}
+
+// Convert_core_Capabilities_To_v1_Capabilities is an autogenerated conversion function.
+func Convert_core_Capabilities_To_v1_Capabilities(in *core.Capabilities, out *v1.Capabilities, s conversion.Scope) error {
+ return autoConvert_core_Capabilities_To_v1_Capabilities(in, out, s)
+}
+
+func autoConvert_v1_CephFSPersistentVolumeSource_To_core_CephFSPersistentVolumeSource(in *v1.CephFSPersistentVolumeSource, out *core.CephFSPersistentVolumeSource, s conversion.Scope) error {
+ out.Monitors = *(*[]string)(unsafe.Pointer(&in.Monitors))
+ out.Path = in.Path
+ out.User = in.User
+ out.SecretFile = in.SecretFile
+ out.SecretRef = (*core.SecretReference)(unsafe.Pointer(in.SecretRef))
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_CephFSPersistentVolumeSource_To_core_CephFSPersistentVolumeSource is an autogenerated conversion function.
+func Convert_v1_CephFSPersistentVolumeSource_To_core_CephFSPersistentVolumeSource(in *v1.CephFSPersistentVolumeSource, out *core.CephFSPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_CephFSPersistentVolumeSource_To_core_CephFSPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_core_CephFSPersistentVolumeSource_To_v1_CephFSPersistentVolumeSource(in *core.CephFSPersistentVolumeSource, out *v1.CephFSPersistentVolumeSource, s conversion.Scope) error {
+ out.Monitors = *(*[]string)(unsafe.Pointer(&in.Monitors))
+ out.Path = in.Path
+ out.User = in.User
+ out.SecretFile = in.SecretFile
+ out.SecretRef = (*v1.SecretReference)(unsafe.Pointer(in.SecretRef))
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_CephFSPersistentVolumeSource_To_v1_CephFSPersistentVolumeSource is an autogenerated conversion function.
+func Convert_core_CephFSPersistentVolumeSource_To_v1_CephFSPersistentVolumeSource(in *core.CephFSPersistentVolumeSource, out *v1.CephFSPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_CephFSPersistentVolumeSource_To_v1_CephFSPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_CephFSVolumeSource_To_core_CephFSVolumeSource(in *v1.CephFSVolumeSource, out *core.CephFSVolumeSource, s conversion.Scope) error {
+ out.Monitors = *(*[]string)(unsafe.Pointer(&in.Monitors))
+ out.Path = in.Path
+ out.User = in.User
+ out.SecretFile = in.SecretFile
+ out.SecretRef = (*core.LocalObjectReference)(unsafe.Pointer(in.SecretRef))
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_CephFSVolumeSource_To_core_CephFSVolumeSource is an autogenerated conversion function.
+func Convert_v1_CephFSVolumeSource_To_core_CephFSVolumeSource(in *v1.CephFSVolumeSource, out *core.CephFSVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_CephFSVolumeSource_To_core_CephFSVolumeSource(in, out, s)
+}
+
+func autoConvert_core_CephFSVolumeSource_To_v1_CephFSVolumeSource(in *core.CephFSVolumeSource, out *v1.CephFSVolumeSource, s conversion.Scope) error {
+ out.Monitors = *(*[]string)(unsafe.Pointer(&in.Monitors))
+ out.Path = in.Path
+ out.User = in.User
+ out.SecretFile = in.SecretFile
+ out.SecretRef = (*v1.LocalObjectReference)(unsafe.Pointer(in.SecretRef))
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_CephFSVolumeSource_To_v1_CephFSVolumeSource is an autogenerated conversion function.
+func Convert_core_CephFSVolumeSource_To_v1_CephFSVolumeSource(in *core.CephFSVolumeSource, out *v1.CephFSVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_CephFSVolumeSource_To_v1_CephFSVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_CinderVolumeSource_To_core_CinderVolumeSource(in *v1.CinderVolumeSource, out *core.CinderVolumeSource, s conversion.Scope) error {
+ out.VolumeID = in.VolumeID
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_CinderVolumeSource_To_core_CinderVolumeSource is an autogenerated conversion function.
+func Convert_v1_CinderVolumeSource_To_core_CinderVolumeSource(in *v1.CinderVolumeSource, out *core.CinderVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_CinderVolumeSource_To_core_CinderVolumeSource(in, out, s)
+}
+
+func autoConvert_core_CinderVolumeSource_To_v1_CinderVolumeSource(in *core.CinderVolumeSource, out *v1.CinderVolumeSource, s conversion.Scope) error {
+ out.VolumeID = in.VolumeID
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_CinderVolumeSource_To_v1_CinderVolumeSource is an autogenerated conversion function.
+func Convert_core_CinderVolumeSource_To_v1_CinderVolumeSource(in *core.CinderVolumeSource, out *v1.CinderVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_CinderVolumeSource_To_v1_CinderVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_ClientIPConfig_To_core_ClientIPConfig(in *v1.ClientIPConfig, out *core.ClientIPConfig, s conversion.Scope) error {
+ out.TimeoutSeconds = (*int32)(unsafe.Pointer(in.TimeoutSeconds))
+ return nil
+}
+
+// Convert_v1_ClientIPConfig_To_core_ClientIPConfig is an autogenerated conversion function.
+func Convert_v1_ClientIPConfig_To_core_ClientIPConfig(in *v1.ClientIPConfig, out *core.ClientIPConfig, s conversion.Scope) error {
+ return autoConvert_v1_ClientIPConfig_To_core_ClientIPConfig(in, out, s)
+}
+
+func autoConvert_core_ClientIPConfig_To_v1_ClientIPConfig(in *core.ClientIPConfig, out *v1.ClientIPConfig, s conversion.Scope) error {
+ out.TimeoutSeconds = (*int32)(unsafe.Pointer(in.TimeoutSeconds))
+ return nil
+}
+
+// Convert_core_ClientIPConfig_To_v1_ClientIPConfig is an autogenerated conversion function.
+func Convert_core_ClientIPConfig_To_v1_ClientIPConfig(in *core.ClientIPConfig, out *v1.ClientIPConfig, s conversion.Scope) error {
+ return autoConvert_core_ClientIPConfig_To_v1_ClientIPConfig(in, out, s)
+}
+
+func autoConvert_v1_ComponentCondition_To_core_ComponentCondition(in *v1.ComponentCondition, out *core.ComponentCondition, s conversion.Scope) error {
+ out.Type = core.ComponentConditionType(in.Type)
+ out.Status = core.ConditionStatus(in.Status)
+ out.Message = in.Message
+ out.Error = in.Error
+ return nil
+}
+
+// Convert_v1_ComponentCondition_To_core_ComponentCondition is an autogenerated conversion function.
+func Convert_v1_ComponentCondition_To_core_ComponentCondition(in *v1.ComponentCondition, out *core.ComponentCondition, s conversion.Scope) error {
+ return autoConvert_v1_ComponentCondition_To_core_ComponentCondition(in, out, s)
+}
+
+func autoConvert_core_ComponentCondition_To_v1_ComponentCondition(in *core.ComponentCondition, out *v1.ComponentCondition, s conversion.Scope) error {
+ out.Type = v1.ComponentConditionType(in.Type)
+ out.Status = v1.ConditionStatus(in.Status)
+ out.Message = in.Message
+ out.Error = in.Error
+ return nil
+}
+
+// Convert_core_ComponentCondition_To_v1_ComponentCondition is an autogenerated conversion function.
+func Convert_core_ComponentCondition_To_v1_ComponentCondition(in *core.ComponentCondition, out *v1.ComponentCondition, s conversion.Scope) error {
+ return autoConvert_core_ComponentCondition_To_v1_ComponentCondition(in, out, s)
+}
+
+func autoConvert_v1_ComponentStatus_To_core_ComponentStatus(in *v1.ComponentStatus, out *core.ComponentStatus, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ out.Conditions = *(*[]core.ComponentCondition)(unsafe.Pointer(&in.Conditions))
+ return nil
+}
+
+// Convert_v1_ComponentStatus_To_core_ComponentStatus is an autogenerated conversion function.
+func Convert_v1_ComponentStatus_To_core_ComponentStatus(in *v1.ComponentStatus, out *core.ComponentStatus, s conversion.Scope) error {
+ return autoConvert_v1_ComponentStatus_To_core_ComponentStatus(in, out, s)
+}
+
+func autoConvert_core_ComponentStatus_To_v1_ComponentStatus(in *core.ComponentStatus, out *v1.ComponentStatus, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ out.Conditions = *(*[]v1.ComponentCondition)(unsafe.Pointer(&in.Conditions))
+ return nil
+}
+
+// Convert_core_ComponentStatus_To_v1_ComponentStatus is an autogenerated conversion function.
+func Convert_core_ComponentStatus_To_v1_ComponentStatus(in *core.ComponentStatus, out *v1.ComponentStatus, s conversion.Scope) error {
+ return autoConvert_core_ComponentStatus_To_v1_ComponentStatus(in, out, s)
+}
+
+func autoConvert_v1_ComponentStatusList_To_core_ComponentStatusList(in *v1.ComponentStatusList, out *core.ComponentStatusList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]core.ComponentStatus)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_v1_ComponentStatusList_To_core_ComponentStatusList is an autogenerated conversion function.
+func Convert_v1_ComponentStatusList_To_core_ComponentStatusList(in *v1.ComponentStatusList, out *core.ComponentStatusList, s conversion.Scope) error {
+ return autoConvert_v1_ComponentStatusList_To_core_ComponentStatusList(in, out, s)
+}
+
+func autoConvert_core_ComponentStatusList_To_v1_ComponentStatusList(in *core.ComponentStatusList, out *v1.ComponentStatusList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]v1.ComponentStatus)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_core_ComponentStatusList_To_v1_ComponentStatusList is an autogenerated conversion function.
+func Convert_core_ComponentStatusList_To_v1_ComponentStatusList(in *core.ComponentStatusList, out *v1.ComponentStatusList, s conversion.Scope) error {
+ return autoConvert_core_ComponentStatusList_To_v1_ComponentStatusList(in, out, s)
+}
+
+func autoConvert_v1_ConfigMap_To_core_ConfigMap(in *v1.ConfigMap, out *core.ConfigMap, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ out.Data = *(*map[string]string)(unsafe.Pointer(&in.Data))
+ out.BinaryData = *(*map[string][]byte)(unsafe.Pointer(&in.BinaryData))
+ return nil
+}
+
+// Convert_v1_ConfigMap_To_core_ConfigMap is an autogenerated conversion function.
+func Convert_v1_ConfigMap_To_core_ConfigMap(in *v1.ConfigMap, out *core.ConfigMap, s conversion.Scope) error {
+ return autoConvert_v1_ConfigMap_To_core_ConfigMap(in, out, s)
+}
+
+func autoConvert_core_ConfigMap_To_v1_ConfigMap(in *core.ConfigMap, out *v1.ConfigMap, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ out.Data = *(*map[string]string)(unsafe.Pointer(&in.Data))
+ out.BinaryData = *(*map[string][]byte)(unsafe.Pointer(&in.BinaryData))
+ return nil
+}
+
+// Convert_core_ConfigMap_To_v1_ConfigMap is an autogenerated conversion function.
+func Convert_core_ConfigMap_To_v1_ConfigMap(in *core.ConfigMap, out *v1.ConfigMap, s conversion.Scope) error {
+ return autoConvert_core_ConfigMap_To_v1_ConfigMap(in, out, s)
+}
+
+func autoConvert_v1_ConfigMapEnvSource_To_core_ConfigMapEnvSource(in *v1.ConfigMapEnvSource, out *core.ConfigMapEnvSource, s conversion.Scope) error {
+ if err := Convert_v1_LocalObjectReference_To_core_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_v1_ConfigMapEnvSource_To_core_ConfigMapEnvSource is an autogenerated conversion function.
+func Convert_v1_ConfigMapEnvSource_To_core_ConfigMapEnvSource(in *v1.ConfigMapEnvSource, out *core.ConfigMapEnvSource, s conversion.Scope) error {
+ return autoConvert_v1_ConfigMapEnvSource_To_core_ConfigMapEnvSource(in, out, s)
+}
+
+func autoConvert_core_ConfigMapEnvSource_To_v1_ConfigMapEnvSource(in *core.ConfigMapEnvSource, out *v1.ConfigMapEnvSource, s conversion.Scope) error {
+ if err := Convert_core_LocalObjectReference_To_v1_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_core_ConfigMapEnvSource_To_v1_ConfigMapEnvSource is an autogenerated conversion function.
+func Convert_core_ConfigMapEnvSource_To_v1_ConfigMapEnvSource(in *core.ConfigMapEnvSource, out *v1.ConfigMapEnvSource, s conversion.Scope) error {
+ return autoConvert_core_ConfigMapEnvSource_To_v1_ConfigMapEnvSource(in, out, s)
+}
+
+func autoConvert_v1_ConfigMapKeySelector_To_core_ConfigMapKeySelector(in *v1.ConfigMapKeySelector, out *core.ConfigMapKeySelector, s conversion.Scope) error {
+ if err := Convert_v1_LocalObjectReference_To_core_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Key = in.Key
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_v1_ConfigMapKeySelector_To_core_ConfigMapKeySelector is an autogenerated conversion function.
+func Convert_v1_ConfigMapKeySelector_To_core_ConfigMapKeySelector(in *v1.ConfigMapKeySelector, out *core.ConfigMapKeySelector, s conversion.Scope) error {
+ return autoConvert_v1_ConfigMapKeySelector_To_core_ConfigMapKeySelector(in, out, s)
+}
+
+func autoConvert_core_ConfigMapKeySelector_To_v1_ConfigMapKeySelector(in *core.ConfigMapKeySelector, out *v1.ConfigMapKeySelector, s conversion.Scope) error {
+ if err := Convert_core_LocalObjectReference_To_v1_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Key = in.Key
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_core_ConfigMapKeySelector_To_v1_ConfigMapKeySelector is an autogenerated conversion function.
+func Convert_core_ConfigMapKeySelector_To_v1_ConfigMapKeySelector(in *core.ConfigMapKeySelector, out *v1.ConfigMapKeySelector, s conversion.Scope) error {
+ return autoConvert_core_ConfigMapKeySelector_To_v1_ConfigMapKeySelector(in, out, s)
+}
+
+func autoConvert_v1_ConfigMapList_To_core_ConfigMapList(in *v1.ConfigMapList, out *core.ConfigMapList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]core.ConfigMap)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_v1_ConfigMapList_To_core_ConfigMapList is an autogenerated conversion function.
+func Convert_v1_ConfigMapList_To_core_ConfigMapList(in *v1.ConfigMapList, out *core.ConfigMapList, s conversion.Scope) error {
+ return autoConvert_v1_ConfigMapList_To_core_ConfigMapList(in, out, s)
+}
+
+func autoConvert_core_ConfigMapList_To_v1_ConfigMapList(in *core.ConfigMapList, out *v1.ConfigMapList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]v1.ConfigMap)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_core_ConfigMapList_To_v1_ConfigMapList is an autogenerated conversion function.
+func Convert_core_ConfigMapList_To_v1_ConfigMapList(in *core.ConfigMapList, out *v1.ConfigMapList, s conversion.Scope) error {
+ return autoConvert_core_ConfigMapList_To_v1_ConfigMapList(in, out, s)
+}
+
+func autoConvert_v1_ConfigMapProjection_To_core_ConfigMapProjection(in *v1.ConfigMapProjection, out *core.ConfigMapProjection, s conversion.Scope) error {
+ if err := Convert_v1_LocalObjectReference_To_core_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Items = *(*[]core.KeyToPath)(unsafe.Pointer(&in.Items))
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_v1_ConfigMapProjection_To_core_ConfigMapProjection is an autogenerated conversion function.
+func Convert_v1_ConfigMapProjection_To_core_ConfigMapProjection(in *v1.ConfigMapProjection, out *core.ConfigMapProjection, s conversion.Scope) error {
+ return autoConvert_v1_ConfigMapProjection_To_core_ConfigMapProjection(in, out, s)
+}
+
+func autoConvert_core_ConfigMapProjection_To_v1_ConfigMapProjection(in *core.ConfigMapProjection, out *v1.ConfigMapProjection, s conversion.Scope) error {
+ if err := Convert_core_LocalObjectReference_To_v1_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Items = *(*[]v1.KeyToPath)(unsafe.Pointer(&in.Items))
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_core_ConfigMapProjection_To_v1_ConfigMapProjection is an autogenerated conversion function.
+func Convert_core_ConfigMapProjection_To_v1_ConfigMapProjection(in *core.ConfigMapProjection, out *v1.ConfigMapProjection, s conversion.Scope) error {
+ return autoConvert_core_ConfigMapProjection_To_v1_ConfigMapProjection(in, out, s)
+}
+
+func autoConvert_v1_ConfigMapVolumeSource_To_core_ConfigMapVolumeSource(in *v1.ConfigMapVolumeSource, out *core.ConfigMapVolumeSource, s conversion.Scope) error {
+ if err := Convert_v1_LocalObjectReference_To_core_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Items = *(*[]core.KeyToPath)(unsafe.Pointer(&in.Items))
+ out.DefaultMode = (*int32)(unsafe.Pointer(in.DefaultMode))
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_v1_ConfigMapVolumeSource_To_core_ConfigMapVolumeSource is an autogenerated conversion function.
+func Convert_v1_ConfigMapVolumeSource_To_core_ConfigMapVolumeSource(in *v1.ConfigMapVolumeSource, out *core.ConfigMapVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_ConfigMapVolumeSource_To_core_ConfigMapVolumeSource(in, out, s)
+}
+
+func autoConvert_core_ConfigMapVolumeSource_To_v1_ConfigMapVolumeSource(in *core.ConfigMapVolumeSource, out *v1.ConfigMapVolumeSource, s conversion.Scope) error {
+ if err := Convert_core_LocalObjectReference_To_v1_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Items = *(*[]v1.KeyToPath)(unsafe.Pointer(&in.Items))
+ out.DefaultMode = (*int32)(unsafe.Pointer(in.DefaultMode))
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_core_ConfigMapVolumeSource_To_v1_ConfigMapVolumeSource is an autogenerated conversion function.
+func Convert_core_ConfigMapVolumeSource_To_v1_ConfigMapVolumeSource(in *core.ConfigMapVolumeSource, out *v1.ConfigMapVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_ConfigMapVolumeSource_To_v1_ConfigMapVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_Container_To_core_Container(in *v1.Container, out *core.Container, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Image = in.Image
+ out.Command = *(*[]string)(unsafe.Pointer(&in.Command))
+ out.Args = *(*[]string)(unsafe.Pointer(&in.Args))
+ out.WorkingDir = in.WorkingDir
+ out.Ports = *(*[]core.ContainerPort)(unsafe.Pointer(&in.Ports))
+ out.EnvFrom = *(*[]core.EnvFromSource)(unsafe.Pointer(&in.EnvFrom))
+ out.Env = *(*[]core.EnvVar)(unsafe.Pointer(&in.Env))
+ if err := Convert_v1_ResourceRequirements_To_core_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil {
+ return err
+ }
+ out.VolumeMounts = *(*[]core.VolumeMount)(unsafe.Pointer(&in.VolumeMounts))
+ out.VolumeDevices = *(*[]core.VolumeDevice)(unsafe.Pointer(&in.VolumeDevices))
+ out.LivenessProbe = (*core.Probe)(unsafe.Pointer(in.LivenessProbe))
+ out.ReadinessProbe = (*core.Probe)(unsafe.Pointer(in.ReadinessProbe))
+ out.Lifecycle = (*core.Lifecycle)(unsafe.Pointer(in.Lifecycle))
+ out.TerminationMessagePath = in.TerminationMessagePath
+ out.TerminationMessagePolicy = core.TerminationMessagePolicy(in.TerminationMessagePolicy)
+ out.ImagePullPolicy = core.PullPolicy(in.ImagePullPolicy)
+ if in.SecurityContext != nil {
+ in, out := &in.SecurityContext, &out.SecurityContext
+ *out = new(core.SecurityContext)
+ if err := Convert_v1_SecurityContext_To_core_SecurityContext(*in, *out, s); err != nil {
+ return err
+ }
+ } else {
+ out.SecurityContext = nil
+ }
+ out.Stdin = in.Stdin
+ out.StdinOnce = in.StdinOnce
+ out.TTY = in.TTY
+ return nil
+}
+
+// Convert_v1_Container_To_core_Container is an autogenerated conversion function.
+func Convert_v1_Container_To_core_Container(in *v1.Container, out *core.Container, s conversion.Scope) error {
+ return autoConvert_v1_Container_To_core_Container(in, out, s)
+}
+
+func autoConvert_core_Container_To_v1_Container(in *core.Container, out *v1.Container, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Image = in.Image
+ out.Command = *(*[]string)(unsafe.Pointer(&in.Command))
+ out.Args = *(*[]string)(unsafe.Pointer(&in.Args))
+ out.WorkingDir = in.WorkingDir
+ out.Ports = *(*[]v1.ContainerPort)(unsafe.Pointer(&in.Ports))
+ out.EnvFrom = *(*[]v1.EnvFromSource)(unsafe.Pointer(&in.EnvFrom))
+ out.Env = *(*[]v1.EnvVar)(unsafe.Pointer(&in.Env))
+ if err := Convert_core_ResourceRequirements_To_v1_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil {
+ return err
+ }
+ out.VolumeMounts = *(*[]v1.VolumeMount)(unsafe.Pointer(&in.VolumeMounts))
+ out.VolumeDevices = *(*[]v1.VolumeDevice)(unsafe.Pointer(&in.VolumeDevices))
+ out.LivenessProbe = (*v1.Probe)(unsafe.Pointer(in.LivenessProbe))
+ out.ReadinessProbe = (*v1.Probe)(unsafe.Pointer(in.ReadinessProbe))
+ out.Lifecycle = (*v1.Lifecycle)(unsafe.Pointer(in.Lifecycle))
+ out.TerminationMessagePath = in.TerminationMessagePath
+ out.TerminationMessagePolicy = v1.TerminationMessagePolicy(in.TerminationMessagePolicy)
+ out.ImagePullPolicy = v1.PullPolicy(in.ImagePullPolicy)
+ if in.SecurityContext != nil {
+ in, out := &in.SecurityContext, &out.SecurityContext
+ *out = new(v1.SecurityContext)
+ if err := Convert_core_SecurityContext_To_v1_SecurityContext(*in, *out, s); err != nil {
+ return err
+ }
+ } else {
+ out.SecurityContext = nil
+ }
+ out.Stdin = in.Stdin
+ out.StdinOnce = in.StdinOnce
+ out.TTY = in.TTY
+ return nil
+}
+
+// Convert_core_Container_To_v1_Container is an autogenerated conversion function.
+func Convert_core_Container_To_v1_Container(in *core.Container, out *v1.Container, s conversion.Scope) error {
+ return autoConvert_core_Container_To_v1_Container(in, out, s)
+}
+
+func autoConvert_v1_ContainerImage_To_core_ContainerImage(in *v1.ContainerImage, out *core.ContainerImage, s conversion.Scope) error {
+ out.Names = *(*[]string)(unsafe.Pointer(&in.Names))
+ out.SizeBytes = in.SizeBytes
+ return nil
+}
+
+// Convert_v1_ContainerImage_To_core_ContainerImage is an autogenerated conversion function.
+func Convert_v1_ContainerImage_To_core_ContainerImage(in *v1.ContainerImage, out *core.ContainerImage, s conversion.Scope) error {
+ return autoConvert_v1_ContainerImage_To_core_ContainerImage(in, out, s)
+}
+
+func autoConvert_core_ContainerImage_To_v1_ContainerImage(in *core.ContainerImage, out *v1.ContainerImage, s conversion.Scope) error {
+ out.Names = *(*[]string)(unsafe.Pointer(&in.Names))
+ out.SizeBytes = in.SizeBytes
+ return nil
+}
+
+// Convert_core_ContainerImage_To_v1_ContainerImage is an autogenerated conversion function.
+func Convert_core_ContainerImage_To_v1_ContainerImage(in *core.ContainerImage, out *v1.ContainerImage, s conversion.Scope) error {
+ return autoConvert_core_ContainerImage_To_v1_ContainerImage(in, out, s)
+}
+
+func autoConvert_v1_ContainerPort_To_core_ContainerPort(in *v1.ContainerPort, out *core.ContainerPort, s conversion.Scope) error {
+ out.Name = in.Name
+ out.HostPort = in.HostPort
+ out.ContainerPort = in.ContainerPort
+ out.Protocol = core.Protocol(in.Protocol)
+ out.HostIP = in.HostIP
+ return nil
+}
+
+// Convert_v1_ContainerPort_To_core_ContainerPort is an autogenerated conversion function.
+func Convert_v1_ContainerPort_To_core_ContainerPort(in *v1.ContainerPort, out *core.ContainerPort, s conversion.Scope) error {
+ return autoConvert_v1_ContainerPort_To_core_ContainerPort(in, out, s)
+}
+
+func autoConvert_core_ContainerPort_To_v1_ContainerPort(in *core.ContainerPort, out *v1.ContainerPort, s conversion.Scope) error {
+ out.Name = in.Name
+ out.HostPort = in.HostPort
+ out.ContainerPort = in.ContainerPort
+ out.Protocol = v1.Protocol(in.Protocol)
+ out.HostIP = in.HostIP
+ return nil
+}
+
+// Convert_core_ContainerPort_To_v1_ContainerPort is an autogenerated conversion function.
+func Convert_core_ContainerPort_To_v1_ContainerPort(in *core.ContainerPort, out *v1.ContainerPort, s conversion.Scope) error {
+ return autoConvert_core_ContainerPort_To_v1_ContainerPort(in, out, s)
+}
+
+func autoConvert_v1_ContainerState_To_core_ContainerState(in *v1.ContainerState, out *core.ContainerState, s conversion.Scope) error {
+ out.Waiting = (*core.ContainerStateWaiting)(unsafe.Pointer(in.Waiting))
+ out.Running = (*core.ContainerStateRunning)(unsafe.Pointer(in.Running))
+ out.Terminated = (*core.ContainerStateTerminated)(unsafe.Pointer(in.Terminated))
+ return nil
+}
+
+// Convert_v1_ContainerState_To_core_ContainerState is an autogenerated conversion function.
+func Convert_v1_ContainerState_To_core_ContainerState(in *v1.ContainerState, out *core.ContainerState, s conversion.Scope) error {
+ return autoConvert_v1_ContainerState_To_core_ContainerState(in, out, s)
+}
+
+func autoConvert_core_ContainerState_To_v1_ContainerState(in *core.ContainerState, out *v1.ContainerState, s conversion.Scope) error {
+ out.Waiting = (*v1.ContainerStateWaiting)(unsafe.Pointer(in.Waiting))
+ out.Running = (*v1.ContainerStateRunning)(unsafe.Pointer(in.Running))
+ out.Terminated = (*v1.ContainerStateTerminated)(unsafe.Pointer(in.Terminated))
+ return nil
+}
+
+// Convert_core_ContainerState_To_v1_ContainerState is an autogenerated conversion function.
+func Convert_core_ContainerState_To_v1_ContainerState(in *core.ContainerState, out *v1.ContainerState, s conversion.Scope) error {
+ return autoConvert_core_ContainerState_To_v1_ContainerState(in, out, s)
+}
+
+func autoConvert_v1_ContainerStateRunning_To_core_ContainerStateRunning(in *v1.ContainerStateRunning, out *core.ContainerStateRunning, s conversion.Scope) error {
+ out.StartedAt = in.StartedAt
+ return nil
+}
+
+// Convert_v1_ContainerStateRunning_To_core_ContainerStateRunning is an autogenerated conversion function.
+func Convert_v1_ContainerStateRunning_To_core_ContainerStateRunning(in *v1.ContainerStateRunning, out *core.ContainerStateRunning, s conversion.Scope) error {
+ return autoConvert_v1_ContainerStateRunning_To_core_ContainerStateRunning(in, out, s)
+}
+
+func autoConvert_core_ContainerStateRunning_To_v1_ContainerStateRunning(in *core.ContainerStateRunning, out *v1.ContainerStateRunning, s conversion.Scope) error {
+ out.StartedAt = in.StartedAt
+ return nil
+}
+
+// Convert_core_ContainerStateRunning_To_v1_ContainerStateRunning is an autogenerated conversion function.
+func Convert_core_ContainerStateRunning_To_v1_ContainerStateRunning(in *core.ContainerStateRunning, out *v1.ContainerStateRunning, s conversion.Scope) error {
+ return autoConvert_core_ContainerStateRunning_To_v1_ContainerStateRunning(in, out, s)
+}
+
+func autoConvert_v1_ContainerStateTerminated_To_core_ContainerStateTerminated(in *v1.ContainerStateTerminated, out *core.ContainerStateTerminated, s conversion.Scope) error {
+ out.ExitCode = in.ExitCode
+ out.Signal = in.Signal
+ out.Reason = in.Reason
+ out.Message = in.Message
+ out.StartedAt = in.StartedAt
+ out.FinishedAt = in.FinishedAt
+ out.ContainerID = in.ContainerID
+ return nil
+}
+
+// Convert_v1_ContainerStateTerminated_To_core_ContainerStateTerminated is an autogenerated conversion function.
+func Convert_v1_ContainerStateTerminated_To_core_ContainerStateTerminated(in *v1.ContainerStateTerminated, out *core.ContainerStateTerminated, s conversion.Scope) error {
+ return autoConvert_v1_ContainerStateTerminated_To_core_ContainerStateTerminated(in, out, s)
+}
+
+func autoConvert_core_ContainerStateTerminated_To_v1_ContainerStateTerminated(in *core.ContainerStateTerminated, out *v1.ContainerStateTerminated, s conversion.Scope) error {
+ out.ExitCode = in.ExitCode
+ out.Signal = in.Signal
+ out.Reason = in.Reason
+ out.Message = in.Message
+ out.StartedAt = in.StartedAt
+ out.FinishedAt = in.FinishedAt
+ out.ContainerID = in.ContainerID
+ return nil
+}
+
+// Convert_core_ContainerStateTerminated_To_v1_ContainerStateTerminated is an autogenerated conversion function.
+func Convert_core_ContainerStateTerminated_To_v1_ContainerStateTerminated(in *core.ContainerStateTerminated, out *v1.ContainerStateTerminated, s conversion.Scope) error {
+ return autoConvert_core_ContainerStateTerminated_To_v1_ContainerStateTerminated(in, out, s)
+}
+
+func autoConvert_v1_ContainerStateWaiting_To_core_ContainerStateWaiting(in *v1.ContainerStateWaiting, out *core.ContainerStateWaiting, s conversion.Scope) error {
+ out.Reason = in.Reason
+ out.Message = in.Message
+ return nil
+}
+
+// Convert_v1_ContainerStateWaiting_To_core_ContainerStateWaiting is an autogenerated conversion function.
+func Convert_v1_ContainerStateWaiting_To_core_ContainerStateWaiting(in *v1.ContainerStateWaiting, out *core.ContainerStateWaiting, s conversion.Scope) error {
+ return autoConvert_v1_ContainerStateWaiting_To_core_ContainerStateWaiting(in, out, s)
+}
+
+func autoConvert_core_ContainerStateWaiting_To_v1_ContainerStateWaiting(in *core.ContainerStateWaiting, out *v1.ContainerStateWaiting, s conversion.Scope) error {
+ out.Reason = in.Reason
+ out.Message = in.Message
+ return nil
+}
+
+// Convert_core_ContainerStateWaiting_To_v1_ContainerStateWaiting is an autogenerated conversion function.
+func Convert_core_ContainerStateWaiting_To_v1_ContainerStateWaiting(in *core.ContainerStateWaiting, out *v1.ContainerStateWaiting, s conversion.Scope) error {
+ return autoConvert_core_ContainerStateWaiting_To_v1_ContainerStateWaiting(in, out, s)
+}
+
+func autoConvert_v1_ContainerStatus_To_core_ContainerStatus(in *v1.ContainerStatus, out *core.ContainerStatus, s conversion.Scope) error {
+ out.Name = in.Name
+ if err := Convert_v1_ContainerState_To_core_ContainerState(&in.State, &out.State, s); err != nil {
+ return err
+ }
+ if err := Convert_v1_ContainerState_To_core_ContainerState(&in.LastTerminationState, &out.LastTerminationState, s); err != nil {
+ return err
+ }
+ out.Ready = in.Ready
+ out.RestartCount = in.RestartCount
+ out.Image = in.Image
+ out.ImageID = in.ImageID
+ out.ContainerID = in.ContainerID
+ return nil
+}
+
+// Convert_v1_ContainerStatus_To_core_ContainerStatus is an autogenerated conversion function.
+func Convert_v1_ContainerStatus_To_core_ContainerStatus(in *v1.ContainerStatus, out *core.ContainerStatus, s conversion.Scope) error {
+ return autoConvert_v1_ContainerStatus_To_core_ContainerStatus(in, out, s)
+}
+
+func autoConvert_core_ContainerStatus_To_v1_ContainerStatus(in *core.ContainerStatus, out *v1.ContainerStatus, s conversion.Scope) error {
+ out.Name = in.Name
+ if err := Convert_core_ContainerState_To_v1_ContainerState(&in.State, &out.State, s); err != nil {
+ return err
+ }
+ if err := Convert_core_ContainerState_To_v1_ContainerState(&in.LastTerminationState, &out.LastTerminationState, s); err != nil {
+ return err
+ }
+ out.Ready = in.Ready
+ out.RestartCount = in.RestartCount
+ out.Image = in.Image
+ out.ImageID = in.ImageID
+ out.ContainerID = in.ContainerID
+ return nil
+}
+
+// Convert_core_ContainerStatus_To_v1_ContainerStatus is an autogenerated conversion function.
+func Convert_core_ContainerStatus_To_v1_ContainerStatus(in *core.ContainerStatus, out *v1.ContainerStatus, s conversion.Scope) error {
+ return autoConvert_core_ContainerStatus_To_v1_ContainerStatus(in, out, s)
+}
+
+func autoConvert_v1_DaemonEndpoint_To_core_DaemonEndpoint(in *v1.DaemonEndpoint, out *core.DaemonEndpoint, s conversion.Scope) error {
+ out.Port = in.Port
+ return nil
+}
+
+// Convert_v1_DaemonEndpoint_To_core_DaemonEndpoint is an autogenerated conversion function.
+func Convert_v1_DaemonEndpoint_To_core_DaemonEndpoint(in *v1.DaemonEndpoint, out *core.DaemonEndpoint, s conversion.Scope) error {
+ return autoConvert_v1_DaemonEndpoint_To_core_DaemonEndpoint(in, out, s)
+}
+
+func autoConvert_core_DaemonEndpoint_To_v1_DaemonEndpoint(in *core.DaemonEndpoint, out *v1.DaemonEndpoint, s conversion.Scope) error {
+ out.Port = in.Port
+ return nil
+}
+
+// Convert_core_DaemonEndpoint_To_v1_DaemonEndpoint is an autogenerated conversion function.
+func Convert_core_DaemonEndpoint_To_v1_DaemonEndpoint(in *core.DaemonEndpoint, out *v1.DaemonEndpoint, s conversion.Scope) error {
+ return autoConvert_core_DaemonEndpoint_To_v1_DaemonEndpoint(in, out, s)
+}
+
+func autoConvert_v1_DeleteOptions_To_core_DeleteOptions(in *v1.DeleteOptions, out *core.DeleteOptions, s conversion.Scope) error {
+ out.GracePeriodSeconds = (*int64)(unsafe.Pointer(in.GracePeriodSeconds))
+ out.Preconditions = (*core.Preconditions)(unsafe.Pointer(in.Preconditions))
+ out.OrphanDependents = (*bool)(unsafe.Pointer(in.OrphanDependents))
+ out.PropagationPolicy = (*core.DeletionPropagation)(unsafe.Pointer(in.PropagationPolicy))
+ return nil
+}
+
+// Convert_v1_DeleteOptions_To_core_DeleteOptions is an autogenerated conversion function.
+func Convert_v1_DeleteOptions_To_core_DeleteOptions(in *v1.DeleteOptions, out *core.DeleteOptions, s conversion.Scope) error {
+ return autoConvert_v1_DeleteOptions_To_core_DeleteOptions(in, out, s)
+}
+
+func autoConvert_core_DeleteOptions_To_v1_DeleteOptions(in *core.DeleteOptions, out *v1.DeleteOptions, s conversion.Scope) error {
+ out.GracePeriodSeconds = (*int64)(unsafe.Pointer(in.GracePeriodSeconds))
+ out.Preconditions = (*v1.Preconditions)(unsafe.Pointer(in.Preconditions))
+ out.OrphanDependents = (*bool)(unsafe.Pointer(in.OrphanDependents))
+ out.PropagationPolicy = (*v1.DeletionPropagation)(unsafe.Pointer(in.PropagationPolicy))
+ return nil
+}
+
+// Convert_core_DeleteOptions_To_v1_DeleteOptions is an autogenerated conversion function.
+func Convert_core_DeleteOptions_To_v1_DeleteOptions(in *core.DeleteOptions, out *v1.DeleteOptions, s conversion.Scope) error {
+ return autoConvert_core_DeleteOptions_To_v1_DeleteOptions(in, out, s)
+}
+
+func autoConvert_v1_DownwardAPIProjection_To_core_DownwardAPIProjection(in *v1.DownwardAPIProjection, out *core.DownwardAPIProjection, s conversion.Scope) error {
+ out.Items = *(*[]core.DownwardAPIVolumeFile)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_v1_DownwardAPIProjection_To_core_DownwardAPIProjection is an autogenerated conversion function.
+func Convert_v1_DownwardAPIProjection_To_core_DownwardAPIProjection(in *v1.DownwardAPIProjection, out *core.DownwardAPIProjection, s conversion.Scope) error {
+ return autoConvert_v1_DownwardAPIProjection_To_core_DownwardAPIProjection(in, out, s)
+}
+
+func autoConvert_core_DownwardAPIProjection_To_v1_DownwardAPIProjection(in *core.DownwardAPIProjection, out *v1.DownwardAPIProjection, s conversion.Scope) error {
+ out.Items = *(*[]v1.DownwardAPIVolumeFile)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_core_DownwardAPIProjection_To_v1_DownwardAPIProjection is an autogenerated conversion function.
+func Convert_core_DownwardAPIProjection_To_v1_DownwardAPIProjection(in *core.DownwardAPIProjection, out *v1.DownwardAPIProjection, s conversion.Scope) error {
+ return autoConvert_core_DownwardAPIProjection_To_v1_DownwardAPIProjection(in, out, s)
+}
+
+func autoConvert_v1_DownwardAPIVolumeFile_To_core_DownwardAPIVolumeFile(in *v1.DownwardAPIVolumeFile, out *core.DownwardAPIVolumeFile, s conversion.Scope) error {
+ out.Path = in.Path
+ out.FieldRef = (*core.ObjectFieldSelector)(unsafe.Pointer(in.FieldRef))
+ out.ResourceFieldRef = (*core.ResourceFieldSelector)(unsafe.Pointer(in.ResourceFieldRef))
+ out.Mode = (*int32)(unsafe.Pointer(in.Mode))
+ return nil
+}
+
+// Convert_v1_DownwardAPIVolumeFile_To_core_DownwardAPIVolumeFile is an autogenerated conversion function.
+func Convert_v1_DownwardAPIVolumeFile_To_core_DownwardAPIVolumeFile(in *v1.DownwardAPIVolumeFile, out *core.DownwardAPIVolumeFile, s conversion.Scope) error {
+ return autoConvert_v1_DownwardAPIVolumeFile_To_core_DownwardAPIVolumeFile(in, out, s)
+}
+
+func autoConvert_core_DownwardAPIVolumeFile_To_v1_DownwardAPIVolumeFile(in *core.DownwardAPIVolumeFile, out *v1.DownwardAPIVolumeFile, s conversion.Scope) error {
+ out.Path = in.Path
+ out.FieldRef = (*v1.ObjectFieldSelector)(unsafe.Pointer(in.FieldRef))
+ out.ResourceFieldRef = (*v1.ResourceFieldSelector)(unsafe.Pointer(in.ResourceFieldRef))
+ out.Mode = (*int32)(unsafe.Pointer(in.Mode))
+ return nil
+}
+
+// Convert_core_DownwardAPIVolumeFile_To_v1_DownwardAPIVolumeFile is an autogenerated conversion function.
+func Convert_core_DownwardAPIVolumeFile_To_v1_DownwardAPIVolumeFile(in *core.DownwardAPIVolumeFile, out *v1.DownwardAPIVolumeFile, s conversion.Scope) error {
+ return autoConvert_core_DownwardAPIVolumeFile_To_v1_DownwardAPIVolumeFile(in, out, s)
+}
+
+func autoConvert_v1_DownwardAPIVolumeSource_To_core_DownwardAPIVolumeSource(in *v1.DownwardAPIVolumeSource, out *core.DownwardAPIVolumeSource, s conversion.Scope) error {
+ out.Items = *(*[]core.DownwardAPIVolumeFile)(unsafe.Pointer(&in.Items))
+ out.DefaultMode = (*int32)(unsafe.Pointer(in.DefaultMode))
+ return nil
+}
+
+// Convert_v1_DownwardAPIVolumeSource_To_core_DownwardAPIVolumeSource is an autogenerated conversion function.
+func Convert_v1_DownwardAPIVolumeSource_To_core_DownwardAPIVolumeSource(in *v1.DownwardAPIVolumeSource, out *core.DownwardAPIVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_DownwardAPIVolumeSource_To_core_DownwardAPIVolumeSource(in, out, s)
+}
+
+func autoConvert_core_DownwardAPIVolumeSource_To_v1_DownwardAPIVolumeSource(in *core.DownwardAPIVolumeSource, out *v1.DownwardAPIVolumeSource, s conversion.Scope) error {
+ out.Items = *(*[]v1.DownwardAPIVolumeFile)(unsafe.Pointer(&in.Items))
+ out.DefaultMode = (*int32)(unsafe.Pointer(in.DefaultMode))
+ return nil
+}
+
+// Convert_core_DownwardAPIVolumeSource_To_v1_DownwardAPIVolumeSource is an autogenerated conversion function.
+func Convert_core_DownwardAPIVolumeSource_To_v1_DownwardAPIVolumeSource(in *core.DownwardAPIVolumeSource, out *v1.DownwardAPIVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_DownwardAPIVolumeSource_To_v1_DownwardAPIVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_EmptyDirVolumeSource_To_core_EmptyDirVolumeSource(in *v1.EmptyDirVolumeSource, out *core.EmptyDirVolumeSource, s conversion.Scope) error {
+ out.Medium = core.StorageMedium(in.Medium)
+ out.SizeLimit = (*resource.Quantity)(unsafe.Pointer(in.SizeLimit))
+ return nil
+}
+
+// Convert_v1_EmptyDirVolumeSource_To_core_EmptyDirVolumeSource is an autogenerated conversion function.
+func Convert_v1_EmptyDirVolumeSource_To_core_EmptyDirVolumeSource(in *v1.EmptyDirVolumeSource, out *core.EmptyDirVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_EmptyDirVolumeSource_To_core_EmptyDirVolumeSource(in, out, s)
+}
+
+func autoConvert_core_EmptyDirVolumeSource_To_v1_EmptyDirVolumeSource(in *core.EmptyDirVolumeSource, out *v1.EmptyDirVolumeSource, s conversion.Scope) error {
+ out.Medium = v1.StorageMedium(in.Medium)
+ out.SizeLimit = (*resource.Quantity)(unsafe.Pointer(in.SizeLimit))
+ return nil
+}
+
+// Convert_core_EmptyDirVolumeSource_To_v1_EmptyDirVolumeSource is an autogenerated conversion function.
+func Convert_core_EmptyDirVolumeSource_To_v1_EmptyDirVolumeSource(in *core.EmptyDirVolumeSource, out *v1.EmptyDirVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_EmptyDirVolumeSource_To_v1_EmptyDirVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_EndpointAddress_To_core_EndpointAddress(in *v1.EndpointAddress, out *core.EndpointAddress, s conversion.Scope) error {
+ out.IP = in.IP
+ out.Hostname = in.Hostname
+ out.NodeName = (*string)(unsafe.Pointer(in.NodeName))
+ out.TargetRef = (*core.ObjectReference)(unsafe.Pointer(in.TargetRef))
+ return nil
+}
+
+// Convert_v1_EndpointAddress_To_core_EndpointAddress is an autogenerated conversion function.
+func Convert_v1_EndpointAddress_To_core_EndpointAddress(in *v1.EndpointAddress, out *core.EndpointAddress, s conversion.Scope) error {
+ return autoConvert_v1_EndpointAddress_To_core_EndpointAddress(in, out, s)
+}
+
+func autoConvert_core_EndpointAddress_To_v1_EndpointAddress(in *core.EndpointAddress, out *v1.EndpointAddress, s conversion.Scope) error {
+ out.IP = in.IP
+ out.Hostname = in.Hostname
+ out.NodeName = (*string)(unsafe.Pointer(in.NodeName))
+ out.TargetRef = (*v1.ObjectReference)(unsafe.Pointer(in.TargetRef))
+ return nil
+}
+
+// Convert_core_EndpointAddress_To_v1_EndpointAddress is an autogenerated conversion function.
+func Convert_core_EndpointAddress_To_v1_EndpointAddress(in *core.EndpointAddress, out *v1.EndpointAddress, s conversion.Scope) error {
+ return autoConvert_core_EndpointAddress_To_v1_EndpointAddress(in, out, s)
+}
+
+func autoConvert_v1_EndpointPort_To_core_EndpointPort(in *v1.EndpointPort, out *core.EndpointPort, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Port = in.Port
+ out.Protocol = core.Protocol(in.Protocol)
+ return nil
+}
+
+// Convert_v1_EndpointPort_To_core_EndpointPort is an autogenerated conversion function.
+func Convert_v1_EndpointPort_To_core_EndpointPort(in *v1.EndpointPort, out *core.EndpointPort, s conversion.Scope) error {
+ return autoConvert_v1_EndpointPort_To_core_EndpointPort(in, out, s)
+}
+
+func autoConvert_core_EndpointPort_To_v1_EndpointPort(in *core.EndpointPort, out *v1.EndpointPort, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Port = in.Port
+ out.Protocol = v1.Protocol(in.Protocol)
+ return nil
+}
+
+// Convert_core_EndpointPort_To_v1_EndpointPort is an autogenerated conversion function.
+func Convert_core_EndpointPort_To_v1_EndpointPort(in *core.EndpointPort, out *v1.EndpointPort, s conversion.Scope) error {
+ return autoConvert_core_EndpointPort_To_v1_EndpointPort(in, out, s)
+}
+
+func autoConvert_v1_EndpointSubset_To_core_EndpointSubset(in *v1.EndpointSubset, out *core.EndpointSubset, s conversion.Scope) error {
+ out.Addresses = *(*[]core.EndpointAddress)(unsafe.Pointer(&in.Addresses))
+ out.NotReadyAddresses = *(*[]core.EndpointAddress)(unsafe.Pointer(&in.NotReadyAddresses))
+ out.Ports = *(*[]core.EndpointPort)(unsafe.Pointer(&in.Ports))
+ return nil
+}
+
+// Convert_v1_EndpointSubset_To_core_EndpointSubset is an autogenerated conversion function.
+func Convert_v1_EndpointSubset_To_core_EndpointSubset(in *v1.EndpointSubset, out *core.EndpointSubset, s conversion.Scope) error {
+ return autoConvert_v1_EndpointSubset_To_core_EndpointSubset(in, out, s)
+}
+
+func autoConvert_core_EndpointSubset_To_v1_EndpointSubset(in *core.EndpointSubset, out *v1.EndpointSubset, s conversion.Scope) error {
+ out.Addresses = *(*[]v1.EndpointAddress)(unsafe.Pointer(&in.Addresses))
+ out.NotReadyAddresses = *(*[]v1.EndpointAddress)(unsafe.Pointer(&in.NotReadyAddresses))
+ out.Ports = *(*[]v1.EndpointPort)(unsafe.Pointer(&in.Ports))
+ return nil
+}
+
+// Convert_core_EndpointSubset_To_v1_EndpointSubset is an autogenerated conversion function.
+func Convert_core_EndpointSubset_To_v1_EndpointSubset(in *core.EndpointSubset, out *v1.EndpointSubset, s conversion.Scope) error {
+ return autoConvert_core_EndpointSubset_To_v1_EndpointSubset(in, out, s)
+}
+
+func autoConvert_v1_Endpoints_To_core_Endpoints(in *v1.Endpoints, out *core.Endpoints, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ out.Subsets = *(*[]core.EndpointSubset)(unsafe.Pointer(&in.Subsets))
+ return nil
+}
+
+// Convert_v1_Endpoints_To_core_Endpoints is an autogenerated conversion function.
+func Convert_v1_Endpoints_To_core_Endpoints(in *v1.Endpoints, out *core.Endpoints, s conversion.Scope) error {
+ return autoConvert_v1_Endpoints_To_core_Endpoints(in, out, s)
+}
+
+func autoConvert_core_Endpoints_To_v1_Endpoints(in *core.Endpoints, out *v1.Endpoints, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ out.Subsets = *(*[]v1.EndpointSubset)(unsafe.Pointer(&in.Subsets))
+ return nil
+}
+
+// Convert_core_Endpoints_To_v1_Endpoints is an autogenerated conversion function.
+func Convert_core_Endpoints_To_v1_Endpoints(in *core.Endpoints, out *v1.Endpoints, s conversion.Scope) error {
+ return autoConvert_core_Endpoints_To_v1_Endpoints(in, out, s)
+}
+
+func autoConvert_v1_EndpointsList_To_core_EndpointsList(in *v1.EndpointsList, out *core.EndpointsList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]core.Endpoints)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_v1_EndpointsList_To_core_EndpointsList is an autogenerated conversion function.
+func Convert_v1_EndpointsList_To_core_EndpointsList(in *v1.EndpointsList, out *core.EndpointsList, s conversion.Scope) error {
+ return autoConvert_v1_EndpointsList_To_core_EndpointsList(in, out, s)
+}
+
+func autoConvert_core_EndpointsList_To_v1_EndpointsList(in *core.EndpointsList, out *v1.EndpointsList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]v1.Endpoints)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_core_EndpointsList_To_v1_EndpointsList is an autogenerated conversion function.
+func Convert_core_EndpointsList_To_v1_EndpointsList(in *core.EndpointsList, out *v1.EndpointsList, s conversion.Scope) error {
+ return autoConvert_core_EndpointsList_To_v1_EndpointsList(in, out, s)
+}
+
+func autoConvert_v1_EnvFromSource_To_core_EnvFromSource(in *v1.EnvFromSource, out *core.EnvFromSource, s conversion.Scope) error {
+ out.Prefix = in.Prefix
+ out.ConfigMapRef = (*core.ConfigMapEnvSource)(unsafe.Pointer(in.ConfigMapRef))
+ out.SecretRef = (*core.SecretEnvSource)(unsafe.Pointer(in.SecretRef))
+ return nil
+}
+
+// Convert_v1_EnvFromSource_To_core_EnvFromSource is an autogenerated conversion function.
+func Convert_v1_EnvFromSource_To_core_EnvFromSource(in *v1.EnvFromSource, out *core.EnvFromSource, s conversion.Scope) error {
+ return autoConvert_v1_EnvFromSource_To_core_EnvFromSource(in, out, s)
+}
+
+func autoConvert_core_EnvFromSource_To_v1_EnvFromSource(in *core.EnvFromSource, out *v1.EnvFromSource, s conversion.Scope) error {
+ out.Prefix = in.Prefix
+ out.ConfigMapRef = (*v1.ConfigMapEnvSource)(unsafe.Pointer(in.ConfigMapRef))
+ out.SecretRef = (*v1.SecretEnvSource)(unsafe.Pointer(in.SecretRef))
+ return nil
+}
+
+// Convert_core_EnvFromSource_To_v1_EnvFromSource is an autogenerated conversion function.
+func Convert_core_EnvFromSource_To_v1_EnvFromSource(in *core.EnvFromSource, out *v1.EnvFromSource, s conversion.Scope) error {
+ return autoConvert_core_EnvFromSource_To_v1_EnvFromSource(in, out, s)
+}
+
+func autoConvert_v1_EnvVar_To_core_EnvVar(in *v1.EnvVar, out *core.EnvVar, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Value = in.Value
+ out.ValueFrom = (*core.EnvVarSource)(unsafe.Pointer(in.ValueFrom))
+ return nil
+}
+
+// Convert_v1_EnvVar_To_core_EnvVar is an autogenerated conversion function.
+func Convert_v1_EnvVar_To_core_EnvVar(in *v1.EnvVar, out *core.EnvVar, s conversion.Scope) error {
+ return autoConvert_v1_EnvVar_To_core_EnvVar(in, out, s)
+}
+
+func autoConvert_core_EnvVar_To_v1_EnvVar(in *core.EnvVar, out *v1.EnvVar, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Value = in.Value
+ out.ValueFrom = (*v1.EnvVarSource)(unsafe.Pointer(in.ValueFrom))
+ return nil
+}
+
+// Convert_core_EnvVar_To_v1_EnvVar is an autogenerated conversion function.
+func Convert_core_EnvVar_To_v1_EnvVar(in *core.EnvVar, out *v1.EnvVar, s conversion.Scope) error {
+ return autoConvert_core_EnvVar_To_v1_EnvVar(in, out, s)
+}
+
+func autoConvert_v1_EnvVarSource_To_core_EnvVarSource(in *v1.EnvVarSource, out *core.EnvVarSource, s conversion.Scope) error {
+ out.FieldRef = (*core.ObjectFieldSelector)(unsafe.Pointer(in.FieldRef))
+ out.ResourceFieldRef = (*core.ResourceFieldSelector)(unsafe.Pointer(in.ResourceFieldRef))
+ out.ConfigMapKeyRef = (*core.ConfigMapKeySelector)(unsafe.Pointer(in.ConfigMapKeyRef))
+ out.SecretKeyRef = (*core.SecretKeySelector)(unsafe.Pointer(in.SecretKeyRef))
+ return nil
+}
+
+// Convert_v1_EnvVarSource_To_core_EnvVarSource is an autogenerated conversion function.
+func Convert_v1_EnvVarSource_To_core_EnvVarSource(in *v1.EnvVarSource, out *core.EnvVarSource, s conversion.Scope) error {
+ return autoConvert_v1_EnvVarSource_To_core_EnvVarSource(in, out, s)
+}
+
+func autoConvert_core_EnvVarSource_To_v1_EnvVarSource(in *core.EnvVarSource, out *v1.EnvVarSource, s conversion.Scope) error {
+ out.FieldRef = (*v1.ObjectFieldSelector)(unsafe.Pointer(in.FieldRef))
+ out.ResourceFieldRef = (*v1.ResourceFieldSelector)(unsafe.Pointer(in.ResourceFieldRef))
+ out.ConfigMapKeyRef = (*v1.ConfigMapKeySelector)(unsafe.Pointer(in.ConfigMapKeyRef))
+ out.SecretKeyRef = (*v1.SecretKeySelector)(unsafe.Pointer(in.SecretKeyRef))
+ return nil
+}
+
+// Convert_core_EnvVarSource_To_v1_EnvVarSource is an autogenerated conversion function.
+func Convert_core_EnvVarSource_To_v1_EnvVarSource(in *core.EnvVarSource, out *v1.EnvVarSource, s conversion.Scope) error {
+ return autoConvert_core_EnvVarSource_To_v1_EnvVarSource(in, out, s)
+}
+
+func autoConvert_v1_Event_To_core_Event(in *v1.Event, out *core.Event, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_ObjectReference_To_core_ObjectReference(&in.InvolvedObject, &out.InvolvedObject, s); err != nil {
+ return err
+ }
+ out.Reason = in.Reason
+ out.Message = in.Message
+ if err := Convert_v1_EventSource_To_core_EventSource(&in.Source, &out.Source, s); err != nil {
+ return err
+ }
+ out.FirstTimestamp = in.FirstTimestamp
+ out.LastTimestamp = in.LastTimestamp
+ out.Count = in.Count
+ out.Type = in.Type
+ out.EventTime = in.EventTime
+ out.Series = (*core.EventSeries)(unsafe.Pointer(in.Series))
+ out.Action = in.Action
+ out.Related = (*core.ObjectReference)(unsafe.Pointer(in.Related))
+ out.ReportingController = in.ReportingController
+ out.ReportingInstance = in.ReportingInstance
+ return nil
+}
+
+// Convert_v1_Event_To_core_Event is an autogenerated conversion function.
+func Convert_v1_Event_To_core_Event(in *v1.Event, out *core.Event, s conversion.Scope) error {
+ return autoConvert_v1_Event_To_core_Event(in, out, s)
+}
+
+func autoConvert_core_Event_To_v1_Event(in *core.Event, out *v1.Event, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_ObjectReference_To_v1_ObjectReference(&in.InvolvedObject, &out.InvolvedObject, s); err != nil {
+ return err
+ }
+ out.Reason = in.Reason
+ out.Message = in.Message
+ if err := Convert_core_EventSource_To_v1_EventSource(&in.Source, &out.Source, s); err != nil {
+ return err
+ }
+ out.FirstTimestamp = in.FirstTimestamp
+ out.LastTimestamp = in.LastTimestamp
+ out.Count = in.Count
+ out.Type = in.Type
+ out.EventTime = in.EventTime
+ out.Series = (*v1.EventSeries)(unsafe.Pointer(in.Series))
+ out.Action = in.Action
+ out.Related = (*v1.ObjectReference)(unsafe.Pointer(in.Related))
+ out.ReportingController = in.ReportingController
+ out.ReportingInstance = in.ReportingInstance
+ return nil
+}
+
+// Convert_core_Event_To_v1_Event is an autogenerated conversion function.
+func Convert_core_Event_To_v1_Event(in *core.Event, out *v1.Event, s conversion.Scope) error {
+ return autoConvert_core_Event_To_v1_Event(in, out, s)
+}
+
+func autoConvert_v1_EventList_To_core_EventList(in *v1.EventList, out *core.EventList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]core.Event)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_v1_EventList_To_core_EventList is an autogenerated conversion function.
+func Convert_v1_EventList_To_core_EventList(in *v1.EventList, out *core.EventList, s conversion.Scope) error {
+ return autoConvert_v1_EventList_To_core_EventList(in, out, s)
+}
+
+func autoConvert_core_EventList_To_v1_EventList(in *core.EventList, out *v1.EventList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]v1.Event)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_core_EventList_To_v1_EventList is an autogenerated conversion function.
+func Convert_core_EventList_To_v1_EventList(in *core.EventList, out *v1.EventList, s conversion.Scope) error {
+ return autoConvert_core_EventList_To_v1_EventList(in, out, s)
+}
+
+func autoConvert_v1_EventSeries_To_core_EventSeries(in *v1.EventSeries, out *core.EventSeries, s conversion.Scope) error {
+ out.Count = in.Count
+ out.LastObservedTime = in.LastObservedTime
+ out.State = core.EventSeriesState(in.State)
+ return nil
+}
+
+// Convert_v1_EventSeries_To_core_EventSeries is an autogenerated conversion function.
+func Convert_v1_EventSeries_To_core_EventSeries(in *v1.EventSeries, out *core.EventSeries, s conversion.Scope) error {
+ return autoConvert_v1_EventSeries_To_core_EventSeries(in, out, s)
+}
+
+func autoConvert_core_EventSeries_To_v1_EventSeries(in *core.EventSeries, out *v1.EventSeries, s conversion.Scope) error {
+ out.Count = in.Count
+ out.LastObservedTime = in.LastObservedTime
+ out.State = v1.EventSeriesState(in.State)
+ return nil
+}
+
+// Convert_core_EventSeries_To_v1_EventSeries is an autogenerated conversion function.
+func Convert_core_EventSeries_To_v1_EventSeries(in *core.EventSeries, out *v1.EventSeries, s conversion.Scope) error {
+ return autoConvert_core_EventSeries_To_v1_EventSeries(in, out, s)
+}
+
+func autoConvert_v1_EventSource_To_core_EventSource(in *v1.EventSource, out *core.EventSource, s conversion.Scope) error {
+ out.Component = in.Component
+ out.Host = in.Host
+ return nil
+}
+
+// Convert_v1_EventSource_To_core_EventSource is an autogenerated conversion function.
+func Convert_v1_EventSource_To_core_EventSource(in *v1.EventSource, out *core.EventSource, s conversion.Scope) error {
+ return autoConvert_v1_EventSource_To_core_EventSource(in, out, s)
+}
+
+func autoConvert_core_EventSource_To_v1_EventSource(in *core.EventSource, out *v1.EventSource, s conversion.Scope) error {
+ out.Component = in.Component
+ out.Host = in.Host
+ return nil
+}
+
+// Convert_core_EventSource_To_v1_EventSource is an autogenerated conversion function.
+func Convert_core_EventSource_To_v1_EventSource(in *core.EventSource, out *v1.EventSource, s conversion.Scope) error {
+ return autoConvert_core_EventSource_To_v1_EventSource(in, out, s)
+}
+
+func autoConvert_v1_ExecAction_To_core_ExecAction(in *v1.ExecAction, out *core.ExecAction, s conversion.Scope) error {
+ out.Command = *(*[]string)(unsafe.Pointer(&in.Command))
+ return nil
+}
+
+// Convert_v1_ExecAction_To_core_ExecAction is an autogenerated conversion function.
+func Convert_v1_ExecAction_To_core_ExecAction(in *v1.ExecAction, out *core.ExecAction, s conversion.Scope) error {
+ return autoConvert_v1_ExecAction_To_core_ExecAction(in, out, s)
+}
+
+func autoConvert_core_ExecAction_To_v1_ExecAction(in *core.ExecAction, out *v1.ExecAction, s conversion.Scope) error {
+ out.Command = *(*[]string)(unsafe.Pointer(&in.Command))
+ return nil
+}
+
+// Convert_core_ExecAction_To_v1_ExecAction is an autogenerated conversion function.
+func Convert_core_ExecAction_To_v1_ExecAction(in *core.ExecAction, out *v1.ExecAction, s conversion.Scope) error {
+ return autoConvert_core_ExecAction_To_v1_ExecAction(in, out, s)
+}
+
+func autoConvert_v1_FCVolumeSource_To_core_FCVolumeSource(in *v1.FCVolumeSource, out *core.FCVolumeSource, s conversion.Scope) error {
+ out.TargetWWNs = *(*[]string)(unsafe.Pointer(&in.TargetWWNs))
+ out.Lun = (*int32)(unsafe.Pointer(in.Lun))
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ out.WWIDs = *(*[]string)(unsafe.Pointer(&in.WWIDs))
+ return nil
+}
+
+// Convert_v1_FCVolumeSource_To_core_FCVolumeSource is an autogenerated conversion function.
+func Convert_v1_FCVolumeSource_To_core_FCVolumeSource(in *v1.FCVolumeSource, out *core.FCVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_FCVolumeSource_To_core_FCVolumeSource(in, out, s)
+}
+
+func autoConvert_core_FCVolumeSource_To_v1_FCVolumeSource(in *core.FCVolumeSource, out *v1.FCVolumeSource, s conversion.Scope) error {
+ out.TargetWWNs = *(*[]string)(unsafe.Pointer(&in.TargetWWNs))
+ out.Lun = (*int32)(unsafe.Pointer(in.Lun))
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ out.WWIDs = *(*[]string)(unsafe.Pointer(&in.WWIDs))
+ return nil
+}
+
+// Convert_core_FCVolumeSource_To_v1_FCVolumeSource is an autogenerated conversion function.
+func Convert_core_FCVolumeSource_To_v1_FCVolumeSource(in *core.FCVolumeSource, out *v1.FCVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_FCVolumeSource_To_v1_FCVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_FlexPersistentVolumeSource_To_core_FlexPersistentVolumeSource(in *v1.FlexPersistentVolumeSource, out *core.FlexPersistentVolumeSource, s conversion.Scope) error {
+ out.Driver = in.Driver
+ out.FSType = in.FSType
+ out.SecretRef = (*core.SecretReference)(unsafe.Pointer(in.SecretRef))
+ out.ReadOnly = in.ReadOnly
+ out.Options = *(*map[string]string)(unsafe.Pointer(&in.Options))
+ return nil
+}
+
+// Convert_v1_FlexPersistentVolumeSource_To_core_FlexPersistentVolumeSource is an autogenerated conversion function.
+func Convert_v1_FlexPersistentVolumeSource_To_core_FlexPersistentVolumeSource(in *v1.FlexPersistentVolumeSource, out *core.FlexPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_FlexPersistentVolumeSource_To_core_FlexPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_core_FlexPersistentVolumeSource_To_v1_FlexPersistentVolumeSource(in *core.FlexPersistentVolumeSource, out *v1.FlexPersistentVolumeSource, s conversion.Scope) error {
+ out.Driver = in.Driver
+ out.FSType = in.FSType
+ out.SecretRef = (*v1.SecretReference)(unsafe.Pointer(in.SecretRef))
+ out.ReadOnly = in.ReadOnly
+ out.Options = *(*map[string]string)(unsafe.Pointer(&in.Options))
+ return nil
+}
+
+// Convert_core_FlexPersistentVolumeSource_To_v1_FlexPersistentVolumeSource is an autogenerated conversion function.
+func Convert_core_FlexPersistentVolumeSource_To_v1_FlexPersistentVolumeSource(in *core.FlexPersistentVolumeSource, out *v1.FlexPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_FlexPersistentVolumeSource_To_v1_FlexPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_FlexVolumeSource_To_core_FlexVolumeSource(in *v1.FlexVolumeSource, out *core.FlexVolumeSource, s conversion.Scope) error {
+ out.Driver = in.Driver
+ out.FSType = in.FSType
+ out.SecretRef = (*core.LocalObjectReference)(unsafe.Pointer(in.SecretRef))
+ out.ReadOnly = in.ReadOnly
+ out.Options = *(*map[string]string)(unsafe.Pointer(&in.Options))
+ return nil
+}
+
+// Convert_v1_FlexVolumeSource_To_core_FlexVolumeSource is an autogenerated conversion function.
+func Convert_v1_FlexVolumeSource_To_core_FlexVolumeSource(in *v1.FlexVolumeSource, out *core.FlexVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_FlexVolumeSource_To_core_FlexVolumeSource(in, out, s)
+}
+
+func autoConvert_core_FlexVolumeSource_To_v1_FlexVolumeSource(in *core.FlexVolumeSource, out *v1.FlexVolumeSource, s conversion.Scope) error {
+ out.Driver = in.Driver
+ out.FSType = in.FSType
+ out.SecretRef = (*v1.LocalObjectReference)(unsafe.Pointer(in.SecretRef))
+ out.ReadOnly = in.ReadOnly
+ out.Options = *(*map[string]string)(unsafe.Pointer(&in.Options))
+ return nil
+}
+
+// Convert_core_FlexVolumeSource_To_v1_FlexVolumeSource is an autogenerated conversion function.
+func Convert_core_FlexVolumeSource_To_v1_FlexVolumeSource(in *core.FlexVolumeSource, out *v1.FlexVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_FlexVolumeSource_To_v1_FlexVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_FlockerVolumeSource_To_core_FlockerVolumeSource(in *v1.FlockerVolumeSource, out *core.FlockerVolumeSource, s conversion.Scope) error {
+ out.DatasetName = in.DatasetName
+ out.DatasetUUID = in.DatasetUUID
+ return nil
+}
+
+// Convert_v1_FlockerVolumeSource_To_core_FlockerVolumeSource is an autogenerated conversion function.
+func Convert_v1_FlockerVolumeSource_To_core_FlockerVolumeSource(in *v1.FlockerVolumeSource, out *core.FlockerVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_FlockerVolumeSource_To_core_FlockerVolumeSource(in, out, s)
+}
+
+func autoConvert_core_FlockerVolumeSource_To_v1_FlockerVolumeSource(in *core.FlockerVolumeSource, out *v1.FlockerVolumeSource, s conversion.Scope) error {
+ out.DatasetName = in.DatasetName
+ out.DatasetUUID = in.DatasetUUID
+ return nil
+}
+
+// Convert_core_FlockerVolumeSource_To_v1_FlockerVolumeSource is an autogenerated conversion function.
+func Convert_core_FlockerVolumeSource_To_v1_FlockerVolumeSource(in *core.FlockerVolumeSource, out *v1.FlockerVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_FlockerVolumeSource_To_v1_FlockerVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_GCEPersistentDiskVolumeSource_To_core_GCEPersistentDiskVolumeSource(in *v1.GCEPersistentDiskVolumeSource, out *core.GCEPersistentDiskVolumeSource, s conversion.Scope) error {
+ out.PDName = in.PDName
+ out.FSType = in.FSType
+ out.Partition = in.Partition
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_GCEPersistentDiskVolumeSource_To_core_GCEPersistentDiskVolumeSource is an autogenerated conversion function.
+func Convert_v1_GCEPersistentDiskVolumeSource_To_core_GCEPersistentDiskVolumeSource(in *v1.GCEPersistentDiskVolumeSource, out *core.GCEPersistentDiskVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_GCEPersistentDiskVolumeSource_To_core_GCEPersistentDiskVolumeSource(in, out, s)
+}
+
+func autoConvert_core_GCEPersistentDiskVolumeSource_To_v1_GCEPersistentDiskVolumeSource(in *core.GCEPersistentDiskVolumeSource, out *v1.GCEPersistentDiskVolumeSource, s conversion.Scope) error {
+ out.PDName = in.PDName
+ out.FSType = in.FSType
+ out.Partition = in.Partition
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_GCEPersistentDiskVolumeSource_To_v1_GCEPersistentDiskVolumeSource is an autogenerated conversion function.
+func Convert_core_GCEPersistentDiskVolumeSource_To_v1_GCEPersistentDiskVolumeSource(in *core.GCEPersistentDiskVolumeSource, out *v1.GCEPersistentDiskVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_GCEPersistentDiskVolumeSource_To_v1_GCEPersistentDiskVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_GitRepoVolumeSource_To_core_GitRepoVolumeSource(in *v1.GitRepoVolumeSource, out *core.GitRepoVolumeSource, s conversion.Scope) error {
+ out.Repository = in.Repository
+ out.Revision = in.Revision
+ out.Directory = in.Directory
+ return nil
+}
+
+// Convert_v1_GitRepoVolumeSource_To_core_GitRepoVolumeSource is an autogenerated conversion function.
+func Convert_v1_GitRepoVolumeSource_To_core_GitRepoVolumeSource(in *v1.GitRepoVolumeSource, out *core.GitRepoVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_GitRepoVolumeSource_To_core_GitRepoVolumeSource(in, out, s)
+}
+
+func autoConvert_core_GitRepoVolumeSource_To_v1_GitRepoVolumeSource(in *core.GitRepoVolumeSource, out *v1.GitRepoVolumeSource, s conversion.Scope) error {
+ out.Repository = in.Repository
+ out.Revision = in.Revision
+ out.Directory = in.Directory
+ return nil
+}
+
+// Convert_core_GitRepoVolumeSource_To_v1_GitRepoVolumeSource is an autogenerated conversion function.
+func Convert_core_GitRepoVolumeSource_To_v1_GitRepoVolumeSource(in *core.GitRepoVolumeSource, out *v1.GitRepoVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_GitRepoVolumeSource_To_v1_GitRepoVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_GlusterfsVolumeSource_To_core_GlusterfsVolumeSource(in *v1.GlusterfsVolumeSource, out *core.GlusterfsVolumeSource, s conversion.Scope) error {
+ out.EndpointsName = in.EndpointsName
+ out.Path = in.Path
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_GlusterfsVolumeSource_To_core_GlusterfsVolumeSource is an autogenerated conversion function.
+func Convert_v1_GlusterfsVolumeSource_To_core_GlusterfsVolumeSource(in *v1.GlusterfsVolumeSource, out *core.GlusterfsVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_GlusterfsVolumeSource_To_core_GlusterfsVolumeSource(in, out, s)
+}
+
+func autoConvert_core_GlusterfsVolumeSource_To_v1_GlusterfsVolumeSource(in *core.GlusterfsVolumeSource, out *v1.GlusterfsVolumeSource, s conversion.Scope) error {
+ out.EndpointsName = in.EndpointsName
+ out.Path = in.Path
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_GlusterfsVolumeSource_To_v1_GlusterfsVolumeSource is an autogenerated conversion function.
+func Convert_core_GlusterfsVolumeSource_To_v1_GlusterfsVolumeSource(in *core.GlusterfsVolumeSource, out *v1.GlusterfsVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_GlusterfsVolumeSource_To_v1_GlusterfsVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_HTTPGetAction_To_core_HTTPGetAction(in *v1.HTTPGetAction, out *core.HTTPGetAction, s conversion.Scope) error {
+ out.Path = in.Path
+ out.Port = in.Port
+ out.Host = in.Host
+ out.Scheme = core.URIScheme(in.Scheme)
+ out.HTTPHeaders = *(*[]core.HTTPHeader)(unsafe.Pointer(&in.HTTPHeaders))
+ return nil
+}
+
+// Convert_v1_HTTPGetAction_To_core_HTTPGetAction is an autogenerated conversion function.
+func Convert_v1_HTTPGetAction_To_core_HTTPGetAction(in *v1.HTTPGetAction, out *core.HTTPGetAction, s conversion.Scope) error {
+ return autoConvert_v1_HTTPGetAction_To_core_HTTPGetAction(in, out, s)
+}
+
+func autoConvert_core_HTTPGetAction_To_v1_HTTPGetAction(in *core.HTTPGetAction, out *v1.HTTPGetAction, s conversion.Scope) error {
+ out.Path = in.Path
+ out.Port = in.Port
+ out.Host = in.Host
+ out.Scheme = v1.URIScheme(in.Scheme)
+ out.HTTPHeaders = *(*[]v1.HTTPHeader)(unsafe.Pointer(&in.HTTPHeaders))
+ return nil
+}
+
+// Convert_core_HTTPGetAction_To_v1_HTTPGetAction is an autogenerated conversion function.
+func Convert_core_HTTPGetAction_To_v1_HTTPGetAction(in *core.HTTPGetAction, out *v1.HTTPGetAction, s conversion.Scope) error {
+ return autoConvert_core_HTTPGetAction_To_v1_HTTPGetAction(in, out, s)
+}
+
+func autoConvert_v1_HTTPHeader_To_core_HTTPHeader(in *v1.HTTPHeader, out *core.HTTPHeader, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Value = in.Value
+ return nil
+}
+
+// Convert_v1_HTTPHeader_To_core_HTTPHeader is an autogenerated conversion function.
+func Convert_v1_HTTPHeader_To_core_HTTPHeader(in *v1.HTTPHeader, out *core.HTTPHeader, s conversion.Scope) error {
+ return autoConvert_v1_HTTPHeader_To_core_HTTPHeader(in, out, s)
+}
+
+func autoConvert_core_HTTPHeader_To_v1_HTTPHeader(in *core.HTTPHeader, out *v1.HTTPHeader, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Value = in.Value
+ return nil
+}
+
+// Convert_core_HTTPHeader_To_v1_HTTPHeader is an autogenerated conversion function.
+func Convert_core_HTTPHeader_To_v1_HTTPHeader(in *core.HTTPHeader, out *v1.HTTPHeader, s conversion.Scope) error {
+ return autoConvert_core_HTTPHeader_To_v1_HTTPHeader(in, out, s)
+}
+
+func autoConvert_v1_Handler_To_core_Handler(in *v1.Handler, out *core.Handler, s conversion.Scope) error {
+ out.Exec = (*core.ExecAction)(unsafe.Pointer(in.Exec))
+ out.HTTPGet = (*core.HTTPGetAction)(unsafe.Pointer(in.HTTPGet))
+ out.TCPSocket = (*core.TCPSocketAction)(unsafe.Pointer(in.TCPSocket))
+ return nil
+}
+
+// Convert_v1_Handler_To_core_Handler is an autogenerated conversion function.
+func Convert_v1_Handler_To_core_Handler(in *v1.Handler, out *core.Handler, s conversion.Scope) error {
+ return autoConvert_v1_Handler_To_core_Handler(in, out, s)
+}
+
+func autoConvert_core_Handler_To_v1_Handler(in *core.Handler, out *v1.Handler, s conversion.Scope) error {
+ out.Exec = (*v1.ExecAction)(unsafe.Pointer(in.Exec))
+ out.HTTPGet = (*v1.HTTPGetAction)(unsafe.Pointer(in.HTTPGet))
+ out.TCPSocket = (*v1.TCPSocketAction)(unsafe.Pointer(in.TCPSocket))
+ return nil
+}
+
+// Convert_core_Handler_To_v1_Handler is an autogenerated conversion function.
+func Convert_core_Handler_To_v1_Handler(in *core.Handler, out *v1.Handler, s conversion.Scope) error {
+ return autoConvert_core_Handler_To_v1_Handler(in, out, s)
+}
+
+func autoConvert_v1_HostAlias_To_core_HostAlias(in *v1.HostAlias, out *core.HostAlias, s conversion.Scope) error {
+ out.IP = in.IP
+ out.Hostnames = *(*[]string)(unsafe.Pointer(&in.Hostnames))
+ return nil
+}
+
+// Convert_v1_HostAlias_To_core_HostAlias is an autogenerated conversion function.
+func Convert_v1_HostAlias_To_core_HostAlias(in *v1.HostAlias, out *core.HostAlias, s conversion.Scope) error {
+ return autoConvert_v1_HostAlias_To_core_HostAlias(in, out, s)
+}
+
+func autoConvert_core_HostAlias_To_v1_HostAlias(in *core.HostAlias, out *v1.HostAlias, s conversion.Scope) error {
+ out.IP = in.IP
+ out.Hostnames = *(*[]string)(unsafe.Pointer(&in.Hostnames))
+ return nil
+}
+
+// Convert_core_HostAlias_To_v1_HostAlias is an autogenerated conversion function.
+func Convert_core_HostAlias_To_v1_HostAlias(in *core.HostAlias, out *v1.HostAlias, s conversion.Scope) error {
+ return autoConvert_core_HostAlias_To_v1_HostAlias(in, out, s)
+}
+
+func autoConvert_v1_HostPathVolumeSource_To_core_HostPathVolumeSource(in *v1.HostPathVolumeSource, out *core.HostPathVolumeSource, s conversion.Scope) error {
+ out.Path = in.Path
+ out.Type = (*core.HostPathType)(unsafe.Pointer(in.Type))
+ return nil
+}
+
+// Convert_v1_HostPathVolumeSource_To_core_HostPathVolumeSource is an autogenerated conversion function.
+func Convert_v1_HostPathVolumeSource_To_core_HostPathVolumeSource(in *v1.HostPathVolumeSource, out *core.HostPathVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_HostPathVolumeSource_To_core_HostPathVolumeSource(in, out, s)
+}
+
+func autoConvert_core_HostPathVolumeSource_To_v1_HostPathVolumeSource(in *core.HostPathVolumeSource, out *v1.HostPathVolumeSource, s conversion.Scope) error {
+ out.Path = in.Path
+ out.Type = (*v1.HostPathType)(unsafe.Pointer(in.Type))
+ return nil
+}
+
+// Convert_core_HostPathVolumeSource_To_v1_HostPathVolumeSource is an autogenerated conversion function.
+func Convert_core_HostPathVolumeSource_To_v1_HostPathVolumeSource(in *core.HostPathVolumeSource, out *v1.HostPathVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_HostPathVolumeSource_To_v1_HostPathVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_ISCSIPersistentVolumeSource_To_core_ISCSIPersistentVolumeSource(in *v1.ISCSIPersistentVolumeSource, out *core.ISCSIPersistentVolumeSource, s conversion.Scope) error {
+ out.TargetPortal = in.TargetPortal
+ out.IQN = in.IQN
+ out.Lun = in.Lun
+ out.ISCSIInterface = in.ISCSIInterface
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ out.Portals = *(*[]string)(unsafe.Pointer(&in.Portals))
+ out.DiscoveryCHAPAuth = in.DiscoveryCHAPAuth
+ out.SessionCHAPAuth = in.SessionCHAPAuth
+ out.SecretRef = (*core.SecretReference)(unsafe.Pointer(in.SecretRef))
+ out.InitiatorName = (*string)(unsafe.Pointer(in.InitiatorName))
+ return nil
+}
+
+// Convert_v1_ISCSIPersistentVolumeSource_To_core_ISCSIPersistentVolumeSource is an autogenerated conversion function.
+func Convert_v1_ISCSIPersistentVolumeSource_To_core_ISCSIPersistentVolumeSource(in *v1.ISCSIPersistentVolumeSource, out *core.ISCSIPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_ISCSIPersistentVolumeSource_To_core_ISCSIPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_core_ISCSIPersistentVolumeSource_To_v1_ISCSIPersistentVolumeSource(in *core.ISCSIPersistentVolumeSource, out *v1.ISCSIPersistentVolumeSource, s conversion.Scope) error {
+ out.TargetPortal = in.TargetPortal
+ out.IQN = in.IQN
+ out.Lun = in.Lun
+ out.ISCSIInterface = in.ISCSIInterface
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ out.Portals = *(*[]string)(unsafe.Pointer(&in.Portals))
+ out.DiscoveryCHAPAuth = in.DiscoveryCHAPAuth
+ out.SessionCHAPAuth = in.SessionCHAPAuth
+ out.SecretRef = (*v1.SecretReference)(unsafe.Pointer(in.SecretRef))
+ out.InitiatorName = (*string)(unsafe.Pointer(in.InitiatorName))
+ return nil
+}
+
+// Convert_core_ISCSIPersistentVolumeSource_To_v1_ISCSIPersistentVolumeSource is an autogenerated conversion function.
+func Convert_core_ISCSIPersistentVolumeSource_To_v1_ISCSIPersistentVolumeSource(in *core.ISCSIPersistentVolumeSource, out *v1.ISCSIPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_ISCSIPersistentVolumeSource_To_v1_ISCSIPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_ISCSIVolumeSource_To_core_ISCSIVolumeSource(in *v1.ISCSIVolumeSource, out *core.ISCSIVolumeSource, s conversion.Scope) error {
+ out.TargetPortal = in.TargetPortal
+ out.IQN = in.IQN
+ out.Lun = in.Lun
+ out.ISCSIInterface = in.ISCSIInterface
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ out.Portals = *(*[]string)(unsafe.Pointer(&in.Portals))
+ out.DiscoveryCHAPAuth = in.DiscoveryCHAPAuth
+ out.SessionCHAPAuth = in.SessionCHAPAuth
+ out.SecretRef = (*core.LocalObjectReference)(unsafe.Pointer(in.SecretRef))
+ out.InitiatorName = (*string)(unsafe.Pointer(in.InitiatorName))
+ return nil
+}
+
+// Convert_v1_ISCSIVolumeSource_To_core_ISCSIVolumeSource is an autogenerated conversion function.
+func Convert_v1_ISCSIVolumeSource_To_core_ISCSIVolumeSource(in *v1.ISCSIVolumeSource, out *core.ISCSIVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_ISCSIVolumeSource_To_core_ISCSIVolumeSource(in, out, s)
+}
+
+func autoConvert_core_ISCSIVolumeSource_To_v1_ISCSIVolumeSource(in *core.ISCSIVolumeSource, out *v1.ISCSIVolumeSource, s conversion.Scope) error {
+ out.TargetPortal = in.TargetPortal
+ out.IQN = in.IQN
+ out.Lun = in.Lun
+ out.ISCSIInterface = in.ISCSIInterface
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ out.Portals = *(*[]string)(unsafe.Pointer(&in.Portals))
+ out.DiscoveryCHAPAuth = in.DiscoveryCHAPAuth
+ out.SessionCHAPAuth = in.SessionCHAPAuth
+ out.SecretRef = (*v1.LocalObjectReference)(unsafe.Pointer(in.SecretRef))
+ out.InitiatorName = (*string)(unsafe.Pointer(in.InitiatorName))
+ return nil
+}
+
+// Convert_core_ISCSIVolumeSource_To_v1_ISCSIVolumeSource is an autogenerated conversion function.
+func Convert_core_ISCSIVolumeSource_To_v1_ISCSIVolumeSource(in *core.ISCSIVolumeSource, out *v1.ISCSIVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_ISCSIVolumeSource_To_v1_ISCSIVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_KeyToPath_To_core_KeyToPath(in *v1.KeyToPath, out *core.KeyToPath, s conversion.Scope) error {
+ out.Key = in.Key
+ out.Path = in.Path
+ out.Mode = (*int32)(unsafe.Pointer(in.Mode))
+ return nil
+}
+
+// Convert_v1_KeyToPath_To_core_KeyToPath is an autogenerated conversion function.
+func Convert_v1_KeyToPath_To_core_KeyToPath(in *v1.KeyToPath, out *core.KeyToPath, s conversion.Scope) error {
+ return autoConvert_v1_KeyToPath_To_core_KeyToPath(in, out, s)
+}
+
+func autoConvert_core_KeyToPath_To_v1_KeyToPath(in *core.KeyToPath, out *v1.KeyToPath, s conversion.Scope) error {
+ out.Key = in.Key
+ out.Path = in.Path
+ out.Mode = (*int32)(unsafe.Pointer(in.Mode))
+ return nil
+}
+
+// Convert_core_KeyToPath_To_v1_KeyToPath is an autogenerated conversion function.
+func Convert_core_KeyToPath_To_v1_KeyToPath(in *core.KeyToPath, out *v1.KeyToPath, s conversion.Scope) error {
+ return autoConvert_core_KeyToPath_To_v1_KeyToPath(in, out, s)
+}
+
+func autoConvert_v1_Lifecycle_To_core_Lifecycle(in *v1.Lifecycle, out *core.Lifecycle, s conversion.Scope) error {
+ out.PostStart = (*core.Handler)(unsafe.Pointer(in.PostStart))
+ out.PreStop = (*core.Handler)(unsafe.Pointer(in.PreStop))
+ return nil
+}
+
+// Convert_v1_Lifecycle_To_core_Lifecycle is an autogenerated conversion function.
+func Convert_v1_Lifecycle_To_core_Lifecycle(in *v1.Lifecycle, out *core.Lifecycle, s conversion.Scope) error {
+ return autoConvert_v1_Lifecycle_To_core_Lifecycle(in, out, s)
+}
+
+func autoConvert_core_Lifecycle_To_v1_Lifecycle(in *core.Lifecycle, out *v1.Lifecycle, s conversion.Scope) error {
+ out.PostStart = (*v1.Handler)(unsafe.Pointer(in.PostStart))
+ out.PreStop = (*v1.Handler)(unsafe.Pointer(in.PreStop))
+ return nil
+}
+
+// Convert_core_Lifecycle_To_v1_Lifecycle is an autogenerated conversion function.
+func Convert_core_Lifecycle_To_v1_Lifecycle(in *core.Lifecycle, out *v1.Lifecycle, s conversion.Scope) error {
+ return autoConvert_core_Lifecycle_To_v1_Lifecycle(in, out, s)
+}
+
+func autoConvert_v1_LimitRange_To_core_LimitRange(in *v1.LimitRange, out *core.LimitRange, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_LimitRangeSpec_To_core_LimitRangeSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_LimitRange_To_core_LimitRange is an autogenerated conversion function.
+func Convert_v1_LimitRange_To_core_LimitRange(in *v1.LimitRange, out *core.LimitRange, s conversion.Scope) error {
+ return autoConvert_v1_LimitRange_To_core_LimitRange(in, out, s)
+}
+
+func autoConvert_core_LimitRange_To_v1_LimitRange(in *core.LimitRange, out *v1.LimitRange, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_LimitRangeSpec_To_v1_LimitRangeSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_LimitRange_To_v1_LimitRange is an autogenerated conversion function.
+func Convert_core_LimitRange_To_v1_LimitRange(in *core.LimitRange, out *v1.LimitRange, s conversion.Scope) error {
+ return autoConvert_core_LimitRange_To_v1_LimitRange(in, out, s)
+}
+
+func autoConvert_v1_LimitRangeItem_To_core_LimitRangeItem(in *v1.LimitRangeItem, out *core.LimitRangeItem, s conversion.Scope) error {
+ out.Type = core.LimitType(in.Type)
+ out.Max = *(*core.ResourceList)(unsafe.Pointer(&in.Max))
+ out.Min = *(*core.ResourceList)(unsafe.Pointer(&in.Min))
+ out.Default = *(*core.ResourceList)(unsafe.Pointer(&in.Default))
+ out.DefaultRequest = *(*core.ResourceList)(unsafe.Pointer(&in.DefaultRequest))
+ out.MaxLimitRequestRatio = *(*core.ResourceList)(unsafe.Pointer(&in.MaxLimitRequestRatio))
+ return nil
+}
+
+// Convert_v1_LimitRangeItem_To_core_LimitRangeItem is an autogenerated conversion function.
+func Convert_v1_LimitRangeItem_To_core_LimitRangeItem(in *v1.LimitRangeItem, out *core.LimitRangeItem, s conversion.Scope) error {
+ return autoConvert_v1_LimitRangeItem_To_core_LimitRangeItem(in, out, s)
+}
+
+func autoConvert_core_LimitRangeItem_To_v1_LimitRangeItem(in *core.LimitRangeItem, out *v1.LimitRangeItem, s conversion.Scope) error {
+ out.Type = v1.LimitType(in.Type)
+ out.Max = *(*v1.ResourceList)(unsafe.Pointer(&in.Max))
+ out.Min = *(*v1.ResourceList)(unsafe.Pointer(&in.Min))
+ out.Default = *(*v1.ResourceList)(unsafe.Pointer(&in.Default))
+ out.DefaultRequest = *(*v1.ResourceList)(unsafe.Pointer(&in.DefaultRequest))
+ out.MaxLimitRequestRatio = *(*v1.ResourceList)(unsafe.Pointer(&in.MaxLimitRequestRatio))
+ return nil
+}
+
+// Convert_core_LimitRangeItem_To_v1_LimitRangeItem is an autogenerated conversion function.
+func Convert_core_LimitRangeItem_To_v1_LimitRangeItem(in *core.LimitRangeItem, out *v1.LimitRangeItem, s conversion.Scope) error {
+ return autoConvert_core_LimitRangeItem_To_v1_LimitRangeItem(in, out, s)
+}
+
+func autoConvert_v1_LimitRangeList_To_core_LimitRangeList(in *v1.LimitRangeList, out *core.LimitRangeList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]core.LimitRange)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_v1_LimitRangeList_To_core_LimitRangeList is an autogenerated conversion function.
+func Convert_v1_LimitRangeList_To_core_LimitRangeList(in *v1.LimitRangeList, out *core.LimitRangeList, s conversion.Scope) error {
+ return autoConvert_v1_LimitRangeList_To_core_LimitRangeList(in, out, s)
+}
+
+func autoConvert_core_LimitRangeList_To_v1_LimitRangeList(in *core.LimitRangeList, out *v1.LimitRangeList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]v1.LimitRange)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_core_LimitRangeList_To_v1_LimitRangeList is an autogenerated conversion function.
+func Convert_core_LimitRangeList_To_v1_LimitRangeList(in *core.LimitRangeList, out *v1.LimitRangeList, s conversion.Scope) error {
+ return autoConvert_core_LimitRangeList_To_v1_LimitRangeList(in, out, s)
+}
+
+func autoConvert_v1_LimitRangeSpec_To_core_LimitRangeSpec(in *v1.LimitRangeSpec, out *core.LimitRangeSpec, s conversion.Scope) error {
+ out.Limits = *(*[]core.LimitRangeItem)(unsafe.Pointer(&in.Limits))
+ return nil
+}
+
+// Convert_v1_LimitRangeSpec_To_core_LimitRangeSpec is an autogenerated conversion function.
+func Convert_v1_LimitRangeSpec_To_core_LimitRangeSpec(in *v1.LimitRangeSpec, out *core.LimitRangeSpec, s conversion.Scope) error {
+ return autoConvert_v1_LimitRangeSpec_To_core_LimitRangeSpec(in, out, s)
+}
+
+func autoConvert_core_LimitRangeSpec_To_v1_LimitRangeSpec(in *core.LimitRangeSpec, out *v1.LimitRangeSpec, s conversion.Scope) error {
+ out.Limits = *(*[]v1.LimitRangeItem)(unsafe.Pointer(&in.Limits))
+ return nil
+}
+
+// Convert_core_LimitRangeSpec_To_v1_LimitRangeSpec is an autogenerated conversion function.
+func Convert_core_LimitRangeSpec_To_v1_LimitRangeSpec(in *core.LimitRangeSpec, out *v1.LimitRangeSpec, s conversion.Scope) error {
+ return autoConvert_core_LimitRangeSpec_To_v1_LimitRangeSpec(in, out, s)
+}
+
+func autoConvert_v1_List_To_core_List(in *v1.List, out *core.List, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]runtime.Object, len(*in))
+ for i := range *in {
+ if err := runtime.Convert_runtime_RawExtension_To_runtime_Object(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_v1_List_To_core_List is an autogenerated conversion function.
+func Convert_v1_List_To_core_List(in *v1.List, out *core.List, s conversion.Scope) error {
+ return autoConvert_v1_List_To_core_List(in, out, s)
+}
+
+func autoConvert_core_List_To_v1_List(in *core.List, out *v1.List, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]runtime.RawExtension, len(*in))
+ for i := range *in {
+ if err := runtime.Convert_runtime_Object_To_runtime_RawExtension(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_core_List_To_v1_List is an autogenerated conversion function.
+func Convert_core_List_To_v1_List(in *core.List, out *v1.List, s conversion.Scope) error {
+ return autoConvert_core_List_To_v1_List(in, out, s)
+}
+
+func autoConvert_v1_ListOptions_To_core_ListOptions(in *v1.ListOptions, out *core.ListOptions, s conversion.Scope) error {
+ if err := meta_v1.Convert_string_To_labels_Selector(&in.LabelSelector, &out.LabelSelector, s); err != nil {
+ return err
+ }
+ if err := meta_v1.Convert_string_To_fields_Selector(&in.FieldSelector, &out.FieldSelector, s); err != nil {
+ return err
+ }
+ out.IncludeUninitialized = in.IncludeUninitialized
+ out.Watch = in.Watch
+ out.ResourceVersion = in.ResourceVersion
+ out.TimeoutSeconds = (*int64)(unsafe.Pointer(in.TimeoutSeconds))
+ return nil
+}
+
+// Convert_v1_ListOptions_To_core_ListOptions is an autogenerated conversion function.
+func Convert_v1_ListOptions_To_core_ListOptions(in *v1.ListOptions, out *core.ListOptions, s conversion.Scope) error {
+ return autoConvert_v1_ListOptions_To_core_ListOptions(in, out, s)
+}
+
+func autoConvert_core_ListOptions_To_v1_ListOptions(in *core.ListOptions, out *v1.ListOptions, s conversion.Scope) error {
+ if err := meta_v1.Convert_labels_Selector_To_string(&in.LabelSelector, &out.LabelSelector, s); err != nil {
+ return err
+ }
+ if err := meta_v1.Convert_fields_Selector_To_string(&in.FieldSelector, &out.FieldSelector, s); err != nil {
+ return err
+ }
+ out.IncludeUninitialized = in.IncludeUninitialized
+ out.Watch = in.Watch
+ out.ResourceVersion = in.ResourceVersion
+ out.TimeoutSeconds = (*int64)(unsafe.Pointer(in.TimeoutSeconds))
+ return nil
+}
+
+// Convert_core_ListOptions_To_v1_ListOptions is an autogenerated conversion function.
+func Convert_core_ListOptions_To_v1_ListOptions(in *core.ListOptions, out *v1.ListOptions, s conversion.Scope) error {
+ return autoConvert_core_ListOptions_To_v1_ListOptions(in, out, s)
+}
+
+func autoConvert_v1_LoadBalancerIngress_To_core_LoadBalancerIngress(in *v1.LoadBalancerIngress, out *core.LoadBalancerIngress, s conversion.Scope) error {
+ out.IP = in.IP
+ out.Hostname = in.Hostname
+ return nil
+}
+
+// Convert_v1_LoadBalancerIngress_To_core_LoadBalancerIngress is an autogenerated conversion function.
+func Convert_v1_LoadBalancerIngress_To_core_LoadBalancerIngress(in *v1.LoadBalancerIngress, out *core.LoadBalancerIngress, s conversion.Scope) error {
+ return autoConvert_v1_LoadBalancerIngress_To_core_LoadBalancerIngress(in, out, s)
+}
+
+func autoConvert_core_LoadBalancerIngress_To_v1_LoadBalancerIngress(in *core.LoadBalancerIngress, out *v1.LoadBalancerIngress, s conversion.Scope) error {
+ out.IP = in.IP
+ out.Hostname = in.Hostname
+ return nil
+}
+
+// Convert_core_LoadBalancerIngress_To_v1_LoadBalancerIngress is an autogenerated conversion function.
+func Convert_core_LoadBalancerIngress_To_v1_LoadBalancerIngress(in *core.LoadBalancerIngress, out *v1.LoadBalancerIngress, s conversion.Scope) error {
+ return autoConvert_core_LoadBalancerIngress_To_v1_LoadBalancerIngress(in, out, s)
+}
+
+func autoConvert_v1_LoadBalancerStatus_To_core_LoadBalancerStatus(in *v1.LoadBalancerStatus, out *core.LoadBalancerStatus, s conversion.Scope) error {
+ out.Ingress = *(*[]core.LoadBalancerIngress)(unsafe.Pointer(&in.Ingress))
+ return nil
+}
+
+// Convert_v1_LoadBalancerStatus_To_core_LoadBalancerStatus is an autogenerated conversion function.
+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)
+}
+
+func autoConvert_core_LoadBalancerStatus_To_v1_LoadBalancerStatus(in *core.LoadBalancerStatus, out *v1.LoadBalancerStatus, s conversion.Scope) error {
+ out.Ingress = *(*[]v1.LoadBalancerIngress)(unsafe.Pointer(&in.Ingress))
+ return nil
+}
+
+// Convert_core_LoadBalancerStatus_To_v1_LoadBalancerStatus is an autogenerated conversion function.
+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)
+}
+
+func autoConvert_v1_LocalObjectReference_To_core_LocalObjectReference(in *v1.LocalObjectReference, out *core.LocalObjectReference, s conversion.Scope) error {
+ out.Name = in.Name
+ return nil
+}
+
+// Convert_v1_LocalObjectReference_To_core_LocalObjectReference is an autogenerated conversion function.
+func Convert_v1_LocalObjectReference_To_core_LocalObjectReference(in *v1.LocalObjectReference, out *core.LocalObjectReference, s conversion.Scope) error {
+ return autoConvert_v1_LocalObjectReference_To_core_LocalObjectReference(in, out, s)
+}
+
+func autoConvert_core_LocalObjectReference_To_v1_LocalObjectReference(in *core.LocalObjectReference, out *v1.LocalObjectReference, s conversion.Scope) error {
+ out.Name = in.Name
+ return nil
+}
+
+// Convert_core_LocalObjectReference_To_v1_LocalObjectReference is an autogenerated conversion function.
+func Convert_core_LocalObjectReference_To_v1_LocalObjectReference(in *core.LocalObjectReference, out *v1.LocalObjectReference, s conversion.Scope) error {
+ return autoConvert_core_LocalObjectReference_To_v1_LocalObjectReference(in, out, s)
+}
+
+func autoConvert_v1_LocalVolumeSource_To_core_LocalVolumeSource(in *v1.LocalVolumeSource, out *core.LocalVolumeSource, s conversion.Scope) error {
+ out.Path = in.Path
+ return nil
+}
+
+// Convert_v1_LocalVolumeSource_To_core_LocalVolumeSource is an autogenerated conversion function.
+func Convert_v1_LocalVolumeSource_To_core_LocalVolumeSource(in *v1.LocalVolumeSource, out *core.LocalVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_LocalVolumeSource_To_core_LocalVolumeSource(in, out, s)
+}
+
+func autoConvert_core_LocalVolumeSource_To_v1_LocalVolumeSource(in *core.LocalVolumeSource, out *v1.LocalVolumeSource, s conversion.Scope) error {
+ out.Path = in.Path
+ return nil
+}
+
+// Convert_core_LocalVolumeSource_To_v1_LocalVolumeSource is an autogenerated conversion function.
+func Convert_core_LocalVolumeSource_To_v1_LocalVolumeSource(in *core.LocalVolumeSource, out *v1.LocalVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_LocalVolumeSource_To_v1_LocalVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_NFSVolumeSource_To_core_NFSVolumeSource(in *v1.NFSVolumeSource, out *core.NFSVolumeSource, s conversion.Scope) error {
+ out.Server = in.Server
+ out.Path = in.Path
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_NFSVolumeSource_To_core_NFSVolumeSource is an autogenerated conversion function.
+func Convert_v1_NFSVolumeSource_To_core_NFSVolumeSource(in *v1.NFSVolumeSource, out *core.NFSVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_NFSVolumeSource_To_core_NFSVolumeSource(in, out, s)
+}
+
+func autoConvert_core_NFSVolumeSource_To_v1_NFSVolumeSource(in *core.NFSVolumeSource, out *v1.NFSVolumeSource, s conversion.Scope) error {
+ out.Server = in.Server
+ out.Path = in.Path
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_NFSVolumeSource_To_v1_NFSVolumeSource is an autogenerated conversion function.
+func Convert_core_NFSVolumeSource_To_v1_NFSVolumeSource(in *core.NFSVolumeSource, out *v1.NFSVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_NFSVolumeSource_To_v1_NFSVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_Namespace_To_core_Namespace(in *v1.Namespace, out *core.Namespace, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_NamespaceSpec_To_core_NamespaceSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_v1_NamespaceStatus_To_core_NamespaceStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_Namespace_To_core_Namespace is an autogenerated conversion function.
+func Convert_v1_Namespace_To_core_Namespace(in *v1.Namespace, out *core.Namespace, s conversion.Scope) error {
+ return autoConvert_v1_Namespace_To_core_Namespace(in, out, s)
+}
+
+func autoConvert_core_Namespace_To_v1_Namespace(in *core.Namespace, out *v1.Namespace, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_NamespaceSpec_To_v1_NamespaceSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_core_NamespaceStatus_To_v1_NamespaceStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_Namespace_To_v1_Namespace is an autogenerated conversion function.
+func Convert_core_Namespace_To_v1_Namespace(in *core.Namespace, out *v1.Namespace, s conversion.Scope) error {
+ return autoConvert_core_Namespace_To_v1_Namespace(in, out, s)
+}
+
+func autoConvert_v1_NamespaceList_To_core_NamespaceList(in *v1.NamespaceList, out *core.NamespaceList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]core.Namespace)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_v1_NamespaceList_To_core_NamespaceList is an autogenerated conversion function.
+func Convert_v1_NamespaceList_To_core_NamespaceList(in *v1.NamespaceList, out *core.NamespaceList, s conversion.Scope) error {
+ return autoConvert_v1_NamespaceList_To_core_NamespaceList(in, out, s)
+}
+
+func autoConvert_core_NamespaceList_To_v1_NamespaceList(in *core.NamespaceList, out *v1.NamespaceList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]v1.Namespace)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_core_NamespaceList_To_v1_NamespaceList is an autogenerated conversion function.
+func Convert_core_NamespaceList_To_v1_NamespaceList(in *core.NamespaceList, out *v1.NamespaceList, s conversion.Scope) error {
+ return autoConvert_core_NamespaceList_To_v1_NamespaceList(in, out, s)
+}
+
+func autoConvert_v1_NamespaceSpec_To_core_NamespaceSpec(in *v1.NamespaceSpec, out *core.NamespaceSpec, s conversion.Scope) error {
+ out.Finalizers = *(*[]core.FinalizerName)(unsafe.Pointer(&in.Finalizers))
+ return nil
+}
+
+// Convert_v1_NamespaceSpec_To_core_NamespaceSpec is an autogenerated conversion function.
+func Convert_v1_NamespaceSpec_To_core_NamespaceSpec(in *v1.NamespaceSpec, out *core.NamespaceSpec, s conversion.Scope) error {
+ return autoConvert_v1_NamespaceSpec_To_core_NamespaceSpec(in, out, s)
+}
+
+func autoConvert_core_NamespaceSpec_To_v1_NamespaceSpec(in *core.NamespaceSpec, out *v1.NamespaceSpec, s conversion.Scope) error {
+ out.Finalizers = *(*[]v1.FinalizerName)(unsafe.Pointer(&in.Finalizers))
+ return nil
+}
+
+// Convert_core_NamespaceSpec_To_v1_NamespaceSpec is an autogenerated conversion function.
+func Convert_core_NamespaceSpec_To_v1_NamespaceSpec(in *core.NamespaceSpec, out *v1.NamespaceSpec, s conversion.Scope) error {
+ return autoConvert_core_NamespaceSpec_To_v1_NamespaceSpec(in, out, s)
+}
+
+func autoConvert_v1_NamespaceStatus_To_core_NamespaceStatus(in *v1.NamespaceStatus, out *core.NamespaceStatus, s conversion.Scope) error {
+ out.Phase = core.NamespacePhase(in.Phase)
+ return nil
+}
+
+// Convert_v1_NamespaceStatus_To_core_NamespaceStatus is an autogenerated conversion function.
+func Convert_v1_NamespaceStatus_To_core_NamespaceStatus(in *v1.NamespaceStatus, out *core.NamespaceStatus, s conversion.Scope) error {
+ return autoConvert_v1_NamespaceStatus_To_core_NamespaceStatus(in, out, s)
+}
+
+func autoConvert_core_NamespaceStatus_To_v1_NamespaceStatus(in *core.NamespaceStatus, out *v1.NamespaceStatus, s conversion.Scope) error {
+ out.Phase = v1.NamespacePhase(in.Phase)
+ return nil
+}
+
+// Convert_core_NamespaceStatus_To_v1_NamespaceStatus is an autogenerated conversion function.
+func Convert_core_NamespaceStatus_To_v1_NamespaceStatus(in *core.NamespaceStatus, out *v1.NamespaceStatus, s conversion.Scope) error {
+ return autoConvert_core_NamespaceStatus_To_v1_NamespaceStatus(in, out, s)
+}
+
+func autoConvert_v1_Node_To_core_Node(in *v1.Node, out *core.Node, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_NodeSpec_To_core_NodeSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_v1_NodeStatus_To_core_NodeStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_Node_To_core_Node is an autogenerated conversion function.
+func Convert_v1_Node_To_core_Node(in *v1.Node, out *core.Node, s conversion.Scope) error {
+ return autoConvert_v1_Node_To_core_Node(in, out, s)
+}
+
+func autoConvert_core_Node_To_v1_Node(in *core.Node, out *v1.Node, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_NodeSpec_To_v1_NodeSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_core_NodeStatus_To_v1_NodeStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_Node_To_v1_Node is an autogenerated conversion function.
+func Convert_core_Node_To_v1_Node(in *core.Node, out *v1.Node, s conversion.Scope) error {
+ return autoConvert_core_Node_To_v1_Node(in, out, s)
+}
+
+func autoConvert_v1_NodeAddress_To_core_NodeAddress(in *v1.NodeAddress, out *core.NodeAddress, s conversion.Scope) error {
+ out.Type = core.NodeAddressType(in.Type)
+ out.Address = in.Address
+ return nil
+}
+
+// Convert_v1_NodeAddress_To_core_NodeAddress is an autogenerated conversion function.
+func Convert_v1_NodeAddress_To_core_NodeAddress(in *v1.NodeAddress, out *core.NodeAddress, s conversion.Scope) error {
+ return autoConvert_v1_NodeAddress_To_core_NodeAddress(in, out, s)
+}
+
+func autoConvert_core_NodeAddress_To_v1_NodeAddress(in *core.NodeAddress, out *v1.NodeAddress, s conversion.Scope) error {
+ out.Type = v1.NodeAddressType(in.Type)
+ out.Address = in.Address
+ return nil
+}
+
+// Convert_core_NodeAddress_To_v1_NodeAddress is an autogenerated conversion function.
+func Convert_core_NodeAddress_To_v1_NodeAddress(in *core.NodeAddress, out *v1.NodeAddress, s conversion.Scope) error {
+ return autoConvert_core_NodeAddress_To_v1_NodeAddress(in, out, s)
+}
+
+func autoConvert_v1_NodeAffinity_To_core_NodeAffinity(in *v1.NodeAffinity, out *core.NodeAffinity, s conversion.Scope) error {
+ out.RequiredDuringSchedulingIgnoredDuringExecution = (*core.NodeSelector)(unsafe.Pointer(in.RequiredDuringSchedulingIgnoredDuringExecution))
+ out.PreferredDuringSchedulingIgnoredDuringExecution = *(*[]core.PreferredSchedulingTerm)(unsafe.Pointer(&in.PreferredDuringSchedulingIgnoredDuringExecution))
+ return nil
+}
+
+// Convert_v1_NodeAffinity_To_core_NodeAffinity is an autogenerated conversion function.
+func Convert_v1_NodeAffinity_To_core_NodeAffinity(in *v1.NodeAffinity, out *core.NodeAffinity, s conversion.Scope) error {
+ return autoConvert_v1_NodeAffinity_To_core_NodeAffinity(in, out, s)
+}
+
+func autoConvert_core_NodeAffinity_To_v1_NodeAffinity(in *core.NodeAffinity, out *v1.NodeAffinity, s conversion.Scope) error {
+ out.RequiredDuringSchedulingIgnoredDuringExecution = (*v1.NodeSelector)(unsafe.Pointer(in.RequiredDuringSchedulingIgnoredDuringExecution))
+ out.PreferredDuringSchedulingIgnoredDuringExecution = *(*[]v1.PreferredSchedulingTerm)(unsafe.Pointer(&in.PreferredDuringSchedulingIgnoredDuringExecution))
+ return nil
+}
+
+// Convert_core_NodeAffinity_To_v1_NodeAffinity is an autogenerated conversion function.
+func Convert_core_NodeAffinity_To_v1_NodeAffinity(in *core.NodeAffinity, out *v1.NodeAffinity, s conversion.Scope) error {
+ return autoConvert_core_NodeAffinity_To_v1_NodeAffinity(in, out, s)
+}
+
+func autoConvert_v1_NodeCondition_To_core_NodeCondition(in *v1.NodeCondition, out *core.NodeCondition, s conversion.Scope) error {
+ out.Type = core.NodeConditionType(in.Type)
+ out.Status = core.ConditionStatus(in.Status)
+ out.LastHeartbeatTime = in.LastHeartbeatTime
+ out.LastTransitionTime = in.LastTransitionTime
+ out.Reason = in.Reason
+ out.Message = in.Message
+ return nil
+}
+
+// Convert_v1_NodeCondition_To_core_NodeCondition is an autogenerated conversion function.
+func Convert_v1_NodeCondition_To_core_NodeCondition(in *v1.NodeCondition, out *core.NodeCondition, s conversion.Scope) error {
+ return autoConvert_v1_NodeCondition_To_core_NodeCondition(in, out, s)
+}
+
+func autoConvert_core_NodeCondition_To_v1_NodeCondition(in *core.NodeCondition, out *v1.NodeCondition, s conversion.Scope) error {
+ out.Type = v1.NodeConditionType(in.Type)
+ out.Status = v1.ConditionStatus(in.Status)
+ out.LastHeartbeatTime = in.LastHeartbeatTime
+ out.LastTransitionTime = in.LastTransitionTime
+ out.Reason = in.Reason
+ out.Message = in.Message
+ return nil
+}
+
+// Convert_core_NodeCondition_To_v1_NodeCondition is an autogenerated conversion function.
+func Convert_core_NodeCondition_To_v1_NodeCondition(in *core.NodeCondition, out *v1.NodeCondition, s conversion.Scope) error {
+ return autoConvert_core_NodeCondition_To_v1_NodeCondition(in, out, s)
+}
+
+func autoConvert_v1_NodeConfigSource_To_core_NodeConfigSource(in *v1.NodeConfigSource, out *core.NodeConfigSource, s conversion.Scope) error {
+ out.ConfigMapRef = (*core.ObjectReference)(unsafe.Pointer(in.ConfigMapRef))
+ return nil
+}
+
+// Convert_v1_NodeConfigSource_To_core_NodeConfigSource is an autogenerated conversion function.
+func Convert_v1_NodeConfigSource_To_core_NodeConfigSource(in *v1.NodeConfigSource, out *core.NodeConfigSource, s conversion.Scope) error {
+ return autoConvert_v1_NodeConfigSource_To_core_NodeConfigSource(in, out, s)
+}
+
+func autoConvert_core_NodeConfigSource_To_v1_NodeConfigSource(in *core.NodeConfigSource, out *v1.NodeConfigSource, s conversion.Scope) error {
+ out.ConfigMapRef = (*v1.ObjectReference)(unsafe.Pointer(in.ConfigMapRef))
+ return nil
+}
+
+// Convert_core_NodeConfigSource_To_v1_NodeConfigSource is an autogenerated conversion function.
+func Convert_core_NodeConfigSource_To_v1_NodeConfigSource(in *core.NodeConfigSource, out *v1.NodeConfigSource, s conversion.Scope) error {
+ return autoConvert_core_NodeConfigSource_To_v1_NodeConfigSource(in, out, s)
+}
+
+func autoConvert_v1_NodeDaemonEndpoints_To_core_NodeDaemonEndpoints(in *v1.NodeDaemonEndpoints, out *core.NodeDaemonEndpoints, s conversion.Scope) error {
+ if err := Convert_v1_DaemonEndpoint_To_core_DaemonEndpoint(&in.KubeletEndpoint, &out.KubeletEndpoint, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_NodeDaemonEndpoints_To_core_NodeDaemonEndpoints is an autogenerated conversion function.
+func Convert_v1_NodeDaemonEndpoints_To_core_NodeDaemonEndpoints(in *v1.NodeDaemonEndpoints, out *core.NodeDaemonEndpoints, s conversion.Scope) error {
+ return autoConvert_v1_NodeDaemonEndpoints_To_core_NodeDaemonEndpoints(in, out, s)
+}
+
+func autoConvert_core_NodeDaemonEndpoints_To_v1_NodeDaemonEndpoints(in *core.NodeDaemonEndpoints, out *v1.NodeDaemonEndpoints, s conversion.Scope) error {
+ if err := Convert_core_DaemonEndpoint_To_v1_DaemonEndpoint(&in.KubeletEndpoint, &out.KubeletEndpoint, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_NodeDaemonEndpoints_To_v1_NodeDaemonEndpoints is an autogenerated conversion function.
+func Convert_core_NodeDaemonEndpoints_To_v1_NodeDaemonEndpoints(in *core.NodeDaemonEndpoints, out *v1.NodeDaemonEndpoints, s conversion.Scope) error {
+ return autoConvert_core_NodeDaemonEndpoints_To_v1_NodeDaemonEndpoints(in, out, s)
+}
+
+func autoConvert_v1_NodeList_To_core_NodeList(in *v1.NodeList, out *core.NodeList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]core.Node)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_v1_NodeList_To_core_NodeList is an autogenerated conversion function.
+func Convert_v1_NodeList_To_core_NodeList(in *v1.NodeList, out *core.NodeList, s conversion.Scope) error {
+ return autoConvert_v1_NodeList_To_core_NodeList(in, out, s)
+}
+
+func autoConvert_core_NodeList_To_v1_NodeList(in *core.NodeList, out *v1.NodeList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]v1.Node)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_core_NodeList_To_v1_NodeList is an autogenerated conversion function.
+func Convert_core_NodeList_To_v1_NodeList(in *core.NodeList, out *v1.NodeList, s conversion.Scope) error {
+ return autoConvert_core_NodeList_To_v1_NodeList(in, out, s)
+}
+
+func autoConvert_v1_NodeProxyOptions_To_core_NodeProxyOptions(in *v1.NodeProxyOptions, out *core.NodeProxyOptions, s conversion.Scope) error {
+ out.Path = in.Path
+ return nil
+}
+
+// Convert_v1_NodeProxyOptions_To_core_NodeProxyOptions is an autogenerated conversion function.
+func Convert_v1_NodeProxyOptions_To_core_NodeProxyOptions(in *v1.NodeProxyOptions, out *core.NodeProxyOptions, s conversion.Scope) error {
+ return autoConvert_v1_NodeProxyOptions_To_core_NodeProxyOptions(in, out, s)
+}
+
+func autoConvert_core_NodeProxyOptions_To_v1_NodeProxyOptions(in *core.NodeProxyOptions, out *v1.NodeProxyOptions, s conversion.Scope) error {
+ out.Path = in.Path
+ return nil
+}
+
+// Convert_core_NodeProxyOptions_To_v1_NodeProxyOptions is an autogenerated conversion function.
+func Convert_core_NodeProxyOptions_To_v1_NodeProxyOptions(in *core.NodeProxyOptions, out *v1.NodeProxyOptions, s conversion.Scope) error {
+ return autoConvert_core_NodeProxyOptions_To_v1_NodeProxyOptions(in, out, s)
+}
+
+func autoConvert_v1_NodeResources_To_core_NodeResources(in *v1.NodeResources, out *core.NodeResources, s conversion.Scope) error {
+ out.Capacity = *(*core.ResourceList)(unsafe.Pointer(&in.Capacity))
+ return nil
+}
+
+// Convert_v1_NodeResources_To_core_NodeResources is an autogenerated conversion function.
+func Convert_v1_NodeResources_To_core_NodeResources(in *v1.NodeResources, out *core.NodeResources, s conversion.Scope) error {
+ return autoConvert_v1_NodeResources_To_core_NodeResources(in, out, s)
+}
+
+func autoConvert_core_NodeResources_To_v1_NodeResources(in *core.NodeResources, out *v1.NodeResources, s conversion.Scope) error {
+ out.Capacity = *(*v1.ResourceList)(unsafe.Pointer(&in.Capacity))
+ return nil
+}
+
+// Convert_core_NodeResources_To_v1_NodeResources is an autogenerated conversion function.
+func Convert_core_NodeResources_To_v1_NodeResources(in *core.NodeResources, out *v1.NodeResources, s conversion.Scope) error {
+ return autoConvert_core_NodeResources_To_v1_NodeResources(in, out, s)
+}
+
+func autoConvert_v1_NodeSelector_To_core_NodeSelector(in *v1.NodeSelector, out *core.NodeSelector, s conversion.Scope) error {
+ out.NodeSelectorTerms = *(*[]core.NodeSelectorTerm)(unsafe.Pointer(&in.NodeSelectorTerms))
+ return nil
+}
+
+// Convert_v1_NodeSelector_To_core_NodeSelector is an autogenerated conversion function.
+func Convert_v1_NodeSelector_To_core_NodeSelector(in *v1.NodeSelector, out *core.NodeSelector, s conversion.Scope) error {
+ return autoConvert_v1_NodeSelector_To_core_NodeSelector(in, out, s)
+}
+
+func autoConvert_core_NodeSelector_To_v1_NodeSelector(in *core.NodeSelector, out *v1.NodeSelector, s conversion.Scope) error {
+ out.NodeSelectorTerms = *(*[]v1.NodeSelectorTerm)(unsafe.Pointer(&in.NodeSelectorTerms))
+ return nil
+}
+
+// Convert_core_NodeSelector_To_v1_NodeSelector is an autogenerated conversion function.
+func Convert_core_NodeSelector_To_v1_NodeSelector(in *core.NodeSelector, out *v1.NodeSelector, s conversion.Scope) error {
+ return autoConvert_core_NodeSelector_To_v1_NodeSelector(in, out, s)
+}
+
+func autoConvert_v1_NodeSelectorRequirement_To_core_NodeSelectorRequirement(in *v1.NodeSelectorRequirement, out *core.NodeSelectorRequirement, s conversion.Scope) error {
+ out.Key = in.Key
+ out.Operator = core.NodeSelectorOperator(in.Operator)
+ out.Values = *(*[]string)(unsafe.Pointer(&in.Values))
+ return nil
+}
+
+// Convert_v1_NodeSelectorRequirement_To_core_NodeSelectorRequirement is an autogenerated conversion function.
+func Convert_v1_NodeSelectorRequirement_To_core_NodeSelectorRequirement(in *v1.NodeSelectorRequirement, out *core.NodeSelectorRequirement, s conversion.Scope) error {
+ return autoConvert_v1_NodeSelectorRequirement_To_core_NodeSelectorRequirement(in, out, s)
+}
+
+func autoConvert_core_NodeSelectorRequirement_To_v1_NodeSelectorRequirement(in *core.NodeSelectorRequirement, out *v1.NodeSelectorRequirement, s conversion.Scope) error {
+ out.Key = in.Key
+ out.Operator = v1.NodeSelectorOperator(in.Operator)
+ out.Values = *(*[]string)(unsafe.Pointer(&in.Values))
+ return nil
+}
+
+// Convert_core_NodeSelectorRequirement_To_v1_NodeSelectorRequirement is an autogenerated conversion function.
+func Convert_core_NodeSelectorRequirement_To_v1_NodeSelectorRequirement(in *core.NodeSelectorRequirement, out *v1.NodeSelectorRequirement, s conversion.Scope) error {
+ return autoConvert_core_NodeSelectorRequirement_To_v1_NodeSelectorRequirement(in, out, s)
+}
+
+func autoConvert_v1_NodeSelectorTerm_To_core_NodeSelectorTerm(in *v1.NodeSelectorTerm, out *core.NodeSelectorTerm, s conversion.Scope) error {
+ out.MatchExpressions = *(*[]core.NodeSelectorRequirement)(unsafe.Pointer(&in.MatchExpressions))
+ return nil
+}
+
+// Convert_v1_NodeSelectorTerm_To_core_NodeSelectorTerm is an autogenerated conversion function.
+func Convert_v1_NodeSelectorTerm_To_core_NodeSelectorTerm(in *v1.NodeSelectorTerm, out *core.NodeSelectorTerm, s conversion.Scope) error {
+ return autoConvert_v1_NodeSelectorTerm_To_core_NodeSelectorTerm(in, out, s)
+}
+
+func autoConvert_core_NodeSelectorTerm_To_v1_NodeSelectorTerm(in *core.NodeSelectorTerm, out *v1.NodeSelectorTerm, s conversion.Scope) error {
+ out.MatchExpressions = *(*[]v1.NodeSelectorRequirement)(unsafe.Pointer(&in.MatchExpressions))
+ return nil
+}
+
+// Convert_core_NodeSelectorTerm_To_v1_NodeSelectorTerm is an autogenerated conversion function.
+func Convert_core_NodeSelectorTerm_To_v1_NodeSelectorTerm(in *core.NodeSelectorTerm, out *v1.NodeSelectorTerm, s conversion.Scope) error {
+ return autoConvert_core_NodeSelectorTerm_To_v1_NodeSelectorTerm(in, out, s)
+}
+
+func autoConvert_v1_NodeSpec_To_core_NodeSpec(in *v1.NodeSpec, out *core.NodeSpec, s conversion.Scope) error {
+ out.PodCIDR = in.PodCIDR
+ out.ExternalID = in.ExternalID
+ out.ProviderID = in.ProviderID
+ out.Unschedulable = in.Unschedulable
+ out.Taints = *(*[]core.Taint)(unsafe.Pointer(&in.Taints))
+ out.ConfigSource = (*core.NodeConfigSource)(unsafe.Pointer(in.ConfigSource))
+ return nil
+}
+
+// Convert_v1_NodeSpec_To_core_NodeSpec is an autogenerated conversion function.
+func Convert_v1_NodeSpec_To_core_NodeSpec(in *v1.NodeSpec, out *core.NodeSpec, s conversion.Scope) error {
+ return autoConvert_v1_NodeSpec_To_core_NodeSpec(in, out, s)
+}
+
+func autoConvert_core_NodeSpec_To_v1_NodeSpec(in *core.NodeSpec, out *v1.NodeSpec, s conversion.Scope) error {
+ out.PodCIDR = in.PodCIDR
+ out.ExternalID = in.ExternalID
+ out.ProviderID = in.ProviderID
+ out.Unschedulable = in.Unschedulable
+ out.Taints = *(*[]v1.Taint)(unsafe.Pointer(&in.Taints))
+ out.ConfigSource = (*v1.NodeConfigSource)(unsafe.Pointer(in.ConfigSource))
+ return nil
+}
+
+// Convert_core_NodeSpec_To_v1_NodeSpec is an autogenerated conversion function.
+func Convert_core_NodeSpec_To_v1_NodeSpec(in *core.NodeSpec, out *v1.NodeSpec, s conversion.Scope) error {
+ return autoConvert_core_NodeSpec_To_v1_NodeSpec(in, out, s)
+}
+
+func autoConvert_v1_NodeStatus_To_core_NodeStatus(in *v1.NodeStatus, out *core.NodeStatus, s conversion.Scope) error {
+ out.Capacity = *(*core.ResourceList)(unsafe.Pointer(&in.Capacity))
+ out.Allocatable = *(*core.ResourceList)(unsafe.Pointer(&in.Allocatable))
+ out.Phase = core.NodePhase(in.Phase)
+ out.Conditions = *(*[]core.NodeCondition)(unsafe.Pointer(&in.Conditions))
+ out.Addresses = *(*[]core.NodeAddress)(unsafe.Pointer(&in.Addresses))
+ if err := Convert_v1_NodeDaemonEndpoints_To_core_NodeDaemonEndpoints(&in.DaemonEndpoints, &out.DaemonEndpoints, s); err != nil {
+ return err
+ }
+ if err := Convert_v1_NodeSystemInfo_To_core_NodeSystemInfo(&in.NodeInfo, &out.NodeInfo, s); err != nil {
+ return err
+ }
+ out.Images = *(*[]core.ContainerImage)(unsafe.Pointer(&in.Images))
+ out.VolumesInUse = *(*[]core.UniqueVolumeName)(unsafe.Pointer(&in.VolumesInUse))
+ out.VolumesAttached = *(*[]core.AttachedVolume)(unsafe.Pointer(&in.VolumesAttached))
+ return nil
+}
+
+// Convert_v1_NodeStatus_To_core_NodeStatus is an autogenerated conversion function.
+func Convert_v1_NodeStatus_To_core_NodeStatus(in *v1.NodeStatus, out *core.NodeStatus, s conversion.Scope) error {
+ return autoConvert_v1_NodeStatus_To_core_NodeStatus(in, out, s)
+}
+
+func autoConvert_core_NodeStatus_To_v1_NodeStatus(in *core.NodeStatus, out *v1.NodeStatus, s conversion.Scope) error {
+ out.Capacity = *(*v1.ResourceList)(unsafe.Pointer(&in.Capacity))
+ out.Allocatable = *(*v1.ResourceList)(unsafe.Pointer(&in.Allocatable))
+ out.Phase = v1.NodePhase(in.Phase)
+ out.Conditions = *(*[]v1.NodeCondition)(unsafe.Pointer(&in.Conditions))
+ out.Addresses = *(*[]v1.NodeAddress)(unsafe.Pointer(&in.Addresses))
+ if err := Convert_core_NodeDaemonEndpoints_To_v1_NodeDaemonEndpoints(&in.DaemonEndpoints, &out.DaemonEndpoints, s); err != nil {
+ return err
+ }
+ if err := Convert_core_NodeSystemInfo_To_v1_NodeSystemInfo(&in.NodeInfo, &out.NodeInfo, s); err != nil {
+ return err
+ }
+ out.Images = *(*[]v1.ContainerImage)(unsafe.Pointer(&in.Images))
+ out.VolumesInUse = *(*[]v1.UniqueVolumeName)(unsafe.Pointer(&in.VolumesInUse))
+ out.VolumesAttached = *(*[]v1.AttachedVolume)(unsafe.Pointer(&in.VolumesAttached))
+ return nil
+}
+
+// Convert_core_NodeStatus_To_v1_NodeStatus is an autogenerated conversion function.
+func Convert_core_NodeStatus_To_v1_NodeStatus(in *core.NodeStatus, out *v1.NodeStatus, s conversion.Scope) error {
+ return autoConvert_core_NodeStatus_To_v1_NodeStatus(in, out, s)
+}
+
+func autoConvert_v1_NodeSystemInfo_To_core_NodeSystemInfo(in *v1.NodeSystemInfo, out *core.NodeSystemInfo, s conversion.Scope) error {
+ out.MachineID = in.MachineID
+ out.SystemUUID = in.SystemUUID
+ out.BootID = in.BootID
+ out.KernelVersion = in.KernelVersion
+ out.OSImage = in.OSImage
+ out.ContainerRuntimeVersion = in.ContainerRuntimeVersion
+ out.KubeletVersion = in.KubeletVersion
+ out.KubeProxyVersion = in.KubeProxyVersion
+ out.OperatingSystem = in.OperatingSystem
+ out.Architecture = in.Architecture
+ return nil
+}
+
+// Convert_v1_NodeSystemInfo_To_core_NodeSystemInfo is an autogenerated conversion function.
+func Convert_v1_NodeSystemInfo_To_core_NodeSystemInfo(in *v1.NodeSystemInfo, out *core.NodeSystemInfo, s conversion.Scope) error {
+ return autoConvert_v1_NodeSystemInfo_To_core_NodeSystemInfo(in, out, s)
+}
+
+func autoConvert_core_NodeSystemInfo_To_v1_NodeSystemInfo(in *core.NodeSystemInfo, out *v1.NodeSystemInfo, s conversion.Scope) error {
+ out.MachineID = in.MachineID
+ out.SystemUUID = in.SystemUUID
+ out.BootID = in.BootID
+ out.KernelVersion = in.KernelVersion
+ out.OSImage = in.OSImage
+ out.ContainerRuntimeVersion = in.ContainerRuntimeVersion
+ out.KubeletVersion = in.KubeletVersion
+ out.KubeProxyVersion = in.KubeProxyVersion
+ out.OperatingSystem = in.OperatingSystem
+ out.Architecture = in.Architecture
+ return nil
+}
+
+// Convert_core_NodeSystemInfo_To_v1_NodeSystemInfo is an autogenerated conversion function.
+func Convert_core_NodeSystemInfo_To_v1_NodeSystemInfo(in *core.NodeSystemInfo, out *v1.NodeSystemInfo, s conversion.Scope) error {
+ return autoConvert_core_NodeSystemInfo_To_v1_NodeSystemInfo(in, out, s)
+}
+
+func autoConvert_v1_ObjectFieldSelector_To_core_ObjectFieldSelector(in *v1.ObjectFieldSelector, out *core.ObjectFieldSelector, s conversion.Scope) error {
+ out.APIVersion = in.APIVersion
+ out.FieldPath = in.FieldPath
+ return nil
+}
+
+// Convert_v1_ObjectFieldSelector_To_core_ObjectFieldSelector is an autogenerated conversion function.
+func Convert_v1_ObjectFieldSelector_To_core_ObjectFieldSelector(in *v1.ObjectFieldSelector, out *core.ObjectFieldSelector, s conversion.Scope) error {
+ return autoConvert_v1_ObjectFieldSelector_To_core_ObjectFieldSelector(in, out, s)
+}
+
+func autoConvert_core_ObjectFieldSelector_To_v1_ObjectFieldSelector(in *core.ObjectFieldSelector, out *v1.ObjectFieldSelector, s conversion.Scope) error {
+ out.APIVersion = in.APIVersion
+ out.FieldPath = in.FieldPath
+ return nil
+}
+
+// Convert_core_ObjectFieldSelector_To_v1_ObjectFieldSelector is an autogenerated conversion function.
+func Convert_core_ObjectFieldSelector_To_v1_ObjectFieldSelector(in *core.ObjectFieldSelector, out *v1.ObjectFieldSelector, s conversion.Scope) error {
+ return autoConvert_core_ObjectFieldSelector_To_v1_ObjectFieldSelector(in, out, s)
+}
+
+func autoConvert_v1_ObjectMeta_To_core_ObjectMeta(in *v1.ObjectMeta, out *core.ObjectMeta, s conversion.Scope) error {
+ out.Name = in.Name
+ out.GenerateName = in.GenerateName
+ out.Namespace = in.Namespace
+ out.SelfLink = in.SelfLink
+ out.UID = types.UID(in.UID)
+ out.ResourceVersion = in.ResourceVersion
+ out.Generation = in.Generation
+ out.CreationTimestamp = in.CreationTimestamp
+ out.DeletionTimestamp = (*meta_v1.Time)(unsafe.Pointer(in.DeletionTimestamp))
+ out.DeletionGracePeriodSeconds = (*int64)(unsafe.Pointer(in.DeletionGracePeriodSeconds))
+ out.Labels = *(*map[string]string)(unsafe.Pointer(&in.Labels))
+ out.Annotations = *(*map[string]string)(unsafe.Pointer(&in.Annotations))
+ out.OwnerReferences = *(*[]meta_v1.OwnerReference)(unsafe.Pointer(&in.OwnerReferences))
+ out.Initializers = (*meta_v1.Initializers)(unsafe.Pointer(in.Initializers))
+ out.Finalizers = *(*[]string)(unsafe.Pointer(&in.Finalizers))
+ out.ClusterName = in.ClusterName
+ return nil
+}
+
+// Convert_v1_ObjectMeta_To_core_ObjectMeta is an autogenerated conversion function.
+func Convert_v1_ObjectMeta_To_core_ObjectMeta(in *v1.ObjectMeta, out *core.ObjectMeta, s conversion.Scope) error {
+ return autoConvert_v1_ObjectMeta_To_core_ObjectMeta(in, out, s)
+}
+
+func autoConvert_core_ObjectMeta_To_v1_ObjectMeta(in *core.ObjectMeta, out *v1.ObjectMeta, s conversion.Scope) error {
+ out.Name = in.Name
+ out.GenerateName = in.GenerateName
+ out.Namespace = in.Namespace
+ out.SelfLink = in.SelfLink
+ out.UID = types.UID(in.UID)
+ out.ResourceVersion = in.ResourceVersion
+ out.Generation = in.Generation
+ out.CreationTimestamp = in.CreationTimestamp
+ out.DeletionTimestamp = (*meta_v1.Time)(unsafe.Pointer(in.DeletionTimestamp))
+ out.DeletionGracePeriodSeconds = (*int64)(unsafe.Pointer(in.DeletionGracePeriodSeconds))
+ out.Labels = *(*map[string]string)(unsafe.Pointer(&in.Labels))
+ out.Annotations = *(*map[string]string)(unsafe.Pointer(&in.Annotations))
+ out.OwnerReferences = *(*[]meta_v1.OwnerReference)(unsafe.Pointer(&in.OwnerReferences))
+ out.Initializers = (*meta_v1.Initializers)(unsafe.Pointer(in.Initializers))
+ out.Finalizers = *(*[]string)(unsafe.Pointer(&in.Finalizers))
+ out.ClusterName = in.ClusterName
+ return nil
+}
+
+// Convert_core_ObjectMeta_To_v1_ObjectMeta is an autogenerated conversion function.
+func Convert_core_ObjectMeta_To_v1_ObjectMeta(in *core.ObjectMeta, out *v1.ObjectMeta, s conversion.Scope) error {
+ return autoConvert_core_ObjectMeta_To_v1_ObjectMeta(in, out, s)
+}
+
+func autoConvert_v1_ObjectReference_To_core_ObjectReference(in *v1.ObjectReference, out *core.ObjectReference, s conversion.Scope) error {
+ out.Kind = in.Kind
+ out.Namespace = in.Namespace
+ out.Name = in.Name
+ out.UID = types.UID(in.UID)
+ out.APIVersion = in.APIVersion
+ out.ResourceVersion = in.ResourceVersion
+ out.FieldPath = in.FieldPath
+ return nil
+}
+
+// Convert_v1_ObjectReference_To_core_ObjectReference is an autogenerated conversion function.
+func Convert_v1_ObjectReference_To_core_ObjectReference(in *v1.ObjectReference, out *core.ObjectReference, s conversion.Scope) error {
+ return autoConvert_v1_ObjectReference_To_core_ObjectReference(in, out, s)
+}
+
+func autoConvert_core_ObjectReference_To_v1_ObjectReference(in *core.ObjectReference, out *v1.ObjectReference, s conversion.Scope) error {
+ out.Kind = in.Kind
+ out.Namespace = in.Namespace
+ out.Name = in.Name
+ out.UID = types.UID(in.UID)
+ out.APIVersion = in.APIVersion
+ out.ResourceVersion = in.ResourceVersion
+ out.FieldPath = in.FieldPath
+ return nil
+}
+
+// Convert_core_ObjectReference_To_v1_ObjectReference is an autogenerated conversion function.
+func Convert_core_ObjectReference_To_v1_ObjectReference(in *core.ObjectReference, out *v1.ObjectReference, s conversion.Scope) error {
+ return autoConvert_core_ObjectReference_To_v1_ObjectReference(in, out, s)
+}
+
+func autoConvert_v1_PersistentVolume_To_core_PersistentVolume(in *v1.PersistentVolume, out *core.PersistentVolume, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_v1_PersistentVolumeStatus_To_core_PersistentVolumeStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_PersistentVolume_To_core_PersistentVolume is an autogenerated conversion function.
+func Convert_v1_PersistentVolume_To_core_PersistentVolume(in *v1.PersistentVolume, out *core.PersistentVolume, s conversion.Scope) error {
+ return autoConvert_v1_PersistentVolume_To_core_PersistentVolume(in, out, s)
+}
+
+func autoConvert_core_PersistentVolume_To_v1_PersistentVolume(in *core.PersistentVolume, out *v1.PersistentVolume, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_core_PersistentVolumeStatus_To_v1_PersistentVolumeStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_PersistentVolume_To_v1_PersistentVolume is an autogenerated conversion function.
+func Convert_core_PersistentVolume_To_v1_PersistentVolume(in *core.PersistentVolume, out *v1.PersistentVolume, s conversion.Scope) error {
+ return autoConvert_core_PersistentVolume_To_v1_PersistentVolume(in, out, s)
+}
+
+func autoConvert_v1_PersistentVolumeClaim_To_core_PersistentVolumeClaim(in *v1.PersistentVolumeClaim, out *core.PersistentVolumeClaim, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_PersistentVolumeClaimSpec_To_core_PersistentVolumeClaimSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_v1_PersistentVolumeClaimStatus_To_core_PersistentVolumeClaimStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_PersistentVolumeClaim_To_core_PersistentVolumeClaim is an autogenerated conversion function.
+func Convert_v1_PersistentVolumeClaim_To_core_PersistentVolumeClaim(in *v1.PersistentVolumeClaim, out *core.PersistentVolumeClaim, s conversion.Scope) error {
+ return autoConvert_v1_PersistentVolumeClaim_To_core_PersistentVolumeClaim(in, out, s)
+}
+
+func autoConvert_core_PersistentVolumeClaim_To_v1_PersistentVolumeClaim(in *core.PersistentVolumeClaim, out *v1.PersistentVolumeClaim, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_PersistentVolumeClaimSpec_To_v1_PersistentVolumeClaimSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_core_PersistentVolumeClaimStatus_To_v1_PersistentVolumeClaimStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_PersistentVolumeClaim_To_v1_PersistentVolumeClaim is an autogenerated conversion function.
+func Convert_core_PersistentVolumeClaim_To_v1_PersistentVolumeClaim(in *core.PersistentVolumeClaim, out *v1.PersistentVolumeClaim, s conversion.Scope) error {
+ return autoConvert_core_PersistentVolumeClaim_To_v1_PersistentVolumeClaim(in, out, s)
+}
+
+func autoConvert_v1_PersistentVolumeClaimCondition_To_core_PersistentVolumeClaimCondition(in *v1.PersistentVolumeClaimCondition, out *core.PersistentVolumeClaimCondition, s conversion.Scope) error {
+ out.Type = core.PersistentVolumeClaimConditionType(in.Type)
+ out.Status = core.ConditionStatus(in.Status)
+ out.LastProbeTime = in.LastProbeTime
+ out.LastTransitionTime = in.LastTransitionTime
+ out.Reason = in.Reason
+ out.Message = in.Message
+ return nil
+}
+
+// Convert_v1_PersistentVolumeClaimCondition_To_core_PersistentVolumeClaimCondition is an autogenerated conversion function.
+func Convert_v1_PersistentVolumeClaimCondition_To_core_PersistentVolumeClaimCondition(in *v1.PersistentVolumeClaimCondition, out *core.PersistentVolumeClaimCondition, s conversion.Scope) error {
+ return autoConvert_v1_PersistentVolumeClaimCondition_To_core_PersistentVolumeClaimCondition(in, out, s)
+}
+
+func autoConvert_core_PersistentVolumeClaimCondition_To_v1_PersistentVolumeClaimCondition(in *core.PersistentVolumeClaimCondition, out *v1.PersistentVolumeClaimCondition, s conversion.Scope) error {
+ out.Type = v1.PersistentVolumeClaimConditionType(in.Type)
+ out.Status = v1.ConditionStatus(in.Status)
+ out.LastProbeTime = in.LastProbeTime
+ out.LastTransitionTime = in.LastTransitionTime
+ out.Reason = in.Reason
+ out.Message = in.Message
+ return nil
+}
+
+// Convert_core_PersistentVolumeClaimCondition_To_v1_PersistentVolumeClaimCondition is an autogenerated conversion function.
+func Convert_core_PersistentVolumeClaimCondition_To_v1_PersistentVolumeClaimCondition(in *core.PersistentVolumeClaimCondition, out *v1.PersistentVolumeClaimCondition, s conversion.Scope) error {
+ return autoConvert_core_PersistentVolumeClaimCondition_To_v1_PersistentVolumeClaimCondition(in, out, s)
+}
+
+func autoConvert_v1_PersistentVolumeClaimList_To_core_PersistentVolumeClaimList(in *v1.PersistentVolumeClaimList, out *core.PersistentVolumeClaimList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]core.PersistentVolumeClaim)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_v1_PersistentVolumeClaimList_To_core_PersistentVolumeClaimList is an autogenerated conversion function.
+func Convert_v1_PersistentVolumeClaimList_To_core_PersistentVolumeClaimList(in *v1.PersistentVolumeClaimList, out *core.PersistentVolumeClaimList, s conversion.Scope) error {
+ return autoConvert_v1_PersistentVolumeClaimList_To_core_PersistentVolumeClaimList(in, out, s)
+}
+
+func autoConvert_core_PersistentVolumeClaimList_To_v1_PersistentVolumeClaimList(in *core.PersistentVolumeClaimList, out *v1.PersistentVolumeClaimList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]v1.PersistentVolumeClaim)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_core_PersistentVolumeClaimList_To_v1_PersistentVolumeClaimList is an autogenerated conversion function.
+func Convert_core_PersistentVolumeClaimList_To_v1_PersistentVolumeClaimList(in *core.PersistentVolumeClaimList, out *v1.PersistentVolumeClaimList, s conversion.Scope) error {
+ return autoConvert_core_PersistentVolumeClaimList_To_v1_PersistentVolumeClaimList(in, out, s)
+}
+
+func autoConvert_v1_PersistentVolumeClaimSpec_To_core_PersistentVolumeClaimSpec(in *v1.PersistentVolumeClaimSpec, out *core.PersistentVolumeClaimSpec, s conversion.Scope) error {
+ out.AccessModes = *(*[]core.PersistentVolumeAccessMode)(unsafe.Pointer(&in.AccessModes))
+ out.Selector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.Selector))
+ if err := Convert_v1_ResourceRequirements_To_core_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil {
+ return err
+ }
+ out.VolumeName = in.VolumeName
+ out.StorageClassName = (*string)(unsafe.Pointer(in.StorageClassName))
+ out.VolumeMode = (*core.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode))
+ return nil
+}
+
+// Convert_v1_PersistentVolumeClaimSpec_To_core_PersistentVolumeClaimSpec is an autogenerated conversion function.
+func Convert_v1_PersistentVolumeClaimSpec_To_core_PersistentVolumeClaimSpec(in *v1.PersistentVolumeClaimSpec, out *core.PersistentVolumeClaimSpec, s conversion.Scope) error {
+ return autoConvert_v1_PersistentVolumeClaimSpec_To_core_PersistentVolumeClaimSpec(in, out, s)
+}
+
+func autoConvert_core_PersistentVolumeClaimSpec_To_v1_PersistentVolumeClaimSpec(in *core.PersistentVolumeClaimSpec, out *v1.PersistentVolumeClaimSpec, s conversion.Scope) error {
+ out.AccessModes = *(*[]v1.PersistentVolumeAccessMode)(unsafe.Pointer(&in.AccessModes))
+ out.Selector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.Selector))
+ if err := Convert_core_ResourceRequirements_To_v1_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil {
+ return err
+ }
+ out.VolumeName = in.VolumeName
+ out.StorageClassName = (*string)(unsafe.Pointer(in.StorageClassName))
+ out.VolumeMode = (*v1.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode))
+ return nil
+}
+
+// Convert_core_PersistentVolumeClaimSpec_To_v1_PersistentVolumeClaimSpec is an autogenerated conversion function.
+func Convert_core_PersistentVolumeClaimSpec_To_v1_PersistentVolumeClaimSpec(in *core.PersistentVolumeClaimSpec, out *v1.PersistentVolumeClaimSpec, s conversion.Scope) error {
+ return autoConvert_core_PersistentVolumeClaimSpec_To_v1_PersistentVolumeClaimSpec(in, out, s)
+}
+
+func autoConvert_v1_PersistentVolumeClaimStatus_To_core_PersistentVolumeClaimStatus(in *v1.PersistentVolumeClaimStatus, out *core.PersistentVolumeClaimStatus, s conversion.Scope) error {
+ out.Phase = core.PersistentVolumeClaimPhase(in.Phase)
+ out.AccessModes = *(*[]core.PersistentVolumeAccessMode)(unsafe.Pointer(&in.AccessModes))
+ out.Capacity = *(*core.ResourceList)(unsafe.Pointer(&in.Capacity))
+ out.Conditions = *(*[]core.PersistentVolumeClaimCondition)(unsafe.Pointer(&in.Conditions))
+ return nil
+}
+
+// Convert_v1_PersistentVolumeClaimStatus_To_core_PersistentVolumeClaimStatus is an autogenerated conversion function.
+func Convert_v1_PersistentVolumeClaimStatus_To_core_PersistentVolumeClaimStatus(in *v1.PersistentVolumeClaimStatus, out *core.PersistentVolumeClaimStatus, s conversion.Scope) error {
+ return autoConvert_v1_PersistentVolumeClaimStatus_To_core_PersistentVolumeClaimStatus(in, out, s)
+}
+
+func autoConvert_core_PersistentVolumeClaimStatus_To_v1_PersistentVolumeClaimStatus(in *core.PersistentVolumeClaimStatus, out *v1.PersistentVolumeClaimStatus, s conversion.Scope) error {
+ out.Phase = v1.PersistentVolumeClaimPhase(in.Phase)
+ out.AccessModes = *(*[]v1.PersistentVolumeAccessMode)(unsafe.Pointer(&in.AccessModes))
+ out.Capacity = *(*v1.ResourceList)(unsafe.Pointer(&in.Capacity))
+ out.Conditions = *(*[]v1.PersistentVolumeClaimCondition)(unsafe.Pointer(&in.Conditions))
+ return nil
+}
+
+// Convert_core_PersistentVolumeClaimStatus_To_v1_PersistentVolumeClaimStatus is an autogenerated conversion function.
+func Convert_core_PersistentVolumeClaimStatus_To_v1_PersistentVolumeClaimStatus(in *core.PersistentVolumeClaimStatus, out *v1.PersistentVolumeClaimStatus, s conversion.Scope) error {
+ return autoConvert_core_PersistentVolumeClaimStatus_To_v1_PersistentVolumeClaimStatus(in, out, s)
+}
+
+func autoConvert_v1_PersistentVolumeClaimVolumeSource_To_core_PersistentVolumeClaimVolumeSource(in *v1.PersistentVolumeClaimVolumeSource, out *core.PersistentVolumeClaimVolumeSource, s conversion.Scope) error {
+ out.ClaimName = in.ClaimName
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_PersistentVolumeClaimVolumeSource_To_core_PersistentVolumeClaimVolumeSource is an autogenerated conversion function.
+func Convert_v1_PersistentVolumeClaimVolumeSource_To_core_PersistentVolumeClaimVolumeSource(in *v1.PersistentVolumeClaimVolumeSource, out *core.PersistentVolumeClaimVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_PersistentVolumeClaimVolumeSource_To_core_PersistentVolumeClaimVolumeSource(in, out, s)
+}
+
+func autoConvert_core_PersistentVolumeClaimVolumeSource_To_v1_PersistentVolumeClaimVolumeSource(in *core.PersistentVolumeClaimVolumeSource, out *v1.PersistentVolumeClaimVolumeSource, s conversion.Scope) error {
+ out.ClaimName = in.ClaimName
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_PersistentVolumeClaimVolumeSource_To_v1_PersistentVolumeClaimVolumeSource is an autogenerated conversion function.
+func Convert_core_PersistentVolumeClaimVolumeSource_To_v1_PersistentVolumeClaimVolumeSource(in *core.PersistentVolumeClaimVolumeSource, out *v1.PersistentVolumeClaimVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_PersistentVolumeClaimVolumeSource_To_v1_PersistentVolumeClaimVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_PersistentVolumeList_To_core_PersistentVolumeList(in *v1.PersistentVolumeList, out *core.PersistentVolumeList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]core.PersistentVolume, len(*in))
+ for i := range *in {
+ if err := Convert_v1_PersistentVolume_To_core_PersistentVolume(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_v1_PersistentVolumeList_To_core_PersistentVolumeList is an autogenerated conversion function.
+func Convert_v1_PersistentVolumeList_To_core_PersistentVolumeList(in *v1.PersistentVolumeList, out *core.PersistentVolumeList, s conversion.Scope) error {
+ return autoConvert_v1_PersistentVolumeList_To_core_PersistentVolumeList(in, out, s)
+}
+
+func autoConvert_core_PersistentVolumeList_To_v1_PersistentVolumeList(in *core.PersistentVolumeList, out *v1.PersistentVolumeList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]v1.PersistentVolume, len(*in))
+ for i := range *in {
+ if err := Convert_core_PersistentVolume_To_v1_PersistentVolume(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_core_PersistentVolumeList_To_v1_PersistentVolumeList is an autogenerated conversion function.
+func Convert_core_PersistentVolumeList_To_v1_PersistentVolumeList(in *core.PersistentVolumeList, out *v1.PersistentVolumeList, s conversion.Scope) error {
+ return autoConvert_core_PersistentVolumeList_To_v1_PersistentVolumeList(in, out, s)
+}
+
+func autoConvert_v1_PersistentVolumeSource_To_core_PersistentVolumeSource(in *v1.PersistentVolumeSource, out *core.PersistentVolumeSource, s conversion.Scope) error {
+ out.GCEPersistentDisk = (*core.GCEPersistentDiskVolumeSource)(unsafe.Pointer(in.GCEPersistentDisk))
+ out.AWSElasticBlockStore = (*core.AWSElasticBlockStoreVolumeSource)(unsafe.Pointer(in.AWSElasticBlockStore))
+ out.HostPath = (*core.HostPathVolumeSource)(unsafe.Pointer(in.HostPath))
+ out.Glusterfs = (*core.GlusterfsVolumeSource)(unsafe.Pointer(in.Glusterfs))
+ out.NFS = (*core.NFSVolumeSource)(unsafe.Pointer(in.NFS))
+ out.RBD = (*core.RBDPersistentVolumeSource)(unsafe.Pointer(in.RBD))
+ out.ISCSI = (*core.ISCSIPersistentVolumeSource)(unsafe.Pointer(in.ISCSI))
+ out.Cinder = (*core.CinderVolumeSource)(unsafe.Pointer(in.Cinder))
+ out.CephFS = (*core.CephFSPersistentVolumeSource)(unsafe.Pointer(in.CephFS))
+ out.FC = (*core.FCVolumeSource)(unsafe.Pointer(in.FC))
+ out.Flocker = (*core.FlockerVolumeSource)(unsafe.Pointer(in.Flocker))
+ out.FlexVolume = (*core.FlexPersistentVolumeSource)(unsafe.Pointer(in.FlexVolume))
+ out.AzureFile = (*core.AzureFilePersistentVolumeSource)(unsafe.Pointer(in.AzureFile))
+ out.VsphereVolume = (*core.VsphereVirtualDiskVolumeSource)(unsafe.Pointer(in.VsphereVolume))
+ out.Quobyte = (*core.QuobyteVolumeSource)(unsafe.Pointer(in.Quobyte))
+ out.AzureDisk = (*core.AzureDiskVolumeSource)(unsafe.Pointer(in.AzureDisk))
+ out.PhotonPersistentDisk = (*core.PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk))
+ out.PortworxVolume = (*core.PortworxVolumeSource)(unsafe.Pointer(in.PortworxVolume))
+ out.ScaleIO = (*core.ScaleIOPersistentVolumeSource)(unsafe.Pointer(in.ScaleIO))
+ out.Local = (*core.LocalVolumeSource)(unsafe.Pointer(in.Local))
+ out.StorageOS = (*core.StorageOSPersistentVolumeSource)(unsafe.Pointer(in.StorageOS))
+ out.CSI = (*core.CSIPersistentVolumeSource)(unsafe.Pointer(in.CSI))
+ return nil
+}
+
+// Convert_v1_PersistentVolumeSource_To_core_PersistentVolumeSource is an autogenerated conversion function.
+func Convert_v1_PersistentVolumeSource_To_core_PersistentVolumeSource(in *v1.PersistentVolumeSource, out *core.PersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_PersistentVolumeSource_To_core_PersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_core_PersistentVolumeSource_To_v1_PersistentVolumeSource(in *core.PersistentVolumeSource, out *v1.PersistentVolumeSource, s conversion.Scope) error {
+ out.GCEPersistentDisk = (*v1.GCEPersistentDiskVolumeSource)(unsafe.Pointer(in.GCEPersistentDisk))
+ out.AWSElasticBlockStore = (*v1.AWSElasticBlockStoreVolumeSource)(unsafe.Pointer(in.AWSElasticBlockStore))
+ out.HostPath = (*v1.HostPathVolumeSource)(unsafe.Pointer(in.HostPath))
+ out.Glusterfs = (*v1.GlusterfsVolumeSource)(unsafe.Pointer(in.Glusterfs))
+ out.NFS = (*v1.NFSVolumeSource)(unsafe.Pointer(in.NFS))
+ out.RBD = (*v1.RBDPersistentVolumeSource)(unsafe.Pointer(in.RBD))
+ out.Quobyte = (*v1.QuobyteVolumeSource)(unsafe.Pointer(in.Quobyte))
+ out.ISCSI = (*v1.ISCSIPersistentVolumeSource)(unsafe.Pointer(in.ISCSI))
+ out.FlexVolume = (*v1.FlexPersistentVolumeSource)(unsafe.Pointer(in.FlexVolume))
+ out.Cinder = (*v1.CinderVolumeSource)(unsafe.Pointer(in.Cinder))
+ out.CephFS = (*v1.CephFSPersistentVolumeSource)(unsafe.Pointer(in.CephFS))
+ out.FC = (*v1.FCVolumeSource)(unsafe.Pointer(in.FC))
+ out.Flocker = (*v1.FlockerVolumeSource)(unsafe.Pointer(in.Flocker))
+ out.AzureFile = (*v1.AzureFilePersistentVolumeSource)(unsafe.Pointer(in.AzureFile))
+ out.VsphereVolume = (*v1.VsphereVirtualDiskVolumeSource)(unsafe.Pointer(in.VsphereVolume))
+ out.AzureDisk = (*v1.AzureDiskVolumeSource)(unsafe.Pointer(in.AzureDisk))
+ out.PhotonPersistentDisk = (*v1.PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk))
+ out.PortworxVolume = (*v1.PortworxVolumeSource)(unsafe.Pointer(in.PortworxVolume))
+ out.ScaleIO = (*v1.ScaleIOPersistentVolumeSource)(unsafe.Pointer(in.ScaleIO))
+ out.Local = (*v1.LocalVolumeSource)(unsafe.Pointer(in.Local))
+ out.StorageOS = (*v1.StorageOSPersistentVolumeSource)(unsafe.Pointer(in.StorageOS))
+ out.CSI = (*v1.CSIPersistentVolumeSource)(unsafe.Pointer(in.CSI))
+ return nil
+}
+
+// Convert_core_PersistentVolumeSource_To_v1_PersistentVolumeSource is an autogenerated conversion function.
+func Convert_core_PersistentVolumeSource_To_v1_PersistentVolumeSource(in *core.PersistentVolumeSource, out *v1.PersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_PersistentVolumeSource_To_v1_PersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(in *v1.PersistentVolumeSpec, out *core.PersistentVolumeSpec, s conversion.Scope) error {
+ out.Capacity = *(*core.ResourceList)(unsafe.Pointer(&in.Capacity))
+ if err := Convert_v1_PersistentVolumeSource_To_core_PersistentVolumeSource(&in.PersistentVolumeSource, &out.PersistentVolumeSource, s); err != nil {
+ return err
+ }
+ out.AccessModes = *(*[]core.PersistentVolumeAccessMode)(unsafe.Pointer(&in.AccessModes))
+ out.ClaimRef = (*core.ObjectReference)(unsafe.Pointer(in.ClaimRef))
+ out.PersistentVolumeReclaimPolicy = core.PersistentVolumeReclaimPolicy(in.PersistentVolumeReclaimPolicy)
+ out.StorageClassName = in.StorageClassName
+ out.MountOptions = *(*[]string)(unsafe.Pointer(&in.MountOptions))
+ out.VolumeMode = (*core.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode))
+ out.NodeAffinity = (*core.VolumeNodeAffinity)(unsafe.Pointer(in.NodeAffinity))
+ return nil
+}
+
+// Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec is an autogenerated conversion function.
+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)
+}
+
+func autoConvert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(in *core.PersistentVolumeSpec, out *v1.PersistentVolumeSpec, s conversion.Scope) error {
+ out.Capacity = *(*v1.ResourceList)(unsafe.Pointer(&in.Capacity))
+ if err := Convert_core_PersistentVolumeSource_To_v1_PersistentVolumeSource(&in.PersistentVolumeSource, &out.PersistentVolumeSource, s); err != nil {
+ return err
+ }
+ out.AccessModes = *(*[]v1.PersistentVolumeAccessMode)(unsafe.Pointer(&in.AccessModes))
+ out.ClaimRef = (*v1.ObjectReference)(unsafe.Pointer(in.ClaimRef))
+ out.PersistentVolumeReclaimPolicy = v1.PersistentVolumeReclaimPolicy(in.PersistentVolumeReclaimPolicy)
+ out.StorageClassName = in.StorageClassName
+ out.MountOptions = *(*[]string)(unsafe.Pointer(&in.MountOptions))
+ out.VolumeMode = (*v1.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode))
+ out.NodeAffinity = (*v1.VolumeNodeAffinity)(unsafe.Pointer(in.NodeAffinity))
+ return nil
+}
+
+// Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec is an autogenerated conversion function.
+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)
+}
+
+func autoConvert_v1_PersistentVolumeStatus_To_core_PersistentVolumeStatus(in *v1.PersistentVolumeStatus, out *core.PersistentVolumeStatus, s conversion.Scope) error {
+ out.Phase = core.PersistentVolumePhase(in.Phase)
+ out.Message = in.Message
+ out.Reason = in.Reason
+ return nil
+}
+
+// Convert_v1_PersistentVolumeStatus_To_core_PersistentVolumeStatus is an autogenerated conversion function.
+func Convert_v1_PersistentVolumeStatus_To_core_PersistentVolumeStatus(in *v1.PersistentVolumeStatus, out *core.PersistentVolumeStatus, s conversion.Scope) error {
+ return autoConvert_v1_PersistentVolumeStatus_To_core_PersistentVolumeStatus(in, out, s)
+}
+
+func autoConvert_core_PersistentVolumeStatus_To_v1_PersistentVolumeStatus(in *core.PersistentVolumeStatus, out *v1.PersistentVolumeStatus, s conversion.Scope) error {
+ out.Phase = v1.PersistentVolumePhase(in.Phase)
+ out.Message = in.Message
+ out.Reason = in.Reason
+ return nil
+}
+
+// Convert_core_PersistentVolumeStatus_To_v1_PersistentVolumeStatus is an autogenerated conversion function.
+func Convert_core_PersistentVolumeStatus_To_v1_PersistentVolumeStatus(in *core.PersistentVolumeStatus, out *v1.PersistentVolumeStatus, s conversion.Scope) error {
+ return autoConvert_core_PersistentVolumeStatus_To_v1_PersistentVolumeStatus(in, out, s)
+}
+
+func autoConvert_v1_PhotonPersistentDiskVolumeSource_To_core_PhotonPersistentDiskVolumeSource(in *v1.PhotonPersistentDiskVolumeSource, out *core.PhotonPersistentDiskVolumeSource, s conversion.Scope) error {
+ out.PdID = in.PdID
+ out.FSType = in.FSType
+ return nil
+}
+
+// Convert_v1_PhotonPersistentDiskVolumeSource_To_core_PhotonPersistentDiskVolumeSource is an autogenerated conversion function.
+func Convert_v1_PhotonPersistentDiskVolumeSource_To_core_PhotonPersistentDiskVolumeSource(in *v1.PhotonPersistentDiskVolumeSource, out *core.PhotonPersistentDiskVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_PhotonPersistentDiskVolumeSource_To_core_PhotonPersistentDiskVolumeSource(in, out, s)
+}
+
+func autoConvert_core_PhotonPersistentDiskVolumeSource_To_v1_PhotonPersistentDiskVolumeSource(in *core.PhotonPersistentDiskVolumeSource, out *v1.PhotonPersistentDiskVolumeSource, s conversion.Scope) error {
+ out.PdID = in.PdID
+ out.FSType = in.FSType
+ return nil
+}
+
+// Convert_core_PhotonPersistentDiskVolumeSource_To_v1_PhotonPersistentDiskVolumeSource is an autogenerated conversion function.
+func Convert_core_PhotonPersistentDiskVolumeSource_To_v1_PhotonPersistentDiskVolumeSource(in *core.PhotonPersistentDiskVolumeSource, out *v1.PhotonPersistentDiskVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_PhotonPersistentDiskVolumeSource_To_v1_PhotonPersistentDiskVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_Pod_To_core_Pod(in *v1.Pod, out *core.Pod, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_PodSpec_To_core_PodSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_v1_PodStatus_To_core_PodStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+func autoConvert_core_Pod_To_v1_Pod(in *core.Pod, out *v1.Pod, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_PodSpec_To_v1_PodSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_core_PodStatus_To_v1_PodStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+func autoConvert_v1_PodAffinity_To_core_PodAffinity(in *v1.PodAffinity, out *core.PodAffinity, s conversion.Scope) error {
+ out.RequiredDuringSchedulingIgnoredDuringExecution = *(*[]core.PodAffinityTerm)(unsafe.Pointer(&in.RequiredDuringSchedulingIgnoredDuringExecution))
+ out.PreferredDuringSchedulingIgnoredDuringExecution = *(*[]core.WeightedPodAffinityTerm)(unsafe.Pointer(&in.PreferredDuringSchedulingIgnoredDuringExecution))
+ return nil
+}
+
+// Convert_v1_PodAffinity_To_core_PodAffinity is an autogenerated conversion function.
+func Convert_v1_PodAffinity_To_core_PodAffinity(in *v1.PodAffinity, out *core.PodAffinity, s conversion.Scope) error {
+ return autoConvert_v1_PodAffinity_To_core_PodAffinity(in, out, s)
+}
+
+func autoConvert_core_PodAffinity_To_v1_PodAffinity(in *core.PodAffinity, out *v1.PodAffinity, s conversion.Scope) error {
+ out.RequiredDuringSchedulingIgnoredDuringExecution = *(*[]v1.PodAffinityTerm)(unsafe.Pointer(&in.RequiredDuringSchedulingIgnoredDuringExecution))
+ out.PreferredDuringSchedulingIgnoredDuringExecution = *(*[]v1.WeightedPodAffinityTerm)(unsafe.Pointer(&in.PreferredDuringSchedulingIgnoredDuringExecution))
+ return nil
+}
+
+// Convert_core_PodAffinity_To_v1_PodAffinity is an autogenerated conversion function.
+func Convert_core_PodAffinity_To_v1_PodAffinity(in *core.PodAffinity, out *v1.PodAffinity, s conversion.Scope) error {
+ return autoConvert_core_PodAffinity_To_v1_PodAffinity(in, out, s)
+}
+
+func autoConvert_v1_PodAffinityTerm_To_core_PodAffinityTerm(in *v1.PodAffinityTerm, out *core.PodAffinityTerm, s conversion.Scope) error {
+ out.LabelSelector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.LabelSelector))
+ out.Namespaces = *(*[]string)(unsafe.Pointer(&in.Namespaces))
+ out.TopologyKey = in.TopologyKey
+ return nil
+}
+
+// Convert_v1_PodAffinityTerm_To_core_PodAffinityTerm is an autogenerated conversion function.
+func Convert_v1_PodAffinityTerm_To_core_PodAffinityTerm(in *v1.PodAffinityTerm, out *core.PodAffinityTerm, s conversion.Scope) error {
+ return autoConvert_v1_PodAffinityTerm_To_core_PodAffinityTerm(in, out, s)
+}
+
+func autoConvert_core_PodAffinityTerm_To_v1_PodAffinityTerm(in *core.PodAffinityTerm, out *v1.PodAffinityTerm, s conversion.Scope) error {
+ out.LabelSelector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.LabelSelector))
+ out.Namespaces = *(*[]string)(unsafe.Pointer(&in.Namespaces))
+ out.TopologyKey = in.TopologyKey
+ return nil
+}
+
+// Convert_core_PodAffinityTerm_To_v1_PodAffinityTerm is an autogenerated conversion function.
+func Convert_core_PodAffinityTerm_To_v1_PodAffinityTerm(in *core.PodAffinityTerm, out *v1.PodAffinityTerm, s conversion.Scope) error {
+ return autoConvert_core_PodAffinityTerm_To_v1_PodAffinityTerm(in, out, s)
+}
+
+func autoConvert_v1_PodAntiAffinity_To_core_PodAntiAffinity(in *v1.PodAntiAffinity, out *core.PodAntiAffinity, s conversion.Scope) error {
+ out.RequiredDuringSchedulingIgnoredDuringExecution = *(*[]core.PodAffinityTerm)(unsafe.Pointer(&in.RequiredDuringSchedulingIgnoredDuringExecution))
+ out.PreferredDuringSchedulingIgnoredDuringExecution = *(*[]core.WeightedPodAffinityTerm)(unsafe.Pointer(&in.PreferredDuringSchedulingIgnoredDuringExecution))
+ return nil
+}
+
+// Convert_v1_PodAntiAffinity_To_core_PodAntiAffinity is an autogenerated conversion function.
+func Convert_v1_PodAntiAffinity_To_core_PodAntiAffinity(in *v1.PodAntiAffinity, out *core.PodAntiAffinity, s conversion.Scope) error {
+ return autoConvert_v1_PodAntiAffinity_To_core_PodAntiAffinity(in, out, s)
+}
+
+func autoConvert_core_PodAntiAffinity_To_v1_PodAntiAffinity(in *core.PodAntiAffinity, out *v1.PodAntiAffinity, s conversion.Scope) error {
+ out.RequiredDuringSchedulingIgnoredDuringExecution = *(*[]v1.PodAffinityTerm)(unsafe.Pointer(&in.RequiredDuringSchedulingIgnoredDuringExecution))
+ out.PreferredDuringSchedulingIgnoredDuringExecution = *(*[]v1.WeightedPodAffinityTerm)(unsafe.Pointer(&in.PreferredDuringSchedulingIgnoredDuringExecution))
+ return nil
+}
+
+// Convert_core_PodAntiAffinity_To_v1_PodAntiAffinity is an autogenerated conversion function.
+func Convert_core_PodAntiAffinity_To_v1_PodAntiAffinity(in *core.PodAntiAffinity, out *v1.PodAntiAffinity, s conversion.Scope) error {
+ return autoConvert_core_PodAntiAffinity_To_v1_PodAntiAffinity(in, out, s)
+}
+
+func autoConvert_v1_PodAttachOptions_To_core_PodAttachOptions(in *v1.PodAttachOptions, out *core.PodAttachOptions, s conversion.Scope) error {
+ out.Stdin = in.Stdin
+ out.Stdout = in.Stdout
+ out.Stderr = in.Stderr
+ out.TTY = in.TTY
+ out.Container = in.Container
+ return nil
+}
+
+// Convert_v1_PodAttachOptions_To_core_PodAttachOptions is an autogenerated conversion function.
+func Convert_v1_PodAttachOptions_To_core_PodAttachOptions(in *v1.PodAttachOptions, out *core.PodAttachOptions, s conversion.Scope) error {
+ return autoConvert_v1_PodAttachOptions_To_core_PodAttachOptions(in, out, s)
+}
+
+func autoConvert_core_PodAttachOptions_To_v1_PodAttachOptions(in *core.PodAttachOptions, out *v1.PodAttachOptions, s conversion.Scope) error {
+ out.Stdin = in.Stdin
+ out.Stdout = in.Stdout
+ out.Stderr = in.Stderr
+ out.TTY = in.TTY
+ out.Container = in.Container
+ return nil
+}
+
+// Convert_core_PodAttachOptions_To_v1_PodAttachOptions is an autogenerated conversion function.
+func Convert_core_PodAttachOptions_To_v1_PodAttachOptions(in *core.PodAttachOptions, out *v1.PodAttachOptions, s conversion.Scope) error {
+ return autoConvert_core_PodAttachOptions_To_v1_PodAttachOptions(in, out, s)
+}
+
+func autoConvert_v1_PodCondition_To_core_PodCondition(in *v1.PodCondition, out *core.PodCondition, s conversion.Scope) error {
+ out.Type = core.PodConditionType(in.Type)
+ out.Status = core.ConditionStatus(in.Status)
+ out.LastProbeTime = in.LastProbeTime
+ out.LastTransitionTime = in.LastTransitionTime
+ out.Reason = in.Reason
+ out.Message = in.Message
+ return nil
+}
+
+// Convert_v1_PodCondition_To_core_PodCondition is an autogenerated conversion function.
+func Convert_v1_PodCondition_To_core_PodCondition(in *v1.PodCondition, out *core.PodCondition, s conversion.Scope) error {
+ return autoConvert_v1_PodCondition_To_core_PodCondition(in, out, s)
+}
+
+func autoConvert_core_PodCondition_To_v1_PodCondition(in *core.PodCondition, out *v1.PodCondition, s conversion.Scope) error {
+ out.Type = v1.PodConditionType(in.Type)
+ out.Status = v1.ConditionStatus(in.Status)
+ out.LastProbeTime = in.LastProbeTime
+ out.LastTransitionTime = in.LastTransitionTime
+ out.Reason = in.Reason
+ out.Message = in.Message
+ return nil
+}
+
+// Convert_core_PodCondition_To_v1_PodCondition is an autogenerated conversion function.
+func Convert_core_PodCondition_To_v1_PodCondition(in *core.PodCondition, out *v1.PodCondition, s conversion.Scope) error {
+ return autoConvert_core_PodCondition_To_v1_PodCondition(in, out, s)
+}
+
+func autoConvert_v1_PodDNSConfig_To_core_PodDNSConfig(in *v1.PodDNSConfig, out *core.PodDNSConfig, s conversion.Scope) error {
+ out.Nameservers = *(*[]string)(unsafe.Pointer(&in.Nameservers))
+ out.Searches = *(*[]string)(unsafe.Pointer(&in.Searches))
+ out.Options = *(*[]core.PodDNSConfigOption)(unsafe.Pointer(&in.Options))
+ return nil
+}
+
+// Convert_v1_PodDNSConfig_To_core_PodDNSConfig is an autogenerated conversion function.
+func Convert_v1_PodDNSConfig_To_core_PodDNSConfig(in *v1.PodDNSConfig, out *core.PodDNSConfig, s conversion.Scope) error {
+ return autoConvert_v1_PodDNSConfig_To_core_PodDNSConfig(in, out, s)
+}
+
+func autoConvert_core_PodDNSConfig_To_v1_PodDNSConfig(in *core.PodDNSConfig, out *v1.PodDNSConfig, s conversion.Scope) error {
+ out.Nameservers = *(*[]string)(unsafe.Pointer(&in.Nameservers))
+ out.Searches = *(*[]string)(unsafe.Pointer(&in.Searches))
+ out.Options = *(*[]v1.PodDNSConfigOption)(unsafe.Pointer(&in.Options))
+ return nil
+}
+
+// Convert_core_PodDNSConfig_To_v1_PodDNSConfig is an autogenerated conversion function.
+func Convert_core_PodDNSConfig_To_v1_PodDNSConfig(in *core.PodDNSConfig, out *v1.PodDNSConfig, s conversion.Scope) error {
+ return autoConvert_core_PodDNSConfig_To_v1_PodDNSConfig(in, out, s)
+}
+
+func autoConvert_v1_PodDNSConfigOption_To_core_PodDNSConfigOption(in *v1.PodDNSConfigOption, out *core.PodDNSConfigOption, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Value = (*string)(unsafe.Pointer(in.Value))
+ return nil
+}
+
+// Convert_v1_PodDNSConfigOption_To_core_PodDNSConfigOption is an autogenerated conversion function.
+func Convert_v1_PodDNSConfigOption_To_core_PodDNSConfigOption(in *v1.PodDNSConfigOption, out *core.PodDNSConfigOption, s conversion.Scope) error {
+ return autoConvert_v1_PodDNSConfigOption_To_core_PodDNSConfigOption(in, out, s)
+}
+
+func autoConvert_core_PodDNSConfigOption_To_v1_PodDNSConfigOption(in *core.PodDNSConfigOption, out *v1.PodDNSConfigOption, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Value = (*string)(unsafe.Pointer(in.Value))
+ return nil
+}
+
+// Convert_core_PodDNSConfigOption_To_v1_PodDNSConfigOption is an autogenerated conversion function.
+func Convert_core_PodDNSConfigOption_To_v1_PodDNSConfigOption(in *core.PodDNSConfigOption, out *v1.PodDNSConfigOption, s conversion.Scope) error {
+ return autoConvert_core_PodDNSConfigOption_To_v1_PodDNSConfigOption(in, out, s)
+}
+
+func autoConvert_v1_PodExecOptions_To_core_PodExecOptions(in *v1.PodExecOptions, out *core.PodExecOptions, s conversion.Scope) error {
+ out.Stdin = in.Stdin
+ out.Stdout = in.Stdout
+ out.Stderr = in.Stderr
+ out.TTY = in.TTY
+ out.Container = in.Container
+ out.Command = *(*[]string)(unsafe.Pointer(&in.Command))
+ return nil
+}
+
+// Convert_v1_PodExecOptions_To_core_PodExecOptions is an autogenerated conversion function.
+func Convert_v1_PodExecOptions_To_core_PodExecOptions(in *v1.PodExecOptions, out *core.PodExecOptions, s conversion.Scope) error {
+ return autoConvert_v1_PodExecOptions_To_core_PodExecOptions(in, out, s)
+}
+
+func autoConvert_core_PodExecOptions_To_v1_PodExecOptions(in *core.PodExecOptions, out *v1.PodExecOptions, s conversion.Scope) error {
+ out.Stdin = in.Stdin
+ out.Stdout = in.Stdout
+ out.Stderr = in.Stderr
+ out.TTY = in.TTY
+ out.Container = in.Container
+ out.Command = *(*[]string)(unsafe.Pointer(&in.Command))
+ return nil
+}
+
+// Convert_core_PodExecOptions_To_v1_PodExecOptions is an autogenerated conversion function.
+func Convert_core_PodExecOptions_To_v1_PodExecOptions(in *core.PodExecOptions, out *v1.PodExecOptions, s conversion.Scope) error {
+ return autoConvert_core_PodExecOptions_To_v1_PodExecOptions(in, out, s)
+}
+
+func autoConvert_v1_PodList_To_core_PodList(in *v1.PodList, out *core.PodList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]core.Pod, len(*in))
+ for i := range *in {
+ if err := Convert_v1_Pod_To_core_Pod(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_v1_PodList_To_core_PodList is an autogenerated conversion function.
+func Convert_v1_PodList_To_core_PodList(in *v1.PodList, out *core.PodList, s conversion.Scope) error {
+ return autoConvert_v1_PodList_To_core_PodList(in, out, s)
+}
+
+func autoConvert_core_PodList_To_v1_PodList(in *core.PodList, out *v1.PodList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]v1.Pod, len(*in))
+ for i := range *in {
+ if err := Convert_core_Pod_To_v1_Pod(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_core_PodList_To_v1_PodList is an autogenerated conversion function.
+func Convert_core_PodList_To_v1_PodList(in *core.PodList, out *v1.PodList, s conversion.Scope) error {
+ return autoConvert_core_PodList_To_v1_PodList(in, out, s)
+}
+
+func autoConvert_v1_PodLogOptions_To_core_PodLogOptions(in *v1.PodLogOptions, out *core.PodLogOptions, s conversion.Scope) error {
+ out.Container = in.Container
+ out.Follow = in.Follow
+ out.Previous = in.Previous
+ out.SinceSeconds = (*int64)(unsafe.Pointer(in.SinceSeconds))
+ out.SinceTime = (*meta_v1.Time)(unsafe.Pointer(in.SinceTime))
+ out.Timestamps = in.Timestamps
+ out.TailLines = (*int64)(unsafe.Pointer(in.TailLines))
+ out.LimitBytes = (*int64)(unsafe.Pointer(in.LimitBytes))
+ return nil
+}
+
+// Convert_v1_PodLogOptions_To_core_PodLogOptions is an autogenerated conversion function.
+func Convert_v1_PodLogOptions_To_core_PodLogOptions(in *v1.PodLogOptions, out *core.PodLogOptions, s conversion.Scope) error {
+ return autoConvert_v1_PodLogOptions_To_core_PodLogOptions(in, out, s)
+}
+
+func autoConvert_core_PodLogOptions_To_v1_PodLogOptions(in *core.PodLogOptions, out *v1.PodLogOptions, s conversion.Scope) error {
+ out.Container = in.Container
+ out.Follow = in.Follow
+ out.Previous = in.Previous
+ out.SinceSeconds = (*int64)(unsafe.Pointer(in.SinceSeconds))
+ out.SinceTime = (*meta_v1.Time)(unsafe.Pointer(in.SinceTime))
+ out.Timestamps = in.Timestamps
+ out.TailLines = (*int64)(unsafe.Pointer(in.TailLines))
+ out.LimitBytes = (*int64)(unsafe.Pointer(in.LimitBytes))
+ return nil
+}
+
+// Convert_core_PodLogOptions_To_v1_PodLogOptions is an autogenerated conversion function.
+func Convert_core_PodLogOptions_To_v1_PodLogOptions(in *core.PodLogOptions, out *v1.PodLogOptions, s conversion.Scope) error {
+ return autoConvert_core_PodLogOptions_To_v1_PodLogOptions(in, out, s)
+}
+
+func autoConvert_v1_PodPortForwardOptions_To_core_PodPortForwardOptions(in *v1.PodPortForwardOptions, out *core.PodPortForwardOptions, s conversion.Scope) error {
+ out.Ports = *(*[]int32)(unsafe.Pointer(&in.Ports))
+ return nil
+}
+
+// Convert_v1_PodPortForwardOptions_To_core_PodPortForwardOptions is an autogenerated conversion function.
+func Convert_v1_PodPortForwardOptions_To_core_PodPortForwardOptions(in *v1.PodPortForwardOptions, out *core.PodPortForwardOptions, s conversion.Scope) error {
+ return autoConvert_v1_PodPortForwardOptions_To_core_PodPortForwardOptions(in, out, s)
+}
+
+func autoConvert_core_PodPortForwardOptions_To_v1_PodPortForwardOptions(in *core.PodPortForwardOptions, out *v1.PodPortForwardOptions, s conversion.Scope) error {
+ out.Ports = *(*[]int32)(unsafe.Pointer(&in.Ports))
+ return nil
+}
+
+// Convert_core_PodPortForwardOptions_To_v1_PodPortForwardOptions is an autogenerated conversion function.
+func Convert_core_PodPortForwardOptions_To_v1_PodPortForwardOptions(in *core.PodPortForwardOptions, out *v1.PodPortForwardOptions, s conversion.Scope) error {
+ return autoConvert_core_PodPortForwardOptions_To_v1_PodPortForwardOptions(in, out, s)
+}
+
+func autoConvert_v1_PodProxyOptions_To_core_PodProxyOptions(in *v1.PodProxyOptions, out *core.PodProxyOptions, s conversion.Scope) error {
+ out.Path = in.Path
+ return nil
+}
+
+// Convert_v1_PodProxyOptions_To_core_PodProxyOptions is an autogenerated conversion function.
+func Convert_v1_PodProxyOptions_To_core_PodProxyOptions(in *v1.PodProxyOptions, out *core.PodProxyOptions, s conversion.Scope) error {
+ return autoConvert_v1_PodProxyOptions_To_core_PodProxyOptions(in, out, s)
+}
+
+func autoConvert_core_PodProxyOptions_To_v1_PodProxyOptions(in *core.PodProxyOptions, out *v1.PodProxyOptions, s conversion.Scope) error {
+ out.Path = in.Path
+ return nil
+}
+
+// Convert_core_PodProxyOptions_To_v1_PodProxyOptions is an autogenerated conversion function.
+func Convert_core_PodProxyOptions_To_v1_PodProxyOptions(in *core.PodProxyOptions, out *v1.PodProxyOptions, s conversion.Scope) error {
+ return autoConvert_core_PodProxyOptions_To_v1_PodProxyOptions(in, out, s)
+}
+
+func autoConvert_v1_PodSecurityContext_To_core_PodSecurityContext(in *v1.PodSecurityContext, out *core.PodSecurityContext, s conversion.Scope) error {
+ out.SELinuxOptions = (*core.SELinuxOptions)(unsafe.Pointer(in.SELinuxOptions))
+ out.RunAsUser = (*int64)(unsafe.Pointer(in.RunAsUser))
+ out.RunAsNonRoot = (*bool)(unsafe.Pointer(in.RunAsNonRoot))
+ out.SupplementalGroups = *(*[]int64)(unsafe.Pointer(&in.SupplementalGroups))
+ out.FSGroup = (*int64)(unsafe.Pointer(in.FSGroup))
+ return nil
+}
+
+func autoConvert_core_PodSecurityContext_To_v1_PodSecurityContext(in *core.PodSecurityContext, out *v1.PodSecurityContext, s conversion.Scope) error {
+ // INFO: in.HostNetwork opted out of conversion generation
+ // INFO: in.HostPID opted out of conversion generation
+ // INFO: in.HostIPC opted out of conversion generation
+ // INFO: in.ShareProcessNamespace opted out of conversion generation
+ out.SELinuxOptions = (*v1.SELinuxOptions)(unsafe.Pointer(in.SELinuxOptions))
+ out.RunAsUser = (*int64)(unsafe.Pointer(in.RunAsUser))
+ out.RunAsNonRoot = (*bool)(unsafe.Pointer(in.RunAsNonRoot))
+ out.SupplementalGroups = *(*[]int64)(unsafe.Pointer(&in.SupplementalGroups))
+ out.FSGroup = (*int64)(unsafe.Pointer(in.FSGroup))
+ return nil
+}
+
+func autoConvert_v1_PodSignature_To_core_PodSignature(in *v1.PodSignature, out *core.PodSignature, s conversion.Scope) error {
+ out.PodController = (*meta_v1.OwnerReference)(unsafe.Pointer(in.PodController))
+ return nil
+}
+
+// Convert_v1_PodSignature_To_core_PodSignature is an autogenerated conversion function.
+func Convert_v1_PodSignature_To_core_PodSignature(in *v1.PodSignature, out *core.PodSignature, s conversion.Scope) error {
+ return autoConvert_v1_PodSignature_To_core_PodSignature(in, out, s)
+}
+
+func autoConvert_core_PodSignature_To_v1_PodSignature(in *core.PodSignature, out *v1.PodSignature, s conversion.Scope) error {
+ out.PodController = (*meta_v1.OwnerReference)(unsafe.Pointer(in.PodController))
+ return nil
+}
+
+// Convert_core_PodSignature_To_v1_PodSignature is an autogenerated conversion function.
+func Convert_core_PodSignature_To_v1_PodSignature(in *core.PodSignature, out *v1.PodSignature, s conversion.Scope) error {
+ return autoConvert_core_PodSignature_To_v1_PodSignature(in, out, s)
+}
+
+func autoConvert_v1_PodSpec_To_core_PodSpec(in *v1.PodSpec, out *core.PodSpec, s conversion.Scope) error {
+ if in.Volumes != nil {
+ in, out := &in.Volumes, &out.Volumes
+ *out = make([]core.Volume, len(*in))
+ for i := range *in {
+ if err := Convert_v1_Volume_To_core_Volume(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Volumes = nil
+ }
+ if in.InitContainers != nil {
+ in, out := &in.InitContainers, &out.InitContainers
+ *out = make([]core.Container, len(*in))
+ for i := range *in {
+ if err := Convert_v1_Container_To_core_Container(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.InitContainers = nil
+ }
+ if in.Containers != nil {
+ in, out := &in.Containers, &out.Containers
+ *out = make([]core.Container, len(*in))
+ for i := range *in {
+ if err := Convert_v1_Container_To_core_Container(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Containers = nil
+ }
+ out.RestartPolicy = core.RestartPolicy(in.RestartPolicy)
+ out.TerminationGracePeriodSeconds = (*int64)(unsafe.Pointer(in.TerminationGracePeriodSeconds))
+ out.ActiveDeadlineSeconds = (*int64)(unsafe.Pointer(in.ActiveDeadlineSeconds))
+ out.DNSPolicy = core.DNSPolicy(in.DNSPolicy)
+ out.NodeSelector = *(*map[string]string)(unsafe.Pointer(&in.NodeSelector))
+ out.ServiceAccountName = in.ServiceAccountName
+ // INFO: in.DeprecatedServiceAccount opted out of conversion generation
+ out.AutomountServiceAccountToken = (*bool)(unsafe.Pointer(in.AutomountServiceAccountToken))
+ out.NodeName = in.NodeName
+ // INFO: in.HostNetwork opted out of conversion generation
+ // INFO: in.HostPID opted out of conversion generation
+ // INFO: in.HostIPC opted out of conversion generation
+ // INFO: in.ShareProcessNamespace opted out of conversion generation
+ if in.SecurityContext != nil {
+ in, out := &in.SecurityContext, &out.SecurityContext
+ *out = new(core.PodSecurityContext)
+ if err := Convert_v1_PodSecurityContext_To_core_PodSecurityContext(*in, *out, s); err != nil {
+ return err
+ }
+ } else {
+ out.SecurityContext = nil
+ }
+ out.ImagePullSecrets = *(*[]core.LocalObjectReference)(unsafe.Pointer(&in.ImagePullSecrets))
+ out.Hostname = in.Hostname
+ out.Subdomain = in.Subdomain
+ out.Affinity = (*core.Affinity)(unsafe.Pointer(in.Affinity))
+ out.SchedulerName = in.SchedulerName
+ out.Tolerations = *(*[]core.Toleration)(unsafe.Pointer(&in.Tolerations))
+ out.HostAliases = *(*[]core.HostAlias)(unsafe.Pointer(&in.HostAliases))
+ out.PriorityClassName = in.PriorityClassName
+ out.Priority = (*int32)(unsafe.Pointer(in.Priority))
+ out.DNSConfig = (*core.PodDNSConfig)(unsafe.Pointer(in.DNSConfig))
+ return nil
+}
+
+func autoConvert_core_PodSpec_To_v1_PodSpec(in *core.PodSpec, out *v1.PodSpec, s conversion.Scope) error {
+ if in.Volumes != nil {
+ in, out := &in.Volumes, &out.Volumes
+ *out = make([]v1.Volume, len(*in))
+ for i := range *in {
+ if err := Convert_core_Volume_To_v1_Volume(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Volumes = nil
+ }
+ if in.InitContainers != nil {
+ in, out := &in.InitContainers, &out.InitContainers
+ *out = make([]v1.Container, len(*in))
+ for i := range *in {
+ if err := Convert_core_Container_To_v1_Container(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.InitContainers = nil
+ }
+ if in.Containers != nil {
+ in, out := &in.Containers, &out.Containers
+ *out = make([]v1.Container, len(*in))
+ for i := range *in {
+ if err := Convert_core_Container_To_v1_Container(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Containers = nil
+ }
+ out.RestartPolicy = v1.RestartPolicy(in.RestartPolicy)
+ out.TerminationGracePeriodSeconds = (*int64)(unsafe.Pointer(in.TerminationGracePeriodSeconds))
+ out.ActiveDeadlineSeconds = (*int64)(unsafe.Pointer(in.ActiveDeadlineSeconds))
+ out.DNSPolicy = v1.DNSPolicy(in.DNSPolicy)
+ out.NodeSelector = *(*map[string]string)(unsafe.Pointer(&in.NodeSelector))
+ out.ServiceAccountName = in.ServiceAccountName
+ out.AutomountServiceAccountToken = (*bool)(unsafe.Pointer(in.AutomountServiceAccountToken))
+ out.NodeName = in.NodeName
+ if in.SecurityContext != nil {
+ in, out := &in.SecurityContext, &out.SecurityContext
+ *out = new(v1.PodSecurityContext)
+ if err := Convert_core_PodSecurityContext_To_v1_PodSecurityContext(*in, *out, s); err != nil {
+ return err
+ }
+ } else {
+ out.SecurityContext = nil
+ }
+ out.ImagePullSecrets = *(*[]v1.LocalObjectReference)(unsafe.Pointer(&in.ImagePullSecrets))
+ out.Hostname = in.Hostname
+ out.Subdomain = in.Subdomain
+ out.Affinity = (*v1.Affinity)(unsafe.Pointer(in.Affinity))
+ out.SchedulerName = in.SchedulerName
+ out.Tolerations = *(*[]v1.Toleration)(unsafe.Pointer(&in.Tolerations))
+ out.HostAliases = *(*[]v1.HostAlias)(unsafe.Pointer(&in.HostAliases))
+ out.PriorityClassName = in.PriorityClassName
+ out.Priority = (*int32)(unsafe.Pointer(in.Priority))
+ out.DNSConfig = (*v1.PodDNSConfig)(unsafe.Pointer(in.DNSConfig))
+ return nil
+}
+
+func autoConvert_v1_PodStatus_To_core_PodStatus(in *v1.PodStatus, out *core.PodStatus, s conversion.Scope) error {
+ out.Phase = core.PodPhase(in.Phase)
+ out.Conditions = *(*[]core.PodCondition)(unsafe.Pointer(&in.Conditions))
+ out.Message = in.Message
+ out.Reason = in.Reason
+ out.NominatedNodeName = in.NominatedNodeName
+ out.HostIP = in.HostIP
+ out.PodIP = in.PodIP
+ out.StartTime = (*meta_v1.Time)(unsafe.Pointer(in.StartTime))
+ out.InitContainerStatuses = *(*[]core.ContainerStatus)(unsafe.Pointer(&in.InitContainerStatuses))
+ out.ContainerStatuses = *(*[]core.ContainerStatus)(unsafe.Pointer(&in.ContainerStatuses))
+ out.QOSClass = core.PodQOSClass(in.QOSClass)
+ return nil
+}
+
+// Convert_v1_PodStatus_To_core_PodStatus is an autogenerated conversion function.
+func Convert_v1_PodStatus_To_core_PodStatus(in *v1.PodStatus, out *core.PodStatus, s conversion.Scope) error {
+ return autoConvert_v1_PodStatus_To_core_PodStatus(in, out, s)
+}
+
+func autoConvert_core_PodStatus_To_v1_PodStatus(in *core.PodStatus, out *v1.PodStatus, s conversion.Scope) error {
+ out.Phase = v1.PodPhase(in.Phase)
+ out.Conditions = *(*[]v1.PodCondition)(unsafe.Pointer(&in.Conditions))
+ out.Message = in.Message
+ out.Reason = in.Reason
+ out.NominatedNodeName = in.NominatedNodeName
+ out.HostIP = in.HostIP
+ out.PodIP = in.PodIP
+ out.StartTime = (*meta_v1.Time)(unsafe.Pointer(in.StartTime))
+ out.QOSClass = v1.PodQOSClass(in.QOSClass)
+ out.InitContainerStatuses = *(*[]v1.ContainerStatus)(unsafe.Pointer(&in.InitContainerStatuses))
+ out.ContainerStatuses = *(*[]v1.ContainerStatus)(unsafe.Pointer(&in.ContainerStatuses))
+ return nil
+}
+
+// Convert_core_PodStatus_To_v1_PodStatus is an autogenerated conversion function.
+func Convert_core_PodStatus_To_v1_PodStatus(in *core.PodStatus, out *v1.PodStatus, s conversion.Scope) error {
+ return autoConvert_core_PodStatus_To_v1_PodStatus(in, out, s)
+}
+
+func autoConvert_v1_PodStatusResult_To_core_PodStatusResult(in *v1.PodStatusResult, out *core.PodStatusResult, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_PodStatus_To_core_PodStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_PodStatusResult_To_core_PodStatusResult is an autogenerated conversion function.
+func Convert_v1_PodStatusResult_To_core_PodStatusResult(in *v1.PodStatusResult, out *core.PodStatusResult, s conversion.Scope) error {
+ return autoConvert_v1_PodStatusResult_To_core_PodStatusResult(in, out, s)
+}
+
+func autoConvert_core_PodStatusResult_To_v1_PodStatusResult(in *core.PodStatusResult, out *v1.PodStatusResult, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_PodStatus_To_v1_PodStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_PodStatusResult_To_v1_PodStatusResult is an autogenerated conversion function.
+func Convert_core_PodStatusResult_To_v1_PodStatusResult(in *core.PodStatusResult, out *v1.PodStatusResult, s conversion.Scope) error {
+ return autoConvert_core_PodStatusResult_To_v1_PodStatusResult(in, out, s)
+}
+
+func autoConvert_v1_PodTemplate_To_core_PodTemplate(in *v1.PodTemplate, out *core.PodTemplate, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_PodTemplateSpec_To_core_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_PodTemplate_To_core_PodTemplate is an autogenerated conversion function.
+func Convert_v1_PodTemplate_To_core_PodTemplate(in *v1.PodTemplate, out *core.PodTemplate, s conversion.Scope) error {
+ return autoConvert_v1_PodTemplate_To_core_PodTemplate(in, out, s)
+}
+
+func autoConvert_core_PodTemplate_To_v1_PodTemplate(in *core.PodTemplate, out *v1.PodTemplate, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_PodTemplate_To_v1_PodTemplate is an autogenerated conversion function.
+func Convert_core_PodTemplate_To_v1_PodTemplate(in *core.PodTemplate, out *v1.PodTemplate, s conversion.Scope) error {
+ return autoConvert_core_PodTemplate_To_v1_PodTemplate(in, out, s)
+}
+
+func autoConvert_v1_PodTemplateList_To_core_PodTemplateList(in *v1.PodTemplateList, out *core.PodTemplateList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]core.PodTemplate, len(*in))
+ for i := range *in {
+ if err := Convert_v1_PodTemplate_To_core_PodTemplate(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_v1_PodTemplateList_To_core_PodTemplateList is an autogenerated conversion function.
+func Convert_v1_PodTemplateList_To_core_PodTemplateList(in *v1.PodTemplateList, out *core.PodTemplateList, s conversion.Scope) error {
+ return autoConvert_v1_PodTemplateList_To_core_PodTemplateList(in, out, s)
+}
+
+func autoConvert_core_PodTemplateList_To_v1_PodTemplateList(in *core.PodTemplateList, out *v1.PodTemplateList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]v1.PodTemplate, len(*in))
+ for i := range *in {
+ if err := Convert_core_PodTemplate_To_v1_PodTemplate(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_core_PodTemplateList_To_v1_PodTemplateList is an autogenerated conversion function.
+func Convert_core_PodTemplateList_To_v1_PodTemplateList(in *core.PodTemplateList, out *v1.PodTemplateList, s conversion.Scope) error {
+ return autoConvert_core_PodTemplateList_To_v1_PodTemplateList(in, out, s)
+}
+
+func autoConvert_v1_PodTemplateSpec_To_core_PodTemplateSpec(in *v1.PodTemplateSpec, out *core.PodTemplateSpec, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_PodSpec_To_core_PodSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+func autoConvert_core_PodTemplateSpec_To_v1_PodTemplateSpec(in *core.PodTemplateSpec, out *v1.PodTemplateSpec, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_PodSpec_To_v1_PodSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+func autoConvert_v1_PortworxVolumeSource_To_core_PortworxVolumeSource(in *v1.PortworxVolumeSource, out *core.PortworxVolumeSource, s conversion.Scope) error {
+ out.VolumeID = in.VolumeID
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_PortworxVolumeSource_To_core_PortworxVolumeSource is an autogenerated conversion function.
+func Convert_v1_PortworxVolumeSource_To_core_PortworxVolumeSource(in *v1.PortworxVolumeSource, out *core.PortworxVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_PortworxVolumeSource_To_core_PortworxVolumeSource(in, out, s)
+}
+
+func autoConvert_core_PortworxVolumeSource_To_v1_PortworxVolumeSource(in *core.PortworxVolumeSource, out *v1.PortworxVolumeSource, s conversion.Scope) error {
+ out.VolumeID = in.VolumeID
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_PortworxVolumeSource_To_v1_PortworxVolumeSource is an autogenerated conversion function.
+func Convert_core_PortworxVolumeSource_To_v1_PortworxVolumeSource(in *core.PortworxVolumeSource, out *v1.PortworxVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_PortworxVolumeSource_To_v1_PortworxVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_Preconditions_To_core_Preconditions(in *v1.Preconditions, out *core.Preconditions, s conversion.Scope) error {
+ out.UID = (*types.UID)(unsafe.Pointer(in.UID))
+ return nil
+}
+
+// Convert_v1_Preconditions_To_core_Preconditions is an autogenerated conversion function.
+func Convert_v1_Preconditions_To_core_Preconditions(in *v1.Preconditions, out *core.Preconditions, s conversion.Scope) error {
+ return autoConvert_v1_Preconditions_To_core_Preconditions(in, out, s)
+}
+
+func autoConvert_core_Preconditions_To_v1_Preconditions(in *core.Preconditions, out *v1.Preconditions, s conversion.Scope) error {
+ out.UID = (*types.UID)(unsafe.Pointer(in.UID))
+ return nil
+}
+
+// Convert_core_Preconditions_To_v1_Preconditions is an autogenerated conversion function.
+func Convert_core_Preconditions_To_v1_Preconditions(in *core.Preconditions, out *v1.Preconditions, s conversion.Scope) error {
+ return autoConvert_core_Preconditions_To_v1_Preconditions(in, out, s)
+}
+
+func autoConvert_v1_PreferAvoidPodsEntry_To_core_PreferAvoidPodsEntry(in *v1.PreferAvoidPodsEntry, out *core.PreferAvoidPodsEntry, s conversion.Scope) error {
+ if err := Convert_v1_PodSignature_To_core_PodSignature(&in.PodSignature, &out.PodSignature, s); err != nil {
+ return err
+ }
+ out.EvictionTime = in.EvictionTime
+ out.Reason = in.Reason
+ out.Message = in.Message
+ return nil
+}
+
+// Convert_v1_PreferAvoidPodsEntry_To_core_PreferAvoidPodsEntry is an autogenerated conversion function.
+func Convert_v1_PreferAvoidPodsEntry_To_core_PreferAvoidPodsEntry(in *v1.PreferAvoidPodsEntry, out *core.PreferAvoidPodsEntry, s conversion.Scope) error {
+ return autoConvert_v1_PreferAvoidPodsEntry_To_core_PreferAvoidPodsEntry(in, out, s)
+}
+
+func autoConvert_core_PreferAvoidPodsEntry_To_v1_PreferAvoidPodsEntry(in *core.PreferAvoidPodsEntry, out *v1.PreferAvoidPodsEntry, s conversion.Scope) error {
+ if err := Convert_core_PodSignature_To_v1_PodSignature(&in.PodSignature, &out.PodSignature, s); err != nil {
+ return err
+ }
+ out.EvictionTime = in.EvictionTime
+ out.Reason = in.Reason
+ out.Message = in.Message
+ return nil
+}
+
+// Convert_core_PreferAvoidPodsEntry_To_v1_PreferAvoidPodsEntry is an autogenerated conversion function.
+func Convert_core_PreferAvoidPodsEntry_To_v1_PreferAvoidPodsEntry(in *core.PreferAvoidPodsEntry, out *v1.PreferAvoidPodsEntry, s conversion.Scope) error {
+ return autoConvert_core_PreferAvoidPodsEntry_To_v1_PreferAvoidPodsEntry(in, out, s)
+}
+
+func autoConvert_v1_PreferredSchedulingTerm_To_core_PreferredSchedulingTerm(in *v1.PreferredSchedulingTerm, out *core.PreferredSchedulingTerm, s conversion.Scope) error {
+ out.Weight = in.Weight
+ if err := Convert_v1_NodeSelectorTerm_To_core_NodeSelectorTerm(&in.Preference, &out.Preference, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_PreferredSchedulingTerm_To_core_PreferredSchedulingTerm is an autogenerated conversion function.
+func Convert_v1_PreferredSchedulingTerm_To_core_PreferredSchedulingTerm(in *v1.PreferredSchedulingTerm, out *core.PreferredSchedulingTerm, s conversion.Scope) error {
+ return autoConvert_v1_PreferredSchedulingTerm_To_core_PreferredSchedulingTerm(in, out, s)
+}
+
+func autoConvert_core_PreferredSchedulingTerm_To_v1_PreferredSchedulingTerm(in *core.PreferredSchedulingTerm, out *v1.PreferredSchedulingTerm, s conversion.Scope) error {
+ out.Weight = in.Weight
+ if err := Convert_core_NodeSelectorTerm_To_v1_NodeSelectorTerm(&in.Preference, &out.Preference, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_PreferredSchedulingTerm_To_v1_PreferredSchedulingTerm is an autogenerated conversion function.
+func Convert_core_PreferredSchedulingTerm_To_v1_PreferredSchedulingTerm(in *core.PreferredSchedulingTerm, out *v1.PreferredSchedulingTerm, s conversion.Scope) error {
+ return autoConvert_core_PreferredSchedulingTerm_To_v1_PreferredSchedulingTerm(in, out, s)
+}
+
+func autoConvert_v1_Probe_To_core_Probe(in *v1.Probe, out *core.Probe, s conversion.Scope) error {
+ if err := Convert_v1_Handler_To_core_Handler(&in.Handler, &out.Handler, s); err != nil {
+ return err
+ }
+ out.InitialDelaySeconds = in.InitialDelaySeconds
+ out.TimeoutSeconds = in.TimeoutSeconds
+ out.PeriodSeconds = in.PeriodSeconds
+ out.SuccessThreshold = in.SuccessThreshold
+ out.FailureThreshold = in.FailureThreshold
+ return nil
+}
+
+// Convert_v1_Probe_To_core_Probe is an autogenerated conversion function.
+func Convert_v1_Probe_To_core_Probe(in *v1.Probe, out *core.Probe, s conversion.Scope) error {
+ return autoConvert_v1_Probe_To_core_Probe(in, out, s)
+}
+
+func autoConvert_core_Probe_To_v1_Probe(in *core.Probe, out *v1.Probe, s conversion.Scope) error {
+ if err := Convert_core_Handler_To_v1_Handler(&in.Handler, &out.Handler, s); err != nil {
+ return err
+ }
+ out.InitialDelaySeconds = in.InitialDelaySeconds
+ out.TimeoutSeconds = in.TimeoutSeconds
+ out.PeriodSeconds = in.PeriodSeconds
+ out.SuccessThreshold = in.SuccessThreshold
+ out.FailureThreshold = in.FailureThreshold
+ return nil
+}
+
+// Convert_core_Probe_To_v1_Probe is an autogenerated conversion function.
+func Convert_core_Probe_To_v1_Probe(in *core.Probe, out *v1.Probe, s conversion.Scope) error {
+ return autoConvert_core_Probe_To_v1_Probe(in, out, s)
+}
+
+func autoConvert_v1_ProjectedVolumeSource_To_core_ProjectedVolumeSource(in *v1.ProjectedVolumeSource, out *core.ProjectedVolumeSource, s conversion.Scope) error {
+ out.Sources = *(*[]core.VolumeProjection)(unsafe.Pointer(&in.Sources))
+ out.DefaultMode = (*int32)(unsafe.Pointer(in.DefaultMode))
+ return nil
+}
+
+// Convert_v1_ProjectedVolumeSource_To_core_ProjectedVolumeSource is an autogenerated conversion function.
+func Convert_v1_ProjectedVolumeSource_To_core_ProjectedVolumeSource(in *v1.ProjectedVolumeSource, out *core.ProjectedVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_ProjectedVolumeSource_To_core_ProjectedVolumeSource(in, out, s)
+}
+
+func autoConvert_core_ProjectedVolumeSource_To_v1_ProjectedVolumeSource(in *core.ProjectedVolumeSource, out *v1.ProjectedVolumeSource, s conversion.Scope) error {
+ out.Sources = *(*[]v1.VolumeProjection)(unsafe.Pointer(&in.Sources))
+ out.DefaultMode = (*int32)(unsafe.Pointer(in.DefaultMode))
+ return nil
+}
+
+// Convert_core_ProjectedVolumeSource_To_v1_ProjectedVolumeSource is an autogenerated conversion function.
+func Convert_core_ProjectedVolumeSource_To_v1_ProjectedVolumeSource(in *core.ProjectedVolumeSource, out *v1.ProjectedVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_ProjectedVolumeSource_To_v1_ProjectedVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_QuobyteVolumeSource_To_core_QuobyteVolumeSource(in *v1.QuobyteVolumeSource, out *core.QuobyteVolumeSource, s conversion.Scope) error {
+ out.Registry = in.Registry
+ out.Volume = in.Volume
+ out.ReadOnly = in.ReadOnly
+ out.User = in.User
+ out.Group = in.Group
+ return nil
+}
+
+// Convert_v1_QuobyteVolumeSource_To_core_QuobyteVolumeSource is an autogenerated conversion function.
+func Convert_v1_QuobyteVolumeSource_To_core_QuobyteVolumeSource(in *v1.QuobyteVolumeSource, out *core.QuobyteVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_QuobyteVolumeSource_To_core_QuobyteVolumeSource(in, out, s)
+}
+
+func autoConvert_core_QuobyteVolumeSource_To_v1_QuobyteVolumeSource(in *core.QuobyteVolumeSource, out *v1.QuobyteVolumeSource, s conversion.Scope) error {
+ out.Registry = in.Registry
+ out.Volume = in.Volume
+ out.ReadOnly = in.ReadOnly
+ out.User = in.User
+ out.Group = in.Group
+ return nil
+}
+
+// Convert_core_QuobyteVolumeSource_To_v1_QuobyteVolumeSource is an autogenerated conversion function.
+func Convert_core_QuobyteVolumeSource_To_v1_QuobyteVolumeSource(in *core.QuobyteVolumeSource, out *v1.QuobyteVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_QuobyteVolumeSource_To_v1_QuobyteVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_RBDPersistentVolumeSource_To_core_RBDPersistentVolumeSource(in *v1.RBDPersistentVolumeSource, out *core.RBDPersistentVolumeSource, s conversion.Scope) error {
+ out.CephMonitors = *(*[]string)(unsafe.Pointer(&in.CephMonitors))
+ out.RBDImage = in.RBDImage
+ out.FSType = in.FSType
+ out.RBDPool = in.RBDPool
+ out.RadosUser = in.RadosUser
+ out.Keyring = in.Keyring
+ out.SecretRef = (*core.SecretReference)(unsafe.Pointer(in.SecretRef))
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_RBDPersistentVolumeSource_To_core_RBDPersistentVolumeSource is an autogenerated conversion function.
+func Convert_v1_RBDPersistentVolumeSource_To_core_RBDPersistentVolumeSource(in *v1.RBDPersistentVolumeSource, out *core.RBDPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_RBDPersistentVolumeSource_To_core_RBDPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_core_RBDPersistentVolumeSource_To_v1_RBDPersistentVolumeSource(in *core.RBDPersistentVolumeSource, out *v1.RBDPersistentVolumeSource, s conversion.Scope) error {
+ out.CephMonitors = *(*[]string)(unsafe.Pointer(&in.CephMonitors))
+ out.RBDImage = in.RBDImage
+ out.FSType = in.FSType
+ out.RBDPool = in.RBDPool
+ out.RadosUser = in.RadosUser
+ out.Keyring = in.Keyring
+ out.SecretRef = (*v1.SecretReference)(unsafe.Pointer(in.SecretRef))
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_RBDPersistentVolumeSource_To_v1_RBDPersistentVolumeSource is an autogenerated conversion function.
+func Convert_core_RBDPersistentVolumeSource_To_v1_RBDPersistentVolumeSource(in *core.RBDPersistentVolumeSource, out *v1.RBDPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_RBDPersistentVolumeSource_To_v1_RBDPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_RBDVolumeSource_To_core_RBDVolumeSource(in *v1.RBDVolumeSource, out *core.RBDVolumeSource, s conversion.Scope) error {
+ out.CephMonitors = *(*[]string)(unsafe.Pointer(&in.CephMonitors))
+ out.RBDImage = in.RBDImage
+ out.FSType = in.FSType
+ out.RBDPool = in.RBDPool
+ out.RadosUser = in.RadosUser
+ out.Keyring = in.Keyring
+ out.SecretRef = (*core.LocalObjectReference)(unsafe.Pointer(in.SecretRef))
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_RBDVolumeSource_To_core_RBDVolumeSource is an autogenerated conversion function.
+func Convert_v1_RBDVolumeSource_To_core_RBDVolumeSource(in *v1.RBDVolumeSource, out *core.RBDVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_RBDVolumeSource_To_core_RBDVolumeSource(in, out, s)
+}
+
+func autoConvert_core_RBDVolumeSource_To_v1_RBDVolumeSource(in *core.RBDVolumeSource, out *v1.RBDVolumeSource, s conversion.Scope) error {
+ out.CephMonitors = *(*[]string)(unsafe.Pointer(&in.CephMonitors))
+ out.RBDImage = in.RBDImage
+ out.FSType = in.FSType
+ out.RBDPool = in.RBDPool
+ out.RadosUser = in.RadosUser
+ out.Keyring = in.Keyring
+ out.SecretRef = (*v1.LocalObjectReference)(unsafe.Pointer(in.SecretRef))
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_RBDVolumeSource_To_v1_RBDVolumeSource is an autogenerated conversion function.
+func Convert_core_RBDVolumeSource_To_v1_RBDVolumeSource(in *core.RBDVolumeSource, out *v1.RBDVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_RBDVolumeSource_To_v1_RBDVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_RangeAllocation_To_core_RangeAllocation(in *v1.RangeAllocation, out *core.RangeAllocation, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ out.Range = in.Range
+ out.Data = *(*[]byte)(unsafe.Pointer(&in.Data))
+ return nil
+}
+
+// Convert_v1_RangeAllocation_To_core_RangeAllocation is an autogenerated conversion function.
+func Convert_v1_RangeAllocation_To_core_RangeAllocation(in *v1.RangeAllocation, out *core.RangeAllocation, s conversion.Scope) error {
+ return autoConvert_v1_RangeAllocation_To_core_RangeAllocation(in, out, s)
+}
+
+func autoConvert_core_RangeAllocation_To_v1_RangeAllocation(in *core.RangeAllocation, out *v1.RangeAllocation, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ out.Range = in.Range
+ out.Data = *(*[]byte)(unsafe.Pointer(&in.Data))
+ return nil
+}
+
+// Convert_core_RangeAllocation_To_v1_RangeAllocation is an autogenerated conversion function.
+func Convert_core_RangeAllocation_To_v1_RangeAllocation(in *core.RangeAllocation, out *v1.RangeAllocation, s conversion.Scope) error {
+ return autoConvert_core_RangeAllocation_To_v1_RangeAllocation(in, out, s)
+}
+
+func autoConvert_v1_ReplicationController_To_core_ReplicationController(in *v1.ReplicationController, out *core.ReplicationController, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_ReplicationControllerSpec_To_core_ReplicationControllerSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_v1_ReplicationControllerStatus_To_core_ReplicationControllerStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_ReplicationController_To_core_ReplicationController is an autogenerated conversion function.
+func Convert_v1_ReplicationController_To_core_ReplicationController(in *v1.ReplicationController, out *core.ReplicationController, s conversion.Scope) error {
+ return autoConvert_v1_ReplicationController_To_core_ReplicationController(in, out, s)
+}
+
+func autoConvert_core_ReplicationController_To_v1_ReplicationController(in *core.ReplicationController, out *v1.ReplicationController, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_ReplicationControllerSpec_To_v1_ReplicationControllerSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_core_ReplicationControllerStatus_To_v1_ReplicationControllerStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_ReplicationController_To_v1_ReplicationController is an autogenerated conversion function.
+func Convert_core_ReplicationController_To_v1_ReplicationController(in *core.ReplicationController, out *v1.ReplicationController, s conversion.Scope) error {
+ return autoConvert_core_ReplicationController_To_v1_ReplicationController(in, out, s)
+}
+
+func autoConvert_v1_ReplicationControllerCondition_To_core_ReplicationControllerCondition(in *v1.ReplicationControllerCondition, out *core.ReplicationControllerCondition, s conversion.Scope) error {
+ out.Type = core.ReplicationControllerConditionType(in.Type)
+ out.Status = core.ConditionStatus(in.Status)
+ out.LastTransitionTime = in.LastTransitionTime
+ out.Reason = in.Reason
+ out.Message = in.Message
+ return nil
+}
+
+// Convert_v1_ReplicationControllerCondition_To_core_ReplicationControllerCondition is an autogenerated conversion function.
+func Convert_v1_ReplicationControllerCondition_To_core_ReplicationControllerCondition(in *v1.ReplicationControllerCondition, out *core.ReplicationControllerCondition, s conversion.Scope) error {
+ return autoConvert_v1_ReplicationControllerCondition_To_core_ReplicationControllerCondition(in, out, s)
+}
+
+func autoConvert_core_ReplicationControllerCondition_To_v1_ReplicationControllerCondition(in *core.ReplicationControllerCondition, out *v1.ReplicationControllerCondition, s conversion.Scope) error {
+ out.Type = v1.ReplicationControllerConditionType(in.Type)
+ out.Status = v1.ConditionStatus(in.Status)
+ out.LastTransitionTime = in.LastTransitionTime
+ out.Reason = in.Reason
+ out.Message = in.Message
+ return nil
+}
+
+// Convert_core_ReplicationControllerCondition_To_v1_ReplicationControllerCondition is an autogenerated conversion function.
+func Convert_core_ReplicationControllerCondition_To_v1_ReplicationControllerCondition(in *core.ReplicationControllerCondition, out *v1.ReplicationControllerCondition, s conversion.Scope) error {
+ return autoConvert_core_ReplicationControllerCondition_To_v1_ReplicationControllerCondition(in, out, s)
+}
+
+func autoConvert_v1_ReplicationControllerList_To_core_ReplicationControllerList(in *v1.ReplicationControllerList, out *core.ReplicationControllerList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]core.ReplicationController, len(*in))
+ for i := range *in {
+ if err := Convert_v1_ReplicationController_To_core_ReplicationController(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_v1_ReplicationControllerList_To_core_ReplicationControllerList is an autogenerated conversion function.
+func Convert_v1_ReplicationControllerList_To_core_ReplicationControllerList(in *v1.ReplicationControllerList, out *core.ReplicationControllerList, s conversion.Scope) error {
+ return autoConvert_v1_ReplicationControllerList_To_core_ReplicationControllerList(in, out, s)
+}
+
+func autoConvert_core_ReplicationControllerList_To_v1_ReplicationControllerList(in *core.ReplicationControllerList, out *v1.ReplicationControllerList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]v1.ReplicationController, len(*in))
+ for i := range *in {
+ if err := Convert_core_ReplicationController_To_v1_ReplicationController(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_core_ReplicationControllerList_To_v1_ReplicationControllerList is an autogenerated conversion function.
+func Convert_core_ReplicationControllerList_To_v1_ReplicationControllerList(in *core.ReplicationControllerList, out *v1.ReplicationControllerList, s conversion.Scope) error {
+ return autoConvert_core_ReplicationControllerList_To_v1_ReplicationControllerList(in, out, s)
+}
+
+func autoConvert_v1_ReplicationControllerSpec_To_core_ReplicationControllerSpec(in *v1.ReplicationControllerSpec, out *core.ReplicationControllerSpec, s conversion.Scope) error {
+ if err := meta_v1.Convert_Pointer_int32_To_int32(&in.Replicas, &out.Replicas, s); err != nil {
+ return err
+ }
+ out.MinReadySeconds = in.MinReadySeconds
+ out.Selector = *(*map[string]string)(unsafe.Pointer(&in.Selector))
+ if in.Template != nil {
+ in, out := &in.Template, &out.Template
+ *out = new(core.PodTemplateSpec)
+ if err := Convert_v1_PodTemplateSpec_To_core_PodTemplateSpec(*in, *out, s); err != nil {
+ return err
+ }
+ } else {
+ out.Template = nil
+ }
+ return nil
+}
+
+func autoConvert_core_ReplicationControllerSpec_To_v1_ReplicationControllerSpec(in *core.ReplicationControllerSpec, out *v1.ReplicationControllerSpec, s conversion.Scope) error {
+ if err := meta_v1.Convert_int32_To_Pointer_int32(&in.Replicas, &out.Replicas, s); err != nil {
+ return err
+ }
+ out.MinReadySeconds = in.MinReadySeconds
+ out.Selector = *(*map[string]string)(unsafe.Pointer(&in.Selector))
+ if in.Template != nil {
+ in, out := &in.Template, &out.Template
+ *out = new(v1.PodTemplateSpec)
+ if err := Convert_core_PodTemplateSpec_To_v1_PodTemplateSpec(*in, *out, s); err != nil {
+ return err
+ }
+ } else {
+ out.Template = nil
+ }
+ return nil
+}
+
+func autoConvert_v1_ReplicationControllerStatus_To_core_ReplicationControllerStatus(in *v1.ReplicationControllerStatus, out *core.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
+ out.Conditions = *(*[]core.ReplicationControllerCondition)(unsafe.Pointer(&in.Conditions))
+ return nil
+}
+
+// Convert_v1_ReplicationControllerStatus_To_core_ReplicationControllerStatus is an autogenerated conversion function.
+func Convert_v1_ReplicationControllerStatus_To_core_ReplicationControllerStatus(in *v1.ReplicationControllerStatus, out *core.ReplicationControllerStatus, s conversion.Scope) error {
+ return autoConvert_v1_ReplicationControllerStatus_To_core_ReplicationControllerStatus(in, out, s)
+}
+
+func autoConvert_core_ReplicationControllerStatus_To_v1_ReplicationControllerStatus(in *core.ReplicationControllerStatus, 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
+ out.Conditions = *(*[]v1.ReplicationControllerCondition)(unsafe.Pointer(&in.Conditions))
+ return nil
+}
+
+// Convert_core_ReplicationControllerStatus_To_v1_ReplicationControllerStatus is an autogenerated conversion function.
+func Convert_core_ReplicationControllerStatus_To_v1_ReplicationControllerStatus(in *core.ReplicationControllerStatus, out *v1.ReplicationControllerStatus, s conversion.Scope) error {
+ return autoConvert_core_ReplicationControllerStatus_To_v1_ReplicationControllerStatus(in, out, s)
+}
+
+func autoConvert_v1_ResourceFieldSelector_To_core_ResourceFieldSelector(in *v1.ResourceFieldSelector, out *core.ResourceFieldSelector, s conversion.Scope) error {
+ out.ContainerName = in.ContainerName
+ out.Resource = in.Resource
+ out.Divisor = in.Divisor
+ return nil
+}
+
+// Convert_v1_ResourceFieldSelector_To_core_ResourceFieldSelector is an autogenerated conversion function.
+func Convert_v1_ResourceFieldSelector_To_core_ResourceFieldSelector(in *v1.ResourceFieldSelector, out *core.ResourceFieldSelector, s conversion.Scope) error {
+ return autoConvert_v1_ResourceFieldSelector_To_core_ResourceFieldSelector(in, out, s)
+}
+
+func autoConvert_core_ResourceFieldSelector_To_v1_ResourceFieldSelector(in *core.ResourceFieldSelector, out *v1.ResourceFieldSelector, s conversion.Scope) error {
+ out.ContainerName = in.ContainerName
+ out.Resource = in.Resource
+ out.Divisor = in.Divisor
+ return nil
+}
+
+// Convert_core_ResourceFieldSelector_To_v1_ResourceFieldSelector is an autogenerated conversion function.
+func Convert_core_ResourceFieldSelector_To_v1_ResourceFieldSelector(in *core.ResourceFieldSelector, out *v1.ResourceFieldSelector, s conversion.Scope) error {
+ return autoConvert_core_ResourceFieldSelector_To_v1_ResourceFieldSelector(in, out, s)
+}
+
+func autoConvert_v1_ResourceQuota_To_core_ResourceQuota(in *v1.ResourceQuota, out *core.ResourceQuota, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_ResourceQuotaSpec_To_core_ResourceQuotaSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_v1_ResourceQuotaStatus_To_core_ResourceQuotaStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_ResourceQuota_To_core_ResourceQuota is an autogenerated conversion function.
+func Convert_v1_ResourceQuota_To_core_ResourceQuota(in *v1.ResourceQuota, out *core.ResourceQuota, s conversion.Scope) error {
+ return autoConvert_v1_ResourceQuota_To_core_ResourceQuota(in, out, s)
+}
+
+func autoConvert_core_ResourceQuota_To_v1_ResourceQuota(in *core.ResourceQuota, out *v1.ResourceQuota, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_ResourceQuotaSpec_To_v1_ResourceQuotaSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_core_ResourceQuotaStatus_To_v1_ResourceQuotaStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_ResourceQuota_To_v1_ResourceQuota is an autogenerated conversion function.
+func Convert_core_ResourceQuota_To_v1_ResourceQuota(in *core.ResourceQuota, out *v1.ResourceQuota, s conversion.Scope) error {
+ return autoConvert_core_ResourceQuota_To_v1_ResourceQuota(in, out, s)
+}
+
+func autoConvert_v1_ResourceQuotaList_To_core_ResourceQuotaList(in *v1.ResourceQuotaList, out *core.ResourceQuotaList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]core.ResourceQuota)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_v1_ResourceQuotaList_To_core_ResourceQuotaList is an autogenerated conversion function.
+func Convert_v1_ResourceQuotaList_To_core_ResourceQuotaList(in *v1.ResourceQuotaList, out *core.ResourceQuotaList, s conversion.Scope) error {
+ return autoConvert_v1_ResourceQuotaList_To_core_ResourceQuotaList(in, out, s)
+}
+
+func autoConvert_core_ResourceQuotaList_To_v1_ResourceQuotaList(in *core.ResourceQuotaList, out *v1.ResourceQuotaList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]v1.ResourceQuota)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_core_ResourceQuotaList_To_v1_ResourceQuotaList is an autogenerated conversion function.
+func Convert_core_ResourceQuotaList_To_v1_ResourceQuotaList(in *core.ResourceQuotaList, out *v1.ResourceQuotaList, s conversion.Scope) error {
+ return autoConvert_core_ResourceQuotaList_To_v1_ResourceQuotaList(in, out, s)
+}
+
+func autoConvert_v1_ResourceQuotaSpec_To_core_ResourceQuotaSpec(in *v1.ResourceQuotaSpec, out *core.ResourceQuotaSpec, s conversion.Scope) error {
+ out.Hard = *(*core.ResourceList)(unsafe.Pointer(&in.Hard))
+ out.Scopes = *(*[]core.ResourceQuotaScope)(unsafe.Pointer(&in.Scopes))
+ return nil
+}
+
+// Convert_v1_ResourceQuotaSpec_To_core_ResourceQuotaSpec is an autogenerated conversion function.
+func Convert_v1_ResourceQuotaSpec_To_core_ResourceQuotaSpec(in *v1.ResourceQuotaSpec, out *core.ResourceQuotaSpec, s conversion.Scope) error {
+ return autoConvert_v1_ResourceQuotaSpec_To_core_ResourceQuotaSpec(in, out, s)
+}
+
+func autoConvert_core_ResourceQuotaSpec_To_v1_ResourceQuotaSpec(in *core.ResourceQuotaSpec, out *v1.ResourceQuotaSpec, s conversion.Scope) error {
+ out.Hard = *(*v1.ResourceList)(unsafe.Pointer(&in.Hard))
+ out.Scopes = *(*[]v1.ResourceQuotaScope)(unsafe.Pointer(&in.Scopes))
+ return nil
+}
+
+// Convert_core_ResourceQuotaSpec_To_v1_ResourceQuotaSpec is an autogenerated conversion function.
+func Convert_core_ResourceQuotaSpec_To_v1_ResourceQuotaSpec(in *core.ResourceQuotaSpec, out *v1.ResourceQuotaSpec, s conversion.Scope) error {
+ return autoConvert_core_ResourceQuotaSpec_To_v1_ResourceQuotaSpec(in, out, s)
+}
+
+func autoConvert_v1_ResourceQuotaStatus_To_core_ResourceQuotaStatus(in *v1.ResourceQuotaStatus, out *core.ResourceQuotaStatus, s conversion.Scope) error {
+ out.Hard = *(*core.ResourceList)(unsafe.Pointer(&in.Hard))
+ out.Used = *(*core.ResourceList)(unsafe.Pointer(&in.Used))
+ return nil
+}
+
+// Convert_v1_ResourceQuotaStatus_To_core_ResourceQuotaStatus is an autogenerated conversion function.
+func Convert_v1_ResourceQuotaStatus_To_core_ResourceQuotaStatus(in *v1.ResourceQuotaStatus, out *core.ResourceQuotaStatus, s conversion.Scope) error {
+ return autoConvert_v1_ResourceQuotaStatus_To_core_ResourceQuotaStatus(in, out, s)
+}
+
+func autoConvert_core_ResourceQuotaStatus_To_v1_ResourceQuotaStatus(in *core.ResourceQuotaStatus, out *v1.ResourceQuotaStatus, s conversion.Scope) error {
+ out.Hard = *(*v1.ResourceList)(unsafe.Pointer(&in.Hard))
+ out.Used = *(*v1.ResourceList)(unsafe.Pointer(&in.Used))
+ return nil
+}
+
+// Convert_core_ResourceQuotaStatus_To_v1_ResourceQuotaStatus is an autogenerated conversion function.
+func Convert_core_ResourceQuotaStatus_To_v1_ResourceQuotaStatus(in *core.ResourceQuotaStatus, out *v1.ResourceQuotaStatus, s conversion.Scope) error {
+ return autoConvert_core_ResourceQuotaStatus_To_v1_ResourceQuotaStatus(in, out, s)
+}
+
+func autoConvert_v1_ResourceRequirements_To_core_ResourceRequirements(in *v1.ResourceRequirements, out *core.ResourceRequirements, s conversion.Scope) error {
+ out.Limits = *(*core.ResourceList)(unsafe.Pointer(&in.Limits))
+ out.Requests = *(*core.ResourceList)(unsafe.Pointer(&in.Requests))
+ return nil
+}
+
+// Convert_v1_ResourceRequirements_To_core_ResourceRequirements is an autogenerated conversion function.
+func Convert_v1_ResourceRequirements_To_core_ResourceRequirements(in *v1.ResourceRequirements, out *core.ResourceRequirements, s conversion.Scope) error {
+ return autoConvert_v1_ResourceRequirements_To_core_ResourceRequirements(in, out, s)
+}
+
+func autoConvert_core_ResourceRequirements_To_v1_ResourceRequirements(in *core.ResourceRequirements, out *v1.ResourceRequirements, s conversion.Scope) error {
+ out.Limits = *(*v1.ResourceList)(unsafe.Pointer(&in.Limits))
+ out.Requests = *(*v1.ResourceList)(unsafe.Pointer(&in.Requests))
+ return nil
+}
+
+// Convert_core_ResourceRequirements_To_v1_ResourceRequirements is an autogenerated conversion function.
+func Convert_core_ResourceRequirements_To_v1_ResourceRequirements(in *core.ResourceRequirements, out *v1.ResourceRequirements, s conversion.Scope) error {
+ return autoConvert_core_ResourceRequirements_To_v1_ResourceRequirements(in, out, s)
+}
+
+func autoConvert_v1_SELinuxOptions_To_core_SELinuxOptions(in *v1.SELinuxOptions, out *core.SELinuxOptions, s conversion.Scope) error {
+ out.User = in.User
+ out.Role = in.Role
+ out.Type = in.Type
+ out.Level = in.Level
+ return nil
+}
+
+// Convert_v1_SELinuxOptions_To_core_SELinuxOptions is an autogenerated conversion function.
+func Convert_v1_SELinuxOptions_To_core_SELinuxOptions(in *v1.SELinuxOptions, out *core.SELinuxOptions, s conversion.Scope) error {
+ return autoConvert_v1_SELinuxOptions_To_core_SELinuxOptions(in, out, s)
+}
+
+func autoConvert_core_SELinuxOptions_To_v1_SELinuxOptions(in *core.SELinuxOptions, out *v1.SELinuxOptions, s conversion.Scope) error {
+ out.User = in.User
+ out.Role = in.Role
+ out.Type = in.Type
+ out.Level = in.Level
+ return nil
+}
+
+// Convert_core_SELinuxOptions_To_v1_SELinuxOptions is an autogenerated conversion function.
+func Convert_core_SELinuxOptions_To_v1_SELinuxOptions(in *core.SELinuxOptions, out *v1.SELinuxOptions, s conversion.Scope) error {
+ return autoConvert_core_SELinuxOptions_To_v1_SELinuxOptions(in, out, s)
+}
+
+func autoConvert_v1_ScaleIOPersistentVolumeSource_To_core_ScaleIOPersistentVolumeSource(in *v1.ScaleIOPersistentVolumeSource, out *core.ScaleIOPersistentVolumeSource, s conversion.Scope) error {
+ out.Gateway = in.Gateway
+ out.System = in.System
+ out.SecretRef = (*core.SecretReference)(unsafe.Pointer(in.SecretRef))
+ out.SSLEnabled = in.SSLEnabled
+ out.ProtectionDomain = in.ProtectionDomain
+ out.StoragePool = in.StoragePool
+ out.StorageMode = in.StorageMode
+ out.VolumeName = in.VolumeName
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_ScaleIOPersistentVolumeSource_To_core_ScaleIOPersistentVolumeSource is an autogenerated conversion function.
+func Convert_v1_ScaleIOPersistentVolumeSource_To_core_ScaleIOPersistentVolumeSource(in *v1.ScaleIOPersistentVolumeSource, out *core.ScaleIOPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_ScaleIOPersistentVolumeSource_To_core_ScaleIOPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_core_ScaleIOPersistentVolumeSource_To_v1_ScaleIOPersistentVolumeSource(in *core.ScaleIOPersistentVolumeSource, out *v1.ScaleIOPersistentVolumeSource, s conversion.Scope) error {
+ out.Gateway = in.Gateway
+ out.System = in.System
+ out.SecretRef = (*v1.SecretReference)(unsafe.Pointer(in.SecretRef))
+ out.SSLEnabled = in.SSLEnabled
+ out.ProtectionDomain = in.ProtectionDomain
+ out.StoragePool = in.StoragePool
+ out.StorageMode = in.StorageMode
+ out.VolumeName = in.VolumeName
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_ScaleIOPersistentVolumeSource_To_v1_ScaleIOPersistentVolumeSource is an autogenerated conversion function.
+func Convert_core_ScaleIOPersistentVolumeSource_To_v1_ScaleIOPersistentVolumeSource(in *core.ScaleIOPersistentVolumeSource, out *v1.ScaleIOPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_ScaleIOPersistentVolumeSource_To_v1_ScaleIOPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_ScaleIOVolumeSource_To_core_ScaleIOVolumeSource(in *v1.ScaleIOVolumeSource, out *core.ScaleIOVolumeSource, s conversion.Scope) error {
+ out.Gateway = in.Gateway
+ out.System = in.System
+ out.SecretRef = (*core.LocalObjectReference)(unsafe.Pointer(in.SecretRef))
+ out.SSLEnabled = in.SSLEnabled
+ out.ProtectionDomain = in.ProtectionDomain
+ out.StoragePool = in.StoragePool
+ out.StorageMode = in.StorageMode
+ out.VolumeName = in.VolumeName
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_v1_ScaleIOVolumeSource_To_core_ScaleIOVolumeSource is an autogenerated conversion function.
+func Convert_v1_ScaleIOVolumeSource_To_core_ScaleIOVolumeSource(in *v1.ScaleIOVolumeSource, out *core.ScaleIOVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_ScaleIOVolumeSource_To_core_ScaleIOVolumeSource(in, out, s)
+}
+
+func autoConvert_core_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource(in *core.ScaleIOVolumeSource, out *v1.ScaleIOVolumeSource, s conversion.Scope) error {
+ out.Gateway = in.Gateway
+ out.System = in.System
+ out.SecretRef = (*v1.LocalObjectReference)(unsafe.Pointer(in.SecretRef))
+ out.SSLEnabled = in.SSLEnabled
+ out.ProtectionDomain = in.ProtectionDomain
+ out.StoragePool = in.StoragePool
+ out.StorageMode = in.StorageMode
+ out.VolumeName = in.VolumeName
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ return nil
+}
+
+// Convert_core_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource is an autogenerated conversion function.
+func Convert_core_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource(in *core.ScaleIOVolumeSource, out *v1.ScaleIOVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_Secret_To_core_Secret(in *v1.Secret, out *core.Secret, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ out.Data = *(*map[string][]byte)(unsafe.Pointer(&in.Data))
+ // INFO: in.StringData opted out of conversion generation
+ out.Type = core.SecretType(in.Type)
+ return nil
+}
+
+func autoConvert_core_Secret_To_v1_Secret(in *core.Secret, out *v1.Secret, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ out.Data = *(*map[string][]byte)(unsafe.Pointer(&in.Data))
+ out.Type = v1.SecretType(in.Type)
+ return nil
+}
+
+// Convert_core_Secret_To_v1_Secret is an autogenerated conversion function.
+func Convert_core_Secret_To_v1_Secret(in *core.Secret, out *v1.Secret, s conversion.Scope) error {
+ return autoConvert_core_Secret_To_v1_Secret(in, out, s)
+}
+
+func autoConvert_v1_SecretEnvSource_To_core_SecretEnvSource(in *v1.SecretEnvSource, out *core.SecretEnvSource, s conversion.Scope) error {
+ if err := Convert_v1_LocalObjectReference_To_core_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_v1_SecretEnvSource_To_core_SecretEnvSource is an autogenerated conversion function.
+func Convert_v1_SecretEnvSource_To_core_SecretEnvSource(in *v1.SecretEnvSource, out *core.SecretEnvSource, s conversion.Scope) error {
+ return autoConvert_v1_SecretEnvSource_To_core_SecretEnvSource(in, out, s)
+}
+
+func autoConvert_core_SecretEnvSource_To_v1_SecretEnvSource(in *core.SecretEnvSource, out *v1.SecretEnvSource, s conversion.Scope) error {
+ if err := Convert_core_LocalObjectReference_To_v1_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_core_SecretEnvSource_To_v1_SecretEnvSource is an autogenerated conversion function.
+func Convert_core_SecretEnvSource_To_v1_SecretEnvSource(in *core.SecretEnvSource, out *v1.SecretEnvSource, s conversion.Scope) error {
+ return autoConvert_core_SecretEnvSource_To_v1_SecretEnvSource(in, out, s)
+}
+
+func autoConvert_v1_SecretKeySelector_To_core_SecretKeySelector(in *v1.SecretKeySelector, out *core.SecretKeySelector, s conversion.Scope) error {
+ if err := Convert_v1_LocalObjectReference_To_core_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Key = in.Key
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_v1_SecretKeySelector_To_core_SecretKeySelector is an autogenerated conversion function.
+func Convert_v1_SecretKeySelector_To_core_SecretKeySelector(in *v1.SecretKeySelector, out *core.SecretKeySelector, s conversion.Scope) error {
+ return autoConvert_v1_SecretKeySelector_To_core_SecretKeySelector(in, out, s)
+}
+
+func autoConvert_core_SecretKeySelector_To_v1_SecretKeySelector(in *core.SecretKeySelector, out *v1.SecretKeySelector, s conversion.Scope) error {
+ if err := Convert_core_LocalObjectReference_To_v1_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Key = in.Key
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_core_SecretKeySelector_To_v1_SecretKeySelector is an autogenerated conversion function.
+func Convert_core_SecretKeySelector_To_v1_SecretKeySelector(in *core.SecretKeySelector, out *v1.SecretKeySelector, s conversion.Scope) error {
+ return autoConvert_core_SecretKeySelector_To_v1_SecretKeySelector(in, out, s)
+}
+
+func autoConvert_v1_SecretList_To_core_SecretList(in *v1.SecretList, out *core.SecretList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]core.Secret, len(*in))
+ for i := range *in {
+ if err := Convert_v1_Secret_To_core_Secret(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_v1_SecretList_To_core_SecretList is an autogenerated conversion function.
+func Convert_v1_SecretList_To_core_SecretList(in *v1.SecretList, out *core.SecretList, s conversion.Scope) error {
+ return autoConvert_v1_SecretList_To_core_SecretList(in, out, s)
+}
+
+func autoConvert_core_SecretList_To_v1_SecretList(in *core.SecretList, out *v1.SecretList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]v1.Secret, len(*in))
+ for i := range *in {
+ if err := Convert_core_Secret_To_v1_Secret(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_core_SecretList_To_v1_SecretList is an autogenerated conversion function.
+func Convert_core_SecretList_To_v1_SecretList(in *core.SecretList, out *v1.SecretList, s conversion.Scope) error {
+ return autoConvert_core_SecretList_To_v1_SecretList(in, out, s)
+}
+
+func autoConvert_v1_SecretProjection_To_core_SecretProjection(in *v1.SecretProjection, out *core.SecretProjection, s conversion.Scope) error {
+ if err := Convert_v1_LocalObjectReference_To_core_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Items = *(*[]core.KeyToPath)(unsafe.Pointer(&in.Items))
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_v1_SecretProjection_To_core_SecretProjection is an autogenerated conversion function.
+func Convert_v1_SecretProjection_To_core_SecretProjection(in *v1.SecretProjection, out *core.SecretProjection, s conversion.Scope) error {
+ return autoConvert_v1_SecretProjection_To_core_SecretProjection(in, out, s)
+}
+
+func autoConvert_core_SecretProjection_To_v1_SecretProjection(in *core.SecretProjection, out *v1.SecretProjection, s conversion.Scope) error {
+ if err := Convert_core_LocalObjectReference_To_v1_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
+ return err
+ }
+ out.Items = *(*[]v1.KeyToPath)(unsafe.Pointer(&in.Items))
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_core_SecretProjection_To_v1_SecretProjection is an autogenerated conversion function.
+func Convert_core_SecretProjection_To_v1_SecretProjection(in *core.SecretProjection, out *v1.SecretProjection, s conversion.Scope) error {
+ return autoConvert_core_SecretProjection_To_v1_SecretProjection(in, out, s)
+}
+
+func autoConvert_v1_SecretReference_To_core_SecretReference(in *v1.SecretReference, out *core.SecretReference, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Namespace = in.Namespace
+ return nil
+}
+
+// Convert_v1_SecretReference_To_core_SecretReference is an autogenerated conversion function.
+func Convert_v1_SecretReference_To_core_SecretReference(in *v1.SecretReference, out *core.SecretReference, s conversion.Scope) error {
+ return autoConvert_v1_SecretReference_To_core_SecretReference(in, out, s)
+}
+
+func autoConvert_core_SecretReference_To_v1_SecretReference(in *core.SecretReference, out *v1.SecretReference, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Namespace = in.Namespace
+ return nil
+}
+
+// Convert_core_SecretReference_To_v1_SecretReference is an autogenerated conversion function.
+func Convert_core_SecretReference_To_v1_SecretReference(in *core.SecretReference, out *v1.SecretReference, s conversion.Scope) error {
+ return autoConvert_core_SecretReference_To_v1_SecretReference(in, out, s)
+}
+
+func autoConvert_v1_SecretVolumeSource_To_core_SecretVolumeSource(in *v1.SecretVolumeSource, out *core.SecretVolumeSource, s conversion.Scope) error {
+ out.SecretName = in.SecretName
+ out.Items = *(*[]core.KeyToPath)(unsafe.Pointer(&in.Items))
+ out.DefaultMode = (*int32)(unsafe.Pointer(in.DefaultMode))
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_v1_SecretVolumeSource_To_core_SecretVolumeSource is an autogenerated conversion function.
+func Convert_v1_SecretVolumeSource_To_core_SecretVolumeSource(in *v1.SecretVolumeSource, out *core.SecretVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_SecretVolumeSource_To_core_SecretVolumeSource(in, out, s)
+}
+
+func autoConvert_core_SecretVolumeSource_To_v1_SecretVolumeSource(in *core.SecretVolumeSource, out *v1.SecretVolumeSource, s conversion.Scope) error {
+ out.SecretName = in.SecretName
+ out.Items = *(*[]v1.KeyToPath)(unsafe.Pointer(&in.Items))
+ out.DefaultMode = (*int32)(unsafe.Pointer(in.DefaultMode))
+ out.Optional = (*bool)(unsafe.Pointer(in.Optional))
+ return nil
+}
+
+// Convert_core_SecretVolumeSource_To_v1_SecretVolumeSource is an autogenerated conversion function.
+func Convert_core_SecretVolumeSource_To_v1_SecretVolumeSource(in *core.SecretVolumeSource, out *v1.SecretVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_SecretVolumeSource_To_v1_SecretVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_SecurityContext_To_core_SecurityContext(in *v1.SecurityContext, out *core.SecurityContext, s conversion.Scope) error {
+ out.Capabilities = (*core.Capabilities)(unsafe.Pointer(in.Capabilities))
+ out.Privileged = (*bool)(unsafe.Pointer(in.Privileged))
+ out.SELinuxOptions = (*core.SELinuxOptions)(unsafe.Pointer(in.SELinuxOptions))
+ out.RunAsUser = (*int64)(unsafe.Pointer(in.RunAsUser))
+ out.RunAsNonRoot = (*bool)(unsafe.Pointer(in.RunAsNonRoot))
+ out.ReadOnlyRootFilesystem = (*bool)(unsafe.Pointer(in.ReadOnlyRootFilesystem))
+ out.AllowPrivilegeEscalation = (*bool)(unsafe.Pointer(in.AllowPrivilegeEscalation))
+ return nil
+}
+
+// Convert_v1_SecurityContext_To_core_SecurityContext is an autogenerated conversion function.
+func Convert_v1_SecurityContext_To_core_SecurityContext(in *v1.SecurityContext, out *core.SecurityContext, s conversion.Scope) error {
+ return autoConvert_v1_SecurityContext_To_core_SecurityContext(in, out, s)
+}
+
+func autoConvert_core_SecurityContext_To_v1_SecurityContext(in *core.SecurityContext, out *v1.SecurityContext, s conversion.Scope) error {
+ out.Capabilities = (*v1.Capabilities)(unsafe.Pointer(in.Capabilities))
+ out.Privileged = (*bool)(unsafe.Pointer(in.Privileged))
+ out.SELinuxOptions = (*v1.SELinuxOptions)(unsafe.Pointer(in.SELinuxOptions))
+ out.RunAsUser = (*int64)(unsafe.Pointer(in.RunAsUser))
+ out.RunAsNonRoot = (*bool)(unsafe.Pointer(in.RunAsNonRoot))
+ out.ReadOnlyRootFilesystem = (*bool)(unsafe.Pointer(in.ReadOnlyRootFilesystem))
+ out.AllowPrivilegeEscalation = (*bool)(unsafe.Pointer(in.AllowPrivilegeEscalation))
+ return nil
+}
+
+func autoConvert_v1_SerializedReference_To_core_SerializedReference(in *v1.SerializedReference, out *core.SerializedReference, s conversion.Scope) error {
+ if err := Convert_v1_ObjectReference_To_core_ObjectReference(&in.Reference, &out.Reference, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_SerializedReference_To_core_SerializedReference is an autogenerated conversion function.
+func Convert_v1_SerializedReference_To_core_SerializedReference(in *v1.SerializedReference, out *core.SerializedReference, s conversion.Scope) error {
+ return autoConvert_v1_SerializedReference_To_core_SerializedReference(in, out, s)
+}
+
+func autoConvert_core_SerializedReference_To_v1_SerializedReference(in *core.SerializedReference, out *v1.SerializedReference, s conversion.Scope) error {
+ if err := Convert_core_ObjectReference_To_v1_ObjectReference(&in.Reference, &out.Reference, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_SerializedReference_To_v1_SerializedReference is an autogenerated conversion function.
+func Convert_core_SerializedReference_To_v1_SerializedReference(in *core.SerializedReference, out *v1.SerializedReference, s conversion.Scope) error {
+ return autoConvert_core_SerializedReference_To_v1_SerializedReference(in, out, s)
+}
+
+func autoConvert_v1_Service_To_core_Service(in *v1.Service, out *core.Service, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_v1_ServiceSpec_To_core_ServiceSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_v1_ServiceStatus_To_core_ServiceStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_Service_To_core_Service is an autogenerated conversion function.
+func Convert_v1_Service_To_core_Service(in *v1.Service, out *core.Service, s conversion.Scope) error {
+ return autoConvert_v1_Service_To_core_Service(in, out, s)
+}
+
+func autoConvert_core_Service_To_v1_Service(in *core.Service, out *v1.Service, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ if err := Convert_core_ServiceSpec_To_v1_ServiceSpec(&in.Spec, &out.Spec, s); err != nil {
+ return err
+ }
+ if err := Convert_core_ServiceStatus_To_v1_ServiceStatus(&in.Status, &out.Status, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_Service_To_v1_Service is an autogenerated conversion function.
+func Convert_core_Service_To_v1_Service(in *core.Service, out *v1.Service, s conversion.Scope) error {
+ return autoConvert_core_Service_To_v1_Service(in, out, s)
+}
+
+func autoConvert_v1_ServiceAccount_To_core_ServiceAccount(in *v1.ServiceAccount, out *core.ServiceAccount, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ out.Secrets = *(*[]core.ObjectReference)(unsafe.Pointer(&in.Secrets))
+ out.ImagePullSecrets = *(*[]core.LocalObjectReference)(unsafe.Pointer(&in.ImagePullSecrets))
+ out.AutomountServiceAccountToken = (*bool)(unsafe.Pointer(in.AutomountServiceAccountToken))
+ return nil
+}
+
+// Convert_v1_ServiceAccount_To_core_ServiceAccount is an autogenerated conversion function.
+func Convert_v1_ServiceAccount_To_core_ServiceAccount(in *v1.ServiceAccount, out *core.ServiceAccount, s conversion.Scope) error {
+ return autoConvert_v1_ServiceAccount_To_core_ServiceAccount(in, out, s)
+}
+
+func autoConvert_core_ServiceAccount_To_v1_ServiceAccount(in *core.ServiceAccount, out *v1.ServiceAccount, s conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+ out.Secrets = *(*[]v1.ObjectReference)(unsafe.Pointer(&in.Secrets))
+ out.ImagePullSecrets = *(*[]v1.LocalObjectReference)(unsafe.Pointer(&in.ImagePullSecrets))
+ out.AutomountServiceAccountToken = (*bool)(unsafe.Pointer(in.AutomountServiceAccountToken))
+ return nil
+}
+
+// Convert_core_ServiceAccount_To_v1_ServiceAccount is an autogenerated conversion function.
+func Convert_core_ServiceAccount_To_v1_ServiceAccount(in *core.ServiceAccount, out *v1.ServiceAccount, s conversion.Scope) error {
+ return autoConvert_core_ServiceAccount_To_v1_ServiceAccount(in, out, s)
+}
+
+func autoConvert_v1_ServiceAccountList_To_core_ServiceAccountList(in *v1.ServiceAccountList, out *core.ServiceAccountList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]core.ServiceAccount)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_v1_ServiceAccountList_To_core_ServiceAccountList is an autogenerated conversion function.
+func Convert_v1_ServiceAccountList_To_core_ServiceAccountList(in *v1.ServiceAccountList, out *core.ServiceAccountList, s conversion.Scope) error {
+ return autoConvert_v1_ServiceAccountList_To_core_ServiceAccountList(in, out, s)
+}
+
+func autoConvert_core_ServiceAccountList_To_v1_ServiceAccountList(in *core.ServiceAccountList, out *v1.ServiceAccountList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ out.Items = *(*[]v1.ServiceAccount)(unsafe.Pointer(&in.Items))
+ return nil
+}
+
+// Convert_core_ServiceAccountList_To_v1_ServiceAccountList is an autogenerated conversion function.
+func Convert_core_ServiceAccountList_To_v1_ServiceAccountList(in *core.ServiceAccountList, out *v1.ServiceAccountList, s conversion.Scope) error {
+ return autoConvert_core_ServiceAccountList_To_v1_ServiceAccountList(in, out, s)
+}
+
+func autoConvert_v1_ServiceList_To_core_ServiceList(in *v1.ServiceList, out *core.ServiceList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]core.Service, len(*in))
+ for i := range *in {
+ if err := Convert_v1_Service_To_core_Service(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_v1_ServiceList_To_core_ServiceList is an autogenerated conversion function.
+func Convert_v1_ServiceList_To_core_ServiceList(in *v1.ServiceList, out *core.ServiceList, s conversion.Scope) error {
+ return autoConvert_v1_ServiceList_To_core_ServiceList(in, out, s)
+}
+
+func autoConvert_core_ServiceList_To_v1_ServiceList(in *core.ServiceList, out *v1.ServiceList, s conversion.Scope) error {
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]v1.Service, len(*in))
+ for i := range *in {
+ if err := Convert_core_Service_To_v1_Service(&(*in)[i], &(*out)[i], s); err != nil {
+ return err
+ }
+ }
+ } else {
+ out.Items = nil
+ }
+ return nil
+}
+
+// Convert_core_ServiceList_To_v1_ServiceList is an autogenerated conversion function.
+func Convert_core_ServiceList_To_v1_ServiceList(in *core.ServiceList, out *v1.ServiceList, s conversion.Scope) error {
+ return autoConvert_core_ServiceList_To_v1_ServiceList(in, out, s)
+}
+
+func autoConvert_v1_ServicePort_To_core_ServicePort(in *v1.ServicePort, out *core.ServicePort, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Protocol = core.Protocol(in.Protocol)
+ out.Port = in.Port
+ out.TargetPort = in.TargetPort
+ out.NodePort = in.NodePort
+ return nil
+}
+
+// Convert_v1_ServicePort_To_core_ServicePort is an autogenerated conversion function.
+func Convert_v1_ServicePort_To_core_ServicePort(in *v1.ServicePort, out *core.ServicePort, s conversion.Scope) error {
+ return autoConvert_v1_ServicePort_To_core_ServicePort(in, out, s)
+}
+
+func autoConvert_core_ServicePort_To_v1_ServicePort(in *core.ServicePort, out *v1.ServicePort, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Protocol = v1.Protocol(in.Protocol)
+ out.Port = in.Port
+ out.TargetPort = in.TargetPort
+ out.NodePort = in.NodePort
+ return nil
+}
+
+// Convert_core_ServicePort_To_v1_ServicePort is an autogenerated conversion function.
+func Convert_core_ServicePort_To_v1_ServicePort(in *core.ServicePort, out *v1.ServicePort, s conversion.Scope) error {
+ return autoConvert_core_ServicePort_To_v1_ServicePort(in, out, s)
+}
+
+func autoConvert_v1_ServiceProxyOptions_To_core_ServiceProxyOptions(in *v1.ServiceProxyOptions, out *core.ServiceProxyOptions, s conversion.Scope) error {
+ out.Path = in.Path
+ return nil
+}
+
+// Convert_v1_ServiceProxyOptions_To_core_ServiceProxyOptions is an autogenerated conversion function.
+func Convert_v1_ServiceProxyOptions_To_core_ServiceProxyOptions(in *v1.ServiceProxyOptions, out *core.ServiceProxyOptions, s conversion.Scope) error {
+ return autoConvert_v1_ServiceProxyOptions_To_core_ServiceProxyOptions(in, out, s)
+}
+
+func autoConvert_core_ServiceProxyOptions_To_v1_ServiceProxyOptions(in *core.ServiceProxyOptions, out *v1.ServiceProxyOptions, s conversion.Scope) error {
+ out.Path = in.Path
+ return nil
+}
+
+// Convert_core_ServiceProxyOptions_To_v1_ServiceProxyOptions is an autogenerated conversion function.
+func Convert_core_ServiceProxyOptions_To_v1_ServiceProxyOptions(in *core.ServiceProxyOptions, out *v1.ServiceProxyOptions, s conversion.Scope) error {
+ return autoConvert_core_ServiceProxyOptions_To_v1_ServiceProxyOptions(in, out, s)
+}
+
+func autoConvert_v1_ServiceSpec_To_core_ServiceSpec(in *v1.ServiceSpec, out *core.ServiceSpec, s conversion.Scope) error {
+ out.Ports = *(*[]core.ServicePort)(unsafe.Pointer(&in.Ports))
+ out.Selector = *(*map[string]string)(unsafe.Pointer(&in.Selector))
+ out.ClusterIP = in.ClusterIP
+ out.Type = core.ServiceType(in.Type)
+ out.ExternalIPs = *(*[]string)(unsafe.Pointer(&in.ExternalIPs))
+ out.SessionAffinity = core.ServiceAffinity(in.SessionAffinity)
+ out.LoadBalancerIP = in.LoadBalancerIP
+ out.LoadBalancerSourceRanges = *(*[]string)(unsafe.Pointer(&in.LoadBalancerSourceRanges))
+ out.ExternalName = in.ExternalName
+ out.ExternalTrafficPolicy = core.ServiceExternalTrafficPolicyType(in.ExternalTrafficPolicy)
+ out.HealthCheckNodePort = in.HealthCheckNodePort
+ out.PublishNotReadyAddresses = in.PublishNotReadyAddresses
+ out.SessionAffinityConfig = (*core.SessionAffinityConfig)(unsafe.Pointer(in.SessionAffinityConfig))
+ return nil
+}
+
+// Convert_v1_ServiceSpec_To_core_ServiceSpec is an autogenerated conversion function.
+func Convert_v1_ServiceSpec_To_core_ServiceSpec(in *v1.ServiceSpec, out *core.ServiceSpec, s conversion.Scope) error {
+ return autoConvert_v1_ServiceSpec_To_core_ServiceSpec(in, out, s)
+}
+
+func autoConvert_core_ServiceSpec_To_v1_ServiceSpec(in *core.ServiceSpec, out *v1.ServiceSpec, s conversion.Scope) error {
+ out.Type = v1.ServiceType(in.Type)
+ out.Ports = *(*[]v1.ServicePort)(unsafe.Pointer(&in.Ports))
+ out.Selector = *(*map[string]string)(unsafe.Pointer(&in.Selector))
+ out.ClusterIP = in.ClusterIP
+ out.ExternalName = in.ExternalName
+ out.ExternalIPs = *(*[]string)(unsafe.Pointer(&in.ExternalIPs))
+ out.LoadBalancerIP = in.LoadBalancerIP
+ out.SessionAffinity = v1.ServiceAffinity(in.SessionAffinity)
+ out.SessionAffinityConfig = (*v1.SessionAffinityConfig)(unsafe.Pointer(in.SessionAffinityConfig))
+ out.LoadBalancerSourceRanges = *(*[]string)(unsafe.Pointer(&in.LoadBalancerSourceRanges))
+ out.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyType(in.ExternalTrafficPolicy)
+ out.HealthCheckNodePort = in.HealthCheckNodePort
+ out.PublishNotReadyAddresses = in.PublishNotReadyAddresses
+ return nil
+}
+
+// Convert_core_ServiceSpec_To_v1_ServiceSpec is an autogenerated conversion function.
+func Convert_core_ServiceSpec_To_v1_ServiceSpec(in *core.ServiceSpec, out *v1.ServiceSpec, s conversion.Scope) error {
+ return autoConvert_core_ServiceSpec_To_v1_ServiceSpec(in, out, s)
+}
+
+func autoConvert_v1_ServiceStatus_To_core_ServiceStatus(in *v1.ServiceStatus, out *core.ServiceStatus, s conversion.Scope) error {
+ if err := Convert_v1_LoadBalancerStatus_To_core_LoadBalancerStatus(&in.LoadBalancer, &out.LoadBalancer, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_ServiceStatus_To_core_ServiceStatus is an autogenerated conversion function.
+func Convert_v1_ServiceStatus_To_core_ServiceStatus(in *v1.ServiceStatus, out *core.ServiceStatus, s conversion.Scope) error {
+ return autoConvert_v1_ServiceStatus_To_core_ServiceStatus(in, out, s)
+}
+
+func autoConvert_core_ServiceStatus_To_v1_ServiceStatus(in *core.ServiceStatus, out *v1.ServiceStatus, s conversion.Scope) error {
+ if err := Convert_core_LoadBalancerStatus_To_v1_LoadBalancerStatus(&in.LoadBalancer, &out.LoadBalancer, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_ServiceStatus_To_v1_ServiceStatus is an autogenerated conversion function.
+func Convert_core_ServiceStatus_To_v1_ServiceStatus(in *core.ServiceStatus, out *v1.ServiceStatus, s conversion.Scope) error {
+ return autoConvert_core_ServiceStatus_To_v1_ServiceStatus(in, out, s)
+}
+
+func autoConvert_v1_SessionAffinityConfig_To_core_SessionAffinityConfig(in *v1.SessionAffinityConfig, out *core.SessionAffinityConfig, s conversion.Scope) error {
+ out.ClientIP = (*core.ClientIPConfig)(unsafe.Pointer(in.ClientIP))
+ return nil
+}
+
+// Convert_v1_SessionAffinityConfig_To_core_SessionAffinityConfig is an autogenerated conversion function.
+func Convert_v1_SessionAffinityConfig_To_core_SessionAffinityConfig(in *v1.SessionAffinityConfig, out *core.SessionAffinityConfig, s conversion.Scope) error {
+ return autoConvert_v1_SessionAffinityConfig_To_core_SessionAffinityConfig(in, out, s)
+}
+
+func autoConvert_core_SessionAffinityConfig_To_v1_SessionAffinityConfig(in *core.SessionAffinityConfig, out *v1.SessionAffinityConfig, s conversion.Scope) error {
+ out.ClientIP = (*v1.ClientIPConfig)(unsafe.Pointer(in.ClientIP))
+ return nil
+}
+
+// Convert_core_SessionAffinityConfig_To_v1_SessionAffinityConfig is an autogenerated conversion function.
+func Convert_core_SessionAffinityConfig_To_v1_SessionAffinityConfig(in *core.SessionAffinityConfig, out *v1.SessionAffinityConfig, s conversion.Scope) error {
+ return autoConvert_core_SessionAffinityConfig_To_v1_SessionAffinityConfig(in, out, s)
+}
+
+func autoConvert_v1_StorageOSPersistentVolumeSource_To_core_StorageOSPersistentVolumeSource(in *v1.StorageOSPersistentVolumeSource, out *core.StorageOSPersistentVolumeSource, s conversion.Scope) error {
+ out.VolumeName = in.VolumeName
+ out.VolumeNamespace = in.VolumeNamespace
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ out.SecretRef = (*core.ObjectReference)(unsafe.Pointer(in.SecretRef))
+ return nil
+}
+
+// Convert_v1_StorageOSPersistentVolumeSource_To_core_StorageOSPersistentVolumeSource is an autogenerated conversion function.
+func Convert_v1_StorageOSPersistentVolumeSource_To_core_StorageOSPersistentVolumeSource(in *v1.StorageOSPersistentVolumeSource, out *core.StorageOSPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_StorageOSPersistentVolumeSource_To_core_StorageOSPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_core_StorageOSPersistentVolumeSource_To_v1_StorageOSPersistentVolumeSource(in *core.StorageOSPersistentVolumeSource, out *v1.StorageOSPersistentVolumeSource, s conversion.Scope) error {
+ out.VolumeName = in.VolumeName
+ out.VolumeNamespace = in.VolumeNamespace
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ out.SecretRef = (*v1.ObjectReference)(unsafe.Pointer(in.SecretRef))
+ return nil
+}
+
+// Convert_core_StorageOSPersistentVolumeSource_To_v1_StorageOSPersistentVolumeSource is an autogenerated conversion function.
+func Convert_core_StorageOSPersistentVolumeSource_To_v1_StorageOSPersistentVolumeSource(in *core.StorageOSPersistentVolumeSource, out *v1.StorageOSPersistentVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_StorageOSPersistentVolumeSource_To_v1_StorageOSPersistentVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_StorageOSVolumeSource_To_core_StorageOSVolumeSource(in *v1.StorageOSVolumeSource, out *core.StorageOSVolumeSource, s conversion.Scope) error {
+ out.VolumeName = in.VolumeName
+ out.VolumeNamespace = in.VolumeNamespace
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ out.SecretRef = (*core.LocalObjectReference)(unsafe.Pointer(in.SecretRef))
+ return nil
+}
+
+// Convert_v1_StorageOSVolumeSource_To_core_StorageOSVolumeSource is an autogenerated conversion function.
+func Convert_v1_StorageOSVolumeSource_To_core_StorageOSVolumeSource(in *v1.StorageOSVolumeSource, out *core.StorageOSVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_StorageOSVolumeSource_To_core_StorageOSVolumeSource(in, out, s)
+}
+
+func autoConvert_core_StorageOSVolumeSource_To_v1_StorageOSVolumeSource(in *core.StorageOSVolumeSource, out *v1.StorageOSVolumeSource, s conversion.Scope) error {
+ out.VolumeName = in.VolumeName
+ out.VolumeNamespace = in.VolumeNamespace
+ out.FSType = in.FSType
+ out.ReadOnly = in.ReadOnly
+ out.SecretRef = (*v1.LocalObjectReference)(unsafe.Pointer(in.SecretRef))
+ return nil
+}
+
+// Convert_core_StorageOSVolumeSource_To_v1_StorageOSVolumeSource is an autogenerated conversion function.
+func Convert_core_StorageOSVolumeSource_To_v1_StorageOSVolumeSource(in *core.StorageOSVolumeSource, out *v1.StorageOSVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_StorageOSVolumeSource_To_v1_StorageOSVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_Sysctl_To_core_Sysctl(in *v1.Sysctl, out *core.Sysctl, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Value = in.Value
+ return nil
+}
+
+// Convert_v1_Sysctl_To_core_Sysctl is an autogenerated conversion function.
+func Convert_v1_Sysctl_To_core_Sysctl(in *v1.Sysctl, out *core.Sysctl, s conversion.Scope) error {
+ return autoConvert_v1_Sysctl_To_core_Sysctl(in, out, s)
+}
+
+func autoConvert_core_Sysctl_To_v1_Sysctl(in *core.Sysctl, out *v1.Sysctl, s conversion.Scope) error {
+ out.Name = in.Name
+ out.Value = in.Value
+ return nil
+}
+
+// Convert_core_Sysctl_To_v1_Sysctl is an autogenerated conversion function.
+func Convert_core_Sysctl_To_v1_Sysctl(in *core.Sysctl, out *v1.Sysctl, s conversion.Scope) error {
+ return autoConvert_core_Sysctl_To_v1_Sysctl(in, out, s)
+}
+
+func autoConvert_v1_TCPSocketAction_To_core_TCPSocketAction(in *v1.TCPSocketAction, out *core.TCPSocketAction, s conversion.Scope) error {
+ out.Port = in.Port
+ out.Host = in.Host
+ return nil
+}
+
+// Convert_v1_TCPSocketAction_To_core_TCPSocketAction is an autogenerated conversion function.
+func Convert_v1_TCPSocketAction_To_core_TCPSocketAction(in *v1.TCPSocketAction, out *core.TCPSocketAction, s conversion.Scope) error {
+ return autoConvert_v1_TCPSocketAction_To_core_TCPSocketAction(in, out, s)
+}
+
+func autoConvert_core_TCPSocketAction_To_v1_TCPSocketAction(in *core.TCPSocketAction, out *v1.TCPSocketAction, s conversion.Scope) error {
+ out.Port = in.Port
+ out.Host = in.Host
+ return nil
+}
+
+// Convert_core_TCPSocketAction_To_v1_TCPSocketAction is an autogenerated conversion function.
+func Convert_core_TCPSocketAction_To_v1_TCPSocketAction(in *core.TCPSocketAction, out *v1.TCPSocketAction, s conversion.Scope) error {
+ return autoConvert_core_TCPSocketAction_To_v1_TCPSocketAction(in, out, s)
+}
+
+func autoConvert_v1_Taint_To_core_Taint(in *v1.Taint, out *core.Taint, s conversion.Scope) error {
+ out.Key = in.Key
+ out.Value = in.Value
+ out.Effect = core.TaintEffect(in.Effect)
+ out.TimeAdded = (*meta_v1.Time)(unsafe.Pointer(in.TimeAdded))
+ return nil
+}
+
+// Convert_v1_Taint_To_core_Taint is an autogenerated conversion function.
+func Convert_v1_Taint_To_core_Taint(in *v1.Taint, out *core.Taint, s conversion.Scope) error {
+ return autoConvert_v1_Taint_To_core_Taint(in, out, s)
+}
+
+func autoConvert_core_Taint_To_v1_Taint(in *core.Taint, out *v1.Taint, s conversion.Scope) error {
+ out.Key = in.Key
+ out.Value = in.Value
+ out.Effect = v1.TaintEffect(in.Effect)
+ out.TimeAdded = (*meta_v1.Time)(unsafe.Pointer(in.TimeAdded))
+ return nil
+}
+
+// Convert_core_Taint_To_v1_Taint is an autogenerated conversion function.
+func Convert_core_Taint_To_v1_Taint(in *core.Taint, out *v1.Taint, s conversion.Scope) error {
+ return autoConvert_core_Taint_To_v1_Taint(in, out, s)
+}
+
+func autoConvert_v1_Toleration_To_core_Toleration(in *v1.Toleration, out *core.Toleration, s conversion.Scope) error {
+ out.Key = in.Key
+ out.Operator = core.TolerationOperator(in.Operator)
+ out.Value = in.Value
+ out.Effect = core.TaintEffect(in.Effect)
+ out.TolerationSeconds = (*int64)(unsafe.Pointer(in.TolerationSeconds))
+ return nil
+}
+
+// Convert_v1_Toleration_To_core_Toleration is an autogenerated conversion function.
+func Convert_v1_Toleration_To_core_Toleration(in *v1.Toleration, out *core.Toleration, s conversion.Scope) error {
+ return autoConvert_v1_Toleration_To_core_Toleration(in, out, s)
+}
+
+func autoConvert_core_Toleration_To_v1_Toleration(in *core.Toleration, out *v1.Toleration, s conversion.Scope) error {
+ out.Key = in.Key
+ out.Operator = v1.TolerationOperator(in.Operator)
+ out.Value = in.Value
+ out.Effect = v1.TaintEffect(in.Effect)
+ out.TolerationSeconds = (*int64)(unsafe.Pointer(in.TolerationSeconds))
+ return nil
+}
+
+// Convert_core_Toleration_To_v1_Toleration is an autogenerated conversion function.
+func Convert_core_Toleration_To_v1_Toleration(in *core.Toleration, out *v1.Toleration, s conversion.Scope) error {
+ return autoConvert_core_Toleration_To_v1_Toleration(in, out, s)
+}
+
+func autoConvert_v1_Volume_To_core_Volume(in *v1.Volume, out *core.Volume, s conversion.Scope) error {
+ out.Name = in.Name
+ if err := Convert_v1_VolumeSource_To_core_VolumeSource(&in.VolumeSource, &out.VolumeSource, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_Volume_To_core_Volume is an autogenerated conversion function.
+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)
+}
+
+func autoConvert_core_Volume_To_v1_Volume(in *core.Volume, out *v1.Volume, s conversion.Scope) error {
+ out.Name = in.Name
+ if err := Convert_core_VolumeSource_To_v1_VolumeSource(&in.VolumeSource, &out.VolumeSource, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_Volume_To_v1_Volume is an autogenerated conversion function.
+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)
+}
+
+func autoConvert_v1_VolumeDevice_To_core_VolumeDevice(in *v1.VolumeDevice, out *core.VolumeDevice, s conversion.Scope) error {
+ out.Name = in.Name
+ out.DevicePath = in.DevicePath
+ return nil
+}
+
+// Convert_v1_VolumeDevice_To_core_VolumeDevice is an autogenerated conversion function.
+func Convert_v1_VolumeDevice_To_core_VolumeDevice(in *v1.VolumeDevice, out *core.VolumeDevice, s conversion.Scope) error {
+ return autoConvert_v1_VolumeDevice_To_core_VolumeDevice(in, out, s)
+}
+
+func autoConvert_core_VolumeDevice_To_v1_VolumeDevice(in *core.VolumeDevice, out *v1.VolumeDevice, s conversion.Scope) error {
+ out.Name = in.Name
+ out.DevicePath = in.DevicePath
+ return nil
+}
+
+// Convert_core_VolumeDevice_To_v1_VolumeDevice is an autogenerated conversion function.
+func Convert_core_VolumeDevice_To_v1_VolumeDevice(in *core.VolumeDevice, out *v1.VolumeDevice, s conversion.Scope) error {
+ return autoConvert_core_VolumeDevice_To_v1_VolumeDevice(in, out, s)
+}
+
+func autoConvert_v1_VolumeMount_To_core_VolumeMount(in *v1.VolumeMount, out *core.VolumeMount, s conversion.Scope) error {
+ out.Name = in.Name
+ out.ReadOnly = in.ReadOnly
+ out.MountPath = in.MountPath
+ out.SubPath = in.SubPath
+ out.MountPropagation = (*core.MountPropagationMode)(unsafe.Pointer(in.MountPropagation))
+ return nil
+}
+
+// Convert_v1_VolumeMount_To_core_VolumeMount is an autogenerated conversion function.
+func Convert_v1_VolumeMount_To_core_VolumeMount(in *v1.VolumeMount, out *core.VolumeMount, s conversion.Scope) error {
+ return autoConvert_v1_VolumeMount_To_core_VolumeMount(in, out, s)
+}
+
+func autoConvert_core_VolumeMount_To_v1_VolumeMount(in *core.VolumeMount, out *v1.VolumeMount, s conversion.Scope) error {
+ out.Name = in.Name
+ out.ReadOnly = in.ReadOnly
+ out.MountPath = in.MountPath
+ out.SubPath = in.SubPath
+ out.MountPropagation = (*v1.MountPropagationMode)(unsafe.Pointer(in.MountPropagation))
+ return nil
+}
+
+// Convert_core_VolumeMount_To_v1_VolumeMount is an autogenerated conversion function.
+func Convert_core_VolumeMount_To_v1_VolumeMount(in *core.VolumeMount, out *v1.VolumeMount, s conversion.Scope) error {
+ return autoConvert_core_VolumeMount_To_v1_VolumeMount(in, out, s)
+}
+
+func autoConvert_v1_VolumeNodeAffinity_To_core_VolumeNodeAffinity(in *v1.VolumeNodeAffinity, out *core.VolumeNodeAffinity, s conversion.Scope) error {
+ out.Required = (*core.NodeSelector)(unsafe.Pointer(in.Required))
+ return nil
+}
+
+// Convert_v1_VolumeNodeAffinity_To_core_VolumeNodeAffinity is an autogenerated conversion function.
+func Convert_v1_VolumeNodeAffinity_To_core_VolumeNodeAffinity(in *v1.VolumeNodeAffinity, out *core.VolumeNodeAffinity, s conversion.Scope) error {
+ return autoConvert_v1_VolumeNodeAffinity_To_core_VolumeNodeAffinity(in, out, s)
+}
+
+func autoConvert_core_VolumeNodeAffinity_To_v1_VolumeNodeAffinity(in *core.VolumeNodeAffinity, out *v1.VolumeNodeAffinity, s conversion.Scope) error {
+ out.Required = (*v1.NodeSelector)(unsafe.Pointer(in.Required))
+ return nil
+}
+
+// Convert_core_VolumeNodeAffinity_To_v1_VolumeNodeAffinity is an autogenerated conversion function.
+func Convert_core_VolumeNodeAffinity_To_v1_VolumeNodeAffinity(in *core.VolumeNodeAffinity, out *v1.VolumeNodeAffinity, s conversion.Scope) error {
+ return autoConvert_core_VolumeNodeAffinity_To_v1_VolumeNodeAffinity(in, out, s)
+}
+
+func autoConvert_v1_VolumeProjection_To_core_VolumeProjection(in *v1.VolumeProjection, out *core.VolumeProjection, s conversion.Scope) error {
+ out.Secret = (*core.SecretProjection)(unsafe.Pointer(in.Secret))
+ out.DownwardAPI = (*core.DownwardAPIProjection)(unsafe.Pointer(in.DownwardAPI))
+ out.ConfigMap = (*core.ConfigMapProjection)(unsafe.Pointer(in.ConfigMap))
+ return nil
+}
+
+// Convert_v1_VolumeProjection_To_core_VolumeProjection is an autogenerated conversion function.
+func Convert_v1_VolumeProjection_To_core_VolumeProjection(in *v1.VolumeProjection, out *core.VolumeProjection, s conversion.Scope) error {
+ return autoConvert_v1_VolumeProjection_To_core_VolumeProjection(in, out, s)
+}
+
+func autoConvert_core_VolumeProjection_To_v1_VolumeProjection(in *core.VolumeProjection, out *v1.VolumeProjection, s conversion.Scope) error {
+ out.Secret = (*v1.SecretProjection)(unsafe.Pointer(in.Secret))
+ out.DownwardAPI = (*v1.DownwardAPIProjection)(unsafe.Pointer(in.DownwardAPI))
+ out.ConfigMap = (*v1.ConfigMapProjection)(unsafe.Pointer(in.ConfigMap))
+ return nil
+}
+
+// Convert_core_VolumeProjection_To_v1_VolumeProjection is an autogenerated conversion function.
+func Convert_core_VolumeProjection_To_v1_VolumeProjection(in *core.VolumeProjection, out *v1.VolumeProjection, s conversion.Scope) error {
+ return autoConvert_core_VolumeProjection_To_v1_VolumeProjection(in, out, s)
+}
+
+func autoConvert_v1_VolumeSource_To_core_VolumeSource(in *v1.VolumeSource, out *core.VolumeSource, s conversion.Scope) error {
+ out.HostPath = (*core.HostPathVolumeSource)(unsafe.Pointer(in.HostPath))
+ out.EmptyDir = (*core.EmptyDirVolumeSource)(unsafe.Pointer(in.EmptyDir))
+ out.GCEPersistentDisk = (*core.GCEPersistentDiskVolumeSource)(unsafe.Pointer(in.GCEPersistentDisk))
+ out.AWSElasticBlockStore = (*core.AWSElasticBlockStoreVolumeSource)(unsafe.Pointer(in.AWSElasticBlockStore))
+ out.GitRepo = (*core.GitRepoVolumeSource)(unsafe.Pointer(in.GitRepo))
+ out.Secret = (*core.SecretVolumeSource)(unsafe.Pointer(in.Secret))
+ out.NFS = (*core.NFSVolumeSource)(unsafe.Pointer(in.NFS))
+ out.ISCSI = (*core.ISCSIVolumeSource)(unsafe.Pointer(in.ISCSI))
+ out.Glusterfs = (*core.GlusterfsVolumeSource)(unsafe.Pointer(in.Glusterfs))
+ out.PersistentVolumeClaim = (*core.PersistentVolumeClaimVolumeSource)(unsafe.Pointer(in.PersistentVolumeClaim))
+ out.RBD = (*core.RBDVolumeSource)(unsafe.Pointer(in.RBD))
+ out.FlexVolume = (*core.FlexVolumeSource)(unsafe.Pointer(in.FlexVolume))
+ out.Cinder = (*core.CinderVolumeSource)(unsafe.Pointer(in.Cinder))
+ out.CephFS = (*core.CephFSVolumeSource)(unsafe.Pointer(in.CephFS))
+ out.Flocker = (*core.FlockerVolumeSource)(unsafe.Pointer(in.Flocker))
+ out.DownwardAPI = (*core.DownwardAPIVolumeSource)(unsafe.Pointer(in.DownwardAPI))
+ out.FC = (*core.FCVolumeSource)(unsafe.Pointer(in.FC))
+ out.AzureFile = (*core.AzureFileVolumeSource)(unsafe.Pointer(in.AzureFile))
+ out.ConfigMap = (*core.ConfigMapVolumeSource)(unsafe.Pointer(in.ConfigMap))
+ out.VsphereVolume = (*core.VsphereVirtualDiskVolumeSource)(unsafe.Pointer(in.VsphereVolume))
+ out.Quobyte = (*core.QuobyteVolumeSource)(unsafe.Pointer(in.Quobyte))
+ out.AzureDisk = (*core.AzureDiskVolumeSource)(unsafe.Pointer(in.AzureDisk))
+ out.PhotonPersistentDisk = (*core.PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk))
+ out.Projected = (*core.ProjectedVolumeSource)(unsafe.Pointer(in.Projected))
+ out.PortworxVolume = (*core.PortworxVolumeSource)(unsafe.Pointer(in.PortworxVolume))
+ out.ScaleIO = (*core.ScaleIOVolumeSource)(unsafe.Pointer(in.ScaleIO))
+ out.StorageOS = (*core.StorageOSVolumeSource)(unsafe.Pointer(in.StorageOS))
+ return nil
+}
+
+// Convert_v1_VolumeSource_To_core_VolumeSource is an autogenerated conversion function.
+func Convert_v1_VolumeSource_To_core_VolumeSource(in *v1.VolumeSource, out *core.VolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_VolumeSource_To_core_VolumeSource(in, out, s)
+}
+
+func autoConvert_core_VolumeSource_To_v1_VolumeSource(in *core.VolumeSource, out *v1.VolumeSource, s conversion.Scope) error {
+ out.HostPath = (*v1.HostPathVolumeSource)(unsafe.Pointer(in.HostPath))
+ out.EmptyDir = (*v1.EmptyDirVolumeSource)(unsafe.Pointer(in.EmptyDir))
+ out.GCEPersistentDisk = (*v1.GCEPersistentDiskVolumeSource)(unsafe.Pointer(in.GCEPersistentDisk))
+ out.AWSElasticBlockStore = (*v1.AWSElasticBlockStoreVolumeSource)(unsafe.Pointer(in.AWSElasticBlockStore))
+ out.GitRepo = (*v1.GitRepoVolumeSource)(unsafe.Pointer(in.GitRepo))
+ out.Secret = (*v1.SecretVolumeSource)(unsafe.Pointer(in.Secret))
+ out.NFS = (*v1.NFSVolumeSource)(unsafe.Pointer(in.NFS))
+ out.ISCSI = (*v1.ISCSIVolumeSource)(unsafe.Pointer(in.ISCSI))
+ out.Glusterfs = (*v1.GlusterfsVolumeSource)(unsafe.Pointer(in.Glusterfs))
+ out.PersistentVolumeClaim = (*v1.PersistentVolumeClaimVolumeSource)(unsafe.Pointer(in.PersistentVolumeClaim))
+ out.RBD = (*v1.RBDVolumeSource)(unsafe.Pointer(in.RBD))
+ out.Quobyte = (*v1.QuobyteVolumeSource)(unsafe.Pointer(in.Quobyte))
+ out.FlexVolume = (*v1.FlexVolumeSource)(unsafe.Pointer(in.FlexVolume))
+ out.Cinder = (*v1.CinderVolumeSource)(unsafe.Pointer(in.Cinder))
+ out.CephFS = (*v1.CephFSVolumeSource)(unsafe.Pointer(in.CephFS))
+ out.Flocker = (*v1.FlockerVolumeSource)(unsafe.Pointer(in.Flocker))
+ out.DownwardAPI = (*v1.DownwardAPIVolumeSource)(unsafe.Pointer(in.DownwardAPI))
+ out.FC = (*v1.FCVolumeSource)(unsafe.Pointer(in.FC))
+ out.AzureFile = (*v1.AzureFileVolumeSource)(unsafe.Pointer(in.AzureFile))
+ out.ConfigMap = (*v1.ConfigMapVolumeSource)(unsafe.Pointer(in.ConfigMap))
+ out.VsphereVolume = (*v1.VsphereVirtualDiskVolumeSource)(unsafe.Pointer(in.VsphereVolume))
+ out.AzureDisk = (*v1.AzureDiskVolumeSource)(unsafe.Pointer(in.AzureDisk))
+ out.PhotonPersistentDisk = (*v1.PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk))
+ out.Projected = (*v1.ProjectedVolumeSource)(unsafe.Pointer(in.Projected))
+ out.PortworxVolume = (*v1.PortworxVolumeSource)(unsafe.Pointer(in.PortworxVolume))
+ out.ScaleIO = (*v1.ScaleIOVolumeSource)(unsafe.Pointer(in.ScaleIO))
+ out.StorageOS = (*v1.StorageOSVolumeSource)(unsafe.Pointer(in.StorageOS))
+ return nil
+}
+
+// Convert_core_VolumeSource_To_v1_VolumeSource is an autogenerated conversion function.
+func Convert_core_VolumeSource_To_v1_VolumeSource(in *core.VolumeSource, out *v1.VolumeSource, s conversion.Scope) error {
+ return autoConvert_core_VolumeSource_To_v1_VolumeSource(in, out, s)
+}
+
+func autoConvert_v1_VsphereVirtualDiskVolumeSource_To_core_VsphereVirtualDiskVolumeSource(in *v1.VsphereVirtualDiskVolumeSource, out *core.VsphereVirtualDiskVolumeSource, s conversion.Scope) error {
+ out.VolumePath = in.VolumePath
+ out.FSType = in.FSType
+ out.StoragePolicyName = in.StoragePolicyName
+ out.StoragePolicyID = in.StoragePolicyID
+ return nil
+}
+
+// Convert_v1_VsphereVirtualDiskVolumeSource_To_core_VsphereVirtualDiskVolumeSource is an autogenerated conversion function.
+func Convert_v1_VsphereVirtualDiskVolumeSource_To_core_VsphereVirtualDiskVolumeSource(in *v1.VsphereVirtualDiskVolumeSource, out *core.VsphereVirtualDiskVolumeSource, s conversion.Scope) error {
+ return autoConvert_v1_VsphereVirtualDiskVolumeSource_To_core_VsphereVirtualDiskVolumeSource(in, out, s)
+}
+
+func autoConvert_core_VsphereVirtualDiskVolumeSource_To_v1_VsphereVirtualDiskVolumeSource(in *core.VsphereVirtualDiskVolumeSource, out *v1.VsphereVirtualDiskVolumeSource, s conversion.Scope) error {
+ out.VolumePath = in.VolumePath
+ out.FSType = in.FSType
+ out.StoragePolicyName = in.StoragePolicyName
+ out.StoragePolicyID = in.StoragePolicyID
+ return nil
+}
+
+// Convert_core_VsphereVirtualDiskVolumeSource_To_v1_VsphereVirtualDiskVolumeSource is an autogenerated conversion function.
+func Convert_core_VsphereVirtualDiskVolumeSource_To_v1_VsphereVirtualDiskVolumeSource(in *core.VsphereVirtualDiskVolumeSource, out *v1.VsphereVirtualDiskVolumeSource, s conversion.Scope) error {
+ return autoConvert_core_VsphereVirtualDiskVolumeSource_To_v1_VsphereVirtualDiskVolumeSource(in, out, s)
+}
+
+func autoConvert_v1_WeightedPodAffinityTerm_To_core_WeightedPodAffinityTerm(in *v1.WeightedPodAffinityTerm, out *core.WeightedPodAffinityTerm, s conversion.Scope) error {
+ out.Weight = in.Weight
+ if err := Convert_v1_PodAffinityTerm_To_core_PodAffinityTerm(&in.PodAffinityTerm, &out.PodAffinityTerm, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_v1_WeightedPodAffinityTerm_To_core_WeightedPodAffinityTerm is an autogenerated conversion function.
+func Convert_v1_WeightedPodAffinityTerm_To_core_WeightedPodAffinityTerm(in *v1.WeightedPodAffinityTerm, out *core.WeightedPodAffinityTerm, s conversion.Scope) error {
+ return autoConvert_v1_WeightedPodAffinityTerm_To_core_WeightedPodAffinityTerm(in, out, s)
+}
+
+func autoConvert_core_WeightedPodAffinityTerm_To_v1_WeightedPodAffinityTerm(in *core.WeightedPodAffinityTerm, out *v1.WeightedPodAffinityTerm, s conversion.Scope) error {
+ out.Weight = in.Weight
+ if err := Convert_core_PodAffinityTerm_To_v1_PodAffinityTerm(&in.PodAffinityTerm, &out.PodAffinityTerm, s); err != nil {
+ return err
+ }
+ return nil
+}
+
+// Convert_core_WeightedPodAffinityTerm_To_v1_WeightedPodAffinityTerm is an autogenerated conversion function.
+func Convert_core_WeightedPodAffinityTerm_To_v1_WeightedPodAffinityTerm(in *core.WeightedPodAffinityTerm, out *v1.WeightedPodAffinityTerm, s conversion.Scope) error {
+ return autoConvert_core_WeightedPodAffinityTerm_To_v1_WeightedPodAffinityTerm(in, out, s)
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.defaults.go
new file mode 100644
index 000000000..084c9516b
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.defaults.go
@@ -0,0 +1,638 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright 2018 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.
+*/
+
+// Code generated by defaulter-gen. DO NOT EDIT.
+
+package v1
+
+import (
+ v1 "k8s.io/api/core/v1"
+ runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// RegisterDefaults adds defaulters functions to the given scheme.
+// Public to allow building arbitrary schemes.
+// All generated defaulters are covering - they call all nested defaulters.
+func RegisterDefaults(scheme *runtime.Scheme) error {
+ scheme.AddTypeDefaultingFunc(&v1.ConfigMap{}, func(obj interface{}) { SetObjectDefaults_ConfigMap(obj.(*v1.ConfigMap)) })
+ scheme.AddTypeDefaultingFunc(&v1.ConfigMapList{}, func(obj interface{}) { SetObjectDefaults_ConfigMapList(obj.(*v1.ConfigMapList)) })
+ scheme.AddTypeDefaultingFunc(&v1.Endpoints{}, func(obj interface{}) { SetObjectDefaults_Endpoints(obj.(*v1.Endpoints)) })
+ scheme.AddTypeDefaultingFunc(&v1.EndpointsList{}, func(obj interface{}) { SetObjectDefaults_EndpointsList(obj.(*v1.EndpointsList)) })
+ scheme.AddTypeDefaultingFunc(&v1.LimitRange{}, func(obj interface{}) { SetObjectDefaults_LimitRange(obj.(*v1.LimitRange)) })
+ scheme.AddTypeDefaultingFunc(&v1.LimitRangeList{}, func(obj interface{}) { SetObjectDefaults_LimitRangeList(obj.(*v1.LimitRangeList)) })
+ scheme.AddTypeDefaultingFunc(&v1.Namespace{}, func(obj interface{}) { SetObjectDefaults_Namespace(obj.(*v1.Namespace)) })
+ scheme.AddTypeDefaultingFunc(&v1.NamespaceList{}, func(obj interface{}) { SetObjectDefaults_NamespaceList(obj.(*v1.NamespaceList)) })
+ scheme.AddTypeDefaultingFunc(&v1.Node{}, func(obj interface{}) { SetObjectDefaults_Node(obj.(*v1.Node)) })
+ scheme.AddTypeDefaultingFunc(&v1.NodeList{}, func(obj interface{}) { SetObjectDefaults_NodeList(obj.(*v1.NodeList)) })
+ scheme.AddTypeDefaultingFunc(&v1.PersistentVolume{}, func(obj interface{}) { SetObjectDefaults_PersistentVolume(obj.(*v1.PersistentVolume)) })
+ scheme.AddTypeDefaultingFunc(&v1.PersistentVolumeClaim{}, func(obj interface{}) { SetObjectDefaults_PersistentVolumeClaim(obj.(*v1.PersistentVolumeClaim)) })
+ scheme.AddTypeDefaultingFunc(&v1.PersistentVolumeClaimList{}, func(obj interface{}) {
+ SetObjectDefaults_PersistentVolumeClaimList(obj.(*v1.PersistentVolumeClaimList))
+ })
+ scheme.AddTypeDefaultingFunc(&v1.PersistentVolumeList{}, func(obj interface{}) { SetObjectDefaults_PersistentVolumeList(obj.(*v1.PersistentVolumeList)) })
+ scheme.AddTypeDefaultingFunc(&v1.Pod{}, func(obj interface{}) { SetObjectDefaults_Pod(obj.(*v1.Pod)) })
+ scheme.AddTypeDefaultingFunc(&v1.PodList{}, func(obj interface{}) { SetObjectDefaults_PodList(obj.(*v1.PodList)) })
+ scheme.AddTypeDefaultingFunc(&v1.PodTemplate{}, func(obj interface{}) { SetObjectDefaults_PodTemplate(obj.(*v1.PodTemplate)) })
+ scheme.AddTypeDefaultingFunc(&v1.PodTemplateList{}, func(obj interface{}) { SetObjectDefaults_PodTemplateList(obj.(*v1.PodTemplateList)) })
+ scheme.AddTypeDefaultingFunc(&v1.ReplicationController{}, func(obj interface{}) { SetObjectDefaults_ReplicationController(obj.(*v1.ReplicationController)) })
+ scheme.AddTypeDefaultingFunc(&v1.ReplicationControllerList{}, func(obj interface{}) {
+ SetObjectDefaults_ReplicationControllerList(obj.(*v1.ReplicationControllerList))
+ })
+ scheme.AddTypeDefaultingFunc(&v1.ResourceQuota{}, func(obj interface{}) { SetObjectDefaults_ResourceQuota(obj.(*v1.ResourceQuota)) })
+ scheme.AddTypeDefaultingFunc(&v1.ResourceQuotaList{}, func(obj interface{}) { SetObjectDefaults_ResourceQuotaList(obj.(*v1.ResourceQuotaList)) })
+ scheme.AddTypeDefaultingFunc(&v1.Secret{}, func(obj interface{}) { SetObjectDefaults_Secret(obj.(*v1.Secret)) })
+ scheme.AddTypeDefaultingFunc(&v1.SecretList{}, func(obj interface{}) { SetObjectDefaults_SecretList(obj.(*v1.SecretList)) })
+ scheme.AddTypeDefaultingFunc(&v1.Service{}, func(obj interface{}) { SetObjectDefaults_Service(obj.(*v1.Service)) })
+ scheme.AddTypeDefaultingFunc(&v1.ServiceList{}, func(obj interface{}) { SetObjectDefaults_ServiceList(obj.(*v1.ServiceList)) })
+ return nil
+}
+
+func SetObjectDefaults_ConfigMap(in *v1.ConfigMap) {
+ SetDefaults_ConfigMap(in)
+}
+
+func SetObjectDefaults_ConfigMapList(in *v1.ConfigMapList) {
+ for i := range in.Items {
+ a := &in.Items[i]
+ SetObjectDefaults_ConfigMap(a)
+ }
+}
+
+func SetObjectDefaults_Endpoints(in *v1.Endpoints) {
+ SetDefaults_Endpoints(in)
+}
+
+func SetObjectDefaults_EndpointsList(in *v1.EndpointsList) {
+ for i := range in.Items {
+ a := &in.Items[i]
+ SetObjectDefaults_Endpoints(a)
+ }
+}
+
+func SetObjectDefaults_LimitRange(in *v1.LimitRange) {
+ for i := range in.Spec.Limits {
+ a := &in.Spec.Limits[i]
+ SetDefaults_LimitRangeItem(a)
+ SetDefaults_ResourceList(&a.Max)
+ SetDefaults_ResourceList(&a.Min)
+ SetDefaults_ResourceList(&a.Default)
+ SetDefaults_ResourceList(&a.DefaultRequest)
+ SetDefaults_ResourceList(&a.MaxLimitRequestRatio)
+ }
+}
+
+func SetObjectDefaults_LimitRangeList(in *v1.LimitRangeList) {
+ for i := range in.Items {
+ a := &in.Items[i]
+ SetObjectDefaults_LimitRange(a)
+ }
+}
+
+func SetObjectDefaults_Namespace(in *v1.Namespace) {
+ SetDefaults_NamespaceStatus(&in.Status)
+}
+
+func SetObjectDefaults_NamespaceList(in *v1.NamespaceList) {
+ for i := range in.Items {
+ a := &in.Items[i]
+ SetObjectDefaults_Namespace(a)
+ }
+}
+
+func SetObjectDefaults_Node(in *v1.Node) {
+ SetDefaults_Node(in)
+ SetDefaults_NodeStatus(&in.Status)
+ SetDefaults_ResourceList(&in.Status.Capacity)
+ SetDefaults_ResourceList(&in.Status.Allocatable)
+}
+
+func SetObjectDefaults_NodeList(in *v1.NodeList) {
+ for i := range in.Items {
+ a := &in.Items[i]
+ SetObjectDefaults_Node(a)
+ }
+}
+
+func SetObjectDefaults_PersistentVolume(in *v1.PersistentVolume) {
+ SetDefaults_PersistentVolume(in)
+ SetDefaults_ResourceList(&in.Spec.Capacity)
+ if in.Spec.PersistentVolumeSource.HostPath != nil {
+ SetDefaults_HostPathVolumeSource(in.Spec.PersistentVolumeSource.HostPath)
+ }
+ if in.Spec.PersistentVolumeSource.RBD != nil {
+ SetDefaults_RBDPersistentVolumeSource(in.Spec.PersistentVolumeSource.RBD)
+ }
+ if in.Spec.PersistentVolumeSource.ISCSI != nil {
+ SetDefaults_ISCSIPersistentVolumeSource(in.Spec.PersistentVolumeSource.ISCSI)
+ }
+ if in.Spec.PersistentVolumeSource.AzureDisk != nil {
+ SetDefaults_AzureDiskVolumeSource(in.Spec.PersistentVolumeSource.AzureDisk)
+ }
+ if in.Spec.PersistentVolumeSource.ScaleIO != nil {
+ SetDefaults_ScaleIOPersistentVolumeSource(in.Spec.PersistentVolumeSource.ScaleIO)
+ }
+}
+
+func SetObjectDefaults_PersistentVolumeClaim(in *v1.PersistentVolumeClaim) {
+ SetDefaults_PersistentVolumeClaim(in)
+ SetDefaults_ResourceList(&in.Spec.Resources.Limits)
+ SetDefaults_ResourceList(&in.Spec.Resources.Requests)
+ SetDefaults_ResourceList(&in.Status.Capacity)
+}
+
+func SetObjectDefaults_PersistentVolumeClaimList(in *v1.PersistentVolumeClaimList) {
+ for i := range in.Items {
+ a := &in.Items[i]
+ SetObjectDefaults_PersistentVolumeClaim(a)
+ }
+}
+
+func SetObjectDefaults_PersistentVolumeList(in *v1.PersistentVolumeList) {
+ for i := range in.Items {
+ a := &in.Items[i]
+ SetObjectDefaults_PersistentVolume(a)
+ }
+}
+
+func SetObjectDefaults_Pod(in *v1.Pod) {
+ SetDefaults_Pod(in)
+ SetDefaults_PodSpec(&in.Spec)
+ for i := range in.Spec.Volumes {
+ a := &in.Spec.Volumes[i]
+ SetDefaults_Volume(a)
+ if a.VolumeSource.HostPath != nil {
+ SetDefaults_HostPathVolumeSource(a.VolumeSource.HostPath)
+ }
+ if a.VolumeSource.Secret != nil {
+ SetDefaults_SecretVolumeSource(a.VolumeSource.Secret)
+ }
+ if a.VolumeSource.ISCSI != nil {
+ SetDefaults_ISCSIVolumeSource(a.VolumeSource.ISCSI)
+ }
+ if a.VolumeSource.RBD != nil {
+ SetDefaults_RBDVolumeSource(a.VolumeSource.RBD)
+ }
+ if a.VolumeSource.DownwardAPI != nil {
+ SetDefaults_DownwardAPIVolumeSource(a.VolumeSource.DownwardAPI)
+ for j := range a.VolumeSource.DownwardAPI.Items {
+ b := &a.VolumeSource.DownwardAPI.Items[j]
+ if b.FieldRef != nil {
+ SetDefaults_ObjectFieldSelector(b.FieldRef)
+ }
+ }
+ }
+ if a.VolumeSource.ConfigMap != nil {
+ SetDefaults_ConfigMapVolumeSource(a.VolumeSource.ConfigMap)
+ }
+ if a.VolumeSource.AzureDisk != nil {
+ SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk)
+ }
+ if a.VolumeSource.Projected != nil {
+ SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected)
+ for j := range a.VolumeSource.Projected.Sources {
+ b := &a.VolumeSource.Projected.Sources[j]
+ if b.DownwardAPI != nil {
+ for k := range b.DownwardAPI.Items {
+ c := &b.DownwardAPI.Items[k]
+ if c.FieldRef != nil {
+ SetDefaults_ObjectFieldSelector(c.FieldRef)
+ }
+ }
+ }
+ }
+ }
+ if a.VolumeSource.ScaleIO != nil {
+ SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO)
+ }
+ }
+ for i := range in.Spec.InitContainers {
+ a := &in.Spec.InitContainers[i]
+ SetDefaults_Container(a)
+ for j := range a.Ports {
+ b := &a.Ports[j]
+ SetDefaults_ContainerPort(b)
+ }
+ for j := range a.Env {
+ b := &a.Env[j]
+ if b.ValueFrom != nil {
+ if b.ValueFrom.FieldRef != nil {
+ SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef)
+ }
+ }
+ }
+ SetDefaults_ResourceList(&a.Resources.Limits)
+ SetDefaults_ResourceList(&a.Resources.Requests)
+ if a.LivenessProbe != nil {
+ SetDefaults_Probe(a.LivenessProbe)
+ if a.LivenessProbe.Handler.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.LivenessProbe.Handler.HTTPGet)
+ }
+ }
+ if a.ReadinessProbe != nil {
+ SetDefaults_Probe(a.ReadinessProbe)
+ if a.ReadinessProbe.Handler.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.ReadinessProbe.Handler.HTTPGet)
+ }
+ }
+ if a.Lifecycle != nil {
+ if a.Lifecycle.PostStart != nil {
+ if a.Lifecycle.PostStart.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.Lifecycle.PostStart.HTTPGet)
+ }
+ }
+ if a.Lifecycle.PreStop != nil {
+ if a.Lifecycle.PreStop.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.Lifecycle.PreStop.HTTPGet)
+ }
+ }
+ }
+ }
+ for i := range in.Spec.Containers {
+ a := &in.Spec.Containers[i]
+ SetDefaults_Container(a)
+ for j := range a.Ports {
+ b := &a.Ports[j]
+ SetDefaults_ContainerPort(b)
+ }
+ for j := range a.Env {
+ b := &a.Env[j]
+ if b.ValueFrom != nil {
+ if b.ValueFrom.FieldRef != nil {
+ SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef)
+ }
+ }
+ }
+ SetDefaults_ResourceList(&a.Resources.Limits)
+ SetDefaults_ResourceList(&a.Resources.Requests)
+ if a.LivenessProbe != nil {
+ SetDefaults_Probe(a.LivenessProbe)
+ if a.LivenessProbe.Handler.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.LivenessProbe.Handler.HTTPGet)
+ }
+ }
+ if a.ReadinessProbe != nil {
+ SetDefaults_Probe(a.ReadinessProbe)
+ if a.ReadinessProbe.Handler.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.ReadinessProbe.Handler.HTTPGet)
+ }
+ }
+ if a.Lifecycle != nil {
+ if a.Lifecycle.PostStart != nil {
+ if a.Lifecycle.PostStart.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.Lifecycle.PostStart.HTTPGet)
+ }
+ }
+ if a.Lifecycle.PreStop != nil {
+ if a.Lifecycle.PreStop.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.Lifecycle.PreStop.HTTPGet)
+ }
+ }
+ }
+ }
+}
+
+func SetObjectDefaults_PodList(in *v1.PodList) {
+ for i := range in.Items {
+ a := &in.Items[i]
+ SetObjectDefaults_Pod(a)
+ }
+}
+
+func SetObjectDefaults_PodTemplate(in *v1.PodTemplate) {
+ SetDefaults_PodSpec(&in.Template.Spec)
+ for i := range in.Template.Spec.Volumes {
+ a := &in.Template.Spec.Volumes[i]
+ SetDefaults_Volume(a)
+ if a.VolumeSource.HostPath != nil {
+ SetDefaults_HostPathVolumeSource(a.VolumeSource.HostPath)
+ }
+ if a.VolumeSource.Secret != nil {
+ SetDefaults_SecretVolumeSource(a.VolumeSource.Secret)
+ }
+ if a.VolumeSource.ISCSI != nil {
+ SetDefaults_ISCSIVolumeSource(a.VolumeSource.ISCSI)
+ }
+ if a.VolumeSource.RBD != nil {
+ SetDefaults_RBDVolumeSource(a.VolumeSource.RBD)
+ }
+ if a.VolumeSource.DownwardAPI != nil {
+ SetDefaults_DownwardAPIVolumeSource(a.VolumeSource.DownwardAPI)
+ for j := range a.VolumeSource.DownwardAPI.Items {
+ b := &a.VolumeSource.DownwardAPI.Items[j]
+ if b.FieldRef != nil {
+ SetDefaults_ObjectFieldSelector(b.FieldRef)
+ }
+ }
+ }
+ if a.VolumeSource.ConfigMap != nil {
+ SetDefaults_ConfigMapVolumeSource(a.VolumeSource.ConfigMap)
+ }
+ if a.VolumeSource.AzureDisk != nil {
+ SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk)
+ }
+ if a.VolumeSource.Projected != nil {
+ SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected)
+ for j := range a.VolumeSource.Projected.Sources {
+ b := &a.VolumeSource.Projected.Sources[j]
+ if b.DownwardAPI != nil {
+ for k := range b.DownwardAPI.Items {
+ c := &b.DownwardAPI.Items[k]
+ if c.FieldRef != nil {
+ SetDefaults_ObjectFieldSelector(c.FieldRef)
+ }
+ }
+ }
+ }
+ }
+ if a.VolumeSource.ScaleIO != nil {
+ SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO)
+ }
+ }
+ for i := range in.Template.Spec.InitContainers {
+ a := &in.Template.Spec.InitContainers[i]
+ SetDefaults_Container(a)
+ for j := range a.Ports {
+ b := &a.Ports[j]
+ SetDefaults_ContainerPort(b)
+ }
+ for j := range a.Env {
+ b := &a.Env[j]
+ if b.ValueFrom != nil {
+ if b.ValueFrom.FieldRef != nil {
+ SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef)
+ }
+ }
+ }
+ SetDefaults_ResourceList(&a.Resources.Limits)
+ SetDefaults_ResourceList(&a.Resources.Requests)
+ if a.LivenessProbe != nil {
+ SetDefaults_Probe(a.LivenessProbe)
+ if a.LivenessProbe.Handler.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.LivenessProbe.Handler.HTTPGet)
+ }
+ }
+ if a.ReadinessProbe != nil {
+ SetDefaults_Probe(a.ReadinessProbe)
+ if a.ReadinessProbe.Handler.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.ReadinessProbe.Handler.HTTPGet)
+ }
+ }
+ if a.Lifecycle != nil {
+ if a.Lifecycle.PostStart != nil {
+ if a.Lifecycle.PostStart.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.Lifecycle.PostStart.HTTPGet)
+ }
+ }
+ if a.Lifecycle.PreStop != nil {
+ if a.Lifecycle.PreStop.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.Lifecycle.PreStop.HTTPGet)
+ }
+ }
+ }
+ }
+ for i := range in.Template.Spec.Containers {
+ a := &in.Template.Spec.Containers[i]
+ SetDefaults_Container(a)
+ for j := range a.Ports {
+ b := &a.Ports[j]
+ SetDefaults_ContainerPort(b)
+ }
+ for j := range a.Env {
+ b := &a.Env[j]
+ if b.ValueFrom != nil {
+ if b.ValueFrom.FieldRef != nil {
+ SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef)
+ }
+ }
+ }
+ SetDefaults_ResourceList(&a.Resources.Limits)
+ SetDefaults_ResourceList(&a.Resources.Requests)
+ if a.LivenessProbe != nil {
+ SetDefaults_Probe(a.LivenessProbe)
+ if a.LivenessProbe.Handler.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.LivenessProbe.Handler.HTTPGet)
+ }
+ }
+ if a.ReadinessProbe != nil {
+ SetDefaults_Probe(a.ReadinessProbe)
+ if a.ReadinessProbe.Handler.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.ReadinessProbe.Handler.HTTPGet)
+ }
+ }
+ if a.Lifecycle != nil {
+ if a.Lifecycle.PostStart != nil {
+ if a.Lifecycle.PostStart.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.Lifecycle.PostStart.HTTPGet)
+ }
+ }
+ if a.Lifecycle.PreStop != nil {
+ if a.Lifecycle.PreStop.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.Lifecycle.PreStop.HTTPGet)
+ }
+ }
+ }
+ }
+}
+
+func SetObjectDefaults_PodTemplateList(in *v1.PodTemplateList) {
+ for i := range in.Items {
+ a := &in.Items[i]
+ SetObjectDefaults_PodTemplate(a)
+ }
+}
+
+func SetObjectDefaults_ReplicationController(in *v1.ReplicationController) {
+ SetDefaults_ReplicationController(in)
+ if in.Spec.Template != nil {
+ SetDefaults_PodSpec(&in.Spec.Template.Spec)
+ for i := range in.Spec.Template.Spec.Volumes {
+ a := &in.Spec.Template.Spec.Volumes[i]
+ SetDefaults_Volume(a)
+ if a.VolumeSource.HostPath != nil {
+ SetDefaults_HostPathVolumeSource(a.VolumeSource.HostPath)
+ }
+ if a.VolumeSource.Secret != nil {
+ SetDefaults_SecretVolumeSource(a.VolumeSource.Secret)
+ }
+ if a.VolumeSource.ISCSI != nil {
+ SetDefaults_ISCSIVolumeSource(a.VolumeSource.ISCSI)
+ }
+ if a.VolumeSource.RBD != nil {
+ SetDefaults_RBDVolumeSource(a.VolumeSource.RBD)
+ }
+ if a.VolumeSource.DownwardAPI != nil {
+ SetDefaults_DownwardAPIVolumeSource(a.VolumeSource.DownwardAPI)
+ for j := range a.VolumeSource.DownwardAPI.Items {
+ b := &a.VolumeSource.DownwardAPI.Items[j]
+ if b.FieldRef != nil {
+ SetDefaults_ObjectFieldSelector(b.FieldRef)
+ }
+ }
+ }
+ if a.VolumeSource.ConfigMap != nil {
+ SetDefaults_ConfigMapVolumeSource(a.VolumeSource.ConfigMap)
+ }
+ if a.VolumeSource.AzureDisk != nil {
+ SetDefaults_AzureDiskVolumeSource(a.VolumeSource.AzureDisk)
+ }
+ if a.VolumeSource.Projected != nil {
+ SetDefaults_ProjectedVolumeSource(a.VolumeSource.Projected)
+ for j := range a.VolumeSource.Projected.Sources {
+ b := &a.VolumeSource.Projected.Sources[j]
+ if b.DownwardAPI != nil {
+ for k := range b.DownwardAPI.Items {
+ c := &b.DownwardAPI.Items[k]
+ if c.FieldRef != nil {
+ SetDefaults_ObjectFieldSelector(c.FieldRef)
+ }
+ }
+ }
+ }
+ }
+ if a.VolumeSource.ScaleIO != nil {
+ SetDefaults_ScaleIOVolumeSource(a.VolumeSource.ScaleIO)
+ }
+ }
+ for i := range in.Spec.Template.Spec.InitContainers {
+ a := &in.Spec.Template.Spec.InitContainers[i]
+ SetDefaults_Container(a)
+ for j := range a.Ports {
+ b := &a.Ports[j]
+ SetDefaults_ContainerPort(b)
+ }
+ for j := range a.Env {
+ b := &a.Env[j]
+ if b.ValueFrom != nil {
+ if b.ValueFrom.FieldRef != nil {
+ SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef)
+ }
+ }
+ }
+ SetDefaults_ResourceList(&a.Resources.Limits)
+ SetDefaults_ResourceList(&a.Resources.Requests)
+ if a.LivenessProbe != nil {
+ SetDefaults_Probe(a.LivenessProbe)
+ if a.LivenessProbe.Handler.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.LivenessProbe.Handler.HTTPGet)
+ }
+ }
+ if a.ReadinessProbe != nil {
+ SetDefaults_Probe(a.ReadinessProbe)
+ if a.ReadinessProbe.Handler.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.ReadinessProbe.Handler.HTTPGet)
+ }
+ }
+ if a.Lifecycle != nil {
+ if a.Lifecycle.PostStart != nil {
+ if a.Lifecycle.PostStart.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.Lifecycle.PostStart.HTTPGet)
+ }
+ }
+ if a.Lifecycle.PreStop != nil {
+ if a.Lifecycle.PreStop.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.Lifecycle.PreStop.HTTPGet)
+ }
+ }
+ }
+ }
+ for i := range in.Spec.Template.Spec.Containers {
+ a := &in.Spec.Template.Spec.Containers[i]
+ SetDefaults_Container(a)
+ for j := range a.Ports {
+ b := &a.Ports[j]
+ SetDefaults_ContainerPort(b)
+ }
+ for j := range a.Env {
+ b := &a.Env[j]
+ if b.ValueFrom != nil {
+ if b.ValueFrom.FieldRef != nil {
+ SetDefaults_ObjectFieldSelector(b.ValueFrom.FieldRef)
+ }
+ }
+ }
+ SetDefaults_ResourceList(&a.Resources.Limits)
+ SetDefaults_ResourceList(&a.Resources.Requests)
+ if a.LivenessProbe != nil {
+ SetDefaults_Probe(a.LivenessProbe)
+ if a.LivenessProbe.Handler.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.LivenessProbe.Handler.HTTPGet)
+ }
+ }
+ if a.ReadinessProbe != nil {
+ SetDefaults_Probe(a.ReadinessProbe)
+ if a.ReadinessProbe.Handler.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.ReadinessProbe.Handler.HTTPGet)
+ }
+ }
+ if a.Lifecycle != nil {
+ if a.Lifecycle.PostStart != nil {
+ if a.Lifecycle.PostStart.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.Lifecycle.PostStart.HTTPGet)
+ }
+ }
+ if a.Lifecycle.PreStop != nil {
+ if a.Lifecycle.PreStop.HTTPGet != nil {
+ SetDefaults_HTTPGetAction(a.Lifecycle.PreStop.HTTPGet)
+ }
+ }
+ }
+ }
+ }
+}
+
+func SetObjectDefaults_ReplicationControllerList(in *v1.ReplicationControllerList) {
+ for i := range in.Items {
+ a := &in.Items[i]
+ SetObjectDefaults_ReplicationController(a)
+ }
+}
+
+func SetObjectDefaults_ResourceQuota(in *v1.ResourceQuota) {
+ SetDefaults_ResourceList(&in.Spec.Hard)
+ SetDefaults_ResourceList(&in.Status.Hard)
+ SetDefaults_ResourceList(&in.Status.Used)
+}
+
+func SetObjectDefaults_ResourceQuotaList(in *v1.ResourceQuotaList) {
+ for i := range in.Items {
+ a := &in.Items[i]
+ SetObjectDefaults_ResourceQuota(a)
+ }
+}
+
+func SetObjectDefaults_Secret(in *v1.Secret) {
+ SetDefaults_Secret(in)
+}
+
+func SetObjectDefaults_SecretList(in *v1.SecretList) {
+ for i := range in.Items {
+ a := &in.Items[i]
+ SetObjectDefaults_Secret(a)
+ }
+}
+
+func SetObjectDefaults_Service(in *v1.Service) {
+ SetDefaults_Service(in)
+}
+
+func SetObjectDefaults_ServiceList(in *v1.ServiceList) {
+ for i := range in.Items {
+ a := &in.Items[i]
+ SetObjectDefaults_Service(a)
+ }
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/validation/doc.go b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/doc.go
new file mode 100644
index 000000000..0c1cfaab5
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2014 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 validation has functions for validating the correctness of api
+// objects and explaining what is wrong with them when they aren't valid.
+package validation // import "k8s.io/kubernetes/pkg/apis/core/validation"
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/validation/events.go b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/events.go
new file mode 100644
index 000000000..ab265bd76
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/events.go
@@ -0,0 +1,129 @@
+/*
+Copyright 2014 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 validation
+
+import (
+ "fmt"
+ "time"
+
+ "k8s.io/apimachinery/pkg/api/meta"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+ "k8s.io/apimachinery/pkg/util/validation"
+ "k8s.io/apimachinery/pkg/util/validation/field"
+ "k8s.io/kubernetes/pkg/api/legacyscheme"
+ "k8s.io/kubernetes/pkg/apis/core"
+)
+
+const (
+ ReportingInstanceLengthLimit = 128
+ ActionLengthLimit = 128
+ ReasonLengthLimit = 128
+ NoteLengthLimit = 1024
+)
+
+// ValidateEvent makes sure that the event makes sense.
+func ValidateEvent(event *core.Event) field.ErrorList {
+ allErrs := field.ErrorList{}
+ // Because go
+ zeroTime := time.Time{}
+
+ // "New" Events need to have EventTime set, so it's validating old object.
+ if event.EventTime.Time == zeroTime {
+ // Make sure event.Namespace and the involvedInvolvedObject.Namespace agree
+ if len(event.InvolvedObject.Namespace) == 0 {
+ // event.Namespace must also be empty (or "default", for compatibility with old clients)
+ if event.Namespace != metav1.NamespaceNone && event.Namespace != metav1.NamespaceDefault {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("involvedObject", "namespace"), event.InvolvedObject.Namespace, "does not match event.namespace"))
+ }
+ } else {
+ // event namespace must match
+ if event.Namespace != event.InvolvedObject.Namespace {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("involvedObject", "namespace"), event.InvolvedObject.Namespace, "does not match event.namespace"))
+ }
+ }
+
+ } else {
+ if len(event.InvolvedObject.Namespace) == 0 && event.Namespace != metav1.NamespaceSystem {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("involvedObject", "namespace"), event.InvolvedObject.Namespace, "does not match event.namespace"))
+ }
+ if len(event.ReportingController) == 0 {
+ allErrs = append(allErrs, field.Required(field.NewPath("reportingController"), ""))
+ }
+ for _, msg := range validation.IsQualifiedName(event.ReportingController) {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("reportingController"), event.ReportingController, msg))
+ }
+ if len(event.ReportingInstance) == 0 {
+ allErrs = append(allErrs, field.Required(field.NewPath("reportingInstance"), ""))
+ }
+ if len(event.ReportingInstance) > ReportingInstanceLengthLimit {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("repotingIntance"), "", fmt.Sprintf("can have at most %v characters", ReportingInstanceLengthLimit)))
+ }
+ if len(event.Action) == 0 {
+ allErrs = append(allErrs, field.Required(field.NewPath("action"), ""))
+ }
+ if len(event.Action) > ActionLengthLimit {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("action"), "", fmt.Sprintf("can have at most %v characters", ActionLengthLimit)))
+ }
+ if len(event.Reason) == 0 {
+ allErrs = append(allErrs, field.Required(field.NewPath("reason"), ""))
+ }
+ if len(event.Reason) > ReasonLengthLimit {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("reason"), "", fmt.Sprintf("can have at most %v characters", ReasonLengthLimit)))
+ }
+ if len(event.Message) > NoteLengthLimit {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("message"), "", fmt.Sprintf("can have at most %v characters", NoteLengthLimit)))
+ }
+ }
+
+ // For kinds we recognize, make sure InvolvedObject.Namespace is set for namespaced kinds
+ if namespaced, err := isNamespacedKind(event.InvolvedObject.Kind, event.InvolvedObject.APIVersion); err == nil {
+ if namespaced && len(event.InvolvedObject.Namespace) == 0 {
+ allErrs = append(allErrs, field.Required(field.NewPath("involvedObject", "namespace"), fmt.Sprintf("required for kind %s", event.InvolvedObject.Kind)))
+ }
+ if !namespaced && len(event.InvolvedObject.Namespace) > 0 {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("involvedObject", "namespace"), event.InvolvedObject.Namespace, fmt.Sprintf("not allowed for kind %s", event.InvolvedObject.Kind)))
+ }
+ }
+
+ for _, msg := range validation.IsDNS1123Subdomain(event.Namespace) {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("namespace"), event.Namespace, msg))
+ }
+ return allErrs
+}
+
+// Check whether the kind in groupVersion is scoped at the root of the api hierarchy
+func isNamespacedKind(kind, groupVersion string) (bool, error) {
+ gv, err := schema.ParseGroupVersion(groupVersion)
+ if err != nil {
+ return false, err
+ }
+ g, err := legacyscheme.Registry.Group(gv.Group)
+ if err != nil {
+ return false, err
+ }
+
+ restMapping, err := g.RESTMapper.RESTMapping(schema.GroupKind{Group: gv.Group, Kind: kind}, gv.Version)
+ if err != nil {
+ return false, err
+ }
+ scopeName := restMapping.Scope.Name()
+ if scopeName == meta.RESTScopeNameNamespace {
+ return true, nil
+ }
+ return false, nil
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go
new file mode 100644
index 000000000..ec93a1968
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go
@@ -0,0 +1,5066 @@
+/*
+Copyright 2014 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 validation
+
+import (
+ "encoding/json"
+ "fmt"
+ "math"
+ "net"
+ "path"
+ "path/filepath"
+ "reflect"
+ "regexp"
+ "strings"
+
+ "github.com/golang/glog"
+
+ "k8s.io/api/core/v1"
+ apiequality "k8s.io/apimachinery/pkg/api/equality"
+ "k8s.io/apimachinery/pkg/api/resource"
+ apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ unversionedvalidation "k8s.io/apimachinery/pkg/apis/meta/v1/validation"
+ "k8s.io/apimachinery/pkg/labels"
+ "k8s.io/apimachinery/pkg/util/diff"
+ "k8s.io/apimachinery/pkg/util/intstr"
+ "k8s.io/apimachinery/pkg/util/sets"
+ "k8s.io/apimachinery/pkg/util/validation"
+ "k8s.io/apimachinery/pkg/util/validation/field"
+ utilfeature "k8s.io/apiserver/pkg/util/feature"
+ apiservice "k8s.io/kubernetes/pkg/api/service"
+ "k8s.io/kubernetes/pkg/apis/core"
+ "k8s.io/kubernetes/pkg/apis/core/helper"
+ podshelper "k8s.io/kubernetes/pkg/apis/core/pods"
+ corev1 "k8s.io/kubernetes/pkg/apis/core/v1"
+ v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
+ "k8s.io/kubernetes/pkg/capabilities"
+ "k8s.io/kubernetes/pkg/features"
+ "k8s.io/kubernetes/pkg/fieldpath"
+ "k8s.io/kubernetes/pkg/master/ports"
+ "k8s.io/kubernetes/pkg/security/apparmor"
+)
+
+// TODO: delete this global variable when we enable the validation of common
+// fields by default.
+var RepairMalformedUpdates bool = apimachineryvalidation.RepairMalformedUpdates
+
+const isNegativeErrorMsg string = apimachineryvalidation.IsNegativeErrorMsg
+const isInvalidQuotaResource string = `must be a standard resource for quota`
+const fieldImmutableErrorMsg string = apimachineryvalidation.FieldImmutableErrorMsg
+const isNotIntegerErrorMsg string = `must be an integer`
+const isNotPositiveErrorMsg string = `must be greater than zero`
+const csiDriverNameRexpErrMsg string = "must consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character"
+const csiDriverNameRexpFmt string = `^[a-zA-Z0-9][-a-zA-Z0-9_.]{0,61}[a-zA-Z-0-9]$`
+
+var pdPartitionErrorMsg string = validation.InclusiveRangeError(1, 255)
+var fileModeErrorMsg string = "must be a number between 0 and 0777 (octal), both inclusive"
+
+// BannedOwners is a black list of object that are not allowed to be owners.
+var BannedOwners = apimachineryvalidation.BannedOwners
+
+var iscsiInitiatorIqnRegex = regexp.MustCompile(`iqn\.\d{4}-\d{2}\.([[:alnum:]-.]+)(:[^,;*&$|\s]+)$`)
+var iscsiInitiatorEuiRegex = regexp.MustCompile(`^eui.[[:alnum:]]{16}$`)
+var iscsiInitiatorNaaRegex = regexp.MustCompile(`^naa.[[:alnum:]]{32}$`)
+
+var csiDriverNameRexp = regexp.MustCompile(csiDriverNameRexpFmt)
+
+// ValidateHasLabel requires that metav1.ObjectMeta has a Label with key and expectedValue
+func ValidateHasLabel(meta metav1.ObjectMeta, fldPath *field.Path, key, expectedValue string) field.ErrorList {
+ allErrs := field.ErrorList{}
+ actualValue, found := meta.Labels[key]
+ if !found {
+ allErrs = append(allErrs, field.Required(fldPath.Child("labels").Key(key),
+ fmt.Sprintf("must be '%s'", expectedValue)))
+ return allErrs
+ }
+ if actualValue != expectedValue {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("labels").Key(key), meta.Labels,
+ fmt.Sprintf("must be '%s'", expectedValue)))
+ }
+ return allErrs
+}
+
+// ValidateAnnotations validates that a set of annotations are correctly defined.
+func ValidateAnnotations(annotations map[string]string, fldPath *field.Path) field.ErrorList {
+ return apimachineryvalidation.ValidateAnnotations(annotations, fldPath)
+}
+
+func ValidateDNS1123Label(value string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for _, msg := range validation.IsDNS1123Label(value) {
+ allErrs = append(allErrs, field.Invalid(fldPath, value, msg))
+ }
+ return allErrs
+}
+
+// ValidateDNS1123Subdomain validates that a name is a proper DNS subdomain.
+func ValidateDNS1123Subdomain(value string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for _, msg := range validation.IsDNS1123Subdomain(value) {
+ allErrs = append(allErrs, field.Invalid(fldPath, value, msg))
+ }
+ return allErrs
+}
+
+func ValidatePodSpecificAnnotations(annotations map[string]string, spec *core.PodSpec, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if value, isMirror := annotations[core.MirrorPodAnnotationKey]; isMirror {
+ if len(spec.NodeName) == 0 {
+ allErrs = append(allErrs, field.Invalid(fldPath.Key(core.MirrorPodAnnotationKey), value, "must set spec.nodeName if mirror pod annotation is set"))
+ }
+ }
+
+ if annotations[core.TolerationsAnnotationKey] != "" {
+ allErrs = append(allErrs, ValidateTolerationsInPodAnnotations(annotations, fldPath)...)
+ }
+
+ allErrs = append(allErrs, ValidateSeccompPodAnnotations(annotations, fldPath)...)
+ allErrs = append(allErrs, ValidateAppArmorPodAnnotations(annotations, spec, fldPath)...)
+
+ sysctls, err := helper.SysctlsFromPodAnnotation(annotations[core.SysctlsPodAnnotationKey])
+ if err != nil {
+ allErrs = append(allErrs, field.Invalid(fldPath.Key(core.SysctlsPodAnnotationKey), annotations[core.SysctlsPodAnnotationKey], err.Error()))
+ } else {
+ allErrs = append(allErrs, validateSysctls(sysctls, fldPath.Key(core.SysctlsPodAnnotationKey))...)
+ }
+ unsafeSysctls, err := helper.SysctlsFromPodAnnotation(annotations[core.UnsafeSysctlsPodAnnotationKey])
+ if err != nil {
+ allErrs = append(allErrs, field.Invalid(fldPath.Key(core.UnsafeSysctlsPodAnnotationKey), annotations[core.UnsafeSysctlsPodAnnotationKey], err.Error()))
+ } else {
+ allErrs = append(allErrs, validateSysctls(unsafeSysctls, fldPath.Key(core.UnsafeSysctlsPodAnnotationKey))...)
+ }
+ inBoth := sysctlIntersection(sysctls, unsafeSysctls)
+ if len(inBoth) > 0 {
+ allErrs = append(allErrs, field.Invalid(fldPath.Key(core.UnsafeSysctlsPodAnnotationKey), strings.Join(inBoth, ", "), "can not be safe and unsafe"))
+ }
+
+ return allErrs
+}
+
+// ValidateTolerationsInPodAnnotations tests that the serialized tolerations in Pod.Annotations has valid data
+func ValidateTolerationsInPodAnnotations(annotations map[string]string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ tolerations, err := helper.GetTolerationsFromPodAnnotations(annotations)
+ if err != nil {
+ allErrs = append(allErrs, field.Invalid(fldPath, core.TolerationsAnnotationKey, err.Error()))
+ return allErrs
+ }
+
+ if len(tolerations) > 0 {
+ allErrs = append(allErrs, ValidateTolerations(tolerations, fldPath.Child(core.TolerationsAnnotationKey))...)
+ }
+
+ return allErrs
+}
+
+func ValidatePodSpecificAnnotationUpdates(newPod, oldPod *core.Pod, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ newAnnotations := newPod.Annotations
+ oldAnnotations := oldPod.Annotations
+ for k, oldVal := range oldAnnotations {
+ if newVal, exists := newAnnotations[k]; exists && newVal == oldVal {
+ continue // No change.
+ }
+ if strings.HasPrefix(k, apparmor.ContainerAnnotationKeyPrefix) {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Key(k), "may not remove or update AppArmor annotations"))
+ }
+ if k == core.MirrorPodAnnotationKey {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Key(k), "may not remove or update mirror pod annotation"))
+ }
+ }
+ // Check for additions
+ for k := range newAnnotations {
+ if _, ok := oldAnnotations[k]; ok {
+ continue // No change.
+ }
+ if strings.HasPrefix(k, apparmor.ContainerAnnotationKeyPrefix) {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Key(k), "may not add AppArmor annotations"))
+ }
+ if k == core.MirrorPodAnnotationKey {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Key(k), "may not add mirror pod annotation"))
+ }
+ }
+ allErrs = append(allErrs, ValidatePodSpecificAnnotations(newAnnotations, &newPod.Spec, fldPath)...)
+ return allErrs
+}
+
+func ValidateEndpointsSpecificAnnotations(annotations map[string]string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ return allErrs
+}
+
+// ValidateNameFunc validates that the provided name is valid for a given resource type.
+// Not all resources have the same validation rules for names. Prefix is true
+// if the name will have a value appended to it. If the name is not valid,
+// this returns a list of descriptions of individual characteristics of the
+// value that were not valid. Otherwise this returns an empty list or nil.
+type ValidateNameFunc apimachineryvalidation.ValidateNameFunc
+
+// ValidatePodName can be used to check whether the given pod name is valid.
+// Prefix indicates this name will be used as part of generation, in which case
+// trailing dashes are allowed.
+var ValidatePodName = NameIsDNSSubdomain
+
+// ValidateReplicationControllerName can be used to check whether the given replication
+// controller name is valid.
+// Prefix indicates this name will be used as part of generation, in which case
+// trailing dashes are allowed.
+var ValidateReplicationControllerName = NameIsDNSSubdomain
+
+// ValidateServiceName can be used to check whether the given service name is valid.
+// Prefix indicates this name will be used as part of generation, in which case
+// trailing dashes are allowed.
+var ValidateServiceName = NameIsDNS1035Label
+
+// ValidateNodeName can be used to check whether the given node name is valid.
+// Prefix indicates this name will be used as part of generation, in which case
+// trailing dashes are allowed.
+var ValidateNodeName = NameIsDNSSubdomain
+
+// ValidateNamespaceName can be used to check whether the given namespace name is valid.
+// Prefix indicates this name will be used as part of generation, in which case
+// trailing dashes are allowed.
+var ValidateNamespaceName = apimachineryvalidation.ValidateNamespaceName
+
+// ValidateLimitRangeName can be used to check whether the given limit range name is valid.
+// Prefix indicates this name will be used as part of generation, in which case
+// trailing dashes are allowed.
+var ValidateLimitRangeName = NameIsDNSSubdomain
+
+// ValidateResourceQuotaName can be used to check whether the given
+// resource quota name is valid.
+// Prefix indicates this name will be used as part of generation, in which case
+// trailing dashes are allowed.
+var ValidateResourceQuotaName = NameIsDNSSubdomain
+
+// ValidateSecretName can be used to check whether the given secret name is valid.
+// Prefix indicates this name will be used as part of generation, in which case
+// trailing dashes are allowed.
+var ValidateSecretName = NameIsDNSSubdomain
+
+// ValidateServiceAccountName can be used to check whether the given service account name is valid.
+// Prefix indicates this name will be used as part of generation, in which case
+// trailing dashes are allowed.
+var ValidateServiceAccountName = apimachineryvalidation.ValidateServiceAccountName
+
+// ValidateEndpointsName can be used to check whether the given endpoints name is valid.
+// Prefix indicates this name will be used as part of generation, in which case
+// trailing dashes are allowed.
+var ValidateEndpointsName = NameIsDNSSubdomain
+
+// ValidateClusterName can be used to check whether the given cluster name is valid.
+var ValidateClusterName = apimachineryvalidation.ValidateClusterName
+
+// ValidateClassName can be used to check whether the given class name is valid.
+// It is defined here to avoid import cycle between pkg/apis/storage/validation
+// (where it should be) and this file.
+var ValidateClassName = NameIsDNSSubdomain
+
+// ValidatePiorityClassName can be used to check whether the given priority
+// class name is valid.
+var ValidatePriorityClassName = NameIsDNSSubdomain
+
+// TODO update all references to these functions to point to the apimachineryvalidation ones
+// NameIsDNSSubdomain is a ValidateNameFunc for names that must be a DNS subdomain.
+func NameIsDNSSubdomain(name string, prefix bool) []string {
+ return apimachineryvalidation.NameIsDNSSubdomain(name, prefix)
+}
+
+// NameIsDNS1035Label is a ValidateNameFunc for names that must be a DNS 952 label.
+func NameIsDNS1035Label(name string, prefix bool) []string {
+ return apimachineryvalidation.NameIsDNS1035Label(name, prefix)
+}
+
+// Validates that given value is not negative.
+func ValidateNonnegativeField(value int64, fldPath *field.Path) field.ErrorList {
+ return apimachineryvalidation.ValidateNonnegativeField(value, fldPath)
+}
+
+// Validates that a Quantity is not negative
+func ValidateNonnegativeQuantity(value resource.Quantity, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if value.Cmp(resource.Quantity{}) < 0 {
+ allErrs = append(allErrs, field.Invalid(fldPath, value.String(), isNegativeErrorMsg))
+ }
+ return allErrs
+}
+
+// Validates that a Quantity is positive
+func ValidatePositiveQuantityValue(value resource.Quantity, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if value.Cmp(resource.Quantity{}) <= 0 {
+ allErrs = append(allErrs, field.Invalid(fldPath, value.String(), isNotPositiveErrorMsg))
+ }
+ return allErrs
+}
+
+func ValidateImmutableField(newVal, oldVal interface{}, fldPath *field.Path) field.ErrorList {
+ return apimachineryvalidation.ValidateImmutableField(newVal, oldVal, fldPath)
+}
+
+func ValidateImmutableAnnotation(newVal string, oldVal string, annotation string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if oldVal != newVal {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("annotations", annotation), newVal, fieldImmutableErrorMsg))
+ }
+ return allErrs
+}
+
+// ValidateObjectMeta validates an object's metadata on creation. It expects that name generation has already
+// been performed.
+// It doesn't return an error for rootscoped resources with namespace, because namespace should already be cleared before.
+// TODO: Remove calls to this method scattered in validations of specific resources, e.g., ValidatePodUpdate.
+func ValidateObjectMeta(meta *metav1.ObjectMeta, requiresNamespace bool, nameFn ValidateNameFunc, fldPath *field.Path) field.ErrorList {
+ allErrs := apimachineryvalidation.ValidateObjectMeta(meta, requiresNamespace, apimachineryvalidation.ValidateNameFunc(nameFn), fldPath)
+ // run additional checks for the finalizer name
+ for i := range meta.Finalizers {
+ allErrs = append(allErrs, validateKubeFinalizerName(string(meta.Finalizers[i]), fldPath.Child("finalizers").Index(i))...)
+ }
+ return allErrs
+}
+
+// ValidateObjectMetaUpdate validates an object's metadata when updated
+func ValidateObjectMetaUpdate(newMeta, oldMeta *metav1.ObjectMeta, fldPath *field.Path) field.ErrorList {
+ allErrs := apimachineryvalidation.ValidateObjectMetaUpdate(newMeta, oldMeta, fldPath)
+ // run additional checks for the finalizer name
+ for i := range newMeta.Finalizers {
+ allErrs = append(allErrs, validateKubeFinalizerName(string(newMeta.Finalizers[i]), fldPath.Child("finalizers").Index(i))...)
+ }
+
+ return allErrs
+}
+
+func ValidateVolumes(volumes []core.Volume, fldPath *field.Path) (map[string]core.VolumeSource, field.ErrorList) {
+ allErrs := field.ErrorList{}
+
+ allNames := sets.String{}
+ vols := make(map[string]core.VolumeSource)
+ for i, vol := range volumes {
+ idxPath := fldPath.Index(i)
+ namePath := idxPath.Child("name")
+ el := validateVolumeSource(&vol.VolumeSource, idxPath, vol.Name)
+ if len(vol.Name) == 0 {
+ el = append(el, field.Required(namePath, ""))
+ } else {
+ el = append(el, ValidateDNS1123Label(vol.Name, namePath)...)
+ }
+ if allNames.Has(vol.Name) {
+ el = append(el, field.Duplicate(namePath, vol.Name))
+ }
+ if len(el) == 0 {
+ allNames.Insert(vol.Name)
+ vols[vol.Name] = vol.VolumeSource
+ } else {
+ allErrs = append(allErrs, el...)
+ }
+
+ }
+ return vols, allErrs
+}
+
+func IsMatchedVolume(name string, volumes map[string]core.VolumeSource) bool {
+ if _, ok := volumes[name]; ok {
+ return true
+ } else {
+ return false
+ }
+}
+
+func isMatchedDevice(name string, volumes map[string]core.VolumeSource) (bool, bool) {
+ if source, ok := volumes[name]; ok {
+ if source.PersistentVolumeClaim != nil {
+ return true, true
+ } else {
+ return true, false
+ }
+ } else {
+ return false, false
+ }
+}
+
+func mountNameAlreadyExists(name string, devices map[string]string) bool {
+ if _, ok := devices[name]; ok {
+ return true
+ } else {
+ return false
+ }
+}
+
+func mountPathAlreadyExists(mountPath string, devices map[string]string) bool {
+ for _, devPath := range devices {
+ if mountPath == devPath {
+ return true
+ }
+ }
+
+ return false
+}
+
+func deviceNameAlreadyExists(name string, mounts map[string]string) bool {
+ if _, ok := mounts[name]; ok {
+ return true
+ } else {
+ return false
+ }
+}
+
+func devicePathAlreadyExists(devicePath string, mounts map[string]string) bool {
+ for _, mountPath := range mounts {
+ if mountPath == devicePath {
+ return true
+ }
+ }
+
+ return false
+}
+
+func validateVolumeSource(source *core.VolumeSource, fldPath *field.Path, volName string) field.ErrorList {
+ numVolumes := 0
+ allErrs := field.ErrorList{}
+ if source.EmptyDir != nil {
+ numVolumes++
+ if !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) {
+ if source.EmptyDir.SizeLimit != nil && source.EmptyDir.SizeLimit.Cmp(resource.Quantity{}) != 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("emptyDir").Child("sizeLimit"), "SizeLimit field disabled by feature-gate for EmptyDir volumes"))
+ }
+ } else {
+ if source.EmptyDir.SizeLimit != nil && source.EmptyDir.SizeLimit.Cmp(resource.Quantity{}) < 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("emptyDir").Child("sizeLimit"), "SizeLimit field must be a valid resource quantity"))
+ }
+ }
+ if !utilfeature.DefaultFeatureGate.Enabled(features.HugePages) && source.EmptyDir.Medium == core.StorageMediumHugePages {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("emptyDir").Child("medium"), "HugePages medium is disabled by feature-gate for EmptyDir volumes"))
+ }
+ }
+ if source.HostPath != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("hostPath"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateHostPathVolumeSource(source.HostPath, fldPath.Child("hostPath"))...)
+ }
+ }
+ if source.GitRepo != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("gitRepo"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateGitRepoVolumeSource(source.GitRepo, fldPath.Child("gitRepo"))...)
+ }
+ }
+ if source.GCEPersistentDisk != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("gcePersistentDisk"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateGCEPersistentDiskVolumeSource(source.GCEPersistentDisk, fldPath.Child("persistentDisk"))...)
+ }
+ }
+ if source.AWSElasticBlockStore != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("awsElasticBlockStore"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateAWSElasticBlockStoreVolumeSource(source.AWSElasticBlockStore, fldPath.Child("awsElasticBlockStore"))...)
+ }
+ }
+ if source.Secret != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("secret"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateSecretVolumeSource(source.Secret, fldPath.Child("secret"))...)
+ }
+ }
+ if source.NFS != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("nfs"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateNFSVolumeSource(source.NFS, fldPath.Child("nfs"))...)
+ }
+ }
+ if source.ISCSI != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("iscsi"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateISCSIVolumeSource(source.ISCSI, fldPath.Child("iscsi"))...)
+ }
+ if source.ISCSI.InitiatorName != nil && len(volName+":"+source.ISCSI.TargetPortal) > 64 {
+ tooLongErr := "Total length of <volume name>:<iscsi.targetPortal> must be under 64 characters if iscsi.initiatorName is specified."
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("name"), volName, tooLongErr))
+ }
+ }
+ if source.Glusterfs != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("glusterfs"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateGlusterfsVolumeSource(source.Glusterfs, fldPath.Child("glusterfs"))...)
+ }
+ }
+ if source.Flocker != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("flocker"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateFlockerVolumeSource(source.Flocker, fldPath.Child("flocker"))...)
+ }
+ }
+ if source.PersistentVolumeClaim != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("persistentVolumeClaim"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validatePersistentClaimVolumeSource(source.PersistentVolumeClaim, fldPath.Child("persistentVolumeClaim"))...)
+ }
+ }
+ if source.RBD != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("rbd"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateRBDVolumeSource(source.RBD, fldPath.Child("rbd"))...)
+ }
+ }
+ if source.Cinder != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("cinder"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateCinderVolumeSource(source.Cinder, fldPath.Child("cinder"))...)
+ }
+ }
+ if source.CephFS != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("cephFS"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateCephFSVolumeSource(source.CephFS, fldPath.Child("cephfs"))...)
+ }
+ }
+ if source.Quobyte != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("quobyte"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateQuobyteVolumeSource(source.Quobyte, fldPath.Child("quobyte"))...)
+ }
+ }
+ if source.DownwardAPI != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("downwarAPI"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateDownwardAPIVolumeSource(source.DownwardAPI, fldPath.Child("downwardAPI"))...)
+ }
+ }
+ if source.FC != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("fc"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateFCVolumeSource(source.FC, fldPath.Child("fc"))...)
+ }
+ }
+ if source.FlexVolume != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("flexVolume"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateFlexVolumeSource(source.FlexVolume, fldPath.Child("flexVolume"))...)
+ }
+ }
+ if source.ConfigMap != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("configMap"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateConfigMapVolumeSource(source.ConfigMap, fldPath.Child("configMap"))...)
+ }
+ }
+
+ if source.AzureFile != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("azureFile"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateAzureFile(source.AzureFile, fldPath.Child("azureFile"))...)
+ }
+ }
+
+ if source.VsphereVolume != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("vsphereVolume"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateVsphereVolumeSource(source.VsphereVolume, fldPath.Child("vsphereVolume"))...)
+ }
+ }
+ if source.PhotonPersistentDisk != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("photonPersistentDisk"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validatePhotonPersistentDiskVolumeSource(source.PhotonPersistentDisk, fldPath.Child("photonPersistentDisk"))...)
+ }
+ }
+ if source.PortworxVolume != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("portworxVolume"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validatePortworxVolumeSource(source.PortworxVolume, fldPath.Child("portworxVolume"))...)
+ }
+ }
+ if source.AzureDisk != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("azureDisk"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateAzureDisk(source.AzureDisk, fldPath.Child("azureDisk"))...)
+ }
+ }
+ if source.StorageOS != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("storageos"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateStorageOSVolumeSource(source.StorageOS, fldPath.Child("storageos"))...)
+ }
+ }
+ if source.Projected != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("projected"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateProjectedVolumeSource(source.Projected, fldPath.Child("projected"))...)
+ }
+ }
+ if source.ScaleIO != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("scaleIO"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateScaleIOVolumeSource(source.ScaleIO, fldPath.Child("scaleIO"))...)
+ }
+ }
+
+ if numVolumes == 0 {
+ allErrs = append(allErrs, field.Required(fldPath, "must specify a volume type"))
+ }
+
+ return allErrs
+}
+
+func validateHostPathVolumeSource(hostPath *core.HostPathVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(hostPath.Path) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("path"), ""))
+ return allErrs
+ }
+
+ allErrs = append(allErrs, validatePathNoBacksteps(hostPath.Path, fldPath.Child("path"))...)
+ allErrs = append(allErrs, validateHostPathType(hostPath.Type, fldPath.Child("type"))...)
+ return allErrs
+}
+
+func validateGitRepoVolumeSource(gitRepo *core.GitRepoVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(gitRepo.Repository) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("repository"), ""))
+ }
+
+ pathErrs := validateLocalDescendingPath(gitRepo.Directory, fldPath.Child("directory"))
+ allErrs = append(allErrs, pathErrs...)
+ return allErrs
+}
+
+func validateISCSIVolumeSource(iscsi *core.ISCSIVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(iscsi.TargetPortal) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("targetPortal"), ""))
+ }
+ if len(iscsi.IQN) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("iqn"), ""))
+ } else {
+ if !strings.HasPrefix(iscsi.IQN, "iqn") && !strings.HasPrefix(iscsi.IQN, "eui") && !strings.HasPrefix(iscsi.IQN, "naa") {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("iqn"), iscsi.IQN, "must be valid format starting with iqn, eui, or naa"))
+ } else if strings.HasPrefix(iscsi.IQN, "iqn") && !iscsiInitiatorIqnRegex.MatchString(iscsi.IQN) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("iqn"), iscsi.IQN, "must be valid format"))
+ } else if strings.HasPrefix(iscsi.IQN, "eui") && !iscsiInitiatorEuiRegex.MatchString(iscsi.IQN) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("iqn"), iscsi.IQN, "must be valid format"))
+ } else if strings.HasPrefix(iscsi.IQN, "naa") && !iscsiInitiatorNaaRegex.MatchString(iscsi.IQN) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("iqn"), iscsi.IQN, "must be valid format"))
+ }
+ }
+ if iscsi.Lun < 0 || iscsi.Lun > 255 {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("lun"), iscsi.Lun, validation.InclusiveRangeError(0, 255)))
+ }
+ if (iscsi.DiscoveryCHAPAuth || iscsi.SessionCHAPAuth) && iscsi.SecretRef == nil {
+ allErrs = append(allErrs, field.Required(fldPath.Child("secretRef"), ""))
+ }
+ if iscsi.InitiatorName != nil {
+ initiator := *iscsi.InitiatorName
+ if !strings.HasPrefix(initiator, "iqn") && !strings.HasPrefix(initiator, "eui") && !strings.HasPrefix(initiator, "naa") {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("initiatorname"), initiator, "must be valid format starting with iqn, eui, or naa"))
+ }
+ if strings.HasPrefix(initiator, "iqn") && !iscsiInitiatorIqnRegex.MatchString(initiator) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("initiatorname"), initiator, "must be valid format"))
+ } else if strings.HasPrefix(initiator, "eui") && !iscsiInitiatorEuiRegex.MatchString(initiator) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("initiatorname"), initiator, "must be valid format"))
+ } else if strings.HasPrefix(initiator, "naa") && !iscsiInitiatorNaaRegex.MatchString(initiator) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("initiatorname"), initiator, "must be valid format"))
+ }
+ }
+ return allErrs
+}
+
+func validateISCSIPersistentVolumeSource(iscsi *core.ISCSIPersistentVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(iscsi.TargetPortal) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("targetPortal"), ""))
+ }
+ if len(iscsi.IQN) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("iqn"), ""))
+ } else {
+ if !strings.HasPrefix(iscsi.IQN, "iqn") && !strings.HasPrefix(iscsi.IQN, "eui") && !strings.HasPrefix(iscsi.IQN, "naa") {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("iqn"), iscsi.IQN, "must be valid format"))
+ } else if strings.HasPrefix(iscsi.IQN, "iqn") && !iscsiInitiatorIqnRegex.MatchString(iscsi.IQN) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("iqn"), iscsi.IQN, "must be valid format"))
+ } else if strings.HasPrefix(iscsi.IQN, "eui") && !iscsiInitiatorEuiRegex.MatchString(iscsi.IQN) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("iqn"), iscsi.IQN, "must be valid format"))
+ } else if strings.HasPrefix(iscsi.IQN, "naa") && !iscsiInitiatorNaaRegex.MatchString(iscsi.IQN) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("iqn"), iscsi.IQN, "must be valid format"))
+ }
+ }
+ if iscsi.Lun < 0 || iscsi.Lun > 255 {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("lun"), iscsi.Lun, validation.InclusiveRangeError(0, 255)))
+ }
+ if (iscsi.DiscoveryCHAPAuth || iscsi.SessionCHAPAuth) && iscsi.SecretRef == nil {
+ allErrs = append(allErrs, field.Required(fldPath.Child("secretRef"), ""))
+ }
+ if iscsi.SecretRef != nil {
+ if len(iscsi.SecretRef.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("secretRef", "name"), ""))
+ }
+ }
+ if iscsi.InitiatorName != nil {
+ initiator := *iscsi.InitiatorName
+ if !strings.HasPrefix(initiator, "iqn") && !strings.HasPrefix(initiator, "eui") && !strings.HasPrefix(initiator, "naa") {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("initiatorname"), initiator, "must be valid format"))
+ }
+ if strings.HasPrefix(initiator, "iqn") && !iscsiInitiatorIqnRegex.MatchString(initiator) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("initiatorname"), initiator, "must be valid format"))
+ } else if strings.HasPrefix(initiator, "eui") && !iscsiInitiatorEuiRegex.MatchString(initiator) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("initiatorname"), initiator, "must be valid format"))
+ } else if strings.HasPrefix(initiator, "naa") && !iscsiInitiatorNaaRegex.MatchString(initiator) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("initiatorname"), initiator, "must be valid format"))
+ }
+ }
+ return allErrs
+}
+
+func validateFCVolumeSource(fc *core.FCVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(fc.TargetWWNs) < 1 && len(fc.WWIDs) < 1 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("targetWWNs"), "must specify either targetWWNs or wwids, but not both"))
+ }
+
+ if len(fc.TargetWWNs) != 0 && len(fc.WWIDs) != 0 {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("targetWWNs"), fc.TargetWWNs, "targetWWNs and wwids can not be specified simultaneously"))
+ }
+
+ if len(fc.TargetWWNs) != 0 {
+ if fc.Lun == nil {
+ allErrs = append(allErrs, field.Required(fldPath.Child("lun"), "lun is required if targetWWNs is specified"))
+ } else {
+ if *fc.Lun < 0 || *fc.Lun > 255 {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("lun"), fc.Lun, validation.InclusiveRangeError(0, 255)))
+ }
+ }
+ }
+ return allErrs
+}
+
+func validateGCEPersistentDiskVolumeSource(pd *core.GCEPersistentDiskVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(pd.PDName) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("pdName"), ""))
+ }
+ if pd.Partition < 0 || pd.Partition > 255 {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("partition"), pd.Partition, pdPartitionErrorMsg))
+ }
+ return allErrs
+}
+
+func validateAWSElasticBlockStoreVolumeSource(PD *core.AWSElasticBlockStoreVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(PD.VolumeID) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("volumeID"), ""))
+ }
+ if PD.Partition < 0 || PD.Partition > 255 {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("partition"), PD.Partition, pdPartitionErrorMsg))
+ }
+ return allErrs
+}
+
+func validateSecretVolumeSource(secretSource *core.SecretVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(secretSource.SecretName) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("secretName"), ""))
+ }
+
+ secretMode := secretSource.DefaultMode
+ if secretMode != nil && (*secretMode > 0777 || *secretMode < 0) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("defaultMode"), *secretMode, fileModeErrorMsg))
+ }
+
+ itemsPath := fldPath.Child("items")
+ for i, kp := range secretSource.Items {
+ itemPath := itemsPath.Index(i)
+ allErrs = append(allErrs, validateKeyToPath(&kp, itemPath)...)
+ }
+ return allErrs
+}
+
+func validateConfigMapVolumeSource(configMapSource *core.ConfigMapVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(configMapSource.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("name"), ""))
+ }
+
+ configMapMode := configMapSource.DefaultMode
+ if configMapMode != nil && (*configMapMode > 0777 || *configMapMode < 0) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("defaultMode"), *configMapMode, fileModeErrorMsg))
+ }
+
+ itemsPath := fldPath.Child("items")
+ for i, kp := range configMapSource.Items {
+ itemPath := itemsPath.Index(i)
+ allErrs = append(allErrs, validateKeyToPath(&kp, itemPath)...)
+ }
+ return allErrs
+}
+
+func validateKeyToPath(kp *core.KeyToPath, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(kp.Key) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("key"), ""))
+ }
+ if len(kp.Path) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("path"), ""))
+ }
+ allErrs = append(allErrs, validateLocalNonReservedPath(kp.Path, fldPath.Child("path"))...)
+ if kp.Mode != nil && (*kp.Mode > 0777 || *kp.Mode < 0) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("mode"), *kp.Mode, fileModeErrorMsg))
+ }
+
+ return allErrs
+}
+
+func validatePersistentClaimVolumeSource(claim *core.PersistentVolumeClaimVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(claim.ClaimName) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("claimName"), ""))
+ }
+ return allErrs
+}
+
+func validateNFSVolumeSource(nfs *core.NFSVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(nfs.Server) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("server"), ""))
+ }
+ if len(nfs.Path) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("path"), ""))
+ }
+ if !path.IsAbs(nfs.Path) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("path"), nfs.Path, "must be an absolute path"))
+ }
+ return allErrs
+}
+
+func validateQuobyteVolumeSource(quobyte *core.QuobyteVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(quobyte.Registry) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("registry"), "must be a host:port pair or multiple pairs separated by commas"))
+ } else {
+ for _, hostPortPair := range strings.Split(quobyte.Registry, ",") {
+ if _, _, err := net.SplitHostPort(hostPortPair); err != nil {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("registry"), quobyte.Registry, "must be a host:port pair or multiple pairs separated by commas"))
+ }
+ }
+ }
+
+ if len(quobyte.Volume) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("volume"), ""))
+ }
+ return allErrs
+}
+
+func validateGlusterfsVolumeSource(glusterfs *core.GlusterfsVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(glusterfs.EndpointsName) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("endpoints"), ""))
+ }
+ if len(glusterfs.Path) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("path"), ""))
+ }
+ return allErrs
+}
+
+func validateFlockerVolumeSource(flocker *core.FlockerVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(flocker.DatasetName) == 0 && len(flocker.DatasetUUID) == 0 {
+ //TODO: consider adding a RequiredOneOf() error for this and similar cases
+ allErrs = append(allErrs, field.Required(fldPath, "one of datasetName and datasetUUID is required"))
+ }
+ if len(flocker.DatasetName) != 0 && len(flocker.DatasetUUID) != 0 {
+ allErrs = append(allErrs, field.Invalid(fldPath, "resource", "datasetName and datasetUUID can not be specified simultaneously"))
+ }
+ if strings.Contains(flocker.DatasetName, "/") {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("datasetName"), flocker.DatasetName, "must not contain '/'"))
+ }
+ return allErrs
+}
+
+var validVolumeDownwardAPIFieldPathExpressions = sets.NewString(
+ "metadata.name",
+ "metadata.namespace",
+ "metadata.labels",
+ "metadata.annotations",
+ "metadata.uid")
+
+func validateDownwardAPIVolumeFile(file *core.DownwardAPIVolumeFile, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if len(file.Path) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("path"), ""))
+ }
+ allErrs = append(allErrs, validateLocalNonReservedPath(file.Path, fldPath.Child("path"))...)
+ if file.FieldRef != nil {
+ allErrs = append(allErrs, validateObjectFieldSelector(file.FieldRef, &validVolumeDownwardAPIFieldPathExpressions, fldPath.Child("fieldRef"))...)
+ if file.ResourceFieldRef != nil {
+ allErrs = append(allErrs, field.Invalid(fldPath, "resource", "fieldRef and resourceFieldRef can not be specified simultaneously"))
+ }
+ } else if file.ResourceFieldRef != nil {
+ allErrs = append(allErrs, validateContainerResourceFieldSelector(file.ResourceFieldRef, &validContainerResourceFieldPathExpressions, fldPath.Child("resourceFieldRef"), true)...)
+ } else {
+ allErrs = append(allErrs, field.Required(fldPath, "one of fieldRef and resourceFieldRef is required"))
+ }
+ if file.Mode != nil && (*file.Mode > 0777 || *file.Mode < 0) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("mode"), *file.Mode, fileModeErrorMsg))
+ }
+
+ return allErrs
+}
+
+func validateDownwardAPIVolumeSource(downwardAPIVolume *core.DownwardAPIVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ downwardAPIMode := downwardAPIVolume.DefaultMode
+ if downwardAPIMode != nil && (*downwardAPIMode > 0777 || *downwardAPIMode < 0) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("defaultMode"), *downwardAPIMode, fileModeErrorMsg))
+ }
+
+ for _, file := range downwardAPIVolume.Items {
+ allErrs = append(allErrs, validateDownwardAPIVolumeFile(&file, fldPath)...)
+ }
+ return allErrs
+}
+
+func validateProjectionSources(projection *core.ProjectedVolumeSource, projectionMode *int32, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ allPaths := sets.String{}
+
+ for _, source := range projection.Sources {
+ numSources := 0
+ if source.Secret != nil {
+ if numSources > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("secret"), "may not specify more than 1 volume type"))
+ } else {
+ numSources++
+ if len(source.Secret.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("name"), ""))
+ }
+ itemsPath := fldPath.Child("items")
+ for i, kp := range source.Secret.Items {
+ itemPath := itemsPath.Index(i)
+ allErrs = append(allErrs, validateKeyToPath(&kp, itemPath)...)
+ if len(kp.Path) > 0 {
+ curPath := kp.Path
+ if !allPaths.Has(curPath) {
+ allPaths.Insert(curPath)
+ } else {
+ allErrs = append(allErrs, field.Invalid(fldPath, source.Secret.Name, "conflicting duplicate paths"))
+ }
+ }
+ }
+ }
+ }
+ if source.ConfigMap != nil {
+ if numSources > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("configMap"), "may not specify more than 1 volume type"))
+ } else {
+ numSources++
+ if len(source.ConfigMap.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("name"), ""))
+ }
+ itemsPath := fldPath.Child("items")
+ for i, kp := range source.ConfigMap.Items {
+ itemPath := itemsPath.Index(i)
+ allErrs = append(allErrs, validateKeyToPath(&kp, itemPath)...)
+ if len(kp.Path) > 0 {
+ curPath := kp.Path
+ if !allPaths.Has(curPath) {
+ allPaths.Insert(curPath)
+ } else {
+ allErrs = append(allErrs, field.Invalid(fldPath, source.ConfigMap.Name, "conflicting duplicate paths"))
+ }
+
+ }
+ }
+ }
+ }
+ if source.DownwardAPI != nil {
+ if numSources > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("downwardAPI"), "may not specify more than 1 volume type"))
+ } else {
+ numSources++
+ for _, file := range source.DownwardAPI.Items {
+ allErrs = append(allErrs, validateDownwardAPIVolumeFile(&file, fldPath.Child("downwardAPI"))...)
+ if len(file.Path) > 0 {
+ curPath := file.Path
+ if !allPaths.Has(curPath) {
+ allPaths.Insert(curPath)
+ } else {
+ allErrs = append(allErrs, field.Invalid(fldPath, curPath, "conflicting duplicate paths"))
+ }
+
+ }
+ }
+ }
+ }
+ }
+ return allErrs
+}
+
+func validateProjectedVolumeSource(projection *core.ProjectedVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ projectionMode := projection.DefaultMode
+ if projectionMode != nil && (*projectionMode > 0777 || *projectionMode < 0) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("defaultMode"), *projectionMode, fileModeErrorMsg))
+ }
+
+ allErrs = append(allErrs, validateProjectionSources(projection, projectionMode, fldPath)...)
+ return allErrs
+}
+
+var supportedHostPathTypes = sets.NewString(
+ string(core.HostPathUnset),
+ string(core.HostPathDirectoryOrCreate),
+ string(core.HostPathDirectory),
+ string(core.HostPathFileOrCreate),
+ string(core.HostPathFile),
+ string(core.HostPathSocket),
+ string(core.HostPathCharDev),
+ string(core.HostPathBlockDev))
+
+func validateHostPathType(hostPathType *core.HostPathType, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if hostPathType != nil && !supportedHostPathTypes.Has(string(*hostPathType)) {
+ allErrs = append(allErrs, field.NotSupported(fldPath, hostPathType, supportedHostPathTypes.List()))
+ }
+
+ return allErrs
+}
+
+// This validate will make sure targetPath:
+// 1. is not abs path
+// 2. does not have any element which is ".."
+func validateLocalDescendingPath(targetPath string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if path.IsAbs(targetPath) {
+ allErrs = append(allErrs, field.Invalid(fldPath, targetPath, "must be a relative path"))
+ }
+
+ allErrs = append(allErrs, validatePathNoBacksteps(targetPath, fldPath)...)
+
+ return allErrs
+}
+
+// validatePathNoBacksteps makes sure the targetPath does not have any `..` path elements when split
+//
+// This assumes the OS of the apiserver and the nodes are the same. The same check should be done
+// on the node to ensure there are no backsteps.
+func validatePathNoBacksteps(targetPath string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ parts := strings.Split(filepath.ToSlash(targetPath), "/")
+ for _, item := range parts {
+ if item == ".." {
+ allErrs = append(allErrs, field.Invalid(fldPath, targetPath, "must not contain '..'"))
+ break // even for `../../..`, one error is sufficient to make the point
+ }
+ }
+ return allErrs
+}
+
+// validateMountPropagation verifies that MountPropagation field is valid and
+// allowed for given container.
+func validateMountPropagation(mountPropagation *core.MountPropagationMode, container *core.Container, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if mountPropagation == nil {
+ return allErrs
+ }
+ if !utilfeature.DefaultFeatureGate.Enabled(features.MountPropagation) {
+ allErrs = append(allErrs, field.Forbidden(fldPath, "mount propagation is disabled by feature-gate"))
+ return allErrs
+ }
+
+ supportedMountPropagations := sets.NewString(string(core.MountPropagationBidirectional), string(core.MountPropagationHostToContainer))
+ if !supportedMountPropagations.Has(string(*mountPropagation)) {
+ allErrs = append(allErrs, field.NotSupported(fldPath, *mountPropagation, supportedMountPropagations.List()))
+ }
+
+ if container == nil {
+ // The container is not available yet, e.g. during validation of
+ // PodPreset. Stop validation now, Pod validation will refuse final
+ // Pods with Bidirectional propagation in non-privileged containers.
+ return allErrs
+ }
+
+ privileged := container.SecurityContext != nil && container.SecurityContext.Privileged != nil && *container.SecurityContext.Privileged
+ if *mountPropagation == core.MountPropagationBidirectional && !privileged {
+ allErrs = append(allErrs, field.Forbidden(fldPath, "Bidirectional mount propagation is available only to privileged containers"))
+ }
+ return allErrs
+}
+
+// This validate will make sure targetPath:
+// 1. is not abs path
+// 2. does not contain any '..' elements
+// 3. does not start with '..'
+func validateLocalNonReservedPath(targetPath string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ allErrs = append(allErrs, validateLocalDescendingPath(targetPath, fldPath)...)
+ // Don't report this error if the check for .. elements already caught it.
+ if strings.HasPrefix(targetPath, "..") && !strings.HasPrefix(targetPath, "../") {
+ allErrs = append(allErrs, field.Invalid(fldPath, targetPath, "must not start with '..'"))
+ }
+ return allErrs
+}
+
+func validateRBDVolumeSource(rbd *core.RBDVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(rbd.CephMonitors) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("monitors"), ""))
+ }
+ if len(rbd.RBDImage) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("image"), ""))
+ }
+ return allErrs
+}
+
+func validateRBDPersistentVolumeSource(rbd *core.RBDPersistentVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(rbd.CephMonitors) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("monitors"), ""))
+ }
+ if len(rbd.RBDImage) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("image"), ""))
+ }
+ return allErrs
+}
+
+func validateCinderVolumeSource(cd *core.CinderVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(cd.VolumeID) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("volumeID"), ""))
+ }
+ return allErrs
+}
+
+func validateCephFSVolumeSource(cephfs *core.CephFSVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(cephfs.Monitors) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("monitors"), ""))
+ }
+ return allErrs
+}
+
+func validateCephFSPersistentVolumeSource(cephfs *core.CephFSPersistentVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(cephfs.Monitors) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("monitors"), ""))
+ }
+ return allErrs
+}
+
+func validateFlexVolumeSource(fv *core.FlexVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(fv.Driver) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("driver"), ""))
+ }
+
+ // Make sure user-specified options don't use kubernetes namespaces
+ for k := range fv.Options {
+ namespace := k
+ if parts := strings.SplitN(k, "/", 2); len(parts) == 2 {
+ namespace = parts[0]
+ }
+ normalized := "." + strings.ToLower(namespace)
+ if strings.HasSuffix(normalized, ".kubernetes.io") || strings.HasSuffix(normalized, ".k8s.io") {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("options").Key(k), k, "kubernetes.io and k8s.io namespaces are reserved"))
+ }
+ }
+
+ return allErrs
+}
+
+func validateFlexPersistentVolumeSource(fv *core.FlexPersistentVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(fv.Driver) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("driver"), ""))
+ }
+
+ // Make sure user-specified options don't use kubernetes namespaces
+ for k := range fv.Options {
+ namespace := k
+ if parts := strings.SplitN(k, "/", 2); len(parts) == 2 {
+ namespace = parts[0]
+ }
+ normalized := "." + strings.ToLower(namespace)
+ if strings.HasSuffix(normalized, ".kubernetes.io") || strings.HasSuffix(normalized, ".k8s.io") {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("options").Key(k), k, "kubernetes.io and k8s.io namespaces are reserved"))
+ }
+ }
+
+ return allErrs
+}
+
+func validateAzureFile(azure *core.AzureFileVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if azure.SecretName == "" {
+ allErrs = append(allErrs, field.Required(fldPath.Child("secretName"), ""))
+ }
+ if azure.ShareName == "" {
+ allErrs = append(allErrs, field.Required(fldPath.Child("shareName"), ""))
+ }
+ return allErrs
+}
+
+func validateAzureFilePV(azure *core.AzureFilePersistentVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if azure.SecretName == "" {
+ allErrs = append(allErrs, field.Required(fldPath.Child("secretName"), ""))
+ }
+ if azure.ShareName == "" {
+ allErrs = append(allErrs, field.Required(fldPath.Child("shareName"), ""))
+ }
+ if azure.SecretNamespace != nil {
+ if len(*azure.SecretNamespace) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("secretNamespace"), ""))
+ }
+ }
+ return allErrs
+}
+
+func validateAzureDisk(azure *core.AzureDiskVolumeSource, fldPath *field.Path) field.ErrorList {
+ var supportedCachingModes = sets.NewString(string(core.AzureDataDiskCachingNone), string(core.AzureDataDiskCachingReadOnly), string(core.AzureDataDiskCachingReadWrite))
+ var supportedDiskKinds = sets.NewString(string(core.AzureSharedBlobDisk), string(core.AzureDedicatedBlobDisk), string(core.AzureManagedDisk))
+
+ diskUriSupportedManaged := []string{"/subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id}"}
+ diskUriSupportedblob := []string{"https://{account-name}.blob.core.windows.net/{container-name}/{disk-name}.vhd"}
+
+ allErrs := field.ErrorList{}
+ if azure.DiskName == "" {
+ allErrs = append(allErrs, field.Required(fldPath.Child("diskName"), ""))
+ }
+
+ if azure.DataDiskURI == "" {
+ allErrs = append(allErrs, field.Required(fldPath.Child("diskURI"), ""))
+ }
+
+ if azure.CachingMode != nil && !supportedCachingModes.Has(string(*azure.CachingMode)) {
+ allErrs = append(allErrs, field.NotSupported(fldPath.Child("cachingMode"), *azure.CachingMode, supportedCachingModes.List()))
+ }
+
+ if azure.Kind != nil && !supportedDiskKinds.Has(string(*azure.Kind)) {
+ allErrs = append(allErrs, field.NotSupported(fldPath.Child("kind"), *azure.Kind, supportedDiskKinds.List()))
+ }
+
+ // validate that DiskUri is the correct format
+ if azure.Kind != nil && *azure.Kind == core.AzureManagedDisk && strings.Index(azure.DataDiskURI, "/subscriptions/") != 0 {
+ allErrs = append(allErrs, field.NotSupported(fldPath.Child("diskURI"), azure.DataDiskURI, diskUriSupportedManaged))
+ }
+
+ if azure.Kind != nil && *azure.Kind != core.AzureManagedDisk && strings.Index(azure.DataDiskURI, "https://") != 0 {
+ allErrs = append(allErrs, field.NotSupported(fldPath.Child("diskURI"), azure.DataDiskURI, diskUriSupportedblob))
+ }
+
+ return allErrs
+}
+
+func validateVsphereVolumeSource(cd *core.VsphereVirtualDiskVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(cd.VolumePath) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("volumePath"), ""))
+ }
+ return allErrs
+}
+
+func validatePhotonPersistentDiskVolumeSource(cd *core.PhotonPersistentDiskVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(cd.PdID) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("pdID"), ""))
+ }
+ return allErrs
+}
+
+func validatePortworxVolumeSource(pwx *core.PortworxVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(pwx.VolumeID) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("volumeID"), ""))
+ }
+ return allErrs
+}
+
+func validateScaleIOVolumeSource(sio *core.ScaleIOVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if sio.Gateway == "" {
+ allErrs = append(allErrs, field.Required(fldPath.Child("gateway"), ""))
+ }
+ if sio.System == "" {
+ allErrs = append(allErrs, field.Required(fldPath.Child("system"), ""))
+ }
+ if sio.VolumeName == "" {
+ allErrs = append(allErrs, field.Required(fldPath.Child("volumeName"), ""))
+ }
+ return allErrs
+}
+
+func validateScaleIOPersistentVolumeSource(sio *core.ScaleIOPersistentVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if sio.Gateway == "" {
+ allErrs = append(allErrs, field.Required(fldPath.Child("gateway"), ""))
+ }
+ if sio.System == "" {
+ allErrs = append(allErrs, field.Required(fldPath.Child("system"), ""))
+ }
+ if sio.VolumeName == "" {
+ allErrs = append(allErrs, field.Required(fldPath.Child("volumeName"), ""))
+ }
+ return allErrs
+}
+
+func validateLocalVolumeSource(ls *core.LocalVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if ls.Path == "" {
+ allErrs = append(allErrs, field.Required(fldPath.Child("path"), ""))
+ return allErrs
+ }
+
+ if !path.IsAbs(ls.Path) {
+ allErrs = append(allErrs, field.Invalid(fldPath, ls.Path, "must be an absolute path"))
+ }
+ allErrs = append(allErrs, validatePathNoBacksteps(ls.Path, fldPath.Child("path"))...)
+ return allErrs
+}
+
+func validateStorageOSVolumeSource(storageos *core.StorageOSVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(storageos.VolumeName) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("volumeName"), ""))
+ } else {
+ allErrs = append(allErrs, ValidateDNS1123Label(storageos.VolumeName, fldPath.Child("volumeName"))...)
+ }
+ if len(storageos.VolumeNamespace) > 0 {
+ allErrs = append(allErrs, ValidateDNS1123Label(storageos.VolumeNamespace, fldPath.Child("volumeNamespace"))...)
+ }
+ if storageos.SecretRef != nil {
+ if len(storageos.SecretRef.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("secretRef", "name"), ""))
+ }
+ }
+ return allErrs
+}
+
+func validateStorageOSPersistentVolumeSource(storageos *core.StorageOSPersistentVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(storageos.VolumeName) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("volumeName"), ""))
+ } else {
+ allErrs = append(allErrs, ValidateDNS1123Label(storageos.VolumeName, fldPath.Child("volumeName"))...)
+ }
+ if len(storageos.VolumeNamespace) > 0 {
+ allErrs = append(allErrs, ValidateDNS1123Label(storageos.VolumeNamespace, fldPath.Child("volumeNamespace"))...)
+ }
+ if storageos.SecretRef != nil {
+ if len(storageos.SecretRef.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("secretRef", "name"), ""))
+ }
+ if len(storageos.SecretRef.Namespace) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("secretRef", "namespace"), ""))
+ }
+ }
+ return allErrs
+}
+
+func validateCSIPersistentVolumeSource(csi *core.CSIPersistentVolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if !utilfeature.DefaultFeatureGate.Enabled(features.CSIPersistentVolume) {
+ allErrs = append(allErrs, field.Forbidden(fldPath, "CSIPersistentVolume disabled by feature-gate"))
+ }
+
+ if len(csi.Driver) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("driver"), ""))
+ }
+
+ if len(csi.Driver) > 63 {
+ allErrs = append(allErrs, field.TooLong(fldPath.Child("driver"), csi.Driver, 63))
+ }
+
+ if !csiDriverNameRexp.MatchString(csi.Driver) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("driver"), csi.Driver, validation.RegexError(csiDriverNameRexpErrMsg, csiDriverNameRexpFmt, "csi-hostpath")))
+ }
+
+ if len(csi.VolumeHandle) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("volumeHandle"), ""))
+ }
+
+ if csi.ControllerPublishSecretRef != nil {
+ if len(csi.ControllerPublishSecretRef.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("controllerPublishSecretRef", "name"), ""))
+ } else {
+ allErrs = append(allErrs, ValidateDNS1123Label(csi.ControllerPublishSecretRef.Name, fldPath.Child("name"))...)
+ }
+ if len(csi.ControllerPublishSecretRef.Namespace) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("controllerPublishSecretRef", "namespace"), ""))
+ } else {
+ allErrs = append(allErrs, ValidateDNS1123Label(csi.ControllerPublishSecretRef.Namespace, fldPath.Child("namespace"))...)
+ }
+ }
+
+ if csi.NodePublishSecretRef != nil {
+ if len(csi.NodePublishSecretRef.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("nodePublishSecretRef ", "name"), ""))
+ } else {
+ allErrs = append(allErrs, ValidateDNS1123Label(csi.NodePublishSecretRef.Name, fldPath.Child("name"))...)
+ }
+ if len(csi.NodePublishSecretRef.Namespace) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("nodePublishSecretRef ", "namespace"), ""))
+ } else {
+ allErrs = append(allErrs, ValidateDNS1123Label(csi.NodePublishSecretRef.Namespace, fldPath.Child("namespace"))...)
+ }
+ }
+
+ if csi.NodeStageSecretRef != nil {
+ if len(csi.NodeStageSecretRef.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("nodeStageSecretRef", "name"), ""))
+ } else {
+ allErrs = append(allErrs, ValidateDNS1123Label(csi.NodeStageSecretRef.Name, fldPath.Child("name"))...)
+ }
+ if len(csi.NodeStageSecretRef.Namespace) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("nodeStageSecretRef", "namespace"), ""))
+ } else {
+ allErrs = append(allErrs, ValidateDNS1123Label(csi.NodeStageSecretRef.Namespace, fldPath.Child("namespace"))...)
+ }
+ }
+
+ return allErrs
+}
+
+// ValidatePersistentVolumeName checks that a name is appropriate for a
+// PersistentVolumeName object.
+var ValidatePersistentVolumeName = NameIsDNSSubdomain
+
+var supportedAccessModes = sets.NewString(string(core.ReadWriteOnce), string(core.ReadOnlyMany), string(core.ReadWriteMany))
+
+var supportedReclaimPolicy = sets.NewString(string(core.PersistentVolumeReclaimDelete), string(core.PersistentVolumeReclaimRecycle), string(core.PersistentVolumeReclaimRetain))
+
+var supportedVolumeModes = sets.NewString(string(core.PersistentVolumeBlock), string(core.PersistentVolumeFilesystem))
+
+func ValidatePersistentVolume(pv *core.PersistentVolume) field.ErrorList {
+ metaPath := field.NewPath("metadata")
+ allErrs := ValidateObjectMeta(&pv.ObjectMeta, false, ValidatePersistentVolumeName, metaPath)
+
+ specPath := field.NewPath("spec")
+ if len(pv.Spec.AccessModes) == 0 {
+ allErrs = append(allErrs, field.Required(specPath.Child("accessModes"), ""))
+ }
+ for _, mode := range pv.Spec.AccessModes {
+ if !supportedAccessModes.Has(string(mode)) {
+ allErrs = append(allErrs, field.NotSupported(specPath.Child("accessModes"), mode, supportedAccessModes.List()))
+ }
+ }
+
+ if len(pv.Spec.Capacity) == 0 {
+ allErrs = append(allErrs, field.Required(specPath.Child("capacity"), ""))
+ }
+
+ if _, ok := pv.Spec.Capacity[core.ResourceStorage]; !ok || len(pv.Spec.Capacity) > 1 {
+ allErrs = append(allErrs, field.NotSupported(specPath.Child("capacity"), pv.Spec.Capacity, []string{string(core.ResourceStorage)}))
+ }
+ capPath := specPath.Child("capacity")
+ for r, qty := range pv.Spec.Capacity {
+ allErrs = append(allErrs, validateBasicResource(qty, capPath.Key(string(r)))...)
+ allErrs = append(allErrs, ValidatePositiveQuantityValue(qty, capPath.Key(string(r)))...)
+ }
+ if len(string(pv.Spec.PersistentVolumeReclaimPolicy)) > 0 {
+ if !supportedReclaimPolicy.Has(string(pv.Spec.PersistentVolumeReclaimPolicy)) {
+ allErrs = append(allErrs, field.NotSupported(specPath.Child("persistentVolumeReclaimPolicy"), pv.Spec.PersistentVolumeReclaimPolicy, supportedReclaimPolicy.List()))
+ }
+ }
+
+ nodeAffinitySpecified, errs := validateStorageNodeAffinityAnnotation(pv.ObjectMeta.Annotations, metaPath.Child("annotations"))
+ allErrs = append(allErrs, errs...)
+
+ volumeNodeAffinitySpecified, errs := validateVolumeNodeAffinity(pv.Spec.NodeAffinity, specPath.Child("nodeAffinity"))
+ allErrs = append(allErrs, errs...)
+
+ if nodeAffinitySpecified && volumeNodeAffinitySpecified {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("nodeAffinity"), "may not specify both alpha nodeAffinity annotation and nodeAffinity field"))
+ }
+
+ nodeAffinitySpecified = nodeAffinitySpecified || volumeNodeAffinitySpecified
+
+ numVolumes := 0
+ if pv.Spec.HostPath != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("hostPath"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateHostPathVolumeSource(pv.Spec.HostPath, specPath.Child("hostPath"))...)
+ }
+ }
+ if pv.Spec.GCEPersistentDisk != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("gcePersistentDisk"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateGCEPersistentDiskVolumeSource(pv.Spec.GCEPersistentDisk, specPath.Child("persistentDisk"))...)
+ }
+ }
+ if pv.Spec.AWSElasticBlockStore != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("awsElasticBlockStore"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateAWSElasticBlockStoreVolumeSource(pv.Spec.AWSElasticBlockStore, specPath.Child("awsElasticBlockStore"))...)
+ }
+ }
+ if pv.Spec.Glusterfs != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("glusterfs"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateGlusterfsVolumeSource(pv.Spec.Glusterfs, specPath.Child("glusterfs"))...)
+ }
+ }
+ if pv.Spec.Flocker != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("flocker"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateFlockerVolumeSource(pv.Spec.Flocker, specPath.Child("flocker"))...)
+ }
+ }
+ if pv.Spec.NFS != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("nfs"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateNFSVolumeSource(pv.Spec.NFS, specPath.Child("nfs"))...)
+ }
+ }
+ if pv.Spec.RBD != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("rbd"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateRBDPersistentVolumeSource(pv.Spec.RBD, specPath.Child("rbd"))...)
+ }
+ }
+ if pv.Spec.Quobyte != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("quobyte"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateQuobyteVolumeSource(pv.Spec.Quobyte, specPath.Child("quobyte"))...)
+ }
+ }
+ if pv.Spec.CephFS != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("cephFS"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateCephFSPersistentVolumeSource(pv.Spec.CephFS, specPath.Child("cephfs"))...)
+ }
+ }
+ if pv.Spec.ISCSI != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("iscsi"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateISCSIPersistentVolumeSource(pv.Spec.ISCSI, specPath.Child("iscsi"))...)
+ }
+ if pv.Spec.ISCSI.InitiatorName != nil && len(pv.ObjectMeta.Name+":"+pv.Spec.ISCSI.TargetPortal) > 64 {
+ tooLongErr := "Total length of <volume name>:<iscsi.targetPortal> must be under 64 characters if iscsi.initiatorName is specified."
+ allErrs = append(allErrs, field.Invalid(metaPath.Child("name"), pv.ObjectMeta.Name, tooLongErr))
+ }
+ }
+ if pv.Spec.Cinder != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("cinder"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateCinderVolumeSource(pv.Spec.Cinder, specPath.Child("cinder"))...)
+ }
+ }
+ if pv.Spec.FC != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("fc"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateFCVolumeSource(pv.Spec.FC, specPath.Child("fc"))...)
+ }
+ }
+ if pv.Spec.FlexVolume != nil {
+ numVolumes++
+ allErrs = append(allErrs, validateFlexPersistentVolumeSource(pv.Spec.FlexVolume, specPath.Child("flexVolume"))...)
+ }
+ if pv.Spec.AzureFile != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("azureFile"), "may not specify more than 1 volume type"))
+
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateAzureFilePV(pv.Spec.AzureFile, specPath.Child("azureFile"))...)
+ }
+ }
+
+ if pv.Spec.VsphereVolume != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("vsphereVolume"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateVsphereVolumeSource(pv.Spec.VsphereVolume, specPath.Child("vsphereVolume"))...)
+ }
+ }
+ if pv.Spec.PhotonPersistentDisk != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("photonPersistentDisk"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validatePhotonPersistentDiskVolumeSource(pv.Spec.PhotonPersistentDisk, specPath.Child("photonPersistentDisk"))...)
+ }
+ }
+ if pv.Spec.PortworxVolume != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("portworxVolume"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validatePortworxVolumeSource(pv.Spec.PortworxVolume, specPath.Child("portworxVolume"))...)
+ }
+ }
+ if pv.Spec.AzureDisk != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("azureDisk"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateAzureDisk(pv.Spec.AzureDisk, specPath.Child("azureDisk"))...)
+ }
+ }
+ if pv.Spec.ScaleIO != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("scaleIO"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateScaleIOPersistentVolumeSource(pv.Spec.ScaleIO, specPath.Child("scaleIO"))...)
+ }
+ }
+ if pv.Spec.Local != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("local"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ if !utilfeature.DefaultFeatureGate.Enabled(features.PersistentLocalVolumes) {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("local"), "Local volumes are disabled by feature-gate"))
+ }
+ allErrs = append(allErrs, validateLocalVolumeSource(pv.Spec.Local, specPath.Child("local"))...)
+
+ // NodeAffinity is required
+ if !nodeAffinitySpecified {
+ allErrs = append(allErrs, field.Required(metaPath.Child("annotations"), "Local volume requires node affinity"))
+ }
+ }
+ }
+ if pv.Spec.StorageOS != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("storageos"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateStorageOSPersistentVolumeSource(pv.Spec.StorageOS, specPath.Child("storageos"))...)
+ }
+ }
+
+ if pv.Spec.CSI != nil {
+ if numVolumes > 0 {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("csi"), "may not specify more than 1 volume type"))
+ } else {
+ numVolumes++
+ allErrs = append(allErrs, validateCSIPersistentVolumeSource(pv.Spec.CSI, specPath.Child("csi"))...)
+ }
+ }
+
+ if numVolumes == 0 {
+ allErrs = append(allErrs, field.Required(specPath, "must specify a volume type"))
+ }
+
+ // do not allow hostPath mounts of '/' to have a 'recycle' reclaim policy
+ if pv.Spec.HostPath != nil && path.Clean(pv.Spec.HostPath.Path) == "/" && pv.Spec.PersistentVolumeReclaimPolicy == core.PersistentVolumeReclaimRecycle {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("persistentVolumeReclaimPolicy"), "may not be 'recycle' for a hostPath mount of '/'"))
+ }
+
+ if len(pv.Spec.StorageClassName) > 0 {
+ for _, msg := range ValidateClassName(pv.Spec.StorageClassName, false) {
+ allErrs = append(allErrs, field.Invalid(specPath.Child("storageClassName"), pv.Spec.StorageClassName, msg))
+ }
+ }
+ if pv.Spec.VolumeMode != nil && !utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("volumeMode"), "PersistentVolume volumeMode is disabled by feature-gate"))
+ } else if pv.Spec.VolumeMode != nil && !supportedVolumeModes.Has(string(*pv.Spec.VolumeMode)) {
+ allErrs = append(allErrs, field.NotSupported(specPath.Child("volumeMode"), *pv.Spec.VolumeMode, supportedVolumeModes.List()))
+ }
+ return allErrs
+}
+
+// ValidatePersistentVolumeUpdate tests to see if the update is legal for an end user to make.
+// newPv is updated with fields that cannot be changed.
+func ValidatePersistentVolumeUpdate(newPv, oldPv *core.PersistentVolume) field.ErrorList {
+ allErrs := field.ErrorList{}
+ allErrs = ValidatePersistentVolume(newPv)
+
+ // PersistentVolumeSource should be immutable after creation.
+ if !apiequality.Semantic.DeepEqual(newPv.Spec.PersistentVolumeSource, oldPv.Spec.PersistentVolumeSource) {
+ allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "persistentvolumesource"), "is immutable after creation"))
+ }
+
+ newPv.Status = oldPv.Status
+
+ if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) {
+ allErrs = append(allErrs, ValidateImmutableField(newPv.Spec.VolumeMode, oldPv.Spec.VolumeMode, field.NewPath("volumeMode"))...)
+ }
+
+ if utilfeature.DefaultFeatureGate.Enabled(features.VolumeScheduling) {
+ // Allow setting NodeAffinity if oldPv NodeAffinity was not set
+ if oldPv.Spec.NodeAffinity != nil {
+ allErrs = append(allErrs, ValidateImmutableField(newPv.Spec.NodeAffinity, oldPv.Spec.NodeAffinity, field.NewPath("nodeAffinity"))...)
+ }
+ }
+
+ return allErrs
+}
+
+// ValidatePersistentVolumeStatusUpdate tests to see if the status update is legal for an end user to make.
+// newPv is updated with fields that cannot be changed.
+func ValidatePersistentVolumeStatusUpdate(newPv, oldPv *core.PersistentVolume) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&newPv.ObjectMeta, &oldPv.ObjectMeta, field.NewPath("metadata"))
+ if len(newPv.ResourceVersion) == 0 {
+ allErrs = append(allErrs, field.Required(field.NewPath("resourceVersion"), ""))
+ }
+ newPv.Spec = oldPv.Spec
+ return allErrs
+}
+
+// ValidatePersistentVolumeClaim validates a PersistentVolumeClaim
+func ValidatePersistentVolumeClaim(pvc *core.PersistentVolumeClaim) field.ErrorList {
+ allErrs := ValidateObjectMeta(&pvc.ObjectMeta, true, ValidatePersistentVolumeName, field.NewPath("metadata"))
+ allErrs = append(allErrs, ValidatePersistentVolumeClaimSpec(&pvc.Spec, field.NewPath("spec"))...)
+ return allErrs
+}
+
+// ValidatePersistentVolumeClaimSpec validates a PersistentVolumeClaimSpec
+func ValidatePersistentVolumeClaimSpec(spec *core.PersistentVolumeClaimSpec, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(spec.AccessModes) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("accessModes"), "at least 1 access mode is required"))
+ }
+ if spec.Selector != nil {
+ allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...)
+ }
+ for _, mode := range spec.AccessModes {
+ if mode != core.ReadWriteOnce && mode != core.ReadOnlyMany && mode != core.ReadWriteMany {
+ allErrs = append(allErrs, field.NotSupported(fldPath.Child("accessModes"), mode, supportedAccessModes.List()))
+ }
+ }
+ storageValue, ok := spec.Resources.Requests[core.ResourceStorage]
+ if !ok {
+ allErrs = append(allErrs, field.Required(fldPath.Child("resources").Key(string(core.ResourceStorage)), ""))
+ } else {
+ allErrs = append(allErrs, ValidateResourceQuantityValue(string(core.ResourceStorage), storageValue, fldPath.Child("resources").Key(string(core.ResourceStorage)))...)
+ allErrs = append(allErrs, ValidatePositiveQuantityValue(storageValue, fldPath.Child("resources").Key(string(core.ResourceStorage)))...)
+ }
+
+ if spec.StorageClassName != nil && len(*spec.StorageClassName) > 0 {
+ for _, msg := range ValidateClassName(*spec.StorageClassName, false) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("storageClassName"), *spec.StorageClassName, msg))
+ }
+ }
+ if spec.VolumeMode != nil && !utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("volumeMode"), "PersistentVolumeClaim volumeMode is disabled by feature-gate"))
+ } else if spec.VolumeMode != nil && !supportedVolumeModes.Has(string(*spec.VolumeMode)) {
+ allErrs = append(allErrs, field.NotSupported(fldPath.Child("volumeMode"), *spec.VolumeMode, supportedVolumeModes.List()))
+ }
+ return allErrs
+}
+
+// ValidatePersistentVolumeClaimUpdate validates an update to a PersistentVolumeClaim
+func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *core.PersistentVolumeClaim) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&newPvc.ObjectMeta, &oldPvc.ObjectMeta, field.NewPath("metadata"))
+ allErrs = append(allErrs, ValidatePersistentVolumeClaim(newPvc)...)
+ newPvcClone := newPvc.DeepCopy()
+ oldPvcClone := oldPvc.DeepCopy()
+
+ // PVController needs to update PVC.Spec w/ VolumeName.
+ // Claims are immutable in order to enforce quota, range limits, etc. without gaming the system.
+ if len(oldPvc.Spec.VolumeName) == 0 {
+ // volumeName changes are allowed once.
+ oldPvcClone.Spec.VolumeName = newPvcClone.Spec.VolumeName
+ }
+
+ if validateStorageClassUpgrade(oldPvcClone.Annotations, newPvcClone.Annotations,
+ oldPvcClone.Spec.StorageClassName, newPvcClone.Spec.StorageClassName) {
+ newPvcClone.Spec.StorageClassName = nil
+ metav1.SetMetaDataAnnotation(&newPvcClone.ObjectMeta, core.BetaStorageClassAnnotation, oldPvcClone.Annotations[core.BetaStorageClassAnnotation])
+ } else {
+ // storageclass annotation should be immutable after creation
+ // TODO: remove Beta when no longer needed
+ allErrs = append(allErrs, ValidateImmutableAnnotation(newPvc.ObjectMeta.Annotations[v1.BetaStorageClassAnnotation], oldPvc.ObjectMeta.Annotations[v1.BetaStorageClassAnnotation], v1.BetaStorageClassAnnotation, field.NewPath("metadata"))...)
+ }
+
+ if utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) {
+ // lets make sure storage values are same.
+ if newPvc.Status.Phase == core.ClaimBound && newPvcClone.Spec.Resources.Requests != nil {
+ newPvcClone.Spec.Resources.Requests["storage"] = oldPvc.Spec.Resources.Requests["storage"]
+ }
+
+ oldSize := oldPvc.Spec.Resources.Requests["storage"]
+ newSize := newPvc.Spec.Resources.Requests["storage"]
+
+ if !apiequality.Semantic.DeepEqual(newPvcClone.Spec, oldPvcClone.Spec) {
+ allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "is immutable after creation except resources.requests for bound claims"))
+ }
+ if newSize.Cmp(oldSize) < 0 {
+ allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "resources", "requests", "storage"), "field can not be less than previous value"))
+ }
+
+ } else {
+ // changes to Spec are not allowed, but updates to label/and some annotations are OK.
+ // no-op updates pass validation.
+ if !apiequality.Semantic.DeepEqual(newPvcClone.Spec, oldPvcClone.Spec) {
+ allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "field is immutable after creation"))
+ }
+ }
+
+ if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) {
+ allErrs = append(allErrs, ValidateImmutableField(newPvc.Spec.VolumeMode, oldPvc.Spec.VolumeMode, field.NewPath("volumeMode"))...)
+ }
+ return allErrs
+}
+
+// Provide an upgrade path from PVC with storage class specified in beta
+// annotation to storage class specified in attribute. We allow update of
+// StorageClassName only if following four conditions are met at the same time:
+// 1. The old pvc's StorageClassAnnotation is set
+// 2. The old pvc's StorageClassName is not set
+// 3. The new pvc's StorageClassName is set and equal to the old value in annotation
+// 4. If the new pvc's StorageClassAnnotation is set,it must be equal to the old pv/pvc's StorageClassAnnotation
+func validateStorageClassUpgrade(oldAnnotations, newAnnotations map[string]string, oldScName, newScName *string) bool {
+ oldSc, oldAnnotationExist := oldAnnotations[core.BetaStorageClassAnnotation]
+ newScInAnnotation, newAnnotationExist := newAnnotations[core.BetaStorageClassAnnotation]
+ return oldAnnotationExist /* condition 1 */ &&
+ oldScName == nil /* condition 2*/ &&
+ (newScName != nil && *newScName == oldSc) /* condition 3 */ &&
+ (!newAnnotationExist || newScInAnnotation == oldSc) /* condition 4 */
+}
+
+// ValidatePersistentVolumeClaimStatusUpdate validates an update to status of a PersistentVolumeClaim
+func ValidatePersistentVolumeClaimStatusUpdate(newPvc, oldPvc *core.PersistentVolumeClaim) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&newPvc.ObjectMeta, &oldPvc.ObjectMeta, field.NewPath("metadata"))
+ if len(newPvc.ResourceVersion) == 0 {
+ allErrs = append(allErrs, field.Required(field.NewPath("resourceVersion"), ""))
+ }
+ if len(newPvc.Spec.AccessModes) == 0 {
+ allErrs = append(allErrs, field.Required(field.NewPath("Spec", "accessModes"), ""))
+ }
+ if !utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) && len(newPvc.Status.Conditions) > 0 {
+ conditionPath := field.NewPath("status", "conditions")
+ allErrs = append(allErrs, field.Forbidden(conditionPath, "invalid field"))
+ }
+ capPath := field.NewPath("status", "capacity")
+ for r, qty := range newPvc.Status.Capacity {
+ allErrs = append(allErrs, validateBasicResource(qty, capPath.Key(string(r)))...)
+ }
+ newPvc.Spec = oldPvc.Spec
+ return allErrs
+}
+
+var supportedPortProtocols = sets.NewString(string(core.ProtocolTCP), string(core.ProtocolUDP))
+
+func validateContainerPorts(ports []core.ContainerPort, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ allNames := sets.String{}
+ for i, port := range ports {
+ idxPath := fldPath.Index(i)
+ if len(port.Name) > 0 {
+ if msgs := validation.IsValidPortName(port.Name); len(msgs) != 0 {
+ for i = range msgs {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("name"), port.Name, msgs[i]))
+ }
+ } else if allNames.Has(port.Name) {
+ allErrs = append(allErrs, field.Duplicate(idxPath.Child("name"), port.Name))
+ } else {
+ allNames.Insert(port.Name)
+ }
+ }
+ if port.ContainerPort == 0 {
+ allErrs = append(allErrs, field.Required(idxPath.Child("containerPort"), ""))
+ } else {
+ for _, msg := range validation.IsValidPortNum(int(port.ContainerPort)) {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("containerPort"), port.ContainerPort, msg))
+ }
+ }
+ if port.HostPort != 0 {
+ for _, msg := range validation.IsValidPortNum(int(port.HostPort)) {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("hostPort"), port.HostPort, msg))
+ }
+ }
+ if len(port.Protocol) == 0 {
+ allErrs = append(allErrs, field.Required(idxPath.Child("protocol"), ""))
+ } else if !supportedPortProtocols.Has(string(port.Protocol)) {
+ allErrs = append(allErrs, field.NotSupported(idxPath.Child("protocol"), port.Protocol, supportedPortProtocols.List()))
+ }
+ }
+ return allErrs
+}
+
+// ValidateEnv validates env vars
+func ValidateEnv(vars []core.EnvVar, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ for i, ev := range vars {
+ idxPath := fldPath.Index(i)
+ if len(ev.Name) == 0 {
+ allErrs = append(allErrs, field.Required(idxPath.Child("name"), ""))
+ } else {
+ for _, msg := range validation.IsEnvVarName(ev.Name) {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("name"), ev.Name, msg))
+ }
+ }
+ allErrs = append(allErrs, validateEnvVarValueFrom(ev, idxPath.Child("valueFrom"))...)
+ }
+ return allErrs
+}
+
+var validEnvDownwardAPIFieldPathExpressions = sets.NewString(
+ "metadata.name",
+ "metadata.namespace",
+ "metadata.uid",
+ "spec.nodeName",
+ "spec.serviceAccountName",
+ "status.hostIP",
+ "status.podIP")
+var validContainerResourceFieldPathExpressions = sets.NewString("limits.cpu", "limits.memory", "limits.ephemeral-storage", "requests.cpu", "requests.memory", "requests.ephemeral-storage")
+
+func validateEnvVarValueFrom(ev core.EnvVar, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if ev.ValueFrom == nil {
+ return allErrs
+ }
+
+ numSources := 0
+
+ if ev.ValueFrom.FieldRef != nil {
+ numSources++
+ allErrs = append(allErrs, validateObjectFieldSelector(ev.ValueFrom.FieldRef, &validEnvDownwardAPIFieldPathExpressions, fldPath.Child("fieldRef"))...)
+ }
+ if ev.ValueFrom.ResourceFieldRef != nil {
+ numSources++
+ allErrs = append(allErrs, validateContainerResourceFieldSelector(ev.ValueFrom.ResourceFieldRef, &validContainerResourceFieldPathExpressions, fldPath.Child("resourceFieldRef"), false)...)
+ }
+ if ev.ValueFrom.ConfigMapKeyRef != nil {
+ numSources++
+ allErrs = append(allErrs, validateConfigMapKeySelector(ev.ValueFrom.ConfigMapKeyRef, fldPath.Child("configMapKeyRef"))...)
+ }
+ if ev.ValueFrom.SecretKeyRef != nil {
+ numSources++
+ allErrs = append(allErrs, validateSecretKeySelector(ev.ValueFrom.SecretKeyRef, fldPath.Child("secretKeyRef"))...)
+ }
+
+ if numSources == 0 {
+ allErrs = append(allErrs, field.Invalid(fldPath, "", "must specify one of: `fieldRef`, `resourceFieldRef`, `configMapKeyRef` or `secretKeyRef`"))
+ } else if len(ev.Value) != 0 {
+ if numSources != 0 {
+ allErrs = append(allErrs, field.Invalid(fldPath, "", "may not be specified when `value` is not empty"))
+ }
+ } else if numSources > 1 {
+ allErrs = append(allErrs, field.Invalid(fldPath, "", "may not have more than one field specified at a time"))
+ }
+
+ return allErrs
+}
+
+func validateObjectFieldSelector(fs *core.ObjectFieldSelector, expressions *sets.String, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if len(fs.APIVersion) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("apiVersion"), ""))
+ return allErrs
+ }
+ if len(fs.FieldPath) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("fieldPath"), ""))
+ return allErrs
+ }
+
+ internalFieldPath, _, err := podshelper.ConvertDownwardAPIFieldLabel(fs.APIVersion, fs.FieldPath, "")
+ if err != nil {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("fieldPath"), fs.FieldPath, fmt.Sprintf("error converting fieldPath: %v", err)))
+ return allErrs
+ }
+
+ if path, subscript, ok := fieldpath.SplitMaybeSubscriptedPath(internalFieldPath); ok {
+ switch path {
+ case "metadata.annotations":
+ for _, msg := range validation.IsQualifiedName(strings.ToLower(subscript)) {
+ allErrs = append(allErrs, field.Invalid(fldPath, subscript, msg))
+ }
+ case "metadata.labels":
+ for _, msg := range validation.IsQualifiedName(subscript) {
+ allErrs = append(allErrs, field.Invalid(fldPath, subscript, msg))
+ }
+ default:
+ allErrs = append(allErrs, field.Invalid(fldPath, path, "does not support subscript"))
+ }
+ } else if !expressions.Has(path) {
+ allErrs = append(allErrs, field.NotSupported(fldPath.Child("fieldPath"), path, expressions.List()))
+ return allErrs
+ }
+
+ return allErrs
+}
+
+func fsResourceIsEphemeralStorage(resource string) bool {
+ if resource == "limits.ephemeral-storage" || resource == "requests.ephemeral-storage" {
+ return true
+ }
+ return false
+}
+
+func validateContainerResourceFieldSelector(fs *core.ResourceFieldSelector, expressions *sets.String, fldPath *field.Path, volume bool) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if volume && len(fs.ContainerName) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("containerName"), ""))
+ } else if len(fs.Resource) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("resource"), ""))
+ } else if !expressions.Has(fs.Resource) {
+ allErrs = append(allErrs, field.NotSupported(fldPath.Child("resource"), fs.Resource, expressions.List()))
+ } else if fsResourceIsEphemeralStorage(fs.Resource) && !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) {
+ allErrs = append(allErrs, field.Forbidden(fldPath, "Containers' ephemeral storage requests/limits disabled by feature-gate for Downward API"))
+ }
+ allErrs = append(allErrs, validateContainerResourceDivisor(fs.Resource, fs.Divisor, fldPath)...)
+ return allErrs
+}
+
+func ValidateEnvFrom(vars []core.EnvFromSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for i, ev := range vars {
+ idxPath := fldPath.Index(i)
+ if len(ev.Prefix) > 0 {
+ for _, msg := range validation.IsEnvVarName(ev.Prefix) {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("prefix"), ev.Prefix, msg))
+ }
+ }
+
+ numSources := 0
+ if ev.ConfigMapRef != nil {
+ numSources++
+ allErrs = append(allErrs, validateConfigMapEnvSource(ev.ConfigMapRef, idxPath.Child("configMapRef"))...)
+ }
+ if ev.SecretRef != nil {
+ numSources++
+ allErrs = append(allErrs, validateSecretEnvSource(ev.SecretRef, idxPath.Child("secretRef"))...)
+ }
+
+ if numSources == 0 {
+ allErrs = append(allErrs, field.Invalid(fldPath, "", "must specify one of: `configMapRef` or `secretRef`"))
+ } else if numSources > 1 {
+ allErrs = append(allErrs, field.Invalid(fldPath, "", "may not have more than one field specified at a time"))
+ }
+ }
+ return allErrs
+}
+
+func validateConfigMapEnvSource(configMapSource *core.ConfigMapEnvSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(configMapSource.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("name"), ""))
+ } else {
+ for _, msg := range ValidateConfigMapName(configMapSource.Name, true) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("name"), configMapSource.Name, msg))
+ }
+ }
+ return allErrs
+}
+
+func validateSecretEnvSource(secretSource *core.SecretEnvSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(secretSource.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("name"), ""))
+ } else {
+ for _, msg := range ValidateSecretName(secretSource.Name, true) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("name"), secretSource.Name, msg))
+ }
+ }
+ return allErrs
+}
+
+var validContainerResourceDivisorForCPU = sets.NewString("1m", "1")
+var validContainerResourceDivisorForMemory = sets.NewString("1", "1k", "1M", "1G", "1T", "1P", "1E", "1Ki", "1Mi", "1Gi", "1Ti", "1Pi", "1Ei")
+var validContainerResourceDivisorForEphemeralStorage = sets.NewString("1", "1k", "1M", "1G", "1T", "1P", "1E", "1Ki", "1Mi", "1Gi", "1Ti", "1Pi", "1Ei")
+
+func validateContainerResourceDivisor(rName string, divisor resource.Quantity, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ unsetDivisor := resource.Quantity{}
+ if unsetDivisor.Cmp(divisor) == 0 {
+ return allErrs
+ }
+ switch rName {
+ case "limits.cpu", "requests.cpu":
+ if !validContainerResourceDivisorForCPU.Has(divisor.String()) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("divisor"), rName, "only divisor's values 1m and 1 are supported with the cpu resource"))
+ }
+ case "limits.memory", "requests.memory":
+ if !validContainerResourceDivisorForMemory.Has(divisor.String()) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("divisor"), rName, "only divisor's values 1, 1k, 1M, 1G, 1T, 1P, 1E, 1Ki, 1Mi, 1Gi, 1Ti, 1Pi, 1Ei are supported with the memory resource"))
+ }
+ case "limits.ephemeral-storage", "requests.ephemeral-storage":
+ if !validContainerResourceDivisorForEphemeralStorage.Has(divisor.String()) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("divisor"), rName, "only divisor's values 1, 1k, 1M, 1G, 1T, 1P, 1E, 1Ki, 1Mi, 1Gi, 1Ti, 1Pi, 1Ei are supported with the local ephemeral storage resource"))
+ }
+ }
+ return allErrs
+}
+
+func validateConfigMapKeySelector(s *core.ConfigMapKeySelector, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ nameFn := ValidateNameFunc(ValidateSecretName)
+ for _, msg := range nameFn(s.Name, false) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("name"), s.Name, msg))
+ }
+ if len(s.Key) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("key"), ""))
+ } else {
+ for _, msg := range validation.IsConfigMapKey(s.Key) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("key"), s.Key, msg))
+ }
+ }
+
+ return allErrs
+}
+
+func validateSecretKeySelector(s *core.SecretKeySelector, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ nameFn := ValidateNameFunc(ValidateSecretName)
+ for _, msg := range nameFn(s.Name, false) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("name"), s.Name, msg))
+ }
+ if len(s.Key) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("key"), ""))
+ } else {
+ for _, msg := range validation.IsConfigMapKey(s.Key) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("key"), s.Key, msg))
+ }
+ }
+
+ return allErrs
+}
+
+func GetVolumeMountMap(mounts []core.VolumeMount) map[string]string {
+ volmounts := make(map[string]string)
+
+ for _, mnt := range mounts {
+ volmounts[mnt.Name] = mnt.MountPath
+ }
+
+ return volmounts
+}
+
+func GetVolumeDeviceMap(devices []core.VolumeDevice) map[string]string {
+ voldevices := make(map[string]string)
+
+ for _, dev := range devices {
+ voldevices[dev.Name] = dev.DevicePath
+ }
+
+ return voldevices
+}
+
+func ValidateVolumeMounts(mounts []core.VolumeMount, voldevices map[string]string, volumes map[string]core.VolumeSource, container *core.Container, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ mountpoints := sets.NewString()
+
+ for i, mnt := range mounts {
+ idxPath := fldPath.Index(i)
+ if len(mnt.Name) == 0 {
+ allErrs = append(allErrs, field.Required(idxPath.Child("name"), ""))
+ }
+ if !IsMatchedVolume(mnt.Name, volumes) {
+ allErrs = append(allErrs, field.NotFound(idxPath.Child("name"), mnt.Name))
+ }
+ if len(mnt.MountPath) == 0 {
+ allErrs = append(allErrs, field.Required(idxPath.Child("mountPath"), ""))
+ }
+ if mountpoints.Has(mnt.MountPath) {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("mountPath"), mnt.MountPath, "must be unique"))
+ }
+ mountpoints.Insert(mnt.MountPath)
+
+ // check for overlap with VolumeDevice
+ if mountNameAlreadyExists(mnt.Name, voldevices) {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("name"), mnt.Name, "must not already exist in volumeDevices"))
+ }
+ if mountPathAlreadyExists(mnt.MountPath, voldevices) {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("mountPath"), mnt.MountPath, "must not already exist as a path in volumeDevices"))
+ }
+
+ if len(mnt.SubPath) > 0 {
+ allErrs = append(allErrs, validateLocalDescendingPath(mnt.SubPath, fldPath.Child("subPath"))...)
+ }
+
+ if mnt.MountPropagation != nil {
+ allErrs = append(allErrs, validateMountPropagation(mnt.MountPropagation, container, fldPath.Child("mountPropagation"))...)
+ }
+ }
+ return allErrs
+}
+
+func ValidateVolumeDevices(devices []core.VolumeDevice, volmounts map[string]string, volumes map[string]core.VolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ devicepath := sets.NewString()
+ devicename := sets.NewString()
+
+ if devices != nil && !utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("volumeDevices"), "Container volumeDevices is disabled by feature-gate"))
+ return allErrs
+ }
+ if devices != nil {
+ for i, dev := range devices {
+ idxPath := fldPath.Index(i)
+ devName := dev.Name
+ devPath := dev.DevicePath
+ didMatch, isPVC := isMatchedDevice(devName, volumes)
+ if len(devName) == 0 {
+ allErrs = append(allErrs, field.Required(idxPath.Child("name"), ""))
+ }
+ if devicename.Has(devName) {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("name"), devName, "must be unique"))
+ }
+ // Must be PersistentVolumeClaim volume source
+ if didMatch && !isPVC {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("name"), devName, "can only use volume source type of PersistentVolumeClaim for block mode"))
+ }
+ if !didMatch {
+ allErrs = append(allErrs, field.NotFound(idxPath.Child("name"), devName))
+ }
+ if len(devPath) == 0 {
+ allErrs = append(allErrs, field.Required(idxPath.Child("devicePath"), ""))
+ }
+ if devicepath.Has(devPath) {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("devicePath"), devPath, "must be unique"))
+ }
+ if len(devPath) > 0 && len(validatePathNoBacksteps(devPath, fldPath.Child("devicePath"))) > 0 {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("devicePath"), devPath, "can not contain backsteps ('..')"))
+ } else {
+ devicepath.Insert(devPath)
+ }
+ // check for overlap with VolumeMount
+ if deviceNameAlreadyExists(devName, volmounts) {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("name"), devName, "must not already exist in volumeMounts"))
+ }
+ if devicePathAlreadyExists(devPath, volmounts) {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("devicePath"), devPath, "must not already exist as a path in volumeMounts"))
+ }
+ if len(devName) > 0 {
+ devicename.Insert(devName)
+ }
+ }
+ }
+ return allErrs
+}
+
+func validateProbe(probe *core.Probe, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if probe == nil {
+ return allErrs
+ }
+ allErrs = append(allErrs, validateHandler(&probe.Handler, fldPath)...)
+
+ allErrs = append(allErrs, ValidateNonnegativeField(int64(probe.InitialDelaySeconds), fldPath.Child("initialDelaySeconds"))...)
+ allErrs = append(allErrs, ValidateNonnegativeField(int64(probe.TimeoutSeconds), fldPath.Child("timeoutSeconds"))...)
+ allErrs = append(allErrs, ValidateNonnegativeField(int64(probe.PeriodSeconds), fldPath.Child("periodSeconds"))...)
+ allErrs = append(allErrs, ValidateNonnegativeField(int64(probe.SuccessThreshold), fldPath.Child("successThreshold"))...)
+ allErrs = append(allErrs, ValidateNonnegativeField(int64(probe.FailureThreshold), fldPath.Child("failureThreshold"))...)
+ return allErrs
+}
+
+func validateClientIPAffinityConfig(config *core.SessionAffinityConfig, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if config == nil {
+ allErrs = append(allErrs, field.Required(fldPath, fmt.Sprintf("when session affinity type is %s", core.ServiceAffinityClientIP)))
+ return allErrs
+ }
+ if config.ClientIP == nil {
+ allErrs = append(allErrs, field.Required(fldPath.Child("clientIP"), fmt.Sprintf("when session affinity type is %s", core.ServiceAffinityClientIP)))
+ return allErrs
+ }
+ if config.ClientIP.TimeoutSeconds == nil {
+ allErrs = append(allErrs, field.Required(fldPath.Child("clientIP").Child("timeoutSeconds"), fmt.Sprintf("when session affinity type is %s", core.ServiceAffinityClientIP)))
+ return allErrs
+ }
+ allErrs = append(allErrs, validateAffinityTimeout(config.ClientIP.TimeoutSeconds, fldPath.Child("clientIP").Child("timeoutSeconds"))...)
+
+ return allErrs
+}
+
+func validateAffinityTimeout(timeout *int32, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if *timeout <= 0 || *timeout > core.MaxClientIPServiceAffinitySeconds {
+ allErrs = append(allErrs, field.Invalid(fldPath, timeout, fmt.Sprintf("must be greater than 0 and less than %d", core.MaxClientIPServiceAffinitySeconds)))
+ }
+ return allErrs
+}
+
+// AccumulateUniqueHostPorts extracts each HostPort of each Container,
+// accumulating the results and returning an error if any ports conflict.
+func AccumulateUniqueHostPorts(containers []core.Container, accumulator *sets.String, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ for ci, ctr := range containers {
+ idxPath := fldPath.Index(ci)
+ portsPath := idxPath.Child("ports")
+ for pi := range ctr.Ports {
+ idxPath := portsPath.Index(pi)
+ port := ctr.Ports[pi].HostPort
+ if port == 0 {
+ continue
+ }
+ str := fmt.Sprintf("%s/%s/%d", ctr.Ports[pi].Protocol, ctr.Ports[pi].HostIP, port)
+ if accumulator.Has(str) {
+ allErrs = append(allErrs, field.Duplicate(idxPath.Child("hostPort"), str))
+ } else {
+ accumulator.Insert(str)
+ }
+ }
+ }
+ return allErrs
+}
+
+// checkHostPortConflicts checks for colliding Port.HostPort values across
+// a slice of containers.
+func checkHostPortConflicts(containers []core.Container, fldPath *field.Path) field.ErrorList {
+ allPorts := sets.String{}
+ return AccumulateUniqueHostPorts(containers, &allPorts, fldPath)
+}
+
+func validateExecAction(exec *core.ExecAction, fldPath *field.Path) field.ErrorList {
+ allErrors := field.ErrorList{}
+ if len(exec.Command) == 0 {
+ allErrors = append(allErrors, field.Required(fldPath.Child("command"), ""))
+ }
+ return allErrors
+}
+
+var supportedHTTPSchemes = sets.NewString(string(core.URISchemeHTTP), string(core.URISchemeHTTPS))
+
+func validateHTTPGetAction(http *core.HTTPGetAction, fldPath *field.Path) field.ErrorList {
+ allErrors := field.ErrorList{}
+ if len(http.Path) == 0 {
+ allErrors = append(allErrors, field.Required(fldPath.Child("path"), ""))
+ }
+ allErrors = append(allErrors, ValidatePortNumOrName(http.Port, fldPath.Child("port"))...)
+ if !supportedHTTPSchemes.Has(string(http.Scheme)) {
+ allErrors = append(allErrors, field.NotSupported(fldPath.Child("scheme"), http.Scheme, supportedHTTPSchemes.List()))
+ }
+ for _, header := range http.HTTPHeaders {
+ for _, msg := range validation.IsHTTPHeaderName(header.Name) {
+ allErrors = append(allErrors, field.Invalid(fldPath.Child("httpHeaders"), header.Name, msg))
+ }
+ }
+ return allErrors
+}
+
+func ValidatePortNumOrName(port intstr.IntOrString, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if port.Type == intstr.Int {
+ for _, msg := range validation.IsValidPortNum(port.IntValue()) {
+ allErrs = append(allErrs, field.Invalid(fldPath, port.IntValue(), msg))
+ }
+ } else if port.Type == intstr.String {
+ for _, msg := range validation.IsValidPortName(port.StrVal) {
+ allErrs = append(allErrs, field.Invalid(fldPath, port.StrVal, msg))
+ }
+ } else {
+ allErrs = append(allErrs, field.InternalError(fldPath, fmt.Errorf("unknown type: %v", port.Type)))
+ }
+ return allErrs
+}
+
+func validateTCPSocketAction(tcp *core.TCPSocketAction, fldPath *field.Path) field.ErrorList {
+ return ValidatePortNumOrName(tcp.Port, fldPath.Child("port"))
+}
+
+func validateHandler(handler *core.Handler, fldPath *field.Path) field.ErrorList {
+ numHandlers := 0
+ allErrors := field.ErrorList{}
+ if handler.Exec != nil {
+ if numHandlers > 0 {
+ allErrors = append(allErrors, field.Forbidden(fldPath.Child("exec"), "may not specify more than 1 handler type"))
+ } else {
+ numHandlers++
+ allErrors = append(allErrors, validateExecAction(handler.Exec, fldPath.Child("exec"))...)
+ }
+ }
+ if handler.HTTPGet != nil {
+ if numHandlers > 0 {
+ allErrors = append(allErrors, field.Forbidden(fldPath.Child("httpGet"), "may not specify more than 1 handler type"))
+ } else {
+ numHandlers++
+ allErrors = append(allErrors, validateHTTPGetAction(handler.HTTPGet, fldPath.Child("httpGet"))...)
+ }
+ }
+ if handler.TCPSocket != nil {
+ if numHandlers > 0 {
+ allErrors = append(allErrors, field.Forbidden(fldPath.Child("tcpSocket"), "may not specify more than 1 handler type"))
+ } else {
+ numHandlers++
+ allErrors = append(allErrors, validateTCPSocketAction(handler.TCPSocket, fldPath.Child("tcpSocket"))...)
+ }
+ }
+ if numHandlers == 0 {
+ allErrors = append(allErrors, field.Required(fldPath, "must specify a handler type"))
+ }
+ return allErrors
+}
+
+func validateLifecycle(lifecycle *core.Lifecycle, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if lifecycle.PostStart != nil {
+ allErrs = append(allErrs, validateHandler(lifecycle.PostStart, fldPath.Child("postStart"))...)
+ }
+ if lifecycle.PreStop != nil {
+ allErrs = append(allErrs, validateHandler(lifecycle.PreStop, fldPath.Child("preStop"))...)
+ }
+ return allErrs
+}
+
+var supportedPullPolicies = sets.NewString(string(core.PullAlways), string(core.PullIfNotPresent), string(core.PullNever))
+
+func validatePullPolicy(policy core.PullPolicy, fldPath *field.Path) field.ErrorList {
+ allErrors := field.ErrorList{}
+
+ switch policy {
+ case core.PullAlways, core.PullIfNotPresent, core.PullNever:
+ break
+ case "":
+ allErrors = append(allErrors, field.Required(fldPath, ""))
+ default:
+ allErrors = append(allErrors, field.NotSupported(fldPath, policy, supportedPullPolicies.List()))
+ }
+
+ return allErrors
+}
+
+func validateInitContainers(containers, otherContainers []core.Container, deviceVolumes map[string]core.VolumeSource, fldPath *field.Path) field.ErrorList {
+ var allErrs field.ErrorList
+ if len(containers) > 0 {
+ allErrs = append(allErrs, validateContainers(containers, deviceVolumes, fldPath)...)
+ }
+
+ allNames := sets.String{}
+ for _, ctr := range otherContainers {
+ allNames.Insert(ctr.Name)
+ }
+ for i, ctr := range containers {
+ idxPath := fldPath.Index(i)
+ if allNames.Has(ctr.Name) {
+ allErrs = append(allErrs, field.Duplicate(idxPath.Child("name"), ctr.Name))
+ }
+ if len(ctr.Name) > 0 {
+ allNames.Insert(ctr.Name)
+ }
+ if ctr.Lifecycle != nil {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("lifecycle"), ctr.Lifecycle, "must not be set for init containers"))
+ }
+ if ctr.LivenessProbe != nil {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("livenessProbe"), ctr.LivenessProbe, "must not be set for init containers"))
+ }
+ if ctr.ReadinessProbe != nil {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("readinessProbe"), ctr.ReadinessProbe, "must not be set for init containers"))
+ }
+ }
+ return allErrs
+}
+
+func validateContainers(containers []core.Container, volumes map[string]core.VolumeSource, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if len(containers) == 0 {
+ return append(allErrs, field.Required(fldPath, ""))
+ }
+
+ allNames := sets.String{}
+ for i, ctr := range containers {
+ idxPath := fldPath.Index(i)
+ namePath := idxPath.Child("name")
+ volMounts := GetVolumeMountMap(ctr.VolumeMounts)
+ volDevices := GetVolumeDeviceMap(ctr.VolumeDevices)
+
+ if len(ctr.Name) == 0 {
+ allErrs = append(allErrs, field.Required(namePath, ""))
+ } else {
+ allErrs = append(allErrs, ValidateDNS1123Label(ctr.Name, namePath)...)
+ }
+ if allNames.Has(ctr.Name) {
+ allErrs = append(allErrs, field.Duplicate(namePath, ctr.Name))
+ } else {
+ allNames.Insert(ctr.Name)
+ }
+ // TODO: do not validate leading and trailing whitespace to preserve backward compatibility.
+ // for example: https://github.com/openshift/origin/issues/14659 image = " " is special token in pod template
+ // others may have done similar
+ if len(ctr.Image) == 0 {
+ allErrs = append(allErrs, field.Required(idxPath.Child("image"), ""))
+ }
+ if ctr.Lifecycle != nil {
+ allErrs = append(allErrs, validateLifecycle(ctr.Lifecycle, idxPath.Child("lifecycle"))...)
+ }
+ allErrs = append(allErrs, validateProbe(ctr.LivenessProbe, idxPath.Child("livenessProbe"))...)
+ // Liveness-specific validation
+ if ctr.LivenessProbe != nil && ctr.LivenessProbe.SuccessThreshold != 1 {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("livenessProbe", "successThreshold"), ctr.LivenessProbe.SuccessThreshold, "must be 1"))
+ }
+
+ switch ctr.TerminationMessagePolicy {
+ case core.TerminationMessageReadFile, core.TerminationMessageFallbackToLogsOnError:
+ case "":
+ allErrs = append(allErrs, field.Required(idxPath.Child("terminationMessagePolicy"), "must be 'File' or 'FallbackToLogsOnError'"))
+ default:
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("terminationMessagePolicy"), ctr.TerminationMessagePolicy, "must be 'File' or 'FallbackToLogsOnError'"))
+ }
+
+ allErrs = append(allErrs, validateProbe(ctr.ReadinessProbe, idxPath.Child("readinessProbe"))...)
+ allErrs = append(allErrs, validateContainerPorts(ctr.Ports, idxPath.Child("ports"))...)
+ allErrs = append(allErrs, ValidateEnv(ctr.Env, idxPath.Child("env"))...)
+ allErrs = append(allErrs, ValidateEnvFrom(ctr.EnvFrom, idxPath.Child("envFrom"))...)
+ allErrs = append(allErrs, ValidateVolumeMounts(ctr.VolumeMounts, volDevices, volumes, &ctr, idxPath.Child("volumeMounts"))...)
+ allErrs = append(allErrs, ValidateVolumeDevices(ctr.VolumeDevices, volMounts, volumes, idxPath.Child("volumeDevices"))...)
+ allErrs = append(allErrs, validatePullPolicy(ctr.ImagePullPolicy, idxPath.Child("imagePullPolicy"))...)
+ allErrs = append(allErrs, ValidateResourceRequirements(&ctr.Resources, idxPath.Child("resources"))...)
+ allErrs = append(allErrs, ValidateSecurityContext(ctr.SecurityContext, idxPath.Child("securityContext"))...)
+ }
+ // Check for colliding ports across all containers.
+ allErrs = append(allErrs, checkHostPortConflicts(containers, fldPath)...)
+
+ return allErrs
+}
+
+func validateRestartPolicy(restartPolicy *core.RestartPolicy, fldPath *field.Path) field.ErrorList {
+ allErrors := field.ErrorList{}
+ switch *restartPolicy {
+ case core.RestartPolicyAlways, core.RestartPolicyOnFailure, core.RestartPolicyNever:
+ break
+ case "":
+ allErrors = append(allErrors, field.Required(fldPath, ""))
+ default:
+ validValues := []string{string(core.RestartPolicyAlways), string(core.RestartPolicyOnFailure), string(core.RestartPolicyNever)}
+ allErrors = append(allErrors, field.NotSupported(fldPath, *restartPolicy, validValues))
+ }
+
+ return allErrors
+}
+
+func validateDNSPolicy(dnsPolicy *core.DNSPolicy, fldPath *field.Path) field.ErrorList {
+ allErrors := field.ErrorList{}
+ switch *dnsPolicy {
+ case core.DNSClusterFirstWithHostNet, core.DNSClusterFirst, core.DNSDefault:
+ case core.DNSNone:
+ if !utilfeature.DefaultFeatureGate.Enabled(features.CustomPodDNS) {
+ allErrors = append(allErrors, field.Invalid(fldPath, dnsPolicy, "DNSPolicy: can not use 'None', custom pod DNS is disabled by feature gate"))
+ }
+ case "":
+ allErrors = append(allErrors, field.Required(fldPath, ""))
+ default:
+ validValues := []string{string(core.DNSClusterFirstWithHostNet), string(core.DNSClusterFirst), string(core.DNSDefault)}
+ if utilfeature.DefaultFeatureGate.Enabled(features.CustomPodDNS) {
+ validValues = append(validValues, string(core.DNSNone))
+ }
+ allErrors = append(allErrors, field.NotSupported(fldPath, dnsPolicy, validValues))
+ }
+ return allErrors
+}
+
+const (
+ // Limits on various DNS parameters. These are derived from
+ // restrictions in Linux libc name resolution handling.
+ // Max number of DNS name servers.
+ MaxDNSNameservers = 3
+ // Max number of domains in search path.
+ MaxDNSSearchPaths = 6
+ // Max number of characters in search path.
+ MaxDNSSearchListChars = 256
+)
+
+func validatePodDNSConfig(dnsConfig *core.PodDNSConfig, dnsPolicy *core.DNSPolicy, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ // Validate DNSNone case. Must provide at least one DNS name server.
+ if utilfeature.DefaultFeatureGate.Enabled(features.CustomPodDNS) && dnsPolicy != nil && *dnsPolicy == core.DNSNone {
+ if dnsConfig == nil {
+ return append(allErrs, field.Required(fldPath, fmt.Sprintf("must provide `dnsConfig` when `dnsPolicy` is %s", core.DNSNone)))
+ }
+ if len(dnsConfig.Nameservers) == 0 {
+ return append(allErrs, field.Required(fldPath.Child("nameservers"), fmt.Sprintf("must provide at least one DNS nameserver when `dnsPolicy` is %s", core.DNSNone)))
+ }
+ }
+
+ if dnsConfig != nil {
+ if !utilfeature.DefaultFeatureGate.Enabled(features.CustomPodDNS) {
+ return append(allErrs, field.Forbidden(fldPath, "DNSConfig: custom pod DNS is disabled by feature gate"))
+ }
+
+ // Validate nameservers.
+ if len(dnsConfig.Nameservers) > MaxDNSNameservers {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("nameservers"), dnsConfig.Nameservers, fmt.Sprintf("must not have more than %v nameservers", MaxDNSNameservers)))
+ }
+ for i, ns := range dnsConfig.Nameservers {
+ if ip := net.ParseIP(ns); ip == nil {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("nameservers").Index(i), ns, "must be valid IP address"))
+ }
+ }
+ // Validate searches.
+ if len(dnsConfig.Searches) > MaxDNSSearchPaths {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("searches"), dnsConfig.Searches, fmt.Sprintf("must not have more than %v search paths", MaxDNSSearchPaths)))
+ }
+ // Include the space between search paths.
+ if len(strings.Join(dnsConfig.Searches, " ")) > MaxDNSSearchListChars {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("searches"), dnsConfig.Searches, "must not have more than 256 characters (including spaces) in the search list"))
+ }
+ for i, search := range dnsConfig.Searches {
+ allErrs = append(allErrs, ValidateDNS1123Subdomain(search, fldPath.Child("searches").Index(i))...)
+ }
+ // Validate options.
+ for i, option := range dnsConfig.Options {
+ if len(option.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("options").Index(i), "must not be empty"))
+ }
+ }
+ }
+ return allErrs
+}
+
+func validateHostNetwork(hostNetwork bool, containers []core.Container, fldPath *field.Path) field.ErrorList {
+ allErrors := field.ErrorList{}
+ if hostNetwork {
+ for i, container := range containers {
+ portsPath := fldPath.Index(i).Child("ports")
+ for i, port := range container.Ports {
+ idxPath := portsPath.Index(i)
+ if port.HostPort != port.ContainerPort {
+ allErrors = append(allErrors, field.Invalid(idxPath.Child("containerPort"), port.ContainerPort, "must match `hostPort` when `hostNetwork` is true"))
+ }
+ }
+ }
+ }
+ return allErrors
+}
+
+// validateImagePullSecrets checks to make sure the pull secrets are well
+// formed. Right now, we only expect name to be set (it's the only field). If
+// this ever changes and someone decides to set those fields, we'd like to
+// know.
+func validateImagePullSecrets(imagePullSecrets []core.LocalObjectReference, fldPath *field.Path) field.ErrorList {
+ allErrors := field.ErrorList{}
+ for i, currPullSecret := range imagePullSecrets {
+ idxPath := fldPath.Index(i)
+ strippedRef := core.LocalObjectReference{Name: currPullSecret.Name}
+ if !reflect.DeepEqual(strippedRef, currPullSecret) {
+ allErrors = append(allErrors, field.Invalid(idxPath, currPullSecret, "only name may be set"))
+ }
+ }
+ return allErrors
+}
+
+// validateAffinity checks if given affinities are valid
+func validateAffinity(affinity *core.Affinity, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if affinity != nil {
+ if affinity.NodeAffinity != nil {
+ allErrs = append(allErrs, validateNodeAffinity(affinity.NodeAffinity, fldPath.Child("nodeAffinity"))...)
+ }
+ if affinity.PodAffinity != nil {
+ allErrs = append(allErrs, validatePodAffinity(affinity.PodAffinity, fldPath.Child("podAffinity"))...)
+ }
+ if affinity.PodAntiAffinity != nil {
+ allErrs = append(allErrs, validatePodAntiAffinity(affinity.PodAntiAffinity, fldPath.Child("podAntiAffinity"))...)
+ }
+ }
+
+ return allErrs
+}
+
+func validateTaintEffect(effect *core.TaintEffect, allowEmpty bool, fldPath *field.Path) field.ErrorList {
+ if !allowEmpty && len(*effect) == 0 {
+ return field.ErrorList{field.Required(fldPath, "")}
+ }
+
+ allErrors := field.ErrorList{}
+ switch *effect {
+ // TODO: Replace next line with subsequent commented-out line when implement TaintEffectNoScheduleNoAdmit.
+ case core.TaintEffectNoSchedule, core.TaintEffectPreferNoSchedule, core.TaintEffectNoExecute:
+ // case core.TaintEffectNoSchedule, core.TaintEffectPreferNoSchedule, core.TaintEffectNoScheduleNoAdmit, core.TaintEffectNoExecute:
+ default:
+ validValues := []string{
+ string(core.TaintEffectNoSchedule),
+ string(core.TaintEffectPreferNoSchedule),
+ string(core.TaintEffectNoExecute),
+ // TODO: Uncomment this block when implement TaintEffectNoScheduleNoAdmit.
+ // string(core.TaintEffectNoScheduleNoAdmit),
+ }
+ allErrors = append(allErrors, field.NotSupported(fldPath, effect, validValues))
+ }
+ return allErrors
+}
+
+// validateOnlyAddedTolerations validates updated pod tolerations.
+func validateOnlyAddedTolerations(newTolerations []core.Toleration, oldTolerations []core.Toleration, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for _, old := range oldTolerations {
+ found := false
+ old.TolerationSeconds = nil
+ for _, new := range newTolerations {
+ new.TolerationSeconds = nil
+ if reflect.DeepEqual(old, new) {
+ found = true
+ break
+ }
+ }
+ if !found {
+ allErrs = append(allErrs, field.Forbidden(fldPath, "existing toleration can not be modified except its tolerationSeconds"))
+ return allErrs
+ }
+ }
+
+ allErrs = append(allErrs, ValidateTolerations(newTolerations, fldPath)...)
+ return allErrs
+}
+
+func ValidateHostAliases(hostAliases []core.HostAlias, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for _, hostAlias := range hostAliases {
+ if ip := net.ParseIP(hostAlias.IP); ip == nil {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("ip"), hostAlias.IP, "must be valid IP address"))
+ }
+ for _, hostname := range hostAlias.Hostnames {
+ allErrs = append(allErrs, ValidateDNS1123Subdomain(hostname, fldPath.Child("hostnames"))...)
+ }
+ }
+ return allErrs
+}
+
+// ValidateTolerations tests if given tolerations have valid data.
+func ValidateTolerations(tolerations []core.Toleration, fldPath *field.Path) field.ErrorList {
+ allErrors := field.ErrorList{}
+ for i, toleration := range tolerations {
+ idxPath := fldPath.Index(i)
+ // validate the toleration key
+ if len(toleration.Key) > 0 {
+ allErrors = append(allErrors, unversionedvalidation.ValidateLabelName(toleration.Key, idxPath.Child("key"))...)
+ }
+
+ // empty toleration key with Exists operator and empty value means match all taints
+ if len(toleration.Key) == 0 && toleration.Operator != core.TolerationOpExists {
+ allErrors = append(allErrors, field.Invalid(idxPath.Child("operator"), toleration.Operator,
+ "operator must be Exists when `key` is empty, which means \"match all values and all keys\""))
+ }
+
+ if toleration.TolerationSeconds != nil && toleration.Effect != core.TaintEffectNoExecute {
+ allErrors = append(allErrors, field.Invalid(idxPath.Child("effect"), toleration.Effect,
+ "effect must be 'NoExecute' when `tolerationSeconds` is set"))
+ }
+
+ // validate toleration operator and value
+ switch toleration.Operator {
+ // empty operator means Equal
+ case core.TolerationOpEqual, "":
+ if errs := validation.IsValidLabelValue(toleration.Value); len(errs) != 0 {
+ allErrors = append(allErrors, field.Invalid(idxPath.Child("operator"), toleration.Value, strings.Join(errs, ";")))
+ }
+ case core.TolerationOpExists:
+ if len(toleration.Value) > 0 {
+ allErrors = append(allErrors, field.Invalid(idxPath.Child("operator"), toleration, "value must be empty when `operator` is 'Exists'"))
+ }
+ default:
+ validValues := []string{string(core.TolerationOpEqual), string(core.TolerationOpExists)}
+ allErrors = append(allErrors, field.NotSupported(idxPath.Child("operator"), toleration.Operator, validValues))
+ }
+
+ // validate toleration effect, empty toleration effect means match all taint effects
+ if len(toleration.Effect) > 0 {
+ allErrors = append(allErrors, validateTaintEffect(&toleration.Effect, true, idxPath.Child("effect"))...)
+ }
+ }
+ return allErrors
+}
+
+func toResourceNames(resources core.ResourceList) []core.ResourceName {
+ result := []core.ResourceName{}
+ for resourceName := range resources {
+ result = append(result, resourceName)
+ }
+ return result
+}
+
+func toSet(resourceNames []core.ResourceName) sets.String {
+ result := sets.NewString()
+ for _, resourceName := range resourceNames {
+ result.Insert(string(resourceName))
+ }
+ return result
+}
+
+func toContainerResourcesSet(ctr *core.Container) sets.String {
+ resourceNames := toResourceNames(ctr.Resources.Requests)
+ resourceNames = append(resourceNames, toResourceNames(ctr.Resources.Limits)...)
+ return toSet(resourceNames)
+}
+
+// validateContainersOnlyForPod does additional validation for containers on a pod versus a pod template
+// it only does additive validation of fields not covered in validateContainers
+func validateContainersOnlyForPod(containers []core.Container, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for i, ctr := range containers {
+ idxPath := fldPath.Index(i)
+ if len(ctr.Image) != len(strings.TrimSpace(ctr.Image)) {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("image"), ctr.Image, "must not have leading or trailing whitespace"))
+ }
+ }
+ return allErrs
+}
+
+// ValidatePod tests if required fields in the pod are set.
+func ValidatePod(pod *core.Pod) field.ErrorList {
+ fldPath := field.NewPath("metadata")
+ allErrs := ValidateObjectMeta(&pod.ObjectMeta, true, ValidatePodName, fldPath)
+ allErrs = append(allErrs, ValidatePodSpecificAnnotations(pod.ObjectMeta.Annotations, &pod.Spec, fldPath.Child("annotations"))...)
+ allErrs = append(allErrs, ValidatePodSpec(&pod.Spec, field.NewPath("spec"))...)
+
+ // we do additional validation only pertinent for pods and not pod templates
+ // this was done to preserve backwards compatibility
+ specPath := field.NewPath("spec")
+
+ allErrs = append(allErrs, validateContainersOnlyForPod(pod.Spec.Containers, specPath.Child("containers"))...)
+ allErrs = append(allErrs, validateContainersOnlyForPod(pod.Spec.InitContainers, specPath.Child("initContainers"))...)
+
+ if utilfeature.DefaultFeatureGate.Enabled(features.HugePages) {
+ hugePageResources := sets.NewString()
+ for i := range pod.Spec.Containers {
+ resourceSet := toContainerResourcesSet(&pod.Spec.Containers[i])
+ for resourceStr := range resourceSet {
+ if v1helper.IsHugePageResourceName(v1.ResourceName(resourceStr)) {
+ hugePageResources.Insert(resourceStr)
+ }
+ }
+ }
+ if len(hugePageResources) > 1 {
+ allErrs = append(allErrs, field.Invalid(specPath, hugePageResources, "must use a single hugepage size in a pod spec"))
+ }
+ }
+
+ return allErrs
+}
+
+// ValidatePodSpec tests that the specified PodSpec has valid data.
+// This includes checking formatting and uniqueness. It also canonicalizes the
+// structure by setting default values and implementing any backwards-compatibility
+// tricks.
+func ValidatePodSpec(spec *core.PodSpec, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ vols, vErrs := ValidateVolumes(spec.Volumes, fldPath.Child("volumes"))
+ allErrs = append(allErrs, vErrs...)
+ allErrs = append(allErrs, validateContainers(spec.Containers, vols, fldPath.Child("containers"))...)
+ allErrs = append(allErrs, validateInitContainers(spec.InitContainers, spec.Containers, vols, fldPath.Child("initContainers"))...)
+ allErrs = append(allErrs, validateRestartPolicy(&spec.RestartPolicy, fldPath.Child("restartPolicy"))...)
+ allErrs = append(allErrs, validateDNSPolicy(&spec.DNSPolicy, fldPath.Child("dnsPolicy"))...)
+ allErrs = append(allErrs, unversionedvalidation.ValidateLabels(spec.NodeSelector, fldPath.Child("nodeSelector"))...)
+ allErrs = append(allErrs, ValidatePodSecurityContext(spec.SecurityContext, spec, fldPath, fldPath.Child("securityContext"))...)
+ allErrs = append(allErrs, validateImagePullSecrets(spec.ImagePullSecrets, fldPath.Child("imagePullSecrets"))...)
+ allErrs = append(allErrs, validateAffinity(spec.Affinity, fldPath.Child("affinity"))...)
+ allErrs = append(allErrs, validatePodDNSConfig(spec.DNSConfig, &spec.DNSPolicy, fldPath.Child("dnsConfig"))...)
+ if len(spec.ServiceAccountName) > 0 {
+ for _, msg := range ValidateServiceAccountName(spec.ServiceAccountName, false) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("serviceAccountName"), spec.ServiceAccountName, msg))
+ }
+ }
+
+ if len(spec.NodeName) > 0 {
+ for _, msg := range ValidateNodeName(spec.NodeName, false) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("nodeName"), spec.NodeName, msg))
+ }
+ }
+
+ if spec.ActiveDeadlineSeconds != nil {
+ value := *spec.ActiveDeadlineSeconds
+ if value < 1 || value > math.MaxInt32 {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("activeDeadlineSeconds"), value, validation.InclusiveRangeError(1, math.MaxInt32)))
+ }
+ }
+
+ if len(spec.Hostname) > 0 {
+ allErrs = append(allErrs, ValidateDNS1123Label(spec.Hostname, fldPath.Child("hostname"))...)
+ }
+
+ if len(spec.Subdomain) > 0 {
+ allErrs = append(allErrs, ValidateDNS1123Label(spec.Subdomain, fldPath.Child("subdomain"))...)
+ }
+
+ if len(spec.Tolerations) > 0 {
+ allErrs = append(allErrs, ValidateTolerations(spec.Tolerations, fldPath.Child("tolerations"))...)
+ }
+
+ if len(spec.HostAliases) > 0 {
+ allErrs = append(allErrs, ValidateHostAliases(spec.HostAliases, fldPath.Child("hostAliases"))...)
+ }
+
+ if len(spec.PriorityClassName) > 0 {
+ if utilfeature.DefaultFeatureGate.Enabled(features.PodPriority) {
+ for _, msg := range ValidatePriorityClassName(spec.PriorityClassName, false) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("priorityClassName"), spec.PriorityClassName, msg))
+ }
+ }
+ }
+
+ return allErrs
+}
+
+// ValidateNodeSelectorRequirement tests that the specified NodeSelectorRequirement fields has valid data
+func ValidateNodeSelectorRequirement(rq core.NodeSelectorRequirement, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ switch rq.Operator {
+ case core.NodeSelectorOpIn, core.NodeSelectorOpNotIn:
+ if len(rq.Values) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("values"), "must be specified when `operator` is 'In' or 'NotIn'"))
+ }
+ case core.NodeSelectorOpExists, core.NodeSelectorOpDoesNotExist:
+ if len(rq.Values) > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("values"), "may not be specified when `operator` is 'Exists' or 'DoesNotExist'"))
+ }
+
+ case core.NodeSelectorOpGt, core.NodeSelectorOpLt:
+ if len(rq.Values) != 1 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("values"), "must be specified single value when `operator` is 'Lt' or 'Gt'"))
+ }
+ default:
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("operator"), rq.Operator, "not a valid selector operator"))
+ }
+ allErrs = append(allErrs, unversionedvalidation.ValidateLabelName(rq.Key, fldPath.Child("key"))...)
+ return allErrs
+}
+
+// ValidateNodeSelectorTerm tests that the specified node selector term has valid data
+func ValidateNodeSelectorTerm(term core.NodeSelectorTerm, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if len(term.MatchExpressions) == 0 {
+ return append(allErrs, field.Required(fldPath.Child("matchExpressions"), "must have at least one node selector requirement"))
+ }
+ for j, req := range term.MatchExpressions {
+ allErrs = append(allErrs, ValidateNodeSelectorRequirement(req, fldPath.Child("matchExpressions").Index(j))...)
+ }
+ return allErrs
+}
+
+// ValidateNodeSelector tests that the specified nodeSelector fields has valid data
+func ValidateNodeSelector(nodeSelector *core.NodeSelector, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ termFldPath := fldPath.Child("nodeSelectorTerms")
+ if len(nodeSelector.NodeSelectorTerms) == 0 {
+ return append(allErrs, field.Required(termFldPath, "must have at least one node selector term"))
+ }
+
+ for i, term := range nodeSelector.NodeSelectorTerms {
+ allErrs = append(allErrs, ValidateNodeSelectorTerm(term, termFldPath.Index(i))...)
+ }
+
+ return allErrs
+}
+
+// ValidateAvoidPodsInNodeAnnotations tests that the serialized AvoidPods in Node.Annotations has valid data
+func ValidateAvoidPodsInNodeAnnotations(annotations map[string]string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ v1Avoids, err := v1helper.GetAvoidPodsFromNodeAnnotations(annotations)
+ if err != nil {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("AvoidPods"), core.PreferAvoidPodsAnnotationKey, err.Error()))
+ return allErrs
+ }
+ var avoids core.AvoidPods
+ if err := corev1.Convert_v1_AvoidPods_To_core_AvoidPods(&v1Avoids, &avoids, nil); err != nil {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("AvoidPods"), core.PreferAvoidPodsAnnotationKey, err.Error()))
+ return allErrs
+ }
+
+ if len(avoids.PreferAvoidPods) != 0 {
+ for i, pa := range avoids.PreferAvoidPods {
+ idxPath := fldPath.Child(core.PreferAvoidPodsAnnotationKey).Index(i)
+ allErrs = append(allErrs, validatePreferAvoidPodsEntry(pa, idxPath)...)
+ }
+ }
+
+ return allErrs
+}
+
+// validatePreferAvoidPodsEntry tests if given PreferAvoidPodsEntry has valid data.
+func validatePreferAvoidPodsEntry(avoidPodEntry core.PreferAvoidPodsEntry, fldPath *field.Path) field.ErrorList {
+ allErrors := field.ErrorList{}
+ if avoidPodEntry.PodSignature.PodController == nil {
+ allErrors = append(allErrors, field.Required(fldPath.Child("PodSignature"), ""))
+ } else {
+ if *(avoidPodEntry.PodSignature.PodController.Controller) != true {
+ allErrors = append(allErrors,
+ field.Invalid(fldPath.Child("PodSignature").Child("PodController").Child("Controller"),
+ *(avoidPodEntry.PodSignature.PodController.Controller), "must point to a controller"))
+ }
+ }
+ return allErrors
+}
+
+// ValidatePreferredSchedulingTerms tests that the specified SoftNodeAffinity fields has valid data
+func ValidatePreferredSchedulingTerms(terms []core.PreferredSchedulingTerm, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ for i, term := range terms {
+ if term.Weight <= 0 || term.Weight > 100 {
+ allErrs = append(allErrs, field.Invalid(fldPath.Index(i).Child("weight"), term.Weight, "must be in the range 1-100"))
+ }
+
+ allErrs = append(allErrs, ValidateNodeSelectorTerm(term.Preference, fldPath.Index(i).Child("preference"))...)
+ }
+ return allErrs
+}
+
+// validatePodAffinityTerm tests that the specified podAffinityTerm fields have valid data
+func validatePodAffinityTerm(podAffinityTerm core.PodAffinityTerm, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(podAffinityTerm.LabelSelector, fldPath.Child("matchExpressions"))...)
+ for _, name := range podAffinityTerm.Namespaces {
+ for _, msg := range ValidateNamespaceName(name, false) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("namespace"), name, msg))
+ }
+ }
+ if len(podAffinityTerm.TopologyKey) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("topologyKey"), "can not be empty"))
+ }
+ return append(allErrs, unversionedvalidation.ValidateLabelName(podAffinityTerm.TopologyKey, fldPath.Child("topologyKey"))...)
+}
+
+// validatePodAffinityTerms tests that the specified podAffinityTerms fields have valid data
+func validatePodAffinityTerms(podAffinityTerms []core.PodAffinityTerm, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for i, podAffinityTerm := range podAffinityTerms {
+ allErrs = append(allErrs, validatePodAffinityTerm(podAffinityTerm, fldPath.Index(i))...)
+ }
+ return allErrs
+}
+
+// validateWeightedPodAffinityTerms tests that the specified weightedPodAffinityTerms fields have valid data
+func validateWeightedPodAffinityTerms(weightedPodAffinityTerms []core.WeightedPodAffinityTerm, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for j, weightedTerm := range weightedPodAffinityTerms {
+ if weightedTerm.Weight <= 0 || weightedTerm.Weight > 100 {
+ allErrs = append(allErrs, field.Invalid(fldPath.Index(j).Child("weight"), weightedTerm.Weight, "must be in the range 1-100"))
+ }
+ allErrs = append(allErrs, validatePodAffinityTerm(weightedTerm.PodAffinityTerm, fldPath.Index(j).Child("podAffinityTerm"))...)
+ }
+ return allErrs
+}
+
+// validatePodAntiAffinity tests that the specified podAntiAffinity fields have valid data
+func validatePodAntiAffinity(podAntiAffinity *core.PodAntiAffinity, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ // TODO:Uncomment below code once RequiredDuringSchedulingRequiredDuringExecution is implemented.
+ // if podAntiAffinity.RequiredDuringSchedulingRequiredDuringExecution != nil {
+ // allErrs = append(allErrs, validatePodAffinityTerms(podAntiAffinity.RequiredDuringSchedulingRequiredDuringExecution, false,
+ // fldPath.Child("requiredDuringSchedulingRequiredDuringExecution"))...)
+ //}
+ if podAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution != nil {
+ allErrs = append(allErrs, validatePodAffinityTerms(podAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution,
+ fldPath.Child("requiredDuringSchedulingIgnoredDuringExecution"))...)
+ }
+ if podAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution != nil {
+ allErrs = append(allErrs, validateWeightedPodAffinityTerms(podAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution,
+ fldPath.Child("preferredDuringSchedulingIgnoredDuringExecution"))...)
+ }
+ return allErrs
+}
+
+// validateNodeAffinity tests that the specified nodeAffinity fields have valid data
+func validateNodeAffinity(na *core.NodeAffinity, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ // TODO: Uncomment the next three lines once RequiredDuringSchedulingRequiredDuringExecution is implemented.
+ // if na.RequiredDuringSchedulingRequiredDuringExecution != nil {
+ // allErrs = append(allErrs, ValidateNodeSelector(na.RequiredDuringSchedulingRequiredDuringExecution, fldPath.Child("requiredDuringSchedulingRequiredDuringExecution"))...)
+ // }
+ if na.RequiredDuringSchedulingIgnoredDuringExecution != nil {
+ allErrs = append(allErrs, ValidateNodeSelector(na.RequiredDuringSchedulingIgnoredDuringExecution, fldPath.Child("requiredDuringSchedulingIgnoredDuringExecution"))...)
+ }
+ if len(na.PreferredDuringSchedulingIgnoredDuringExecution) > 0 {
+ allErrs = append(allErrs, ValidatePreferredSchedulingTerms(na.PreferredDuringSchedulingIgnoredDuringExecution, fldPath.Child("preferredDuringSchedulingIgnoredDuringExecution"))...)
+ }
+ return allErrs
+}
+
+// validatePodAffinity tests that the specified podAffinity fields have valid data
+func validatePodAffinity(podAffinity *core.PodAffinity, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ // TODO:Uncomment below code once RequiredDuringSchedulingRequiredDuringExecution is implemented.
+ // if podAffinity.RequiredDuringSchedulingRequiredDuringExecution != nil {
+ // allErrs = append(allErrs, validatePodAffinityTerms(podAffinity.RequiredDuringSchedulingRequiredDuringExecution, false,
+ // fldPath.Child("requiredDuringSchedulingRequiredDuringExecution"))...)
+ //}
+ if podAffinity.RequiredDuringSchedulingIgnoredDuringExecution != nil {
+ allErrs = append(allErrs, validatePodAffinityTerms(podAffinity.RequiredDuringSchedulingIgnoredDuringExecution,
+ fldPath.Child("requiredDuringSchedulingIgnoredDuringExecution"))...)
+ }
+ if podAffinity.PreferredDuringSchedulingIgnoredDuringExecution != nil {
+ allErrs = append(allErrs, validateWeightedPodAffinityTerms(podAffinity.PreferredDuringSchedulingIgnoredDuringExecution,
+ fldPath.Child("preferredDuringSchedulingIgnoredDuringExecution"))...)
+ }
+ return allErrs
+}
+
+func ValidateSeccompProfile(p string, fldPath *field.Path) field.ErrorList {
+ if p == "docker/default" {
+ return nil
+ }
+ if p == "unconfined" {
+ return nil
+ }
+ if strings.HasPrefix(p, "localhost/") {
+ return validateLocalDescendingPath(strings.TrimPrefix(p, "localhost/"), fldPath)
+ }
+ return field.ErrorList{field.Invalid(fldPath, p, "must be a valid seccomp profile")}
+}
+
+func ValidateSeccompPodAnnotations(annotations map[string]string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if p, exists := annotations[core.SeccompPodAnnotationKey]; exists {
+ allErrs = append(allErrs, ValidateSeccompProfile(p, fldPath.Child(core.SeccompPodAnnotationKey))...)
+ }
+ for k, p := range annotations {
+ if strings.HasPrefix(k, core.SeccompContainerAnnotationKeyPrefix) {
+ allErrs = append(allErrs, ValidateSeccompProfile(p, fldPath.Child(k))...)
+ }
+ }
+
+ return allErrs
+}
+
+func ValidateAppArmorPodAnnotations(annotations map[string]string, spec *core.PodSpec, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for k, p := range annotations {
+ if !strings.HasPrefix(k, apparmor.ContainerAnnotationKeyPrefix) {
+ continue
+ }
+ // TODO: this belongs to admission, not general pod validation:
+ if !utilfeature.DefaultFeatureGate.Enabled(features.AppArmor) {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Key(k), "AppArmor is disabled by feature-gate"))
+ continue
+ }
+ containerName := strings.TrimPrefix(k, apparmor.ContainerAnnotationKeyPrefix)
+ if !podSpecHasContainer(spec, containerName) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Key(k), containerName, "container not found"))
+ }
+
+ if err := apparmor.ValidateProfileFormat(p); err != nil {
+ allErrs = append(allErrs, field.Invalid(fldPath.Key(k), p, err.Error()))
+ }
+ }
+
+ return allErrs
+}
+
+func podSpecHasContainer(spec *core.PodSpec, containerName string) bool {
+ for _, c := range spec.InitContainers {
+ if c.Name == containerName {
+ return true
+ }
+ }
+ for _, c := range spec.Containers {
+ if c.Name == containerName {
+ return true
+ }
+ }
+ return false
+}
+
+const (
+ // a sysctl segment regex, concatenated with dots to form a sysctl name
+ SysctlSegmentFmt string = "[a-z0-9]([-_a-z0-9]*[a-z0-9])?"
+
+ // a sysctl name regex
+ SysctlFmt string = "(" + SysctlSegmentFmt + "\\.)*" + SysctlSegmentFmt
+
+ // the maximal length of a sysctl name
+ SysctlMaxLength int = 253
+)
+
+var sysctlRegexp = regexp.MustCompile("^" + SysctlFmt + "$")
+
+// IsValidSysctlName checks that the given string is a valid sysctl name,
+// i.e. matches SysctlFmt.
+func IsValidSysctlName(name string) bool {
+ if len(name) > SysctlMaxLength {
+ return false
+ }
+ return sysctlRegexp.MatchString(name)
+}
+
+func validateSysctls(sysctls []core.Sysctl, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for i, s := range sysctls {
+ if len(s.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Index(i).Child("name"), ""))
+ } else if !IsValidSysctlName(s.Name) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Index(i).Child("name"), s.Name, fmt.Sprintf("must have at most %d characters and match regex %s", SysctlMaxLength, SysctlFmt)))
+ }
+ }
+ return allErrs
+}
+
+// ValidatePodSecurityContext test that the specified PodSecurityContext has valid data.
+func ValidatePodSecurityContext(securityContext *core.PodSecurityContext, spec *core.PodSpec, specPath, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if securityContext != nil {
+ allErrs = append(allErrs, validateHostNetwork(securityContext.HostNetwork, spec.Containers, specPath.Child("containers"))...)
+ if securityContext.FSGroup != nil {
+ for _, msg := range validation.IsValidGroupID(*securityContext.FSGroup) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("fsGroup"), *(securityContext.FSGroup), msg))
+ }
+ }
+ if securityContext.RunAsUser != nil {
+ for _, msg := range validation.IsValidUserID(*securityContext.RunAsUser) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("runAsUser"), *(securityContext.RunAsUser), msg))
+ }
+ }
+ for g, gid := range securityContext.SupplementalGroups {
+ for _, msg := range validation.IsValidGroupID(gid) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("supplementalGroups").Index(g), gid, msg))
+ }
+ }
+ if securityContext.ShareProcessNamespace != nil {
+ if !utilfeature.DefaultFeatureGate.Enabled(features.PodShareProcessNamespace) {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("shareProcessNamespace"), "Process Namespace Sharing is disabled by PodShareProcessNamespace feature-gate"))
+ } else if securityContext.HostPID && *securityContext.ShareProcessNamespace {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("shareProcessNamespace"), *securityContext.ShareProcessNamespace, "ShareProcessNamespace and HostPID cannot both be enabled"))
+ }
+ }
+ }
+
+ return allErrs
+}
+
+func ValidateContainerUpdates(newContainers, oldContainers []core.Container, fldPath *field.Path) (allErrs field.ErrorList, stop bool) {
+ allErrs = field.ErrorList{}
+ if len(newContainers) != len(oldContainers) {
+ //TODO: Pinpoint the specific container that causes the invalid error after we have strategic merge diff
+ allErrs = append(allErrs, field.Forbidden(fldPath, "pod updates may not add or remove containers"))
+ return allErrs, true
+ }
+
+ // validate updated container images
+ for i, ctr := range newContainers {
+ if len(ctr.Image) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Index(i).Child("image"), ""))
+ }
+ // this is only called from ValidatePodUpdate so its safe to check leading/trailing whitespace.
+ if len(strings.TrimSpace(ctr.Image)) != len(ctr.Image) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Index(i).Child("image"), ctr.Image, "must not have leading or trailing whitespace"))
+ }
+ }
+ return allErrs, false
+}
+
+// ValidatePodUpdate tests to see if the update is legal for an end user to make. newPod is updated with fields
+// that cannot be changed.
+func ValidatePodUpdate(newPod, oldPod *core.Pod) field.ErrorList {
+ fldPath := field.NewPath("metadata")
+ allErrs := ValidateObjectMetaUpdate(&newPod.ObjectMeta, &oldPod.ObjectMeta, fldPath)
+ allErrs = append(allErrs, ValidatePodSpecificAnnotationUpdates(newPod, oldPod, fldPath.Child("annotations"))...)
+ specPath := field.NewPath("spec")
+
+ // validate updateable fields:
+ // 1. spec.containers[*].image
+ // 2. spec.initContainers[*].image
+ // 3. spec.activeDeadlineSeconds
+
+ containerErrs, stop := ValidateContainerUpdates(newPod.Spec.Containers, oldPod.Spec.Containers, specPath.Child("containers"))
+ allErrs = append(allErrs, containerErrs...)
+ if stop {
+ return allErrs
+ }
+ containerErrs, stop = ValidateContainerUpdates(newPod.Spec.InitContainers, oldPod.Spec.InitContainers, specPath.Child("initContainers"))
+ allErrs = append(allErrs, containerErrs...)
+ if stop {
+ return allErrs
+ }
+
+ // validate updated spec.activeDeadlineSeconds. two types of updates are allowed:
+ // 1. from nil to a positive value
+ // 2. from a positive value to a lesser, non-negative value
+ if newPod.Spec.ActiveDeadlineSeconds != nil {
+ newActiveDeadlineSeconds := *newPod.Spec.ActiveDeadlineSeconds
+ if newActiveDeadlineSeconds < 0 || newActiveDeadlineSeconds > math.MaxInt32 {
+ allErrs = append(allErrs, field.Invalid(specPath.Child("activeDeadlineSeconds"), newActiveDeadlineSeconds, validation.InclusiveRangeError(0, math.MaxInt32)))
+ return allErrs
+ }
+ if oldPod.Spec.ActiveDeadlineSeconds != nil {
+ oldActiveDeadlineSeconds := *oldPod.Spec.ActiveDeadlineSeconds
+ if oldActiveDeadlineSeconds < newActiveDeadlineSeconds {
+ allErrs = append(allErrs, field.Invalid(specPath.Child("activeDeadlineSeconds"), newActiveDeadlineSeconds, "must be less than or equal to previous value"))
+ return allErrs
+ }
+ }
+ } else if oldPod.Spec.ActiveDeadlineSeconds != nil {
+ allErrs = append(allErrs, field.Invalid(specPath.Child("activeDeadlineSeconds"), newPod.Spec.ActiveDeadlineSeconds, "must not update from a positive integer to nil value"))
+ }
+
+ // handle updateable fields by munging those fields prior to deep equal comparison.
+ mungedPod := *newPod
+ // munge spec.containers[*].image
+ var newContainers []core.Container
+ for ix, container := range mungedPod.Spec.Containers {
+ container.Image = oldPod.Spec.Containers[ix].Image
+ newContainers = append(newContainers, container)
+ }
+ mungedPod.Spec.Containers = newContainers
+ // munge spec.initContainers[*].image
+ var newInitContainers []core.Container
+ for ix, container := range mungedPod.Spec.InitContainers {
+ container.Image = oldPod.Spec.InitContainers[ix].Image
+ newInitContainers = append(newInitContainers, container)
+ }
+ mungedPod.Spec.InitContainers = newInitContainers
+ // munge spec.activeDeadlineSeconds
+ mungedPod.Spec.ActiveDeadlineSeconds = nil
+ if oldPod.Spec.ActiveDeadlineSeconds != nil {
+ activeDeadlineSeconds := *oldPod.Spec.ActiveDeadlineSeconds
+ mungedPod.Spec.ActiveDeadlineSeconds = &activeDeadlineSeconds
+ }
+
+ // Allow only additions to tolerations updates.
+ mungedPod.Spec.Tolerations = oldPod.Spec.Tolerations
+ allErrs = append(allErrs, validateOnlyAddedTolerations(newPod.Spec.Tolerations, oldPod.Spec.Tolerations, specPath.Child("tolerations"))...)
+
+ if !apiequality.Semantic.DeepEqual(mungedPod.Spec, oldPod.Spec) {
+ // This diff isn't perfect, but it's a helluva lot better an "I'm not going to tell you what the difference is".
+ //TODO: Pinpoint the specific field that causes the invalid error after we have strategic merge diff
+ specDiff := diff.ObjectDiff(mungedPod.Spec, oldPod.Spec)
+ allErrs = append(allErrs, field.Forbidden(specPath, fmt.Sprintf("pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations)\n%v", specDiff)))
+ }
+
+ return allErrs
+}
+
+// ValidateContainerStateTransition test to if any illegal container state transitions are being attempted
+func ValidateContainerStateTransition(newStatuses, oldStatuses []core.ContainerStatus, fldpath *field.Path, restartPolicy core.RestartPolicy) field.ErrorList {
+ allErrs := field.ErrorList{}
+ // If we should always restart, containers are allowed to leave the terminated state
+ if restartPolicy == core.RestartPolicyAlways {
+ return allErrs
+ }
+ for i, oldStatus := range oldStatuses {
+ // Skip any container that is not terminated
+ if oldStatus.State.Terminated == nil {
+ continue
+ }
+ // Skip any container that failed but is allowed to restart
+ if oldStatus.State.Terminated.ExitCode != 0 && restartPolicy == core.RestartPolicyOnFailure {
+ continue
+ }
+ for _, newStatus := range newStatuses {
+ if oldStatus.Name == newStatus.Name && newStatus.State.Terminated == nil {
+ allErrs = append(allErrs, field.Forbidden(fldpath.Index(i).Child("state"), "may not be transitioned to non-terminated state"))
+ }
+ }
+ }
+ return allErrs
+}
+
+// ValidatePodStatusUpdate tests to see if the update is legal for an end user to make. newPod is updated with fields
+// that cannot be changed.
+func ValidatePodStatusUpdate(newPod, oldPod *core.Pod) field.ErrorList {
+ fldPath := field.NewPath("metadata")
+ allErrs := ValidateObjectMetaUpdate(&newPod.ObjectMeta, &oldPod.ObjectMeta, fldPath)
+ allErrs = append(allErrs, ValidatePodSpecificAnnotationUpdates(newPod, oldPod, fldPath.Child("annotations"))...)
+
+ fldPath = field.NewPath("status")
+ if newPod.Spec.NodeName != oldPod.Spec.NodeName {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("nodeName"), "may not be changed directly"))
+ }
+
+ if newPod.Status.NominatedNodeName != oldPod.Status.NominatedNodeName && len(newPod.Status.NominatedNodeName) > 0 {
+ for _, msg := range ValidateNodeName(newPod.Status.NominatedNodeName, false) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("nominatedNodeName"), newPod.Status.NominatedNodeName, msg))
+ }
+ }
+
+ // If pod should not restart, make sure the status update does not transition
+ // any terminated containers to a non-terminated state.
+ allErrs = append(allErrs, ValidateContainerStateTransition(newPod.Status.ContainerStatuses, oldPod.Status.ContainerStatuses, fldPath.Child("containerStatuses"), oldPod.Spec.RestartPolicy)...)
+ allErrs = append(allErrs, ValidateContainerStateTransition(newPod.Status.InitContainerStatuses, oldPod.Status.InitContainerStatuses, fldPath.Child("initContainerStatuses"), oldPod.Spec.RestartPolicy)...)
+
+ // For status update we ignore changes to pod spec.
+ newPod.Spec = oldPod.Spec
+
+ return allErrs
+}
+
+// ValidatePodBinding tests if required fields in the pod binding are legal.
+func ValidatePodBinding(binding *core.Binding) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if len(binding.Target.Kind) != 0 && binding.Target.Kind != "Node" {
+ // TODO: When validation becomes versioned, this gets more complicated.
+ allErrs = append(allErrs, field.NotSupported(field.NewPath("target", "kind"), binding.Target.Kind, []string{"Node", "<empty>"}))
+ }
+ if len(binding.Target.Name) == 0 {
+ // TODO: When validation becomes versioned, this gets more complicated.
+ allErrs = append(allErrs, field.Required(field.NewPath("target", "name"), ""))
+ }
+
+ return allErrs
+}
+
+// ValidatePodTemplate tests if required fields in the pod template are set.
+func ValidatePodTemplate(pod *core.PodTemplate) field.ErrorList {
+ allErrs := ValidateObjectMeta(&pod.ObjectMeta, true, ValidatePodName, field.NewPath("metadata"))
+ allErrs = append(allErrs, ValidatePodTemplateSpec(&pod.Template, field.NewPath("template"))...)
+ return allErrs
+}
+
+// ValidatePodTemplateUpdate tests to see if the update is legal for an end user to make. newPod is updated with fields
+// that cannot be changed.
+func ValidatePodTemplateUpdate(newPod, oldPod *core.PodTemplate) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&oldPod.ObjectMeta, &newPod.ObjectMeta, field.NewPath("metadata"))
+ allErrs = append(allErrs, ValidatePodTemplateSpec(&newPod.Template, field.NewPath("template"))...)
+ return allErrs
+}
+
+var supportedSessionAffinityType = sets.NewString(string(core.ServiceAffinityClientIP), string(core.ServiceAffinityNone))
+var supportedServiceType = sets.NewString(string(core.ServiceTypeClusterIP), string(core.ServiceTypeNodePort),
+ string(core.ServiceTypeLoadBalancer), string(core.ServiceTypeExternalName))
+
+// ValidateService tests if required fields/annotations of a Service are valid.
+func ValidateService(service *core.Service) field.ErrorList {
+ allErrs := ValidateObjectMeta(&service.ObjectMeta, true, ValidateServiceName, field.NewPath("metadata"))
+
+ specPath := field.NewPath("spec")
+ isHeadlessService := service.Spec.ClusterIP == core.ClusterIPNone
+ if len(service.Spec.Ports) == 0 && !isHeadlessService && service.Spec.Type != core.ServiceTypeExternalName {
+ allErrs = append(allErrs, field.Required(specPath.Child("ports"), ""))
+ }
+ switch service.Spec.Type {
+ case core.ServiceTypeLoadBalancer:
+ for ix := range service.Spec.Ports {
+ port := &service.Spec.Ports[ix]
+ // This is a workaround for broken cloud environments that
+ // over-open firewalls. Hopefully it can go away when more clouds
+ // understand containers better.
+ if port.Port == ports.KubeletPort {
+ portPath := specPath.Child("ports").Index(ix)
+ allErrs = append(allErrs, field.Invalid(portPath, port.Port, fmt.Sprintf("may not expose port %v externally since it is used by kubelet", ports.KubeletPort)))
+ }
+ }
+ if service.Spec.ClusterIP == "None" {
+ allErrs = append(allErrs, field.Invalid(specPath.Child("clusterIP"), service.Spec.ClusterIP, "may not be set to 'None' for LoadBalancer services"))
+ }
+ case core.ServiceTypeNodePort:
+ if service.Spec.ClusterIP == "None" {
+ allErrs = append(allErrs, field.Invalid(specPath.Child("clusterIP"), service.Spec.ClusterIP, "may not be set to 'None' for NodePort services"))
+ }
+ case core.ServiceTypeExternalName:
+ if service.Spec.ClusterIP != "" {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("clusterIP"), "must be empty for ExternalName services"))
+ }
+ if len(service.Spec.ExternalName) > 0 {
+ allErrs = append(allErrs, ValidateDNS1123Subdomain(service.Spec.ExternalName, specPath.Child("externalName"))...)
+ } else {
+ allErrs = append(allErrs, field.Required(specPath.Child("externalName"), ""))
+ }
+ }
+
+ allPortNames := sets.String{}
+ portsPath := specPath.Child("ports")
+ for i := range service.Spec.Ports {
+ portPath := portsPath.Index(i)
+ allErrs = append(allErrs, validateServicePort(&service.Spec.Ports[i], len(service.Spec.Ports) > 1, isHeadlessService, &allPortNames, portPath)...)
+ }
+
+ if service.Spec.Selector != nil {
+ allErrs = append(allErrs, unversionedvalidation.ValidateLabels(service.Spec.Selector, specPath.Child("selector"))...)
+ }
+
+ if len(service.Spec.SessionAffinity) == 0 {
+ allErrs = append(allErrs, field.Required(specPath.Child("sessionAffinity"), ""))
+ } else if !supportedSessionAffinityType.Has(string(service.Spec.SessionAffinity)) {
+ allErrs = append(allErrs, field.NotSupported(specPath.Child("sessionAffinity"), service.Spec.SessionAffinity, supportedSessionAffinityType.List()))
+ }
+
+ if service.Spec.SessionAffinity == core.ServiceAffinityClientIP {
+ allErrs = append(allErrs, validateClientIPAffinityConfig(service.Spec.SessionAffinityConfig, specPath.Child("sessionAffinityConfig"))...)
+ } else if service.Spec.SessionAffinity == core.ServiceAffinityNone {
+ if service.Spec.SessionAffinityConfig != nil {
+ allErrs = append(allErrs, field.Forbidden(specPath.Child("sessionAffinityConfig"), fmt.Sprintf("must not be set when session affinity is %s", string(core.ServiceAffinityNone))))
+ }
+ }
+
+ if helper.IsServiceIPSet(service) {
+ if ip := net.ParseIP(service.Spec.ClusterIP); ip == nil {
+ allErrs = append(allErrs, field.Invalid(specPath.Child("clusterIP"), service.Spec.ClusterIP, "must be empty, 'None', or a valid IP address"))
+ }
+ }
+
+ ipPath := specPath.Child("externalIPs")
+ for i, ip := range service.Spec.ExternalIPs {
+ idxPath := ipPath.Index(i)
+ if msgs := validation.IsValidIP(ip); len(msgs) != 0 {
+ for i := range msgs {
+ allErrs = append(allErrs, field.Invalid(idxPath, ip, msgs[i]))
+ }
+ } else {
+ allErrs = append(allErrs, validateNonSpecialIP(ip, idxPath)...)
+ }
+ }
+
+ if len(service.Spec.Type) == 0 {
+ allErrs = append(allErrs, field.Required(specPath.Child("type"), ""))
+ } else if !supportedServiceType.Has(string(service.Spec.Type)) {
+ allErrs = append(allErrs, field.NotSupported(specPath.Child("type"), service.Spec.Type, supportedServiceType.List()))
+ }
+
+ if service.Spec.Type == core.ServiceTypeLoadBalancer {
+ portsPath := specPath.Child("ports")
+ includeProtocols := sets.NewString()
+ for i := range service.Spec.Ports {
+ portPath := portsPath.Index(i)
+ if !supportedPortProtocols.Has(string(service.Spec.Ports[i].Protocol)) {
+ allErrs = append(allErrs, field.Invalid(portPath.Child("protocol"), service.Spec.Ports[i].Protocol, "cannot create an external load balancer with non-TCP/UDP ports"))
+ } else {
+ includeProtocols.Insert(string(service.Spec.Ports[i].Protocol))
+ }
+ }
+ if includeProtocols.Len() > 1 {
+ allErrs = append(allErrs, field.Invalid(portsPath, service.Spec.Ports, "cannot create an external load balancer with mix protocols"))
+ }
+ }
+
+ if service.Spec.Type == core.ServiceTypeClusterIP {
+ portsPath := specPath.Child("ports")
+ for i := range service.Spec.Ports {
+ portPath := portsPath.Index(i)
+ if service.Spec.Ports[i].NodePort != 0 {
+ allErrs = append(allErrs, field.Forbidden(portPath.Child("nodePort"), "may not be used when `type` is 'ClusterIP'"))
+ }
+ }
+ }
+
+ // Check for duplicate NodePorts, considering (protocol,port) pairs
+ portsPath = specPath.Child("ports")
+ nodePorts := make(map[core.ServicePort]bool)
+ for i := range service.Spec.Ports {
+ port := &service.Spec.Ports[i]
+ if port.NodePort == 0 {
+ continue
+ }
+ portPath := portsPath.Index(i)
+ var key core.ServicePort
+ key.Protocol = port.Protocol
+ key.NodePort = port.NodePort
+ _, found := nodePorts[key]
+ if found {
+ allErrs = append(allErrs, field.Duplicate(portPath.Child("nodePort"), port.NodePort))
+ }
+ nodePorts[key] = true
+ }
+
+ // Check for duplicate Ports, considering (protocol,port) pairs
+ portsPath = specPath.Child("ports")
+ ports := make(map[core.ServicePort]bool)
+ for i, port := range service.Spec.Ports {
+ portPath := portsPath.Index(i)
+ key := core.ServicePort{Protocol: port.Protocol, Port: port.Port}
+ _, found := ports[key]
+ if found {
+ allErrs = append(allErrs, field.Duplicate(portPath, key))
+ }
+ ports[key] = true
+ }
+
+ // Validate SourceRange field and annotation
+ _, ok := service.Annotations[core.AnnotationLoadBalancerSourceRangesKey]
+ if len(service.Spec.LoadBalancerSourceRanges) > 0 || ok {
+ var fieldPath *field.Path
+ var val string
+ if len(service.Spec.LoadBalancerSourceRanges) > 0 {
+ fieldPath = specPath.Child("LoadBalancerSourceRanges")
+ val = fmt.Sprintf("%v", service.Spec.LoadBalancerSourceRanges)
+ } else {
+ fieldPath = field.NewPath("metadata", "annotations").Key(core.AnnotationLoadBalancerSourceRangesKey)
+ val = service.Annotations[core.AnnotationLoadBalancerSourceRangesKey]
+ }
+ if service.Spec.Type != core.ServiceTypeLoadBalancer {
+ allErrs = append(allErrs, field.Forbidden(fieldPath, "may only be used when `type` is 'LoadBalancer'"))
+ }
+ _, err := apiservice.GetLoadBalancerSourceRanges(service)
+ if err != nil {
+ allErrs = append(allErrs, field.Invalid(fieldPath, val, "must be a list of IP ranges. For example, 10.240.0.0/24,10.250.0.0/24 "))
+ }
+ }
+
+ allErrs = append(allErrs, validateServiceExternalTrafficFieldsValue(service)...)
+
+ return allErrs
+}
+
+func validateServicePort(sp *core.ServicePort, requireName, isHeadlessService bool, allNames *sets.String, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if requireName && len(sp.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("name"), ""))
+ } else if len(sp.Name) != 0 {
+ allErrs = append(allErrs, ValidateDNS1123Label(sp.Name, fldPath.Child("name"))...)
+ if allNames.Has(sp.Name) {
+ allErrs = append(allErrs, field.Duplicate(fldPath.Child("name"), sp.Name))
+ } else {
+ allNames.Insert(sp.Name)
+ }
+ }
+
+ for _, msg := range validation.IsValidPortNum(int(sp.Port)) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("port"), sp.Port, msg))
+ }
+
+ if len(sp.Protocol) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("protocol"), ""))
+ } else if !supportedPortProtocols.Has(string(sp.Protocol)) {
+ allErrs = append(allErrs, field.NotSupported(fldPath.Child("protocol"), sp.Protocol, supportedPortProtocols.List()))
+ }
+
+ allErrs = append(allErrs, ValidatePortNumOrName(sp.TargetPort, fldPath.Child("targetPort"))...)
+
+ // in the v1 API, targetPorts on headless services were tolerated.
+ // once we have version-specific validation, we can reject this on newer API versions, but until then, we have to tolerate it for compatibility.
+ //
+ // if isHeadlessService {
+ // if sp.TargetPort.Type == intstr.String || (sp.TargetPort.Type == intstr.Int && sp.Port != sp.TargetPort.IntValue()) {
+ // allErrs = append(allErrs, field.Invalid(fldPath.Child("targetPort"), sp.TargetPort, "must be equal to the value of 'port' when clusterIP = None"))
+ // }
+ // }
+
+ return allErrs
+}
+
+// validateServiceExternalTrafficFieldsValue validates ExternalTraffic related annotations
+// have legal value.
+func validateServiceExternalTrafficFieldsValue(service *core.Service) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ // Check first class fields.
+ if service.Spec.ExternalTrafficPolicy != "" &&
+ service.Spec.ExternalTrafficPolicy != core.ServiceExternalTrafficPolicyTypeCluster &&
+ service.Spec.ExternalTrafficPolicy != core.ServiceExternalTrafficPolicyTypeLocal {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("spec").Child("externalTrafficPolicy"), service.Spec.ExternalTrafficPolicy,
+ fmt.Sprintf("ExternalTrafficPolicy must be empty, %v or %v", core.ServiceExternalTrafficPolicyTypeCluster, core.ServiceExternalTrafficPolicyTypeLocal)))
+ }
+ if service.Spec.HealthCheckNodePort < 0 {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("spec").Child("healthCheckNodePort"), service.Spec.HealthCheckNodePort,
+ "HealthCheckNodePort must be not less than 0"))
+ }
+
+ return allErrs
+}
+
+// ValidateServiceExternalTrafficFieldsCombination validates if ExternalTrafficPolicy,
+// HealthCheckNodePort and Type combination are legal. For update, it should be called
+// after clearing externalTraffic related fields for the ease of transitioning between
+// different service types.
+func ValidateServiceExternalTrafficFieldsCombination(service *core.Service) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if service.Spec.Type != core.ServiceTypeLoadBalancer &&
+ service.Spec.Type != core.ServiceTypeNodePort &&
+ service.Spec.ExternalTrafficPolicy != "" {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "externalTrafficPolicy"), service.Spec.ExternalTrafficPolicy,
+ "ExternalTrafficPolicy can only be set on NodePort and LoadBalancer service"))
+ }
+
+ if !apiservice.NeedsHealthCheck(service) &&
+ service.Spec.HealthCheckNodePort != 0 {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "healthCheckNodePort"), service.Spec.HealthCheckNodePort,
+ "HealthCheckNodePort can only be set on LoadBalancer service with ExternalTrafficPolicy=Local"))
+ }
+
+ return allErrs
+}
+
+// ValidateServiceUpdate tests if required fields in the service are set during an update
+func ValidateServiceUpdate(service, oldService *core.Service) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&service.ObjectMeta, &oldService.ObjectMeta, field.NewPath("metadata"))
+
+ // ClusterIP should be immutable for services using it (every type other than ExternalName)
+ // which do not have ClusterIP assigned yet (empty string value)
+ if service.Spec.Type != core.ServiceTypeExternalName {
+ if oldService.Spec.Type != core.ServiceTypeExternalName && oldService.Spec.ClusterIP != "" {
+ allErrs = append(allErrs, ValidateImmutableField(service.Spec.ClusterIP, oldService.Spec.ClusterIP, field.NewPath("spec", "clusterIP"))...)
+ }
+ }
+
+ allErrs = append(allErrs, ValidateService(service)...)
+ return allErrs
+}
+
+// ValidateServiceStatusUpdate tests if required fields in the Service are set when updating status.
+func ValidateServiceStatusUpdate(service, oldService *core.Service) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&service.ObjectMeta, &oldService.ObjectMeta, field.NewPath("metadata"))
+ allErrs = append(allErrs, ValidateLoadBalancerStatus(&service.Status.LoadBalancer, field.NewPath("status", "loadBalancer"))...)
+ return allErrs
+}
+
+// ValidateReplicationController tests if required fields in the replication controller are set.
+func ValidateReplicationController(controller *core.ReplicationController) field.ErrorList {
+ allErrs := ValidateObjectMeta(&controller.ObjectMeta, true, ValidateReplicationControllerName, field.NewPath("metadata"))
+ allErrs = append(allErrs, ValidateReplicationControllerSpec(&controller.Spec, field.NewPath("spec"))...)
+ return allErrs
+}
+
+// ValidateReplicationControllerUpdate tests if required fields in the replication controller are set.
+func ValidateReplicationControllerUpdate(controller, oldController *core.ReplicationController) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&controller.ObjectMeta, &oldController.ObjectMeta, field.NewPath("metadata"))
+ allErrs = append(allErrs, ValidateReplicationControllerSpec(&controller.Spec, field.NewPath("spec"))...)
+ return allErrs
+}
+
+// ValidateReplicationControllerStatusUpdate tests if required fields in the replication controller are set.
+func ValidateReplicationControllerStatusUpdate(controller, oldController *core.ReplicationController) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&controller.ObjectMeta, &oldController.ObjectMeta, field.NewPath("metadata"))
+ allErrs = append(allErrs, ValidateReplicationControllerStatus(controller.Status, field.NewPath("status"))...)
+ return allErrs
+}
+
+func ValidateReplicationControllerStatus(status core.ReplicationControllerStatus, statusPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ allErrs = append(allErrs, ValidateNonnegativeField(int64(status.Replicas), statusPath.Child("replicas"))...)
+ allErrs = append(allErrs, ValidateNonnegativeField(int64(status.FullyLabeledReplicas), statusPath.Child("fullyLabeledReplicas"))...)
+ allErrs = append(allErrs, ValidateNonnegativeField(int64(status.ReadyReplicas), statusPath.Child("readyReplicas"))...)
+ allErrs = append(allErrs, ValidateNonnegativeField(int64(status.AvailableReplicas), statusPath.Child("availableReplicas"))...)
+ allErrs = append(allErrs, ValidateNonnegativeField(int64(status.ObservedGeneration), statusPath.Child("observedGeneration"))...)
+ msg := "cannot be greater than status.replicas"
+ if status.FullyLabeledReplicas > status.Replicas {
+ allErrs = append(allErrs, field.Invalid(statusPath.Child("fullyLabeledReplicas"), status.FullyLabeledReplicas, msg))
+ }
+ if status.ReadyReplicas > status.Replicas {
+ allErrs = append(allErrs, field.Invalid(statusPath.Child("readyReplicas"), status.ReadyReplicas, msg))
+ }
+ if status.AvailableReplicas > status.Replicas {
+ allErrs = append(allErrs, field.Invalid(statusPath.Child("availableReplicas"), status.AvailableReplicas, msg))
+ }
+ if status.AvailableReplicas > status.ReadyReplicas {
+ allErrs = append(allErrs, field.Invalid(statusPath.Child("availableReplicas"), status.AvailableReplicas, "cannot be greater than readyReplicas"))
+ }
+ return allErrs
+}
+
+// Validates that the given selector is non-empty.
+func ValidateNonEmptySelector(selectorMap map[string]string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ selector := labels.Set(selectorMap).AsSelector()
+ if selector.Empty() {
+ allErrs = append(allErrs, field.Required(fldPath, ""))
+ }
+ return allErrs
+}
+
+// Validates the given template and ensures that it is in accordance with the desired selector and replicas.
+func ValidatePodTemplateSpecForRC(template *core.PodTemplateSpec, selectorMap map[string]string, replicas int32, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if template == nil {
+ allErrs = append(allErrs, field.Required(fldPath, ""))
+ } else {
+ selector := labels.Set(selectorMap).AsSelector()
+ if !selector.Empty() {
+ // Verify that the RC selector matches the labels in template.
+ labels := labels.Set(template.Labels)
+ if !selector.Matches(labels) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("metadata", "labels"), template.Labels, "`selector` does not match template `labels`"))
+ }
+ }
+ allErrs = append(allErrs, ValidatePodTemplateSpec(template, fldPath)...)
+ if replicas > 1 {
+ allErrs = append(allErrs, ValidateReadOnlyPersistentDisks(template.Spec.Volumes, fldPath.Child("spec", "volumes"))...)
+ }
+ // RestartPolicy has already been first-order validated as per ValidatePodTemplateSpec().
+ if template.Spec.RestartPolicy != core.RestartPolicyAlways {
+ allErrs = append(allErrs, field.NotSupported(fldPath.Child("spec", "restartPolicy"), template.Spec.RestartPolicy, []string{string(core.RestartPolicyAlways)}))
+ }
+ if template.Spec.ActiveDeadlineSeconds != nil {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("spec", "activeDeadlineSeconds"), template.Spec.ActiveDeadlineSeconds, "must not be specified"))
+ }
+ }
+ return allErrs
+}
+
+// ValidateReplicationControllerSpec tests if required fields in the replication controller spec are set.
+func ValidateReplicationControllerSpec(spec *core.ReplicationControllerSpec, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ allErrs = append(allErrs, ValidateNonnegativeField(int64(spec.MinReadySeconds), fldPath.Child("minReadySeconds"))...)
+ allErrs = append(allErrs, ValidateNonEmptySelector(spec.Selector, fldPath.Child("selector"))...)
+ allErrs = append(allErrs, ValidateNonnegativeField(int64(spec.Replicas), fldPath.Child("replicas"))...)
+ allErrs = append(allErrs, ValidatePodTemplateSpecForRC(spec.Template, spec.Selector, spec.Replicas, fldPath.Child("template"))...)
+ return allErrs
+}
+
+// ValidatePodTemplateSpec validates the spec of a pod template
+func ValidatePodTemplateSpec(spec *core.PodTemplateSpec, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ allErrs = append(allErrs, unversionedvalidation.ValidateLabels(spec.Labels, fldPath.Child("labels"))...)
+ allErrs = append(allErrs, ValidateAnnotations(spec.Annotations, fldPath.Child("annotations"))...)
+ allErrs = append(allErrs, ValidatePodSpecificAnnotations(spec.Annotations, &spec.Spec, fldPath.Child("annotations"))...)
+ allErrs = append(allErrs, ValidatePodSpec(&spec.Spec, fldPath.Child("spec"))...)
+ return allErrs
+}
+
+func ValidateReadOnlyPersistentDisks(volumes []core.Volume, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for i := range volumes {
+ vol := &volumes[i]
+ idxPath := fldPath.Index(i)
+ if vol.GCEPersistentDisk != nil {
+ if vol.GCEPersistentDisk.ReadOnly == false {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("gcePersistentDisk", "readOnly"), false, "must be true for replicated pods > 1; GCE PD can only be mounted on multiple machines if it is read-only"))
+ }
+ }
+ // TODO: What to do for AWS? It doesn't support replicas
+ }
+ return allErrs
+}
+
+// ValidateTaintsInNodeAnnotations tests that the serialized taints in Node.Annotations has valid data
+func ValidateTaintsInNodeAnnotations(annotations map[string]string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ taints, err := helper.GetTaintsFromNodeAnnotations(annotations)
+ if err != nil {
+ allErrs = append(allErrs, field.Invalid(fldPath, core.TaintsAnnotationKey, err.Error()))
+ return allErrs
+ }
+
+ if len(taints) > 0 {
+ allErrs = append(allErrs, validateNodeTaints(taints, fldPath.Child(core.TaintsAnnotationKey))...)
+ }
+
+ return allErrs
+}
+
+// validateNodeTaints tests if given taints have valid data.
+func validateNodeTaints(taints []core.Taint, fldPath *field.Path) field.ErrorList {
+ allErrors := field.ErrorList{}
+
+ uniqueTaints := map[core.TaintEffect]sets.String{}
+
+ for i, currTaint := range taints {
+ idxPath := fldPath.Index(i)
+ // validate the taint key
+ allErrors = append(allErrors, unversionedvalidation.ValidateLabelName(currTaint.Key, idxPath.Child("key"))...)
+ // validate the taint value
+ if errs := validation.IsValidLabelValue(currTaint.Value); len(errs) != 0 {
+ allErrors = append(allErrors, field.Invalid(idxPath.Child("value"), currTaint.Value, strings.Join(errs, ";")))
+ }
+ // validate the taint effect
+ allErrors = append(allErrors, validateTaintEffect(&currTaint.Effect, false, idxPath.Child("effect"))...)
+
+ // validate if taint is unique by <key, effect>
+ if len(uniqueTaints[currTaint.Effect]) > 0 && uniqueTaints[currTaint.Effect].Has(currTaint.Key) {
+ duplicatedError := field.Duplicate(idxPath, currTaint)
+ duplicatedError.Detail = "taints must be unique by key and effect pair"
+ allErrors = append(allErrors, duplicatedError)
+ continue
+ }
+
+ // add taint to existingTaints for uniqueness check
+ if len(uniqueTaints[currTaint.Effect]) == 0 {
+ uniqueTaints[currTaint.Effect] = sets.String{}
+ }
+ uniqueTaints[currTaint.Effect].Insert(currTaint.Key)
+ }
+ return allErrors
+}
+
+func ValidateNodeSpecificAnnotations(annotations map[string]string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ if annotations[core.TaintsAnnotationKey] != "" {
+ allErrs = append(allErrs, ValidateTaintsInNodeAnnotations(annotations, fldPath)...)
+ }
+
+ if annotations[core.PreferAvoidPodsAnnotationKey] != "" {
+ allErrs = append(allErrs, ValidateAvoidPodsInNodeAnnotations(annotations, fldPath)...)
+ }
+ return allErrs
+}
+
+// ValidateNode tests if required fields in the node are set.
+func ValidateNode(node *core.Node) field.ErrorList {
+ fldPath := field.NewPath("metadata")
+ allErrs := ValidateObjectMeta(&node.ObjectMeta, false, ValidateNodeName, fldPath)
+ allErrs = append(allErrs, ValidateNodeSpecificAnnotations(node.ObjectMeta.Annotations, fldPath.Child("annotations"))...)
+ if len(node.Spec.Taints) > 0 {
+ allErrs = append(allErrs, validateNodeTaints(node.Spec.Taints, fldPath.Child("taints"))...)
+ }
+
+ // Only validate spec.
+ // All status fields are optional and can be updated later.
+ // That said, if specified, we need to ensure they are valid.
+ allErrs = append(allErrs, ValidateNodeResources(node)...)
+
+ // external ID is required.
+ if len(node.Spec.ExternalID) == 0 {
+ allErrs = append(allErrs, field.Required(field.NewPath("spec", "externalID"), ""))
+ }
+
+ // Only allow Node.Spec.ConfigSource to be set if the DynamicKubeletConfig feature gate is enabled
+ if node.Spec.ConfigSource != nil && !utilfeature.DefaultFeatureGate.Enabled(features.DynamicKubeletConfig) {
+ allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "configSource"), "configSource may only be set if the DynamicKubeletConfig feature gate is enabled)"))
+ }
+
+ if len(node.Spec.PodCIDR) != 0 {
+ _, err := ValidateCIDR(node.Spec.PodCIDR)
+ if err != nil {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "podCIDR"), node.Spec.PodCIDR, "not a valid CIDR"))
+ }
+ }
+ return allErrs
+}
+
+// ValidateNodeResources is used to make sure a node has valid capacity and allocatable values.
+func ValidateNodeResources(node *core.Node) field.ErrorList {
+ allErrs := field.ErrorList{}
+ // Validate resource quantities in capacity.
+ hugePageSizes := sets.NewString()
+ for k, v := range node.Status.Capacity {
+ resPath := field.NewPath("status", "capacity", string(k))
+ allErrs = append(allErrs, ValidateResourceQuantityValue(string(k), v, resPath)...)
+ // track any huge page size that has a positive value
+ if helper.IsHugePageResourceName(k) && v.Value() > int64(0) {
+ hugePageSizes.Insert(string(k))
+ }
+ if len(hugePageSizes) > 1 {
+ allErrs = append(allErrs, field.Invalid(resPath, v, "may not have pre-allocated hugepages for multiple page sizes"))
+ }
+ }
+ // Validate resource quantities in allocatable.
+ hugePageSizes = sets.NewString()
+ for k, v := range node.Status.Allocatable {
+ resPath := field.NewPath("status", "allocatable", string(k))
+ allErrs = append(allErrs, ValidateResourceQuantityValue(string(k), v, resPath)...)
+ // track any huge page size that has a positive value
+ if helper.IsHugePageResourceName(k) && v.Value() > int64(0) {
+ hugePageSizes.Insert(string(k))
+ }
+ if len(hugePageSizes) > 1 {
+ allErrs = append(allErrs, field.Invalid(resPath, v, "may not have pre-allocated hugepages for multiple page sizes"))
+ }
+ }
+ return allErrs
+}
+
+// ValidateNodeUpdate tests to make sure a node update can be applied. Modifies oldNode.
+func ValidateNodeUpdate(node, oldNode *core.Node) field.ErrorList {
+ fldPath := field.NewPath("metadata")
+ allErrs := ValidateObjectMetaUpdate(&node.ObjectMeta, &oldNode.ObjectMeta, fldPath)
+ allErrs = append(allErrs, ValidateNodeSpecificAnnotations(node.ObjectMeta.Annotations, fldPath.Child("annotations"))...)
+
+ // TODO: Enable the code once we have better core object.status update model. Currently,
+ // anyone can update node status.
+ // if !apiequality.Semantic.DeepEqual(node.Status, core.NodeStatus{}) {
+ // allErrs = append(allErrs, field.Invalid("status", node.Status, "must be empty"))
+ // }
+
+ allErrs = append(allErrs, ValidateNodeResources(node)...)
+
+ // Validate no duplicate addresses in node status.
+ addresses := make(map[core.NodeAddress]bool)
+ for i, address := range node.Status.Addresses {
+ if _, ok := addresses[address]; ok {
+ allErrs = append(allErrs, field.Duplicate(field.NewPath("status", "addresses").Index(i), address))
+ }
+ addresses[address] = true
+ }
+
+ if len(oldNode.Spec.PodCIDR) == 0 {
+ // Allow the controller manager to assign a CIDR to a node if it doesn't have one.
+ oldNode.Spec.PodCIDR = node.Spec.PodCIDR
+ } else {
+ if oldNode.Spec.PodCIDR != node.Spec.PodCIDR {
+ allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "podCIDR"), "node updates may not change podCIDR except from \"\" to valid"))
+ }
+ }
+
+ // Allow controller manager updating provider ID when not set
+ if len(oldNode.Spec.ProviderID) == 0 {
+ oldNode.Spec.ProviderID = node.Spec.ProviderID
+ } else {
+ if oldNode.Spec.ProviderID != node.Spec.ProviderID {
+ allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "providerID"), "node updates may not change providerID except from \"\" to valid"))
+ }
+ }
+
+ // TODO: move reset function to its own location
+ // Ignore metadata changes now that they have been tested
+ oldNode.ObjectMeta = node.ObjectMeta
+ // Allow users to update capacity
+ oldNode.Status.Capacity = node.Status.Capacity
+ // Allow users to unschedule node
+ oldNode.Spec.Unschedulable = node.Spec.Unschedulable
+ // Clear status
+ oldNode.Status = node.Status
+
+ // update taints
+ if len(node.Spec.Taints) > 0 {
+ allErrs = append(allErrs, validateNodeTaints(node.Spec.Taints, fldPath.Child("taints"))...)
+ }
+ oldNode.Spec.Taints = node.Spec.Taints
+
+ // Allow updates to Node.Spec.ConfigSource if DynamicKubeletConfig feature gate is enabled
+ if utilfeature.DefaultFeatureGate.Enabled(features.DynamicKubeletConfig) {
+ oldNode.Spec.ConfigSource = node.Spec.ConfigSource
+ }
+
+ // We made allowed changes to oldNode, and now we compare oldNode to node. Any remaining differences indicate changes to protected fields.
+ // TODO: Add a 'real' error type for this error and provide print actual diffs.
+ if !apiequality.Semantic.DeepEqual(oldNode, node) {
+ glog.V(4).Infof("Update failed validation %#v vs %#v", oldNode, node)
+ allErrs = append(allErrs, field.Forbidden(field.NewPath(""), "node updates may only change labels, taints, or capacity (or configSource, if the DynamicKubeletConfig feature gate is enabled)"))
+ }
+
+ return allErrs
+}
+
+// Validate compute resource typename.
+// Refer to docs/design/resources.md for more details.
+func validateResourceName(value string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for _, msg := range validation.IsQualifiedName(value) {
+ allErrs = append(allErrs, field.Invalid(fldPath, value, msg))
+ }
+ if len(allErrs) != 0 {
+ return allErrs
+ }
+
+ if len(strings.Split(value, "/")) == 1 {
+ if !helper.IsStandardResourceName(value) {
+ return append(allErrs, field.Invalid(fldPath, value, "must be a standard resource type or fully qualified"))
+ }
+ }
+
+ return allErrs
+}
+
+// Validate container resource name
+// Refer to docs/design/resources.md for more details.
+func validateContainerResourceName(value string, fldPath *field.Path) field.ErrorList {
+ allErrs := validateResourceName(value, fldPath)
+
+ if len(strings.Split(value, "/")) == 1 {
+ if !helper.IsStandardContainerResourceName(value) {
+ return append(allErrs, field.Invalid(fldPath, value, "must be a standard resource for containers"))
+ }
+ } else if !helper.IsDefaultNamespaceResource(core.ResourceName(value)) {
+ if !helper.IsExtendedResourceName(core.ResourceName(value)) {
+ return append(allErrs, field.Invalid(fldPath, value, "doesn't follow extended resource name standard"))
+ }
+ }
+ return allErrs
+}
+
+// isLocalStorageResource checks whether the resource is local ephemeral storage
+func isLocalStorageResource(name string) bool {
+ if name == string(core.ResourceEphemeralStorage) || name == string(core.ResourceRequestsEphemeralStorage) ||
+ name == string(core.ResourceLimitsEphemeralStorage) {
+ return true
+ } else {
+ return false
+ }
+}
+
+// Validate resource names that can go in a resource quota
+// Refer to docs/design/resources.md for more details.
+func ValidateResourceQuotaResourceName(value string, fldPath *field.Path) field.ErrorList {
+ allErrs := validateResourceName(value, fldPath)
+ if isLocalStorageResource(value) && !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) {
+ return append(allErrs, field.Forbidden(fldPath, "ResourceEphemeralStorage field disabled by feature-gate for ResourceQuota"))
+ }
+ if len(strings.Split(value, "/")) == 1 {
+ if !helper.IsStandardQuotaResourceName(value) {
+ return append(allErrs, field.Invalid(fldPath, value, isInvalidQuotaResource))
+ }
+ }
+ return allErrs
+}
+
+// Validate limit range types
+func validateLimitRangeTypeName(value string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for _, msg := range validation.IsQualifiedName(value) {
+ allErrs = append(allErrs, field.Invalid(fldPath, value, msg))
+ }
+ if len(allErrs) != 0 {
+ return allErrs
+ }
+
+ if len(strings.Split(value, "/")) == 1 {
+ if !helper.IsStandardLimitRangeType(value) {
+ return append(allErrs, field.Invalid(fldPath, value, "must be a standard limit type or fully qualified"))
+ }
+ }
+
+ return allErrs
+}
+
+// Validate limit range resource name
+// limit types (other than Pod/Container) could contain storage not just cpu or memory
+func validateLimitRangeResourceName(limitType core.LimitType, value string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if value == string(core.ResourceEphemeralStorage) && !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) {
+ return append(allErrs, field.Forbidden(fldPath, "ResourceEphemeralStorage field disabled by feature-gate for Resource LimitRange"))
+ }
+ switch limitType {
+ case core.LimitTypePod, core.LimitTypeContainer:
+ return validateContainerResourceName(value, fldPath)
+ default:
+ return validateResourceName(value, fldPath)
+ }
+}
+
+// ValidateLimitRange tests if required fields in the LimitRange are set.
+func ValidateLimitRange(limitRange *core.LimitRange) field.ErrorList {
+ allErrs := ValidateObjectMeta(&limitRange.ObjectMeta, true, ValidateLimitRangeName, field.NewPath("metadata"))
+
+ // ensure resource names are properly qualified per docs/design/resources.md
+ limitTypeSet := map[core.LimitType]bool{}
+ fldPath := field.NewPath("spec", "limits")
+ for i := range limitRange.Spec.Limits {
+ idxPath := fldPath.Index(i)
+ limit := &limitRange.Spec.Limits[i]
+ allErrs = append(allErrs, validateLimitRangeTypeName(string(limit.Type), idxPath.Child("type"))...)
+
+ _, found := limitTypeSet[limit.Type]
+ if found {
+ allErrs = append(allErrs, field.Duplicate(idxPath.Child("type"), limit.Type))
+ }
+ limitTypeSet[limit.Type] = true
+
+ keys := sets.String{}
+ min := map[string]resource.Quantity{}
+ max := map[string]resource.Quantity{}
+ defaults := map[string]resource.Quantity{}
+ defaultRequests := map[string]resource.Quantity{}
+ maxLimitRequestRatios := map[string]resource.Quantity{}
+
+ for k, q := range limit.Max {
+ allErrs = append(allErrs, validateLimitRangeResourceName(limit.Type, string(k), idxPath.Child("max").Key(string(k)))...)
+ keys.Insert(string(k))
+ max[string(k)] = q
+ }
+ for k, q := range limit.Min {
+ allErrs = append(allErrs, validateLimitRangeResourceName(limit.Type, string(k), idxPath.Child("min").Key(string(k)))...)
+ keys.Insert(string(k))
+ min[string(k)] = q
+ }
+
+ if limit.Type == core.LimitTypePod {
+ if len(limit.Default) > 0 {
+ allErrs = append(allErrs, field.Forbidden(idxPath.Child("default"), "may not be specified when `type` is 'Pod'"))
+ }
+ if len(limit.DefaultRequest) > 0 {
+ allErrs = append(allErrs, field.Forbidden(idxPath.Child("defaultRequest"), "may not be specified when `type` is 'Pod'"))
+ }
+ } else {
+ for k, q := range limit.Default {
+ allErrs = append(allErrs, validateLimitRangeResourceName(limit.Type, string(k), idxPath.Child("default").Key(string(k)))...)
+ keys.Insert(string(k))
+ defaults[string(k)] = q
+ }
+ for k, q := range limit.DefaultRequest {
+ allErrs = append(allErrs, validateLimitRangeResourceName(limit.Type, string(k), idxPath.Child("defaultRequest").Key(string(k)))...)
+ keys.Insert(string(k))
+ defaultRequests[string(k)] = q
+ }
+ }
+
+ if limit.Type == core.LimitTypePersistentVolumeClaim {
+ _, minQuantityFound := limit.Min[core.ResourceStorage]
+ _, maxQuantityFound := limit.Max[core.ResourceStorage]
+ if !minQuantityFound && !maxQuantityFound {
+ allErrs = append(allErrs, field.Required(idxPath.Child("limits"), "either minimum or maximum storage value is required, but neither was provided"))
+ }
+ }
+
+ for k, q := range limit.MaxLimitRequestRatio {
+ allErrs = append(allErrs, validateLimitRangeResourceName(limit.Type, string(k), idxPath.Child("maxLimitRequestRatio").Key(string(k)))...)
+ keys.Insert(string(k))
+ maxLimitRequestRatios[string(k)] = q
+ }
+
+ for k := range keys {
+ minQuantity, minQuantityFound := min[k]
+ maxQuantity, maxQuantityFound := max[k]
+ defaultQuantity, defaultQuantityFound := defaults[k]
+ defaultRequestQuantity, defaultRequestQuantityFound := defaultRequests[k]
+ maxRatio, maxRatioFound := maxLimitRequestRatios[k]
+
+ if minQuantityFound && maxQuantityFound && minQuantity.Cmp(maxQuantity) > 0 {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("min").Key(string(k)), minQuantity, fmt.Sprintf("min value %s is greater than max value %s", minQuantity.String(), maxQuantity.String())))
+ }
+
+ if defaultRequestQuantityFound && minQuantityFound && minQuantity.Cmp(defaultRequestQuantity) > 0 {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("defaultRequest").Key(string(k)), defaultRequestQuantity, fmt.Sprintf("min value %s is greater than default request value %s", minQuantity.String(), defaultRequestQuantity.String())))
+ }
+
+ if defaultRequestQuantityFound && maxQuantityFound && defaultRequestQuantity.Cmp(maxQuantity) > 0 {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("defaultRequest").Key(string(k)), defaultRequestQuantity, fmt.Sprintf("default request value %s is greater than max value %s", defaultRequestQuantity.String(), maxQuantity.String())))
+ }
+
+ if defaultRequestQuantityFound && defaultQuantityFound && defaultRequestQuantity.Cmp(defaultQuantity) > 0 {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("defaultRequest").Key(string(k)), defaultRequestQuantity, fmt.Sprintf("default request value %s is greater than default limit value %s", defaultRequestQuantity.String(), defaultQuantity.String())))
+ }
+
+ if defaultQuantityFound && minQuantityFound && minQuantity.Cmp(defaultQuantity) > 0 {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("default").Key(string(k)), minQuantity, fmt.Sprintf("min value %s is greater than default value %s", minQuantity.String(), defaultQuantity.String())))
+ }
+
+ if defaultQuantityFound && maxQuantityFound && defaultQuantity.Cmp(maxQuantity) > 0 {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("default").Key(string(k)), maxQuantity, fmt.Sprintf("default value %s is greater than max value %s", defaultQuantity.String(), maxQuantity.String())))
+ }
+ if maxRatioFound && maxRatio.Cmp(*resource.NewQuantity(1, resource.DecimalSI)) < 0 {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("maxLimitRequestRatio").Key(string(k)), maxRatio, fmt.Sprintf("ratio %s is less than 1", maxRatio.String())))
+ }
+ if maxRatioFound && minQuantityFound && maxQuantityFound {
+ maxRatioValue := float64(maxRatio.Value())
+ minQuantityValue := minQuantity.Value()
+ maxQuantityValue := maxQuantity.Value()
+ if maxRatio.Value() < resource.MaxMilliValue && minQuantityValue < resource.MaxMilliValue && maxQuantityValue < resource.MaxMilliValue {
+ maxRatioValue = float64(maxRatio.MilliValue()) / 1000
+ minQuantityValue = minQuantity.MilliValue()
+ maxQuantityValue = maxQuantity.MilliValue()
+ }
+ maxRatioLimit := float64(maxQuantityValue) / float64(minQuantityValue)
+ if maxRatioValue > maxRatioLimit {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("maxLimitRequestRatio").Key(string(k)), maxRatio, fmt.Sprintf("ratio %s is greater than max/min = %f", maxRatio.String(), maxRatioLimit)))
+ }
+ }
+
+ // for GPU, hugepages and other resources that are not allowed to overcommit,
+ // the default value and defaultRequest value must match if both are specified
+ if !helper.IsOvercommitAllowed(core.ResourceName(k)) && defaultQuantityFound && defaultRequestQuantityFound && defaultQuantity.Cmp(defaultRequestQuantity) != 0 {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("defaultRequest").Key(string(k)), defaultRequestQuantity, fmt.Sprintf("default value %s must equal to defaultRequest value %s in %s", defaultQuantity.String(), defaultRequestQuantity.String(), k)))
+ }
+ }
+ }
+
+ return allErrs
+}
+
+// ValidateServiceAccount tests if required fields in the ServiceAccount are set.
+func ValidateServiceAccount(serviceAccount *core.ServiceAccount) field.ErrorList {
+ allErrs := ValidateObjectMeta(&serviceAccount.ObjectMeta, true, ValidateServiceAccountName, field.NewPath("metadata"))
+ return allErrs
+}
+
+// ValidateServiceAccountUpdate tests if required fields in the ServiceAccount are set.
+func ValidateServiceAccountUpdate(newServiceAccount, oldServiceAccount *core.ServiceAccount) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&newServiceAccount.ObjectMeta, &oldServiceAccount.ObjectMeta, field.NewPath("metadata"))
+ allErrs = append(allErrs, ValidateServiceAccount(newServiceAccount)...)
+ return allErrs
+}
+
+// ValidateSecret tests if required fields in the Secret are set.
+func ValidateSecret(secret *core.Secret) field.ErrorList {
+ allErrs := ValidateObjectMeta(&secret.ObjectMeta, true, ValidateSecretName, field.NewPath("metadata"))
+
+ dataPath := field.NewPath("data")
+ totalSize := 0
+ for key, value := range secret.Data {
+ for _, msg := range validation.IsConfigMapKey(key) {
+ allErrs = append(allErrs, field.Invalid(dataPath.Key(key), key, msg))
+ }
+ totalSize += len(value)
+ }
+ if totalSize > core.MaxSecretSize {
+ allErrs = append(allErrs, field.TooLong(dataPath, "", core.MaxSecretSize))
+ }
+
+ switch secret.Type {
+ case core.SecretTypeServiceAccountToken:
+ // Only require Annotations[kubernetes.io/service-account.name]
+ // Additional fields (like Annotations[kubernetes.io/service-account.uid] and Data[token]) might be contributed later by a controller loop
+ if value := secret.Annotations[core.ServiceAccountNameKey]; len(value) == 0 {
+ allErrs = append(allErrs, field.Required(field.NewPath("metadata", "annotations").Key(core.ServiceAccountNameKey), ""))
+ }
+ case core.SecretTypeOpaque, "":
+ // no-op
+ case core.SecretTypeDockercfg:
+ dockercfgBytes, exists := secret.Data[core.DockerConfigKey]
+ if !exists {
+ allErrs = append(allErrs, field.Required(dataPath.Key(core.DockerConfigKey), ""))
+ break
+ }
+
+ // make sure that the content is well-formed json.
+ if err := json.Unmarshal(dockercfgBytes, &map[string]interface{}{}); err != nil {
+ allErrs = append(allErrs, field.Invalid(dataPath.Key(core.DockerConfigKey), "<secret contents redacted>", err.Error()))
+ }
+ case core.SecretTypeDockerConfigJson:
+ dockerConfigJsonBytes, exists := secret.Data[core.DockerConfigJsonKey]
+ if !exists {
+ allErrs = append(allErrs, field.Required(dataPath.Key(core.DockerConfigJsonKey), ""))
+ break
+ }
+
+ // make sure that the content is well-formed json.
+ if err := json.Unmarshal(dockerConfigJsonBytes, &map[string]interface{}{}); err != nil {
+ allErrs = append(allErrs, field.Invalid(dataPath.Key(core.DockerConfigJsonKey), "<secret contents redacted>", err.Error()))
+ }
+ case core.SecretTypeBasicAuth:
+ _, usernameFieldExists := secret.Data[core.BasicAuthUsernameKey]
+ _, passwordFieldExists := secret.Data[core.BasicAuthPasswordKey]
+
+ // username or password might be empty, but the field must be present
+ if !usernameFieldExists && !passwordFieldExists {
+ allErrs = append(allErrs, field.Required(field.NewPath("data[%s]").Key(core.BasicAuthUsernameKey), ""))
+ allErrs = append(allErrs, field.Required(field.NewPath("data[%s]").Key(core.BasicAuthPasswordKey), ""))
+ break
+ }
+ case core.SecretTypeSSHAuth:
+ if len(secret.Data[core.SSHAuthPrivateKey]) == 0 {
+ allErrs = append(allErrs, field.Required(field.NewPath("data[%s]").Key(core.SSHAuthPrivateKey), ""))
+ break
+ }
+
+ case core.SecretTypeTLS:
+ if _, exists := secret.Data[core.TLSCertKey]; !exists {
+ allErrs = append(allErrs, field.Required(dataPath.Key(core.TLSCertKey), ""))
+ }
+ if _, exists := secret.Data[core.TLSPrivateKeyKey]; !exists {
+ allErrs = append(allErrs, field.Required(dataPath.Key(core.TLSPrivateKeyKey), ""))
+ }
+ // TODO: Verify that the key matches the cert.
+ default:
+ // no-op
+ }
+
+ return allErrs
+}
+
+// ValidateSecretUpdate tests if required fields in the Secret are set.
+func ValidateSecretUpdate(newSecret, oldSecret *core.Secret) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&newSecret.ObjectMeta, &oldSecret.ObjectMeta, field.NewPath("metadata"))
+
+ if len(newSecret.Type) == 0 {
+ newSecret.Type = oldSecret.Type
+ }
+
+ allErrs = append(allErrs, ValidateImmutableField(newSecret.Type, oldSecret.Type, field.NewPath("type"))...)
+
+ allErrs = append(allErrs, ValidateSecret(newSecret)...)
+ return allErrs
+}
+
+// ValidateConfigMapName can be used to check whether the given ConfigMap name is valid.
+// Prefix indicates this name will be used as part of generation, in which case
+// trailing dashes are allowed.
+var ValidateConfigMapName = NameIsDNSSubdomain
+
+// ValidateConfigMap tests whether required fields in the ConfigMap are set.
+func ValidateConfigMap(cfg *core.ConfigMap) field.ErrorList {
+ allErrs := field.ErrorList{}
+ allErrs = append(allErrs, ValidateObjectMeta(&cfg.ObjectMeta, true, ValidateConfigMapName, field.NewPath("metadata"))...)
+
+ totalSize := 0
+
+ for key, value := range cfg.Data {
+ for _, msg := range validation.IsConfigMapKey(key) {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("data").Key(key), key, msg))
+ }
+ // check if we have a duplicate key in the other bag
+ if _, isValue := cfg.BinaryData[key]; isValue {
+ msg := "duplicate of key present in binaryData"
+ allErrs = append(allErrs, field.Invalid(field.NewPath("data").Key(key), key, msg))
+ }
+ totalSize += len(value)
+ }
+ for key, value := range cfg.BinaryData {
+ for _, msg := range validation.IsConfigMapKey(key) {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("binaryData").Key(key), key, msg))
+ }
+ totalSize += len(value)
+ }
+ if totalSize > core.MaxSecretSize {
+ // pass back "" to indicate that the error refers to the whole object.
+ allErrs = append(allErrs, field.TooLong(field.NewPath(""), cfg, core.MaxSecretSize))
+ }
+
+ return allErrs
+}
+
+// ValidateConfigMapUpdate tests if required fields in the ConfigMap are set.
+func ValidateConfigMapUpdate(newCfg, oldCfg *core.ConfigMap) field.ErrorList {
+ allErrs := field.ErrorList{}
+ allErrs = append(allErrs, ValidateObjectMetaUpdate(&newCfg.ObjectMeta, &oldCfg.ObjectMeta, field.NewPath("metadata"))...)
+ allErrs = append(allErrs, ValidateConfigMap(newCfg)...)
+
+ return allErrs
+}
+
+func validateBasicResource(quantity resource.Quantity, fldPath *field.Path) field.ErrorList {
+ if quantity.Value() < 0 {
+ return field.ErrorList{field.Invalid(fldPath, quantity.Value(), "must be a valid resource quantity")}
+ }
+ return field.ErrorList{}
+}
+
+// Validates resource requirement spec.
+func ValidateResourceRequirements(requirements *core.ResourceRequirements, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ limPath := fldPath.Child("limits")
+ reqPath := fldPath.Child("requests")
+ limContainsCpuOrMemory := false
+ reqContainsCpuOrMemory := false
+ limContainsHugePages := false
+ reqContainsHugePages := false
+ supportedQoSComputeResources := sets.NewString(string(core.ResourceCPU), string(core.ResourceMemory))
+ for resourceName, quantity := range requirements.Limits {
+
+ fldPath := limPath.Key(string(resourceName))
+ // Validate resource name.
+ allErrs = append(allErrs, validateContainerResourceName(string(resourceName), fldPath)...)
+
+ // Validate resource quantity.
+ allErrs = append(allErrs, ValidateResourceQuantityValue(string(resourceName), quantity, fldPath)...)
+
+ if resourceName == core.ResourceEphemeralStorage && !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) {
+ allErrs = append(allErrs, field.Forbidden(limPath, "ResourceEphemeralStorage field disabled by feature-gate for ResourceRequirements"))
+ }
+ if helper.IsHugePageResourceName(resourceName) {
+ if !utilfeature.DefaultFeatureGate.Enabled(features.HugePages) {
+ allErrs = append(allErrs, field.Forbidden(limPath, fmt.Sprintf("%s field disabled by feature-gate for ResourceRequirements", resourceName)))
+ } else {
+ limContainsHugePages = true
+ }
+ }
+
+ if supportedQoSComputeResources.Has(string(resourceName)) {
+ limContainsCpuOrMemory = true
+ }
+ }
+ for resourceName, quantity := range requirements.Requests {
+ fldPath := reqPath.Key(string(resourceName))
+ // Validate resource name.
+ allErrs = append(allErrs, validateContainerResourceName(string(resourceName), fldPath)...)
+ // Validate resource quantity.
+ allErrs = append(allErrs, ValidateResourceQuantityValue(string(resourceName), quantity, fldPath)...)
+
+ // Check that request <= limit.
+ limitQuantity, exists := requirements.Limits[resourceName]
+ if exists {
+ // For non overcommitable resources, not only requests can't exceed limits, they also can't be lower, i.e. must be equal.
+ if quantity.Cmp(limitQuantity) != 0 && !helper.IsOvercommitAllowed(resourceName) {
+ allErrs = append(allErrs, field.Invalid(reqPath, quantity.String(), fmt.Sprintf("must be equal to %s limit", resourceName)))
+ } else if quantity.Cmp(limitQuantity) > 0 {
+ allErrs = append(allErrs, field.Invalid(reqPath, quantity.String(), fmt.Sprintf("must be less than or equal to %s limit", resourceName)))
+ }
+ } else if !helper.IsOvercommitAllowed(resourceName) {
+ allErrs = append(allErrs, field.Required(limPath, "Limit must be set for non overcommitable resources"))
+ }
+ if helper.IsHugePageResourceName(resourceName) {
+ reqContainsHugePages = true
+ }
+ if supportedQoSComputeResources.Has(string(resourceName)) {
+ reqContainsCpuOrMemory = true
+ }
+
+ }
+ if !limContainsCpuOrMemory && !reqContainsCpuOrMemory && (reqContainsHugePages || limContainsHugePages) {
+ allErrs = append(allErrs, field.Forbidden(fldPath, fmt.Sprintf("HugePages require cpu or memory")))
+ }
+
+ return allErrs
+}
+
+// validateResourceQuotaScopes ensures that each enumerated hard resource constraint is valid for set of scopes
+func validateResourceQuotaScopes(resourceQuotaSpec *core.ResourceQuotaSpec, fld *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(resourceQuotaSpec.Scopes) == 0 {
+ return allErrs
+ }
+ hardLimits := sets.NewString()
+ for k := range resourceQuotaSpec.Hard {
+ hardLimits.Insert(string(k))
+ }
+ fldPath := fld.Child("scopes")
+ scopeSet := sets.NewString()
+ for _, scope := range resourceQuotaSpec.Scopes {
+ if !helper.IsStandardResourceQuotaScope(string(scope)) {
+ allErrs = append(allErrs, field.Invalid(fldPath, resourceQuotaSpec.Scopes, "unsupported scope"))
+ }
+ for _, k := range hardLimits.List() {
+ if helper.IsStandardQuotaResourceName(k) && !helper.IsResourceQuotaScopeValidForResource(scope, k) {
+ allErrs = append(allErrs, field.Invalid(fldPath, resourceQuotaSpec.Scopes, "unsupported scope applied to resource"))
+ }
+ }
+ scopeSet.Insert(string(scope))
+ }
+ invalidScopePairs := []sets.String{
+ sets.NewString(string(core.ResourceQuotaScopeBestEffort), string(core.ResourceQuotaScopeNotBestEffort)),
+ sets.NewString(string(core.ResourceQuotaScopeTerminating), string(core.ResourceQuotaScopeNotTerminating)),
+ }
+ for _, invalidScopePair := range invalidScopePairs {
+ if scopeSet.HasAll(invalidScopePair.List()...) {
+ allErrs = append(allErrs, field.Invalid(fldPath, resourceQuotaSpec.Scopes, "conflicting scopes"))
+ }
+ }
+ return allErrs
+}
+
+// ValidateResourceQuota tests if required fields in the ResourceQuota are set.
+func ValidateResourceQuota(resourceQuota *core.ResourceQuota) field.ErrorList {
+ allErrs := ValidateObjectMeta(&resourceQuota.ObjectMeta, true, ValidateResourceQuotaName, field.NewPath("metadata"))
+
+ allErrs = append(allErrs, ValidateResourceQuotaSpec(&resourceQuota.Spec, field.NewPath("spec"))...)
+ allErrs = append(allErrs, ValidateResourceQuotaStatus(&resourceQuota.Status, field.NewPath("status"))...)
+
+ return allErrs
+}
+
+func ValidateResourceQuotaStatus(status *core.ResourceQuotaStatus, fld *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ fldPath := fld.Child("hard")
+ for k, v := range status.Hard {
+ resPath := fldPath.Key(string(k))
+ allErrs = append(allErrs, ValidateResourceQuotaResourceName(string(k), resPath)...)
+ allErrs = append(allErrs, ValidateResourceQuantityValue(string(k), v, resPath)...)
+ }
+ fldPath = fld.Child("used")
+ for k, v := range status.Used {
+ resPath := fldPath.Key(string(k))
+ allErrs = append(allErrs, ValidateResourceQuotaResourceName(string(k), resPath)...)
+ allErrs = append(allErrs, ValidateResourceQuantityValue(string(k), v, resPath)...)
+ }
+
+ return allErrs
+}
+
+func ValidateResourceQuotaSpec(resourceQuotaSpec *core.ResourceQuotaSpec, fld *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+
+ fldPath := fld.Child("hard")
+ for k, v := range resourceQuotaSpec.Hard {
+ resPath := fldPath.Key(string(k))
+ allErrs = append(allErrs, ValidateResourceQuotaResourceName(string(k), resPath)...)
+ allErrs = append(allErrs, ValidateResourceQuantityValue(string(k), v, resPath)...)
+ }
+ allErrs = append(allErrs, validateResourceQuotaScopes(resourceQuotaSpec, fld)...)
+
+ return allErrs
+}
+
+// ValidateResourceQuantityValue enforces that specified quantity is valid for specified resource
+func ValidateResourceQuantityValue(resource string, value resource.Quantity, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ allErrs = append(allErrs, ValidateNonnegativeQuantity(value, fldPath)...)
+ if helper.IsIntegerResourceName(resource) {
+ if value.MilliValue()%int64(1000) != int64(0) {
+ allErrs = append(allErrs, field.Invalid(fldPath, value, isNotIntegerErrorMsg))
+ }
+ }
+ return allErrs
+}
+
+// ValidateResourceQuotaUpdate tests to see if the update is legal for an end user to make.
+// newResourceQuota is updated with fields that cannot be changed.
+func ValidateResourceQuotaUpdate(newResourceQuota, oldResourceQuota *core.ResourceQuota) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&newResourceQuota.ObjectMeta, &oldResourceQuota.ObjectMeta, field.NewPath("metadata"))
+ allErrs = append(allErrs, ValidateResourceQuotaSpec(&newResourceQuota.Spec, field.NewPath("spec"))...)
+
+ // ensure scopes cannot change, and that resources are still valid for scope
+ fldPath := field.NewPath("spec", "scopes")
+ oldScopes := sets.NewString()
+ newScopes := sets.NewString()
+ for _, scope := range newResourceQuota.Spec.Scopes {
+ newScopes.Insert(string(scope))
+ }
+ for _, scope := range oldResourceQuota.Spec.Scopes {
+ oldScopes.Insert(string(scope))
+ }
+ if !oldScopes.Equal(newScopes) {
+ allErrs = append(allErrs, field.Invalid(fldPath, newResourceQuota.Spec.Scopes, fieldImmutableErrorMsg))
+ }
+
+ newResourceQuota.Status = oldResourceQuota.Status
+ return allErrs
+}
+
+// ValidateResourceQuotaStatusUpdate tests to see if the status update is legal for an end user to make.
+// newResourceQuota is updated with fields that cannot be changed.
+func ValidateResourceQuotaStatusUpdate(newResourceQuota, oldResourceQuota *core.ResourceQuota) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&newResourceQuota.ObjectMeta, &oldResourceQuota.ObjectMeta, field.NewPath("metadata"))
+ if len(newResourceQuota.ResourceVersion) == 0 {
+ allErrs = append(allErrs, field.Required(field.NewPath("resourceVersion"), ""))
+ }
+ fldPath := field.NewPath("status", "hard")
+ for k, v := range newResourceQuota.Status.Hard {
+ resPath := fldPath.Key(string(k))
+ allErrs = append(allErrs, ValidateResourceQuotaResourceName(string(k), resPath)...)
+ allErrs = append(allErrs, ValidateResourceQuantityValue(string(k), v, resPath)...)
+ }
+ fldPath = field.NewPath("status", "used")
+ for k, v := range newResourceQuota.Status.Used {
+ resPath := fldPath.Key(string(k))
+ allErrs = append(allErrs, ValidateResourceQuotaResourceName(string(k), resPath)...)
+ allErrs = append(allErrs, ValidateResourceQuantityValue(string(k), v, resPath)...)
+ }
+ newResourceQuota.Spec = oldResourceQuota.Spec
+ return allErrs
+}
+
+// ValidateNamespace tests if required fields are set.
+func ValidateNamespace(namespace *core.Namespace) field.ErrorList {
+ allErrs := ValidateObjectMeta(&namespace.ObjectMeta, false, ValidateNamespaceName, field.NewPath("metadata"))
+ for i := range namespace.Spec.Finalizers {
+ allErrs = append(allErrs, validateFinalizerName(string(namespace.Spec.Finalizers[i]), field.NewPath("spec", "finalizers"))...)
+ }
+ return allErrs
+}
+
+// Validate finalizer names
+func validateFinalizerName(stringValue string, fldPath *field.Path) field.ErrorList {
+ allErrs := apimachineryvalidation.ValidateFinalizerName(stringValue, fldPath)
+ for _, err := range validateKubeFinalizerName(stringValue, fldPath) {
+ allErrs = append(allErrs, err)
+ }
+
+ return allErrs
+}
+
+// validateKubeFinalizerName checks for "standard" names of legacy finalizer
+func validateKubeFinalizerName(stringValue string, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if len(strings.Split(stringValue, "/")) == 1 {
+ if !helper.IsStandardFinalizerName(stringValue) {
+ return append(allErrs, field.Invalid(fldPath, stringValue, "name is neither a standard finalizer name nor is it fully qualified"))
+ }
+ }
+
+ return allErrs
+}
+
+// ValidateNamespaceUpdate tests to make sure a namespace update can be applied.
+// newNamespace is updated with fields that cannot be changed
+func ValidateNamespaceUpdate(newNamespace *core.Namespace, oldNamespace *core.Namespace) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&newNamespace.ObjectMeta, &oldNamespace.ObjectMeta, field.NewPath("metadata"))
+ newNamespace.Spec.Finalizers = oldNamespace.Spec.Finalizers
+ newNamespace.Status = oldNamespace.Status
+ return allErrs
+}
+
+// ValidateNamespaceStatusUpdate tests to see if the update is legal for an end user to make. newNamespace is updated with fields
+// that cannot be changed.
+func ValidateNamespaceStatusUpdate(newNamespace, oldNamespace *core.Namespace) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&newNamespace.ObjectMeta, &oldNamespace.ObjectMeta, field.NewPath("metadata"))
+ newNamespace.Spec = oldNamespace.Spec
+ if newNamespace.DeletionTimestamp.IsZero() {
+ if newNamespace.Status.Phase != core.NamespaceActive {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("status", "Phase"), newNamespace.Status.Phase, "may only be 'Active' if `deletionTimestamp` is empty"))
+ }
+ } else {
+ if newNamespace.Status.Phase != core.NamespaceTerminating {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("status", "Phase"), newNamespace.Status.Phase, "may only be 'Terminating' if `deletionTimestamp` is not empty"))
+ }
+ }
+ return allErrs
+}
+
+// ValidateNamespaceFinalizeUpdate tests to see if the update is legal for an end user to make.
+// newNamespace is updated with fields that cannot be changed.
+func ValidateNamespaceFinalizeUpdate(newNamespace, oldNamespace *core.Namespace) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&newNamespace.ObjectMeta, &oldNamespace.ObjectMeta, field.NewPath("metadata"))
+
+ fldPath := field.NewPath("spec", "finalizers")
+ for i := range newNamespace.Spec.Finalizers {
+ idxPath := fldPath.Index(i)
+ allErrs = append(allErrs, validateFinalizerName(string(newNamespace.Spec.Finalizers[i]), idxPath)...)
+ }
+ newNamespace.Status = oldNamespace.Status
+ return allErrs
+}
+
+// Construct lookup map of old subset IPs to NodeNames.
+func updateEpAddrToNodeNameMap(ipToNodeName map[string]string, addresses []core.EndpointAddress) {
+ for n := range addresses {
+ if addresses[n].NodeName == nil {
+ continue
+ }
+ ipToNodeName[addresses[n].IP] = *addresses[n].NodeName
+ }
+}
+
+// Build a map across all subsets of IP -> NodeName
+func buildEndpointAddressNodeNameMap(subsets []core.EndpointSubset) map[string]string {
+ ipToNodeName := make(map[string]string)
+ for i := range subsets {
+ updateEpAddrToNodeNameMap(ipToNodeName, subsets[i].Addresses)
+ updateEpAddrToNodeNameMap(ipToNodeName, subsets[i].NotReadyAddresses)
+ }
+ return ipToNodeName
+}
+
+func validateEpAddrNodeNameTransition(addr *core.EndpointAddress, ipToNodeName map[string]string, fldPath *field.Path) field.ErrorList {
+ errList := field.ErrorList{}
+ existingNodeName, found := ipToNodeName[addr.IP]
+ if !found {
+ return errList
+ }
+ if addr.NodeName == nil || *addr.NodeName == existingNodeName {
+ return errList
+ }
+ // NodeName entry found for this endpoint IP, but user is attempting to change NodeName
+ return append(errList, field.Forbidden(fldPath, fmt.Sprintf("Cannot change NodeName for %s to %s", addr.IP, *addr.NodeName)))
+}
+
+// ValidateEndpoints tests if required fields are set.
+func ValidateEndpoints(endpoints *core.Endpoints) field.ErrorList {
+ allErrs := ValidateObjectMeta(&endpoints.ObjectMeta, true, ValidateEndpointsName, field.NewPath("metadata"))
+ allErrs = append(allErrs, ValidateEndpointsSpecificAnnotations(endpoints.Annotations, field.NewPath("annotations"))...)
+ allErrs = append(allErrs, validateEndpointSubsets(endpoints.Subsets, []core.EndpointSubset{}, field.NewPath("subsets"))...)
+ return allErrs
+}
+
+func validateEndpointSubsets(subsets []core.EndpointSubset, oldSubsets []core.EndpointSubset, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ ipToNodeName := buildEndpointAddressNodeNameMap(oldSubsets)
+ for i := range subsets {
+ ss := &subsets[i]
+ idxPath := fldPath.Index(i)
+
+ // EndpointSubsets must include endpoint address. For headless service, we allow its endpoints not to have ports.
+ if len(ss.Addresses) == 0 && len(ss.NotReadyAddresses) == 0 {
+ //TODO: consider adding a RequiredOneOf() error for this and similar cases
+ allErrs = append(allErrs, field.Required(idxPath, "must specify `addresses` or `notReadyAddresses`"))
+ }
+ for addr := range ss.Addresses {
+ allErrs = append(allErrs, validateEndpointAddress(&ss.Addresses[addr], idxPath.Child("addresses").Index(addr), ipToNodeName)...)
+ }
+ for addr := range ss.NotReadyAddresses {
+ allErrs = append(allErrs, validateEndpointAddress(&ss.NotReadyAddresses[addr], idxPath.Child("notReadyAddresses").Index(addr), ipToNodeName)...)
+ }
+ for port := range ss.Ports {
+ allErrs = append(allErrs, validateEndpointPort(&ss.Ports[port], len(ss.Ports) > 1, idxPath.Child("ports").Index(port))...)
+ }
+ }
+
+ return allErrs
+}
+
+func validateEndpointAddress(address *core.EndpointAddress, fldPath *field.Path, ipToNodeName map[string]string) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for _, msg := range validation.IsValidIP(address.IP) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("ip"), address.IP, msg))
+ }
+ if len(address.Hostname) > 0 {
+ allErrs = append(allErrs, ValidateDNS1123Label(address.Hostname, fldPath.Child("hostname"))...)
+ }
+ // During endpoint update, verify that NodeName is a DNS subdomain and transition rules allow the update
+ if address.NodeName != nil {
+ for _, msg := range ValidateNodeName(*address.NodeName, false) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("nodeName"), *address.NodeName, msg))
+ }
+ }
+ allErrs = append(allErrs, validateEpAddrNodeNameTransition(address, ipToNodeName, fldPath.Child("nodeName"))...)
+ if len(allErrs) > 0 {
+ return allErrs
+ }
+ allErrs = append(allErrs, validateNonSpecialIP(address.IP, fldPath.Child("ip"))...)
+ return allErrs
+}
+
+func validateNonSpecialIP(ipAddress string, fldPath *field.Path) field.ErrorList {
+ // We disallow some IPs as endpoints or external-ips. Specifically,
+ // unspecified and loopback addresses are nonsensical and link-local
+ // addresses tend to be used for node-centric purposes (e.g. metadata
+ // service).
+ allErrs := field.ErrorList{}
+ ip := net.ParseIP(ipAddress)
+ if ip == nil {
+ allErrs = append(allErrs, field.Invalid(fldPath, ipAddress, "must be a valid IP address"))
+ return allErrs
+ }
+ if ip.IsUnspecified() {
+ allErrs = append(allErrs, field.Invalid(fldPath, ipAddress, "may not be unspecified (0.0.0.0)"))
+ }
+ if ip.IsLoopback() {
+ allErrs = append(allErrs, field.Invalid(fldPath, ipAddress, "may not be in the loopback range (127.0.0.0/8)"))
+ }
+ if ip.IsLinkLocalUnicast() {
+ allErrs = append(allErrs, field.Invalid(fldPath, ipAddress, "may not be in the link-local range (169.254.0.0/16)"))
+ }
+ if ip.IsLinkLocalMulticast() {
+ allErrs = append(allErrs, field.Invalid(fldPath, ipAddress, "may not be in the link-local multicast range (224.0.0.0/24)"))
+ }
+ return allErrs
+}
+
+func validateEndpointPort(port *core.EndpointPort, requireName bool, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if requireName && len(port.Name) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("name"), ""))
+ } else if len(port.Name) != 0 {
+ allErrs = append(allErrs, ValidateDNS1123Label(port.Name, fldPath.Child("name"))...)
+ }
+ for _, msg := range validation.IsValidPortNum(int(port.Port)) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("port"), port.Port, msg))
+ }
+ if len(port.Protocol) == 0 {
+ allErrs = append(allErrs, field.Required(fldPath.Child("protocol"), ""))
+ } else if !supportedPortProtocols.Has(string(port.Protocol)) {
+ allErrs = append(allErrs, field.NotSupported(fldPath.Child("protocol"), port.Protocol, supportedPortProtocols.List()))
+ }
+ return allErrs
+}
+
+// ValidateEndpointsUpdate tests to make sure an endpoints update can be applied.
+func ValidateEndpointsUpdate(newEndpoints, oldEndpoints *core.Endpoints) field.ErrorList {
+ allErrs := ValidateObjectMetaUpdate(&newEndpoints.ObjectMeta, &oldEndpoints.ObjectMeta, field.NewPath("metadata"))
+ allErrs = append(allErrs, validateEndpointSubsets(newEndpoints.Subsets, oldEndpoints.Subsets, field.NewPath("subsets"))...)
+ allErrs = append(allErrs, ValidateEndpointsSpecificAnnotations(newEndpoints.Annotations, field.NewPath("annotations"))...)
+ return allErrs
+}
+
+// ValidateSecurityContext ensure the security context contains valid settings
+func ValidateSecurityContext(sc *core.SecurityContext, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ //this should only be true for testing since SecurityContext is defaulted by the core
+ if sc == nil {
+ return allErrs
+ }
+
+ if sc.Privileged != nil {
+ if *sc.Privileged && !capabilities.Get().AllowPrivileged {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("privileged"), "disallowed by cluster policy"))
+ }
+ }
+
+ if sc.RunAsUser != nil {
+ for _, msg := range validation.IsValidUserID(*sc.RunAsUser) {
+ allErrs = append(allErrs, field.Invalid(fldPath.Child("runAsUser"), *sc.RunAsUser, msg))
+ }
+ }
+
+ if sc.AllowPrivilegeEscalation != nil && !*sc.AllowPrivilegeEscalation {
+ if sc.Privileged != nil && *sc.Privileged {
+ allErrs = append(allErrs, field.Invalid(fldPath, sc, "cannot set `allowPrivilegeEscalation` to false and `privileged` to true"))
+ }
+
+ if sc.Capabilities != nil {
+ for _, cap := range sc.Capabilities.Add {
+ if string(cap) == "CAP_SYS_ADMIN" {
+ allErrs = append(allErrs, field.Invalid(fldPath, sc, "cannot set `allowPrivilegeEscalation` to false and `capabilities.Add` CAP_SYS_ADMIN"))
+ }
+ }
+ }
+ }
+
+ return allErrs
+}
+
+func ValidatePodLogOptions(opts *core.PodLogOptions) field.ErrorList {
+ allErrs := field.ErrorList{}
+ if opts.TailLines != nil && *opts.TailLines < 0 {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("tailLines"), *opts.TailLines, isNegativeErrorMsg))
+ }
+ if opts.LimitBytes != nil && *opts.LimitBytes < 1 {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("limitBytes"), *opts.LimitBytes, "must be greater than 0"))
+ }
+ switch {
+ case opts.SinceSeconds != nil && opts.SinceTime != nil:
+ allErrs = append(allErrs, field.Forbidden(field.NewPath(""), "at most one of `sinceTime` or `sinceSeconds` may be specified"))
+ case opts.SinceSeconds != nil:
+ if *opts.SinceSeconds < 1 {
+ allErrs = append(allErrs, field.Invalid(field.NewPath("sinceSeconds"), *opts.SinceSeconds, "must be greater than 0"))
+ }
+ }
+ return allErrs
+}
+
+// ValidateLoadBalancerStatus validates required fields on a LoadBalancerStatus
+func ValidateLoadBalancerStatus(status *core.LoadBalancerStatus, fldPath *field.Path) field.ErrorList {
+ allErrs := field.ErrorList{}
+ for i, ingress := range status.Ingress {
+ idxPath := fldPath.Child("ingress").Index(i)
+ if len(ingress.IP) > 0 {
+ if isIP := (net.ParseIP(ingress.IP) != nil); !isIP {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("ip"), ingress.IP, "must be a valid IP address"))
+ }
+ }
+ if len(ingress.Hostname) > 0 {
+ for _, msg := range validation.IsDNS1123Subdomain(ingress.Hostname) {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("hostname"), ingress.Hostname, msg))
+ }
+ if isIP := (net.ParseIP(ingress.Hostname) != nil); isIP {
+ allErrs = append(allErrs, field.Invalid(idxPath.Child("hostname"), ingress.Hostname, "must be a DNS name, not an IP address"))
+ }
+ }
+ }
+ return allErrs
+}
+
+func sysctlIntersection(a []core.Sysctl, b []core.Sysctl) []string {
+ lookup := make(map[string]struct{}, len(a))
+ result := []string{}
+ for i := range a {
+ lookup[a[i].Name] = struct{}{}
+ }
+ for i := range b {
+ if _, found := lookup[b[i].Name]; found {
+ result = append(result, b[i].Name)
+ }
+ }
+ return result
+}
+
+// validateStorageNodeAffinityAnnotation tests that the serialized TopologyConstraints in PersistentVolume.Annotations has valid data
+func validateStorageNodeAffinityAnnotation(annotations map[string]string, fldPath *field.Path) (bool, field.ErrorList) {
+ allErrs := field.ErrorList{}
+
+ na, err := helper.GetStorageNodeAffinityFromAnnotation(annotations)
+ if err != nil {
+ allErrs = append(allErrs, field.Invalid(fldPath, core.AlphaStorageNodeAffinityAnnotation, err.Error()))
+ return false, allErrs
+ }
+ if na == nil {
+ return false, allErrs
+ }
+
+ if !utilfeature.DefaultFeatureGate.Enabled(features.VolumeScheduling) {
+ allErrs = append(allErrs, field.Forbidden(fldPath, "Storage node affinity is disabled by feature-gate"))
+ }
+
+ policySpecified := false
+ if na.RequiredDuringSchedulingIgnoredDuringExecution != nil {
+ allErrs = append(allErrs, ValidateNodeSelector(na.RequiredDuringSchedulingIgnoredDuringExecution, fldPath.Child("requiredDuringSchedulingIgnoredDuringExecution"))...)
+ policySpecified = true
+ }
+
+ if len(na.PreferredDuringSchedulingIgnoredDuringExecution) > 0 {
+ allErrs = append(allErrs, field.Forbidden(fldPath.Child("preferredDuringSchedulingIgnoredDuringExection"), "Storage node affinity does not support preferredDuringSchedulingIgnoredDuringExecution"))
+ }
+ return policySpecified, allErrs
+}
+
+// validateVolumeNodeAffinity tests that the PersistentVolume.NodeAffinity has valid data
+// returns:
+// - true if volumeNodeAffinity is set
+// - errorList if there are validation errors
+func validateVolumeNodeAffinity(nodeAffinity *core.VolumeNodeAffinity, fldPath *field.Path) (bool, field.ErrorList) {
+ allErrs := field.ErrorList{}
+
+ if nodeAffinity == nil {
+ return false, allErrs
+ }
+
+ if !utilfeature.DefaultFeatureGate.Enabled(features.VolumeScheduling) {
+ allErrs = append(allErrs, field.Forbidden(fldPath, "Volume node affinity is disabled by feature-gate"))
+ }
+
+ if nodeAffinity.Required != nil {
+ allErrs = append(allErrs, ValidateNodeSelector(nodeAffinity.Required, fldPath.Child("required"))...)
+ } else {
+ allErrs = append(allErrs, field.Required(fldPath.Child("required"), "must specify required node constraints"))
+ }
+
+ return true, allErrs
+}
+
+// ValidateCIDR validates whether a CIDR matches the conventions expected by net.ParseCIDR
+func ValidateCIDR(cidr string) (*net.IPNet, error) {
+ _, net, err := net.ParseCIDR(cidr)
+ if err != nil {
+ return nil, err
+ }
+ return net, nil
+}
+
+func IsDecremented(update, old *int32) bool {
+ if update == nil && old != nil {
+ return true
+ }
+ if update == nil || old == nil {
+ return false
+ }
+ return *update < *old
+}
diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go
new file mode 100644
index 000000000..f0aa3b426
--- /dev/null
+++ b/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go
@@ -0,0 +1,5952 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright 2018 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.
+*/
+
+// Code generated by deepcopy-gen. DO NOT EDIT.
+
+package core
+
+import (
+ v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ runtime "k8s.io/apimachinery/pkg/runtime"
+ types "k8s.io/apimachinery/pkg/types"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AWSElasticBlockStoreVolumeSource) DeepCopyInto(out *AWSElasticBlockStoreVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSElasticBlockStoreVolumeSource.
+func (in *AWSElasticBlockStoreVolumeSource) DeepCopy() *AWSElasticBlockStoreVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(AWSElasticBlockStoreVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Affinity) DeepCopyInto(out *Affinity) {
+ *out = *in
+ if in.NodeAffinity != nil {
+ in, out := &in.NodeAffinity, &out.NodeAffinity
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(NodeAffinity)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.PodAffinity != nil {
+ in, out := &in.PodAffinity, &out.PodAffinity
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(PodAffinity)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.PodAntiAffinity != nil {
+ in, out := &in.PodAntiAffinity, &out.PodAntiAffinity
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(PodAntiAffinity)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Affinity.
+func (in *Affinity) DeepCopy() *Affinity {
+ if in == nil {
+ return nil
+ }
+ out := new(Affinity)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AttachedVolume) DeepCopyInto(out *AttachedVolume) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AttachedVolume.
+func (in *AttachedVolume) DeepCopy() *AttachedVolume {
+ if in == nil {
+ return nil
+ }
+ out := new(AttachedVolume)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AvoidPods) DeepCopyInto(out *AvoidPods) {
+ *out = *in
+ if in.PreferAvoidPods != nil {
+ in, out := &in.PreferAvoidPods, &out.PreferAvoidPods
+ *out = make([]PreferAvoidPodsEntry, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AvoidPods.
+func (in *AvoidPods) DeepCopy() *AvoidPods {
+ if in == nil {
+ return nil
+ }
+ out := new(AvoidPods)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AzureDiskVolumeSource) DeepCopyInto(out *AzureDiskVolumeSource) {
+ *out = *in
+ if in.CachingMode != nil {
+ in, out := &in.CachingMode, &out.CachingMode
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(AzureDataDiskCachingMode)
+ **out = **in
+ }
+ }
+ if in.FSType != nil {
+ in, out := &in.FSType, &out.FSType
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(string)
+ **out = **in
+ }
+ }
+ if in.ReadOnly != nil {
+ in, out := &in.ReadOnly, &out.ReadOnly
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ if in.Kind != nil {
+ in, out := &in.Kind, &out.Kind
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(AzureDataDiskKind)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureDiskVolumeSource.
+func (in *AzureDiskVolumeSource) DeepCopy() *AzureDiskVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(AzureDiskVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AzureFilePersistentVolumeSource) DeepCopyInto(out *AzureFilePersistentVolumeSource) {
+ *out = *in
+ if in.SecretNamespace != nil {
+ in, out := &in.SecretNamespace, &out.SecretNamespace
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(string)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureFilePersistentVolumeSource.
+func (in *AzureFilePersistentVolumeSource) DeepCopy() *AzureFilePersistentVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(AzureFilePersistentVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AzureFileVolumeSource) DeepCopyInto(out *AzureFileVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureFileVolumeSource.
+func (in *AzureFileVolumeSource) DeepCopy() *AzureFileVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(AzureFileVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Binding) DeepCopyInto(out *Binding) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ out.Target = in.Target
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Binding.
+func (in *Binding) DeepCopy() *Binding {
+ if in == nil {
+ return nil
+ }
+ out := new(Binding)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Binding) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *CSIPersistentVolumeSource) DeepCopyInto(out *CSIPersistentVolumeSource) {
+ *out = *in
+ if in.VolumeAttributes != nil {
+ in, out := &in.VolumeAttributes, &out.VolumeAttributes
+ *out = make(map[string]string, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val
+ }
+ }
+ if in.ControllerPublishSecretRef != nil {
+ in, out := &in.ControllerPublishSecretRef, &out.ControllerPublishSecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SecretReference)
+ **out = **in
+ }
+ }
+ if in.NodeStageSecretRef != nil {
+ in, out := &in.NodeStageSecretRef, &out.NodeStageSecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SecretReference)
+ **out = **in
+ }
+ }
+ if in.NodePublishSecretRef != nil {
+ in, out := &in.NodePublishSecretRef, &out.NodePublishSecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SecretReference)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSIPersistentVolumeSource.
+func (in *CSIPersistentVolumeSource) DeepCopy() *CSIPersistentVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(CSIPersistentVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Capabilities) DeepCopyInto(out *Capabilities) {
+ *out = *in
+ if in.Add != nil {
+ in, out := &in.Add, &out.Add
+ *out = make([]Capability, len(*in))
+ copy(*out, *in)
+ }
+ if in.Drop != nil {
+ in, out := &in.Drop, &out.Drop
+ *out = make([]Capability, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Capabilities.
+func (in *Capabilities) DeepCopy() *Capabilities {
+ if in == nil {
+ return nil
+ }
+ out := new(Capabilities)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *CephFSPersistentVolumeSource) DeepCopyInto(out *CephFSPersistentVolumeSource) {
+ *out = *in
+ if in.Monitors != nil {
+ in, out := &in.Monitors, &out.Monitors
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ if in.SecretRef != nil {
+ in, out := &in.SecretRef, &out.SecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SecretReference)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CephFSPersistentVolumeSource.
+func (in *CephFSPersistentVolumeSource) DeepCopy() *CephFSPersistentVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(CephFSPersistentVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *CephFSVolumeSource) DeepCopyInto(out *CephFSVolumeSource) {
+ *out = *in
+ if in.Monitors != nil {
+ in, out := &in.Monitors, &out.Monitors
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ if in.SecretRef != nil {
+ in, out := &in.SecretRef, &out.SecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(LocalObjectReference)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CephFSVolumeSource.
+func (in *CephFSVolumeSource) DeepCopy() *CephFSVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(CephFSVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *CinderVolumeSource) DeepCopyInto(out *CinderVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CinderVolumeSource.
+func (in *CinderVolumeSource) DeepCopy() *CinderVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(CinderVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ClientIPConfig) DeepCopyInto(out *ClientIPConfig) {
+ *out = *in
+ if in.TimeoutSeconds != nil {
+ in, out := &in.TimeoutSeconds, &out.TimeoutSeconds
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int32)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClientIPConfig.
+func (in *ClientIPConfig) DeepCopy() *ClientIPConfig {
+ if in == nil {
+ return nil
+ }
+ out := new(ClientIPConfig)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ComponentCondition) DeepCopyInto(out *ComponentCondition) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentCondition.
+func (in *ComponentCondition) DeepCopy() *ComponentCondition {
+ if in == nil {
+ return nil
+ }
+ out := new(ComponentCondition)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ComponentStatus) DeepCopyInto(out *ComponentStatus) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ if in.Conditions != nil {
+ in, out := &in.Conditions, &out.Conditions
+ *out = make([]ComponentCondition, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentStatus.
+func (in *ComponentStatus) DeepCopy() *ComponentStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(ComponentStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ComponentStatus) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ComponentStatusList) DeepCopyInto(out *ComponentStatusList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]ComponentStatus, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentStatusList.
+func (in *ComponentStatusList) DeepCopy() *ComponentStatusList {
+ if in == nil {
+ return nil
+ }
+ out := new(ComponentStatusList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ComponentStatusList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ConfigMap) DeepCopyInto(out *ConfigMap) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ if in.Data != nil {
+ in, out := &in.Data, &out.Data
+ *out = make(map[string]string, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val
+ }
+ }
+ if in.BinaryData != nil {
+ in, out := &in.BinaryData, &out.BinaryData
+ *out = make(map[string][]byte, len(*in))
+ for key, val := range *in {
+ if val == nil {
+ (*out)[key] = nil
+ } else {
+ (*out)[key] = make([]byte, len(val))
+ copy((*out)[key], val)
+ }
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMap.
+func (in *ConfigMap) DeepCopy() *ConfigMap {
+ if in == nil {
+ return nil
+ }
+ out := new(ConfigMap)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ConfigMap) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ConfigMapEnvSource) DeepCopyInto(out *ConfigMapEnvSource) {
+ *out = *in
+ out.LocalObjectReference = in.LocalObjectReference
+ if in.Optional != nil {
+ in, out := &in.Optional, &out.Optional
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMapEnvSource.
+func (in *ConfigMapEnvSource) DeepCopy() *ConfigMapEnvSource {
+ if in == nil {
+ return nil
+ }
+ out := new(ConfigMapEnvSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ConfigMapKeySelector) DeepCopyInto(out *ConfigMapKeySelector) {
+ *out = *in
+ out.LocalObjectReference = in.LocalObjectReference
+ if in.Optional != nil {
+ in, out := &in.Optional, &out.Optional
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMapKeySelector.
+func (in *ConfigMapKeySelector) DeepCopy() *ConfigMapKeySelector {
+ if in == nil {
+ return nil
+ }
+ out := new(ConfigMapKeySelector)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ConfigMapList) DeepCopyInto(out *ConfigMapList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]ConfigMap, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMapList.
+func (in *ConfigMapList) DeepCopy() *ConfigMapList {
+ if in == nil {
+ return nil
+ }
+ out := new(ConfigMapList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ConfigMapList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ConfigMapProjection) DeepCopyInto(out *ConfigMapProjection) {
+ *out = *in
+ out.LocalObjectReference = in.LocalObjectReference
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]KeyToPath, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.Optional != nil {
+ in, out := &in.Optional, &out.Optional
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMapProjection.
+func (in *ConfigMapProjection) DeepCopy() *ConfigMapProjection {
+ if in == nil {
+ return nil
+ }
+ out := new(ConfigMapProjection)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ConfigMapVolumeSource) DeepCopyInto(out *ConfigMapVolumeSource) {
+ *out = *in
+ out.LocalObjectReference = in.LocalObjectReference
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]KeyToPath, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.DefaultMode != nil {
+ in, out := &in.DefaultMode, &out.DefaultMode
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int32)
+ **out = **in
+ }
+ }
+ if in.Optional != nil {
+ in, out := &in.Optional, &out.Optional
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMapVolumeSource.
+func (in *ConfigMapVolumeSource) DeepCopy() *ConfigMapVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(ConfigMapVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Container) DeepCopyInto(out *Container) {
+ *out = *in
+ if in.Command != nil {
+ in, out := &in.Command, &out.Command
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ if in.Args != nil {
+ in, out := &in.Args, &out.Args
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ if in.Ports != nil {
+ in, out := &in.Ports, &out.Ports
+ *out = make([]ContainerPort, len(*in))
+ copy(*out, *in)
+ }
+ if in.EnvFrom != nil {
+ in, out := &in.EnvFrom, &out.EnvFrom
+ *out = make([]EnvFromSource, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.Env != nil {
+ in, out := &in.Env, &out.Env
+ *out = make([]EnvVar, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ in.Resources.DeepCopyInto(&out.Resources)
+ if in.VolumeMounts != nil {
+ in, out := &in.VolumeMounts, &out.VolumeMounts
+ *out = make([]VolumeMount, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.VolumeDevices != nil {
+ in, out := &in.VolumeDevices, &out.VolumeDevices
+ *out = make([]VolumeDevice, len(*in))
+ copy(*out, *in)
+ }
+ if in.LivenessProbe != nil {
+ in, out := &in.LivenessProbe, &out.LivenessProbe
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(Probe)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.ReadinessProbe != nil {
+ in, out := &in.ReadinessProbe, &out.ReadinessProbe
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(Probe)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Lifecycle != nil {
+ in, out := &in.Lifecycle, &out.Lifecycle
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(Lifecycle)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.SecurityContext != nil {
+ in, out := &in.SecurityContext, &out.SecurityContext
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SecurityContext)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Container.
+func (in *Container) DeepCopy() *Container {
+ if in == nil {
+ return nil
+ }
+ out := new(Container)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ContainerImage) DeepCopyInto(out *ContainerImage) {
+ *out = *in
+ if in.Names != nil {
+ in, out := &in.Names, &out.Names
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerImage.
+func (in *ContainerImage) DeepCopy() *ContainerImage {
+ if in == nil {
+ return nil
+ }
+ out := new(ContainerImage)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ContainerPort) DeepCopyInto(out *ContainerPort) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerPort.
+func (in *ContainerPort) DeepCopy() *ContainerPort {
+ if in == nil {
+ return nil
+ }
+ out := new(ContainerPort)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ContainerState) DeepCopyInto(out *ContainerState) {
+ *out = *in
+ if in.Waiting != nil {
+ in, out := &in.Waiting, &out.Waiting
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ContainerStateWaiting)
+ **out = **in
+ }
+ }
+ if in.Running != nil {
+ in, out := &in.Running, &out.Running
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ContainerStateRunning)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Terminated != nil {
+ in, out := &in.Terminated, &out.Terminated
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ContainerStateTerminated)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerState.
+func (in *ContainerState) DeepCopy() *ContainerState {
+ if in == nil {
+ return nil
+ }
+ out := new(ContainerState)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ContainerStateRunning) DeepCopyInto(out *ContainerStateRunning) {
+ *out = *in
+ in.StartedAt.DeepCopyInto(&out.StartedAt)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerStateRunning.
+func (in *ContainerStateRunning) DeepCopy() *ContainerStateRunning {
+ if in == nil {
+ return nil
+ }
+ out := new(ContainerStateRunning)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ContainerStateTerminated) DeepCopyInto(out *ContainerStateTerminated) {
+ *out = *in
+ in.StartedAt.DeepCopyInto(&out.StartedAt)
+ in.FinishedAt.DeepCopyInto(&out.FinishedAt)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerStateTerminated.
+func (in *ContainerStateTerminated) DeepCopy() *ContainerStateTerminated {
+ if in == nil {
+ return nil
+ }
+ out := new(ContainerStateTerminated)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ContainerStateWaiting) DeepCopyInto(out *ContainerStateWaiting) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerStateWaiting.
+func (in *ContainerStateWaiting) DeepCopy() *ContainerStateWaiting {
+ if in == nil {
+ return nil
+ }
+ out := new(ContainerStateWaiting)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ContainerStatus) DeepCopyInto(out *ContainerStatus) {
+ *out = *in
+ in.State.DeepCopyInto(&out.State)
+ in.LastTerminationState.DeepCopyInto(&out.LastTerminationState)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerStatus.
+func (in *ContainerStatus) DeepCopy() *ContainerStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(ContainerStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *DaemonEndpoint) DeepCopyInto(out *DaemonEndpoint) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DaemonEndpoint.
+func (in *DaemonEndpoint) DeepCopy() *DaemonEndpoint {
+ if in == nil {
+ return nil
+ }
+ out := new(DaemonEndpoint)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *DeleteOptions) DeepCopyInto(out *DeleteOptions) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ if in.GracePeriodSeconds != nil {
+ in, out := &in.GracePeriodSeconds, &out.GracePeriodSeconds
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int64)
+ **out = **in
+ }
+ }
+ if in.Preconditions != nil {
+ in, out := &in.Preconditions, &out.Preconditions
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(Preconditions)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.OrphanDependents != nil {
+ in, out := &in.OrphanDependents, &out.OrphanDependents
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ if in.PropagationPolicy != nil {
+ in, out := &in.PropagationPolicy, &out.PropagationPolicy
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(DeletionPropagation)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeleteOptions.
+func (in *DeleteOptions) DeepCopy() *DeleteOptions {
+ if in == nil {
+ return nil
+ }
+ out := new(DeleteOptions)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *DeleteOptions) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *DownwardAPIProjection) DeepCopyInto(out *DownwardAPIProjection) {
+ *out = *in
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]DownwardAPIVolumeFile, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DownwardAPIProjection.
+func (in *DownwardAPIProjection) DeepCopy() *DownwardAPIProjection {
+ if in == nil {
+ return nil
+ }
+ out := new(DownwardAPIProjection)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *DownwardAPIVolumeFile) DeepCopyInto(out *DownwardAPIVolumeFile) {
+ *out = *in
+ if in.FieldRef != nil {
+ in, out := &in.FieldRef, &out.FieldRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ObjectFieldSelector)
+ **out = **in
+ }
+ }
+ if in.ResourceFieldRef != nil {
+ in, out := &in.ResourceFieldRef, &out.ResourceFieldRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ResourceFieldSelector)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Mode != nil {
+ in, out := &in.Mode, &out.Mode
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int32)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DownwardAPIVolumeFile.
+func (in *DownwardAPIVolumeFile) DeepCopy() *DownwardAPIVolumeFile {
+ if in == nil {
+ return nil
+ }
+ out := new(DownwardAPIVolumeFile)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *DownwardAPIVolumeSource) DeepCopyInto(out *DownwardAPIVolumeSource) {
+ *out = *in
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]DownwardAPIVolumeFile, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.DefaultMode != nil {
+ in, out := &in.DefaultMode, &out.DefaultMode
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int32)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DownwardAPIVolumeSource.
+func (in *DownwardAPIVolumeSource) DeepCopy() *DownwardAPIVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(DownwardAPIVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EmptyDirVolumeSource) DeepCopyInto(out *EmptyDirVolumeSource) {
+ *out = *in
+ if in.SizeLimit != nil {
+ in, out := &in.SizeLimit, &out.SizeLimit
+ if *in == nil {
+ *out = nil
+ } else {
+ x := (*in).DeepCopy()
+ *out = &x
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EmptyDirVolumeSource.
+func (in *EmptyDirVolumeSource) DeepCopy() *EmptyDirVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(EmptyDirVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EndpointAddress) DeepCopyInto(out *EndpointAddress) {
+ *out = *in
+ if in.NodeName != nil {
+ in, out := &in.NodeName, &out.NodeName
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(string)
+ **out = **in
+ }
+ }
+ if in.TargetRef != nil {
+ in, out := &in.TargetRef, &out.TargetRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ObjectReference)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointAddress.
+func (in *EndpointAddress) DeepCopy() *EndpointAddress {
+ if in == nil {
+ return nil
+ }
+ out := new(EndpointAddress)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EndpointPort) DeepCopyInto(out *EndpointPort) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointPort.
+func (in *EndpointPort) DeepCopy() *EndpointPort {
+ if in == nil {
+ return nil
+ }
+ out := new(EndpointPort)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EndpointSubset) DeepCopyInto(out *EndpointSubset) {
+ *out = *in
+ if in.Addresses != nil {
+ in, out := &in.Addresses, &out.Addresses
+ *out = make([]EndpointAddress, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.NotReadyAddresses != nil {
+ in, out := &in.NotReadyAddresses, &out.NotReadyAddresses
+ *out = make([]EndpointAddress, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.Ports != nil {
+ in, out := &in.Ports, &out.Ports
+ *out = make([]EndpointPort, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointSubset.
+func (in *EndpointSubset) DeepCopy() *EndpointSubset {
+ if in == nil {
+ return nil
+ }
+ out := new(EndpointSubset)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Endpoints) DeepCopyInto(out *Endpoints) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ if in.Subsets != nil {
+ in, out := &in.Subsets, &out.Subsets
+ *out = make([]EndpointSubset, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Endpoints.
+func (in *Endpoints) DeepCopy() *Endpoints {
+ if in == nil {
+ return nil
+ }
+ out := new(Endpoints)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Endpoints) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EndpointsList) DeepCopyInto(out *EndpointsList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]Endpoints, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointsList.
+func (in *EndpointsList) DeepCopy() *EndpointsList {
+ if in == nil {
+ return nil
+ }
+ out := new(EndpointsList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *EndpointsList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EnvFromSource) DeepCopyInto(out *EnvFromSource) {
+ *out = *in
+ if in.ConfigMapRef != nil {
+ in, out := &in.ConfigMapRef, &out.ConfigMapRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ConfigMapEnvSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.SecretRef != nil {
+ in, out := &in.SecretRef, &out.SecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SecretEnvSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvFromSource.
+func (in *EnvFromSource) DeepCopy() *EnvFromSource {
+ if in == nil {
+ return nil
+ }
+ out := new(EnvFromSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EnvVar) DeepCopyInto(out *EnvVar) {
+ *out = *in
+ if in.ValueFrom != nil {
+ in, out := &in.ValueFrom, &out.ValueFrom
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(EnvVarSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvVar.
+func (in *EnvVar) DeepCopy() *EnvVar {
+ if in == nil {
+ return nil
+ }
+ out := new(EnvVar)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EnvVarSource) DeepCopyInto(out *EnvVarSource) {
+ *out = *in
+ if in.FieldRef != nil {
+ in, out := &in.FieldRef, &out.FieldRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ObjectFieldSelector)
+ **out = **in
+ }
+ }
+ if in.ResourceFieldRef != nil {
+ in, out := &in.ResourceFieldRef, &out.ResourceFieldRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ResourceFieldSelector)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.ConfigMapKeyRef != nil {
+ in, out := &in.ConfigMapKeyRef, &out.ConfigMapKeyRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ConfigMapKeySelector)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.SecretKeyRef != nil {
+ in, out := &in.SecretKeyRef, &out.SecretKeyRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SecretKeySelector)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvVarSource.
+func (in *EnvVarSource) DeepCopy() *EnvVarSource {
+ if in == nil {
+ return nil
+ }
+ out := new(EnvVarSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Event) DeepCopyInto(out *Event) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ out.InvolvedObject = in.InvolvedObject
+ out.Source = in.Source
+ in.FirstTimestamp.DeepCopyInto(&out.FirstTimestamp)
+ in.LastTimestamp.DeepCopyInto(&out.LastTimestamp)
+ in.EventTime.DeepCopyInto(&out.EventTime)
+ if in.Series != nil {
+ in, out := &in.Series, &out.Series
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(EventSeries)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Related != nil {
+ in, out := &in.Related, &out.Related
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ObjectReference)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Event.
+func (in *Event) DeepCopy() *Event {
+ if in == nil {
+ return nil
+ }
+ out := new(Event)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Event) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EventList) DeepCopyInto(out *EventList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]Event, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventList.
+func (in *EventList) DeepCopy() *EventList {
+ if in == nil {
+ return nil
+ }
+ out := new(EventList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *EventList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EventSeries) DeepCopyInto(out *EventSeries) {
+ *out = *in
+ in.LastObservedTime.DeepCopyInto(&out.LastObservedTime)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventSeries.
+func (in *EventSeries) DeepCopy() *EventSeries {
+ if in == nil {
+ return nil
+ }
+ out := new(EventSeries)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EventSource) DeepCopyInto(out *EventSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventSource.
+func (in *EventSource) DeepCopy() *EventSource {
+ if in == nil {
+ return nil
+ }
+ out := new(EventSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ExecAction) DeepCopyInto(out *ExecAction) {
+ *out = *in
+ if in.Command != nil {
+ in, out := &in.Command, &out.Command
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExecAction.
+func (in *ExecAction) DeepCopy() *ExecAction {
+ if in == nil {
+ return nil
+ }
+ out := new(ExecAction)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *FCVolumeSource) DeepCopyInto(out *FCVolumeSource) {
+ *out = *in
+ if in.TargetWWNs != nil {
+ in, out := &in.TargetWWNs, &out.TargetWWNs
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ if in.Lun != nil {
+ in, out := &in.Lun, &out.Lun
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int32)
+ **out = **in
+ }
+ }
+ if in.WWIDs != nil {
+ in, out := &in.WWIDs, &out.WWIDs
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FCVolumeSource.
+func (in *FCVolumeSource) DeepCopy() *FCVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(FCVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *FlexPersistentVolumeSource) DeepCopyInto(out *FlexPersistentVolumeSource) {
+ *out = *in
+ if in.SecretRef != nil {
+ in, out := &in.SecretRef, &out.SecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SecretReference)
+ **out = **in
+ }
+ }
+ if in.Options != nil {
+ in, out := &in.Options, &out.Options
+ *out = make(map[string]string, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FlexPersistentVolumeSource.
+func (in *FlexPersistentVolumeSource) DeepCopy() *FlexPersistentVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(FlexPersistentVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *FlexVolumeSource) DeepCopyInto(out *FlexVolumeSource) {
+ *out = *in
+ if in.SecretRef != nil {
+ in, out := &in.SecretRef, &out.SecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(LocalObjectReference)
+ **out = **in
+ }
+ }
+ if in.Options != nil {
+ in, out := &in.Options, &out.Options
+ *out = make(map[string]string, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FlexVolumeSource.
+func (in *FlexVolumeSource) DeepCopy() *FlexVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(FlexVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *FlockerVolumeSource) DeepCopyInto(out *FlockerVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FlockerVolumeSource.
+func (in *FlockerVolumeSource) DeepCopy() *FlockerVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(FlockerVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *GCEPersistentDiskVolumeSource) DeepCopyInto(out *GCEPersistentDiskVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCEPersistentDiskVolumeSource.
+func (in *GCEPersistentDiskVolumeSource) DeepCopy() *GCEPersistentDiskVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(GCEPersistentDiskVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *GitRepoVolumeSource) DeepCopyInto(out *GitRepoVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitRepoVolumeSource.
+func (in *GitRepoVolumeSource) DeepCopy() *GitRepoVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(GitRepoVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *GlusterfsVolumeSource) DeepCopyInto(out *GlusterfsVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GlusterfsVolumeSource.
+func (in *GlusterfsVolumeSource) DeepCopy() *GlusterfsVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(GlusterfsVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *HTTPGetAction) DeepCopyInto(out *HTTPGetAction) {
+ *out = *in
+ out.Port = in.Port
+ if in.HTTPHeaders != nil {
+ in, out := &in.HTTPHeaders, &out.HTTPHeaders
+ *out = make([]HTTPHeader, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPGetAction.
+func (in *HTTPGetAction) DeepCopy() *HTTPGetAction {
+ if in == nil {
+ return nil
+ }
+ out := new(HTTPGetAction)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *HTTPHeader) DeepCopyInto(out *HTTPHeader) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPHeader.
+func (in *HTTPHeader) DeepCopy() *HTTPHeader {
+ if in == nil {
+ return nil
+ }
+ out := new(HTTPHeader)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Handler) DeepCopyInto(out *Handler) {
+ *out = *in
+ if in.Exec != nil {
+ in, out := &in.Exec, &out.Exec
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ExecAction)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.HTTPGet != nil {
+ in, out := &in.HTTPGet, &out.HTTPGet
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(HTTPGetAction)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.TCPSocket != nil {
+ in, out := &in.TCPSocket, &out.TCPSocket
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(TCPSocketAction)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Handler.
+func (in *Handler) DeepCopy() *Handler {
+ if in == nil {
+ return nil
+ }
+ out := new(Handler)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *HostAlias) DeepCopyInto(out *HostAlias) {
+ *out = *in
+ if in.Hostnames != nil {
+ in, out := &in.Hostnames, &out.Hostnames
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HostAlias.
+func (in *HostAlias) DeepCopy() *HostAlias {
+ if in == nil {
+ return nil
+ }
+ out := new(HostAlias)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *HostPathVolumeSource) DeepCopyInto(out *HostPathVolumeSource) {
+ *out = *in
+ if in.Type != nil {
+ in, out := &in.Type, &out.Type
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(HostPathType)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HostPathVolumeSource.
+func (in *HostPathVolumeSource) DeepCopy() *HostPathVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(HostPathVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ISCSIPersistentVolumeSource) DeepCopyInto(out *ISCSIPersistentVolumeSource) {
+ *out = *in
+ if in.Portals != nil {
+ in, out := &in.Portals, &out.Portals
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ if in.SecretRef != nil {
+ in, out := &in.SecretRef, &out.SecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SecretReference)
+ **out = **in
+ }
+ }
+ if in.InitiatorName != nil {
+ in, out := &in.InitiatorName, &out.InitiatorName
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(string)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ISCSIPersistentVolumeSource.
+func (in *ISCSIPersistentVolumeSource) DeepCopy() *ISCSIPersistentVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(ISCSIPersistentVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ISCSIVolumeSource) DeepCopyInto(out *ISCSIVolumeSource) {
+ *out = *in
+ if in.Portals != nil {
+ in, out := &in.Portals, &out.Portals
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ if in.SecretRef != nil {
+ in, out := &in.SecretRef, &out.SecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(LocalObjectReference)
+ **out = **in
+ }
+ }
+ if in.InitiatorName != nil {
+ in, out := &in.InitiatorName, &out.InitiatorName
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(string)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ISCSIVolumeSource.
+func (in *ISCSIVolumeSource) DeepCopy() *ISCSIVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(ISCSIVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *KeyToPath) DeepCopyInto(out *KeyToPath) {
+ *out = *in
+ if in.Mode != nil {
+ in, out := &in.Mode, &out.Mode
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int32)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KeyToPath.
+func (in *KeyToPath) DeepCopy() *KeyToPath {
+ if in == nil {
+ return nil
+ }
+ out := new(KeyToPath)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Lifecycle) DeepCopyInto(out *Lifecycle) {
+ *out = *in
+ if in.PostStart != nil {
+ in, out := &in.PostStart, &out.PostStart
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(Handler)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.PreStop != nil {
+ in, out := &in.PreStop, &out.PreStop
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(Handler)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Lifecycle.
+func (in *Lifecycle) DeepCopy() *Lifecycle {
+ if in == nil {
+ return nil
+ }
+ out := new(Lifecycle)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LimitRange) DeepCopyInto(out *LimitRange) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LimitRange.
+func (in *LimitRange) DeepCopy() *LimitRange {
+ if in == nil {
+ return nil
+ }
+ out := new(LimitRange)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *LimitRange) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LimitRangeItem) DeepCopyInto(out *LimitRangeItem) {
+ *out = *in
+ if in.Max != nil {
+ in, out := &in.Max, &out.Max
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ if in.Min != nil {
+ in, out := &in.Min, &out.Min
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ if in.Default != nil {
+ in, out := &in.Default, &out.Default
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ if in.DefaultRequest != nil {
+ in, out := &in.DefaultRequest, &out.DefaultRequest
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ if in.MaxLimitRequestRatio != nil {
+ in, out := &in.MaxLimitRequestRatio, &out.MaxLimitRequestRatio
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LimitRangeItem.
+func (in *LimitRangeItem) DeepCopy() *LimitRangeItem {
+ if in == nil {
+ return nil
+ }
+ out := new(LimitRangeItem)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LimitRangeList) DeepCopyInto(out *LimitRangeList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]LimitRange, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LimitRangeList.
+func (in *LimitRangeList) DeepCopy() *LimitRangeList {
+ if in == nil {
+ return nil
+ }
+ out := new(LimitRangeList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *LimitRangeList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LimitRangeSpec) DeepCopyInto(out *LimitRangeSpec) {
+ *out = *in
+ if in.Limits != nil {
+ in, out := &in.Limits, &out.Limits
+ *out = make([]LimitRangeItem, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LimitRangeSpec.
+func (in *LimitRangeSpec) DeepCopy() *LimitRangeSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(LimitRangeSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *List) DeepCopyInto(out *List) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]runtime.Object, len(*in))
+ for i := range *in {
+ if (*in)[i] == nil {
+ (*out)[i] = nil
+ } else {
+ (*out)[i] = (*in)[i].DeepCopyObject()
+ }
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new List.
+func (in *List) DeepCopy() *List {
+ if in == nil {
+ return nil
+ }
+ out := new(List)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *List) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ListOptions) DeepCopyInto(out *ListOptions) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ if in.LabelSelector == nil {
+ out.LabelSelector = nil
+ } else {
+ out.LabelSelector = in.LabelSelector.DeepCopySelector()
+ }
+ if in.FieldSelector == nil {
+ out.FieldSelector = nil
+ } else {
+ out.FieldSelector = in.FieldSelector.DeepCopySelector()
+ }
+ if in.TimeoutSeconds != nil {
+ in, out := &in.TimeoutSeconds, &out.TimeoutSeconds
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int64)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ListOptions.
+func (in *ListOptions) DeepCopy() *ListOptions {
+ if in == nil {
+ return nil
+ }
+ out := new(ListOptions)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ListOptions) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LoadBalancerIngress) DeepCopyInto(out *LoadBalancerIngress) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoadBalancerIngress.
+func (in *LoadBalancerIngress) DeepCopy() *LoadBalancerIngress {
+ if in == nil {
+ return nil
+ }
+ out := new(LoadBalancerIngress)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LoadBalancerStatus) DeepCopyInto(out *LoadBalancerStatus) {
+ *out = *in
+ if in.Ingress != nil {
+ in, out := &in.Ingress, &out.Ingress
+ *out = make([]LoadBalancerIngress, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoadBalancerStatus.
+func (in *LoadBalancerStatus) DeepCopy() *LoadBalancerStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(LoadBalancerStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LocalObjectReference) DeepCopyInto(out *LocalObjectReference) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LocalObjectReference.
+func (in *LocalObjectReference) DeepCopy() *LocalObjectReference {
+ if in == nil {
+ return nil
+ }
+ out := new(LocalObjectReference)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LocalVolumeSource) DeepCopyInto(out *LocalVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LocalVolumeSource.
+func (in *LocalVolumeSource) DeepCopy() *LocalVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(LocalVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NFSVolumeSource) DeepCopyInto(out *NFSVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NFSVolumeSource.
+func (in *NFSVolumeSource) DeepCopy() *NFSVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(NFSVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Namespace) DeepCopyInto(out *Namespace) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+ out.Status = in.Status
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Namespace.
+func (in *Namespace) DeepCopy() *Namespace {
+ if in == nil {
+ return nil
+ }
+ out := new(Namespace)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Namespace) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NamespaceList) DeepCopyInto(out *NamespaceList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]Namespace, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamespaceList.
+func (in *NamespaceList) DeepCopy() *NamespaceList {
+ if in == nil {
+ return nil
+ }
+ out := new(NamespaceList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *NamespaceList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NamespaceSpec) DeepCopyInto(out *NamespaceSpec) {
+ *out = *in
+ if in.Finalizers != nil {
+ in, out := &in.Finalizers, &out.Finalizers
+ *out = make([]FinalizerName, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamespaceSpec.
+func (in *NamespaceSpec) DeepCopy() *NamespaceSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(NamespaceSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NamespaceStatus) DeepCopyInto(out *NamespaceStatus) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamespaceStatus.
+func (in *NamespaceStatus) DeepCopy() *NamespaceStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(NamespaceStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Node) DeepCopyInto(out *Node) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+ in.Status.DeepCopyInto(&out.Status)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Node.
+func (in *Node) DeepCopy() *Node {
+ if in == nil {
+ return nil
+ }
+ out := new(Node)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Node) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeAddress) DeepCopyInto(out *NodeAddress) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeAddress.
+func (in *NodeAddress) DeepCopy() *NodeAddress {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeAddress)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeAffinity) DeepCopyInto(out *NodeAffinity) {
+ *out = *in
+ if in.RequiredDuringSchedulingIgnoredDuringExecution != nil {
+ in, out := &in.RequiredDuringSchedulingIgnoredDuringExecution, &out.RequiredDuringSchedulingIgnoredDuringExecution
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(NodeSelector)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.PreferredDuringSchedulingIgnoredDuringExecution != nil {
+ in, out := &in.PreferredDuringSchedulingIgnoredDuringExecution, &out.PreferredDuringSchedulingIgnoredDuringExecution
+ *out = make([]PreferredSchedulingTerm, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeAffinity.
+func (in *NodeAffinity) DeepCopy() *NodeAffinity {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeAffinity)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeCondition) DeepCopyInto(out *NodeCondition) {
+ *out = *in
+ in.LastHeartbeatTime.DeepCopyInto(&out.LastHeartbeatTime)
+ in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeCondition.
+func (in *NodeCondition) DeepCopy() *NodeCondition {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeCondition)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeConfigSource) DeepCopyInto(out *NodeConfigSource) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ if in.ConfigMapRef != nil {
+ in, out := &in.ConfigMapRef, &out.ConfigMapRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ObjectReference)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeConfigSource.
+func (in *NodeConfigSource) DeepCopy() *NodeConfigSource {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeConfigSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *NodeConfigSource) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeDaemonEndpoints) DeepCopyInto(out *NodeDaemonEndpoints) {
+ *out = *in
+ out.KubeletEndpoint = in.KubeletEndpoint
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeDaemonEndpoints.
+func (in *NodeDaemonEndpoints) DeepCopy() *NodeDaemonEndpoints {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeDaemonEndpoints)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeList) DeepCopyInto(out *NodeList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]Node, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeList.
+func (in *NodeList) DeepCopy() *NodeList {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *NodeList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeProxyOptions) DeepCopyInto(out *NodeProxyOptions) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeProxyOptions.
+func (in *NodeProxyOptions) DeepCopy() *NodeProxyOptions {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeProxyOptions)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *NodeProxyOptions) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeResources) DeepCopyInto(out *NodeResources) {
+ *out = *in
+ if in.Capacity != nil {
+ in, out := &in.Capacity, &out.Capacity
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeResources.
+func (in *NodeResources) DeepCopy() *NodeResources {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeResources)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeSelector) DeepCopyInto(out *NodeSelector) {
+ *out = *in
+ if in.NodeSelectorTerms != nil {
+ in, out := &in.NodeSelectorTerms, &out.NodeSelectorTerms
+ *out = make([]NodeSelectorTerm, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeSelector.
+func (in *NodeSelector) DeepCopy() *NodeSelector {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeSelector)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeSelectorRequirement) DeepCopyInto(out *NodeSelectorRequirement) {
+ *out = *in
+ if in.Values != nil {
+ in, out := &in.Values, &out.Values
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeSelectorRequirement.
+func (in *NodeSelectorRequirement) DeepCopy() *NodeSelectorRequirement {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeSelectorRequirement)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeSelectorTerm) DeepCopyInto(out *NodeSelectorTerm) {
+ *out = *in
+ if in.MatchExpressions != nil {
+ in, out := &in.MatchExpressions, &out.MatchExpressions
+ *out = make([]NodeSelectorRequirement, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeSelectorTerm.
+func (in *NodeSelectorTerm) DeepCopy() *NodeSelectorTerm {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeSelectorTerm)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeSpec) DeepCopyInto(out *NodeSpec) {
+ *out = *in
+ if in.Taints != nil {
+ in, out := &in.Taints, &out.Taints
+ *out = make([]Taint, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.ConfigSource != nil {
+ in, out := &in.ConfigSource, &out.ConfigSource
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(NodeConfigSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeSpec.
+func (in *NodeSpec) DeepCopy() *NodeSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeStatus) DeepCopyInto(out *NodeStatus) {
+ *out = *in
+ if in.Capacity != nil {
+ in, out := &in.Capacity, &out.Capacity
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ if in.Allocatable != nil {
+ in, out := &in.Allocatable, &out.Allocatable
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ if in.Conditions != nil {
+ in, out := &in.Conditions, &out.Conditions
+ *out = make([]NodeCondition, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.Addresses != nil {
+ in, out := &in.Addresses, &out.Addresses
+ *out = make([]NodeAddress, len(*in))
+ copy(*out, *in)
+ }
+ out.DaemonEndpoints = in.DaemonEndpoints
+ out.NodeInfo = in.NodeInfo
+ if in.Images != nil {
+ in, out := &in.Images, &out.Images
+ *out = make([]ContainerImage, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.VolumesInUse != nil {
+ in, out := &in.VolumesInUse, &out.VolumesInUse
+ *out = make([]UniqueVolumeName, len(*in))
+ copy(*out, *in)
+ }
+ if in.VolumesAttached != nil {
+ in, out := &in.VolumesAttached, &out.VolumesAttached
+ *out = make([]AttachedVolume, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeStatus.
+func (in *NodeStatus) DeepCopy() *NodeStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *NodeSystemInfo) DeepCopyInto(out *NodeSystemInfo) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeSystemInfo.
+func (in *NodeSystemInfo) DeepCopy() *NodeSystemInfo {
+ if in == nil {
+ return nil
+ }
+ out := new(NodeSystemInfo)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ObjectFieldSelector) DeepCopyInto(out *ObjectFieldSelector) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectFieldSelector.
+func (in *ObjectFieldSelector) DeepCopy() *ObjectFieldSelector {
+ if in == nil {
+ return nil
+ }
+ out := new(ObjectFieldSelector)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ObjectMeta) DeepCopyInto(out *ObjectMeta) {
+ *out = *in
+ in.CreationTimestamp.DeepCopyInto(&out.CreationTimestamp)
+ if in.DeletionTimestamp != nil {
+ in, out := &in.DeletionTimestamp, &out.DeletionTimestamp
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = (*in).DeepCopy()
+ }
+ }
+ if in.DeletionGracePeriodSeconds != nil {
+ in, out := &in.DeletionGracePeriodSeconds, &out.DeletionGracePeriodSeconds
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int64)
+ **out = **in
+ }
+ }
+ if in.Labels != nil {
+ in, out := &in.Labels, &out.Labels
+ *out = make(map[string]string, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val
+ }
+ }
+ if in.Annotations != nil {
+ in, out := &in.Annotations, &out.Annotations
+ *out = make(map[string]string, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val
+ }
+ }
+ if in.OwnerReferences != nil {
+ in, out := &in.OwnerReferences, &out.OwnerReferences
+ *out = make([]v1.OwnerReference, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.Initializers != nil {
+ in, out := &in.Initializers, &out.Initializers
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(v1.Initializers)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Finalizers != nil {
+ in, out := &in.Finalizers, &out.Finalizers
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectMeta.
+func (in *ObjectMeta) DeepCopy() *ObjectMeta {
+ if in == nil {
+ return nil
+ }
+ out := new(ObjectMeta)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ObjectReference) DeepCopyInto(out *ObjectReference) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectReference.
+func (in *ObjectReference) DeepCopy() *ObjectReference {
+ if in == nil {
+ return nil
+ }
+ out := new(ObjectReference)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ObjectReference) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PersistentVolume) DeepCopyInto(out *PersistentVolume) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+ out.Status = in.Status
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolume.
+func (in *PersistentVolume) DeepCopy() *PersistentVolume {
+ if in == nil {
+ return nil
+ }
+ out := new(PersistentVolume)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PersistentVolume) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PersistentVolumeClaim) DeepCopyInto(out *PersistentVolumeClaim) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+ in.Status.DeepCopyInto(&out.Status)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeClaim.
+func (in *PersistentVolumeClaim) DeepCopy() *PersistentVolumeClaim {
+ if in == nil {
+ return nil
+ }
+ out := new(PersistentVolumeClaim)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PersistentVolumeClaim) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PersistentVolumeClaimCondition) DeepCopyInto(out *PersistentVolumeClaimCondition) {
+ *out = *in
+ in.LastProbeTime.DeepCopyInto(&out.LastProbeTime)
+ in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeClaimCondition.
+func (in *PersistentVolumeClaimCondition) DeepCopy() *PersistentVolumeClaimCondition {
+ if in == nil {
+ return nil
+ }
+ out := new(PersistentVolumeClaimCondition)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PersistentVolumeClaimList) DeepCopyInto(out *PersistentVolumeClaimList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]PersistentVolumeClaim, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeClaimList.
+func (in *PersistentVolumeClaimList) DeepCopy() *PersistentVolumeClaimList {
+ if in == nil {
+ return nil
+ }
+ out := new(PersistentVolumeClaimList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PersistentVolumeClaimList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PersistentVolumeClaimSpec) DeepCopyInto(out *PersistentVolumeClaimSpec) {
+ *out = *in
+ if in.AccessModes != nil {
+ in, out := &in.AccessModes, &out.AccessModes
+ *out = make([]PersistentVolumeAccessMode, len(*in))
+ copy(*out, *in)
+ }
+ if in.Selector != nil {
+ in, out := &in.Selector, &out.Selector
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(v1.LabelSelector)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ in.Resources.DeepCopyInto(&out.Resources)
+ if in.StorageClassName != nil {
+ in, out := &in.StorageClassName, &out.StorageClassName
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(string)
+ **out = **in
+ }
+ }
+ if in.VolumeMode != nil {
+ in, out := &in.VolumeMode, &out.VolumeMode
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(PersistentVolumeMode)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeClaimSpec.
+func (in *PersistentVolumeClaimSpec) DeepCopy() *PersistentVolumeClaimSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(PersistentVolumeClaimSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PersistentVolumeClaimStatus) DeepCopyInto(out *PersistentVolumeClaimStatus) {
+ *out = *in
+ if in.AccessModes != nil {
+ in, out := &in.AccessModes, &out.AccessModes
+ *out = make([]PersistentVolumeAccessMode, len(*in))
+ copy(*out, *in)
+ }
+ if in.Capacity != nil {
+ in, out := &in.Capacity, &out.Capacity
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ if in.Conditions != nil {
+ in, out := &in.Conditions, &out.Conditions
+ *out = make([]PersistentVolumeClaimCondition, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeClaimStatus.
+func (in *PersistentVolumeClaimStatus) DeepCopy() *PersistentVolumeClaimStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(PersistentVolumeClaimStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PersistentVolumeClaimVolumeSource) DeepCopyInto(out *PersistentVolumeClaimVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeClaimVolumeSource.
+func (in *PersistentVolumeClaimVolumeSource) DeepCopy() *PersistentVolumeClaimVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(PersistentVolumeClaimVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PersistentVolumeList) DeepCopyInto(out *PersistentVolumeList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]PersistentVolume, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeList.
+func (in *PersistentVolumeList) DeepCopy() *PersistentVolumeList {
+ if in == nil {
+ return nil
+ }
+ out := new(PersistentVolumeList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PersistentVolumeList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PersistentVolumeSource) DeepCopyInto(out *PersistentVolumeSource) {
+ *out = *in
+ if in.GCEPersistentDisk != nil {
+ in, out := &in.GCEPersistentDisk, &out.GCEPersistentDisk
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(GCEPersistentDiskVolumeSource)
+ **out = **in
+ }
+ }
+ if in.AWSElasticBlockStore != nil {
+ in, out := &in.AWSElasticBlockStore, &out.AWSElasticBlockStore
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(AWSElasticBlockStoreVolumeSource)
+ **out = **in
+ }
+ }
+ if in.HostPath != nil {
+ in, out := &in.HostPath, &out.HostPath
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(HostPathVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Glusterfs != nil {
+ in, out := &in.Glusterfs, &out.Glusterfs
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(GlusterfsVolumeSource)
+ **out = **in
+ }
+ }
+ if in.NFS != nil {
+ in, out := &in.NFS, &out.NFS
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(NFSVolumeSource)
+ **out = **in
+ }
+ }
+ if in.RBD != nil {
+ in, out := &in.RBD, &out.RBD
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(RBDPersistentVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Quobyte != nil {
+ in, out := &in.Quobyte, &out.Quobyte
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(QuobyteVolumeSource)
+ **out = **in
+ }
+ }
+ if in.ISCSI != nil {
+ in, out := &in.ISCSI, &out.ISCSI
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ISCSIPersistentVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.FlexVolume != nil {
+ in, out := &in.FlexVolume, &out.FlexVolume
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(FlexPersistentVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Cinder != nil {
+ in, out := &in.Cinder, &out.Cinder
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(CinderVolumeSource)
+ **out = **in
+ }
+ }
+ if in.CephFS != nil {
+ in, out := &in.CephFS, &out.CephFS
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(CephFSPersistentVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.FC != nil {
+ in, out := &in.FC, &out.FC
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(FCVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Flocker != nil {
+ in, out := &in.Flocker, &out.Flocker
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(FlockerVolumeSource)
+ **out = **in
+ }
+ }
+ if in.AzureFile != nil {
+ in, out := &in.AzureFile, &out.AzureFile
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(AzureFilePersistentVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.VsphereVolume != nil {
+ in, out := &in.VsphereVolume, &out.VsphereVolume
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(VsphereVirtualDiskVolumeSource)
+ **out = **in
+ }
+ }
+ if in.AzureDisk != nil {
+ in, out := &in.AzureDisk, &out.AzureDisk
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(AzureDiskVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.PhotonPersistentDisk != nil {
+ in, out := &in.PhotonPersistentDisk, &out.PhotonPersistentDisk
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(PhotonPersistentDiskVolumeSource)
+ **out = **in
+ }
+ }
+ if in.PortworxVolume != nil {
+ in, out := &in.PortworxVolume, &out.PortworxVolume
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(PortworxVolumeSource)
+ **out = **in
+ }
+ }
+ if in.ScaleIO != nil {
+ in, out := &in.ScaleIO, &out.ScaleIO
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ScaleIOPersistentVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Local != nil {
+ in, out := &in.Local, &out.Local
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(LocalVolumeSource)
+ **out = **in
+ }
+ }
+ if in.StorageOS != nil {
+ in, out := &in.StorageOS, &out.StorageOS
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(StorageOSPersistentVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.CSI != nil {
+ in, out := &in.CSI, &out.CSI
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(CSIPersistentVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeSource.
+func (in *PersistentVolumeSource) DeepCopy() *PersistentVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(PersistentVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PersistentVolumeSpec) DeepCopyInto(out *PersistentVolumeSpec) {
+ *out = *in
+ if in.Capacity != nil {
+ in, out := &in.Capacity, &out.Capacity
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ in.PersistentVolumeSource.DeepCopyInto(&out.PersistentVolumeSource)
+ if in.AccessModes != nil {
+ in, out := &in.AccessModes, &out.AccessModes
+ *out = make([]PersistentVolumeAccessMode, len(*in))
+ copy(*out, *in)
+ }
+ if in.ClaimRef != nil {
+ in, out := &in.ClaimRef, &out.ClaimRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ObjectReference)
+ **out = **in
+ }
+ }
+ if in.MountOptions != nil {
+ in, out := &in.MountOptions, &out.MountOptions
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ if in.VolumeMode != nil {
+ in, out := &in.VolumeMode, &out.VolumeMode
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(PersistentVolumeMode)
+ **out = **in
+ }
+ }
+ if in.NodeAffinity != nil {
+ in, out := &in.NodeAffinity, &out.NodeAffinity
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(VolumeNodeAffinity)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeSpec.
+func (in *PersistentVolumeSpec) DeepCopy() *PersistentVolumeSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(PersistentVolumeSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PersistentVolumeStatus) DeepCopyInto(out *PersistentVolumeStatus) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeStatus.
+func (in *PersistentVolumeStatus) DeepCopy() *PersistentVolumeStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(PersistentVolumeStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PhotonPersistentDiskVolumeSource) DeepCopyInto(out *PhotonPersistentDiskVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PhotonPersistentDiskVolumeSource.
+func (in *PhotonPersistentDiskVolumeSource) DeepCopy() *PhotonPersistentDiskVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(PhotonPersistentDiskVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Pod) DeepCopyInto(out *Pod) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+ in.Status.DeepCopyInto(&out.Status)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Pod.
+func (in *Pod) DeepCopy() *Pod {
+ if in == nil {
+ return nil
+ }
+ out := new(Pod)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Pod) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodAffinity) DeepCopyInto(out *PodAffinity) {
+ *out = *in
+ if in.RequiredDuringSchedulingIgnoredDuringExecution != nil {
+ in, out := &in.RequiredDuringSchedulingIgnoredDuringExecution, &out.RequiredDuringSchedulingIgnoredDuringExecution
+ *out = make([]PodAffinityTerm, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.PreferredDuringSchedulingIgnoredDuringExecution != nil {
+ in, out := &in.PreferredDuringSchedulingIgnoredDuringExecution, &out.PreferredDuringSchedulingIgnoredDuringExecution
+ *out = make([]WeightedPodAffinityTerm, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodAffinity.
+func (in *PodAffinity) DeepCopy() *PodAffinity {
+ if in == nil {
+ return nil
+ }
+ out := new(PodAffinity)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodAffinityTerm) DeepCopyInto(out *PodAffinityTerm) {
+ *out = *in
+ if in.LabelSelector != nil {
+ in, out := &in.LabelSelector, &out.LabelSelector
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(v1.LabelSelector)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Namespaces != nil {
+ in, out := &in.Namespaces, &out.Namespaces
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodAffinityTerm.
+func (in *PodAffinityTerm) DeepCopy() *PodAffinityTerm {
+ if in == nil {
+ return nil
+ }
+ out := new(PodAffinityTerm)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodAntiAffinity) DeepCopyInto(out *PodAntiAffinity) {
+ *out = *in
+ if in.RequiredDuringSchedulingIgnoredDuringExecution != nil {
+ in, out := &in.RequiredDuringSchedulingIgnoredDuringExecution, &out.RequiredDuringSchedulingIgnoredDuringExecution
+ *out = make([]PodAffinityTerm, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.PreferredDuringSchedulingIgnoredDuringExecution != nil {
+ in, out := &in.PreferredDuringSchedulingIgnoredDuringExecution, &out.PreferredDuringSchedulingIgnoredDuringExecution
+ *out = make([]WeightedPodAffinityTerm, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodAntiAffinity.
+func (in *PodAntiAffinity) DeepCopy() *PodAntiAffinity {
+ if in == nil {
+ return nil
+ }
+ out := new(PodAntiAffinity)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodAttachOptions) DeepCopyInto(out *PodAttachOptions) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodAttachOptions.
+func (in *PodAttachOptions) DeepCopy() *PodAttachOptions {
+ if in == nil {
+ return nil
+ }
+ out := new(PodAttachOptions)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PodAttachOptions) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodCondition) DeepCopyInto(out *PodCondition) {
+ *out = *in
+ in.LastProbeTime.DeepCopyInto(&out.LastProbeTime)
+ in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodCondition.
+func (in *PodCondition) DeepCopy() *PodCondition {
+ if in == nil {
+ return nil
+ }
+ out := new(PodCondition)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodDNSConfig) DeepCopyInto(out *PodDNSConfig) {
+ *out = *in
+ if in.Nameservers != nil {
+ in, out := &in.Nameservers, &out.Nameservers
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ if in.Searches != nil {
+ in, out := &in.Searches, &out.Searches
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ if in.Options != nil {
+ in, out := &in.Options, &out.Options
+ *out = make([]PodDNSConfigOption, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodDNSConfig.
+func (in *PodDNSConfig) DeepCopy() *PodDNSConfig {
+ if in == nil {
+ return nil
+ }
+ out := new(PodDNSConfig)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodDNSConfigOption) DeepCopyInto(out *PodDNSConfigOption) {
+ *out = *in
+ if in.Value != nil {
+ in, out := &in.Value, &out.Value
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(string)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodDNSConfigOption.
+func (in *PodDNSConfigOption) DeepCopy() *PodDNSConfigOption {
+ if in == nil {
+ return nil
+ }
+ out := new(PodDNSConfigOption)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodExecOptions) DeepCopyInto(out *PodExecOptions) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ if in.Command != nil {
+ in, out := &in.Command, &out.Command
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodExecOptions.
+func (in *PodExecOptions) DeepCopy() *PodExecOptions {
+ if in == nil {
+ return nil
+ }
+ out := new(PodExecOptions)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PodExecOptions) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodList) DeepCopyInto(out *PodList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]Pod, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodList.
+func (in *PodList) DeepCopy() *PodList {
+ if in == nil {
+ return nil
+ }
+ out := new(PodList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PodList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodLogOptions) DeepCopyInto(out *PodLogOptions) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ if in.SinceSeconds != nil {
+ in, out := &in.SinceSeconds, &out.SinceSeconds
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int64)
+ **out = **in
+ }
+ }
+ if in.SinceTime != nil {
+ in, out := &in.SinceTime, &out.SinceTime
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = (*in).DeepCopy()
+ }
+ }
+ if in.TailLines != nil {
+ in, out := &in.TailLines, &out.TailLines
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int64)
+ **out = **in
+ }
+ }
+ if in.LimitBytes != nil {
+ in, out := &in.LimitBytes, &out.LimitBytes
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int64)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodLogOptions.
+func (in *PodLogOptions) DeepCopy() *PodLogOptions {
+ if in == nil {
+ return nil
+ }
+ out := new(PodLogOptions)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PodLogOptions) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodPortForwardOptions) DeepCopyInto(out *PodPortForwardOptions) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ if in.Ports != nil {
+ in, out := &in.Ports, &out.Ports
+ *out = make([]int32, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodPortForwardOptions.
+func (in *PodPortForwardOptions) DeepCopy() *PodPortForwardOptions {
+ if in == nil {
+ return nil
+ }
+ out := new(PodPortForwardOptions)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PodPortForwardOptions) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodProxyOptions) DeepCopyInto(out *PodProxyOptions) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodProxyOptions.
+func (in *PodProxyOptions) DeepCopy() *PodProxyOptions {
+ if in == nil {
+ return nil
+ }
+ out := new(PodProxyOptions)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PodProxyOptions) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodSecurityContext) DeepCopyInto(out *PodSecurityContext) {
+ *out = *in
+ if in.ShareProcessNamespace != nil {
+ in, out := &in.ShareProcessNamespace, &out.ShareProcessNamespace
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ if in.SELinuxOptions != nil {
+ in, out := &in.SELinuxOptions, &out.SELinuxOptions
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SELinuxOptions)
+ **out = **in
+ }
+ }
+ if in.RunAsUser != nil {
+ in, out := &in.RunAsUser, &out.RunAsUser
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int64)
+ **out = **in
+ }
+ }
+ if in.RunAsNonRoot != nil {
+ in, out := &in.RunAsNonRoot, &out.RunAsNonRoot
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ if in.SupplementalGroups != nil {
+ in, out := &in.SupplementalGroups, &out.SupplementalGroups
+ *out = make([]int64, len(*in))
+ copy(*out, *in)
+ }
+ if in.FSGroup != nil {
+ in, out := &in.FSGroup, &out.FSGroup
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int64)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodSecurityContext.
+func (in *PodSecurityContext) DeepCopy() *PodSecurityContext {
+ if in == nil {
+ return nil
+ }
+ out := new(PodSecurityContext)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodSignature) DeepCopyInto(out *PodSignature) {
+ *out = *in
+ if in.PodController != nil {
+ in, out := &in.PodController, &out.PodController
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(v1.OwnerReference)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodSignature.
+func (in *PodSignature) DeepCopy() *PodSignature {
+ if in == nil {
+ return nil
+ }
+ out := new(PodSignature)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodSpec) DeepCopyInto(out *PodSpec) {
+ *out = *in
+ if in.Volumes != nil {
+ in, out := &in.Volumes, &out.Volumes
+ *out = make([]Volume, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.InitContainers != nil {
+ in, out := &in.InitContainers, &out.InitContainers
+ *out = make([]Container, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.Containers != nil {
+ in, out := &in.Containers, &out.Containers
+ *out = make([]Container, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.TerminationGracePeriodSeconds != nil {
+ in, out := &in.TerminationGracePeriodSeconds, &out.TerminationGracePeriodSeconds
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int64)
+ **out = **in
+ }
+ }
+ if in.ActiveDeadlineSeconds != nil {
+ in, out := &in.ActiveDeadlineSeconds, &out.ActiveDeadlineSeconds
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int64)
+ **out = **in
+ }
+ }
+ if in.NodeSelector != nil {
+ in, out := &in.NodeSelector, &out.NodeSelector
+ *out = make(map[string]string, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val
+ }
+ }
+ if in.AutomountServiceAccountToken != nil {
+ in, out := &in.AutomountServiceAccountToken, &out.AutomountServiceAccountToken
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ if in.SecurityContext != nil {
+ in, out := &in.SecurityContext, &out.SecurityContext
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(PodSecurityContext)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.ImagePullSecrets != nil {
+ in, out := &in.ImagePullSecrets, &out.ImagePullSecrets
+ *out = make([]LocalObjectReference, len(*in))
+ copy(*out, *in)
+ }
+ if in.Affinity != nil {
+ in, out := &in.Affinity, &out.Affinity
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(Affinity)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Tolerations != nil {
+ in, out := &in.Tolerations, &out.Tolerations
+ *out = make([]Toleration, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.HostAliases != nil {
+ in, out := &in.HostAliases, &out.HostAliases
+ *out = make([]HostAlias, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.Priority != nil {
+ in, out := &in.Priority, &out.Priority
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int32)
+ **out = **in
+ }
+ }
+ if in.DNSConfig != nil {
+ in, out := &in.DNSConfig, &out.DNSConfig
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(PodDNSConfig)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodSpec.
+func (in *PodSpec) DeepCopy() *PodSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(PodSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodStatus) DeepCopyInto(out *PodStatus) {
+ *out = *in
+ if in.Conditions != nil {
+ in, out := &in.Conditions, &out.Conditions
+ *out = make([]PodCondition, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.StartTime != nil {
+ in, out := &in.StartTime, &out.StartTime
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = (*in).DeepCopy()
+ }
+ }
+ if in.InitContainerStatuses != nil {
+ in, out := &in.InitContainerStatuses, &out.InitContainerStatuses
+ *out = make([]ContainerStatus, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.ContainerStatuses != nil {
+ in, out := &in.ContainerStatuses, &out.ContainerStatuses
+ *out = make([]ContainerStatus, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodStatus.
+func (in *PodStatus) DeepCopy() *PodStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(PodStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodStatusResult) DeepCopyInto(out *PodStatusResult) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Status.DeepCopyInto(&out.Status)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodStatusResult.
+func (in *PodStatusResult) DeepCopy() *PodStatusResult {
+ if in == nil {
+ return nil
+ }
+ out := new(PodStatusResult)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PodStatusResult) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodTemplate) DeepCopyInto(out *PodTemplate) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Template.DeepCopyInto(&out.Template)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodTemplate.
+func (in *PodTemplate) DeepCopy() *PodTemplate {
+ if in == nil {
+ return nil
+ }
+ out := new(PodTemplate)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PodTemplate) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodTemplateList) DeepCopyInto(out *PodTemplateList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]PodTemplate, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodTemplateList.
+func (in *PodTemplateList) DeepCopy() *PodTemplateList {
+ if in == nil {
+ return nil
+ }
+ out := new(PodTemplateList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PodTemplateList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PodTemplateSpec) DeepCopyInto(out *PodTemplateSpec) {
+ *out = *in
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodTemplateSpec.
+func (in *PodTemplateSpec) DeepCopy() *PodTemplateSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(PodTemplateSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PortworxVolumeSource) DeepCopyInto(out *PortworxVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PortworxVolumeSource.
+func (in *PortworxVolumeSource) DeepCopy() *PortworxVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(PortworxVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Preconditions) DeepCopyInto(out *Preconditions) {
+ *out = *in
+ if in.UID != nil {
+ in, out := &in.UID, &out.UID
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(types.UID)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Preconditions.
+func (in *Preconditions) DeepCopy() *Preconditions {
+ if in == nil {
+ return nil
+ }
+ out := new(Preconditions)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PreferAvoidPodsEntry) DeepCopyInto(out *PreferAvoidPodsEntry) {
+ *out = *in
+ in.PodSignature.DeepCopyInto(&out.PodSignature)
+ in.EvictionTime.DeepCopyInto(&out.EvictionTime)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PreferAvoidPodsEntry.
+func (in *PreferAvoidPodsEntry) DeepCopy() *PreferAvoidPodsEntry {
+ if in == nil {
+ return nil
+ }
+ out := new(PreferAvoidPodsEntry)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PreferredSchedulingTerm) DeepCopyInto(out *PreferredSchedulingTerm) {
+ *out = *in
+ in.Preference.DeepCopyInto(&out.Preference)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PreferredSchedulingTerm.
+func (in *PreferredSchedulingTerm) DeepCopy() *PreferredSchedulingTerm {
+ if in == nil {
+ return nil
+ }
+ out := new(PreferredSchedulingTerm)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Probe) DeepCopyInto(out *Probe) {
+ *out = *in
+ in.Handler.DeepCopyInto(&out.Handler)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Probe.
+func (in *Probe) DeepCopy() *Probe {
+ if in == nil {
+ return nil
+ }
+ out := new(Probe)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ProjectedVolumeSource) DeepCopyInto(out *ProjectedVolumeSource) {
+ *out = *in
+ if in.Sources != nil {
+ in, out := &in.Sources, &out.Sources
+ *out = make([]VolumeProjection, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.DefaultMode != nil {
+ in, out := &in.DefaultMode, &out.DefaultMode
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int32)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectedVolumeSource.
+func (in *ProjectedVolumeSource) DeepCopy() *ProjectedVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(ProjectedVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *QuobyteVolumeSource) DeepCopyInto(out *QuobyteVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QuobyteVolumeSource.
+func (in *QuobyteVolumeSource) DeepCopy() *QuobyteVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(QuobyteVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *RBDPersistentVolumeSource) DeepCopyInto(out *RBDPersistentVolumeSource) {
+ *out = *in
+ if in.CephMonitors != nil {
+ in, out := &in.CephMonitors, &out.CephMonitors
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ if in.SecretRef != nil {
+ in, out := &in.SecretRef, &out.SecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SecretReference)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RBDPersistentVolumeSource.
+func (in *RBDPersistentVolumeSource) DeepCopy() *RBDPersistentVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(RBDPersistentVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *RBDVolumeSource) DeepCopyInto(out *RBDVolumeSource) {
+ *out = *in
+ if in.CephMonitors != nil {
+ in, out := &in.CephMonitors, &out.CephMonitors
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ if in.SecretRef != nil {
+ in, out := &in.SecretRef, &out.SecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(LocalObjectReference)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RBDVolumeSource.
+func (in *RBDVolumeSource) DeepCopy() *RBDVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(RBDVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *RangeAllocation) DeepCopyInto(out *RangeAllocation) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ if in.Data != nil {
+ in, out := &in.Data, &out.Data
+ *out = make([]byte, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RangeAllocation.
+func (in *RangeAllocation) DeepCopy() *RangeAllocation {
+ if in == nil {
+ return nil
+ }
+ out := new(RangeAllocation)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *RangeAllocation) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ReplicationController) DeepCopyInto(out *ReplicationController) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+ in.Status.DeepCopyInto(&out.Status)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReplicationController.
+func (in *ReplicationController) DeepCopy() *ReplicationController {
+ if in == nil {
+ return nil
+ }
+ out := new(ReplicationController)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ReplicationController) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ReplicationControllerCondition) DeepCopyInto(out *ReplicationControllerCondition) {
+ *out = *in
+ in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReplicationControllerCondition.
+func (in *ReplicationControllerCondition) DeepCopy() *ReplicationControllerCondition {
+ if in == nil {
+ return nil
+ }
+ out := new(ReplicationControllerCondition)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ReplicationControllerList) DeepCopyInto(out *ReplicationControllerList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]ReplicationController, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReplicationControllerList.
+func (in *ReplicationControllerList) DeepCopy() *ReplicationControllerList {
+ if in == nil {
+ return nil
+ }
+ out := new(ReplicationControllerList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ReplicationControllerList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ReplicationControllerSpec) DeepCopyInto(out *ReplicationControllerSpec) {
+ *out = *in
+ if in.Selector != nil {
+ in, out := &in.Selector, &out.Selector
+ *out = make(map[string]string, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val
+ }
+ }
+ if in.Template != nil {
+ in, out := &in.Template, &out.Template
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(PodTemplateSpec)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReplicationControllerSpec.
+func (in *ReplicationControllerSpec) DeepCopy() *ReplicationControllerSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(ReplicationControllerSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ReplicationControllerStatus) DeepCopyInto(out *ReplicationControllerStatus) {
+ *out = *in
+ if in.Conditions != nil {
+ in, out := &in.Conditions, &out.Conditions
+ *out = make([]ReplicationControllerCondition, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReplicationControllerStatus.
+func (in *ReplicationControllerStatus) DeepCopy() *ReplicationControllerStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(ReplicationControllerStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ResourceFieldSelector) DeepCopyInto(out *ResourceFieldSelector) {
+ *out = *in
+ out.Divisor = in.Divisor.DeepCopy()
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceFieldSelector.
+func (in *ResourceFieldSelector) DeepCopy() *ResourceFieldSelector {
+ if in == nil {
+ return nil
+ }
+ out := new(ResourceFieldSelector)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in ResourceList) DeepCopyInto(out *ResourceList) {
+ {
+ in := &in
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ return
+ }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceList.
+func (in ResourceList) DeepCopy() ResourceList {
+ if in == nil {
+ return nil
+ }
+ out := new(ResourceList)
+ in.DeepCopyInto(out)
+ return *out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ResourceQuota) DeepCopyInto(out *ResourceQuota) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+ in.Status.DeepCopyInto(&out.Status)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceQuota.
+func (in *ResourceQuota) DeepCopy() *ResourceQuota {
+ if in == nil {
+ return nil
+ }
+ out := new(ResourceQuota)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ResourceQuota) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ResourceQuotaList) DeepCopyInto(out *ResourceQuotaList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]ResourceQuota, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceQuotaList.
+func (in *ResourceQuotaList) DeepCopy() *ResourceQuotaList {
+ if in == nil {
+ return nil
+ }
+ out := new(ResourceQuotaList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ResourceQuotaList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ResourceQuotaSpec) DeepCopyInto(out *ResourceQuotaSpec) {
+ *out = *in
+ if in.Hard != nil {
+ in, out := &in.Hard, &out.Hard
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ if in.Scopes != nil {
+ in, out := &in.Scopes, &out.Scopes
+ *out = make([]ResourceQuotaScope, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceQuotaSpec.
+func (in *ResourceQuotaSpec) DeepCopy() *ResourceQuotaSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(ResourceQuotaSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ResourceQuotaStatus) DeepCopyInto(out *ResourceQuotaStatus) {
+ *out = *in
+ if in.Hard != nil {
+ in, out := &in.Hard, &out.Hard
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ if in.Used != nil {
+ in, out := &in.Used, &out.Used
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceQuotaStatus.
+func (in *ResourceQuotaStatus) DeepCopy() *ResourceQuotaStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(ResourceQuotaStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ResourceRequirements) DeepCopyInto(out *ResourceRequirements) {
+ *out = *in
+ if in.Limits != nil {
+ in, out := &in.Limits, &out.Limits
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ if in.Requests != nil {
+ in, out := &in.Requests, &out.Requests
+ *out = make(ResourceList, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val.DeepCopy()
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceRequirements.
+func (in *ResourceRequirements) DeepCopy() *ResourceRequirements {
+ if in == nil {
+ return nil
+ }
+ out := new(ResourceRequirements)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SELinuxOptions) DeepCopyInto(out *SELinuxOptions) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SELinuxOptions.
+func (in *SELinuxOptions) DeepCopy() *SELinuxOptions {
+ if in == nil {
+ return nil
+ }
+ out := new(SELinuxOptions)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ScaleIOPersistentVolumeSource) DeepCopyInto(out *ScaleIOPersistentVolumeSource) {
+ *out = *in
+ if in.SecretRef != nil {
+ in, out := &in.SecretRef, &out.SecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SecretReference)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScaleIOPersistentVolumeSource.
+func (in *ScaleIOPersistentVolumeSource) DeepCopy() *ScaleIOPersistentVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(ScaleIOPersistentVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ScaleIOVolumeSource) DeepCopyInto(out *ScaleIOVolumeSource) {
+ *out = *in
+ if in.SecretRef != nil {
+ in, out := &in.SecretRef, &out.SecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(LocalObjectReference)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScaleIOVolumeSource.
+func (in *ScaleIOVolumeSource) DeepCopy() *ScaleIOVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(ScaleIOVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Secret) DeepCopyInto(out *Secret) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ if in.Data != nil {
+ in, out := &in.Data, &out.Data
+ *out = make(map[string][]byte, len(*in))
+ for key, val := range *in {
+ if val == nil {
+ (*out)[key] = nil
+ } else {
+ (*out)[key] = make([]byte, len(val))
+ copy((*out)[key], val)
+ }
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Secret.
+func (in *Secret) DeepCopy() *Secret {
+ if in == nil {
+ return nil
+ }
+ out := new(Secret)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Secret) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SecretEnvSource) DeepCopyInto(out *SecretEnvSource) {
+ *out = *in
+ out.LocalObjectReference = in.LocalObjectReference
+ if in.Optional != nil {
+ in, out := &in.Optional, &out.Optional
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretEnvSource.
+func (in *SecretEnvSource) DeepCopy() *SecretEnvSource {
+ if in == nil {
+ return nil
+ }
+ out := new(SecretEnvSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SecretKeySelector) DeepCopyInto(out *SecretKeySelector) {
+ *out = *in
+ out.LocalObjectReference = in.LocalObjectReference
+ if in.Optional != nil {
+ in, out := &in.Optional, &out.Optional
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretKeySelector.
+func (in *SecretKeySelector) DeepCopy() *SecretKeySelector {
+ if in == nil {
+ return nil
+ }
+ out := new(SecretKeySelector)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SecretList) DeepCopyInto(out *SecretList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]Secret, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretList.
+func (in *SecretList) DeepCopy() *SecretList {
+ if in == nil {
+ return nil
+ }
+ out := new(SecretList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *SecretList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SecretProjection) DeepCopyInto(out *SecretProjection) {
+ *out = *in
+ out.LocalObjectReference = in.LocalObjectReference
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]KeyToPath, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.Optional != nil {
+ in, out := &in.Optional, &out.Optional
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretProjection.
+func (in *SecretProjection) DeepCopy() *SecretProjection {
+ if in == nil {
+ return nil
+ }
+ out := new(SecretProjection)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SecretReference) DeepCopyInto(out *SecretReference) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretReference.
+func (in *SecretReference) DeepCopy() *SecretReference {
+ if in == nil {
+ return nil
+ }
+ out := new(SecretReference)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SecretVolumeSource) DeepCopyInto(out *SecretVolumeSource) {
+ *out = *in
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]KeyToPath, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.DefaultMode != nil {
+ in, out := &in.DefaultMode, &out.DefaultMode
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int32)
+ **out = **in
+ }
+ }
+ if in.Optional != nil {
+ in, out := &in.Optional, &out.Optional
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretVolumeSource.
+func (in *SecretVolumeSource) DeepCopy() *SecretVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(SecretVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SecurityContext) DeepCopyInto(out *SecurityContext) {
+ *out = *in
+ if in.Capabilities != nil {
+ in, out := &in.Capabilities, &out.Capabilities
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(Capabilities)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Privileged != nil {
+ in, out := &in.Privileged, &out.Privileged
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ if in.SELinuxOptions != nil {
+ in, out := &in.SELinuxOptions, &out.SELinuxOptions
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SELinuxOptions)
+ **out = **in
+ }
+ }
+ if in.RunAsUser != nil {
+ in, out := &in.RunAsUser, &out.RunAsUser
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int64)
+ **out = **in
+ }
+ }
+ if in.RunAsNonRoot != nil {
+ in, out := &in.RunAsNonRoot, &out.RunAsNonRoot
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ if in.ReadOnlyRootFilesystem != nil {
+ in, out := &in.ReadOnlyRootFilesystem, &out.ReadOnlyRootFilesystem
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ if in.AllowPrivilegeEscalation != nil {
+ in, out := &in.AllowPrivilegeEscalation, &out.AllowPrivilegeEscalation
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecurityContext.
+func (in *SecurityContext) DeepCopy() *SecurityContext {
+ if in == nil {
+ return nil
+ }
+ out := new(SecurityContext)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SerializedReference) DeepCopyInto(out *SerializedReference) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.Reference = in.Reference
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SerializedReference.
+func (in *SerializedReference) DeepCopy() *SerializedReference {
+ if in == nil {
+ return nil
+ }
+ out := new(SerializedReference)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *SerializedReference) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Service) DeepCopyInto(out *Service) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+ in.Status.DeepCopyInto(&out.Status)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Service.
+func (in *Service) DeepCopy() *Service {
+ if in == nil {
+ return nil
+ }
+ out := new(Service)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Service) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceAccount) DeepCopyInto(out *ServiceAccount) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ if in.Secrets != nil {
+ in, out := &in.Secrets, &out.Secrets
+ *out = make([]ObjectReference, len(*in))
+ copy(*out, *in)
+ }
+ if in.ImagePullSecrets != nil {
+ in, out := &in.ImagePullSecrets, &out.ImagePullSecrets
+ *out = make([]LocalObjectReference, len(*in))
+ copy(*out, *in)
+ }
+ if in.AutomountServiceAccountToken != nil {
+ in, out := &in.AutomountServiceAccountToken, &out.AutomountServiceAccountToken
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(bool)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceAccount.
+func (in *ServiceAccount) DeepCopy() *ServiceAccount {
+ if in == nil {
+ return nil
+ }
+ out := new(ServiceAccount)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ServiceAccount) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceAccountList) DeepCopyInto(out *ServiceAccountList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]ServiceAccount, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceAccountList.
+func (in *ServiceAccountList) DeepCopy() *ServiceAccountList {
+ if in == nil {
+ return nil
+ }
+ out := new(ServiceAccountList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ServiceAccountList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceList) DeepCopyInto(out *ServiceList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ out.ListMeta = in.ListMeta
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]Service, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceList.
+func (in *ServiceList) DeepCopy() *ServiceList {
+ if in == nil {
+ return nil
+ }
+ out := new(ServiceList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ServiceList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServicePort) DeepCopyInto(out *ServicePort) {
+ *out = *in
+ out.TargetPort = in.TargetPort
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServicePort.
+func (in *ServicePort) DeepCopy() *ServicePort {
+ if in == nil {
+ return nil
+ }
+ out := new(ServicePort)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceProxyOptions) DeepCopyInto(out *ServiceProxyOptions) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceProxyOptions.
+func (in *ServiceProxyOptions) DeepCopy() *ServiceProxyOptions {
+ if in == nil {
+ return nil
+ }
+ out := new(ServiceProxyOptions)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ServiceProxyOptions) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) {
+ *out = *in
+ if in.Ports != nil {
+ in, out := &in.Ports, &out.Ports
+ *out = make([]ServicePort, len(*in))
+ copy(*out, *in)
+ }
+ if in.Selector != nil {
+ in, out := &in.Selector, &out.Selector
+ *out = make(map[string]string, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val
+ }
+ }
+ if in.ExternalIPs != nil {
+ in, out := &in.ExternalIPs, &out.ExternalIPs
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ if in.SessionAffinityConfig != nil {
+ in, out := &in.SessionAffinityConfig, &out.SessionAffinityConfig
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SessionAffinityConfig)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.LoadBalancerSourceRanges != nil {
+ in, out := &in.LoadBalancerSourceRanges, &out.LoadBalancerSourceRanges
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceSpec.
+func (in *ServiceSpec) DeepCopy() *ServiceSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(ServiceSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceStatus) DeepCopyInto(out *ServiceStatus) {
+ *out = *in
+ in.LoadBalancer.DeepCopyInto(&out.LoadBalancer)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceStatus.
+func (in *ServiceStatus) DeepCopy() *ServiceStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(ServiceStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SessionAffinityConfig) DeepCopyInto(out *SessionAffinityConfig) {
+ *out = *in
+ if in.ClientIP != nil {
+ in, out := &in.ClientIP, &out.ClientIP
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ClientIPConfig)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SessionAffinityConfig.
+func (in *SessionAffinityConfig) DeepCopy() *SessionAffinityConfig {
+ if in == nil {
+ return nil
+ }
+ out := new(SessionAffinityConfig)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *StorageOSPersistentVolumeSource) DeepCopyInto(out *StorageOSPersistentVolumeSource) {
+ *out = *in
+ if in.SecretRef != nil {
+ in, out := &in.SecretRef, &out.SecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ObjectReference)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageOSPersistentVolumeSource.
+func (in *StorageOSPersistentVolumeSource) DeepCopy() *StorageOSPersistentVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(StorageOSPersistentVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *StorageOSVolumeSource) DeepCopyInto(out *StorageOSVolumeSource) {
+ *out = *in
+ if in.SecretRef != nil {
+ in, out := &in.SecretRef, &out.SecretRef
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(LocalObjectReference)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageOSVolumeSource.
+func (in *StorageOSVolumeSource) DeepCopy() *StorageOSVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(StorageOSVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Sysctl) DeepCopyInto(out *Sysctl) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Sysctl.
+func (in *Sysctl) DeepCopy() *Sysctl {
+ if in == nil {
+ return nil
+ }
+ out := new(Sysctl)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *TCPSocketAction) DeepCopyInto(out *TCPSocketAction) {
+ *out = *in
+ out.Port = in.Port
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TCPSocketAction.
+func (in *TCPSocketAction) DeepCopy() *TCPSocketAction {
+ if in == nil {
+ return nil
+ }
+ out := new(TCPSocketAction)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Taint) DeepCopyInto(out *Taint) {
+ *out = *in
+ if in.TimeAdded != nil {
+ in, out := &in.TimeAdded, &out.TimeAdded
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = (*in).DeepCopy()
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Taint.
+func (in *Taint) DeepCopy() *Taint {
+ if in == nil {
+ return nil
+ }
+ out := new(Taint)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Toleration) DeepCopyInto(out *Toleration) {
+ *out = *in
+ if in.TolerationSeconds != nil {
+ in, out := &in.TolerationSeconds, &out.TolerationSeconds
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(int64)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Toleration.
+func (in *Toleration) DeepCopy() *Toleration {
+ if in == nil {
+ return nil
+ }
+ out := new(Toleration)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Volume) DeepCopyInto(out *Volume) {
+ *out = *in
+ in.VolumeSource.DeepCopyInto(&out.VolumeSource)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Volume.
+func (in *Volume) DeepCopy() *Volume {
+ if in == nil {
+ return nil
+ }
+ out := new(Volume)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *VolumeDevice) DeepCopyInto(out *VolumeDevice) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeDevice.
+func (in *VolumeDevice) DeepCopy() *VolumeDevice {
+ if in == nil {
+ return nil
+ }
+ out := new(VolumeDevice)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *VolumeMount) DeepCopyInto(out *VolumeMount) {
+ *out = *in
+ if in.MountPropagation != nil {
+ in, out := &in.MountPropagation, &out.MountPropagation
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(MountPropagationMode)
+ **out = **in
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeMount.
+func (in *VolumeMount) DeepCopy() *VolumeMount {
+ if in == nil {
+ return nil
+ }
+ out := new(VolumeMount)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *VolumeNodeAffinity) DeepCopyInto(out *VolumeNodeAffinity) {
+ *out = *in
+ if in.Required != nil {
+ in, out := &in.Required, &out.Required
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(NodeSelector)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeNodeAffinity.
+func (in *VolumeNodeAffinity) DeepCopy() *VolumeNodeAffinity {
+ if in == nil {
+ return nil
+ }
+ out := new(VolumeNodeAffinity)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *VolumeProjection) DeepCopyInto(out *VolumeProjection) {
+ *out = *in
+ if in.Secret != nil {
+ in, out := &in.Secret, &out.Secret
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SecretProjection)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.DownwardAPI != nil {
+ in, out := &in.DownwardAPI, &out.DownwardAPI
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(DownwardAPIProjection)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.ConfigMap != nil {
+ in, out := &in.ConfigMap, &out.ConfigMap
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ConfigMapProjection)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeProjection.
+func (in *VolumeProjection) DeepCopy() *VolumeProjection {
+ if in == nil {
+ return nil
+ }
+ out := new(VolumeProjection)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *VolumeSource) DeepCopyInto(out *VolumeSource) {
+ *out = *in
+ if in.HostPath != nil {
+ in, out := &in.HostPath, &out.HostPath
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(HostPathVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.EmptyDir != nil {
+ in, out := &in.EmptyDir, &out.EmptyDir
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(EmptyDirVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.GCEPersistentDisk != nil {
+ in, out := &in.GCEPersistentDisk, &out.GCEPersistentDisk
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(GCEPersistentDiskVolumeSource)
+ **out = **in
+ }
+ }
+ if in.AWSElasticBlockStore != nil {
+ in, out := &in.AWSElasticBlockStore, &out.AWSElasticBlockStore
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(AWSElasticBlockStoreVolumeSource)
+ **out = **in
+ }
+ }
+ if in.GitRepo != nil {
+ in, out := &in.GitRepo, &out.GitRepo
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(GitRepoVolumeSource)
+ **out = **in
+ }
+ }
+ if in.Secret != nil {
+ in, out := &in.Secret, &out.Secret
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(SecretVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.NFS != nil {
+ in, out := &in.NFS, &out.NFS
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(NFSVolumeSource)
+ **out = **in
+ }
+ }
+ if in.ISCSI != nil {
+ in, out := &in.ISCSI, &out.ISCSI
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ISCSIVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Glusterfs != nil {
+ in, out := &in.Glusterfs, &out.Glusterfs
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(GlusterfsVolumeSource)
+ **out = **in
+ }
+ }
+ if in.PersistentVolumeClaim != nil {
+ in, out := &in.PersistentVolumeClaim, &out.PersistentVolumeClaim
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(PersistentVolumeClaimVolumeSource)
+ **out = **in
+ }
+ }
+ if in.RBD != nil {
+ in, out := &in.RBD, &out.RBD
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(RBDVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Quobyte != nil {
+ in, out := &in.Quobyte, &out.Quobyte
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(QuobyteVolumeSource)
+ **out = **in
+ }
+ }
+ if in.FlexVolume != nil {
+ in, out := &in.FlexVolume, &out.FlexVolume
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(FlexVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Cinder != nil {
+ in, out := &in.Cinder, &out.Cinder
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(CinderVolumeSource)
+ **out = **in
+ }
+ }
+ if in.CephFS != nil {
+ in, out := &in.CephFS, &out.CephFS
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(CephFSVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.Flocker != nil {
+ in, out := &in.Flocker, &out.Flocker
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(FlockerVolumeSource)
+ **out = **in
+ }
+ }
+ if in.DownwardAPI != nil {
+ in, out := &in.DownwardAPI, &out.DownwardAPI
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(DownwardAPIVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.FC != nil {
+ in, out := &in.FC, &out.FC
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(FCVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.AzureFile != nil {
+ in, out := &in.AzureFile, &out.AzureFile
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(AzureFileVolumeSource)
+ **out = **in
+ }
+ }
+ if in.ConfigMap != nil {
+ in, out := &in.ConfigMap, &out.ConfigMap
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ConfigMapVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.VsphereVolume != nil {
+ in, out := &in.VsphereVolume, &out.VsphereVolume
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(VsphereVirtualDiskVolumeSource)
+ **out = **in
+ }
+ }
+ if in.AzureDisk != nil {
+ in, out := &in.AzureDisk, &out.AzureDisk
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(AzureDiskVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.PhotonPersistentDisk != nil {
+ in, out := &in.PhotonPersistentDisk, &out.PhotonPersistentDisk
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(PhotonPersistentDiskVolumeSource)
+ **out = **in
+ }
+ }
+ if in.Projected != nil {
+ in, out := &in.Projected, &out.Projected
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ProjectedVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.PortworxVolume != nil {
+ in, out := &in.PortworxVolume, &out.PortworxVolume
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(PortworxVolumeSource)
+ **out = **in
+ }
+ }
+ if in.ScaleIO != nil {
+ in, out := &in.ScaleIO, &out.ScaleIO
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(ScaleIOVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ if in.StorageOS != nil {
+ in, out := &in.StorageOS, &out.StorageOS
+ if *in == nil {
+ *out = nil
+ } else {
+ *out = new(StorageOSVolumeSource)
+ (*in).DeepCopyInto(*out)
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeSource.
+func (in *VolumeSource) DeepCopy() *VolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(VolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *VsphereVirtualDiskVolumeSource) DeepCopyInto(out *VsphereVirtualDiskVolumeSource) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VsphereVirtualDiskVolumeSource.
+func (in *VsphereVirtualDiskVolumeSource) DeepCopy() *VsphereVirtualDiskVolumeSource {
+ if in == nil {
+ return nil
+ }
+ out := new(VsphereVirtualDiskVolumeSource)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *WeightedPodAffinityTerm) DeepCopyInto(out *WeightedPodAffinityTerm) {
+ *out = *in
+ in.PodAffinityTerm.DeepCopyInto(&out.PodAffinityTerm)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WeightedPodAffinityTerm.
+func (in *WeightedPodAffinityTerm) DeepCopy() *WeightedPodAffinityTerm {
+ if in == nil {
+ return nil
+ }
+ out := new(WeightedPodAffinityTerm)
+ in.DeepCopyInto(out)
+ return out
+}