diff --git a/generator/main.go b/generator/main.go index fdeaba5..f56e8f5 100644 --- a/generator/main.go +++ b/generator/main.go @@ -2,8 +2,8 @@ package generator import ( "fmt" - "helm-compose/compose" - "helm-compose/helm" + "katenary/compose" + "katenary/helm" "os" "strconv" "strings" @@ -15,10 +15,6 @@ import ( var servicesMap = make(map[string]int) var serviceWaiters = make(map[string][]chan int) var locker = &sync.Mutex{} -var serviceTick = make(chan int, 0) - -// Ingresses is kept in memory to create ingresses. -var Ingresses = make(map[string]*helm.Ingress, 0) // Values is kept in memory to create a values.yaml file. var Values = make(map[string]map[string]interface{}) @@ -156,7 +152,7 @@ func CreateReplicaObject(name string, s compose.Service) (ret []interface{}) { if len(s.Ports) > 0 || len(s.Expose) > 0 { ks := createService(name, s) - ret = append(ret, ks) + ret = append(ret, ks...) } if len(VolumeValues[name]) > 0 { @@ -169,7 +165,7 @@ func CreateReplicaObject(name string, s compose.Service) (ret []interface{}) { } // Create a service (k8s). -func createService(name string, s compose.Service) *helm.Service { +func createService(name string, s compose.Service) []interface{} { Magenta("Generating service for ", name) ks := helm.NewService() @@ -204,16 +200,19 @@ func createService(name string, s compose.Service) *helm.Service { 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" { - createIngress(name, defaultPort, s) + ing := createIngress(name, defaultPort, s) + ret = append(ret, ing) } Green("Done service ", name) - return ks + return ret } // Create an ingress. -func createIngress(name string, port int, s compose.Service) { +func createIngress(name string, port int, s compose.Service) *helm.Ingress { ingress := helm.NewIngress(name) Values[name]["ingress"] = map[string]interface{}{ "class": "nginx", @@ -241,9 +240,7 @@ func createIngress(name string, port int, s compose.Service) { } ingress.SetIngressClass(name) - locker.Lock() - Ingresses[name] = ingress - locker.Unlock() + return ingress } // This function is called when a possible service is detected, it append the port in a map to make others to be able to get the service name. It also try to send the data to any "waiter" for this service. diff --git a/go.mod b/go.mod index d652a3a..c62950f 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module helm-compose +module katenary go 1.16 diff --git a/main.go b/main.go index 60d78f3..04bbb42 100644 --- a/main.go +++ b/main.go @@ -3,9 +3,10 @@ package main import ( "bytes" "flag" - "helm-compose/compose" - "helm-compose/generator" - "helm-compose/helm" + "fmt" + "katenary/compose" + "katenary/generator" + "katenary/helm" "os" "path/filepath" "strings" @@ -16,15 +17,21 @@ import ( var ComposeFile = "docker-compose.yaml" var AppName = "MyApp" -var AppVersion = "0.0.1" +var AppVersion = "master" func main() { flag.StringVar(&ComposeFile, "compose", ComposeFile, "set the compose file to parse") flag.StringVar(&AppName, "appname", AppName, "Give the helm chart app name") flag.StringVar(&AppVersion, "appversion", AppVersion, "Set the chart appVersion") + version := flag.Bool("version", false, "Show version and exist") flag.Parse() + if *version { + fmt.Println(AppVersion) + os.Exit(0) + } + p := compose.NewParser(ComposeFile) p.Parse(AppName) wait := sync.WaitGroup{} @@ -33,8 +40,9 @@ func main() { for name, s := range p.Data.Services { wait.Add(1) - // it's mandatory to make the build in goroutines because some dependencies can - // wait for a port number. So the entire services are built in parallel. + // it's mandatory to build in goroutines because some dependencies can + // wait for a port number discovery. + // So the entire services are built in parallel. go func(name string, s compose.Service) { o := generator.CreateReplicaObject(name, s) files[name] = o @@ -48,6 +56,9 @@ func main() { templatesDir := filepath.Join(dirname, "templates") os.MkdirAll(templatesDir, 0755) + // to generate notes, we need to keep an Ingresses list + ingresses := make(map[string]*helm.Ingress) + for n, f := range files { for _, c := range f { kind := c.(helm.Kinded).Get() @@ -84,6 +95,14 @@ func main() { } fp.WriteString(line + "\n") } + case *helm.Ingress: + 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 -}}") + default: enc := yaml.NewEncoder(fp) enc.SetIndent(2) @@ -93,17 +112,6 @@ func main() { } } - for name, ing := range generator.Ingresses { - fname := filepath.Join(templatesDir, name+".ingress.yaml") - fp, _ := os.Create(fname) - enc := yaml.NewEncoder(fp) - enc.SetIndent(2) - fp.WriteString("{{- if .Values." + name + ".ingress.enabled -}}\n") - enc.Encode(ing) - fp.WriteString("{{- end -}}") - fp.Close() - } - fp, _ := os.Create(filepath.Join(dirname, "values.yaml")) enc := yaml.NewEncoder(fp) enc.SetIndent(2) @@ -124,7 +132,6 @@ func main() { fp.Close() fp, _ = os.Create(filepath.Join(templatesDir, "NOTES.txt")) - fp.WriteString(helm.GenNotes(generator.Ingresses)) + fp.WriteString(helm.GenNotes(ingresses)) fp.Close() - }