12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- /*
- 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 (
- "k8s.io/api/core/v1"
- "k8s.io/apimachinery/pkg/labels"
- "k8s.io/apimachinery/pkg/util/sets"
- )
- // GetNamespacesFromPodAffinityTerm returns a set of names
- // according to the namespaces indicated in podAffinityTerm.
- // If namespaces is empty it considers the given pod's namespace.
- func GetNamespacesFromPodAffinityTerm(pod *v1.Pod, podAffinityTerm *v1.PodAffinityTerm) sets.String {
- names := sets.String{}
- if len(podAffinityTerm.Namespaces) == 0 {
- names.Insert(pod.Namespace)
- } else {
- names.Insert(podAffinityTerm.Namespaces...)
- }
- return names
- }
- // PodMatchesTermsNamespaceAndSelector returns true if the given <pod>
- // matches the namespace and selector defined by <affinityPod>`s <term>.
- func PodMatchesTermsNamespaceAndSelector(pod *v1.Pod, namespaces sets.String, selector labels.Selector) bool {
- if !namespaces.Has(pod.Namespace) {
- return false
- }
- if !selector.Matches(labels.Set(pod.Labels)) {
- return false
- }
- return true
- }
- // NodesHaveSameTopologyKey checks if nodeA and nodeB have same label value with given topologyKey as label key.
- // Returns false if topologyKey is empty.
- func NodesHaveSameTopologyKey(nodeA, nodeB *v1.Node, topologyKey string) bool {
- if len(topologyKey) == 0 {
- return false
- }
- if nodeA.Labels == nil || nodeB.Labels == nil {
- return false
- }
- nodeALabel, okA := nodeA.Labels[topologyKey]
- nodeBLabel, okB := nodeB.Labels[topologyKey]
- // If found label in both nodes, check the label
- if okB && okA {
- return nodeALabel == nodeBLabel
- }
- return false
- }
- // Topologies contains topologies information of nodes.
- type Topologies struct {
- DefaultKeys []string
- }
- // NodesHaveSameTopologyKey checks if nodeA and nodeB have same label value with given topologyKey as label key.
- func (tps *Topologies) NodesHaveSameTopologyKey(nodeA, nodeB *v1.Node, topologyKey string) bool {
- return NodesHaveSameTopologyKey(nodeA, nodeB, topologyKey)
- }
|