150 lines
3.6 KiB
Go
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"`
|
|
}
|