diff --git a/README.md b/README.md index 3194ead..25e124c 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,15 @@ or to ease opencloud dependencies (dex, mongo, mongo-express, ...) deployment. Kind (https://kind.sigs.k8s.io/) is used here as a lightweight kubernetes deployment. Obviously, any kubenetes compliant environment is a legitimate target. +# Requirements + +- go +- docker +- docker buildx +- make + +- Rajouter dans le bashrc > export KUBECONFIG=$HOME/.kube/config + # Locally built microservices deployment procedure ## Install OC-K8S @@ -16,20 +25,6 @@ sudo cp oc-k8s.sh /usr/bin/oc-k8s sudo chmod +x /usr/bin/oc-k8s ``` -## Install kind - -Follow instructions here https://kind.sigs.k8s.io/ - -or - -``` -go install sigs.k8s.io/kind@v0.30.0 && kind create cluster -``` - -## Install helm - -Download suitable helm client here https://helm.sh/docs/intro/install/ - # Generate values (optionnal) Use command : diff --git a/cmd/kind-linux-amd64 b/cmd/kind-linux-amd64 deleted file mode 100644 index 5c9d770..0000000 Binary files a/cmd/kind-linux-amd64 and /dev/null differ diff --git a/cmd/main.go b/cmd/main.go index 1d457df..bc938cc 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -59,9 +59,11 @@ func action() error { branch := flag.String("b", "main", "Git branch/version of a OC build") target := flag.String("y", "all", "Makefile build up mode") dbName := flag.String("d", "opencloud", "DBName in use") - arch := flag.String("a", "linux-amd64", "Arch expected") - version := flag.String("v", "v0.30.0", "version of arch") + arch := flag.String("a", "amd64", "Arch expected") + version := flag.String("v", "v0.31.0", "version of arch") confFile := flag.String("c", "", "Configuration files to map") + mUsr := flag.String("m", "admin", "Mongo user") + mPwd := flag.String("M", "admin", "Mongo password") if len(os.Args) > 2 && slices.Contains([]string{"start", "help", "stop"}, os.Args[1]) { flag.CommandLine.Parse(os.Args[2:]) @@ -131,7 +133,7 @@ func action() error { case "cluster": return internal.Create_Cluster(*folder, *release) case "db": - return internal.Create_DB(folder, *release, *namespace, *dbName) + return internal.Create_DB(folder, *release, *namespace, *dbName, *mUsr, *mPwd) case "services": return internal.Create_Service(*folder, *release, *branch, *target) case "values": @@ -150,7 +152,7 @@ func action() error { case "cluster": return internal.Delete_Cluster(*folder, *release) case "db": - return internal.Delete_DB(*release, *namespace, *dbName) + return internal.Delete_DB(*release, *namespace, *dbName, *mUsr, *mPwd) default: internal.Help_Func() } @@ -163,7 +165,7 @@ func action() error { case "helm": return internal.Upgrade_Helm(*folder, *release, *namespace) case "db": - return internal.Upgrade_DB(folder, *release, *namespace, *dbName) + return internal.Upgrade_DB(folder, *release, *namespace, *dbName, *mUsr, *mPwd) default: internal.Help_Func() } diff --git a/cmd/oc-k8s b/cmd/oc-k8s index adc8067..c6438aa 100755 Binary files a/cmd/oc-k8s and b/cmd/oc-k8s differ diff --git a/internal/cluster.go b/internal/cluster.go index 2208611..c1e1e69 100644 --- a/internal/cluster.go +++ b/internal/cluster.go @@ -62,6 +62,7 @@ apiVersion: kind.x-k8s.io/v1alpha4 name: ` + clusterName + ` nodes: - role: control-plane + image: kindest/node:v1.35.0 kubeadmConfigPatches: - | kind: InitConfiguration @@ -72,14 +73,13 @@ nodes: - 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=-") + utils.Exec(`docker exec -it oc-control-plane bash -c 'mkdir -p /etc/containerd && cat </etc/containerd/config.toml +[plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"] + endpoint = ["http://dev-docker-registry-ui-registry-server.opencloud.svc.cluster.local:5000"] +EOF +containerd config restart'`) + cmd := exec.Command("kind", "create", "cluster", "--name", clusterName, "--wait", "0", "--config=-") cmd.Stdin = bytes.NewBufferString(kindConfig) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr diff --git a/internal/db.go b/internal/db.go index 2f2571d..a46ee4c 100644 --- a/internal/db.go +++ b/internal/db.go @@ -6,6 +6,8 @@ import ( "oc-k8s/utils" "os" "strings" + "bytes" + "os/exec" ) func Help_DB() { @@ -23,7 +25,7 @@ Usage: namespace - Namespace values name (default: dev) db_name - db name (default: opencloud) folder - Helm config folder (required, default: .) - oc-k8s upgrade db -d [db_name] -r [release] -n [namespace] -f [folder] + oc-k8s upgrade db -d [db_name] -r [release] -n [namespace] -f [folder] folder - Datas folder files path (required) release - Release values name (default: dev) namespace - Namespace values name (default: dev) @@ -36,9 +38,12 @@ Usage: oc-k8s help db `) } -func Delete_DB(release string, namespace string, dbName string) error { - podName := "$(kubectl get pods -n " + namespace + " -o=name | grep " + release + "-mongodb-* | sed 's|pod/||')" - return utils.Exec("kubectl exec " + podName + ": -- mongosh --eval \"db.getSiblingDB('" + dbName + "').dropDatabase()\"") +func Delete_DB(release string, namespace string, dbName string, adminUsr string, adminPsw string) error { + podName, err := getMongoPod(namespace) + if err != nil { + return err + } + return utils.Exec("kubectl exec " + podName + " -- mongosh --eval \"db.getSiblingDB('" + dbName + "').dropDatabase()\" -u " + adminUsr + " -p " + adminPsw +" --authenticationDatabase admin") } func getFileNames(folderPath string) []string { @@ -56,25 +61,40 @@ func getFileNames(folderPath string) []string { return fileNames } -func Create_DB(filePath *string, release string, namespace string, dbName string) error { +func Create_DB(filePath *string, release string, namespace string, dbName string, adminUsr string, adminPsw string) error { if filePath == nil { return errors.New("missing db datas file path") } - podName := "$(kubectl get pods -n " + namespace + " -o jsonpath='{.items[0].metadata.name}')" + podName, err := getMongoPod(namespace) + if err != nil { + return err + } for _, fileName := range getFileNames(*filePath) { fmt.Println("ADD file " + fileName + " in collection") - fmt.Println("POD=" + podName + " && kubectl cp -n " + namespace + " " + *filePath + "/" + fileName + " \"$POD:/tmp/" + fileName + "\"") - if err := utils.Exec("POD=" + podName + " && kubectl cp -n " + namespace + " " + *filePath + "/" + fileName + " \"$POD:/tmp/" + fileName + "\""); err != nil { + fmt.Println("kubectl cp -n " + namespace + " " + *filePath + "/" + fileName + " \"" + podName + ":/tmp/" + fileName + "\"") + if err := utils.Exec("kubectl cp -n " + namespace + " " + *filePath + "/" + fileName + " \"" + podName + ":/tmp/" + fileName + "\""); err != nil { return err } - if err := utils.Exec("POD=" + podName + " && kubectl exec -n " + namespace + " $POD: -- mongoimport --db " + dbName + " --collection " + strings.ReplaceAll(fileName, ".json", "") + " --file /tmp/" + fileName + " --jsonArray"); err != nil { + fmt.Println("kubectl exec -n " + namespace + " " + podName + " -- mongoimport --db " + dbName + " --collection " + strings.ReplaceAll(fileName, ".json", "") + " --file /tmp/" + fileName + " --jsonArray -u " + adminUsr + " -p " + adminPsw +" --authenticationDatabase admin") + if err := utils.Exec("kubectl exec -n " + namespace + " " + podName + " -- mongoimport --db " + dbName + " --collection " + strings.ReplaceAll(fileName, ".json", "") + " --file /tmp/" + fileName + " --jsonArray -u " + adminUsr + " -p " + adminPsw +" --authenticationDatabase admin"); err != nil { return err } } return nil } -func Upgrade_DB(filePath *string, release string, namespace string, dbName string) error { - Delete_DB(release, namespace, dbName) - return Create_DB(filePath, release, namespace, dbName) +func getMongoPod(namespace string) (string, error) { + cmd := exec.Command("bash", "-c", "kubectl get pods -n "+namespace+" --no-headers -o custom-columns=\":metadata.name\" | grep mongodb | head -n 1") + var out bytes.Buffer + cmd.Stdout = &out + if err := cmd.Run(); err != nil { + return "", err + } + podName := strings.TrimSpace(out.String()) // remove newline + return podName, nil +} + +func Upgrade_DB(filePath *string, release string, namespace string, dbName string, adminUsr string, adminPsw string) error { + Delete_DB(release, namespace, dbName, adminUsr, adminPsw) + return Create_DB(filePath, release, namespace, dbName, adminUsr, adminPsw) } diff --git a/internal/func.go b/internal/func.go index e7da0a2..0e378ee 100644 --- a/internal/func.go +++ b/internal/func.go @@ -42,10 +42,18 @@ Usage: func Start(folder string, release string, namespace string, branch string, target string) error { Stop(folder, release, namespace) - Create_K3S() - Create_Cluster(folder, release) - Create_Service(folder, release, branch, target) - Create_Helm(folder, release, namespace) + if err := Create_K3S(); err != nil { + return err + } + if err := Create_Cluster(folder, release); err != nil { + return err + } + if err := Create_Service(folder, release, branch, target); err != nil { + return err + } + if err := Create_Helm(folder, release, namespace); err != nil { + return err + } return nil } diff --git a/internal/helm.go b/internal/helm.go index 609c0f8..121a65c 100644 --- a/internal/helm.go +++ b/internal/helm.go @@ -52,11 +52,8 @@ func Create_Helm(folder string, release string, namespace string) error { } ExtractTrees("assets", tmp) - clusterName := "opencloud" - host := "beta.opencloud.com" if b, err := os.ReadFile(folder + "/" + release + "-values.yaml"); err == nil { - clusterName, _ = utils.Extract(string(b), "clusterName") host, _ = utils.Extract(string(b), "host") } @@ -89,13 +86,9 @@ func Create_Helm(folder string, release string, namespace string) error { if err := utils.Exec("helm upgrade --install " + release + " " + tmp + " -n " + namespace + " --create-namespace -f " + folder + "/" + release + "-values.yaml --debug"); err != nil { return err } - - utils.Exec("kind get kubeconfig --name " + clusterName + " > ./deployed_config") - utils.Exec("kind export logs ./kind-logs") utils.Exec("sudo rm -rf " + tmp) - - utils.Exec("sudo sed -i.bak \"/[[:space:]]" + host + "$/d\" /etc/hosts") - utils.Exec("echo \"$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type==\"InternalIP\")].address}') " + host + "\" | sudo tee -a /etc/hosts > /dev/null") + utils.Exec("sudo sed -i.bak \"\n/[[:space:]]" + host + "$/d\" /etc/hosts") + utils.Exec("echo \"\n127.0.0.1 " + host + "\" | sudo tee -a /etc/hosts > /dev/null") return nil } diff --git a/internal/k3s.go b/internal/k3s.go index 57c10b6..2e29d6e 100644 --- a/internal/k3s.go +++ b/internal/k3s.go @@ -21,6 +21,7 @@ Usage: func Install_K3S() error { utils.Exec("sudo /usr/local/bin/k3s-uninstall.sh") utils.Exec("sudo rm -rf /etc/rancher /var/lib/rancher") + utils.Exec("sudo chown $USER:$USER /home/$USER/.kube/config") if err := utils.Exec("curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644"); err != nil { return err } diff --git a/internal/kind.go b/internal/kind.go index 8eed02f..a34ec36 100644 --- a/internal/kind.go +++ b/internal/kind.go @@ -13,13 +13,19 @@ Kind commands: oc-k8s kind Usage: oc-k8s install kind -a [arch] -v [version] - arch - Arch of OS (required) - kind_version - version of kind (required) + arch - Arch of OS (required, default: amd64) + kind_version - version of kind (optionnal) oc-k8s help values `) } func Install_Kind(arch string, version string) error { - utils.Exec("curl -Lo kind-linux-amd64 https://kind.sigs.k8s.io/dl/" + version + "/kind-" + arch) - //utils.Exec("sudo rm -f kind-" + arch) + if version == "" { + utils.Exec("GOARCH=" + arch +" GOOS=linux go install sigs.k8s.io/kind@latest") + + } else { + utils.Exec("curl -Lo kind-linux-amd64 https://kind.sigs.k8s.io/dl/" + version + "/kind-linux-" + arch) + utils.Exec("sudo chmod +x ./kind-linux-" + arch) + utils.Exec("sudo mv ./kind-linux-" + arch + " /usr/local/bin/kind") + } return nil -} +} \ No newline at end of file diff --git a/internal/services.go b/internal/services.go index fa36bbb..4682251 100644 --- a/internal/services.go +++ b/internal/services.go @@ -44,7 +44,7 @@ func Create_Service(folder string, release string, branch string, target string) hostname, _ = utils.Extract(string(b), "host") scheme, _ = utils.Extract(string(b), "scheme") clusterName, _ = utils.Extract(string(b), "clusterName") - pport, _ = utils.Extract(string(b), "port") + pport, _ = utils.Extract(string(b), "hostPort") } for _, repo := range REPOS { diff --git a/utils/assets/templates/oc-front/config.yaml b/utils/assets/templates/oc-front/config.yaml index c9f9c8b..1af7e2b 100644 --- a/utils/assets/templates/oc-front/config.yaml +++ b/utils/assets/templates/oc-front/config.yaml @@ -13,6 +13,6 @@ data: "PEER_HOST": "peers", "DATACENTER_HOST": "datacenter", "COLLABORATIVE_AREA_HOST": "shared", - "HOST": "{{ .Values.scheme }}://{{ .Values.host }}:{{ .Values.port }}", + "HOST": "{{ .Values.scheme }}://{{ .Values.host }}:{{ .Values.hostPort }}", } {{- end }} \ No newline at end of file