metadata.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /*
  2. Copyright 2016 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package priorities
  14. import (
  15. "k8s.io/api/core/v1"
  16. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  17. "k8s.io/apimachinery/pkg/labels"
  18. "k8s.io/kubernetes/pkg/scheduler/algorithm"
  19. schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
  20. )
  21. // PriorityMetadataFactory is a factory to produce PriorityMetadata.
  22. type PriorityMetadataFactory struct {
  23. serviceLister algorithm.ServiceLister
  24. controllerLister algorithm.ControllerLister
  25. replicaSetLister algorithm.ReplicaSetLister
  26. statefulSetLister algorithm.StatefulSetLister
  27. }
  28. // NewPriorityMetadataFactory creates a PriorityMetadataFactory.
  29. func NewPriorityMetadataFactory(serviceLister algorithm.ServiceLister, controllerLister algorithm.ControllerLister, replicaSetLister algorithm.ReplicaSetLister, statefulSetLister algorithm.StatefulSetLister) PriorityMetadataProducer {
  30. factory := &PriorityMetadataFactory{
  31. serviceLister: serviceLister,
  32. controllerLister: controllerLister,
  33. replicaSetLister: replicaSetLister,
  34. statefulSetLister: statefulSetLister,
  35. }
  36. return factory.PriorityMetadata
  37. }
  38. // priorityMetadata is a type that is passed as metadata for priority functions
  39. type priorityMetadata struct {
  40. nonZeroRequest *schedulernodeinfo.Resource
  41. podLimits *schedulernodeinfo.Resource
  42. podTolerations []v1.Toleration
  43. affinity *v1.Affinity
  44. podSelectors []labels.Selector
  45. controllerRef *metav1.OwnerReference
  46. podFirstServiceSelector labels.Selector
  47. totalNumNodes int
  48. }
  49. // PriorityMetadata is a PriorityMetadataProducer. Node info can be nil.
  50. func (pmf *PriorityMetadataFactory) PriorityMetadata(pod *v1.Pod, nodeNameToInfo map[string]*schedulernodeinfo.NodeInfo) interface{} {
  51. // If we cannot compute metadata, just return nil
  52. if pod == nil {
  53. return nil
  54. }
  55. return &priorityMetadata{
  56. nonZeroRequest: getNonZeroRequests(pod),
  57. podLimits: getResourceLimits(pod),
  58. podTolerations: getAllTolerationPreferNoSchedule(pod.Spec.Tolerations),
  59. affinity: pod.Spec.Affinity,
  60. podSelectors: getSelectors(pod, pmf.serviceLister, pmf.controllerLister, pmf.replicaSetLister, pmf.statefulSetLister),
  61. controllerRef: metav1.GetControllerOf(pod),
  62. podFirstServiceSelector: getFirstServiceSelector(pod, pmf.serviceLister),
  63. totalNumNodes: len(nodeNameToInfo),
  64. }
  65. }
  66. // getFirstServiceSelector returns one selector of services the given pod.
  67. func getFirstServiceSelector(pod *v1.Pod, sl algorithm.ServiceLister) (firstServiceSelector labels.Selector) {
  68. if services, err := sl.GetPodServices(pod); err == nil && len(services) > 0 {
  69. return labels.SelectorFromSet(services[0].Spec.Selector)
  70. }
  71. return nil
  72. }
  73. // getSelectors returns selectors of services, RCs and RSs matching the given pod.
  74. func getSelectors(pod *v1.Pod, sl algorithm.ServiceLister, cl algorithm.ControllerLister, rsl algorithm.ReplicaSetLister, ssl algorithm.StatefulSetLister) []labels.Selector {
  75. var selectors []labels.Selector
  76. if services, err := sl.GetPodServices(pod); err == nil {
  77. for _, service := range services {
  78. selectors = append(selectors, labels.SelectorFromSet(service.Spec.Selector))
  79. }
  80. }
  81. if rcs, err := cl.GetPodControllers(pod); err == nil {
  82. for _, rc := range rcs {
  83. selectors = append(selectors, labels.SelectorFromSet(rc.Spec.Selector))
  84. }
  85. }
  86. if rss, err := rsl.GetPodReplicaSets(pod); err == nil {
  87. for _, rs := range rss {
  88. if selector, err := metav1.LabelSelectorAsSelector(rs.Spec.Selector); err == nil {
  89. selectors = append(selectors, selector)
  90. }
  91. }
  92. }
  93. if sss, err := ssl.GetPodStatefulSets(pod); err == nil {
  94. for _, ss := range sss {
  95. if selector, err := metav1.LabelSelectorAsSelector(ss.Spec.Selector); err == nil {
  96. selectors = append(selectors, selector)
  97. }
  98. }
  99. }
  100. return selectors
  101. }