From 769c9b6c6c4fe48458cc072282e7e7f2210b39ac Mon Sep 17 00:00:00 2001 From: Patrice Ferlet Date: Wed, 1 Dec 2021 16:50:32 +0100 Subject: [PATCH] New behavior for nodeport + fix storage --- generator/main.go | 47 ++++++++++++++++++++++++++-------------------- generator/utils.go | 3 +++ helm/service.go | 1 + helm/storage.go | 2 +- main.go | 25 +++++++++++++++++++++--- 5 files changed, 54 insertions(+), 24 deletions(-) diff --git a/generator/main.go b/generator/main.go index 71cdb16..9252645 100644 --- a/generator/main.go +++ b/generator/main.go @@ -4,6 +4,7 @@ import ( "fmt" "katenary/compose" "katenary/helm" + "log" "os" "strconv" "strings" @@ -91,6 +92,11 @@ func CreateReplicaObject(name string, s compose.Service) (ret []interface{}) { exists := make(map[int]string) for _, port := range s.Ports { + _p := strings.Split(port, ":") + port = _p[0] + if len(_p) > 1 { + port = _p[1] + } portNumber, _ := strconv.Atoi(port) portName := name for _, n := range exists { @@ -163,10 +169,10 @@ func CreateReplicaObject(name string, s compose.Service) (ret []interface{}) { wait := &sync.WaitGroup{} initContainers := make([]*helm.Container, 0) for _, dp := range s.DependsOn { - if len(s.Ports) == 0 && len(s.Expose) == 0 { - Redf("No port exposed for %s that is in dependency", name) - os.Exit(1) - } + //if len(s.Ports) == 0 && len(s.Expose) == 0 { + // Redf("No port exposed for %s that is in dependency", name) + // os.Exit(1) + //} c := helm.NewContainer("check-"+dp, "busybox", nil, s.Labels) 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). func createService(name string, s compose.Service) []interface{} { + ret := make([]interface{}, 0) Magenta("Generating service for ", name) ks := helm.NewService(name) defaultPort := 0 - names := make(map[int]int) for i, p := range s.Ports { port := strings.Split(p, ":") @@ -220,35 +226,36 @@ func createService(name string, s compose.Service) []interface{} { target := src if len(port) > 1 { target, _ = strconv.Atoi(port[1]) + log.Println(target) } - ks.Spec.Ports = append(ks.Spec.Ports, helm.NewServicePort(src, target)) - names[target] = 1 + ks.Spec.Ports = append(ks.Spec.Ports, helm.NewServicePort(target, target)) if i == 0 { defaultPort = 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) - ret := make([]interface{}, 0) ret = append(ret, ks) 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) 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 } diff --git a/generator/utils.go b/generator/utils.go index f89d3c9..c304bbc 100644 --- a/generator/utils.go +++ b/generator/utils.go @@ -74,3 +74,6 @@ func Bluef(format string, args ...interface{}) { func Magentaf(format string, args ...interface{}) { colorf(MAGENTA, format, args...) } +func Cyanf(format string, args ...interface{}) { + colorf(CYAN, format, args...) +} diff --git a/helm/service.go b/helm/service.go index 3ab8322..079e3c9 100644 --- a/helm/service.go +++ b/helm/service.go @@ -34,6 +34,7 @@ func NewServicePort(port, target int) *ServicePort { type ServiceSpec struct { Selector map[string]string Ports []*ServicePort + Type string `yaml:"type,omitempty"` } func NewServiceSpec() *ServiceSpec { diff --git a/helm/storage.go b/helm/storage.go index cca23d6..f651e80 100644 --- a/helm/storage.go +++ b/helm/storage.go @@ -16,7 +16,7 @@ func NewPVC(name, storageName string) *Storage { pvc.Spec = &PVCSpec{ Resouces: map[string]interface{}{ "requests": map[string]string{ - "capacity": "{{ .Values." + name + ".persistence." + storageName + ".capacity }}", + "storage": "{{ .Values." + name + ".persistence." + storageName + ".capacity }}", }, }, AccessModes: []string{"ReadWriteOnce"}, diff --git a/main.go b/main.go index 9cf97d1..661befa 100644 --- a/main.go +++ b/main.go @@ -85,11 +85,11 @@ func main() { for _, c := range f { kind := c.(helm.Kinded).Get() kind = strings.ToLower(kind) - fname := filepath.Join(templatesDir, n+"."+kind+".yaml") - fp, _ := os.Create(fname) c.(helm.Signable).BuildSHA(ComposeFile) switch c := c.(type) { case *helm.Storage: + fname := filepath.Join(templatesDir, n+"."+kind+".yaml") + fp, _ := os.Create(fname) volname := c.K8sBase.Metadata.Labels[helm.K+"/pvc-name"] fp.WriteString("{{ if .Values." + n + ".persistence." + volname + ".enabled }}\n") enc := yaml.NewEncoder(fp) @@ -97,6 +97,8 @@ func main() { enc.Encode(c) fp.WriteString("{{- end -}}") case *helm.Deployment: + fname := filepath.Join(templatesDir, n+"."+kind+".yaml") + fp, _ := os.Create(fname) buffer := bytes.NewBuffer(nil) enc := yaml.NewEncoder(buffer) enc.SetIndent(2) @@ -118,20 +120,37 @@ func main() { } 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: + fname := filepath.Join(templatesDir, n+"."+kind+".yaml") + fp, _ := os.Create(fname) ingresses[n] = c // keep it to generate notes enc := yaml.NewEncoder(fp) enc.SetIndent(2) fp.WriteString("{{- if .Values." + n + ".ingress.enabled -}}\n") enc.Encode(c) fp.WriteString("{{- end -}}") + fp.Close() default: + fname := filepath.Join(templatesDir, n+"."+kind+".yaml") + fp, _ := os.Create(fname) enc := yaml.NewEncoder(fp) enc.SetIndent(2) enc.Encode(c) + fp.Close() } - fp.Close() } }