Files
oc-k8s/internal/cluster.go
2026-01-20 16:21:04 +01:00

115 lines
3.3 KiB
Go

package internal
import (
"bytes"
"fmt"
"oc-k8s/utils"
"os"
"os/exec"
)
func Help_Cluster() {
fmt.Println(`
Cluster commands: oc-k8s <action> cluster [options]
create - Create a new kind cluster
delete - Delete the kind cluster
help - Show this help message
Usage:
oc-k8s create cluster -f [env_folder] -r [release]
env_folder - Helm config folder (default: .)
release - Release values name (default: dev)
oc-k8s delete cluster -f [env_folder] -r [release]
env_folder - Helm config folder (default: .)
release - Release values name (default: dev)
oc-k8s help cluster `)
}
func Delete_Cluster(folder string, release string) error {
clusterName := "opencloud"
if b, err := os.ReadFile(folder + "/" + release + "-values.yaml"); err == nil {
clusterName, _ = utils.Extract(string(b), "clusterName")
}
utils.Exec("kind delete cluster --name " + clusterName)
utils.Exec("yes | sudo cp -rf /etc/rancher/k3s/k3s.yaml ~/.kube/config")
return utils.Exec("chmod 600 ~/.kube/config")
}
func Install_Cluster() error {
utils.Exec("yes | sudo cp -rf /etc/rancher/k3s/k3s.yaml ~/.kube/config")
utils.Exec("chmod 700 /home/mr/.kube")
return utils.Exec("chmod 600 ~/.kube/config")
}
func Create_Cluster(folder string, release string) error {
clusterName := "opencloud"
scheme := "http"
port := "80"
if b, err := os.ReadFile(folder + "/" + release + "-values.yaml"); err == nil {
clusterName, _ = utils.Extract(string(b), "clusterName")
scheme, _ = utils.Extract(string(b), "scheme")
port, _ = utils.Extract(string(b), "hostPort")
}
utils.Exec("sudo fuser -k -TERM " + port + "/tcp")
utils.Exec("yes | sudo cp -rf /etc/rancher/k3s/k3s.yaml ~/.kube/config")
containerPort := "30950"
if scheme == "https" {
containerPort = "30951"
}
kindConfig := `kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: ` + clusterName + `
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: ` + containerPort + `
hostPort: ` + port + `
protocol: TCP
containerdConfigPatches:
- |-
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"]
endpoint = ["http://dev-docker-registry-ui-registry-server.opencloud.svc.cluster.local:5000"]
`
cmd := exec.Command("kind", "create", "cluster", "--name", clusterName, "--config=-")
cmd.Stdin = bytes.NewBufferString(kindConfig)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Println(err)
return err
}
fmt.Println("[WARNING] New cluster should be merged into your current config !")
if err := utils.Exec("KUBECONFIG=~/.kube/config:/tmp/kind-" + clusterName + ".kubeconfig kubectl config view --flatten --merge --minify > /tmp/merged-kubeconfig.yaml"); err != nil {
return err
}
if err := utils.Exec("cp -f /tmp/merged-kubeconfig.yaml ~/.kube/config"); err != nil {
return err
}
if err := utils.Exec("kubectl config get-contexts"); err != nil {
return err
}
if err := utils.Exec("kubectl config use-context kind-" + clusterName); err != nil {
return err
}
if err := utils.Exec("docker start " + clusterName + "-control-plane"); err != nil {
return err
}
return nil
}