From 6d426a74170a9502f3ca0b85e6f3293e965d4a72 Mon Sep 17 00:00:00 2001 From: chris Date: Wed, 10 Jun 2020 17:50:25 +0800 Subject: [PATCH] support k8s 1.16+,add the entrance to delete job. --- go.mod | 2 +- go.sum | 2 + src/backend/client/api/types.go | 298 ++++++++++++++++++ src/backend/client/cache.go | 16 +- src/backend/client/clientfactory.go | 3 + src/backend/client/handler.go | 55 ++-- src/backend/controllers/common/deployment.go | 4 +- .../kubernetes/daemonset/daemonset.go | 4 +- .../kubernetes/daemonset/pre_deploy.go | 4 +- .../kubernetes/deployment/deployment.go | 6 +- src/backend/controllers/kubernetes/job/job.go | 29 ++ .../kubernetes/statefulset/pre_deploy.go | 4 +- .../kubernetes/statefulset/statefulset.go | 6 +- src/backend/controllers/openapi/deployment.go | 8 +- src/backend/resources/common/util.go | 6 +- src/backend/resources/daemonset/daemonset.go | 14 +- .../resources/deployment/deployment.go | 37 +-- .../resources/statefulset/statefulset.go | 16 +- ...mmentsRouter_controllers_kubernetes_job.go | 7 + .../cronjob/list-job/list-job.component.html | 11 + .../cronjob/list-job/list-job.component.ts | 67 +++- .../app/shared/client/v1/kubernetes/job.ts | 23 +- .../shared/default-models/daemonset.const.ts | 2 +- .../shared/default-models/deployment.const.ts | 2 +- .../shared/default-models/ingress.const.ts | 2 +- .../default-models/statefulset.const.ts | 2 +- src/frontend/src/config.js | 2 +- 27 files changed, 526 insertions(+), 106 deletions(-) diff --git a/go.mod b/go.mod index a018e3340..54e01923d 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/Qihoo360/wayne -go 1.12 +go 1.13 require ( github.com/360yun/sockjs-go v0.0.0-20190620042557-e70edfda8e57 diff --git a/go.sum b/go.sum index dbcdcd925..6a8c006c1 100644 --- a/go.sum +++ b/go.sum @@ -39,6 +39,7 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20190410005359-59a85de7f35e h1:9574pc8MX6rF/QyO14SPHhM5KKIOo9fkb/1ifuYMTKU= github.com/certifi/gocertifi v0.0.0-20190410005359-59a85de7f35e/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -352,6 +353,7 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/src/backend/client/api/types.go b/src/backend/client/api/types.go index 7b24214dd..410ad05cd 100644 --- a/src/backend/client/api/types.go +++ b/src/backend/client/api/types.go @@ -1,6 +1,7 @@ package api import ( + appsv1 "k8s.io/api/apps/v1" appsv1beta1 "k8s.io/api/apps/v1beta1" autoscalingv1 "k8s.io/api/autoscaling/v1" batchv1 "k8s.io/api/batch/v1" @@ -10,6 +11,7 @@ import ( rbacv1 "k8s.io/api/rbac/v1" storagev1 "k8s.io/api/storage/v1" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/kubernetes" ) type ResourceName = string @@ -347,3 +349,299 @@ var KindToResourceMap = map[string]ResourceMap{ Namespaced: true, }, } + +var KindToStableResourceMap = map[string]ResourceMap{ + ResourceNameConfigMap: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: corev1.GroupName, + Version: corev1.SchemeGroupVersion.Version, + Resource: ResourceNameConfigMap, + }, + Kind: KindNameConfigMap, + }, + Namespaced: true, + }, + ResourceNameDaemonSet: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: appsv1.GroupName, + Version: appsv1.SchemeGroupVersion.Version, + Resource: ResourceNameDaemonSet, + }, + Kind: KindNameDaemonSet, + }, + Namespaced: true, + }, + ResourceNameDeployment: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: appsv1.GroupName, + Version: appsv1.SchemeGroupVersion.Version, + Resource: ResourceNameDeployment, + }, + Kind: KindNameDeployment, + }, + Namespaced: true, + }, + ResourceNameEvent: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: corev1.GroupName, + Version: corev1.SchemeGroupVersion.Version, + Resource: ResourceNameEvent, + }, + Kind: KindNameEvent, + }, + Namespaced: true, + }, + + ResourceNameHorizontalPodAutoscaler: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: autoscalingv1.GroupName, + Version: autoscalingv1.SchemeGroupVersion.Version, + Resource: ResourceNameHorizontalPodAutoscaler, + }, + Kind: KindNameHorizontalPodAutoscaler, + }, + Namespaced: true, + }, + ResourceNameIngress: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: extensionsv1beta1.GroupName, + Version: extensionsv1beta1.SchemeGroupVersion.Version, + Resource: ResourceNameIngress, + }, + Kind: KindNameIngress, + }, + Namespaced: true, + }, + ResourceNameJob: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: batchv1.GroupName, + Version: batchv1.SchemeGroupVersion.Version, + Resource: ResourceNameJob, + }, + Kind: KindNameJob, + }, + Namespaced: true, + }, + ResourceNameCronJob: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: batchv1beta1.GroupName, + Version: batchv1beta1.SchemeGroupVersion.Version, + Resource: ResourceNameCronJob, + }, + Kind: KindNameCronJob, + }, + Namespaced: true, + }, + ResourceNameNamespace: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: corev1.GroupName, + Version: corev1.SchemeGroupVersion.Version, + Resource: ResourceNameNamespace, + }, + Kind: KindNameNamespace, + }, + Namespaced: false, + }, + ResourceNameNode: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: corev1.GroupName, + Version: corev1.SchemeGroupVersion.Version, + Resource: ResourceNameNode, + }, + Kind: KindNameNode, + }, + Namespaced: false, + }, + ResourceNamePersistentVolumeClaim: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: corev1.GroupName, + Version: corev1.SchemeGroupVersion.Version, + Resource: ResourceNamePersistentVolumeClaim, + }, + Kind: KindNamePersistentVolumeClaim, + }, + Namespaced: true, + }, + ResourceNamePersistentVolume: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: corev1.GroupName, + Version: corev1.SchemeGroupVersion.Version, + Resource: ResourceNamePersistentVolume, + }, + Kind: KindNamePersistentVolume, + }, + Namespaced: false, + }, + ResourceNamePod: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: corev1.GroupName, + Version: corev1.SchemeGroupVersion.Version, + Resource: ResourceNamePod, + }, + Kind: KindNamePod, + }, + Namespaced: true, + }, + ResourceNameReplicaSet: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: appsv1.GroupName, + Version: appsv1.SchemeGroupVersion.Version, + Resource: ResourceNameReplicaSet, + }, + Kind: KindNameReplicaSet, + }, + Namespaced: true, + }, + ResourceNameSecret: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: corev1.GroupName, + Version: corev1.SchemeGroupVersion.Version, + Resource: ResourceNameSecret, + }, + Kind: KindNameSecret, + }, + Namespaced: true, + }, + ResourceNameService: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: corev1.GroupName, + Version: corev1.SchemeGroupVersion.Version, + Resource: ResourceNameService, + }, + Kind: KindNameService, + }, + Namespaced: true, + }, + ResourceNameStatefulSet: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: appsv1.GroupName, + Version: appsv1.SchemeGroupVersion.Version, + Resource: ResourceNameStatefulSet, + }, + Kind: KindNameStatefulSet, + }, + Namespaced: true, + }, + ResourceNameEndpoint: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: corev1.GroupName, + Version: corev1.SchemeGroupVersion.Version, + Resource: ResourceNameEndpoint, + }, + Kind: KindNameEndpoint, + }, + Namespaced: true, + }, + ResourceNameStorageClass: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: storagev1.GroupName, + Version: storagev1.SchemeGroupVersion.Version, + Resource: ResourceNameStorageClass, + }, + Kind: KindNameStorageClass, + }, + Namespaced: false, + }, + + ResourceNameRole: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: rbacv1.GroupName, + Version: rbacv1.SchemeGroupVersion.Version, + Resource: ResourceNameRole, + }, + Kind: KindNameRole, + }, + Namespaced: true, + }, + ResourceNameRoleBinding: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: rbacv1.GroupName, + Version: rbacv1.SchemeGroupVersion.Version, + Resource: ResourceNameRoleBinding, + }, + Kind: KindNameRoleBinding, + }, + Namespaced: true, + }, + ResourceNameClusterRole: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: rbacv1.GroupName, + Version: rbacv1.SchemeGroupVersion.Version, + Resource: ResourceNameClusterRole, + }, + Kind: KindNameClusterRole, + }, + Namespaced: false, + }, + ResourceNameClusterRoleBinding: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: rbacv1.GroupName, + Version: rbacv1.SchemeGroupVersion.Version, + Resource: ResourceNameClusterRoleBinding, + }, + Kind: KindNameClusterRoleBinding, + }, + Namespaced: false, + }, + ResourceNameServiceAccount: { + GroupVersionResourceKind: GroupVersionResourceKind{ + GroupVersionResource: schema.GroupVersionResource{ + Group: corev1.GroupName, + Version: corev1.SchemeGroupVersion.Version, + Resource: ResourceNameServiceAccount, + }, + Kind: KindNameServiceAccount, + }, + Namespaced: true, + }, +} + +func GetResourceMap(client *kubernetes.Clientset) (result map[string]ResourceMap, err error) { + + //var serverVersion *version2.Info + //if serverVersion, err = client.ServerVersion(); err != nil { + // return + //} + // + //majorVersion := serverVersion.Major + //minorVersion, _ := strconv.Atoi(serverVersion.Minor) + // + //if majorVersion != "1" { + // err = fmt.Errorf("unsupport k8s version") + // return + //} + // + //if minorVersion >= 15 { + // result = KindToStableResourceMap + // return + //} + // + //result = KindToResourceMap + //return + + result = KindToStableResourceMap + return +} diff --git a/src/backend/client/cache.go b/src/backend/client/cache.go index 65c0d7b97..6a774e2aa 100644 --- a/src/backend/client/cache.go +++ b/src/backend/client/cache.go @@ -1,13 +1,12 @@ package client import ( + "github.com/Qihoo360/wayne/src/backend/client/api" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" - "k8s.io/client-go/listers/apps/v1beta1" + appsv1 "k8s.io/client-go/listers/apps/v1" autoscalingv1 "k8s.io/client-go/listers/autoscaling/v1" "k8s.io/client-go/listers/core/v1" - - "github.com/Qihoo360/wayne/src/backend/client/api" ) type CacheFactory struct { @@ -23,8 +22,13 @@ func buildCacheController(client *kubernetes.Clientset) (*CacheFactory, error) { stop := make(chan struct{}) sharedInformerFactory := informers.NewSharedInformerFactory(client, defaultResyncPeriod) + rangeMap, err := api.GetResourceMap(client) + if err != nil { + return nil, err + } // Start all Resources defined in KindToResourceMap - for _, value := range api.KindToResourceMap { + for _, value := range rangeMap { + genericInformer, err := sharedInformerFactory.ForResource(value.GroupVersionResourceKind.GroupVersionResource) if err != nil { return nil, err @@ -48,8 +52,8 @@ func (c *CacheFactory) EventLister() v1.EventLister { return c.sharedInformerFactory.Core().V1().Events().Lister() } -func (c *CacheFactory) DeploymentLister() v1beta1.DeploymentLister { - return c.sharedInformerFactory.Apps().V1beta1().Deployments().Lister() +func (c *CacheFactory) DeploymentLister() appsv1.DeploymentLister { + return c.sharedInformerFactory.Apps().V1().Deployments().Lister() } func (c *CacheFactory) NodeLister() v1.NodeLister { diff --git a/src/backend/client/clientfactory.go b/src/backend/client/clientfactory.go index d21f66669..e470795b2 100644 --- a/src/backend/client/clientfactory.go +++ b/src/backend/client/clientfactory.go @@ -18,6 +18,9 @@ func (h *resourceHandler) getClientByGroupVersion(groupVersion schema.GroupVersi case corev1.GroupName: return h.client.CoreV1().RESTClient() case appsv1beta1.GroupName: + if groupVersion.Version == "v1"{ + return h.client.AppsV1().RESTClient() + } return h.client.AppsV1beta1().RESTClient() case autoscalingv1.GroupName: return h.client.AutoscalingV1().RESTClient() diff --git a/src/backend/client/handler.go b/src/backend/client/handler.go index 162a51893..0e9e1a54d 100644 --- a/src/backend/client/handler.go +++ b/src/backend/client/handler.go @@ -4,7 +4,6 @@ package client import ( "fmt" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -36,10 +35,11 @@ func NewResourceHandler(kubeClient *kubernetes.Clientset, cacheFactory *CacheFac } func (h *resourceHandler) Create(kind string, namespace string, object *runtime.Unknown) (*runtime.Unknown, error) { - resource, ok := api.KindToResourceMap[kind] - if !ok { - return nil, fmt.Errorf("Resource kind (%s) not support yet . ", kind) + resource, err := h.getResource(kind) + if err != nil { + return nil, err } + kubeClient := h.getClientByGroupVersion(resource.GroupVersionResourceKind.GroupVersionResource) req := kubeClient.Post(). Resource(kind). @@ -49,15 +49,16 @@ func (h *resourceHandler) Create(kind string, namespace string, object *runtime. req.Namespace(namespace) } var result runtime.Unknown - err := req.Do().Into(&result) + err = req.Do().Into(&result) return &result, err } func (h *resourceHandler) Update(kind string, namespace string, name string, object *runtime.Unknown) (*runtime.Unknown, error) { - resource, ok := api.KindToResourceMap[kind] - if !ok { - return nil, fmt.Errorf("Resource kind (%s) not support yet . ", kind) + + resource, err := h.getResource(kind) + if err != nil { + return nil, err } kubeClient := h.getClientByGroupVersion(resource.GroupVersionResourceKind.GroupVersionResource) @@ -71,16 +72,18 @@ func (h *resourceHandler) Update(kind string, namespace string, name string, obj } var result runtime.Unknown - err := req.Do().Into(&result) + err = req.Do().Into(&result) return &result, err } func (h *resourceHandler) Delete(kind string, namespace string, name string, options *meta_v1.DeleteOptions) error { - resource, ok := api.KindToResourceMap[kind] - if !ok { - return fmt.Errorf("Resource kind (%s) not support yet . ", kind) + + resource, err := h.getResource(kind) + if err != nil { + return err } + kubeClient := h.getClientByGroupVersion(resource.GroupVersionResourceKind.GroupVersionResource) req := kubeClient.Delete(). Resource(kind). @@ -95,10 +98,11 @@ func (h *resourceHandler) Delete(kind string, namespace string, name string, opt // Get object from cache func (h *resourceHandler) Get(kind string, namespace string, name string) (runtime.Object, error) { - resource, ok := api.KindToResourceMap[kind] - if !ok { - return nil, fmt.Errorf("Resource kind (%s) not support yet . ", kind) + resource, err := h.getResource(kind) + if err != nil { + return nil, err } + genericInformer, err := h.cacheFactory.sharedInformerFactory.ForResource(resource.GroupVersionResourceKind.GroupVersionResource) if err != nil { return nil, err @@ -127,10 +131,12 @@ func (h *resourceHandler) Get(kind string, namespace string, name string) (runti // Get object from cache func (h *resourceHandler) List(kind string, namespace string, labelSelector string) ([]runtime.Object, error) { - resource, ok := api.KindToResourceMap[kind] - if !ok { - return nil, fmt.Errorf("Resource kind (%s) not support yet . ", kind) + + resource, err := h.getResource(kind) + if err != nil { + return nil, err } + genericInformer, err := h.cacheFactory.sharedInformerFactory.ForResource(resource.GroupVersionResourceKind.GroupVersionResource) if err != nil { return nil, err @@ -165,3 +171,16 @@ func (h *resourceHandler) List(kind string, namespace string, labelSelector stri return objs, nil } + +func (h *resourceHandler) getResource(kind string) (resource api.ResourceMap, err error) { + resourceMap, err := api.GetResourceMap(h.client) + if err != nil { + return + } + resource, ok := resourceMap[kind] + if !ok { + err = fmt.Errorf("Resource kind (%s) not support yet . ", kind) + return + } + return +} diff --git a/src/backend/controllers/common/deployment.go b/src/backend/controllers/common/deployment.go index 43aec2468..f81ea9427 100644 --- a/src/backend/controllers/common/deployment.go +++ b/src/backend/controllers/common/deployment.go @@ -3,14 +3,14 @@ package common import ( "strings" - "k8s.io/api/apps/v1beta1" + appsv1 "k8s.io/api/apps/v1" "k8s.io/api/core/v1" "github.com/Qihoo360/wayne/src/backend/models" "github.com/Qihoo360/wayne/src/backend/util" ) -func DeploymentPreDeploy(kubeDeployment *v1beta1.Deployment, deploy *models.Deployment, +func DeploymentPreDeploy(kubeDeployment *appsv1.Deployment, deploy *models.Deployment, cluster *models.Cluster, namespace *models.Namespace) { // step 1 add envs for i := 0; i < len(kubeDeployment.Spec.Template.Spec.Containers); i++ { diff --git a/src/backend/controllers/kubernetes/daemonset/daemonset.go b/src/backend/controllers/kubernetes/daemonset/daemonset.go index a0d227513..0438e8b54 100644 --- a/src/backend/controllers/kubernetes/daemonset/daemonset.go +++ b/src/backend/controllers/kubernetes/daemonset/daemonset.go @@ -3,7 +3,7 @@ package daemonset import ( "encoding/json" - "k8s.io/api/extensions/v1beta1" + appsv1 "k8s.io/api/apps/v1" "github.com/Qihoo360/wayne/src/backend/controllers/base" "github.com/Qihoo360/wayne/src/backend/models" @@ -44,7 +44,7 @@ func (c *KubeDaemonSetController) Create() { daemonSetId := c.GetIntParamFromURL(":daemonSetId") tplId := c.GetIntParamFromURL(":tplId") - var kubeDaemonSet v1beta1.DaemonSet + var kubeDaemonSet appsv1.DaemonSet err := json.Unmarshal(c.Ctx.Input.RequestBody, &kubeDaemonSet) if err != nil { c.AbortBadRequestFormat("KubeDaemonSet") diff --git a/src/backend/controllers/kubernetes/daemonset/pre_deploy.go b/src/backend/controllers/kubernetes/daemonset/pre_deploy.go index b69584f75..c6ef8200a 100644 --- a/src/backend/controllers/kubernetes/daemonset/pre_deploy.go +++ b/src/backend/controllers/kubernetes/daemonset/pre_deploy.go @@ -3,14 +3,14 @@ package daemonset import ( "strings" + appsv1 "k8s.io/api/apps/v1" "k8s.io/api/core/v1" - "k8s.io/api/extensions/v1beta1" "github.com/Qihoo360/wayne/src/backend/models" "github.com/Qihoo360/wayne/src/backend/util" ) -func daemonSetPreDeploy(kubeDaemonSet *v1beta1.DaemonSet, daemonSet *models.DaemonSet, +func daemonSetPreDeploy(kubeDaemonSet *appsv1.DaemonSet, daemonSet *models.DaemonSet, cluster *models.Cluster, namespace *models.Namespace) { // step 1 add envs for i := 0; i < len(kubeDaemonSet.Spec.Template.Spec.Containers); i++ { diff --git a/src/backend/controllers/kubernetes/deployment/deployment.go b/src/backend/controllers/kubernetes/deployment/deployment.go index 32664db04..256438f84 100644 --- a/src/backend/controllers/kubernetes/deployment/deployment.go +++ b/src/backend/controllers/kubernetes/deployment/deployment.go @@ -3,9 +3,9 @@ package deployment import ( "encoding/json" "fmt" + v1 "k8s.io/api/apps/v1" "net/http" - "k8s.io/api/apps/v1beta1" "k8s.io/apimachinery/pkg/labels" "github.com/Qihoo360/wayne/src/backend/client" @@ -85,7 +85,7 @@ func (c *KubeDeploymentController) Create() { deploymentId := c.GetIntParamFromURL(":deploymentId") tplId := c.GetIntParamFromURL(":tplId") - var kubeDeployment v1beta1.Deployment + var kubeDeployment v1.Deployment err := json.Unmarshal(c.Ctx.Input.RequestBody, &kubeDeployment) if err != nil { logs.Error("Invalid deployment tpl %v", string(c.Ctx.Input.RequestBody)) @@ -177,7 +177,7 @@ func (c *KubeDeploymentController) Create() { c.Success("ok") } -func checkResourceAvailable(ns *models.Namespace, cli client.ResourceHandler, kubeDeployment *v1beta1.Deployment, cluster string) error { +func checkResourceAvailable(ns *models.Namespace, cli client.ResourceHandler, kubeDeployment *v1.Deployment, cluster string) error { // this namespace can't use current cluster. clusterMetas, ok := ns.MetaDataObj.ClusterMetas[cluster] if !ok { diff --git a/src/backend/controllers/kubernetes/job/job.go b/src/backend/controllers/kubernetes/job/job.go index 9c813dbd6..c4e36e0e0 100644 --- a/src/backend/controllers/kubernetes/job/job.go +++ b/src/backend/controllers/kubernetes/job/job.go @@ -1,7 +1,9 @@ package job import ( + "github.com/Qihoo360/wayne/src/backend/client/api" batchv1 "k8s.io/api/batch/v1" + metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/Qihoo360/wayne/src/backend/controllers/base" "github.com/Qihoo360/wayne/src/backend/models" @@ -20,6 +22,7 @@ type ClusterJob struct { func (c *KubeJobController) URLMapping() { c.Mapping("ListJobByCronJob", c.ListJobByCronJob) + c.Mapping("DeleteJob", c.DeleteJob) } func (c *KubeJobController) Prepare() { @@ -34,6 +37,32 @@ func (c *KubeJobController) Prepare() { c.PreparePermission(methodActionMap, method, models.PermissionTypeKubeJob) } +// @Title DeleteJob +// @Description Delete job by name +// @Param name query string true "the job name." +// @Param cluster query string true "the cluster name." +// @Param namespace path string true "the namespace name." +// @Success 200 {object} models.Deployment success +// @router /namespaces/:namespace/clusters/:cluster [delete] +func (c *KubeJobController) DeleteJob() { + + cluster := c.Ctx.Input.Param(":cluster") + namespace := c.Ctx.Input.Param(":namespace") + jobName := c.Input().Get("name") + + kubeClient := c.KubeClient(cluster) + + deletePolicy := metaV1.DeletePropagationBackground + err := kubeClient.Delete(api.ResourceNameJob, namespace, jobName, &metaV1.DeleteOptions{PropagationPolicy: &deletePolicy}) + if err != nil { + logs.Error("Delete kubernetes resource (%s:%s:%s) error. %v", api.ResourceNameJob, namespace, jobName, err) + c.HandleError(err) + return + } + c.Success("ok!") + +} + // @Title ListJobByCronJob // @Description find jobs by cronjob // @Param pageNo query int false "the page current no" diff --git a/src/backend/controllers/kubernetes/statefulset/pre_deploy.go b/src/backend/controllers/kubernetes/statefulset/pre_deploy.go index 9d59e1adf..6e97ae479 100644 --- a/src/backend/controllers/kubernetes/statefulset/pre_deploy.go +++ b/src/backend/controllers/kubernetes/statefulset/pre_deploy.go @@ -3,14 +3,14 @@ package statefulset import ( "strings" - "k8s.io/api/apps/v1beta1" + appsv1 "k8s.io/api/apps/v1" "k8s.io/api/core/v1" "github.com/Qihoo360/wayne/src/backend/models" "github.com/Qihoo360/wayne/src/backend/util" ) -func statefulsetPreDeploy(kubeStatefulSet *v1beta1.StatefulSet, statefulSet *models.Statefulset, +func statefulsetPreDeploy(kubeStatefulSet *appsv1.StatefulSet, statefulSet *models.Statefulset, cluster *models.Cluster, namespace *models.Namespace) { // step 1 add envs for i := 0; i < len(kubeStatefulSet.Spec.Template.Spec.Containers); i++ { diff --git a/src/backend/controllers/kubernetes/statefulset/statefulset.go b/src/backend/controllers/kubernetes/statefulset/statefulset.go index 3619f7d80..99823cda6 100644 --- a/src/backend/controllers/kubernetes/statefulset/statefulset.go +++ b/src/backend/controllers/kubernetes/statefulset/statefulset.go @@ -5,7 +5,7 @@ import ( "fmt" "net/http" - "k8s.io/api/apps/v1beta1" + appsv1 "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/labels" "github.com/Qihoo360/wayne/src/backend/client" @@ -49,7 +49,7 @@ func (c *KubeStatefulsetController) Create() { statefulsetId := c.GetIntParamFromURL(":statefulsetId") tplId := c.GetIntParamFromURL(":tplId") - var kubeStatefulset v1beta1.StatefulSet + var kubeStatefulset appsv1.StatefulSet err := json.Unmarshal(c.Ctx.Input.RequestBody, &kubeStatefulset) if err != nil { logs.Error("Invalid statefulset tpl %v", string(c.Ctx.Input.RequestBody)) @@ -141,7 +141,7 @@ func addDeployStatus(statefulsetId int64, tplId int64, cluster string) error { return nil } -func checkResourceAvailable(ns *models.Namespace, cli client.ResourceHandler, kubeStatefulset *v1beta1.StatefulSet, cluster string) error { +func checkResourceAvailable(ns *models.Namespace, cli client.ResourceHandler, kubeStatefulset *appsv1.StatefulSet, cluster string) error { // this namespace can't use current cluster. clusterMetas, ok := ns.MetaDataObj.ClusterMetas[cluster] if !ok { diff --git a/src/backend/controllers/openapi/deployment.go b/src/backend/controllers/openapi/deployment.go index 9eb03e497..a8f338bd0 100644 --- a/src/backend/controllers/openapi/deployment.go +++ b/src/backend/controllers/openapi/deployment.go @@ -8,7 +8,7 @@ import ( "strings" "time" - "k8s.io/api/apps/v1beta1" + appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" "github.com/Qihoo360/wayne/src/backend/client" @@ -24,7 +24,7 @@ import ( type DeploymentInfo struct { Deployment *models.Deployment DeploymentTemplete *models.DeploymentTemplate - DeploymentObject *v1beta1.Deployment + DeploymentObject *appsv1.Deployment Cluster *models.Cluster Namespace *models.Namespace } @@ -655,7 +655,7 @@ func getOnlineDeploymenetInfo(deployment, namespace, cluster string, templateId } } - deployObj := v1beta1.Deployment{} + deployObj := appsv1.Deployment{} err = json.Unmarshal(hack.Slice(deployInfo.DeploymentTemplete.Template), &deployObj) if err != nil { return nil, fmt.Errorf("Failed to parse deployment template: %s", err.Error()) @@ -723,7 +723,7 @@ func publishDeployment(deployInfo *DeploymentInfo, username string) error { } } -func updateDeployment(deployObj *v1beta1.Deployment, cluster string, name string, msg string, resourceId int64) error { +func updateDeployment(deployObj *appsv1.Deployment, cluster string, name string, msg string, resourceId int64) error { status, err := models.PublishStatusModel.GetByCluster(models.PublishTypeDeployment, resourceId, cluster) if err != nil { return fmt.Errorf("Failed to get publish status by cluster: %s", err.Error()) diff --git a/src/backend/resources/common/util.go b/src/backend/resources/common/util.go index bf49711b4..8df12691b 100644 --- a/src/backend/resources/common/util.go +++ b/src/backend/resources/common/util.go @@ -1,11 +1,11 @@ package common import ( - "k8s.io/api/apps/v1beta1" + appsv1 "k8s.io/api/apps/v1" "k8s.io/api/core/v1" ) -func DeploymentResourceList(deployment *v1beta1.Deployment) *ResourceList { +func DeploymentResourceList(deployment *appsv1.Deployment) *ResourceList { replicas := *(deployment.Spec.Replicas) resourceList := ContainersResourceList(deployment.Spec.Template.Spec.Containers) return &ResourceList{ @@ -14,7 +14,7 @@ func DeploymentResourceList(deployment *v1beta1.Deployment) *ResourceList { } } -func StatefulsetResourceList(statefulSet *v1beta1.StatefulSet) *ResourceList { +func StatefulsetResourceList(statefulSet *appsv1.StatefulSet) *ResourceList { replicas := *(statefulSet.Spec.Replicas) resourceList := ContainersResourceList(statefulSet.Spec.Template.Spec.Containers) return &ResourceList{ diff --git a/src/backend/resources/daemonset/daemonset.go b/src/backend/resources/daemonset/daemonset.go index 8fb277362..680757b35 100644 --- a/src/backend/resources/daemonset/daemonset.go +++ b/src/backend/resources/daemonset/daemonset.go @@ -1,7 +1,7 @@ package daemonset import ( - "k8s.io/api/extensions/v1beta1" + appsv1 "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/api/errors" metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" @@ -18,11 +18,11 @@ type DaemonSet struct { Pods common.PodInfo `json:"pods"` } -func CreateOrUpdateDaemonSet(cli *kubernetes.Clientset, daemonSet *v1beta1.DaemonSet) (*v1beta1.DaemonSet, error) { - old, err := cli.ExtensionsV1beta1().DaemonSets(daemonSet.Namespace).Get(daemonSet.Name, metaV1.GetOptions{}) +func CreateOrUpdateDaemonSet(cli *kubernetes.Clientset, daemonSet *appsv1.DaemonSet) (*appsv1.DaemonSet, error) { + old, err := cli.AppsV1().DaemonSets(daemonSet.Namespace).Get(daemonSet.Name, metaV1.GetOptions{}) if err != nil { if errors.IsNotFound(err) { - return cli.ExtensionsV1beta1().DaemonSets(daemonSet.Namespace).Create(daemonSet) + return cli.AppsV1().DaemonSets(daemonSet.Namespace).Create(daemonSet) } return nil, err } @@ -31,11 +31,11 @@ func CreateOrUpdateDaemonSet(cli *kubernetes.Clientset, daemonSet *v1beta1.Daemo old.Spec = daemonSet.Spec old.Spec.Template.Labels = maps.MergeLabels(oldTemplateLabels, daemonSet.Spec.Template.Labels) - return cli.ExtensionsV1beta1().DaemonSets(daemonSet.Namespace).Update(old) + return cli.AppsV1().DaemonSets(daemonSet.Namespace).Update(old) } func GetDaemonSetDetail(cli *kubernetes.Clientset, indexer *client.CacheFactory, name, namespace string) (*DaemonSet, error) { - daemonSet, err := cli.ExtensionsV1beta1().DaemonSets(namespace).Get(name, metaV1.GetOptions{}) + daemonSet, err := cli.AppsV1().DaemonSets(namespace).Get(name, metaV1.GetOptions{}) if err != nil { return nil, err } @@ -65,7 +65,7 @@ func GetDaemonSetDetail(cli *kubernetes.Clientset, indexer *client.CacheFactory, func DeleteDaemonSet(cli *kubernetes.Clientset, name, namespace string) error { deletionPropagation := metaV1.DeletePropagationBackground - return cli.ExtensionsV1beta1(). + return cli.AppsV1(). DaemonSets(namespace). Delete(name, &metaV1.DeleteOptions{PropagationPolicy: &deletionPropagation}) } diff --git a/src/backend/resources/deployment/deployment.go b/src/backend/resources/deployment/deployment.go index 242ea1a1e..635b43c70 100644 --- a/src/backend/resources/deployment/deployment.go +++ b/src/backend/resources/deployment/deployment.go @@ -5,7 +5,7 @@ import ( "net/http" "sort" - "k8s.io/api/apps/v1beta1" + appsv1 "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/api/errors" metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -26,7 +26,7 @@ type Deployment struct { Containers []string `json:"containers"` } -func GetDeploymentList(indexer *client.CacheFactory, namespace string) ([]*v1beta1.Deployment, error) { +func GetDeploymentList(indexer *client.CacheFactory, namespace string) ([]*appsv1.Deployment, error) { deployments, err := indexer.DeploymentLister().Deployments(namespace).List(labels.Everything()) if err != nil { return nil, err @@ -39,7 +39,7 @@ func GetDeploymentList(indexer *client.CacheFactory, namespace string) ([]*v1bet } // GetDeploymentResource get deployment resource statistics -func GetDeploymentResource(cli client.ResourceHandler, deployment *v1beta1.Deployment) (*common.ResourceList, error) { +func GetDeploymentResource(cli client.ResourceHandler, deployment *appsv1.Deployment) (*common.ResourceList, error) { obj, err := cli.Get(api.ResourceNameDeployment, deployment.Namespace, deployment.Name) if err != nil { @@ -48,7 +48,7 @@ func GetDeploymentResource(cli client.ResourceHandler, deployment *v1beta1.Deplo } return nil, err } - old := obj.(*v1beta1.Deployment) + old := obj.(*appsv1.Deployment) oldResourceList := common.DeploymentResourceList(old) newResourceList := common.DeploymentResourceList(deployment) @@ -58,11 +58,12 @@ func GetDeploymentResource(cli client.ResourceHandler, deployment *v1beta1.Deplo }, nil } -func CreateOrUpdateDeployment(cli *kubernetes.Clientset, deployment *v1beta1.Deployment) (*v1beta1.Deployment, error) { - old, err := cli.AppsV1beta1().Deployments(deployment.Namespace).Get(deployment.Name, metaV1.GetOptions{}) +func CreateOrUpdateDeployment(cli *kubernetes.Clientset, deployment *appsv1.Deployment) (*appsv1.Deployment, error) { + //old, err := cli.AppsV1beta1().Deployments(deployment.Namespace).Get(deployment.Name, metaV1.GetOptions{}) + old, err := cli.AppsV1().Deployments(deployment.Namespace).Get(deployment.Name, metaV1.GetOptions{}) if err != nil { if errors.IsNotFound(err) { - return cli.AppsV1beta1().Deployments(deployment.Namespace).Create(deployment) + return cli.AppsV1().Deployments(deployment.Namespace).Create(deployment) } return nil, err } @@ -75,11 +76,11 @@ func CreateOrUpdateDeployment(cli *kubernetes.Clientset, deployment *v1beta1.Dep old.Annotations = deployment.Annotations old.Spec = deployment.Spec - return cli.AppsV1beta1().Deployments(deployment.Namespace).Update(old) + return cli.AppsV1().Deployments(deployment.Namespace).Update(old) } -func UpdateDeployment(cli *kubernetes.Clientset, deployment *v1beta1.Deployment) (*v1beta1.Deployment, error) { - old, err := cli.AppsV1beta1().Deployments(deployment.Namespace).Get(deployment.Name, metaV1.GetOptions{}) +func UpdateDeployment(cli *kubernetes.Clientset, deployment *appsv1.Deployment) (*appsv1.Deployment, error) { + old, err := cli.AppsV1().Deployments(deployment.Namespace).Get(deployment.Name, metaV1.GetOptions{}) if err != nil { return nil, err } @@ -89,7 +90,7 @@ func UpdateDeployment(cli *kubernetes.Clientset, deployment *v1beta1.Deployment) return nil, err } - return cli.AppsV1beta1().Deployments(deployment.Namespace).Update(deployment) + return cli.AppsV1().Deployments(deployment.Namespace).Update(deployment) } // check Deployment .Spec.Selector.MatchLabels, prevent orphan ReplicaSet @@ -97,7 +98,7 @@ func UpdateDeployment(cli *kubernetes.Clientset, deployment *v1beta1.Deployment) // e.g. old Deployment .Spec.Selector.MatchLabels is app = infra-wayne,wayne-app = infra // new Deployment .Spec.Selector.MatchLabels valid labels is // app = infra-wayne or wayne-app = infra or app = infra-wayne,wayne-app = infra -func checkDeploymentLabelSelector(new *v1beta1.Deployment, old *v1beta1.Deployment) error { +func checkDeploymentLabelSelector(new *appsv1.Deployment, old *appsv1.Deployment) error { for key, value := range new.Spec.Selector.MatchLabels { oldValue, ok := old.Spec.Selector.MatchLabels[key] if !ok || oldValue != value { @@ -112,12 +113,12 @@ func checkDeploymentLabelSelector(new *v1beta1.Deployment, old *v1beta1.Deployme return nil } -func GetDeployment(cli *kubernetes.Clientset, name, namespace string) (*v1beta1.Deployment, error) { - return cli.AppsV1beta1().Deployments(namespace).Get(name, metaV1.GetOptions{}) +func GetDeployment(cli *kubernetes.Clientset, name, namespace string) (*appsv1.Deployment, error) { + return cli.AppsV1().Deployments(namespace).Get(name, metaV1.GetOptions{}) } func GetDeploymentDetail(cli *kubernetes.Clientset, indexer *client.CacheFactory, name, namespace string) (*Deployment, error) { - deployment, err := cli.AppsV1beta1().Deployments(namespace).Get(name, metaV1.GetOptions{}) + deployment, err := cli.AppsV1().Deployments(namespace).Get(name, metaV1.GetOptions{}) if err != nil { return nil, err } @@ -125,7 +126,7 @@ func GetDeploymentDetail(cli *kubernetes.Clientset, indexer *client.CacheFactory return toDeployment(deployment, indexer) } -func toDeployment(deployment *v1beta1.Deployment, indexer *client.CacheFactory) (*Deployment, error) { +func toDeployment(deployment *appsv1.Deployment, indexer *client.CacheFactory) (*Deployment, error) { result := &Deployment{ ObjectMeta: common.NewObjectMeta(deployment.ObjectMeta), } @@ -159,12 +160,12 @@ func toDeployment(deployment *v1beta1.Deployment, indexer *client.CacheFactory) func DeleteDeployment(cli *kubernetes.Clientset, name, namespace string) error { deletionPropagation := metaV1.DeletePropagationBackground - return cli.ExtensionsV1beta1(). + return cli.AppsV1(). Deployments(namespace). Delete(name, &metaV1.DeleteOptions{PropagationPolicy: &deletionPropagation}) } -func UpdateScale(cli *kubernetes.Clientset, deploymentname string, namespace string,newreplica int32) error { +func UpdateScale(cli *kubernetes.Clientset, deploymentname string, namespace string,newreplica int32) error { deployments:=cli.AppsV1beta1().Deployments(namespace) deployment,err:=deployments.Get(deploymentname,metaV1.GetOptions{}) if err != nil { diff --git a/src/backend/resources/statefulset/statefulset.go b/src/backend/resources/statefulset/statefulset.go index d8df217e0..dc0ad610d 100644 --- a/src/backend/resources/statefulset/statefulset.go +++ b/src/backend/resources/statefulset/statefulset.go @@ -1,7 +1,7 @@ package statefulset import ( - "k8s.io/api/apps/v1beta1" + appsv1 "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/api/errors" metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" @@ -20,7 +20,7 @@ type Statefulset struct { } // GetStatefulsetResource get StatefulSet resource statistics -func GetStatefulsetResource(cli client.ResourceHandler, statefulSet *v1beta1.StatefulSet) (*common.ResourceList, error) { +func GetStatefulsetResource(cli client.ResourceHandler, statefulSet *appsv1.StatefulSet) (*common.ResourceList, error) { obj, err := cli.Get(api.ResourceNameStatefulSet, statefulSet.Namespace, statefulSet.Name) if err != nil { if errors.IsNotFound(err) { @@ -28,7 +28,7 @@ func GetStatefulsetResource(cli client.ResourceHandler, statefulSet *v1beta1.Sta } return nil, err } - old := obj.(*v1beta1.StatefulSet) + old := obj.(*appsv1.StatefulSet) oldResourceList := common.StatefulsetResourceList(old) newResourceList := common.StatefulsetResourceList(statefulSet) @@ -38,11 +38,11 @@ func GetStatefulsetResource(cli client.ResourceHandler, statefulSet *v1beta1.Sta }, nil } -func CreateOrUpdateStatefulset(cli *kubernetes.Clientset, statefulSet *v1beta1.StatefulSet) (*v1beta1.StatefulSet, error) { - old, err := cli.AppsV1beta1().StatefulSets(statefulSet.Namespace).Get(statefulSet.Name, metaV1.GetOptions{}) +func CreateOrUpdateStatefulset(cli *kubernetes.Clientset, statefulSet *appsv1.StatefulSet) (*appsv1.StatefulSet, error) { + old, err := cli.AppsV1().StatefulSets(statefulSet.Namespace).Get(statefulSet.Name, metaV1.GetOptions{}) if err != nil { if errors.IsNotFound(err) { - return cli.AppsV1beta1().StatefulSets(statefulSet.Namespace).Create(statefulSet) + return cli.AppsV1().StatefulSets(statefulSet.Namespace).Create(statefulSet) } return nil, err } @@ -51,11 +51,11 @@ func CreateOrUpdateStatefulset(cli *kubernetes.Clientset, statefulSet *v1beta1.S old.Spec = statefulSet.Spec old.Spec.Template.Labels = maps.MergeLabels(oldTemplateLabels, statefulSet.Spec.Template.Labels) - return cli.AppsV1beta1().StatefulSets(statefulSet.Namespace).Update(old) + return cli.AppsV1().StatefulSets(statefulSet.Namespace).Update(old) } func GetStatefulsetDetail(cli *kubernetes.Clientset, indexer *client.CacheFactory, name, namespace string) (*Statefulset, error) { - statefulSet, err := cli.AppsV1beta1().StatefulSets(namespace).Get(name, metaV1.GetOptions{}) + statefulSet, err := cli.AppsV1().StatefulSets(namespace).Get(name, metaV1.GetOptions{}) if err != nil { return nil, err } diff --git a/src/backend/routers/commentsRouter_controllers_kubernetes_job.go b/src/backend/routers/commentsRouter_controllers_kubernetes_job.go index 30f0d3709..a58e7af70 100644 --- a/src/backend/routers/commentsRouter_controllers_kubernetes_job.go +++ b/src/backend/routers/commentsRouter_controllers_kubernetes_job.go @@ -15,6 +15,13 @@ func init() { AllowHTTPMethods: []string{"get"}, MethodParams: param.Make(), Filters: nil, + Params: nil}, + beego.ControllerComments{ + Method: "DeleteJob", + Router: `/namespaces/:namespace/clusters/:cluster`, + AllowHTTPMethods: []string{"delete"}, + MethodParams: param.Make(), + Filters: nil, Params: nil}) } diff --git a/src/frontend/src/app/portal/cronjob/list-job/list-job.component.html b/src/frontend/src/app/portal/cronjob/list-job/list-job.component.html index d4675d2a6..b48ea3c08 100644 --- a/src/frontend/src/app/portal/cronjob/list-job/list-job.component.html +++ b/src/frontend/src/app/portal/cronjob/list-job/list-job.component.html @@ -129,6 +129,11 @@