devlopment branch (#1736)
This commit is contained in:
@@ -22,11 +22,10 @@ import (
|
||||
"k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/resource"
|
||||
"k8s.io/apimachinery/pkg/labels"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/client-go/informers"
|
||||
"k8s.io/klog"
|
||||
"kubesphere.io/kubesphere/pkg/informers"
|
||||
"kubesphere.io/kubesphere/pkg/models"
|
||||
"kubesphere.io/kubesphere/pkg/models/resources"
|
||||
"kubesphere.io/kubesphere/pkg/server/params"
|
||||
"kubesphere.io/kubesphere/pkg/api"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -42,71 +41,69 @@ const (
|
||||
s2iBuilders = "count/s2ibuilders.devops.kubesphere.io"
|
||||
)
|
||||
|
||||
type NamespacedResourceQuota struct {
|
||||
Namespace string `json:"namespace,omitempty"`
|
||||
|
||||
Data struct {
|
||||
v1.ResourceQuotaStatus
|
||||
|
||||
// quota left status, do the math on the side, cause it's
|
||||
// a lot easier with go-client library
|
||||
Left v1.ResourceList `json:"left,omitempty"`
|
||||
} `json:"data,omitempty"`
|
||||
var supportedResources = map[string]schema.GroupVersionResource{
|
||||
deploymentsKey: {Group: "apps", Version: "v1", Resource: "deployments"},
|
||||
daemonsetsKey: {Group: "apps", Version: "v1", Resource: "daemonsets"},
|
||||
statefulsetsKey: {Group: "apps", Version: "v1", Resource: "statefulsets"},
|
||||
podsKey: {Group: "", Version: "v1", Resource: "pods"},
|
||||
servicesKey: {Group: "", Version: "v1", Resource: "services"},
|
||||
persistentvolumeclaimsKey: {Group: "", Version: "v1", Resource: "persistentvolumeclaims"},
|
||||
ingressKey: {Group: "extensions", Version: "v1beta1", Resource: "ingresses"},
|
||||
jobsKey: {Group: "batch", Version: "v1", Resource: "jobs"},
|
||||
cronJobsKey: {Group: "batch", Version: "v1beta1", Resource: "cronjobs"},
|
||||
s2iBuilders: {Group: "devops.kubesphere.io", Version: "v1alpha1", Resource: "s2ibuilders"},
|
||||
}
|
||||
|
||||
var (
|
||||
resourceMap = map[string]string{
|
||||
daemonsetsKey: resources.DaemonSets,
|
||||
deploymentsKey: resources.Deployments,
|
||||
ingressKey: resources.Ingresses,
|
||||
servicesKey: resources.Services,
|
||||
statefulsetsKey: resources.StatefulSets,
|
||||
persistentvolumeclaimsKey: resources.PersistentVolumeClaims,
|
||||
podsKey: resources.Pods,
|
||||
jobsKey: resources.Jobs,
|
||||
cronJobsKey: resources.CronJobs,
|
||||
s2iBuilders: resources.S2iBuilders,
|
||||
}
|
||||
)
|
||||
type ResourceQuotaGetter interface {
|
||||
GetClusterQuota() (*api.ResourceQuota, error)
|
||||
GetNamespaceQuota(namespace string) (*api.NamespacedResourceQuota, error)
|
||||
}
|
||||
|
||||
func getUsage(namespace, resource string) (int, error) {
|
||||
var result *models.PageableResponse
|
||||
var err error
|
||||
if resource == resources.Namespaces || resource == resources.StorageClasses {
|
||||
result, err = resources.ListResources("", resource, ¶ms.Conditions{}, "", false, 1, 0)
|
||||
} else {
|
||||
result, err = resources.ListResources(namespace, resource, ¶ms.Conditions{}, "", false, 1, 0)
|
||||
}
|
||||
type resourceQuotaGetter struct {
|
||||
informers informers.SharedInformerFactory
|
||||
}
|
||||
|
||||
func NewResourceQuotaGetter(informers informers.SharedInformerFactory) ResourceQuotaGetter {
|
||||
return &resourceQuotaGetter{informers: informers}
|
||||
}
|
||||
|
||||
func (c *resourceQuotaGetter) getUsage(namespace, resource string) (int, error) {
|
||||
|
||||
genericInformer, err := c.informers.ForResource(supportedResources[resource])
|
||||
if err != nil {
|
||||
// we deliberately ignore error if trying to get non existed resource
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
result, err := genericInformer.Lister().ByNamespace(namespace).List(labels.Everything())
|
||||
if err != nil {
|
||||
klog.Error(err)
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return result.TotalCount, nil
|
||||
return len(result), nil
|
||||
}
|
||||
|
||||
// no one use this api anymore, marked as deprecated
|
||||
func GetClusterQuotas() (*models.ResourceQuota, error) {
|
||||
func (c *resourceQuotaGetter) GetClusterQuota() (*api.ResourceQuota, error) {
|
||||
|
||||
quota := v1.ResourceQuotaStatus{Hard: make(v1.ResourceList), Used: make(v1.ResourceList)}
|
||||
|
||||
for k, v := range resourceMap {
|
||||
used, err := getUsage("", v)
|
||||
for r := range supportedResources {
|
||||
used, err := c.getUsage("", r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var quantity resource.Quantity
|
||||
quantity.Set(int64(used))
|
||||
quota.Used[v1.ResourceName(k)] = quantity
|
||||
quota.Used[v1.ResourceName(r)] = quantity
|
||||
}
|
||||
|
||||
return &models.ResourceQuota{Namespace: "\"\"", Data: quota}, nil
|
||||
return &api.ResourceQuota{Namespace: "\"\"", Data: quota}, nil
|
||||
|
||||
}
|
||||
|
||||
func GetNamespaceQuotas(namespace string) (*NamespacedResourceQuota, error) {
|
||||
quota, err := getNamespaceResourceQuota(namespace)
|
||||
func (c *resourceQuotaGetter) GetNamespaceQuota(namespace string) (*api.NamespacedResourceQuota, error) {
|
||||
quota, err := c.getNamespaceResourceQuota(namespace)
|
||||
if err != nil {
|
||||
klog.Error(err)
|
||||
return nil, err
|
||||
@@ -130,10 +127,10 @@ func GetNamespaceQuotas(namespace string) (*NamespacedResourceQuota, error) {
|
||||
}
|
||||
|
||||
// add extra quota usage, cause user may not specify them
|
||||
for key, val := range resourceMap {
|
||||
for key := range supportedResources {
|
||||
// only add them when they don't exist in quotastatus
|
||||
if _, ok := quota.Used[v1.ResourceName(key)]; !ok {
|
||||
used, err := getUsage(namespace, val)
|
||||
used, err := c.getUsage(namespace, key)
|
||||
if err != nil {
|
||||
klog.Error(err)
|
||||
return nil, err
|
||||
@@ -143,7 +140,7 @@ func GetNamespaceQuotas(namespace string) (*NamespacedResourceQuota, error) {
|
||||
}
|
||||
}
|
||||
|
||||
var result = NamespacedResourceQuota{
|
||||
var result = api.NamespacedResourceQuota{
|
||||
Namespace: namespace,
|
||||
}
|
||||
result.Data.Hard = quota.Hard
|
||||
@@ -169,8 +166,8 @@ func updateNamespaceQuota(tmpResourceList, resourceList v1.ResourceList) {
|
||||
}
|
||||
}
|
||||
|
||||
func getNamespaceResourceQuota(namespace string) (*v1.ResourceQuotaStatus, error) {
|
||||
resourceQuotaLister := informers.SharedInformerFactory().Core().V1().ResourceQuotas().Lister()
|
||||
func (c *resourceQuotaGetter) getNamespaceResourceQuota(namespace string) (*v1.ResourceQuotaStatus, error) {
|
||||
resourceQuotaLister := c.informers.Core().V1().ResourceQuotas().Lister()
|
||||
quotaList, err := resourceQuotaLister.ResourceQuotas(namespace).List(labels.Everything())
|
||||
if err != nil {
|
||||
klog.Error(err)
|
||||
|
||||
Reference in New Issue
Block a user