package executor import ( "fmt" kubekeyapi "github.com/kubesphere/kubekey/pkg/apis/kubekey/v1alpha1" "github.com/kubesphere/kubekey/pkg/util/manager" "github.com/kubesphere/kubekey/pkg/util/ssh" "github.com/pkg/errors" log "github.com/sirupsen/logrus" "os" "path/filepath" ) type Executor struct { cluster *kubekeyapi.ClusterSpec logger *log.Logger Verbose bool } func NewExecutor(cluster *kubekeyapi.ClusterSpec, logger *log.Logger, verbose bool) *Executor { return &Executor{ cluster: cluster, logger: logger, Verbose: verbose, } } func (executor *Executor) CreateManager() (*manager.Manager, error) { mgr := &manager.Manager{} defaultCluster, hostGroups := executor.cluster.SetDefaultClusterSpec() mgr.AllNodes = hostGroups.All mgr.EtcdNodes = hostGroups.Etcd mgr.MasterNodes = hostGroups.Master mgr.WorkerNodes = hostGroups.Worker mgr.K8sNodes = hostGroups.K8s mgr.ClientNode = hostGroups.Client mgr.Cluster = defaultCluster mgr.ClusterHosts = GenerateHosts(hostGroups, defaultCluster) mgr.Connector = ssh.NewConnector() mgr.WorkDir = GenerateWorkDir(executor.logger) mgr.Logger = executor.logger mgr.Verbose = executor.Verbose return mgr, nil } func GenerateHosts(hostGroups *kubekeyapi.HostGroups, cfg *kubekeyapi.ClusterSpec) []string { var lbHost string hostsList := []string{} if cfg.ControlPlaneEndpoint.Address != "" { lbHost = fmt.Sprintf("%s %s", cfg.ControlPlaneEndpoint.Address, cfg.ControlPlaneEndpoint.Domain) } else { lbHost = fmt.Sprintf("%s %s", hostGroups.Master[0].InternalAddress, cfg.ControlPlaneEndpoint.Domain) } for _, host := range cfg.Hosts { if host.Name != "" { hostsList = append(hostsList, fmt.Sprintf("%s %s.%s %s", host.InternalAddress, host.Name, cfg.Kubernetes.ClusterName, host.Name)) } } hostsList = append(hostsList, lbHost) return hostsList } func GenerateWorkDir(logger *log.Logger) string { currentDir, err := filepath.Abs(filepath.Dir(os.Args[0])) if err != nil { logger.Fatal(errors.Wrap(err, "Faild to get current dir")) } return fmt.Sprintf("%s/%s", currentDir, kubekeyapi.DefaultPreDir) }