drone-kubernetes/k8s/config.go
谢作欢 4f6f6a0d6a 🎉
2023-11-02 17:24:36 +08:00

157 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package k8s
import (
"fmt"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/tools/clientcmd/api"
"os"
"strings"
)
type config struct {
Host string `json:"host"` // K8S地址
AuthType AuthType `json:"authType"` // 认证方式 0:config 1:token
Config string `json:"config"` // 认证配置文件
Token string `json:"token"` // 认证Token
IsSkipTls bool `json:"isSkipTls"` // 是否跳过TLS认证
CaCrt string `json:"caCrt"` // CA证书
ClusterName string `json:"clusterName"` // 集群名称
resetConf *rest.Config
}
type option func(c *config)
func WithHost(host string) option {
return func(c *config) {
c.Host = host
}
}
func WithAuthType(authType string) option {
return func(c *config) {
switch strings.ToUpper(authType) {
case "CONFIG":
c.AuthType = AuthConfig
case "TOKEN":
c.AuthType = AuthToken
}
}
}
func WithConfig(conf string) option {
return func(c *config) {
c.Config = conf
}
}
func WithToken(token string) option {
return func(c *config) {
c.Token = token
}
}
func WithIsSkipTls(isSkipTls bool) option {
return func(c *config) {
c.IsSkipTls = isSkipTls
}
}
func WithCaCrt(caCrt string) option {
return func(c *config) {
c.CaCrt = caCrt
}
}
func WithCluster(cluster string) option {
return func(c *config) {
c.ClusterName = cluster
}
}
func NewConfig(opts ...option) (*config, error) {
c := &config{}
for _, opt := range opts {
opt(c)
}
if err := c.valid(); err != nil {
return nil, err
}
var restConfig *rest.Config
var err error
switch c.AuthType {
case AuthToken:
restConfig, err = clientcmd.BuildConfigFromKubeconfigGetter(c.Host, func() (*api.Config, error) {
apiConf := &api.Config{
Clusters: map[string]*api.Cluster{
c.ClusterName: {
Server: c.Host,
InsecureSkipTLSVerify: c.IsSkipTls,
CertificateAuthorityData: []byte(c.CaCrt),
},
},
AuthInfos: map[string]*api.AuthInfo{
c.ClusterName: {
Token: c.Token,
},
},
Contexts: map[string]*api.Context{
c.ClusterName: {
Cluster: c.ClusterName,
AuthInfo: c.ClusterName,
},
},
CurrentContext: c.ClusterName,
}
// 如果跳过TLS认证则清空CA证书
if c.IsSkipTls {
apiConf.Clusters[c.ClusterName].InsecureSkipTLSVerify = c.IsSkipTls
apiConf.Clusters[c.ClusterName].CertificateAuthorityData = nil
}
return apiConf, nil
})
case AuthConfig:
restConfig, err = clientcmd.BuildConfigFromFlags(c.Host, c.GetConfigPath())
}
if err != nil {
return nil, err
}
c.resetConf = restConfig
return c, nil
}
func (c *config) valid() error {
if !strings.HasPrefix(c.Host, "https://") && !strings.HasPrefix(c.Host, "http://") {
c.Host = fmt.Sprintf("https://%s", c.Host)
}
if c.Token == "" && c.Config == "" {
return fmt.Errorf("auth token or auth config not empty")
}
if c.ClusterName == "" {
c.ClusterName = "default"
}
return nil
}
func (c *config) GetConfigPath() string {
if err := os.WriteFile("./kubernetes", []byte(c.Config), 0644); err != nil {
panic(err)
}
return "./kubernetes"
}