k8s.io/kubernetes@v1.29.3/pkg/registry/storage/rest/storage_storage.go (about) 1 /* 2 Copyright 2016 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 rest 18 19 import ( 20 storageapiv1 "k8s.io/api/storage/v1" 21 storageapiv1alpha1 "k8s.io/api/storage/v1alpha1" 22 storageapiv1beta1 "k8s.io/api/storage/v1beta1" 23 "k8s.io/apiserver/pkg/registry/generic" 24 "k8s.io/apiserver/pkg/registry/rest" 25 genericapiserver "k8s.io/apiserver/pkg/server" 26 serverstorage "k8s.io/apiserver/pkg/server/storage" 27 "k8s.io/kubernetes/pkg/api/legacyscheme" 28 storageapi "k8s.io/kubernetes/pkg/apis/storage" 29 csidriverstore "k8s.io/kubernetes/pkg/registry/storage/csidriver/storage" 30 csinodestore "k8s.io/kubernetes/pkg/registry/storage/csinode/storage" 31 csistoragecapacitystore "k8s.io/kubernetes/pkg/registry/storage/csistoragecapacity/storage" 32 storageclassstore "k8s.io/kubernetes/pkg/registry/storage/storageclass/storage" 33 volumeattachmentstore "k8s.io/kubernetes/pkg/registry/storage/volumeattachment/storage" 34 volumeattributesclassstore "k8s.io/kubernetes/pkg/registry/storage/volumeattributesclass/storage" 35 ) 36 37 type RESTStorageProvider struct { 38 } 39 40 func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, error) { 41 apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(storageapi.GroupName, legacyscheme.Scheme, legacyscheme.ParameterCodec, legacyscheme.Codecs) 42 // If you add a version here, be sure to add an entry in `k8s.io/kubernetes/cmd/kube-apiserver/app/aggregator.go with specific priorities. 43 // TODO refactor the plumbing to provide the information in the APIGroupInfo 44 45 if storageMap, err := p.v1alpha1Storage(apiResourceConfigSource, restOptionsGetter); err != nil { 46 return genericapiserver.APIGroupInfo{}, err 47 } else if len(storageMap) > 0 { 48 apiGroupInfo.VersionedResourcesStorageMap[storageapiv1alpha1.SchemeGroupVersion.Version] = storageMap 49 } 50 if storageMap, err := p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter); err != nil { 51 return genericapiserver.APIGroupInfo{}, err 52 } else if len(storageMap) > 0 { 53 apiGroupInfo.VersionedResourcesStorageMap[storageapiv1beta1.SchemeGroupVersion.Version] = storageMap 54 } 55 if storageMap, err := p.v1Storage(apiResourceConfigSource, restOptionsGetter); err != nil { 56 return genericapiserver.APIGroupInfo{}, err 57 } else if len(storageMap) > 0 { 58 apiGroupInfo.VersionedResourcesStorageMap[storageapiv1.SchemeGroupVersion.Version] = storageMap 59 } 60 61 return apiGroupInfo, nil 62 } 63 64 func (p RESTStorageProvider) v1alpha1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { 65 storage := map[string]rest.Storage{} 66 67 // register csistoragecapacities 68 if resource := "csistoragecapacities"; apiResourceConfigSource.ResourceEnabled(storageapiv1alpha1.SchemeGroupVersion.WithResource(resource)) { 69 csiStorageStorage, err := csistoragecapacitystore.NewStorage(restOptionsGetter) 70 if err != nil { 71 return storage, err 72 } 73 storage[resource] = csiStorageStorage.CSIStorageCapacity 74 } 75 76 // register volumeattributesclasses 77 if resource := "volumeattributesclasses"; apiResourceConfigSource.ResourceEnabled(storageapiv1alpha1.SchemeGroupVersion.WithResource(resource)) { 78 volumeAttributesClassStorage, err := volumeattributesclassstore.NewREST(restOptionsGetter) 79 if err != nil { 80 return storage, err 81 } 82 storage[resource] = volumeAttributesClassStorage 83 } 84 85 return storage, nil 86 } 87 88 func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { 89 storage := map[string]rest.Storage{} 90 91 // register csistoragecapacities 92 if resource := "csistoragecapacities"; apiResourceConfigSource.ResourceEnabled(storageapiv1beta1.SchemeGroupVersion.WithResource(resource)) { 93 csiStorageStorage, err := csistoragecapacitystore.NewStorage(restOptionsGetter) 94 if err != nil { 95 return storage, err 96 } 97 storage[resource] = csiStorageStorage.CSIStorageCapacity 98 } 99 100 return storage, nil 101 } 102 103 func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { 104 storageClassStorage, err := storageclassstore.NewREST(restOptionsGetter) 105 if err != nil { 106 return nil, err 107 } 108 volumeAttachmentStorage, err := volumeattachmentstore.NewStorage(restOptionsGetter) 109 if err != nil { 110 return nil, err 111 } 112 113 storage := map[string]rest.Storage{} 114 115 // storageclasses 116 if resource := "storageclasses"; apiResourceConfigSource.ResourceEnabled(storageapiv1.SchemeGroupVersion.WithResource(resource)) { 117 storage[resource] = storageClassStorage 118 } 119 120 // volumeattachments 121 if resource := "volumeattachments"; apiResourceConfigSource.ResourceEnabled(storageapiv1.SchemeGroupVersion.WithResource(resource)) { 122 storage[resource] = volumeAttachmentStorage.VolumeAttachment 123 storage[resource+"/status"] = volumeAttachmentStorage.Status 124 } 125 126 // register csinodes 127 if resource := "csinodes"; apiResourceConfigSource.ResourceEnabled(storageapiv1.SchemeGroupVersion.WithResource(resource)) { 128 csiNodeStorage, err := csinodestore.NewStorage(restOptionsGetter) 129 if err != nil { 130 return nil, err 131 } 132 storage[resource] = csiNodeStorage.CSINode 133 } 134 135 // register csidrivers 136 if resource := "csidrivers"; apiResourceConfigSource.ResourceEnabled(storageapiv1.SchemeGroupVersion.WithResource(resource)) { 137 csiDriverStorage, err := csidriverstore.NewStorage(restOptionsGetter) 138 if err != nil { 139 return storage, err 140 } 141 storage[resource] = csiDriverStorage.CSIDriver 142 } 143 144 // register csistoragecapacities 145 if resource := "csistoragecapacities"; apiResourceConfigSource.ResourceEnabled(storageapiv1.SchemeGroupVersion.WithResource(resource)) { 146 csiStorageStorage, err := csistoragecapacitystore.NewStorage(restOptionsGetter) 147 if err != nil { 148 return storage, err 149 } 150 storage[resource] = csiStorageStorage.CSIStorageCapacity 151 } 152 153 return storage, nil 154 } 155 156 func (p RESTStorageProvider) GroupName() string { 157 return storageapi.GroupName 158 }