diff --git a/generator/main.go b/generator/main.go index 30f73fe..6a08722 100644 --- a/generator/main.go +++ b/generator/main.go @@ -197,7 +197,7 @@ func createIngress(name string, port int, s *compose.Service) *helm.Ingress { Paths: []helm.IngressPath{{ Path: "/", PathType: "Prefix", - Backend: helm.IngressBackend{ + Backend: &helm.IngressBackend{ Service: helm.IngressService{ Name: RELEASE_NAME + "-" + name, Port: map[string]interface{}{ diff --git a/generator/writers/ingress.go b/generator/writers/ingress.go index c15f3c8..311e80d 100644 --- a/generator/writers/ingress.go +++ b/generator/writers/ingress.go @@ -10,7 +10,19 @@ import ( "gopkg.in/yaml.v3" ) +const classAndVersionCondition = `{{- if and .Values.__name__.ingress.class (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}` + "\n" +const versionCondition = `{{- if semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion }}` + "\n" + func BuildIngress(ingress *helm.Ingress, name, templatesDir string) { + // Set the backend for 1.18 + for _, b := range ingress.Spec.Rules { + for _, p := range b.Http.Paths { + p.Backend.ServiceName = p.Backend.Service.Name + if n, ok := p.Backend.Service.Port["number"]; ok { + p.Backend.ServicePort = n + } + } + } kind := "ingress" buffer := bytes.NewBuffer(nil) fname := filepath.Join(templatesDir, name+"."+kind+".yaml") @@ -23,18 +35,32 @@ func BuildIngress(ingress *helm.Ingress, name, templatesDir string) { fp, _ := os.Create(fname) content := string(buffer.Bytes()) lines := strings.Split(content, "\n") + + backendHit := false for _, l := range lines { if strings.Contains(l, "ingressClassName") { - p := strings.Split(l, ":") - condition := p[1] - condition = strings.ReplaceAll(condition, "'", "") - condition = strings.ReplaceAll(condition, "{{", "") - condition = strings.ReplaceAll(condition, "}}", "") - condition = strings.TrimSpace(condition) - condition = "{{- if " + condition + " }}" - l = " " + condition + "\n" + l + "\n {{- end }}" + // should be set only if the version of Kubernetes is 1.18-0 or higher + cond := strings.ReplaceAll(classAndVersionCondition, "__name__", name) + l = ` ` + cond + l + "\n" + ` {{- end }}` } + + // manage the backend format following the Kubernetes 1.18-0 version or higher + if strings.Contains(l, "service:") { + n := CountSpaces(l) + l = strings.Repeat(" ", n) + versionCondition + l + } + if strings.Contains(l, "serviceName:") || strings.Contains(l, "servicePort:") { + n := CountSpaces(l) + if !backendHit { + l = strings.Repeat(" ", n) + "{{- else }}\n" + l + } else { + l = l + "\n" + strings.Repeat(" ", n) + "{{- end }}\n" + } + backendHit = true + } + fp.WriteString(l + "\n") } + fp.Close() } diff --git a/generator/writers/utils.go b/generator/writers/utils.go new file mode 100644 index 0000000..acf333f --- /dev/null +++ b/generator/writers/utils.go @@ -0,0 +1,14 @@ +package writers + +// CountSpaces returns the number of spaces from the begining of the line +func CountSpaces(line string) int { + var spaces int + for _, char := range line { + if char == ' ' { + spaces++ + } else { + break + } + } + return spaces +} diff --git a/helm/ingress.go b/helm/ingress.go index 804eebd..8301c06 100644 --- a/helm/ingress.go +++ b/helm/ingress.go @@ -38,14 +38,16 @@ type IngressHttp struct { type IngressPath struct { Path string PathType string `yaml:"pathType"` - Backend IngressBackend + Backend *IngressBackend } type IngressBackend struct { - Service IngressService + Service IngressService + ServiceName string `yaml:"serviceName"` // for kubernetes version < 1.18 + ServicePort interface{} `yaml:"servicePort"` // for kubernetes version < 1.18 } type IngressService struct { - Name string - Port map[string]interface{} + Name string `yaml:"name"` + Port map[string]interface{} `yaml:"port"` }