From 9fb85a943766e2b65984fddc69b30bff6450ec77 Mon Sep 17 00:00:00 2001 From: Philippe Caseiro Date: Mon, 11 Jul 2022 09:27:34 +0200 Subject: [PATCH] feat(helm): adding helm install feature now we can ask bootstraper to install helm charts as "packages" --- data/config/loki-stack-helm.json | 49 ++++++++++++++++++++++++++++++++ pkg/templater/packages.go | 19 +++++++++++++ pkg/templater/repo-helm.go | 43 ++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 data/config/loki-stack-helm.json diff --git a/data/config/loki-stack-helm.json b/data/config/loki-stack-helm.json new file mode 100644 index 0000000..c1b6ad5 --- /dev/null +++ b/data/config/loki-stack-helm.json @@ -0,0 +1,49 @@ +{ + "Globals": { + "Vars": { + "PrometheusPort": "9090" + } + }, + "Name": "loki-stack", + "Services": { + "Loki-Stack": { + "ConfigFiles": [], + "Daemons": {}, + "Users": {}, + "Repositories": { + "Grafana": { + "enabled": true, + "name": "grafana", + "type": "helm", + "url": "https://grafana.github.io/helm-charts" + } + }, + "Packages": { + "loki": { + "type" : "helm", + "action": "install", + "name": "loki", + "repository": "grafana" + } + }, + "Vars": { + "AlertManagerURL": "http://localhost:9092", + "AuthEnabled": false, + "GRPCPort": "9095", + "Group": "grafana", + "HTTPPort": "3099", + "LogLevel": "error", + "ObjectStore": "filesystem", + "S2": { + "APIKey": "", + "APISecretKey": "", + "BucketName": "", + "URL": "" + }, + "SharedStore": "filesystem", + "StorageRoot": "/var/loki", + "User": "loki" + } + } + } +} diff --git a/pkg/templater/packages.go b/pkg/templater/packages.go index 98dca8d..7d3e75f 100644 --- a/pkg/templater/packages.go +++ b/pkg/templater/packages.go @@ -14,9 +14,22 @@ type SystemPackage struct { Action string `json:"action"` OS string `json:"os"` Distribution string `json:"distribution"` + NameSpace string `json:"namespace"` + Repository string `json:"repository"` + URL string `json:"url"` } func (p *SystemPackage) SetDistribution() error { + + // If the package type is helm or kubectl we set distribution to k8s + if p.Type == "helm" || p.Type == "kubectl" { + p.Distribution = p.Type + if len(p.NameSpace) == 0 { + p.NameSpace = p.Name + } + return nil + } + OSConfig, err := utils.ReadOSRelease() if err != nil { return err @@ -56,6 +69,12 @@ func (p *SystemPackage) Manage() error { _, stdErr, pkErr = utils.RunSystemCommand("yum", "install", "-y", p.Name) case "arch": _, stdErr, pkErr = utils.RunSystemCommand("pacman", "-Suy", p.Name) + case "helm": + toInstall := fmt.Sprintf("%s/%s", p.Repository, p.Name) + nameSpaceOPT := fmt.Sprintf("--namespace=%s", p.NameSpace) + _, stdErr, pkErr = utils.RunSystemCommand("helm", "upgrade", "--install", p.Name, nameSpaceOPT, toInstall) + case "kubectl": + _, stdErr, pkErr = utils.RunSystemCommand("kubectl", "apply", p.URL) default: pkErr = fmt.Errorf("Unsupported OS %s [%s]", p.OS, stdErr) } diff --git a/pkg/templater/repo-helm.go b/pkg/templater/repo-helm.go index 71f1803..1858d6e 100644 --- a/pkg/templater/repo-helm.go +++ b/pkg/templater/repo-helm.go @@ -1,11 +1,54 @@ package templater +import ( + "encoding/json" + "fmt" + + "forge.cadoles.com/pcaseiro/templatefile/pkg/utils" +) + type HelmRepository struct { Repository } +func (hr *HelmRepository) repoExists() (bool, error) { + var repos []HelmRepository + + stdOut, stdErr, err := utils.RunSystemCommand("helm", "repo", "list", "-o", "json") + if err != nil { + return false, fmt.Errorf("%s %v", stdErr, err) + } + err = json.Unmarshal(stdOut, &repos) + if err != nil { + return false, err + } + + for _, repo := range repos { + if repo.Name == hr.Name { + return true, nil + } + } + return false, nil +} + func (hr *HelmRepository) Add() error { + + repoExists, err := hr.repoExists() + if err != nil { + return err + } + + if repoExists { + return nil + } else { + _, stdErr, err := utils.RunSystemCommand("helm", "repo", "add", hr.Name, hr.URL) + if err != nil { + return fmt.Errorf("%s %v", stdErr, err) + } + } + return nil + } func (hr *HelmRepository) Update() error {