update vendor
Signed-off-by: Xinzhao Xu <z2d@jifangcheng.com>
This commit is contained in:
parent
b0742b2c9c
commit
09ae4de511
|
@ -1,202 +0,0 @@
|
||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,20 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2019 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 v1 contains scheduler API objects.
|
|
||||||
package v1 // import "k8s.io/kube-scheduler/extender/v1"
|
|
|
@ -1,130 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2019 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 (
|
|
||||||
v1 "k8s.io/api/core/v1"
|
|
||||||
"k8s.io/apimachinery/pkg/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// MinExtenderPriority defines the min priority value for extender.
|
|
||||||
MinExtenderPriority int64 = 0
|
|
||||||
|
|
||||||
// MaxExtenderPriority defines the max priority value for extender.
|
|
||||||
MaxExtenderPriority int64 = 10
|
|
||||||
)
|
|
||||||
|
|
||||||
// ExtenderPreemptionResult represents the result returned by preemption phase of extender.
|
|
||||||
type ExtenderPreemptionResult struct {
|
|
||||||
NodeNameToMetaVictims map[string]*MetaVictims
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExtenderPreemptionArgs represents the arguments needed by the extender to preempt pods on nodes.
|
|
||||||
type ExtenderPreemptionArgs struct {
|
|
||||||
// Pod being scheduled
|
|
||||||
Pod *v1.Pod
|
|
||||||
// Victims map generated by scheduler preemption phase
|
|
||||||
// Only set NodeNameToMetaVictims if Extender.NodeCacheCapable == true. Otherwise, only set NodeNameToVictims.
|
|
||||||
NodeNameToVictims map[string]*Victims
|
|
||||||
NodeNameToMetaVictims map[string]*MetaVictims
|
|
||||||
}
|
|
||||||
|
|
||||||
// Victims represents:
|
|
||||||
// pods: a group of pods expected to be preempted.
|
|
||||||
// numPDBViolations: the count of violations of PodDisruptionBudget
|
|
||||||
type Victims struct {
|
|
||||||
Pods []*v1.Pod
|
|
||||||
NumPDBViolations int64
|
|
||||||
}
|
|
||||||
|
|
||||||
// MetaPod represent identifier for a v1.Pod
|
|
||||||
type MetaPod struct {
|
|
||||||
UID string
|
|
||||||
}
|
|
||||||
|
|
||||||
// MetaVictims represents:
|
|
||||||
// pods: a group of pods expected to be preempted.
|
|
||||||
// Only Pod identifiers will be sent and user are expect to get v1.Pod in their own way.
|
|
||||||
// numPDBViolations: the count of violations of PodDisruptionBudget
|
|
||||||
type MetaVictims struct {
|
|
||||||
Pods []*MetaPod
|
|
||||||
NumPDBViolations int64
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExtenderArgs represents the arguments needed by the extender to filter/prioritize
|
|
||||||
// nodes for a pod.
|
|
||||||
type ExtenderArgs struct {
|
|
||||||
// Pod being scheduled
|
|
||||||
Pod *v1.Pod
|
|
||||||
// List of candidate nodes where the pod can be scheduled; to be populated
|
|
||||||
// only if Extender.NodeCacheCapable == false
|
|
||||||
Nodes *v1.NodeList
|
|
||||||
// List of candidate node names where the pod can be scheduled; to be
|
|
||||||
// populated only if Extender.NodeCacheCapable == true
|
|
||||||
NodeNames *[]string
|
|
||||||
}
|
|
||||||
|
|
||||||
// FailedNodesMap represents the filtered out nodes, with node names and failure messages
|
|
||||||
type FailedNodesMap map[string]string
|
|
||||||
|
|
||||||
// ExtenderFilterResult represents the results of a filter call to an extender
|
|
||||||
type ExtenderFilterResult struct {
|
|
||||||
// Filtered set of nodes where the pod can be scheduled; to be populated
|
|
||||||
// only if Extender.NodeCacheCapable == false
|
|
||||||
Nodes *v1.NodeList
|
|
||||||
// Filtered set of nodes where the pod can be scheduled; to be populated
|
|
||||||
// only if Extender.NodeCacheCapable == true
|
|
||||||
NodeNames *[]string
|
|
||||||
// Filtered out nodes where the pod can't be scheduled and the failure messages
|
|
||||||
FailedNodes FailedNodesMap
|
|
||||||
// Filtered out nodes where the pod can't be scheduled and preemption would
|
|
||||||
// not change anything. The value is the failure message same as FailedNodes.
|
|
||||||
// Nodes specified here takes precedence over FailedNodes.
|
|
||||||
FailedAndUnresolvableNodes FailedNodesMap
|
|
||||||
// Error message indicating failure
|
|
||||||
Error string
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExtenderBindingArgs represents the arguments to an extender for binding a pod to a node.
|
|
||||||
type ExtenderBindingArgs struct {
|
|
||||||
// PodName is the name of the pod being bound
|
|
||||||
PodName string
|
|
||||||
// PodNamespace is the namespace of the pod being bound
|
|
||||||
PodNamespace string
|
|
||||||
// PodUID is the UID of the pod being bound
|
|
||||||
PodUID types.UID
|
|
||||||
// Node selected by the scheduler
|
|
||||||
Node string
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExtenderBindingResult represents the result of binding of a pod to a node from an extender.
|
|
||||||
type ExtenderBindingResult struct {
|
|
||||||
// Error message indicating failure
|
|
||||||
Error string
|
|
||||||
}
|
|
||||||
|
|
||||||
// HostPriority represents the priority of scheduling to a particular host, higher priority is better.
|
|
||||||
type HostPriority struct {
|
|
||||||
// Name of the host
|
|
||||||
Host string
|
|
||||||
// Score associated with the host
|
|
||||||
Score int64
|
|
||||||
}
|
|
||||||
|
|
||||||
// HostPriorityList declares a []HostPriority type.
|
|
||||||
type HostPriorityList []HostPriority
|
|
|
@ -1,346 +0,0 @@
|
||||||
// +build !ignore_autogenerated
|
|
||||||
|
|
||||||
/*
|
|
||||||
Copyright 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 v1
|
|
||||||
|
|
||||||
import (
|
|
||||||
corev1 "k8s.io/api/core/v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in *ExtenderArgs) DeepCopyInto(out *ExtenderArgs) {
|
|
||||||
*out = *in
|
|
||||||
if in.Pod != nil {
|
|
||||||
in, out := &in.Pod, &out.Pod
|
|
||||||
*out = new(corev1.Pod)
|
|
||||||
(*in).DeepCopyInto(*out)
|
|
||||||
}
|
|
||||||
if in.Nodes != nil {
|
|
||||||
in, out := &in.Nodes, &out.Nodes
|
|
||||||
*out = new(corev1.NodeList)
|
|
||||||
(*in).DeepCopyInto(*out)
|
|
||||||
}
|
|
||||||
if in.NodeNames != nil {
|
|
||||||
in, out := &in.NodeNames, &out.NodeNames
|
|
||||||
*out = new([]string)
|
|
||||||
if **in != nil {
|
|
||||||
in, out := *in, *out
|
|
||||||
*out = make([]string, len(*in))
|
|
||||||
copy(*out, *in)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExtenderArgs.
|
|
||||||
func (in *ExtenderArgs) DeepCopy() *ExtenderArgs {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(ExtenderArgs)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in *ExtenderBindingArgs) DeepCopyInto(out *ExtenderBindingArgs) {
|
|
||||||
*out = *in
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExtenderBindingArgs.
|
|
||||||
func (in *ExtenderBindingArgs) DeepCopy() *ExtenderBindingArgs {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(ExtenderBindingArgs)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in *ExtenderBindingResult) DeepCopyInto(out *ExtenderBindingResult) {
|
|
||||||
*out = *in
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExtenderBindingResult.
|
|
||||||
func (in *ExtenderBindingResult) DeepCopy() *ExtenderBindingResult {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(ExtenderBindingResult)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in *ExtenderFilterResult) DeepCopyInto(out *ExtenderFilterResult) {
|
|
||||||
*out = *in
|
|
||||||
if in.Nodes != nil {
|
|
||||||
in, out := &in.Nodes, &out.Nodes
|
|
||||||
*out = new(corev1.NodeList)
|
|
||||||
(*in).DeepCopyInto(*out)
|
|
||||||
}
|
|
||||||
if in.NodeNames != nil {
|
|
||||||
in, out := &in.NodeNames, &out.NodeNames
|
|
||||||
*out = new([]string)
|
|
||||||
if **in != nil {
|
|
||||||
in, out := *in, *out
|
|
||||||
*out = make([]string, len(*in))
|
|
||||||
copy(*out, *in)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if in.FailedNodes != nil {
|
|
||||||
in, out := &in.FailedNodes, &out.FailedNodes
|
|
||||||
*out = make(FailedNodesMap, len(*in))
|
|
||||||
for key, val := range *in {
|
|
||||||
(*out)[key] = val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if in.FailedAndUnresolvableNodes != nil {
|
|
||||||
in, out := &in.FailedAndUnresolvableNodes, &out.FailedAndUnresolvableNodes
|
|
||||||
*out = make(FailedNodesMap, len(*in))
|
|
||||||
for key, val := range *in {
|
|
||||||
(*out)[key] = val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExtenderFilterResult.
|
|
||||||
func (in *ExtenderFilterResult) DeepCopy() *ExtenderFilterResult {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(ExtenderFilterResult)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in *ExtenderPreemptionArgs) DeepCopyInto(out *ExtenderPreemptionArgs) {
|
|
||||||
*out = *in
|
|
||||||
if in.Pod != nil {
|
|
||||||
in, out := &in.Pod, &out.Pod
|
|
||||||
*out = new(corev1.Pod)
|
|
||||||
(*in).DeepCopyInto(*out)
|
|
||||||
}
|
|
||||||
if in.NodeNameToVictims != nil {
|
|
||||||
in, out := &in.NodeNameToVictims, &out.NodeNameToVictims
|
|
||||||
*out = make(map[string]*Victims, len(*in))
|
|
||||||
for key, val := range *in {
|
|
||||||
var outVal *Victims
|
|
||||||
if val == nil {
|
|
||||||
(*out)[key] = nil
|
|
||||||
} else {
|
|
||||||
in, out := &val, &outVal
|
|
||||||
*out = new(Victims)
|
|
||||||
(*in).DeepCopyInto(*out)
|
|
||||||
}
|
|
||||||
(*out)[key] = outVal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if in.NodeNameToMetaVictims != nil {
|
|
||||||
in, out := &in.NodeNameToMetaVictims, &out.NodeNameToMetaVictims
|
|
||||||
*out = make(map[string]*MetaVictims, len(*in))
|
|
||||||
for key, val := range *in {
|
|
||||||
var outVal *MetaVictims
|
|
||||||
if val == nil {
|
|
||||||
(*out)[key] = nil
|
|
||||||
} else {
|
|
||||||
in, out := &val, &outVal
|
|
||||||
*out = new(MetaVictims)
|
|
||||||
(*in).DeepCopyInto(*out)
|
|
||||||
}
|
|
||||||
(*out)[key] = outVal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExtenderPreemptionArgs.
|
|
||||||
func (in *ExtenderPreemptionArgs) DeepCopy() *ExtenderPreemptionArgs {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(ExtenderPreemptionArgs)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in *ExtenderPreemptionResult) DeepCopyInto(out *ExtenderPreemptionResult) {
|
|
||||||
*out = *in
|
|
||||||
if in.NodeNameToMetaVictims != nil {
|
|
||||||
in, out := &in.NodeNameToMetaVictims, &out.NodeNameToMetaVictims
|
|
||||||
*out = make(map[string]*MetaVictims, len(*in))
|
|
||||||
for key, val := range *in {
|
|
||||||
var outVal *MetaVictims
|
|
||||||
if val == nil {
|
|
||||||
(*out)[key] = nil
|
|
||||||
} else {
|
|
||||||
in, out := &val, &outVal
|
|
||||||
*out = new(MetaVictims)
|
|
||||||
(*in).DeepCopyInto(*out)
|
|
||||||
}
|
|
||||||
(*out)[key] = outVal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExtenderPreemptionResult.
|
|
||||||
func (in *ExtenderPreemptionResult) DeepCopy() *ExtenderPreemptionResult {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(ExtenderPreemptionResult)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in FailedNodesMap) DeepCopyInto(out *FailedNodesMap) {
|
|
||||||
{
|
|
||||||
in := &in
|
|
||||||
*out = make(FailedNodesMap, len(*in))
|
|
||||||
for key, val := range *in {
|
|
||||||
(*out)[key] = val
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FailedNodesMap.
|
|
||||||
func (in FailedNodesMap) DeepCopy() FailedNodesMap {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(FailedNodesMap)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return *out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in *HostPriority) DeepCopyInto(out *HostPriority) {
|
|
||||||
*out = *in
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HostPriority.
|
|
||||||
func (in *HostPriority) DeepCopy() *HostPriority {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(HostPriority)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in HostPriorityList) DeepCopyInto(out *HostPriorityList) {
|
|
||||||
{
|
|
||||||
in := &in
|
|
||||||
*out = make(HostPriorityList, len(*in))
|
|
||||||
copy(*out, *in)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HostPriorityList.
|
|
||||||
func (in HostPriorityList) DeepCopy() HostPriorityList {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(HostPriorityList)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return *out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in *MetaPod) DeepCopyInto(out *MetaPod) {
|
|
||||||
*out = *in
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetaPod.
|
|
||||||
func (in *MetaPod) DeepCopy() *MetaPod {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(MetaPod)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in *MetaVictims) DeepCopyInto(out *MetaVictims) {
|
|
||||||
*out = *in
|
|
||||||
if in.Pods != nil {
|
|
||||||
in, out := &in.Pods, &out.Pods
|
|
||||||
*out = make([]*MetaPod, len(*in))
|
|
||||||
for i := range *in {
|
|
||||||
if (*in)[i] != nil {
|
|
||||||
in, out := &(*in)[i], &(*out)[i]
|
|
||||||
*out = new(MetaPod)
|
|
||||||
**out = **in
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetaVictims.
|
|
||||||
func (in *MetaVictims) DeepCopy() *MetaVictims {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(MetaVictims)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in *Victims) DeepCopyInto(out *Victims) {
|
|
||||||
*out = *in
|
|
||||||
if in.Pods != nil {
|
|
||||||
in, out := &in.Pods, &out.Pods
|
|
||||||
*out = make([]*corev1.Pod, len(*in))
|
|
||||||
for i := range *in {
|
|
||||||
if (*in)[i] != nil {
|
|
||||||
in, out := &(*in)[i], &(*out)[i]
|
|
||||||
*out = new(corev1.Pod)
|
|
||||||
(*in).DeepCopyInto(*out)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Victims.
|
|
||||||
func (in *Victims) DeepCopy() *Victims {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(Victims)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return out
|
|
||||||
}
|
|
|
@ -1,202 +0,0 @@
|
||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,4 +0,0 @@
|
||||||
# See the OWNERS docs at https://go.k8s.io/owners
|
|
||||||
|
|
||||||
labels:
|
|
||||||
- sig/apps
|
|
|
@ -1,129 +0,0 @@
|
||||||
/*
|
|
||||||
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"
|
|
||||||
|
|
||||||
// MirrorPodAnnotationKey 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.
|
|
||||||
// Deprecated: set a pod security context `seccompProfile` field.
|
|
||||||
SeccompPodAnnotationKey string = "seccomp.security.alpha.kubernetes.io/pod"
|
|
||||||
|
|
||||||
// SeccompContainerAnnotationKeyPrefix represents the key of a seccomp profile applied
|
|
||||||
// to one container of a pod.
|
|
||||||
// Deprecated: set a container security context `seccompProfile` field.
|
|
||||||
SeccompContainerAnnotationKeyPrefix string = "container.seccomp.security.alpha.kubernetes.io/"
|
|
||||||
|
|
||||||
// SeccompProfileRuntimeDefault represents the default seccomp profile used by container runtime.
|
|
||||||
// Deprecated: set a pod or container security context `seccompProfile` of type "RuntimeDefault" instead.
|
|
||||||
SeccompProfileRuntimeDefault string = "runtime/default"
|
|
||||||
|
|
||||||
// DeprecatedSeccompProfileDockerDefault represents the default seccomp profile used by docker.
|
|
||||||
// Deprecated: set a pod or container security context `seccompProfile` of type "RuntimeDefault" instead.
|
|
||||||
DeprecatedSeccompProfileDockerDefault string = "docker/default"
|
|
||||||
|
|
||||||
// PreferAvoidPodsAnnotationKey represents the key of preferAvoidPods data (json serialized)
|
|
||||||
// in the Annotations of a Node.
|
|
||||||
PreferAvoidPodsAnnotationKey string = "scheduler.alpha.kubernetes.io/preferAvoidPods"
|
|
||||||
|
|
||||||
// ObjectTTLAnnotationKey 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"
|
|
||||||
|
|
||||||
// NonConvertibleAnnotationPrefix 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"
|
|
||||||
|
|
||||||
// EndpointsLastChangeTriggerTime is the annotation key, set for endpoints objects, that
|
|
||||||
// represents the timestamp (stored as RFC 3339 date-time string, e.g. '2018-10-22T19:32:52.1Z')
|
|
||||||
// of the last change, of some Pod or Service object, that triggered the endpoints object change.
|
|
||||||
// In other words, if a Pod / Service changed at time T0, that change was observed by endpoints
|
|
||||||
// controller at T1, and the Endpoints object was changed at T2, the
|
|
||||||
// EndpointsLastChangeTriggerTime would be set to T0.
|
|
||||||
//
|
|
||||||
// The "endpoints change trigger" here means any Pod or Service change that resulted in the
|
|
||||||
// Endpoints object change.
|
|
||||||
//
|
|
||||||
// Given the definition of the "endpoints change trigger", please note that this annotation will
|
|
||||||
// be set ONLY for endpoints object changes triggered by either Pod or Service change. If the
|
|
||||||
// Endpoints object changes due to other reasons, this annotation won't be set (or updated if it's
|
|
||||||
// already set).
|
|
||||||
//
|
|
||||||
// This annotation will be used to compute the in-cluster network programming latency SLI, see
|
|
||||||
// https://github.com/kubernetes/community/blob/master/sig-scalability/slos/network_programming_latency.md
|
|
||||||
EndpointsLastChangeTriggerTime = "endpoints.kubernetes.io/last-change-trigger-time"
|
|
||||||
|
|
||||||
// EndpointsOverCapacity will be set on an Endpoints resource when it
|
|
||||||
// exceeds the maximum capacity of 1000 addresses. Inititially the Endpoints
|
|
||||||
// controller will set this annotation with a value of "warning". In a
|
|
||||||
// future release, the controller may set this annotation with a value of
|
|
||||||
// "truncated" to indicate that any addresses exceeding the limit of 1000
|
|
||||||
// have been truncated from the Endpoints resource.
|
|
||||||
EndpointsOverCapacity = "endpoints.kubernetes.io/over-capacity"
|
|
||||||
|
|
||||||
// MigratedPluginsAnnotationKey is the annotation key, set for CSINode objects, that is a comma-separated
|
|
||||||
// list of in-tree plugins that will be serviced by the CSI backend on the Node represented by CSINode.
|
|
||||||
// This annotation is used by the Attach Detach Controller to determine whether to use the in-tree or
|
|
||||||
// CSI Backend for a volume plugin on a specific node.
|
|
||||||
MigratedPluginsAnnotationKey = "storage.alpha.kubernetes.io/migrated-plugins"
|
|
||||||
|
|
||||||
// PodDeletionCost can be used to set to an int32 that represent the cost of deleting
|
|
||||||
// a pod compared to other pods belonging to the same ReplicaSet. Pods with lower
|
|
||||||
// deletion cost are preferred to be deleted before pods with higher deletion cost.
|
|
||||||
// Note that this is honored on a best-effort basis, and so it does not offer guarantees on
|
|
||||||
// pod deletion order.
|
|
||||||
// The implicit deletion cost for pods that don't set the annotation is 0, negative values are permitted.
|
|
||||||
//
|
|
||||||
// This annotation is beta-level and is only honored when PodDeletionCost feature is enabled.
|
|
||||||
PodDeletionCost = "controller.kubernetes.io/pod-deletion-cost"
|
|
||||||
|
|
||||||
// AnnotationTopologyAwareHints can be used to enable or disable Topology
|
|
||||||
// Aware Hints for a Service. This may be set to "Auto" or "Disabled". Any
|
|
||||||
// other value is treated as "Disabled".
|
|
||||||
AnnotationTopologyAwareHints = "service.kubernetes.io/topology-aware-hints"
|
|
||||||
)
|
|
|
@ -1,24 +0,0 @@
|
||||||
/*
|
|
||||||
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 core 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"
|
|
|
@ -1,583 +0,0 @@
|
||||||
/*
|
|
||||||
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"
|
|
||||||
"strconv"
|
|
||||||
"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)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsHugePageResourceValueDivisible returns true if the resource value of storage is
|
|
||||||
// integer multiple of page size.
|
|
||||||
func IsHugePageResourceValueDivisible(name core.ResourceName, quantity resource.Quantity) bool {
|
|
||||||
pageSize, err := HugePageSizeFromResourceName(name)
|
|
||||||
if err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
if pageSize.Sign() <= 0 || pageSize.MilliValue()%int64(1000) != int64(0) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return quantity.Value()%pageSize.Value() == 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 an invalid 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),
|
|
||||||
string(core.ResourceQuotaScopePriorityClass),
|
|
||||||
)
|
|
||||||
|
|
||||||
// IsStandardResourceQuotaScope returns true if the scope is a standard value
|
|
||||||
func IsStandardResourceQuotaScope(str string, allowNamespaceAffinityScope bool) bool {
|
|
||||||
return standardResourceQuotaScopes.Has(str) ||
|
|
||||||
(allowNamespaceAffinityScope && str == string(core.ResourceQuotaScopeCrossNamespacePodAffinity))
|
|
||||||
}
|
|
||||||
|
|
||||||
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,
|
|
||||||
core.ResourceQuotaScopePriorityClass, core.ResourceQuotaScopeCrossNamespacePodAffinity:
|
|
||||||
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 IsNativeResource(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
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsNativeResource returns true if the resource name is in the
|
|
||||||
// *kubernetes.io/ namespace. Partially-qualified (unprefixed) names are
|
|
||||||
// implicitly in the kubernetes.io/ namespace.
|
|
||||||
func IsNativeResource(name core.ResourceName) bool {
|
|
||||||
return !strings.Contains(string(name), "/") ||
|
|
||||||
strings.Contains(string(name), core.ResourceDefaultNamespacePrefix)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsOvercommitAllowed returns true if the resource is in the default
|
|
||||||
// namespace and is not hugepages.
|
|
||||||
func IsOvercommitAllowed(name core.ResourceName) bool {
|
|
||||||
return IsNativeResource(name) &&
|
|
||||||
!IsHugePageResourceName(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))
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsServiceIPSet 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 {
|
|
||||||
// This function assumes that the service is semantically validated
|
|
||||||
// it does not test if the IP is valid, just makes sure that it is set.
|
|
||||||
return len(service.Spec.ClusterIP) > 0 &&
|
|
||||||
service.Spec.ClusterIP != core.ClusterIPNone
|
|
||||||
}
|
|
||||||
|
|
||||||
var standardFinalizers = sets.NewString(
|
|
||||||
string(core.FinalizerKubernetes),
|
|
||||||
metav1.FinalizerOrphanDependents,
|
|
||||||
metav1.FinalizerDeleteDependents,
|
|
||||||
)
|
|
||||||
|
|
||||||
// IsStandardFinalizerName checks if the input string is a standard finalizer name
|
|
||||||
func IsStandardFinalizerName(str string) bool {
|
|
||||||
return standardFinalizers.Has(str)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAccessModesAsString returns a string representation of an array of access modes.
|
|
||||||
// modes, when present, are always in the same order: RWO,ROX,RWX,RWOP.
|
|
||||||
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")
|
|
||||||
}
|
|
||||||
if ContainsAccessMode(modes, core.ReadWriteOncePod) {
|
|
||||||
modesStr = append(modesStr, "RWOP")
|
|
||||||
}
|
|
||||||
return strings.Join(modesStr, ",")
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAccessModesFromString 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)
|
|
||||||
case s == "RWOP":
|
|
||||||
accessModes = append(accessModes, core.ReadWriteOncePod)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeSelectorRequirementsAsFieldSelector converts the []NodeSelectorRequirement core type into a struct that implements
|
|
||||||
// fields.Selector.
|
|
||||||
func NodeSelectorRequirementsAsFieldSelector(nsm []core.NodeSelectorRequirement) (fields.Selector, error) {
|
|
||||||
if len(nsm) == 0 {
|
|
||||||
return fields.Nothing(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
selectors := []fields.Selector{}
|
|
||||||
for _, expr := range nsm {
|
|
||||||
switch expr.Operator {
|
|
||||||
case core.NodeSelectorOpIn:
|
|
||||||
if len(expr.Values) != 1 {
|
|
||||||
return nil, fmt.Errorf("unexpected number of value (%d) for node field selector operator %q",
|
|
||||||
len(expr.Values), expr.Operator)
|
|
||||||
}
|
|
||||||
selectors = append(selectors, fields.OneTermEqualSelector(expr.Key, expr.Values[0]))
|
|
||||||
|
|
||||||
case core.NodeSelectorOpNotIn:
|
|
||||||
if len(expr.Values) != 1 {
|
|
||||||
return nil, fmt.Errorf("unexpected number of value (%d) for node field selector operator %q",
|
|
||||||
len(expr.Values), expr.Operator)
|
|
||||||
}
|
|
||||||
selectors = append(selectors, fields.OneTermNotEqualSelector(expr.Key, expr.Values[0]))
|
|
||||||
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("%q is not a valid node field selector operator", expr.Operator)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return fields.AndSelectors(selectors...), 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
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
// toContainerResourcesSet returns a set of resources names in container resource requirements
|
|
||||||
func toContainerResourcesSet(ctr *core.Container) sets.String {
|
|
||||||
resourceNames := toResourceNames(ctr.Resources.Requests)
|
|
||||||
resourceNames = append(resourceNames, toResourceNames(ctr.Resources.Limits)...)
|
|
||||||
return toSet(resourceNames)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ToPodResourcesSet returns a set of resource names in all containers in a pod.
|
|
||||||
func ToPodResourcesSet(podSpec *core.PodSpec) sets.String {
|
|
||||||
result := sets.NewString()
|
|
||||||
for i := range podSpec.InitContainers {
|
|
||||||
result = result.Union(toContainerResourcesSet(&podSpec.InitContainers[i]))
|
|
||||||
}
|
|
||||||
for i := range podSpec.Containers {
|
|
||||||
result = result.Union(toContainerResourcesSet(&podSpec.Containers[i]))
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetDeletionCostFromPodAnnotations returns the integer value of pod-deletion-cost. Returns 0
|
|
||||||
// if not set or the value is invalid.
|
|
||||||
func GetDeletionCostFromPodAnnotations(annotations map[string]string) (int32, error) {
|
|
||||||
if value, exist := annotations[core.PodDeletionCost]; exist {
|
|
||||||
// values that start with plus sign (e.g, "+10") or leading zeros (e.g., "008") are not valid.
|
|
||||||
if !validFirstDigit(value) {
|
|
||||||
return 0, fmt.Errorf("invalid value %q", value)
|
|
||||||
}
|
|
||||||
|
|
||||||
i, err := strconv.ParseInt(value, 10, 32)
|
|
||||||
if err != nil {
|
|
||||||
// make sure we default to 0 on error.
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return int32(i), nil
|
|
||||||
}
|
|
||||||
return 0, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func validFirstDigit(str string) bool {
|
|
||||||
if len(str) == 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return str[0] == '-' || (str[0] == '0' && str == "0") || (str[0] >= '1' && str[0] <= '9')
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
/*
|
|
||||||
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{})
|
|
||||||
|
|
||||||
// MarshalJSON panics to prevent marshalling of internal structs
|
|
||||||
func (AvoidPods) MarshalJSON() ([]byte, error) { panic("do not marshal internal struct") }
|
|
||||||
|
|
||||||
// UnmarshalJSON panics to prevent unmarshalling of internal structs
|
|
||||||
func (*AvoidPods) UnmarshalJSON([]byte) error { panic("do not unmarshal to internal struct") }
|
|
|
@ -1,37 +0,0 @@
|
||||||
/*
|
|
||||||
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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SetGroupVersionKind sets the API version and kind of the object reference
|
|
||||||
func (obj *ObjectReference) SetGroupVersionKind(gvk schema.GroupVersionKind) {
|
|
||||||
obj.APIVersion, obj.Kind = gvk.ToAPIVersionAndKind()
|
|
||||||
}
|
|
||||||
|
|
||||||
// GroupVersionKind returns the API version and kind of the object reference
|
|
||||||
func (obj *ObjectReference) GroupVersionKind() schema.GroupVersionKind {
|
|
||||||
return schema.FromAPIVersionAndKind(obj.APIVersion, obj.Kind)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetObjectKind returns the kind of object reference
|
|
||||||
func (obj *ObjectReference) GetObjectKind() schema.ObjectKind { return obj }
|
|
|
@ -1,102 +0,0 @@
|
||||||
/*
|
|
||||||
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 object to register various known types
|
|
||||||
SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
|
|
||||||
|
|
||||||
// AddToScheme represents a func that can be used to apply all the registered
|
|
||||||
// funcs in a scheme
|
|
||||||
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{},
|
|
||||||
&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
|
|
||||||
}
|
|
|
@ -1,58 +0,0 @@
|
||||||
/*
|
|
||||||
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 (rn ResourceName) String() string {
|
|
||||||
return string(rn)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CPU returns the CPU limit if specified.
|
|
||||||
func (rl *ResourceList) CPU() *resource.Quantity {
|
|
||||||
return rl.Name(ResourceCPU, resource.DecimalSI)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Memory returns the Memory limit if specified.
|
|
||||||
func (rl *ResourceList) Memory() *resource.Quantity {
|
|
||||||
return rl.Name(ResourceMemory, resource.BinarySI)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Storage returns the Storage limit if specified.
|
|
||||||
func (rl *ResourceList) Storage() *resource.Quantity {
|
|
||||||
return rl.Name(ResourceStorage, resource.BinarySI)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pods returns the list of pods
|
|
||||||
func (rl *ResourceList) Pods() *resource.Quantity {
|
|
||||||
return rl.Name(ResourcePods, resource.DecimalSI)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StorageEphemeral returns the list of ephemeral storage volumes, if any
|
|
||||||
func (rl *ResourceList) StorageEphemeral() *resource.Quantity {
|
|
||||||
return rl.Name(ResourceEphemeralStorage, resource.BinarySI)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Name returns the resource with name if specified, otherwise it returns a nil quantity with default format.
|
|
||||||
func (rl *ResourceList) Name(name ResourceName, defaultFormat resource.Format) *resource.Quantity {
|
|
||||||
if val, ok := (*rl)[name]; ok {
|
|
||||||
return &val
|
|
||||||
}
|
|
||||||
return &resource.Quantity{Format: defaultFormat}
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
/*
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
// ToString converts taint struct to string in format '<key>=<value>:<effect>', '<key>=<value>:', '<key>:<effect>', or '<key>'.
|
|
||||||
func (t *Taint) ToString() string {
|
|
||||||
if len(t.Effect) == 0 {
|
|
||||||
if len(t.Value) == 0 {
|
|
||||||
return fmt.Sprintf("%v", t.Key)
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%v=%v:", t.Key, t.Value)
|
|
||||||
}
|
|
||||||
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)
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
/*
|
|
||||||
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
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,372 +0,0 @@
|
||||||
/*
|
|
||||||
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 (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
v1 "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/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 IsNativeResource(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
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsPrefixedNativeResource returns true if the resource name is in the
|
|
||||||
// *kubernetes.io/ namespace.
|
|
||||||
func IsPrefixedNativeResource(name v1.ResourceName) bool {
|
|
||||||
return strings.Contains(string(name), v1.ResourceDefaultNamespacePrefix)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsNativeResource returns true if the resource name is in the
|
|
||||||
// *kubernetes.io/ namespace. Partially-qualified (unprefixed) names are
|
|
||||||
// implicitly in the kubernetes.io/ namespace.
|
|
||||||
func IsNativeResource(name v1.ResourceName) bool {
|
|
||||||
return !strings.Contains(string(name), "/") ||
|
|
||||||
IsPrefixedNativeResource(name)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 an invalid hugepage name", name)
|
|
||||||
}
|
|
||||||
pageSize := strings.TrimPrefix(string(name), v1.ResourceHugePagesPrefix)
|
|
||||||
return resource.ParseQuantity(pageSize)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HugePageUnitSizeFromByteSize returns hugepage size has the format.
|
|
||||||
// `size` must be guaranteed to divisible into the largest units that can be expressed.
|
|
||||||
// <size><unit-prefix>B (1024 = "1KB", 1048576 = "1MB", etc).
|
|
||||||
func HugePageUnitSizeFromByteSize(size int64) (string, error) {
|
|
||||||
// hugePageSizeUnitList is borrowed from opencontainers/runc/libcontainer/cgroups/utils.go
|
|
||||||
var hugePageSizeUnitList = []string{"B", "KB", "MB", "GB", "TB", "PB"}
|
|
||||||
idx := 0
|
|
||||||
len := len(hugePageSizeUnitList) - 1
|
|
||||||
for size%1024 == 0 && idx < len {
|
|
||||||
size /= 1024
|
|
||||||
idx++
|
|
||||||
}
|
|
||||||
if size > 1024 && idx < len {
|
|
||||||
return "", fmt.Errorf("size: %d%s must be guaranteed to divisible into the largest units", size, hugePageSizeUnitList[idx])
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%d%s", size, hugePageSizeUnitList[idx]), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsHugePageMedium returns true if the volume medium is in 'HugePages[-size]' format
|
|
||||||
func IsHugePageMedium(medium v1.StorageMedium) bool {
|
|
||||||
if medium == v1.StorageMediumHugePages {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return strings.HasPrefix(string(medium), string(v1.StorageMediumHugePagesPrefix))
|
|
||||||
}
|
|
||||||
|
|
||||||
// HugePageSizeFromMedium returns the page size for the specified huge page medium.
|
|
||||||
// If the specified input is not a valid huge page medium an error is returned.
|
|
||||||
func HugePageSizeFromMedium(medium v1.StorageMedium) (resource.Quantity, error) {
|
|
||||||
if !IsHugePageMedium(medium) {
|
|
||||||
return resource.Quantity{}, fmt.Errorf("medium: %s is not a hugepage medium", medium)
|
|
||||||
}
|
|
||||||
if medium == v1.StorageMediumHugePages {
|
|
||||||
return resource.Quantity{}, fmt.Errorf("medium: %s doesn't have size information", medium)
|
|
||||||
}
|
|
||||||
pageSize := strings.TrimPrefix(string(medium), string(v1.StorageMediumHugePagesPrefix))
|
|
||||||
return resource.ParseQuantity(pageSize)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsOvercommitAllowed returns true if the resource is in the default
|
|
||||||
// namespace and is not hugepages.
|
|
||||||
func IsOvercommitAllowed(name v1.ResourceName) bool {
|
|
||||||
return IsNativeResource(name) &&
|
|
||||||
!IsHugePageResourceName(name)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsAttachableVolumeResourceName returns true when the resource name is prefixed in attachable volume
|
|
||||||
func IsAttachableVolumeResourceName(name v1.ResourceName) bool {
|
|
||||||
return strings.HasPrefix(string(name), v1.ResourceAttachableVolumesPrefix)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsServiceIPSet 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 != ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// LoadBalancerStatusEqual evaluates the given load balancers' ingress IP addresses
|
|
||||||
// and hostnames and returns true if equal or false if otherwise
|
|
||||||
// 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
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAccessModesAsString returns a string representation of an array of access modes.
|
|
||||||
// modes, when present, are always in the same order: RWO,ROX,RWX,RWOP.
|
|
||||||
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")
|
|
||||||
}
|
|
||||||
if ContainsAccessMode(modes, v1.ReadWriteOncePod) {
|
|
||||||
modesStr = append(modesStr, "RWOP")
|
|
||||||
}
|
|
||||||
return strings.Join(modesStr, ",")
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAccessModesFromString 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)
|
|
||||||
case s == "RWOP":
|
|
||||||
accessModes = append(accessModes, v1.ReadWriteOncePod)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeSelectorRequirementKeysExistInNodeSelectorTerms checks if a NodeSelectorTerm with key is already specified in terms
|
|
||||||
func NodeSelectorRequirementKeysExistInNodeSelectorTerms(reqs []v1.NodeSelectorRequirement, terms []v1.NodeSelectorTerm) bool {
|
|
||||||
for _, req := range reqs {
|
|
||||||
for _, term := range terms {
|
|
||||||
for _, r := range term.MatchExpressions {
|
|
||||||
if r.Key == req.Key {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// TopologySelectorRequirementsAsSelector converts the []TopologySelectorLabelRequirement api type into a struct
|
|
||||||
// that implements labels.Selector.
|
|
||||||
func TopologySelectorRequirementsAsSelector(tsm []v1.TopologySelectorLabelRequirement) (labels.Selector, error) {
|
|
||||||
if len(tsm) == 0 {
|
|
||||||
return labels.Nothing(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
selector := labels.NewSelector()
|
|
||||||
for _, expr := range tsm {
|
|
||||||
r, err := labels.NewRequirement(expr.Key, selection.In, expr.Values)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
selector = selector.Add(*r)
|
|
||||||
}
|
|
||||||
|
|
||||||
return selector, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MatchTopologySelectorTerms checks whether given labels match topology selector terms in ORed;
|
|
||||||
// nil or empty term matches no objects; while empty term list matches all objects.
|
|
||||||
func MatchTopologySelectorTerms(topologySelectorTerms []v1.TopologySelectorTerm, lbls labels.Set) bool {
|
|
||||||
if len(topologySelectorTerms) == 0 {
|
|
||||||
// empty term list matches all objects
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, req := range topologySelectorTerms {
|
|
||||||
// nil or empty term selects no objects
|
|
||||||
if len(req.MatchLabelExpressions) == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
labelSelector, err := TopologySelectorRequirementsAsSelector(req.MatchLabelExpressions)
|
|
||||||
if err != nil || !labelSelector.Matches(lbls) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetMatchingTolerations 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
|
|
||||||
}
|
|
||||||
|
|
||||||
// ScopedResourceSelectorRequirementsAsSelector converts the ScopedResourceSelectorRequirement api type into a struct that implements
|
|
||||||
// labels.Selector.
|
|
||||||
func ScopedResourceSelectorRequirementsAsSelector(ssr v1.ScopedResourceSelectorRequirement) (labels.Selector, error) {
|
|
||||||
selector := labels.NewSelector()
|
|
||||||
var op selection.Operator
|
|
||||||
switch ssr.Operator {
|
|
||||||
case v1.ScopeSelectorOpIn:
|
|
||||||
op = selection.In
|
|
||||||
case v1.ScopeSelectorOpNotIn:
|
|
||||||
op = selection.NotIn
|
|
||||||
case v1.ScopeSelectorOpExists:
|
|
||||||
op = selection.Exists
|
|
||||||
case v1.ScopeSelectorOpDoesNotExist:
|
|
||||||
op = selection.DoesNotExist
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("%q is not a valid scope selector operator", ssr.Operator)
|
|
||||||
}
|
|
||||||
r, err := labels.NewRequirement(string(ssr.ScopeName), op, ssr.Values)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
selector = selector.Add(*r)
|
|
||||||
return selector, nil
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,4 +0,0 @@
|
||||||
# See the OWNERS docs at https://go.k8s.io/owners
|
|
||||||
|
|
||||||
approvers:
|
|
||||||
- feature-approvers
|
|
|
@ -1,934 +0,0 @@
|
||||||
/*
|
|
||||||
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 features
|
|
||||||
|
|
||||||
import (
|
|
||||||
"k8s.io/apimachinery/pkg/util/runtime"
|
|
||||||
genericfeatures "k8s.io/apiserver/pkg/features"
|
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
"k8s.io/component-base/featuregate"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Every feature gate should add method here following this template:
|
|
||||||
//
|
|
||||||
// // owner: @username
|
|
||||||
// // kep: http://kep.k8s.io/NNN
|
|
||||||
// // alpha: v1.X
|
|
||||||
// MyFeature featuregate.Feature = "MyFeature"
|
|
||||||
|
|
||||||
// owner: @tallclair
|
|
||||||
// beta: v1.4
|
|
||||||
AppArmor featuregate.Feature = "AppArmor"
|
|
||||||
|
|
||||||
// owner: @mtaufen
|
|
||||||
// alpha: v1.4
|
|
||||||
// beta: v1.11
|
|
||||||
// deprecated: 1.22
|
|
||||||
DynamicKubeletConfig featuregate.Feature = "DynamicKubeletConfig"
|
|
||||||
|
|
||||||
// owner: @pweil-
|
|
||||||
// alpha: v1.5
|
|
||||||
//
|
|
||||||
// Default userns=host for containers that are using other host namespaces, host mounts, the pod
|
|
||||||
// contains a privileged container, or specific non-namespaced capabilities (MKNOD, SYS_MODULE,
|
|
||||||
// SYS_TIME). This should only be enabled if user namespace remapping is enabled in the docker daemon.
|
|
||||||
ExperimentalHostUserNamespaceDefaultingGate featuregate.Feature = "ExperimentalHostUserNamespaceDefaulting"
|
|
||||||
|
|
||||||
// owner: @jiayingz
|
|
||||||
// beta: v1.10
|
|
||||||
//
|
|
||||||
// Enables support for Device Plugins
|
|
||||||
DevicePlugins featuregate.Feature = "DevicePlugins"
|
|
||||||
|
|
||||||
// owner: @dxist
|
|
||||||
// alpha: v1.16
|
|
||||||
//
|
|
||||||
// Enables support of HPA scaling to zero pods when an object or custom metric is configured.
|
|
||||||
HPAScaleToZero featuregate.Feature = "HPAScaleToZero"
|
|
||||||
|
|
||||||
// owner: @mikedanese
|
|
||||||
// alpha: v1.7
|
|
||||||
// beta: v1.12
|
|
||||||
//
|
|
||||||
// Gets a server certificate for the kubelet from the Certificate Signing
|
|
||||||
// Request API instead of generating one self signed and auto rotates the
|
|
||||||
// certificate as expiration approaches.
|
|
||||||
RotateKubeletServerCertificate featuregate.Feature = "RotateKubeletServerCertificate"
|
|
||||||
|
|
||||||
// owner: @jinxu
|
|
||||||
// beta: v1.10
|
|
||||||
//
|
|
||||||
// New local storage types to support local storage capacity isolation
|
|
||||||
LocalStorageCapacityIsolation featuregate.Feature = "LocalStorageCapacityIsolation"
|
|
||||||
|
|
||||||
// owner: @gnufied
|
|
||||||
// beta: v1.11
|
|
||||||
// Ability to Expand persistent volumes
|
|
||||||
ExpandPersistentVolumes featuregate.Feature = "ExpandPersistentVolumes"
|
|
||||||
|
|
||||||
// owner: @mlmhl
|
|
||||||
// beta: v1.15
|
|
||||||
// Ability to expand persistent volumes' file system without unmounting volumes.
|
|
||||||
ExpandInUsePersistentVolumes featuregate.Feature = "ExpandInUsePersistentVolumes"
|
|
||||||
|
|
||||||
// owner: @gnufied
|
|
||||||
// alpha: v1.14
|
|
||||||
// beta: v1.16
|
|
||||||
// Ability to expand CSI volumes
|
|
||||||
ExpandCSIVolumes featuregate.Feature = "ExpandCSIVolumes"
|
|
||||||
|
|
||||||
// owner: @verb
|
|
||||||
// alpha: v1.16
|
|
||||||
//
|
|
||||||
// Allows running an ephemeral container in pod namespaces to troubleshoot a running pod.
|
|
||||||
EphemeralContainers featuregate.Feature = "EphemeralContainers"
|
|
||||||
|
|
||||||
// owner: @sjenning
|
|
||||||
// alpha: v1.11
|
|
||||||
//
|
|
||||||
// Allows resource reservations at the QoS level preventing pods at lower QoS levels from
|
|
||||||
// bursting into resources requested at higher QoS levels (memory only for now)
|
|
||||||
QOSReserved featuregate.Feature = "QOSReserved"
|
|
||||||
|
|
||||||
// owner: @ConnorDoyle
|
|
||||||
// alpha: v1.8
|
|
||||||
// beta: v1.10
|
|
||||||
//
|
|
||||||
// Alternative container-level CPU affinity policies.
|
|
||||||
CPUManager featuregate.Feature = "CPUManager"
|
|
||||||
|
|
||||||
// owner: @szuecs
|
|
||||||
// alpha: v1.12
|
|
||||||
//
|
|
||||||
// Enable nodes to change CPUCFSQuotaPeriod
|
|
||||||
CPUCFSQuotaPeriod featuregate.Feature = "CustomCPUCFSQuotaPeriod"
|
|
||||||
|
|
||||||
// owner: @lmdaly
|
|
||||||
// alpha: v1.16
|
|
||||||
// beta: v1.18
|
|
||||||
//
|
|
||||||
// Enable resource managers to make NUMA aligned decisions
|
|
||||||
TopologyManager featuregate.Feature = "TopologyManager"
|
|
||||||
|
|
||||||
// owner: @cynepco3hahue(alukiano) @cezaryzukowski @k-wiatrzyk
|
|
||||||
// alpha: v1.21
|
|
||||||
// beta: v1.22
|
|
||||||
|
|
||||||
// Allows setting memory affinity for a container based on NUMA topology
|
|
||||||
MemoryManager featuregate.Feature = "MemoryManager"
|
|
||||||
|
|
||||||
// owner: @sjenning
|
|
||||||
// alpha: v1.4
|
|
||||||
// beta: v1.11
|
|
||||||
// ga: v1.21
|
|
||||||
//
|
|
||||||
// Enable pods to set sysctls on a pod
|
|
||||||
Sysctls featuregate.Feature = "Sysctls"
|
|
||||||
|
|
||||||
// owner: @pospispa
|
|
||||||
// GA: v1.11
|
|
||||||
//
|
|
||||||
// Postpone deletion of a PV or a PVC when they are being used
|
|
||||||
StorageObjectInUseProtection featuregate.Feature = "StorageObjectInUseProtection"
|
|
||||||
|
|
||||||
// owner: @dims, @derekwaynecarr
|
|
||||||
// alpha: v1.10
|
|
||||||
// beta: v1.14
|
|
||||||
// GA: v1.20
|
|
||||||
//
|
|
||||||
// Implement support for limiting pids in pods
|
|
||||||
SupportPodPidsLimit featuregate.Feature = "SupportPodPidsLimit"
|
|
||||||
|
|
||||||
// owner: @mikedanese
|
|
||||||
// alpha: v1.13
|
|
||||||
// beta: v1.21
|
|
||||||
// ga: v1.22
|
|
||||||
//
|
|
||||||
// Migrate ServiceAccount volumes to use a projected volume consisting of a
|
|
||||||
// ServiceAccountTokenVolumeProjection. This feature adds new required flags
|
|
||||||
// to the API server.
|
|
||||||
BoundServiceAccountTokenVolume featuregate.Feature = "BoundServiceAccountTokenVolume"
|
|
||||||
|
|
||||||
// owner: @mtaufen
|
|
||||||
// alpha: v1.18
|
|
||||||
// beta: v1.20
|
|
||||||
// stable: v1.21
|
|
||||||
//
|
|
||||||
// Enable OIDC discovery endpoints (issuer and JWKS URLs) for the service
|
|
||||||
// account issuer in the API server.
|
|
||||||
// Note these endpoints serve minimally-compliant discovery docs that are
|
|
||||||
// intended to be used for service account token verification.
|
|
||||||
ServiceAccountIssuerDiscovery featuregate.Feature = "ServiceAccountIssuerDiscovery"
|
|
||||||
|
|
||||||
// owner: @saad-ali
|
|
||||||
// ga: v1.10
|
|
||||||
//
|
|
||||||
// Allow mounting a subpath of a volume in a container
|
|
||||||
// Do not remove this feature gate even though it's GA
|
|
||||||
VolumeSubpath featuregate.Feature = "VolumeSubpath"
|
|
||||||
|
|
||||||
// owner: @pohly
|
|
||||||
// alpha: v1.14
|
|
||||||
// beta: v1.16
|
|
||||||
//
|
|
||||||
// Enables CSI Inline volumes support for pods
|
|
||||||
CSIInlineVolume featuregate.Feature = "CSIInlineVolume"
|
|
||||||
|
|
||||||
// owner: @pohly
|
|
||||||
// alpha: v1.19
|
|
||||||
// beta: v1.21
|
|
||||||
//
|
|
||||||
// Enables tracking of available storage capacity that CSI drivers provide.
|
|
||||||
CSIStorageCapacity featuregate.Feature = "CSIStorageCapacity"
|
|
||||||
|
|
||||||
// owner: @alculquicondor
|
|
||||||
// beta: v1.20
|
|
||||||
//
|
|
||||||
// Enables the use of PodTopologySpread scheduling plugin to do default
|
|
||||||
// spreading and disables legacy SelectorSpread plugin.
|
|
||||||
DefaultPodTopologySpread featuregate.Feature = "DefaultPodTopologySpread"
|
|
||||||
|
|
||||||
// owner: @pohly
|
|
||||||
// alpha: v1.19
|
|
||||||
// beta: v1.21
|
|
||||||
//
|
|
||||||
// Enables generic ephemeral inline volume support for pods
|
|
||||||
GenericEphemeralVolume featuregate.Feature = "GenericEphemeralVolume"
|
|
||||||
|
|
||||||
// owner: @chendave
|
|
||||||
// alpha: v1.21
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// PreferNominatedNode tells scheduler whether the nominated node will be checked first before looping
|
|
||||||
// all the rest of nodes in the cluster.
|
|
||||||
// Enabling this feature also implies the preemptor pod might not be dispatched to the best candidate in
|
|
||||||
// some corner case, e.g. another node releases enough resources after the nominated node has been set
|
|
||||||
// and hence is the best candidate instead.
|
|
||||||
PreferNominatedNode featuregate.Feature = "PreferNominatedNode"
|
|
||||||
|
|
||||||
// owner: @tallclair
|
|
||||||
// alpha: v1.12
|
|
||||||
// beta: v1.14
|
|
||||||
// GA: v1.20
|
|
||||||
//
|
|
||||||
// Enables RuntimeClass, for selecting between multiple runtimes to run a pod.
|
|
||||||
RuntimeClass featuregate.Feature = "RuntimeClass"
|
|
||||||
|
|
||||||
// owner: @mtaufen
|
|
||||||
// alpha: v1.12
|
|
||||||
// beta: v1.14
|
|
||||||
// GA: v1.17
|
|
||||||
//
|
|
||||||
// Kubelet uses the new Lease API to report node heartbeats,
|
|
||||||
// (Kube) Node Lifecycle Controller uses these heartbeats as a node health signal.
|
|
||||||
NodeLease featuregate.Feature = "NodeLease"
|
|
||||||
|
|
||||||
// owner: @rikatz
|
|
||||||
// kep: http://kep.k8s.io/2079
|
|
||||||
// alpha: v1.21
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// Enables the endPort field in NetworkPolicy to enable a Port Range behavior in Network Policies.
|
|
||||||
NetworkPolicyEndPort featuregate.Feature = "NetworkPolicyEndPort"
|
|
||||||
|
|
||||||
// owner: @jessfraz
|
|
||||||
// alpha: v1.12
|
|
||||||
//
|
|
||||||
// Enables control over ProcMountType for containers.
|
|
||||||
ProcMountType featuregate.Feature = "ProcMountType"
|
|
||||||
|
|
||||||
// owner: @janetkuo
|
|
||||||
// alpha: v1.12
|
|
||||||
//
|
|
||||||
// Allow TTL controller to clean up Pods and Jobs after they finish.
|
|
||||||
TTLAfterFinished featuregate.Feature = "TTLAfterFinished"
|
|
||||||
|
|
||||||
// owner: @alculquicondor
|
|
||||||
// alpha: v1.21
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// Allows Job controller to manage Pod completions per completion index.
|
|
||||||
IndexedJob featuregate.Feature = "IndexedJob"
|
|
||||||
|
|
||||||
// owner: @alculquicondor
|
|
||||||
// alpha: v1.22
|
|
||||||
//
|
|
||||||
// Track Job completion without relying on Pod remaining in the cluster
|
|
||||||
// indefinitely. Pod finalizers, in addition to a field in the Job status
|
|
||||||
// allow the Job controller to keep track of Pods that it didn't account for
|
|
||||||
// yet.
|
|
||||||
JobTrackingWithFinalizers featuregate.Feature = "JobTrackingWithFinalizers"
|
|
||||||
|
|
||||||
// owner: @dashpole
|
|
||||||
// alpha: v1.13
|
|
||||||
// beta: v1.15
|
|
||||||
//
|
|
||||||
// Enables the kubelet's pod resources grpc endpoint
|
|
||||||
KubeletPodResources featuregate.Feature = "KubeletPodResources"
|
|
||||||
|
|
||||||
// owner: @davidz627
|
|
||||||
// alpha: v1.14
|
|
||||||
// beta: v1.17
|
|
||||||
//
|
|
||||||
// Enables the in-tree storage to CSI Plugin migration feature.
|
|
||||||
CSIMigration featuregate.Feature = "CSIMigration"
|
|
||||||
|
|
||||||
// owner: @davidz627
|
|
||||||
// alpha: v1.14
|
|
||||||
// beta: v1.17
|
|
||||||
//
|
|
||||||
// Enables the GCE PD in-tree driver to GCE CSI Driver migration feature.
|
|
||||||
CSIMigrationGCE featuregate.Feature = "CSIMigrationGCE"
|
|
||||||
|
|
||||||
// owner: @Jiawei0227
|
|
||||||
// alpha: v1.21
|
|
||||||
//
|
|
||||||
// Disables the GCE PD in-tree driver.
|
|
||||||
InTreePluginGCEUnregister featuregate.Feature = "InTreePluginGCEUnregister"
|
|
||||||
|
|
||||||
// owner: @leakingtapan
|
|
||||||
// alpha: v1.14
|
|
||||||
// beta: v1.17
|
|
||||||
//
|
|
||||||
// Enables the AWS EBS in-tree driver to AWS EBS CSI Driver migration feature.
|
|
||||||
CSIMigrationAWS featuregate.Feature = "CSIMigrationAWS"
|
|
||||||
|
|
||||||
// owner: @leakingtapan
|
|
||||||
// alpha: v1.21
|
|
||||||
//
|
|
||||||
// Disables the AWS EBS in-tree driver.
|
|
||||||
InTreePluginAWSUnregister featuregate.Feature = "InTreePluginAWSUnregister"
|
|
||||||
|
|
||||||
// owner: @andyzhangx
|
|
||||||
// alpha: v1.15
|
|
||||||
// beta: v1.19
|
|
||||||
//
|
|
||||||
// Enables the Azure Disk in-tree driver to Azure Disk Driver migration feature.
|
|
||||||
CSIMigrationAzureDisk featuregate.Feature = "CSIMigrationAzureDisk"
|
|
||||||
|
|
||||||
// owner: @andyzhangx
|
|
||||||
// alpha: v1.21
|
|
||||||
//
|
|
||||||
// Disables the Azure Disk in-tree driver.
|
|
||||||
InTreePluginAzureDiskUnregister featuregate.Feature = "InTreePluginAzureDiskUnregister"
|
|
||||||
|
|
||||||
// owner: @andyzhangx
|
|
||||||
// alpha: v1.15
|
|
||||||
// beta: v1.21
|
|
||||||
//
|
|
||||||
// Enables the Azure File in-tree driver to Azure File Driver migration feature.
|
|
||||||
CSIMigrationAzureFile featuregate.Feature = "CSIMigrationAzureFile"
|
|
||||||
|
|
||||||
// owner: @andyzhangx
|
|
||||||
// alpha: v1.21
|
|
||||||
//
|
|
||||||
// Disables the Azure File in-tree driver.
|
|
||||||
InTreePluginAzureFileUnregister featuregate.Feature = "InTreePluginAzureFileUnregister"
|
|
||||||
|
|
||||||
// owner: @divyenpatel
|
|
||||||
// beta: v1.19 (requires: vSphere vCenter/ESXi Version: 7.0u1, HW Version: VM version 15)
|
|
||||||
//
|
|
||||||
// Enables the vSphere in-tree driver to vSphere CSI Driver migration feature.
|
|
||||||
CSIMigrationvSphere featuregate.Feature = "CSIMigrationvSphere"
|
|
||||||
|
|
||||||
// owner: @divyenpatel
|
|
||||||
// alpha: v1.21
|
|
||||||
//
|
|
||||||
// Disables the vSphere in-tree driver.
|
|
||||||
InTreePluginvSphereUnregister featuregate.Feature = "InTreePluginvSphereUnregister"
|
|
||||||
|
|
||||||
// owner: @adisky
|
|
||||||
// alpha: v1.14
|
|
||||||
// beta: v1.18
|
|
||||||
//
|
|
||||||
// Enables the OpenStack Cinder in-tree driver to OpenStack Cinder CSI Driver migration feature.
|
|
||||||
CSIMigrationOpenStack featuregate.Feature = "CSIMigrationOpenStack"
|
|
||||||
|
|
||||||
// owner: @adisky
|
|
||||||
// alpha: v1.21
|
|
||||||
//
|
|
||||||
// Disables the OpenStack Cinder in-tree driver.
|
|
||||||
InTreePluginOpenStackUnregister featuregate.Feature = "InTreePluginOpenStackUnregister"
|
|
||||||
|
|
||||||
// owner: @huffmanca
|
|
||||||
// alpha: v1.19
|
|
||||||
// beta: v1.20
|
|
||||||
//
|
|
||||||
// Determines if a CSI Driver supports applying fsGroup.
|
|
||||||
CSIVolumeFSGroupPolicy featuregate.Feature = "CSIVolumeFSGroupPolicy"
|
|
||||||
|
|
||||||
// owner: @gnufied
|
|
||||||
// alpha: v1.18
|
|
||||||
// beta: v1.20
|
|
||||||
// Allows user to configure volume permission change policy for fsGroups when mounting
|
|
||||||
// a volume in a Pod.
|
|
||||||
ConfigurableFSGroupPolicy featuregate.Feature = "ConfigurableFSGroupPolicy"
|
|
||||||
|
|
||||||
// owner: @gnufied, @verult
|
|
||||||
// alpha: v1.22
|
|
||||||
// If supported by the CSI driver, delegates the role of applying FSGroup to
|
|
||||||
// the driver by passing FSGroup through the NodeStageVolume and
|
|
||||||
// NodePublishVolume calls.
|
|
||||||
DelegateFSGroupToCSIDriver featuregate.Feature = "DelegateFSGroupToCSIDriver"
|
|
||||||
|
|
||||||
// owner: @RobertKrawitz, @derekwaynecarr
|
|
||||||
// beta: v1.15
|
|
||||||
// GA: v1.20
|
|
||||||
//
|
|
||||||
// Implement support for limiting pids in nodes
|
|
||||||
SupportNodePidsLimit featuregate.Feature = "SupportNodePidsLimit"
|
|
||||||
|
|
||||||
// owner: @RobertKrawitz
|
|
||||||
// alpha: v1.15
|
|
||||||
//
|
|
||||||
// Allow use of filesystems for ephemeral storage monitoring.
|
|
||||||
// Only applies if LocalStorageCapacityIsolation is set.
|
|
||||||
LocalStorageCapacityIsolationFSQuotaMonitoring featuregate.Feature = "LocalStorageCapacityIsolationFSQuotaMonitoring"
|
|
||||||
|
|
||||||
// owner: @denkensk
|
|
||||||
// alpha: v1.15
|
|
||||||
// beta: v1.19
|
|
||||||
//
|
|
||||||
// Enables NonPreempting option for priorityClass and pod.
|
|
||||||
NonPreemptingPriority featuregate.Feature = "NonPreemptingPriority"
|
|
||||||
|
|
||||||
// owner: @egernst
|
|
||||||
// alpha: v1.16
|
|
||||||
// beta: v1.18
|
|
||||||
//
|
|
||||||
// Enables PodOverhead, for accounting pod overheads which are specific to a given RuntimeClass
|
|
||||||
PodOverhead featuregate.Feature = "PodOverhead"
|
|
||||||
|
|
||||||
// owner: @khenidak
|
|
||||||
// kep: http://kep.k8s.io/563
|
|
||||||
// alpha: v1.15
|
|
||||||
// beta: v1.21
|
|
||||||
//
|
|
||||||
// Enables ipv6 dual stack
|
|
||||||
IPv6DualStack featuregate.Feature = "IPv6DualStack"
|
|
||||||
|
|
||||||
// owner: @robscott @freehan
|
|
||||||
// kep: http://kep.k8s.io/752
|
|
||||||
// alpha: v1.16
|
|
||||||
// beta: v1.18
|
|
||||||
// ga: v1.21
|
|
||||||
//
|
|
||||||
// Enable Endpoint Slices for more scalable Service endpoints.
|
|
||||||
EndpointSlice featuregate.Feature = "EndpointSlice"
|
|
||||||
|
|
||||||
// owner: @robscott @freehan
|
|
||||||
// kep: http://kep.k8s.io/752
|
|
||||||
// alpha: v1.18
|
|
||||||
// beta: v1.19
|
|
||||||
// ga: v1.22
|
|
||||||
//
|
|
||||||
// Enable Endpoint Slice consumption by kube-proxy for improved scalability.
|
|
||||||
EndpointSliceProxying featuregate.Feature = "EndpointSliceProxying"
|
|
||||||
|
|
||||||
// owner: @robscott @kumarvin123
|
|
||||||
// kep: http://kep.k8s.io/752
|
|
||||||
// alpha: v1.19
|
|
||||||
// beta: v1.21
|
|
||||||
// ga: v1.22
|
|
||||||
//
|
|
||||||
// Enable Endpoint Slice consumption by kube-proxy in Windows for improved scalability.
|
|
||||||
WindowsEndpointSliceProxying featuregate.Feature = "WindowsEndpointSliceProxying"
|
|
||||||
|
|
||||||
// owner: @matthyx
|
|
||||||
// alpha: v1.16
|
|
||||||
// beta: v1.18
|
|
||||||
// GA: v1.20
|
|
||||||
//
|
|
||||||
// Enables the startupProbe in kubelet worker.
|
|
||||||
StartupProbe featuregate.Feature = "StartupProbe"
|
|
||||||
|
|
||||||
// owner: @deads2k
|
|
||||||
// beta: v1.17
|
|
||||||
// GA: v1.21
|
|
||||||
//
|
|
||||||
// Enables the users to skip TLS verification of kubelets on pod logs requests
|
|
||||||
AllowInsecureBackendProxy featuregate.Feature = "AllowInsecureBackendProxy"
|
|
||||||
|
|
||||||
// owner: @mortent
|
|
||||||
// alpha: v1.3
|
|
||||||
// beta: v1.5
|
|
||||||
//
|
|
||||||
// Enable all logic related to the PodDisruptionBudget API object in policy
|
|
||||||
PodDisruptionBudget featuregate.Feature = "PodDisruptionBudget"
|
|
||||||
|
|
||||||
// owner: @alaypatel07, @soltysh
|
|
||||||
// alpha: v1.20
|
|
||||||
// beta: v1.21
|
|
||||||
// GA: v1.22
|
|
||||||
//
|
|
||||||
// CronJobControllerV2 controls whether the controller manager starts old cronjob
|
|
||||||
// controller or new one which is implemented with informers and delaying queue
|
|
||||||
CronJobControllerV2 featuregate.Feature = "CronJobControllerV2"
|
|
||||||
|
|
||||||
// owner: @smarterclayton
|
|
||||||
// alpha: v1.21
|
|
||||||
// beta: v1.22
|
|
||||||
// DaemonSets allow workloads to maintain availability during update per node
|
|
||||||
DaemonSetUpdateSurge featuregate.Feature = "DaemonSetUpdateSurge"
|
|
||||||
|
|
||||||
// owner: @wojtek-t
|
|
||||||
// alpha: v1.18
|
|
||||||
// beta: v1.19
|
|
||||||
// ga: v1.21
|
|
||||||
//
|
|
||||||
// Enables a feature to make secrets and configmaps data immutable.
|
|
||||||
ImmutableEphemeralVolumes featuregate.Feature = "ImmutableEphemeralVolumes"
|
|
||||||
|
|
||||||
// owner: @bart0sh
|
|
||||||
// alpha: v1.18
|
|
||||||
// beta: v1.19
|
|
||||||
// GA: 1.22
|
|
||||||
//
|
|
||||||
// Enables usage of HugePages-<size> in a volume medium,
|
|
||||||
// e.g. emptyDir:
|
|
||||||
// medium: HugePages-1Gi
|
|
||||||
HugePageStorageMediumSize featuregate.Feature = "HugePageStorageMediumSize"
|
|
||||||
|
|
||||||
// owner: @derekwaynecarr
|
|
||||||
// alpha: v1.20
|
|
||||||
// beta: v1.21 (off by default until 1.22)
|
|
||||||
//
|
|
||||||
// Enables usage of hugepages-<size> in downward API.
|
|
||||||
DownwardAPIHugePages featuregate.Feature = "DownwardAPIHugePages"
|
|
||||||
|
|
||||||
// owner: @bswartz
|
|
||||||
// alpha: v1.18
|
|
||||||
//
|
|
||||||
// Enables usage of any object for volume data source in PVCs
|
|
||||||
AnyVolumeDataSource featuregate.Feature = "AnyVolumeDataSource"
|
|
||||||
|
|
||||||
// owner: @javidiaz
|
|
||||||
// kep: http://kep.k8s.io/1797
|
|
||||||
// alpha: v1.19
|
|
||||||
// beta: v1.20
|
|
||||||
// GA: v1.22
|
|
||||||
//
|
|
||||||
// Allow setting the Fully Qualified Domain Name (FQDN) in the hostname of a Pod. If a Pod does not
|
|
||||||
// have FQDN, this feature has no effect.
|
|
||||||
SetHostnameAsFQDN featuregate.Feature = "SetHostnameAsFQDN"
|
|
||||||
|
|
||||||
// owner: @ksubrmnn
|
|
||||||
// alpha: v1.14
|
|
||||||
// beta: v1.20
|
|
||||||
//
|
|
||||||
// Allows kube-proxy to run in Overlay mode for Windows
|
|
||||||
WinOverlay featuregate.Feature = "WinOverlay"
|
|
||||||
|
|
||||||
// owner: @ksubrmnn
|
|
||||||
// alpha: v1.14
|
|
||||||
//
|
|
||||||
// Allows kube-proxy to create DSR loadbalancers for Windows
|
|
||||||
WinDSR featuregate.Feature = "WinDSR"
|
|
||||||
|
|
||||||
// owner: @RenaudWasTaken @dashpole
|
|
||||||
// alpha: v1.19
|
|
||||||
// beta: v1.20
|
|
||||||
//
|
|
||||||
// Disables Accelerator Metrics Collected by Kubelet
|
|
||||||
DisableAcceleratorUsageMetrics featuregate.Feature = "DisableAcceleratorUsageMetrics"
|
|
||||||
|
|
||||||
// owner: @arjunrn @mwielgus @josephburnett
|
|
||||||
// alpha: v1.20
|
|
||||||
//
|
|
||||||
// Add support for the HPA to scale based on metrics from individual containers
|
|
||||||
// in target pods
|
|
||||||
HPAContainerMetrics featuregate.Feature = "HPAContainerMetrics"
|
|
||||||
|
|
||||||
// owner: @andrewsykim
|
|
||||||
// kep: http://kep.k8s.io/1672
|
|
||||||
// alpha: v1.20
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// Enable Terminating condition in Endpoint Slices.
|
|
||||||
EndpointSliceTerminatingCondition featuregate.Feature = "EndpointSliceTerminatingCondition"
|
|
||||||
|
|
||||||
// owner: @andrewsykim
|
|
||||||
// kep: http://kep.k8s.io/1669
|
|
||||||
// alpha: v1.22
|
|
||||||
//
|
|
||||||
// Enable kube-proxy to handle terminating ednpoints when externalTrafficPolicy=Local
|
|
||||||
ProxyTerminatingEndpoints featuregate.Feature = "ProxyTerminatingEndpoints"
|
|
||||||
|
|
||||||
// owner: @robscott
|
|
||||||
// kep: http://kep.k8s.io/752
|
|
||||||
// alpha: v1.20
|
|
||||||
//
|
|
||||||
// Enable NodeName field on Endpoint Slices.
|
|
||||||
EndpointSliceNodeName featuregate.Feature = "EndpointSliceNodeName"
|
|
||||||
|
|
||||||
// owner: @derekwaynecarr
|
|
||||||
// alpha: v1.20
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// Enables kubelet support to size memory backed volumes
|
|
||||||
SizeMemoryBackedVolumes featuregate.Feature = "SizeMemoryBackedVolumes"
|
|
||||||
|
|
||||||
// owner: @andrewsykim @SergeyKanzhelev
|
|
||||||
// GA: v1.20
|
|
||||||
//
|
|
||||||
// Ensure kubelet respects exec probe timeouts. Feature gate exists in-case existing workloads
|
|
||||||
// may depend on old behavior where exec probe timeouts were ignored.
|
|
||||||
// Lock to default and remove after v1.22 based on user feedback that should be reflected in KEP #1972 update
|
|
||||||
ExecProbeTimeout featuregate.Feature = "ExecProbeTimeout"
|
|
||||||
|
|
||||||
// owner: @andrewsykim
|
|
||||||
// alpha: v1.20
|
|
||||||
//
|
|
||||||
// Enable kubelet exec plugins for image pull credentials.
|
|
||||||
KubeletCredentialProviders featuregate.Feature = "KubeletCredentialProviders"
|
|
||||||
|
|
||||||
// owner: @andrewsykim
|
|
||||||
// alpha: v1.22
|
|
||||||
//
|
|
||||||
// Disable any functionality in kube-apiserver, kube-controller-manager and kubelet related to the `--cloud-provider` component flag.
|
|
||||||
DisableCloudProviders featuregate.Feature = "DisableCloudProviders"
|
|
||||||
|
|
||||||
// owner: @zshihang
|
|
||||||
// alpha: v1.20
|
|
||||||
// beta: v1.21
|
|
||||||
// ga: v1.22
|
|
||||||
//
|
|
||||||
// Enable kubelet to pass pod's service account token to NodePublishVolume
|
|
||||||
// call of CSI driver which is mounting volumes for that pod.
|
|
||||||
CSIServiceAccountToken featuregate.Feature = "CSIServiceAccountToken"
|
|
||||||
|
|
||||||
// owner: @bobbypage
|
|
||||||
// alpha: v1.20
|
|
||||||
// beta: v1.21
|
|
||||||
// Adds support for kubelet to detect node shutdown and gracefully terminate pods prior to the node being shutdown.
|
|
||||||
GracefulNodeShutdown featuregate.Feature = "GracefulNodeShutdown"
|
|
||||||
|
|
||||||
// owner: @andrewsykim @uablrek
|
|
||||||
// kep: http://kep.k8s.io/1864
|
|
||||||
// alpha: v1.20
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// Allows control if NodePorts shall be created for services with "type: LoadBalancer" by defining the spec.AllocateLoadBalancerNodePorts field (bool)
|
|
||||||
ServiceLBNodePortControl featuregate.Feature = "ServiceLBNodePortControl"
|
|
||||||
|
|
||||||
// owner: @janosi
|
|
||||||
// kep: http://kep.k8s.io/1435
|
|
||||||
// alpha: v1.20
|
|
||||||
//
|
|
||||||
// Enables the usage of different protocols in the same Service with type=LoadBalancer
|
|
||||||
MixedProtocolLBService featuregate.Feature = "MixedProtocolLBService"
|
|
||||||
|
|
||||||
// owner: @cofyc
|
|
||||||
// alpha: v1.21
|
|
||||||
VolumeCapacityPriority featuregate.Feature = "VolumeCapacityPriority"
|
|
||||||
|
|
||||||
// owner: @ahg-g
|
|
||||||
// alpha: v1.21
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// Enables controlling pod ranking on replicaset scale-down.
|
|
||||||
PodDeletionCost featuregate.Feature = "PodDeletionCost"
|
|
||||||
|
|
||||||
// owner: @robscott
|
|
||||||
// kep: http://kep.k8s.io/2433
|
|
||||||
// alpha: v1.21
|
|
||||||
//
|
|
||||||
// Enables topology aware hints for EndpointSlices
|
|
||||||
TopologyAwareHints featuregate.Feature = "TopologyAwareHints"
|
|
||||||
|
|
||||||
// owner: @ehashman
|
|
||||||
// alpha: v1.21
|
|
||||||
//
|
|
||||||
// Allows user to override pod-level terminationGracePeriod for probes
|
|
||||||
ProbeTerminationGracePeriod featuregate.Feature = "ProbeTerminationGracePeriod"
|
|
||||||
|
|
||||||
// owner: @ehashman
|
|
||||||
// alpha: v1.22
|
|
||||||
//
|
|
||||||
// Permits kubelet to run with swap enabled
|
|
||||||
NodeSwap featuregate.Feature = "NodeSwap"
|
|
||||||
|
|
||||||
// owner: @ahg-g
|
|
||||||
// alpha: v1.21
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// Allow specifying NamespaceSelector in PodAffinityTerm.
|
|
||||||
PodAffinityNamespaceSelector featuregate.Feature = "PodAffinityNamespaceSelector"
|
|
||||||
|
|
||||||
// owner: @andrewsykim @XudongLiuHarold
|
|
||||||
// kep: http://kep.k8s.io/1959
|
|
||||||
// alpha: v1.21
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// Enable support multiple Service "type: LoadBalancer" implementations in a cluster by specifying LoadBalancerClass
|
|
||||||
ServiceLoadBalancerClass featuregate.Feature = "ServiceLoadBalancerClass"
|
|
||||||
|
|
||||||
// owner: @damemi
|
|
||||||
// alpha: v1.21
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// Enables scaling down replicas via logarithmic comparison of creation/ready timestamps
|
|
||||||
LogarithmicScaleDown featuregate.Feature = "LogarithmicScaleDown"
|
|
||||||
|
|
||||||
// owner: @hbagdi
|
|
||||||
// kep: http://kep.k8s.io/2365
|
|
||||||
// alpha: v1.21
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// Enable Scope and Namespace fields on IngressClassParametersReference.
|
|
||||||
IngressClassNamespacedParams featuregate.Feature = "IngressClassNamespacedParams"
|
|
||||||
|
|
||||||
// owner: @maplain @andrewsykim
|
|
||||||
// kep: http://kep.k8s.io/2086
|
|
||||||
// alpha: v1.21
|
|
||||||
//
|
|
||||||
// Enables node-local routing for Service internal traffic
|
|
||||||
ServiceInternalTrafficPolicy featuregate.Feature = "ServiceInternalTrafficPolicy"
|
|
||||||
|
|
||||||
// owner: @adtac
|
|
||||||
// alpha: v1.21
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// Allows jobs to be created in the suspended state.
|
|
||||||
SuspendJob featuregate.Feature = "SuspendJob"
|
|
||||||
|
|
||||||
// owner: @fromanirh
|
|
||||||
// alpha: v1.21
|
|
||||||
//
|
|
||||||
// Enable POD resources API to return allocatable resources
|
|
||||||
KubeletPodResourcesGetAllocatable featuregate.Feature = "KubeletPodResourcesGetAllocatable"
|
|
||||||
|
|
||||||
// owner: @jayunit100 @abhiraut @rikatz
|
|
||||||
// kep: http://kep.k8s.io/2161
|
|
||||||
// beta: v1.21
|
|
||||||
// ga: v1.22
|
|
||||||
//
|
|
||||||
// Labels all namespaces with a default label "kubernetes.io/metadata.name: <namespaceName>"
|
|
||||||
NamespaceDefaultLabelName featuregate.Feature = "NamespaceDefaultLabelName"
|
|
||||||
|
|
||||||
// owner: @fengzixu
|
|
||||||
// alpha: v1.21
|
|
||||||
//
|
|
||||||
// Enables kubelet to detect CSI volume condition and send the event of the abnormal volume to the corresponding pod that is using it.
|
|
||||||
CSIVolumeHealth featuregate.Feature = "CSIVolumeHealth"
|
|
||||||
|
|
||||||
// owner: @marosset
|
|
||||||
// alpha: v1.22
|
|
||||||
//
|
|
||||||
// Enables support for 'HostProcess' containers on Windows nodes.
|
|
||||||
WindowsHostProcessContainers featuregate.Feature = "WindowsHostProcessContainers"
|
|
||||||
|
|
||||||
// owner: @ravig
|
|
||||||
// alpha: v1.22
|
|
||||||
//
|
|
||||||
// StatefulSetMinReadySeconds allows minReadySeconds to be respected by StatefulSet controller
|
|
||||||
StatefulSetMinReadySeconds featuregate.Feature = "StatefulSetMinReadySeconds"
|
|
||||||
|
|
||||||
// owner: @gjkim42
|
|
||||||
// kep: http://kep.k8s.io/2595
|
|
||||||
// alpha: v1.22
|
|
||||||
//
|
|
||||||
// Enables apiserver and kubelet to allow up to 32 DNSSearchPaths and up to 2048 DNSSearchListChars.
|
|
||||||
ExpandedDNSConfig featuregate.Feature = "ExpandedDNSConfig"
|
|
||||||
|
|
||||||
// owner: @saschagrunert
|
|
||||||
// alpha: v1.22
|
|
||||||
//
|
|
||||||
// Enables the use of `RuntimeDefault` as the default seccomp profile for all workloads.
|
|
||||||
SeccompDefault featuregate.Feature = "SeccompDefault"
|
|
||||||
|
|
||||||
// owner: @liggitt, @tallclair, sig-auth
|
|
||||||
// alpha: v1.22
|
|
||||||
//
|
|
||||||
// Enables the PodSecurity admission plugin
|
|
||||||
PodSecurity featuregate.Feature = "PodSecurity"
|
|
||||||
|
|
||||||
// owner: @chrishenzie
|
|
||||||
// alpha: v1.22
|
|
||||||
//
|
|
||||||
// Enables usage of the ReadWriteOncePod PersistentVolume access mode.
|
|
||||||
ReadWriteOncePod featuregate.Feature = "ReadWriteOncePod"
|
|
||||||
|
|
||||||
// owner: @enj
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// Allows clients to request a duration for certificates issued via the Kubernetes CSR API.
|
|
||||||
CSRDuration featuregate.Feature = "CSRDuration"
|
|
||||||
|
|
||||||
// owner: @AkihiroSuda
|
|
||||||
// alpha: v1.22
|
|
||||||
//
|
|
||||||
// Enables support for running kubelet in a user namespace.
|
|
||||||
// The user namespace has to be created before running kubelet.
|
|
||||||
// All the node components such as CRI need to be running in the same user namespace.
|
|
||||||
KubeletInUserNamespace featuregate.Feature = "KubeletInUserNamespace"
|
|
||||||
|
|
||||||
// owner: @xiaoxubeii
|
|
||||||
// kep: http://kep.k8s.io/2570
|
|
||||||
// alpha: v1.22
|
|
||||||
//
|
|
||||||
// Enables kubelet to support memory QoS with cgroups v2.
|
|
||||||
MemoryQoS featuregate.Feature = "MemoryQoS"
|
|
||||||
|
|
||||||
// owner: @fromanirh
|
|
||||||
// alpha: v1.22
|
|
||||||
//
|
|
||||||
// Allow fine-tuning of cpumanager policies
|
|
||||||
CPUManagerPolicyOptions featuregate.Feature = "CPUManagerPolicyOptions"
|
|
||||||
|
|
||||||
// owner: @jiahuif
|
|
||||||
// alpha: v1.21
|
|
||||||
// beta: v1.22
|
|
||||||
//
|
|
||||||
// Enables Leader Migration for kube-controller-manager and cloud-controller-manager
|
|
||||||
ControllerManagerLeaderMigration featuregate.Feature = "ControllerManagerLeaderMigration"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
runtime.Must(utilfeature.DefaultMutableFeatureGate.Add(defaultKubernetesFeatureGates))
|
|
||||||
}
|
|
||||||
|
|
||||||
// defaultKubernetesFeatureGates consists of all known Kubernetes-specific feature keys.
|
|
||||||
// To add a new feature, define a key for it above and add it here. The features will be
|
|
||||||
// available throughout Kubernetes binaries.
|
|
||||||
var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{
|
|
||||||
AppArmor: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
DynamicKubeletConfig: {Default: false, PreRelease: featuregate.Deprecated}, // feature gate is deprecated in 1.22, remove no early than 1.23
|
|
||||||
ExperimentalHostUserNamespaceDefaultingGate: {Default: false, PreRelease: featuregate.Beta},
|
|
||||||
DevicePlugins: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
RotateKubeletServerCertificate: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
LocalStorageCapacityIsolation: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
Sysctls: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23
|
|
||||||
EphemeralContainers: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
QOSReserved: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
ExpandPersistentVolumes: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
ExpandInUsePersistentVolumes: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
ExpandCSIVolumes: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
CPUManager: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
MemoryManager: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
CPUCFSQuotaPeriod: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
TopologyManager: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
StorageObjectInUseProtection: {Default: true, PreRelease: featuregate.GA},
|
|
||||||
SupportPodPidsLimit: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23
|
|
||||||
SupportNodePidsLimit: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23
|
|
||||||
BoundServiceAccountTokenVolume: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23
|
|
||||||
ServiceAccountIssuerDiscovery: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.22
|
|
||||||
CSIMigration: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
CSIMigrationGCE: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires GCE PD CSI Driver)
|
|
||||||
InTreePluginGCEUnregister: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
CSIMigrationAWS: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires AWS EBS CSI driver)
|
|
||||||
InTreePluginAWSUnregister: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
CSIMigrationAzureDisk: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires Azure Disk CSI driver)
|
|
||||||
InTreePluginAzureDiskUnregister: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
CSIMigrationAzureFile: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires Azure File CSI driver)
|
|
||||||
InTreePluginAzureFileUnregister: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
CSIMigrationvSphere: {Default: false, PreRelease: featuregate.Beta}, // Off by default (requires vSphere CSI driver)
|
|
||||||
InTreePluginvSphereUnregister: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
CSIMigrationOpenStack: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
InTreePluginOpenStackUnregister: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
VolumeSubpath: {Default: true, PreRelease: featuregate.GA},
|
|
||||||
ConfigurableFSGroupPolicy: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
CSIInlineVolume: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
CSIStorageCapacity: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
CSIServiceAccountToken: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23
|
|
||||||
GenericEphemeralVolume: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
CSIVolumeFSGroupPolicy: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
RuntimeClass: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23
|
|
||||||
NodeLease: {Default: true, PreRelease: featuregate.GA, LockToDefault: true},
|
|
||||||
NetworkPolicyEndPort: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
ProcMountType: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
TTLAfterFinished: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
IndexedJob: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
JobTrackingWithFinalizers: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
KubeletPodResources: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
LocalStorageCapacityIsolationFSQuotaMonitoring: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
NonPreemptingPriority: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
PodOverhead: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
IPv6DualStack: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
EndpointSlice: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.25
|
|
||||||
EndpointSliceProxying: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.25
|
|
||||||
EndpointSliceTerminatingCondition: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
ProxyTerminatingEndpoints: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
EndpointSliceNodeName: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, //remove in 1.25
|
|
||||||
WindowsEndpointSliceProxying: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.25
|
|
||||||
StartupProbe: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23
|
|
||||||
AllowInsecureBackendProxy: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23
|
|
||||||
PodDisruptionBudget: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.25
|
|
||||||
CronJobControllerV2: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23
|
|
||||||
DaemonSetUpdateSurge: {Default: true, PreRelease: featuregate.Beta}, // on by default in 1.22
|
|
||||||
ImmutableEphemeralVolumes: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.24
|
|
||||||
HugePageStorageMediumSize: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.23
|
|
||||||
DownwardAPIHugePages: {Default: false, PreRelease: featuregate.Beta}, // on by default in 1.22
|
|
||||||
AnyVolumeDataSource: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
DefaultPodTopologySpread: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
SetHostnameAsFQDN: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, //remove in 1.24
|
|
||||||
WinOverlay: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
WinDSR: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
DisableAcceleratorUsageMetrics: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
HPAContainerMetrics: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
SizeMemoryBackedVolumes: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
ExecProbeTimeout: {Default: true, PreRelease: featuregate.GA}, // lock to default and remove after v1.22 based on KEP #1972 update
|
|
||||||
KubeletCredentialProviders: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
GracefulNodeShutdown: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
ServiceLBNodePortControl: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
MixedProtocolLBService: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
VolumeCapacityPriority: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
PreferNominatedNode: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
ProbeTerminationGracePeriod: {Default: false, PreRelease: featuregate.Beta}, // Default to false in beta 1.22, set to true in 1.24
|
|
||||||
NodeSwap: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
PodDeletionCost: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
TopologyAwareHints: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
PodAffinityNamespaceSelector: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
ServiceLoadBalancerClass: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
IngressClassNamespacedParams: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
ServiceInternalTrafficPolicy: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
LogarithmicScaleDown: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
SuspendJob: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
KubeletPodResourcesGetAllocatable: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
NamespaceDefaultLabelName: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.24
|
|
||||||
CSIVolumeHealth: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
WindowsHostProcessContainers: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
DisableCloudProviders: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
StatefulSetMinReadySeconds: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
ExpandedDNSConfig: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
SeccompDefault: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
PodSecurity: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
ReadWriteOncePod: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
CSRDuration: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
DelegateFSGroupToCSIDriver: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
KubeletInUserNamespace: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
MemoryQoS: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
CPUManagerPolicyOptions: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
ControllerManagerLeaderMigration: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
|
|
||||||
// inherited features from generic apiserver, relisted here to get a conflict if it is changed
|
|
||||||
// unintentionally on either side:
|
|
||||||
genericfeatures.StreamingProxyRedirects: {Default: false, PreRelease: featuregate.Deprecated}, // remove in 1.24
|
|
||||||
genericfeatures.ValidateProxyRedirects: {Default: true, PreRelease: featuregate.Deprecated},
|
|
||||||
genericfeatures.AdvancedAuditing: {Default: true, PreRelease: featuregate.GA},
|
|
||||||
genericfeatures.APIResponseCompression: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
genericfeatures.APIListChunking: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
genericfeatures.DryRun: {Default: true, PreRelease: featuregate.GA},
|
|
||||||
genericfeatures.ServerSideApply: {Default: true, PreRelease: featuregate.GA},
|
|
||||||
genericfeatures.APIPriorityAndFairness: {Default: true, PreRelease: featuregate.Beta},
|
|
||||||
genericfeatures.WarningHeaders: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.24
|
|
||||||
|
|
||||||
// features that enable backwards compatibility but are scheduled to be removed
|
|
||||||
// ...
|
|
||||||
HPAScaleToZero: {Default: false, PreRelease: featuregate.Alpha},
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
/*
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package util
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Clock provides an interface for getting the current time
|
|
||||||
type Clock interface {
|
|
||||||
Now() time.Time
|
|
||||||
}
|
|
||||||
|
|
||||||
// RealClock implements a clock using time
|
|
||||||
type RealClock struct{}
|
|
||||||
|
|
||||||
// Now returns the current time with time.Now
|
|
||||||
func (RealClock) Now() time.Time {
|
|
||||||
return time.Now()
|
|
||||||
}
|
|
|
@ -1,84 +0,0 @@
|
||||||
/*
|
|
||||||
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 util
|
|
||||||
|
|
||||||
import (
|
|
||||||
v1 "k8s.io/api/core/v1"
|
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
"k8s.io/kubernetes/pkg/features"
|
|
||||||
)
|
|
||||||
|
|
||||||
// For each of these resources, a pod that doesn't request the resource explicitly
|
|
||||||
// will be treated as having requested the amount indicated below, for the purpose
|
|
||||||
// of computing priority only. This ensures that when scheduling zero-request pods, such
|
|
||||||
// pods will not all be scheduled to the machine with the smallest in-use request,
|
|
||||||
// and that when scheduling regular pods, such pods will not see zero-request pods as
|
|
||||||
// consuming no resources whatsoever. We chose these values to be similar to the
|
|
||||||
// resources that we give to cluster addon pods (#10653). But they are pretty arbitrary.
|
|
||||||
// As described in #11713, we use request instead of limit to deal with resource requirements.
|
|
||||||
const (
|
|
||||||
// DefaultMilliCPURequest defines default milli cpu request number.
|
|
||||||
DefaultMilliCPURequest int64 = 100 // 0.1 core
|
|
||||||
// DefaultMemoryRequest defines default memory request size.
|
|
||||||
DefaultMemoryRequest int64 = 200 * 1024 * 1024 // 200 MB
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetNonzeroRequests returns the default cpu and memory resource request if none is found or
|
|
||||||
// what is provided on the request.
|
|
||||||
func GetNonzeroRequests(requests *v1.ResourceList) (int64, int64) {
|
|
||||||
return GetNonzeroRequestForResource(v1.ResourceCPU, requests),
|
|
||||||
GetNonzeroRequestForResource(v1.ResourceMemory, requests)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetNonzeroRequestForResource returns the default resource request if none is found or
|
|
||||||
// what is provided on the request.
|
|
||||||
func GetNonzeroRequestForResource(resource v1.ResourceName, requests *v1.ResourceList) int64 {
|
|
||||||
if requests == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
switch resource {
|
|
||||||
case v1.ResourceCPU:
|
|
||||||
// Override if un-set, but not if explicitly set to zero
|
|
||||||
if _, found := (*requests)[v1.ResourceCPU]; !found {
|
|
||||||
return DefaultMilliCPURequest
|
|
||||||
}
|
|
||||||
return requests.Cpu().MilliValue()
|
|
||||||
case v1.ResourceMemory:
|
|
||||||
// Override if un-set, but not if explicitly set to zero
|
|
||||||
if _, found := (*requests)[v1.ResourceMemory]; !found {
|
|
||||||
return DefaultMemoryRequest
|
|
||||||
}
|
|
||||||
return requests.Memory().Value()
|
|
||||||
case v1.ResourceEphemeralStorage:
|
|
||||||
// if the local storage capacity isolation feature gate is disabled, pods request 0 disk.
|
|
||||||
if !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
quantity, found := (*requests)[v1.ResourceEphemeralStorage]
|
|
||||||
if !found {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return quantity.Value()
|
|
||||||
default:
|
|
||||||
quantity, found := (*requests)[resource]
|
|
||||||
if !found {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return quantity.Value()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,148 +0,0 @@
|
||||||
/*
|
|
||||||
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 util
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
v1 "k8s.io/api/core/v1"
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
||||||
"k8s.io/apimachinery/pkg/types"
|
|
||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
|
||||||
"k8s.io/apimachinery/pkg/util/strategicpatch"
|
|
||||||
"k8s.io/client-go/kubernetes"
|
|
||||||
corev1helpers "k8s.io/component-helpers/scheduling/corev1"
|
|
||||||
"k8s.io/klog/v2"
|
|
||||||
extenderv1 "k8s.io/kube-scheduler/extender/v1"
|
|
||||||
v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetPodFullName returns a name that uniquely identifies a pod.
|
|
||||||
func GetPodFullName(pod *v1.Pod) string {
|
|
||||||
// Use underscore as the delimiter because it is not allowed in pod name
|
|
||||||
// (DNS subdomain format).
|
|
||||||
return pod.Name + "_" + pod.Namespace
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetPodStartTime returns start time of the given pod or current timestamp
|
|
||||||
// if it hasn't started yet.
|
|
||||||
func GetPodStartTime(pod *v1.Pod) *metav1.Time {
|
|
||||||
if pod.Status.StartTime != nil {
|
|
||||||
return pod.Status.StartTime
|
|
||||||
}
|
|
||||||
// Assumed pods and bound pods that haven't started don't have a StartTime yet.
|
|
||||||
return &metav1.Time{Time: time.Now()}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetEarliestPodStartTime returns the earliest start time of all pods that
|
|
||||||
// have the highest priority among all victims.
|
|
||||||
func GetEarliestPodStartTime(victims *extenderv1.Victims) *metav1.Time {
|
|
||||||
if len(victims.Pods) == 0 {
|
|
||||||
// should not reach here.
|
|
||||||
klog.Errorf("victims.Pods is empty. Should not reach here.")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
earliestPodStartTime := GetPodStartTime(victims.Pods[0])
|
|
||||||
maxPriority := corev1helpers.PodPriority(victims.Pods[0])
|
|
||||||
|
|
||||||
for _, pod := range victims.Pods {
|
|
||||||
if corev1helpers.PodPriority(pod) == maxPriority {
|
|
||||||
if GetPodStartTime(pod).Before(earliestPodStartTime) {
|
|
||||||
earliestPodStartTime = GetPodStartTime(pod)
|
|
||||||
}
|
|
||||||
} else if corev1helpers.PodPriority(pod) > maxPriority {
|
|
||||||
maxPriority = corev1helpers.PodPriority(pod)
|
|
||||||
earliestPodStartTime = GetPodStartTime(pod)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return earliestPodStartTime
|
|
||||||
}
|
|
||||||
|
|
||||||
// MoreImportantPod return true when priority of the first pod is higher than
|
|
||||||
// the second one. If two pods' priorities are equal, compare their StartTime.
|
|
||||||
// It takes arguments of the type "interface{}" to be used with SortableList,
|
|
||||||
// but expects those arguments to be *v1.Pod.
|
|
||||||
func MoreImportantPod(pod1, pod2 *v1.Pod) bool {
|
|
||||||
p1 := corev1helpers.PodPriority(pod1)
|
|
||||||
p2 := corev1helpers.PodPriority(pod2)
|
|
||||||
if p1 != p2 {
|
|
||||||
return p1 > p2
|
|
||||||
}
|
|
||||||
return GetPodStartTime(pod1).Before(GetPodStartTime(pod2))
|
|
||||||
}
|
|
||||||
|
|
||||||
// PatchPodStatus calculates the delta bytes change from <old.Status> to <newStatus>,
|
|
||||||
// and then submit a request to API server to patch the pod changes.
|
|
||||||
func PatchPodStatus(cs kubernetes.Interface, old *v1.Pod, newStatus *v1.PodStatus) error {
|
|
||||||
if newStatus == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
oldData, err := json.Marshal(v1.Pod{Status: old.Status})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
newData, err := json.Marshal(v1.Pod{Status: *newStatus})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, &v1.Pod{})
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to create merge patch for pod %q/%q: %v", old.Namespace, old.Name, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if "{}" == string(patchBytes) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = cs.CoreV1().Pods(old.Namespace).Patch(context.TODO(), old.Name, types.StrategicMergePatchType, patchBytes, metav1.PatchOptions{}, "status")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeletePod deletes the given <pod> from API server
|
|
||||||
func DeletePod(cs kubernetes.Interface, pod *v1.Pod) error {
|
|
||||||
return cs.CoreV1().Pods(pod.Namespace).Delete(context.TODO(), pod.Name, metav1.DeleteOptions{})
|
|
||||||
}
|
|
||||||
|
|
||||||
// ClearNominatedNodeName internally submit a patch request to API server
|
|
||||||
// to set each pods[*].Status.NominatedNodeName> to "".
|
|
||||||
func ClearNominatedNodeName(cs kubernetes.Interface, pods ...*v1.Pod) utilerrors.Aggregate {
|
|
||||||
var errs []error
|
|
||||||
for _, p := range pods {
|
|
||||||
if len(p.Status.NominatedNodeName) == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
podStatusCopy := p.Status.DeepCopy()
|
|
||||||
podStatusCopy.NominatedNodeName = ""
|
|
||||||
if err := PatchPodStatus(cs, p, podStatusCopy); err != nil {
|
|
||||||
errs = append(errs, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return utilerrors.NewAggregate(errs)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsScalarResourceName validates the resource for Extended, Hugepages, Native and AttachableVolume resources
|
|
||||||
func IsScalarResourceName(name v1.ResourceName) bool {
|
|
||||||
return v1helper.IsExtendedResourceName(name) || v1helper.IsHugePageResourceName(name) ||
|
|
||||||
v1helper.IsPrefixedNativeResource(name) || v1helper.IsAttachableVolumeResourceName(name)
|
|
||||||
}
|
|
|
@ -535,7 +535,7 @@ gopkg.in/tomb.v1
|
||||||
gopkg.in/yaml.v2
|
gopkg.in/yaml.v2
|
||||||
# gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
# gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
||||||
gopkg.in/yaml.v3
|
gopkg.in/yaml.v3
|
||||||
# k8s.io/api v0.22.2 => k8s.io/api v0.22.2
|
# k8s.io/api v0.22.2
|
||||||
## explicit
|
## explicit
|
||||||
k8s.io/api/admission/v1
|
k8s.io/api/admission/v1
|
||||||
k8s.io/api/admission/v1beta1
|
k8s.io/api/admission/v1beta1
|
||||||
|
@ -583,11 +583,11 @@ k8s.io/api/scheduling/v1beta1
|
||||||
k8s.io/api/storage/v1
|
k8s.io/api/storage/v1
|
||||||
k8s.io/api/storage/v1alpha1
|
k8s.io/api/storage/v1alpha1
|
||||||
k8s.io/api/storage/v1beta1
|
k8s.io/api/storage/v1beta1
|
||||||
# k8s.io/apiextensions-apiserver v0.22.2 => k8s.io/apiextensions-apiserver v0.22.2
|
# k8s.io/apiextensions-apiserver v0.22.2
|
||||||
## explicit
|
## explicit
|
||||||
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions
|
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions
|
||||||
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1
|
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1
|
||||||
# k8s.io/apimachinery v0.22.2 => k8s.io/apimachinery v0.22.2
|
# k8s.io/apimachinery v0.22.2
|
||||||
## explicit
|
## explicit
|
||||||
k8s.io/apimachinery/pkg/api/equality
|
k8s.io/apimachinery/pkg/api/equality
|
||||||
k8s.io/apimachinery/pkg/api/errors
|
k8s.io/apimachinery/pkg/api/errors
|
||||||
|
@ -649,7 +649,7 @@ k8s.io/apimachinery/pkg/watch
|
||||||
k8s.io/apimachinery/third_party/forked/golang/json
|
k8s.io/apimachinery/third_party/forked/golang/json
|
||||||
k8s.io/apimachinery/third_party/forked/golang/netutil
|
k8s.io/apimachinery/third_party/forked/golang/netutil
|
||||||
k8s.io/apimachinery/third_party/forked/golang/reflect
|
k8s.io/apimachinery/third_party/forked/golang/reflect
|
||||||
# k8s.io/apiserver v0.22.2 => k8s.io/apiserver v0.22.2
|
# k8s.io/apiserver v0.22.2
|
||||||
## explicit
|
## explicit
|
||||||
k8s.io/apiserver/pkg/admission
|
k8s.io/apiserver/pkg/admission
|
||||||
k8s.io/apiserver/pkg/admission/configuration
|
k8s.io/apiserver/pkg/admission/configuration
|
||||||
|
@ -757,12 +757,12 @@ k8s.io/apiserver/pkg/util/x509metrics
|
||||||
k8s.io/apiserver/pkg/warning
|
k8s.io/apiserver/pkg/warning
|
||||||
k8s.io/apiserver/plugin/pkg/authenticator/token/webhook
|
k8s.io/apiserver/plugin/pkg/authenticator/token/webhook
|
||||||
k8s.io/apiserver/plugin/pkg/authorizer/webhook
|
k8s.io/apiserver/plugin/pkg/authorizer/webhook
|
||||||
# k8s.io/cli-runtime v0.22.2 => k8s.io/cli-runtime v0.22.2
|
# k8s.io/cli-runtime v0.22.2
|
||||||
## explicit
|
## explicit
|
||||||
k8s.io/cli-runtime/pkg/genericclioptions
|
k8s.io/cli-runtime/pkg/genericclioptions
|
||||||
k8s.io/cli-runtime/pkg/printers
|
k8s.io/cli-runtime/pkg/printers
|
||||||
k8s.io/cli-runtime/pkg/resource
|
k8s.io/cli-runtime/pkg/resource
|
||||||
# k8s.io/client-go v0.22.2 => k8s.io/client-go v0.22.2
|
# k8s.io/client-go v0.22.2
|
||||||
## explicit
|
## explicit
|
||||||
k8s.io/client-go/applyconfigurations/admissionregistration/v1
|
k8s.io/client-go/applyconfigurations/admissionregistration/v1
|
||||||
k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1
|
k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1
|
||||||
|
@ -1047,7 +1047,7 @@ k8s.io/client-go/util/jsonpath
|
||||||
k8s.io/client-go/util/keyutil
|
k8s.io/client-go/util/keyutil
|
||||||
k8s.io/client-go/util/retry
|
k8s.io/client-go/util/retry
|
||||||
k8s.io/client-go/util/workqueue
|
k8s.io/client-go/util/workqueue
|
||||||
# k8s.io/code-generator v0.22.2 => k8s.io/code-generator v0.22.2
|
# k8s.io/code-generator v0.22.2
|
||||||
## explicit
|
## explicit
|
||||||
k8s.io/code-generator
|
k8s.io/code-generator
|
||||||
k8s.io/code-generator/cmd/client-gen
|
k8s.io/code-generator/cmd/client-gen
|
||||||
|
@ -1082,7 +1082,7 @@ k8s.io/code-generator/cmd/set-gen
|
||||||
k8s.io/code-generator/pkg/namer
|
k8s.io/code-generator/pkg/namer
|
||||||
k8s.io/code-generator/pkg/util
|
k8s.io/code-generator/pkg/util
|
||||||
k8s.io/code-generator/third_party/forked/golang/reflect
|
k8s.io/code-generator/third_party/forked/golang/reflect
|
||||||
# k8s.io/component-base v0.22.2 => k8s.io/component-base v0.22.2
|
# k8s.io/component-base v0.22.2
|
||||||
## explicit
|
## explicit
|
||||||
k8s.io/component-base/cli/flag
|
k8s.io/component-base/cli/flag
|
||||||
k8s.io/component-base/config
|
k8s.io/component-base/config
|
||||||
|
@ -1097,7 +1097,7 @@ k8s.io/component-base/metrics/prometheus/workqueue
|
||||||
k8s.io/component-base/metrics/testutil
|
k8s.io/component-base/metrics/testutil
|
||||||
k8s.io/component-base/traces
|
k8s.io/component-base/traces
|
||||||
k8s.io/component-base/version
|
k8s.io/component-base/version
|
||||||
# k8s.io/component-helpers v0.22.2 => k8s.io/component-helpers v0.22.2
|
# k8s.io/component-helpers v0.22.2
|
||||||
## explicit
|
## explicit
|
||||||
k8s.io/component-helpers/apimachinery/lease
|
k8s.io/component-helpers/apimachinery/lease
|
||||||
k8s.io/component-helpers/scheduling/corev1
|
k8s.io/component-helpers/scheduling/corev1
|
||||||
|
@ -1129,9 +1129,7 @@ k8s.io/kube-openapi/pkg/util/proto
|
||||||
k8s.io/kube-openapi/pkg/util/proto/validation
|
k8s.io/kube-openapi/pkg/util/proto/validation
|
||||||
k8s.io/kube-openapi/pkg/util/sets
|
k8s.io/kube-openapi/pkg/util/sets
|
||||||
k8s.io/kube-openapi/pkg/validation/spec
|
k8s.io/kube-openapi/pkg/validation/spec
|
||||||
# k8s.io/kube-scheduler v0.0.0 => k8s.io/kube-scheduler v0.22.2
|
# k8s.io/kubectl v0.22.2
|
||||||
k8s.io/kube-scheduler/extender/v1
|
|
||||||
# k8s.io/kubectl v0.22.2 => k8s.io/kubectl v0.22.2
|
|
||||||
## explicit
|
## explicit
|
||||||
k8s.io/kubectl/pkg/cmd/apiresources
|
k8s.io/kubectl/pkg/cmd/apiresources
|
||||||
k8s.io/kubectl/pkg/cmd/get
|
k8s.io/kubectl/pkg/cmd/get
|
||||||
|
@ -1145,13 +1143,6 @@ k8s.io/kubectl/pkg/util/openapi/validation
|
||||||
k8s.io/kubectl/pkg/util/templates
|
k8s.io/kubectl/pkg/util/templates
|
||||||
k8s.io/kubectl/pkg/util/term
|
k8s.io/kubectl/pkg/util/term
|
||||||
k8s.io/kubectl/pkg/validation
|
k8s.io/kubectl/pkg/validation
|
||||||
# k8s.io/kubernetes v1.22.2
|
|
||||||
## explicit
|
|
||||||
k8s.io/kubernetes/pkg/apis/core
|
|
||||||
k8s.io/kubernetes/pkg/apis/core/helper
|
|
||||||
k8s.io/kubernetes/pkg/apis/core/v1/helper
|
|
||||||
k8s.io/kubernetes/pkg/features
|
|
||||||
k8s.io/kubernetes/pkg/scheduler/util
|
|
||||||
# k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a
|
# k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a
|
||||||
## explicit
|
## explicit
|
||||||
k8s.io/utils/buffer
|
k8s.io/utils/buffer
|
||||||
|
@ -1339,28 +1330,3 @@ sigs.k8s.io/structured-merge-diff/v4/typed
|
||||||
sigs.k8s.io/structured-merge-diff/v4/value
|
sigs.k8s.io/structured-merge-diff/v4/value
|
||||||
# sigs.k8s.io/yaml v1.2.0
|
# sigs.k8s.io/yaml v1.2.0
|
||||||
sigs.k8s.io/yaml
|
sigs.k8s.io/yaml
|
||||||
# k8s.io/api => k8s.io/api v0.22.2
|
|
||||||
# k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.22.2
|
|
||||||
# k8s.io/apimachinery => k8s.io/apimachinery v0.22.2
|
|
||||||
# k8s.io/apiserver => k8s.io/apiserver v0.22.2
|
|
||||||
# k8s.io/cli-runtime => k8s.io/cli-runtime v0.22.2
|
|
||||||
# k8s.io/client-go => k8s.io/client-go v0.22.2
|
|
||||||
# k8s.io/cloud-provider => k8s.io/cloud-provider v0.22.2
|
|
||||||
# k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.22.2
|
|
||||||
# k8s.io/code-generator => k8s.io/code-generator v0.22.2
|
|
||||||
# k8s.io/component-base => k8s.io/component-base v0.22.2
|
|
||||||
# k8s.io/component-helpers => k8s.io/component-helpers v0.22.2
|
|
||||||
# k8s.io/controller-manager => k8s.io/controller-manager v0.22.2
|
|
||||||
# k8s.io/cri-api => k8s.io/cri-api v0.22.2
|
|
||||||
# k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.22.2
|
|
||||||
# k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.22.2
|
|
||||||
# k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.22.2
|
|
||||||
# k8s.io/kube-proxy => k8s.io/kube-proxy v0.22.2
|
|
||||||
# k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.22.2
|
|
||||||
# k8s.io/kubectl => k8s.io/kubectl v0.22.2
|
|
||||||
# k8s.io/kubelet => k8s.io/kubelet v0.22.2
|
|
||||||
# k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.22.2
|
|
||||||
# k8s.io/metrics => k8s.io/metrics v0.22.2
|
|
||||||
# k8s.io/mount-utils => k8s.io/mount-utils v0.22.2
|
|
||||||
# k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.22.2
|
|
||||||
# k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.22.2
|
|
||||||
|
|
Loading…
Reference in New Issue