Add API for setting default storage class (#1757)
Signed-off-by: Xin Wang <wileywang@yunify.com>
This commit is contained in:
@@ -20,8 +20,10 @@ package resources
|
||||
import (
|
||||
"github.com/emicklei/go-restful"
|
||||
"k8s.io/api/core/v1"
|
||||
"k8s.io/klog"
|
||||
"net/http"
|
||||
|
||||
storagev1 "k8s.io/api/storage/v1"
|
||||
"kubesphere.io/kubesphere/pkg/models/storage"
|
||||
"kubesphere.io/kubesphere/pkg/server/errors"
|
||||
)
|
||||
@@ -69,3 +71,26 @@ func GetPvcListBySc(request *restful.Request, response *restful.Response) {
|
||||
|
||||
response.WriteAsJson(result)
|
||||
}
|
||||
|
||||
func PatchStorageClass(request *restful.Request, response *restful.Response) {
|
||||
scObj := &storagev1.StorageClass{}
|
||||
err := request.ReadEntity(scObj)
|
||||
if err != nil {
|
||||
klog.Errorf("read entity error: %s", err.Error())
|
||||
response.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err))
|
||||
return
|
||||
}
|
||||
klog.V(5).Infof("succeed to read entity %v", scObj)
|
||||
scName := request.PathParameter("storageclass")
|
||||
if scObj.Annotations[storage.IsDefaultStorageClassAnnotation] == "true" {
|
||||
// Set default storage class
|
||||
sc, err := storage.SetDefaultStorageClass(scName)
|
||||
if err != nil {
|
||||
response.WriteHeaderAndEntity(http.StatusInternalServerError, errors.Wrap(err))
|
||||
return
|
||||
}
|
||||
response.WriteEntity(sc)
|
||||
return
|
||||
}
|
||||
response.WriteEntity(errors.None)
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import (
|
||||
"github.com/emicklei/go-restful-openapi"
|
||||
appsv1 "k8s.io/api/apps/v1"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
storagev1 "k8s.io/api/storage/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"kubesphere.io/kubesphere/pkg/apiserver/components"
|
||||
"kubesphere.io/kubesphere/pkg/apiserver/git"
|
||||
@@ -257,7 +258,14 @@ func addWebService(c *restful.Container) error {
|
||||
Returns(http.StatusOK, ok, status.WorkLoadStatus{}).
|
||||
To(workloadstatuses.GetNamespacedAbnormalWorkloads))
|
||||
|
||||
c.Add(webservice)
|
||||
webservice.Route(webservice.PATCH("/storageclasses/{storageclass}").
|
||||
To(resources.PatchStorageClass).
|
||||
Doc("patch storage class").
|
||||
Metadata(restfulspec.KeyOpenAPITags, []string{constants.ClusterResourcesTag}).
|
||||
Returns(http.StatusOK, ok, storagev1.StorageClass{}).
|
||||
Writes(storagev1.StorageClass{}).
|
||||
Param(webservice.PathParameter("storageclass", "the name of storage class")))
|
||||
|
||||
c.Add(webservice)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"kubesphere.io/kubesphere/pkg/simple/client"
|
||||
"strconv"
|
||||
|
||||
"k8s.io/api/core/v1"
|
||||
@@ -27,16 +28,17 @@ import (
|
||||
"kubesphere.io/kubesphere/pkg/informers"
|
||||
)
|
||||
|
||||
const (
|
||||
IsDefaultStorageClassAnnotation = "storageclass.kubernetes.io/is-default-class"
|
||||
betaIsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class"
|
||||
)
|
||||
|
||||
type ScMetrics struct {
|
||||
Capacity string `json:"capacity,omitempty"`
|
||||
Usage string `json:"usage,omitempty"`
|
||||
PvcNumber string `json:"pvcNumber"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
||||
}
|
||||
|
||||
func GetPvcListBySc(scName string) ([]*v1.PersistentVolumeClaim, error) {
|
||||
persistentVolumeClaimLister := informers.SharedInformerFactory().Core().V1().PersistentVolumeClaims().Lister()
|
||||
all, err := persistentVolumeClaimLister.List(labels.Everything())
|
||||
@@ -102,3 +104,36 @@ func GetScList() ([]*storageV1.StorageClass, error) {
|
||||
|
||||
return scList, nil
|
||||
}
|
||||
|
||||
func SetDefaultStorageClass(defaultScName string) (*storageV1.StorageClass, error) {
|
||||
scLister := informers.SharedInformerFactory().Storage().V1().StorageClasses().Lister()
|
||||
// 1. verify storage class name
|
||||
sc, err := scLister.Get(defaultScName)
|
||||
if sc == nil || err != nil {
|
||||
return sc, err
|
||||
}
|
||||
// 2. unset all default sc and then set default sc
|
||||
scList, err := scLister.List(labels.Everything())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
k8sClient := client.ClientSets().K8s().Kubernetes()
|
||||
var defaultSc *storageV1.StorageClass
|
||||
for _, sc := range scList {
|
||||
_, hasDefault := sc.Annotations[IsDefaultStorageClassAnnotation]
|
||||
_, hasBeta := sc.Annotations[betaIsDefaultStorageClassAnnotation]
|
||||
if sc.Name == defaultScName || hasDefault || hasBeta {
|
||||
delete(sc.Annotations, IsDefaultStorageClassAnnotation)
|
||||
delete(sc.Annotations, betaIsDefaultStorageClassAnnotation)
|
||||
if sc.Name == defaultScName {
|
||||
sc.Annotations[IsDefaultStorageClassAnnotation] = "true"
|
||||
defaultSc = sc
|
||||
}
|
||||
_, err := k8sClient.StorageV1().StorageClasses().Update(sc)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
return defaultSc, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user