Add API for setting default storage class (#1757)

Signed-off-by: Xin Wang <wileywang@yunify.com>
(cherry picked from commit 66850ee3ee)
This commit is contained in:
Wiley Wang
2020-01-14 19:57:34 +08:00
committed by Xin Wang
parent 7a97a696b6
commit 20d3f8fa4f
3 changed files with 73 additions and 5 deletions

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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
}