🤬
  • ■ ■ ■ ■ ■
    go.mod
    skipped 85 lines
    86 86   k8s.io/apimachinery v0.22.0
    87 87   k8s.io/cli-runtime v0.22.0
    88 88   k8s.io/client-go v0.22.0
     89 + k8s.io/metrics v0.21.0
    89 90   rsc.io/letsencrypt v0.0.3 // indirect
    90 91  )
    91 92   
    skipped 12 lines
  • ■ ■ ■ ■ ■
    go.sum
    skipped 1851 lines
    1852 1852  k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
    1853 1853  k8s.io/kubectl v0.21.0 h1:WZXlnG/yjcE4LWO2g6ULjFxtzK6H1TKzsfaBFuVIhNg=
    1854 1854  k8s.io/kubectl v0.21.0/go.mod h1:EU37NukZRXn1TpAkMUoy8Z/B2u6wjHDS4aInsDzVvks=
     1855 +k8s.io/metrics v0.21.0 h1:uwS3CgheLKaw3PTpwhjMswnm/PMqeLbdLH88VI7FMQQ=
    1855 1856  k8s.io/metrics v0.21.0/go.mod h1:L3Ji9EGPP1YBbfm9sPfEXSpnj8i24bfQbAFAsW0NueQ=
    1856 1857  k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
    1857 1858  k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
    skipped 31 lines
  • ■ ■ ■ ■ ■ ■
    pkg/constant/rbac.go
    skipped 66 lines
    67 67   "/api/v1/clusters/{**}/{**}/{**}/{**}",
    68 68   "/api/v1/clusters/{**}/{**}/{**}/{**}/{**}",
    69 69   "/api/v1/clusters/{**}/{**}/{**}/{**}/{**}/{**}",
     70 + "/api/v1/kubernetes/search",
     71 + "/api/v1/kubernetes/search/metric/{**}",
     72 + "/api/v1/kubernetes/{**}",
     73 + "/api/v1/kubernetes/{**}/{**}",
    70 74   "/api/v1/users/change/password",
    71 75   "/api/v1/logs",
    72 76   "/api/v1/tasks",
    skipped 248 lines
  • ■ ■ ■ ■ ■ ■
    pkg/controller/kubernetes.go
     1 +package controller
     2 + 
     3 +import (
     4 + "github.com/KubeOperator/KubeOperator/pkg/dto"
     5 + "github.com/KubeOperator/KubeOperator/pkg/service"
     6 + "github.com/go-playground/validator/v10"
     7 + "github.com/kataras/iris/v12/context"
     8 +)
     9 + 
     10 +type KubernetesController struct {
     11 + Ctx context.Context
     12 + KubernetesService service.KubernetesService
     13 +}
     14 + 
     15 +func NewKubernetesController() *KubernetesController {
     16 + return &KubernetesController{
     17 + KubernetesService: service.NewKubernetesService(),
     18 + }
     19 +}
     20 + 
     21 +func (k KubernetesController) PostSearch() (interface{}, error) {
     22 + var req dto.SourceSearch
     23 + err := k.Ctx.ReadJSON(&req)
     24 + if err != nil {
     25 + return dto.SourceList{}, err
     26 + }
     27 + validate := validator.New()
     28 + err = validate.Struct(req)
     29 + if err != nil {
     30 + return dto.SourceList{}, err
     31 + }
     32 + 
     33 + return k.KubernetesService.Get(req)
     34 +}
     35 + 
     36 +func (k KubernetesController) PostSearchMetricBy(cluster string) (interface{}, error) {
     37 + return k.KubernetesService.GetMetric(cluster)
     38 +}
     39 + 
     40 +func (k KubernetesController) PostCreateSc() error {
     41 + var req dto.SourceScCreate
     42 + if err := k.Ctx.ReadJSON(&req); err != nil {
     43 + return err
     44 + }
     45 + 
     46 + return k.KubernetesService.CreateSc(req)
     47 +}
     48 + 
     49 +func (k KubernetesController) PostCreateSecret() error {
     50 + var req dto.SourceSecretCreate
     51 + if err := k.Ctx.ReadJSON(&req); err != nil {
     52 + return err
     53 + }
     54 + 
     55 + return k.KubernetesService.CreateSecret(req)
     56 +}
     57 + 
     58 +func (k KubernetesController) PostCordon() error {
     59 + var req dto.Cordon
     60 + if err := k.Ctx.ReadJSON(&req); err != nil {
     61 + return err
     62 + }
     63 + 
     64 + return k.KubernetesService.CordonNode(req)
     65 +}
     66 + 
     67 +func (k KubernetesController) PostEvict() error {
     68 + var req dto.Evict
     69 + if err := k.Ctx.ReadJSON(&req); err != nil {
     70 + return err
     71 + }
     72 + 
     73 + return k.KubernetesService.EvictPod(req)
     74 +}
     75 + 
     76 +func (k KubernetesController) PostDelete() error {
     77 + var req dto.SourceDelete
     78 + if err := k.Ctx.ReadJSON(&req); err != nil {
     79 + return err
     80 + }
     81 + 
     82 + return k.KubernetesService.Delete(req)
     83 +}
     84 + 
  • ■ ■ ■ ■ ■ ■
    pkg/dto/kubernetes.go
     1 +package dto
     2 + 
     3 +import (
     4 + v1 "k8s.io/api/core/v1"
     5 + storagev1 "k8s.io/api/storage/v1"
     6 +)
     7 + 
     8 +type SourceSearch struct {
     9 + Cluster string `json:"cluster"`
     10 + Kind string `json:"kind"`
     11 + Name string `json:"name"`
     12 + Namespace string `json:"namespace"`
     13 + Limit int64 `json:"limit"`
     14 + Continue string `json:"continue"`
     15 +}
     16 + 
     17 +type SourceList struct {
     18 + Kind string `json:"kind"`
     19 + ApiVersion string `json:"apiVersion"`
     20 + Metadata string `json:"metadata"`
     21 + Items []interface{} `json:"items"`
     22 +}
     23 + 
     24 +type SourceScCreate struct {
     25 + Cluster string `json:"cluster"`
     26 + Info storagev1.StorageClass `json:"info"`
     27 +}
     28 + 
     29 +type SourceSecretCreate struct {
     30 + Cluster string `json:"cluster"`
     31 + Namespace string `json:"namespace"`
     32 + Info v1.Secret `json:"info"`
     33 +}
     34 + 
     35 +type SourceDelete struct {
     36 + Cluster string `json:"cluster"`
     37 + Kind string `json:"kind"`
     38 + Name string `json:"name"`
     39 + Namespace string `json:"namespace"`
     40 +}
     41 + 
     42 +type Cordon struct {
     43 + Name string `json:"name"`
     44 + Cluster string `json:"cluster"`
     45 + SetUnschedulable bool `json:"setUnschedulable"`
     46 +}
     47 + 
     48 +type Evict struct {
     49 + Name string `json:"name"`
     50 + Cluster string `json:"cluster"`
     51 + Namespace string `json:"namespace"`
     52 +}
     53 + 
  • ■ ■ ■ ■ ■
    pkg/router/v1/v1api.go
    skipped 40 lines
    41 41   mvc.New(AuthScope.Party("/logs")).HandleError(ErrorHandler).Handle(controller.NewSystemLogController())
    42 42   mvc.New(AuthScope.Party("/projects")).HandleError(ErrorHandler).Handle(controller.NewProjectController())
    43 43   mvc.New(AuthScope.Party("/clusters/provisioner")).HandleError(ErrorHandler).Handle(controller.NewProvisionerController())
     44 + mvc.New(AuthScope.Party("/kubernetes")).HandleError(ErrorHandler).Handle(controller.NewKubernetesController())
    44 45   mvc.New(AuthScope.Party("/clusters/tool")).HandleError(ErrorHandler).Handle(controller.NewClusterToolController())
    45 46   mvc.New(AuthScope.Party("/backupaccounts")).HandleError(ErrorHandler).Handle(controller.NewBackupAccountController())
    46 47   mvc.New(AuthScope.Party("/clusters/backup")).HandleError(ErrorHandler).Handle(controller.NewClusterBackupStrategyController())
    skipped 76 lines
  • ■ ■ ■ ■ ■ ■
    pkg/service/kubernetes.go
     1 +package service
     2 + 
     3 +import (
     4 + "context"
     5 + 
     6 + "github.com/KubeOperator/KubeOperator/pkg/dto"
     7 + "github.com/KubeOperator/KubeOperator/pkg/repository"
     8 + clusterUtil "github.com/KubeOperator/KubeOperator/pkg/util/cluster"
     9 + "helm.sh/helm/v3/pkg/time"
     10 + policyv1beta1 "k8s.io/api/policy/v1beta1"
     11 + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
     12 + metricsclientset "k8s.io/metrics/pkg/client/clientset/versioned"
     13 +)
     14 + 
     15 +type KubernetesService interface {
     16 + Get(req dto.SourceSearch) (interface{}, error)
     17 + GetMetric(cluster string) (interface{}, error)
     18 + CreateSc(req dto.SourceScCreate) error
     19 + CreateSecret(req dto.SourceSecretCreate) error
     20 + CordonNode(req dto.Cordon) error
     21 + EvictPod(req dto.Evict) error
     22 + Delete(req dto.SourceDelete) error
     23 +}
     24 + 
     25 +type kubernetesService struct {
     26 + clusterService ClusterService
     27 + clusterRepo repository.ClusterRepository
     28 +}
     29 + 
     30 +func NewKubernetesService() KubernetesService {
     31 + return &kubernetesService{
     32 + clusterService: NewClusterService(),
     33 + clusterRepo: repository.NewClusterRepository(),
     34 + }
     35 +}
     36 + 
     37 +func (k kubernetesService) Get(req dto.SourceSearch) (interface{}, error) {
     38 + cluster, err := k.clusterRepo.GetWithPreload(req.Cluster, []string{"SpecConf", "Secret", "Nodes", "Nodes.Host", "Nodes.Host.Credential"})
     39 + if err != nil {
     40 + return "", err
     41 + }
     42 + client, err := clusterUtil.NewClusterClient(&cluster)
     43 + if err != nil {
     44 + return "", err
     45 + }
     46 + 
     47 + switch req.Kind {
     48 + case "namespacelist":
     49 + ns, err := client.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})
     50 + return ns, err
     51 + case "podlist":
     52 + pods, err := client.CoreV1().Pods(req.Namespace).List(context.TODO(), metav1.ListOptions{})
     53 + return pods, err
     54 + case "deploymentlist":
     55 + pods, err := client.AppsV1().Deployments(req.Namespace).List(context.TODO(), metav1.ListOptions{})
     56 + return pods, err
     57 + case "nodelist":
     58 + nodes, err := client.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
     59 + return nodes, err
     60 + case "secret":
     61 + secret, err := client.CoreV1().Secrets(req.Namespace).Get(context.TODO(), req.Name, metav1.GetOptions{})
     62 + return secret, err
     63 + case "storageclasslist":
     64 + if req.Limit != 0 {
     65 + storageclass, err := client.StorageV1().StorageClasses().List(context.TODO(), metav1.ListOptions{Limit: req.Limit, Continue: req.Continue})
     66 + return storageclass, err
     67 + } else {
     68 + storageclass, err := client.StorageV1().StorageClasses().List(context.TODO(), metav1.ListOptions{})
     69 + return storageclass, err
     70 + }
     71 + case "overviewdatas":
     72 + var overDatas OverViewData
     73 + deployments, err := client.AppsV1().Deployments(req.Namespace).List(context.TODO(), metav1.ListOptions{})
     74 + if err != nil {
     75 + return overDatas, err
     76 + }
     77 + overDatas.Deployments = len(deployments.Items)
     78 + 
     79 + pods, err := client.CoreV1().Pods(req.Namespace).List(context.TODO(), metav1.ListOptions{})
     80 + if err != nil {
     81 + return overDatas, err
     82 + }
     83 + overDatas.Pods = len(pods.Items)
     84 + for _, po := range pods.Items {
     85 + overDatas.Containers += len(po.Spec.Containers)
     86 + }
     87 + 
     88 + ns, err := client.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})
     89 + if err != nil {
     90 + return overDatas, err
     91 + }
     92 + overDatas.Namespaces = len(ns.Items)
     93 + 
     94 + nodes, err := client.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
     95 + if err != nil {
     96 + return overDatas, err
     97 + }
     98 + overDatas.Nodes = len(nodes.Items)
     99 + 
     100 + return overDatas, err
     101 + }
     102 + 
     103 + return dto.SourceList{}, nil
     104 +}
     105 + 
     106 +type OverViewData struct {
     107 + Deployments int `json:"deployments"`
     108 + Nodes int `json:"nodes"`
     109 + Namespaces int `json:"namespaces"`
     110 + Pods int `json:"pods"`
     111 + Containers int `json:"containers"`
     112 +}
     113 + 
     114 +func (k kubernetesService) GetMetric(clusterName string) (interface{}, error) {
     115 + cluster, err := k.clusterRepo.GetWithPreload(clusterName, []string{"SpecConf", "Secret", "Nodes", "Nodes.Host", "Nodes.Host.Credential"})
     116 + if err != nil {
     117 + return "", err
     118 + }
     119 + host, err := clusterUtil.LoadAvailableHost(&cluster)
     120 + if err != nil {
     121 + return "", err
     122 + }
     123 + config, err := clusterUtil.LoadConnConf(&cluster, host)
     124 + if err != nil {
     125 + return "", err
     126 + }
     127 + mclient, err := metricsclientset.NewForConfig(config)
     128 + if err != nil {
     129 + return "", err
     130 + }
     131 + 
     132 + ms, err := mclient.MetricsV1beta1().NodeMetricses().List(context.TODO(), metav1.ListOptions{})
     133 + return ms, err
     134 +}
     135 + 
     136 +func (k kubernetesService) CreateSc(req dto.SourceScCreate) error {
     137 + cluster, err := k.clusterRepo.GetWithPreload(req.Cluster, []string{"SpecConf", "Secret", "Nodes", "Nodes.Host", "Nodes.Host.Credential"})
     138 + if err != nil {
     139 + return err
     140 + }
     141 + client, err := clusterUtil.NewClusterClient(&cluster)
     142 + if err != nil {
     143 + return err
     144 + }
     145 + _, err = client.StorageV1().StorageClasses().Create(context.TODO(), &req.Info, metav1.CreateOptions{})
     146 + return err
     147 +}
     148 + 
     149 +func (k kubernetesService) CordonNode(req dto.Cordon) error {
     150 + cluster, err := k.clusterRepo.GetWithPreload(req.Cluster, []string{"SpecConf", "Secret", "Nodes", "Nodes.Host", "Nodes.Host.Credential"})
     151 + if err != nil {
     152 + return err
     153 + }
     154 + client, err := clusterUtil.NewClusterClient(&cluster)
     155 + if err != nil {
     156 + return err
     157 + }
     158 + 
     159 + node, err := client.CoreV1().Nodes().Get(context.TODO(), req.Name, metav1.GetOptions{})
     160 + if err != nil {
     161 + return err
     162 + }
     163 + node.Spec.Unschedulable = req.SetUnschedulable
     164 + _, err = client.CoreV1().Nodes().Update(context.TODO(), node, metav1.UpdateOptions{})
     165 + return err
     166 +}
     167 + 
     168 +func (k kubernetesService) EvictPod(req dto.Evict) error {
     169 + cluster, err := k.clusterRepo.GetWithPreload(req.Cluster, []string{"SpecConf", "Secret", "Nodes", "Nodes.Host", "Nodes.Host.Credential"})
     170 + if err != nil {
     171 + return err
     172 + }
     173 + client, err := clusterUtil.NewClusterClient(&cluster)
     174 + if err != nil {
     175 + return err
     176 + }
     177 + 
     178 + rmPod := &policyv1beta1.Eviction{
     179 + TypeMeta: metav1.TypeMeta{
     180 + APIVersion: "policy/v1beta1",
     181 + Kind: "Eviction",
     182 + },
     183 + ObjectMeta: metav1.ObjectMeta{
     184 + Name: req.Name,
     185 + Namespace: req.Namespace,
     186 + CreationTimestamp: metav1.Time(time.Now()),
     187 + },
     188 + }
     189 + if err := client.CoreV1().Pods(req.Namespace).EvictV1beta1(context.TODO(), rmPod); err != nil {
     190 + return err
     191 + }
     192 + return err
     193 +}
     194 + 
     195 +func (k kubernetesService) CreateSecret(req dto.SourceSecretCreate) error {
     196 + cluster, err := k.clusterRepo.GetWithPreload(req.Cluster, []string{"SpecConf", "Secret", "Nodes", "Nodes.Host", "Nodes.Host.Credential"})
     197 + if err != nil {
     198 + return err
     199 + }
     200 + client, err := clusterUtil.NewClusterClient(&cluster)
     201 + if err != nil {
     202 + return err
     203 + }
     204 + _, err = client.CoreV1().Secrets(req.Namespace).Create(context.TODO(), &req.Info, metav1.CreateOptions{})
     205 + return err
     206 +}
     207 + 
     208 +func (k kubernetesService) Delete(req dto.SourceDelete) error {
     209 + cluster, err := k.clusterRepo.GetWithPreload(req.Cluster, []string{"SpecConf", "Secret", "Nodes", "Nodes.Host", "Nodes.Host.Credential"})
     210 + if err != nil {
     211 + return err
     212 + }
     213 + client, err := clusterUtil.NewClusterClient(&cluster)
     214 + if err != nil {
     215 + return err
     216 + }
     217 + 
     218 + switch req.Kind {
     219 + case "storageclass":
     220 + err := client.StorageV1().StorageClasses().Delete(context.TODO(), req.Name, metav1.DeleteOptions{})
     221 + return err
     222 + case "pod":
     223 + err := client.CoreV1().Pods(req.Namespace).Delete(context.TODO(), req.Name, metav1.DeleteOptions{})
     224 + return err
     225 + case "secret":
     226 + err := client.CoreV1().Secrets(req.Namespace).Delete(context.TODO(), req.Name, metav1.DeleteOptions{})
     227 + return err
     228 + }
     229 + return nil
     230 +}
     231 + 
Please wait...
Page is in error, reload to recover