1 Commits

Author SHA1 Message Date
9fb85a9437 feat(helm): adding helm install feature
now we can ask bootstraper to install helm charts as "packages"
2022-07-11 09:29:35 +02:00
6 changed files with 122 additions and 33 deletions

2
.gitignore vendored
View File

@ -13,5 +13,5 @@
*.out *.out
# Dependency directories (remove the comment below to include it) # Dependency directories (remove the comment below to include it)
vendor/ # vendor/
bin/ bin/

View File

@ -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"
}
}
}
}

View File

@ -7,7 +7,6 @@ import (
"fmt" "fmt"
"os" "os"
"os/user"
"forge.cadoles.com/pcaseiro/templatefile/pkg/utils" "forge.cadoles.com/pcaseiro/templatefile/pkg/utils"
) )
@ -26,32 +25,8 @@ type ConfigFile struct {
// Generate the configuration file from the template (hcl or json) // Generate the configuration file from the template (hcl or json)
func (cf *ConfigFile) Generate(root string, templateDir string, values []byte) error { func (cf *ConfigFile) Generate(root string, templateDir string, values []byte) error {
var template string var template string
if utils.DryRun {
return nil
}
cf.TemplateDir = templateDir cf.TemplateDir = templateDir
dest := filepath.Join(root, cf.Destination) dest := filepath.Join(root, cf.Destination)
// Get owner and group UID and GID
owner, err := user.Lookup(cf.Owner)
if err != nil {
return fmt.Errorf("Process templates failed with error: %v", err)
}
group, err := user.LookupGroup(cf.Group)
if err != nil {
return fmt.Errorf("Process templates failed with error: %v", err)
}
uid, err := strconv.Atoi(owner.Uid)
if err != nil {
return fmt.Errorf("Process templates failed with error: %v", err)
}
gid, err := strconv.Atoi(group.Gid)
if err != nil {
return fmt.Errorf("Process templates failed with error: %v", err)
}
intMod, err := strconv.ParseInt(cf.Mode, 8, 64) intMod, err := strconv.ParseInt(cf.Mode, 8, 64)
if err != nil { if err != nil {
return (err) return (err)
@ -70,10 +45,6 @@ func (cf *ConfigFile) Generate(root string, templateDir string, values []byte) e
if err != nil { if err != nil {
return fmt.Errorf("Process templates failed with error: %v", err) return fmt.Errorf("Process templates failed with error: %v", err)
} }
if err = os.Chown(dest, uid, gid); err != nil {
return fmt.Errorf("Process templates failed with error: %v", err)
}
log.Printf("\tFile %s generated\n", dest) log.Printf("\tFile %s generated\n", dest)
return nil return nil
} }

View File

@ -14,9 +14,22 @@ type SystemPackage struct {
Action string `json:"action"` Action string `json:"action"`
OS string `json:"os"` OS string `json:"os"`
Distribution string `json:"distribution"` Distribution string `json:"distribution"`
NameSpace string `json:"namespace"`
Repository string `json:"repository"`
URL string `json:"url"`
} }
func (p *SystemPackage) SetDistribution() error { 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() OSConfig, err := utils.ReadOSRelease()
if err != nil { if err != nil {
return err return err
@ -56,6 +69,12 @@ func (p *SystemPackage) Manage() error {
_, stdErr, pkErr = utils.RunSystemCommand("yum", "install", "-y", p.Name) _, stdErr, pkErr = utils.RunSystemCommand("yum", "install", "-y", p.Name)
case "arch": case "arch":
_, stdErr, pkErr = utils.RunSystemCommand("pacman", "-Suy", p.Name) _, 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: default:
pkErr = fmt.Errorf("Unsupported OS %s [%s]", p.OS, stdErr) pkErr = fmt.Errorf("Unsupported OS %s [%s]", p.OS, stdErr)
} }

View File

@ -1,11 +1,54 @@
package templater package templater
import (
"encoding/json"
"fmt"
"forge.cadoles.com/pcaseiro/templatefile/pkg/utils"
)
type HelmRepository struct { type HelmRepository struct {
Repository 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 { 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 return nil
} }
func (hr *HelmRepository) Update() error { func (hr *HelmRepository) Update() error {

View File

@ -3,7 +3,6 @@ package templater
import ( import (
"fmt" "fmt"
"log" "log"
"os/user"
"forge.cadoles.com/pcaseiro/templatefile/pkg/utils" "forge.cadoles.com/pcaseiro/templatefile/pkg/utils"
) )
@ -15,9 +14,17 @@ type SystemUser struct {
Shell string `json:"shell"` Shell string `json:"shell"`
} }
func (su *SystemUser) exists() (bool, error) {
_, _, err := utils.RunSystemCommand("getent", "passwd", su.UserName)
if err != nil {
return false, err
}
return true, nil
}
func (su *SystemUser) Manage() error { func (su *SystemUser) Manage() error {
_, err := user.Lookup(su.UserName) exist, _ := su.exists()
if err == nil { if exist {
log.Printf("\tUser %s already exists", su.UserName) log.Printf("\tUser %s already exists", su.UserName)
return nil return nil
} }