k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/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 volumeattributesclasses 68 if resource := "volumeattributesclasses"; apiResourceConfigSource.ResourceEnabled(storageapiv1alpha1.SchemeGroupVersion.WithResource(resource)) { 69 volumeAttributesClassStorage, err := volumeattributesclassstore.NewREST(restOptionsGetter) 70 if err != nil { 71 return storage, err 72 } 73 storage[resource] = volumeAttributesClassStorage 74 } 75 76 return storage, nil 77 } 78 79 func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { 80 storage := map[string]rest.Storage{} 81 82 return storage, nil 83 } 84 85 func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) { 86 storageClassStorage, err := storageclassstore.NewREST(restOptionsGetter) 87 if err != nil { 88 return nil, err 89 } 90 volumeAttachmentStorage, err := volumeattachmentstore.NewStorage(restOptionsGetter) 91 if err != nil { 92 return nil, err 93 } 94 95 storage := map[string]rest.Storage{} 96 97 // storageclasses 98 if resource := "storageclasses"; apiResourceConfigSource.ResourceEnabled(storageapiv1.SchemeGroupVersion.WithResource(resource)) { 99 storage[resource] = storageClassStorage 100 } 101 102 // volumeattachments 103 if resource := "volumeattachments"; apiResourceConfigSource.ResourceEnabled(storageapiv1.SchemeGroupVersion.WithResource(resource)) { 104 storage[resource] = volumeAttachmentStorage.VolumeAttachment 105 storage[resource+"/status"] = volumeAttachmentStorage.Status 106 } 107 108 // register csinodes 109 if resource := "csinodes"; apiResourceConfigSource.ResourceEnabled(storageapiv1.SchemeGroupVersion.WithResource(resource)) { 110 csiNodeStorage, err := csinodestore.NewStorage(restOptionsGetter) 111 if err != nil { 112 return nil, err 113 } 114 storage[resource] = csiNodeStorage.CSINode 115 } 116 117 // register csidrivers 118 if resource := "csidrivers"; apiResourceConfigSource.ResourceEnabled(storageapiv1.SchemeGroupVersion.WithResource(resource)) { 119 csiDriverStorage, err := csidriverstore.NewStorage(restOptionsGetter) 120 if err != nil { 121 return storage, err 122 } 123 storage[resource] = csiDriverStorage.CSIDriver 124 } 125 126 // register csistoragecapacities 127 if resource := "csistoragecapacities"; apiResourceConfigSource.ResourceEnabled(storageapiv1.SchemeGroupVersion.WithResource(resource)) { 128 csiStorageStorage, err := csistoragecapacitystore.NewStorage(restOptionsGetter) 129 if err != nil { 130 return storage, err 131 } 132 storage[resource] = csiStorageStorage.CSIStorageCapacity 133 } 134 135 return storage, nil 136 } 137 138 func (p RESTStorageProvider) GroupName() string { 139 return storageapi.GroupName 140 }