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  }