2025-03-30 15:20:07 +08:00

150 lines
3.6 KiB
Go

package k8s
import (
"encoding/base64"
"fmt"
"time"
"github.com/infraboard/mcube/v2/crypto/cbc"
"github.com/infraboard/mcube/v2/ioc/config/validator"
"github.com/infraboard/mcube/v2/tools/pretty"
k8s_client "github.com/infraboard/mpaas/provider/k8s"
)
type Cluster struct {
Id string `json:"id" bson:"_id"`
// 录入时间
CreateAt int64 `json:"create_at" bson:"create_at"`
// 更新时间
UpdateAt int64 `json:"update_at" bson:"update_at"`
// 更新人
UpdateBy string `json:"update_by" bson:"update_by"`
// 集群相关信息
ServerInfo ServerInfo `json:"server_info" bson:",inline"`
// 集群定义信息
CreateClusterRequest `bson:",inline"`
// 集群状态
Status Status `json:"status" bson:",inline"`
isEncrypted bool
}
func (r *Cluster) String() string {
return pretty.ToJSON(r)
}
func (r *Cluster) SetIsEncrypted(v bool) {
r.isEncrypted = v
}
func (r *Cluster) EncryptedKubeConf() error {
if r.isEncrypted {
return nil
}
key, err := base64.StdEncoding.DecodeString(SECRET_KEY)
if err != nil {
return err
}
cipherText, err := cbc.MustNewAESCBCCihper(key).Encrypt([]byte(r.KubeConfig))
if err != nil {
return err
}
r.KubeConfig = base64.StdEncoding.EncodeToString(cipherText)
r.SetIsEncrypted(true)
return nil
}
func (r *Cluster) DecryptedKubeConf() error {
if r.isEncrypted {
cipherdText, err := base64.StdEncoding.DecodeString(r.KubeConfig)
if err != nil {
return err
}
key, err := base64.StdEncoding.DecodeString(SECRET_KEY)
if err != nil {
return err
}
plainText, err := cbc.MustNewAESCBCCihper(key).Decrypt([]byte(cipherdText))
if err != nil {
return err
}
r.KubeConfig = string(plainText)
r.SetIsEncrypted(false)
}
return nil
}
func (c *Cluster) GetK8sClient() (*k8s_client.Client, error) {
return k8s_client.NewClient(c.KubeConfig)
}
func (i *Cluster) IsAlive() error {
if !i.Status.IsAlive {
return fmt.Errorf(i.Status.Message)
}
return nil
}
type ServerInfo struct {
// k8s的地址
Server string `json:"server" bson:"server"`
// k8s版本
Version string `json:"version" bson:"version"`
// 连接用户
AuthUser string `json:"auth_user" bson:"auth_user"`
}
func NewCluster(req *CreateClusterRequest) (*Cluster, error) {
if err := req.Validate(); err != nil {
return nil, err
}
return &Cluster{
CreateAt: time.Now().Unix(),
UpdateAt: time.Now().Unix(),
CreateClusterRequest: *req,
}, nil
}
type CreateClusterRequest struct {
// 集群所属域
Domain string `json:"domain" form:"domain" bson:"domain"`
// 集群所属空间
Namespace string `json:"namespace" form:"namespace" bson:"namespace"`
// 创建人
CreateBy string `json:"create_by" form:"create_by" bson:"create_by"`
// 集群提供商
Provider string `json:"provider" bson:"provider" form:"provider" validate:"required"`
// 集群所处地域
Region string `json:"region" bson:"region" form:"region" validate:"required"`
// 名称
Name string `json:"name" bson:"name" form:"name" validate:"required"`
// 集群客户端访问凭证
KubeConfig string `json:"kube_config" bson:"kube_config" form:"kube_config" validate:"required" mask:",10,10"`
// 集群描述
Description string `json:"description" form:"description" bson:"description"`
// 集群标签, env=prod
Lables map[string]string `json:"lables" form:"lables" bson:"lables"`
}
func (req CreateClusterRequest) Validate() error {
return validator.Validate(req)
}
type Status struct {
// 检查时间
CheckAt int64 `json:"check_at" bson:"check_at"`
// API Server是否正常
IsAlive bool `json:"is_alive" bson:"is_alive"`
// 异常消息
Message string `json:"message" bson:"message"`
}