From cdd7ec06bdfdcc6ef0d3ac465a6ed59d92c9136e Mon Sep 17 00:00:00 2001 From: jianli-97 Date: Wed, 27 Mar 2024 10:21:30 +0800 Subject: [PATCH] Add the framework that supports PXE deployment --- cmd/deploy.go | 53 +++++++++++++++++++++++---------------------- cmd/destroy.go | 9 ++++++-- cmd/extend.go | 2 +- pkg/infra/infra.go | 54 ++++++++++++++++++++++++++++++++-------------- 4 files changed, 73 insertions(+), 45 deletions(-) diff --git a/cmd/deploy.go b/cmd/deploy.go index 17f3ca1..07137a6 100755 --- a/cmd/deploy.go +++ b/cmd/deploy.go @@ -143,8 +143,13 @@ func startHttpService(conf *asset.ClusterAsset) (*httpserver.HttpFileService, er } func deployCluster(conf *asset.ClusterAsset) error { - if err := generateDeployConfig(conf); err != nil { - logrus.Errorf("Failed to get cluster deploy config: %v", err) + if err := generateCerts(conf); err != nil { + logrus.Errorf("Error generating certificate files: %v", err) + return err + } + + if err := generateIgnition(conf); err != nil { + logrus.Errorf("Error generating ignition files: %v", err) return err } @@ -155,9 +160,24 @@ func deployCluster(conf *asset.ClusterAsset) error { } defer fileService.Stop() - if err := createCluster(conf); err != nil { - logrus.Errorf("Failed to create cluster: %v", err) - return err + switch strings.ToLower(conf.Platform) { + case "pxe": + // TODO: 判断OS类型,若不是NestOS,则需创建kickstart文件 + + if err := createCluster(conf); err != nil { + logrus.Errorf("Failed to create cluster: %v", err) + return err + } + default: + if err := generateTF(conf); err != nil { + logrus.Errorf("Error generating terraform files: %v", err) + return err + } + + if err := createCluster(conf); err != nil { + logrus.Errorf("Failed to create cluster: %v", err) + return err + } } configPath := conf.Kubernetes.AdminKubeConfig @@ -197,25 +217,6 @@ func deployCluster(conf *asset.ClusterAsset) error { return nil } -func generateDeployConfig(conf *asset.ClusterAsset) error { - if err := generateCerts(conf); err != nil { - logrus.Errorf("Error generating certificate files: %v", err) - return err - } - - if err := generateIgnition(conf); err != nil { - logrus.Errorf("Error generating ignition files: %v", err) - return err - } - - if err := generateTF(conf); err != nil { - logrus.Errorf("Error generating terraform files: %v", err) - return err - } - - return nil -} - func generateCerts(conf *asset.ClusterAsset) error { cg := cert.NewCertGenerator(conf.Cluster_ID, &conf.Master[0]) err := cg.GenerateAllFiles() @@ -270,12 +271,12 @@ func generateTF(conf *asset.ClusterAsset) error { func createCluster(conf *asset.ClusterAsset) error { persistDir := configmanager.GetPersistDir() - masterInfra := infra.InstanceCluster(persistDir, conf.Cluster_ID, "master", uint(len(conf.Master))) + masterInfra := infra.InstanceCluster(persistDir, conf.Platform, conf.Cluster_ID, "master", uint(len(conf.Master))) if err := masterInfra.Deploy(); err != nil { logrus.Errorf("Failed to deploy master nodes:%v", err) return err } - workerInfra := infra.InstanceCluster(persistDir, conf.Cluster_ID, "worker", uint(len(conf.Worker))) + workerInfra := infra.InstanceCluster(persistDir, conf.Platform, conf.Cluster_ID, "worker", uint(len(conf.Worker))) if err := workerInfra.Deploy(); err != nil { logrus.Errorf("Failed to deploy worker nodes:%v", err) return err diff --git a/cmd/destroy.go b/cmd/destroy.go index ade2fba..97e1fbb 100644 --- a/cmd/destroy.go +++ b/cmd/destroy.go @@ -51,13 +51,18 @@ func runDestroyCmd(cmd *cobra.Command, args []string) error { return err } persistDir := configmanager.GetPersistDir() + clusterConfig, err := configmanager.GetClusterConfig(clusterID) + if err != nil { + logrus.Errorf("Failed to get cluster config using the cluster id: %v", err) + return err + } - workerInfra := infra.InstanceCluster(persistDir, clusterID, "worker", 0) + workerInfra := infra.InstanceCluster(persistDir, clusterConfig.Platform, clusterID, "worker", 0) if err := workerInfra.Destroy(); err != nil { logrus.Errorf("Failed to perform the destroy worker nodes:%v", err) return err } - masterInfra := infra.InstanceCluster(persistDir, clusterID, "master", 0) + masterInfra := infra.InstanceCluster(persistDir, clusterConfig.Platform, clusterID, "master", 0) if err := masterInfra.Destroy(); err != nil { logrus.Errorf("Failed to perform the destroy master nodes:%v", err) return err diff --git a/cmd/extend.go b/cmd/extend.go index d073710..655f023 100755 --- a/cmd/extend.go +++ b/cmd/extend.go @@ -139,7 +139,7 @@ func extendCluster(conf *asset.ClusterAsset, fileService *httpserver.HttpFileSer } persistDir := configmanager.GetPersistDir() - workerInfra := infra.InstanceCluster(persistDir, conf.Cluster_ID, "worker", uint(len(conf.Worker))) + workerInfra := infra.InstanceCluster(persistDir, conf.Platform, conf.Cluster_ID, "worker", uint(len(conf.Worker))) if err := workerInfra.Deploy(); err != nil { logrus.Errorf("Failed to deploy worker nodes:%v", err) return err diff --git a/pkg/infra/infra.go b/pkg/infra/infra.go index 81338bc..2cdb6e9 100644 --- a/pkg/infra/infra.go +++ b/pkg/infra/infra.go @@ -19,6 +19,7 @@ package infra import ( "nestos-kubernetes-deployer/pkg/infra/terraform" "path/filepath" + "strings" "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -26,47 +27,68 @@ import ( type Cluster struct { PersistDir string + Platform string ClusterID string Node string Count uint } func (c *Cluster) Deploy() (err error) { - tfFileDir := filepath.Join(c.PersistDir, c.ClusterID, c.Node) - outputs, err := terraform.ExecuteApplyTerraform(tfFileDir, c.PersistDir) - if err != nil { - return errors.Wrap(err, "failed to execute terraform apply") + switch strings.ToLower(c.Platform) { + case "pxe": + // TODO: 创建dhcpd.conf,指定子网配置、tftp服务器的ip地址、引导文件路径 + + // TODO: 创建tftp服务器 + + default: + tfFileDir := filepath.Join(c.PersistDir, c.ClusterID, c.Node) + outputs, err := terraform.ExecuteApplyTerraform(tfFileDir, c.PersistDir) + if err != nil { + return errors.WithMessage(err, "failed to execute terraform apply") + } + logrus.Println(string(outputs)) } - logrus.Println(string(outputs)) return nil } func (c *Cluster) Extend() (err error) { - tfFileDir := filepath.Join(c.PersistDir, c.ClusterID, c.Node) - outputs, err := terraform.ExecuteApplyTerraform(tfFileDir, c.PersistDir) - if err != nil { - return errors.Wrap(err, "failed to execute terraform apply") + switch strings.ToLower(c.Platform) { + case "pxe": + // TODO + return nil + default: + tfFileDir := filepath.Join(c.PersistDir, c.ClusterID, c.Node) + outputs, err := terraform.ExecuteApplyTerraform(tfFileDir, c.PersistDir) + if err != nil { + return errors.WithMessage(err, "failed to execute terraform apply") + } + logrus.Println(string(outputs)) } - logrus.Println(string(outputs)) return nil } func (c *Cluster) Destroy() (err error) { - // tf file directory. - tfFileDir := filepath.Join(c.PersistDir, c.ClusterID, c.Node) - err = terraform.ExecuteDestroyTerraform(tfFileDir, c.PersistDir) - if err != nil { - return errors.Wrap(err, "failed to execute terraform destroy") + switch strings.ToLower(c.Platform) { + case "pxe": + // TODO + return nil + default: + tfFileDir := filepath.Join(c.PersistDir, c.ClusterID, c.Node) + err = terraform.ExecuteDestroyTerraform(tfFileDir, c.PersistDir) + if err != nil { + return errors.WithMessage(err, "failed to execute terraform destroy") + } } return nil } -func InstanceCluster(persistDir string, clusterID string, nodeType string, count uint) *Cluster { +func InstanceCluster(persistDir string, platform string, clusterID string, nodeType string, count uint) *Cluster { return &Cluster{ PersistDir: persistDir, + Platform: platform, ClusterID: clusterID, Node: nodeType, Count: count, -- Gitee