zhangqian
2024-01-08 ae1fefcf99a264c52ef4762bb2b59648932b28b0
src/main/main.go
@@ -8,38 +8,134 @@
   "path/filepath"
   "time"
   "../create"
   "../delete"
   "basic.com/aps/aps_deploy.git/src/cluster"
   "basic.com/aps/aps_deploy.git/src/rancher"
   "basic.com/aps/aps_deploy.git/src/util"
   "k8s.io/client-go/kubernetes"
   "k8s.io/client-go/tools/clientcmd"
   "basic.com/aps/aps_deploy.git/src/create"
   "basic.com/aps/aps_deploy.git/src/delete"
   "basic.com/aps/aps_deploy.git/src/util"
   "basic.com/aps/aps_deploy.git/src/k8s"
   "github.com/spf13/viper"
)
var (
   replicas      int32 = 3
   replicas      int32 = 1
   port          int32 = 9081
   usedNodePorts       = make(map[int32]bool)
   namespaces          = []string{"guangsheng", "geruimi", "tongsheng"}
   namespaces          = []string{"testFactory1", "testFactory2", "testFactory3"}
)
func rancher_install_test(node rancher.Node) {
   /*   nodes := []Node{
      {
         Roles:       []string{"etcd", "controlplane", "worker"},
         IP:          "192.168.20.189",
         SSHUsername: "basic",
         SSHPassword: "123",
         SSHPort:     22,
      },
      {
         Roles:       []string{"worker"},
         IP:          "192.168.20.10",
         SSHUsername: "basic",
         SSHPassword: "123",
         SSHPort:     22,
      },
      {
         Roles:       []string{"worker"},
         IP:          "192.168.20.115",
         SSHUsername: "basic",
         SSHPassword: "alien123",
         SSHPort:     22,
      },
      // Add more nodes here if needed
   }*/
   //install rancher on master node
   err := rancher.InstallDockerAndRancher(node.IP, node.SSHUsername, node.SSHPassword, node.SSHPort)
   if err != nil {
      log.Fatalf("Failed to install Rancher: %v", err)
   }
   os.Exit(0)
}
func cluster_test(clusterName string, rancherClusterConfig rancher.RancherClusterConfig) {
   // Create the cluster
   // Rancher configuration
   /*rancherConfig := RancherConfig{
      RancherURL:  "https://192.168.20.119:8443",
      BearerToken: "token-nnrsc:w68zdt8s47fnpjd5xqdl5hhzpz4j2d56kt5nx49nsswcbpdzc28kh5",
   }*/
   fmt.Println(rancherClusterConfig)
   fmt.Println(rancherClusterConfig.RancherURL)
   fmt.Println(rancherClusterConfig.BearerToken)
   //   Deploy clusterId
   clusterID, err := cluster.GetClusterID(rancherClusterConfig.RancherURL, rancherClusterConfig.BearerToken, clusterName)
   if err != nil {
      fmt.Printf("Cluster not found: %s %v\n", clusterName, err)
      _, err = cluster.CreateCluster(rancherClusterConfig, clusterName)
      if err != nil {
         log.Fatalf("Failed to create cluster: %v", err)
      }
      fmt.Printf("Cluster created: %s\n", clusterName)
      clusterID, err = cluster.GetClusterID(rancherClusterConfig.RancherURL, rancherClusterConfig.BearerToken, clusterName)
      if err != nil {
         log.Fatal(err)
      }
   }
   fmt.Println(clusterID)
   //   Deploy nodeCommand
   nodeCommand, err := cluster.GetNodeCommand(rancherClusterConfig.RancherURL, rancherClusterConfig.BearerToken, clusterID)
   if err != nil {
      log.Fatal(err)
   }
   fmt.Println(nodeCommand)
   for _, node := range rancherClusterConfig.Nodes {
      //Deploy Docker on each node
      err = util.InstallDocker(node.IP, node.SSHUsername, node.SSHPassword, node.SSHPort)
      if err != nil {
         log.Fatal(err)
      }
      // Deploy Kubectl on each node
      err = util.InstallKubectl(node.IP, node.SSHUsername, node.SSHPassword, node.SSHPort)
      if err != nil {
         log.Fatal(err)
      }
      // Deploy Kubernetes roles on each node
      err = cluster.Deployk8sRolesOnNode(node.IP, node.SSHUsername, node.SSHPassword, nodeCommand, node.SSHPort, node.Roles)
      if err != nil {
         log.Fatal(err)
      }
   }
   os.Exit(0)
}
func main() {
   createCmd := flag.NewFlagSet("create", flag.ExitOnError)
   deleteCmd := flag.NewFlagSet("delete", flag.ExitOnError)
   testCmd := flag.NewFlagSet("test", flag.ExitOnError)
   clusterCmd := flag.NewFlagSet("cluster", flag.ExitOnError)
   rancherInstallCmd := flag.NewFlagSet("rancher_install", flag.ExitOnError)
   createNamespace := createCmd.String("ns", "", "Namespace name")
   createDeployment := createCmd.String("deployment", "", "Deployment name")
   fmt.Println(createDeployment)
   createService := createCmd.String("service", "", "Service name")
   fmt.Println(createService)
   deleteNamespace := deleteCmd.String("ns", "", "Namespace name")
   deleteDeployment := deleteCmd.String("deployment", "", "Deployment name")
   deleteService := deleteCmd.String("service", "", "Service name")
   if len(os.Args) < 2 {
      fmt.Println("create/delete/test command is required")
      fmt.Println("create/delete/test/cluster/rancher_install command is required")
      os.Exit(1)
   }
@@ -50,40 +146,94 @@
      deleteCmd.Parse(os.Args[2:])
   case "test":
      testCmd.Parse(os.Args[2:])
   case "cluster":
      clusterCmd.Parse(os.Args[2:])
   case "rancher_install":
      rancherInstallCmd.Parse(os.Args[2:])
   default:
      flag.PrintDefaults()
      os.Exit(1)
   }
   // 配置 Kubernetes 集群的 kubeconfig 路径
   kubeconfig := flag.String("kubeconfig", filepath.Join(util.homeDir(), ".kube", "config"), "kubeconfig file")
   flag.Parse()
   if rancherInstallCmd.Parsed() {
      //// 初始化配置解析库
      //viper.SetConfigName("config")
      //viper.SetConfigType("yaml")
      //viper.AddConfigPath("./config")
      //
      //// 读取配置文件
      //err := viper.ReadInConfig()
      //if err != nil {
      //   log.Fatalf("Failed to read config file: %v", err)
      //}
   // 创建 Kubernetes 客户端
   config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
   if err != nil {
      panic(err.Error())
   }
      // 解析配置文件中的字段
      var rancherClusterConfig rancher.RancherClusterConfig
      //err = viper.Unmarshal(&rancherClusterConfig)
      //if err != nil {
      //   log.Fatalf("Failed to unmarshal config: %v", err)
      //}
   clientset, err := kubernetes.NewForConfig(config)
   if err != nil {
      panic(err.Error())
      rancherClusterConfig.Nodes = make([]rancher.Node, 3)
      rancherClusterConfig.Nodes[0] = rancher.Node{
         Roles:       []string{"worker"},
         IP:          "192.168.20.119",
         SSHUsername: "basic",
         SSHPassword: "basic2021",
         SSHPort:     22,
      }
      rancher_install_test(rancherClusterConfig.Nodes[0])
      os.Exit(1)
   }
   // 执行 create 命令
   if createCmd.Parsed() {
      if *createNamespace == "" || *createDeployment == "" || *createService == "" {
      // 配置 Kubernetes 集群的 kubeconfig 路径
      kubeconfig := flag.String("kubeconfig", filepath.Join(util.HomeDir(), ".kube", "config"), "kubeconfig file")
      flag.Parse()
      fmt.Println(&kubeconfig)
      // 创建 Kubernetes 客户端
      config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
      if err != nil {
         panic(err.Error())
      }
      fmt.Println(&config)
      clientset, err := kubernetes.NewForConfig(config)
      if err != nil {
         panic(err.Error())
      }
      if *createNamespace == "" {
         fmt.Println("Namespace, Deployment, and Service names are required")
         createCmd.PrintDefaults()
         os.Exit(1)
      }
      err := create.CreateDeploymentAndService(clientset, *createNamespace, *createDeployment, *createService)
      err = k8s.CreateNamespace(clientset, *createNamespace)
      if err != nil {
         panic(err)
      }
      for _, proj := range k8s.Projects {
         obj := k8s.GetCreateObj(proj)
         err = obj.CreateDeploymentAndService(k8s.Config{
            Client:         clientset,
            NameSpace:      *createNamespace,
            DeploymentName: proj,
            ServiceName:    proj,
            Image:          "fai365.com:9088/aps/aps",
         }, nil)
         if err != nil {
            panic(err)
         }
      }
      nodeport, err := create.GetServiceNodePort(clientset, *createNamespace, *createService)
      nodeport, err := k8s.GetServiceNodePort(clientset, *createNamespace, "aps")
      if err != nil {
         panic(err)
      }
@@ -93,15 +243,41 @@
   // 执行 delete 命令
   if deleteCmd.Parsed() {
      // 配置 Kubernetes 集群的 kubeconfig 路径
      kubeconfig := flag.String("kubeconfig", filepath.Join(util.HomeDir(), ".kube", "config"), "kubeconfig file")
      flag.Parse()
      fmt.Println(*kubeconfig)
      fmt.Println(*kubeconfig)
      fmt.Println(*kubeconfig)
      fmt.Println(*kubeconfig)
      fmt.Println(*kubeconfig)
      // 创建 Kubernetes 客户端
      config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
      if err != nil {
         panic(err.Error())
      }
      clientset, err := kubernetes.NewForConfig(config)
      if err != nil {
         panic(err.Error())
      }
      if *deleteNamespace == "" || *deleteDeployment == "" || *deleteService == "" {
         fmt.Println("Namespace, Deployment, and Service names are required")
         deleteCmd.PrintDefaults()
         os.Exit(1)
      }
      err := delete.DeleteResources(clientset, *deleteNamespace, *deleteDeployment, *deleteService)
      if err != nil {
         panic(err)
      for _, proj := range k8s.Projects {
         err = k8s.DeleteResources(clientset, *deleteNamespace, proj, proj)
         if err != nil {
            panic(err)
         }
         if err != nil {
            panic(err)
         }
      }
      fmt.Println("Resources deleted.")
@@ -109,6 +285,21 @@
   // 执行创建和删除测试
   if testCmd.Parsed() {
      // 配置 Kubernetes 集群的 kubeconfig 路径
      kubeconfig := flag.String("kubeconfig", filepath.Join(util.HomeDir(), ".kube", "config"), "kubeconfig file")
      flag.Parse()
      // 创建 Kubernetes 客户端
      config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
      if err != nil {
         panic(err.Error())
      }
      clientset, err := kubernetes.NewForConfig(config)
      if err != nil {
         panic(err.Error())
      }
      fmt.Println("\033[97;40mRunning create and delete tests...\033[0m")
      // 创建测试
@@ -116,18 +307,27 @@
      for _, ns := range namespaces {
         deploymentName := ns
         serviceName := ns
         err := create.CreateDeploymentAndService(clientset, ns, deploymentName, serviceName)
         if err != nil {
            log.Printf("\033[97;41mFailed to create resources in namespace %s: %v\033[0m\n", ns, err)
         } else {
            nodeport, err := create.GetServiceNodePort(clientset, ns, ns)
         for _, proj := range k8s.Projects {
            obj := k8s.GetCreateObj(proj)
            err = obj.CreateDeploymentAndService(k8s.Config{
               Client:         clientset,
               NameSpace:      ns,
               DeploymentName: deploymentName,
               ServiceName:    serviceName,
            }, nil)
            if err != nil {
               panic(err)
            }
               log.Printf("\033[97;41mFailed to create resources in namespace %s: %v\033[0m\n", ns, err)
            } else {
               nodeport, err := k8s.GetServiceNodePort(clientset, ns, ns)
               if err != nil {
                  panic(err)
               }
            log.Printf("Service NodePort: %d\n", nodeport)
            log.Printf("\033[97;42mSuccessfully created resources in namespace %s\033[0m\n", ns)
               log.Printf("Service NodePort: %d\n", nodeport)
               log.Printf("\033[97;42mSuccessfully created resources in namespace %s\033[0m\n", ns)
            }
         }
      }
      // 延迟 1000 秒后删除创建的资源
@@ -138,7 +338,7 @@
      // 删除多个 Namespace 下的相同名称的 Deployment 和 Service
      for _, ns := range namespaces {
         err = delete.DeleteResources(clientset, ns, ns, ns)
         err = k8s.DeleteResources(clientset, ns, ns, ns)
         if err != nil {
            panic(err)
         }
@@ -147,4 +347,27 @@
      fmt.Println("Resources deleted.")
   }
   if clusterCmd.Parsed() {
      // 初始化配置解析库
      viper.SetConfigName("config")
      viper.SetConfigType("yaml")
      viper.AddConfigPath("./config")
      // 读取配置文件
      err := viper.ReadInConfig()
      if err != nil {
         log.Fatalf("Failed to read config file: %v", err)
      }
      // 解析配置文件中的字段
      var rancherClusterConfig rancher.RancherClusterConfig
      err = viper.Unmarshal(&rancherClusterConfig)
      if err != nil {
         log.Fatalf("Failed to unmarshal config: %v", err)
      }
      clusterName := "kubernetus"
      fmt.Println(rancherClusterConfig)
      cluster_test(clusterName, rancherClusterConfig)
   }
}