New behavior for nodeport + fix storage

This commit is contained in:
2021-12-01 16:50:32 +01:00
parent 2fb62bb554
commit 769c9b6c6c
5 changed files with 54 additions and 24 deletions

View File

@@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"katenary/compose" "katenary/compose"
"katenary/helm" "katenary/helm"
"log"
"os" "os"
"strconv" "strconv"
"strings" "strings"
@@ -91,6 +92,11 @@ func CreateReplicaObject(name string, s compose.Service) (ret []interface{}) {
exists := make(map[int]string) exists := make(map[int]string)
for _, port := range s.Ports { for _, port := range s.Ports {
_p := strings.Split(port, ":")
port = _p[0]
if len(_p) > 1 {
port = _p[1]
}
portNumber, _ := strconv.Atoi(port) portNumber, _ := strconv.Atoi(port)
portName := name portName := name
for _, n := range exists { for _, n := range exists {
@@ -163,10 +169,10 @@ func CreateReplicaObject(name string, s compose.Service) (ret []interface{}) {
wait := &sync.WaitGroup{} wait := &sync.WaitGroup{}
initContainers := make([]*helm.Container, 0) initContainers := make([]*helm.Container, 0)
for _, dp := range s.DependsOn { for _, dp := range s.DependsOn {
if len(s.Ports) == 0 && len(s.Expose) == 0 { //if len(s.Ports) == 0 && len(s.Expose) == 0 {
Redf("No port exposed for %s that is in dependency", name) // Redf("No port exposed for %s that is in dependency", name)
os.Exit(1) // os.Exit(1)
} //}
c := helm.NewContainer("check-"+dp, "busybox", nil, s.Labels) c := helm.NewContainer("check-"+dp, "busybox", nil, s.Labels)
command := strings.ReplaceAll(strings.TrimSpace(dependScript), "__service__", dp) command := strings.ReplaceAll(strings.TrimSpace(dependScript), "__service__", dp)
@@ -209,10 +215,10 @@ func CreateReplicaObject(name string, s compose.Service) (ret []interface{}) {
// Create a service (k8s). // Create a service (k8s).
func createService(name string, s compose.Service) []interface{} { func createService(name string, s compose.Service) []interface{} {
ret := make([]interface{}, 0)
Magenta("Generating service for ", name) Magenta("Generating service for ", name)
ks := helm.NewService(name) ks := helm.NewService(name)
defaultPort := 0 defaultPort := 0
names := make(map[int]int)
for i, p := range s.Ports { for i, p := range s.Ports {
port := strings.Split(p, ":") port := strings.Split(p, ":")
@@ -220,35 +226,36 @@ func createService(name string, s compose.Service) []interface{} {
target := src target := src
if len(port) > 1 { if len(port) > 1 {
target, _ = strconv.Atoi(port[1]) target, _ = strconv.Atoi(port[1])
log.Println(target)
} }
ks.Spec.Ports = append(ks.Spec.Ports, helm.NewServicePort(src, target)) ks.Spec.Ports = append(ks.Spec.Ports, helm.NewServicePort(target, target))
names[target] = 1
if i == 0 { if i == 0 {
defaultPort = target defaultPort = target
detected(name, target) detected(name, target)
} }
} }
for i, p := range s.Expose {
if _, ok := names[p]; ok {
continue
}
ks.Spec.Ports = append(ks.Spec.Ports, helm.NewServicePort(p, p))
if i == 0 {
defaultPort = p
detected(name, p)
}
}
ks.Spec.Selector = buildSelector(name, s) ks.Spec.Selector = buildSelector(name, s)
ret := make([]interface{}, 0)
ret = append(ret, ks) ret = append(ret, ks)
if v, ok := s.Labels[helm.K+"/expose-ingress"]; ok && v == "true" { if v, ok := s.Labels[helm.K+"/expose-ingress"]; ok && v == "true" {
Cyanf("Create an ingress for %d port on %s service\n", defaultPort, name)
ing := createIngress(name, defaultPort, s) ing := createIngress(name, defaultPort, s)
ret = append(ret, ing) ret = append(ret, ing)
Green("Done ingress ", name)
}
Green("Done service ", name)
if len(s.Expose) > 0 {
Magenta("Generating service for ", name+"-external")
ks := helm.NewService(name + "-external")
ks.Spec.Type = "NodePort"
for _, p := range s.Expose {
ks.Spec.Ports = append(ks.Spec.Ports, helm.NewServicePort(p, p))
}
ks.Spec.Selector = buildSelector(name, s)
ret = append(ret, ks)
} }
Green("Done service ", name)
return ret return ret
} }

View File

@@ -74,3 +74,6 @@ func Bluef(format string, args ...interface{}) {
func Magentaf(format string, args ...interface{}) { func Magentaf(format string, args ...interface{}) {
colorf(MAGENTA, format, args...) colorf(MAGENTA, format, args...)
} }
func Cyanf(format string, args ...interface{}) {
colorf(CYAN, format, args...)
}

View File

@@ -34,6 +34,7 @@ func NewServicePort(port, target int) *ServicePort {
type ServiceSpec struct { type ServiceSpec struct {
Selector map[string]string Selector map[string]string
Ports []*ServicePort Ports []*ServicePort
Type string `yaml:"type,omitempty"`
} }
func NewServiceSpec() *ServiceSpec { func NewServiceSpec() *ServiceSpec {

View File

@@ -16,7 +16,7 @@ func NewPVC(name, storageName string) *Storage {
pvc.Spec = &PVCSpec{ pvc.Spec = &PVCSpec{
Resouces: map[string]interface{}{ Resouces: map[string]interface{}{
"requests": map[string]string{ "requests": map[string]string{
"capacity": "{{ .Values." + name + ".persistence." + storageName + ".capacity }}", "storage": "{{ .Values." + name + ".persistence." + storageName + ".capacity }}",
}, },
}, },
AccessModes: []string{"ReadWriteOnce"}, AccessModes: []string{"ReadWriteOnce"},

25
main.go
View File

@@ -85,11 +85,11 @@ func main() {
for _, c := range f { for _, c := range f {
kind := c.(helm.Kinded).Get() kind := c.(helm.Kinded).Get()
kind = strings.ToLower(kind) kind = strings.ToLower(kind)
fname := filepath.Join(templatesDir, n+"."+kind+".yaml")
fp, _ := os.Create(fname)
c.(helm.Signable).BuildSHA(ComposeFile) c.(helm.Signable).BuildSHA(ComposeFile)
switch c := c.(type) { switch c := c.(type) {
case *helm.Storage: case *helm.Storage:
fname := filepath.Join(templatesDir, n+"."+kind+".yaml")
fp, _ := os.Create(fname)
volname := c.K8sBase.Metadata.Labels[helm.K+"/pvc-name"] volname := c.K8sBase.Metadata.Labels[helm.K+"/pvc-name"]
fp.WriteString("{{ if .Values." + n + ".persistence." + volname + ".enabled }}\n") fp.WriteString("{{ if .Values." + n + ".persistence." + volname + ".enabled }}\n")
enc := yaml.NewEncoder(fp) enc := yaml.NewEncoder(fp)
@@ -97,6 +97,8 @@ func main() {
enc.Encode(c) enc.Encode(c)
fp.WriteString("{{- end -}}") fp.WriteString("{{- end -}}")
case *helm.Deployment: case *helm.Deployment:
fname := filepath.Join(templatesDir, n+"."+kind+".yaml")
fp, _ := os.Create(fname)
buffer := bytes.NewBuffer(nil) buffer := bytes.NewBuffer(nil)
enc := yaml.NewEncoder(buffer) enc := yaml.NewEncoder(buffer)
enc.SetIndent(2) enc.SetIndent(2)
@@ -118,20 +120,37 @@ func main() {
} }
fp.WriteString(line + "\n") fp.WriteString(line + "\n")
} }
fp.Close()
case *helm.Service:
suffix := ""
if c.Spec.Type == "NodePort" {
suffix = "-external"
}
fname := filepath.Join(templatesDir, n+suffix+"."+kind+".yaml")
fp, _ := os.Create(fname)
enc := yaml.NewEncoder(fp)
enc.Encode(c)
fp.Close()
case *helm.Ingress: case *helm.Ingress:
fname := filepath.Join(templatesDir, n+"."+kind+".yaml")
fp, _ := os.Create(fname)
ingresses[n] = c // keep it to generate notes ingresses[n] = c // keep it to generate notes
enc := yaml.NewEncoder(fp) enc := yaml.NewEncoder(fp)
enc.SetIndent(2) enc.SetIndent(2)
fp.WriteString("{{- if .Values." + n + ".ingress.enabled -}}\n") fp.WriteString("{{- if .Values." + n + ".ingress.enabled -}}\n")
enc.Encode(c) enc.Encode(c)
fp.WriteString("{{- end -}}") fp.WriteString("{{- end -}}")
fp.Close()
default: default:
fname := filepath.Join(templatesDir, n+"."+kind+".yaml")
fp, _ := os.Create(fname)
enc := yaml.NewEncoder(fp) enc := yaml.NewEncoder(fp)
enc.SetIndent(2) enc.SetIndent(2)
enc.Encode(c) enc.Encode(c)
fp.Close()
} }
fp.Close()
} }
} }