devlopment branch (#1736)

This commit is contained in:
zryfish
2020-01-02 20:52:00 +08:00
committed by GitHub
parent ff0ffe8650
commit eceadec69c
440 changed files with 61524 additions and 3699 deletions

View File

@@ -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, &params.Conditions{}, "", false, 1, 0)
} else {
result, err = resources.ListResources(namespace, resource, &params.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)