k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/pkg/scheduler/framework/plugins/volumebinding/assume_cache.go (about) 1 /* 2 Copyright 2017 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package volumebinding 18 19 import ( 20 "fmt" 21 22 "k8s.io/klog/v2" 23 24 v1 "k8s.io/api/core/v1" 25 storagehelpers "k8s.io/component-helpers/storage/volume" 26 "k8s.io/kubernetes/pkg/scheduler/util/assumecache" 27 ) 28 29 // PVAssumeCache is a AssumeCache for PersistentVolume objects 30 type PVAssumeCache struct { 31 *assumecache.AssumeCache 32 logger klog.Logger 33 } 34 35 func pvStorageClassIndexFunc(obj interface{}) ([]string, error) { 36 if pv, ok := obj.(*v1.PersistentVolume); ok { 37 return []string{storagehelpers.GetPersistentVolumeClass(pv)}, nil 38 } 39 return []string{""}, fmt.Errorf("object is not a v1.PersistentVolume: %v", obj) 40 } 41 42 // NewPVAssumeCache creates a PV assume cache. 43 func NewPVAssumeCache(logger klog.Logger, informer assumecache.Informer) *PVAssumeCache { 44 logger = klog.LoggerWithName(logger, "PV Cache") 45 return &PVAssumeCache{ 46 AssumeCache: assumecache.NewAssumeCache(logger, informer, "v1.PersistentVolume", "storageclass", pvStorageClassIndexFunc), 47 logger: logger, 48 } 49 } 50 51 func (c *PVAssumeCache) GetPV(pvName string) (*v1.PersistentVolume, error) { 52 obj, err := c.Get(pvName) 53 if err != nil { 54 return nil, err 55 } 56 57 pv, ok := obj.(*v1.PersistentVolume) 58 if !ok { 59 return nil, &assumecache.WrongTypeError{TypeName: "v1.PersistentVolume", Object: obj} 60 } 61 return pv, nil 62 } 63 64 func (c *PVAssumeCache) GetAPIPV(pvName string) (*v1.PersistentVolume, error) { 65 obj, err := c.GetAPIObj(pvName) 66 if err != nil { 67 return nil, err 68 } 69 pv, ok := obj.(*v1.PersistentVolume) 70 if !ok { 71 return nil, &assumecache.WrongTypeError{TypeName: "v1.PersistentVolume", Object: obj} 72 } 73 return pv, nil 74 } 75 76 func (c *PVAssumeCache) ListPVs(storageClassName string) []*v1.PersistentVolume { 77 objs := c.List(&v1.PersistentVolume{ 78 Spec: v1.PersistentVolumeSpec{ 79 StorageClassName: storageClassName, 80 }, 81 }) 82 pvs := []*v1.PersistentVolume{} 83 for _, obj := range objs { 84 pv, ok := obj.(*v1.PersistentVolume) 85 if !ok { 86 c.logger.Error(&assumecache.WrongTypeError{TypeName: "v1.PersistentVolume", Object: obj}, "ListPVs") 87 continue 88 } 89 pvs = append(pvs, pv) 90 } 91 return pvs 92 } 93 94 // PVCAssumeCache is a AssumeCache for PersistentVolumeClaim objects 95 type PVCAssumeCache struct { 96 *assumecache.AssumeCache 97 logger klog.Logger 98 } 99 100 // NewPVCAssumeCache creates a PVC assume cache. 101 func NewPVCAssumeCache(logger klog.Logger, informer assumecache.Informer) *PVCAssumeCache { 102 logger = klog.LoggerWithName(logger, "PVC Cache") 103 return &PVCAssumeCache{ 104 AssumeCache: assumecache.NewAssumeCache(logger, informer, "v1.PersistentVolumeClaim", "", nil), 105 logger: logger, 106 } 107 } 108 109 func (c *PVCAssumeCache) GetPVC(pvcKey string) (*v1.PersistentVolumeClaim, error) { 110 obj, err := c.Get(pvcKey) 111 if err != nil { 112 return nil, err 113 } 114 115 pvc, ok := obj.(*v1.PersistentVolumeClaim) 116 if !ok { 117 return nil, &assumecache.WrongTypeError{TypeName: "v1.PersistentVolumeClaim", Object: obj} 118 } 119 return pvc, nil 120 } 121 122 func (c *PVCAssumeCache) GetAPIPVC(pvcKey string) (*v1.PersistentVolumeClaim, error) { 123 obj, err := c.GetAPIObj(pvcKey) 124 if err != nil { 125 return nil, err 126 } 127 pvc, ok := obj.(*v1.PersistentVolumeClaim) 128 if !ok { 129 return nil, &assumecache.WrongTypeError{TypeName: "v1.PersistentVolumeClaim", Object: obj} 130 } 131 return pvc, nil 132 }