diff --git a/compose/parser.go b/compose/parser.go index 03d68d5..294fa1e 100644 --- a/compose/parser.go +++ b/compose/parser.go @@ -1,13 +1,12 @@ package compose import ( - "fmt" - "katenary/helm" "log" "os" "strings" - "github.com/google/shlex" + "github.com/compose-spec/compose-go/cli" + "github.com/compose-spec/compose-go/types" "gopkg.in/yaml.v3" ) @@ -17,7 +16,7 @@ const ( // Parser is a docker-compose parser. type Parser struct { - Data *Compose + Data *types.Project } var Appname = "" @@ -44,205 +43,34 @@ func NewParser(filename string, content ...string) *Parser { } } - p := &Parser{Data: c} + p := &Parser{} return p } func (p *Parser) Parse(appname string) { - Appname = appname - services := make(map[string][]string) - // get the service list, to be sure that everything is ok + // Reminder: + // - set Appname + // - loas services - // fix ugly types - for _, s := range p.Data.Services { - parseEnv(s) - parseCommand(s) - parseEnvFiles(s) - parseHealthCheck(s) + options, err := cli.NewProjectOptions(nil, + cli.WithDefaultConfigPath, + cli.WithNormalization(true), + cli.WithInterpolation(true), + cli.WithResolvedPaths(true), + ) + if err != nil { + log.Fatal(err) } - c := p.Data - for name, s := range c.Services { - if portlabel, ok := s.Labels[helm.LABEL_PORT]; ok { - services := strings.Split(portlabel, ",") - for _, serviceport := range services { - portexists := false - for _, found := range s.Ports { - if found == serviceport { - portexists = true - } - } - if !portexists { - s.Ports = append(s.Ports, serviceport) - } - } - } - if len(s.Ports) > 0 { - services[name] = s.Ports - } + proj, err := cli.ProjectFromOptions(options) + if err != nil { + log.Fatal(err) } - // check if dependencies are resolved - missing := []string{} - for name, s := range c.Services { - for _, dep := range s.DependsOn { - if _, ok := services[dep]; !ok { - missing = append(missing, fmt.Sprintf( - "The service \"%s\" hasn't got "+ - "declared port for dependency from \"%s\" - please "+ - "append a %s label or a \"ports\" section in the docker-compose file", - dep, name, helm.LABEL_PORT), - ) - } - } - } + Appname = proj.Name - if len(missing) > 0 { - log.Fatal(strings.Join(missing, "\n")) - } - - // check if all "image" properties are set - missing = []string{} - for name, s := range c.Services { - if s.Image == "" { - missing = append(missing, fmt.Sprintf( - "The service \"%s\" hasn't got "+ - "an image property - please "+ - "append an image property in the docker-compose file", - name, - )) - } - } - if len(missing) > 0 { - log.Fatal(strings.Join(missing, "\n")) - } - - // check the build element - for name, s := range c.Services { - if s.RawBuild == nil { - continue - } - - fmt.Println(ICON_EXCLAMATION + - " \x1b[33myou will need to build and push your image named \"" + s.Image + "\"" + - " for the \"" + name + "\" service \x1b[0m") - - } + p.Data = proj } - -// manage environment variables, if the type is map[string]string so we can use it, else we need to split "=" sign -// and apply this in env variable -func parseEnv(s *Service) { - env := make(map[string]string) - if s.RawEnvironment == nil { - return - } - switch s.RawEnvironment.(type) { - case map[string]string: - env = s.RawEnvironment.(map[string]string) - case map[string]interface{}: - for k, v := range s.RawEnvironment.(map[string]interface{}) { - // force to string - env[k] = fmt.Sprintf("%v", v) - } - case []interface{}: - for _, v := range s.RawEnvironment.([]interface{}) { - // Splot the value of the env variable with "=" - parts := strings.Split(v.(string), "=") - env[parts[0]] = parts[1] - } - case string: - parts := strings.Split(s.RawEnvironment.(string), "=") - env[parts[0]] = parts[1] - default: - log.Printf("%+v, %T", s.RawEnvironment, s.RawEnvironment) - log.Fatal("Environment type not supported") - } - s.Environment = env -} - -func parseCommand(s *Service) { - - if s.RawCommand == nil { - return - } - - // following the command type, it can be a "slice" or a simple sting, so we need to check it - switch v := s.RawCommand.(type) { - case string: - // use shlex to parse the command - command, err := shlex.Split(v) - if err != nil { - log.Fatal(err) - } - s.Command = command - case []string: - s.Command = v - case []interface{}: - for _, v := range v { - s.Command = append(s.Command, v.(string)) - } - default: - log.Printf("%+v %T", s.RawCommand, s.RawCommand) - log.Fatal("Command type not supported") - } -} - -func parseEnvFiles(s *Service) { - // Same than parseEnv, but for env files - if s.RawEnvFiles == nil { - return - } - envfiles := make([]string, 0) - switch v := s.RawEnvFiles.(type) { - case []string: - envfiles = v - case []interface{}: - for _, v := range v { - envfiles = append(envfiles, v.(string)) - } - case string: - envfiles = append(envfiles, v) - default: - log.Printf("%+v %T", s.RawEnvFiles, s.RawEnvFiles) - log.Fatal("EnvFile type not supported") - } - s.EnvFiles = envfiles -} - -func parseHealthCheck(s *Service) { - // HealthCheck command can be a string or slice of strings - if s.HealthCheck == nil { - return - } - if s.HealthCheck.RawTest == nil { - return - } - - switch v := s.HealthCheck.RawTest.(type) { - case string: - c, err := shlex.Split(v) - if err != nil { - log.Fatal(err) - } - s.HealthCheck = &HealthCheck{ - Test: c, - } - - case []string: - s.HealthCheck = &HealthCheck{ - Test: v, - } - - case []interface{}: - for _, v := range v { - s.HealthCheck.Test = append(s.HealthCheck.Test, v.(string)) - } - default: - log.Printf("%+v %T", s.HealthCheck.RawTest, s.HealthCheck.RawTest) - log.Fatal("HealthCheck type not supported") - } -} diff --git a/compose/parser_test.go b/compose/parser_test.go deleted file mode 100644 index 904b00a..0000000 --- a/compose/parser_test.go +++ /dev/null @@ -1,199 +0,0 @@ -package compose - -import ( - "katenary/logger" - "testing" -) - -const DOCKER_COMPOSE_YML1 = ` -version: "3" - -services: - # first service, very basic - web: - image: nginx - ports: - - "80:80" - environment: - FOO: bar - BAZ: qux - networks: - - frontend - - - database: - image: postgres - networks: - - frontend - environment: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: mysecretpassword - POSTGRES_DB: mydb - labels: - katenary.io/ports: "5432" - - commander1: - image: foo - command: ["/bin/sh", "-c", "echo 'hello world'"] - - commander2: - image: foo - command: echo "hello world" - - hc1: - image: foo - healthcheck: - test: ["CMD-SHELL", "echo 'hello world1'"] - - hc2: - image: foo - healthcheck: - test: echo "hello world2" - - hc3: - image: foo - healthcheck: - test: ["CMD", "echo 'hello world3'"] - - -` - -func init() { - logger.NOLOG = true -} - -func TestParser(t *testing.T) { - p := NewParser("", DOCKER_COMPOSE_YML1) - p.Parse("test") - - // check if the "web" and "database" service is parsed correctly - // by checking if the "ports" and "environment" - for name, service := range p.Data.Services { - if name == "web" { - if len(service.Ports) != 1 { - t.Errorf("Expected 1 port, got %d", len(service.Ports)) - } - if service.Ports[0] != "80:80" { - t.Errorf("Expected port 80:80, got %s", service.Ports[0]) - } - if len(service.Environment) != 2 { - t.Errorf("Expected 2 environment variables, got %d", len(service.Environment)) - } - if service.Environment["FOO"] != "bar" { - t.Errorf("Expected FOO=bar, got %s", service.Environment["FOO"]) - } - if service.Environment["BAZ"] != "qux" { - t.Errorf("Expected BAZ=qux, got %s", service.Environment["BAZ"]) - } - } - // same for the "database" service - if name == "database" { - if len(service.Ports) != 1 { - t.Errorf("Expected 1 port, got %d", len(service.Ports)) - } - if service.Ports[0] != "5432" { - t.Errorf("Expected port 5432, got %s", service.Ports[0]) - } - if len(service.Environment) != 3 { - t.Errorf("Expected 3 environment variables, got %d", len(service.Environment)) - } - if service.Environment["POSTGRES_USER"] != "postgres" { - t.Errorf("Expected POSTGRES_USER=postgres, got %s", service.Environment["POSTGRES_USER"]) - } - if service.Environment["POSTGRES_PASSWORD"] != "mysecretpassword" { - t.Errorf("Expected POSTGRES_PASSWORD=mysecretpassword, got %s", service.Environment["POSTGRES_PASSWORD"]) - } - if service.Environment["POSTGRES_DB"] != "mydb" { - t.Errorf("Expected POSTGRES_DB=mydb, got %s", service.Environment["POSTGRES_DB"]) - } - // check labels - if len(service.Labels) != 1 { - t.Errorf("Expected 1 label, got %d", len(service.Labels)) - } - // is label katenary.io/ports correct? - if service.Labels["katenary.io/ports"] != "5432" { - t.Errorf("Expected katenary.io/ports=5432, got %s", service.Labels["katenary.io/ports"]) - } - } - } -} - -func TestParseCommand(t *testing.T) { - p := NewParser("", DOCKER_COMPOSE_YML1) - p.Parse("test") - - for name, s := range p.Data.Services { - if name == "commander1" { - t.Log(s.Command) - if len(s.Command) != 3 { - t.Errorf("Expected 3 command, got %d", len(s.Command)) - } - if s.Command[0] != "/bin/sh" { - t.Errorf("Expected /bin/sh, got %s", s.Command[0]) - } - if s.Command[1] != "-c" { - t.Errorf("Expected -c, got %s", s.Command[1]) - } - if s.Command[2] != "echo 'hello world'" { - t.Errorf("Expected echo 'hello world', got %s", s.Command[2]) - } - } - if name == "commander2" { - t.Log(s.Command) - if len(s.Command) != 2 { - t.Errorf("Expected 1 command, got %d", len(s.Command)) - } - if s.Command[0] != "echo" { - t.Errorf("Expected echo, got %s", s.Command[0]) - } - if s.Command[1] != "hello world" { - t.Errorf("Expected hello world, got %s", s.Command[1]) - } - } - } -} - -func TestHealthChecks(t *testing.T) { - p := NewParser("", DOCKER_COMPOSE_YML1) - p.Parse("test") - - for name, s := range p.Data.Services { - if name != "hc1" && name != "hc2" && name != "hc3" { - continue - } - - if name == "hc1" { - if len(s.HealthCheck.Test) != 2 { - t.Errorf("Expected 2 healthcheck tests, got %d", len(s.HealthCheck.Test)) - } - if s.HealthCheck.Test[0] != "CMD-SHELL" { - t.Errorf("Expected CMD-SHELL, got %s", s.HealthCheck.Test[0]) - } - if s.HealthCheck.Test[1] != "echo 'hello world1'" { - t.Errorf("Expected echo 'hello world1', got %s", s.HealthCheck.Test[1]) - } - } - if name == "hc2" { - if len(s.HealthCheck.Test) != 2 { - t.Errorf("Expected 2 healthcheck tests, got %d", len(s.HealthCheck.Test)) - } - if s.HealthCheck.Test[0] != "echo" { - t.Errorf("Expected echo, got %s", s.HealthCheck.Test[1]) - } - if s.HealthCheck.Test[1] != "hello world2" { - t.Errorf("Expected echo 'hello world2', got %s", s.HealthCheck.Test[1]) - } - } - if name == "hc3" { - if len(s.HealthCheck.Test) != 2 { - t.Errorf("Expected 2 healthcheck tests, got %d", len(s.HealthCheck.Test)) - } - if s.HealthCheck.Test[0] != "CMD" { - t.Errorf("Expected CMD, got %s", s.HealthCheck.Test[0]) - } - if s.HealthCheck.Test[1] != "echo 'hello world3'" { - t.Errorf("Expected echo 'hello world3', got %s", s.HealthCheck.Test[1]) - } - } - } -} diff --git a/generator/main.go b/generator/main.go index e23bd47..0de5bf0 100644 --- a/generator/main.go +++ b/generator/main.go @@ -3,11 +3,9 @@ package generator import ( "fmt" "io/ioutil" - "katenary/compose" "katenary/helm" "katenary/logger" "log" - "net/url" "os" "path/filepath" "strconv" @@ -17,7 +15,7 @@ import ( "errors" - "github.com/google/shlex" + "github.com/compose-spec/compose-go/types" ) var servicesMap = make(map[string]int) @@ -56,14 +54,14 @@ echo "Done" var madeDeployments = make(map[string]helm.Deployment, 0) // Create a Deployment for a given compose.Service. It returns a list of objects: a Deployment and a possible Service (kubernetes represnetation as maps). -func CreateReplicaObject(name string, s *compose.Service, linked map[string]*compose.Service) chan interface{} { +func CreateReplicaObject(name string, s types.ServiceConfig, linked map[string]types.ServiceConfig) chan interface{} { ret := make(chan interface{}, len(s.Ports)+len(s.Expose)+1) go parseService(name, s, linked, ret) return ret } // This function will try to yied deployment and services based on a service from the compose file structure. -func parseService(name string, s *compose.Service, linked map[string]*compose.Service, ret chan interface{}) { +func parseService(name string, s types.ServiceConfig, linked map[string]types.ServiceConfig, ret chan interface{}) { logger.Magenta(ICON_PACKAGE+" Generating deployment for ", name) o := helm.NewDeployment(name) @@ -167,7 +165,7 @@ func parseService(name string, s *compose.Service, linked map[string]*compose.Se } // prepareContainer assigns image, command, env, and labels to a container. -func prepareContainer(container *helm.Container, service *compose.Service, servicename string) { +func prepareContainer(container *helm.Container, service types.ServiceConfig, servicename string) { // if there is no image name, this should fail! if service.Image == "" { log.Fatal(ICON_PACKAGE+" No image name for service ", servicename) @@ -182,22 +180,16 @@ func prepareContainer(container *helm.Container, service *compose.Service, servi } // Create a service (k8s). -func generateServicesAndIngresses(name string, s *compose.Service) []interface{} { +func generateServicesAndIngresses(name string, s types.ServiceConfig) []interface{} { ret := make([]interface{}, 0) // can handle helm.Service or helm.Ingress logger.Magenta(ICON_SERVICE+" Generating service for ", name) ks := helm.NewService(name) for i, p := range s.Ports { - port := strings.Split(p, ":") - src, _ := strconv.Atoi(port[0]) - target := src - if len(port) > 1 { - target, _ = strconv.Atoi(port[1]) - } - ks.Spec.Ports = append(ks.Spec.Ports, helm.NewServicePort(target, target)) + ks.Spec.Ports = append(ks.Spec.Ports, helm.NewServicePort(int(p.Target), int(p.Target))) if i == 0 { - detected(name, target) + detected(name, int(p.Target)) } } ks.Spec.Selector = buildSelector(name, s) @@ -217,7 +209,9 @@ func generateServicesAndIngresses(name string, s *compose.Service) []interface{} logger.Magenta(ICON_SERVICE+" Generating service for ", name+"-external") ks := helm.NewService(name + "-external") ks.Spec.Type = "NodePort" - for _, p := range s.Expose { + for _, expose := range s.Expose { + + p, _ := strconv.Atoi(expose) ks.Spec.Ports = append(ks.Spec.Ports, helm.NewServicePort(p, p)) } ks.Spec.Selector = buildSelector(name, s) @@ -228,7 +222,7 @@ func generateServicesAndIngresses(name string, s *compose.Service) []interface{} } // Create an ingress. -func createIngress(name string, port int, s *compose.Service) *helm.Ingress { +func createIngress(name string, port int, s types.ServiceConfig) *helm.Ingress { ingress := helm.NewIngress(name) Values[name]["ingress"] = map[string]interface{}{ "class": "nginx", @@ -303,7 +297,7 @@ func waitPort(name string) chan int { } // Build the selector for the service. -func buildSelector(name string, s *compose.Service) map[string]string { +func buildSelector(name string, s types.ServiceConfig) map[string]string { return map[string]string{ "katenary.io/component": name, "katenary.io/release": RELEASE_NAME, @@ -344,31 +338,28 @@ func buildCMFromPath(path string) *helm.ConfigMap { } // generateContainerPorts add the container ports of a service. -func generateContainerPorts(s *compose.Service, name string, container *helm.Container) { +func generateContainerPorts(s types.ServiceConfig, name string, container *helm.Container) { 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 { if name == n { - portName = fmt.Sprintf("%s-%d", name, portNumber) + portName = fmt.Sprintf("%s-%d", name, port.Target) } } container.Ports = append(container.Ports, &helm.ContainerPort{ Name: portName, - ContainerPort: portNumber, + ContainerPort: int(port.Target), }) - exists[portNumber] = name + exists[int(port.Target)] = name } // manage the "expose" section to be a NodePort in Kubernetes - for _, port := range s.Expose { + for _, expose := range s.Expose { + + port, _ := strconv.Atoi(expose) + if _, exist := exists[port]; exist { continue } @@ -380,7 +371,7 @@ func generateContainerPorts(s *compose.Service, name string, container *helm.Con } // prepareVolumes add the volumes of a service. -func prepareVolumes(deployment, name string, s *compose.Service, container *helm.Container, madePVC map[string]bool, ret chan interface{}) []map[string]interface{} { +func prepareVolumes(deployment, name string, s types.ServiceConfig, container *helm.Container, madePVC map[string]bool, ret chan interface{}) []map[string]interface{} { volumes := make([]map[string]interface{}, 0) mountPoints := make([]interface{}, 0) @@ -389,16 +380,10 @@ func prepareVolumes(deployment, name string, s *compose.Service, container *helm configMapsVolumes = strings.Split(v, ",") } - for _, volume := range s.Volumes { + for _, vol := range s.Volumes { - parts := strings.Split(volume, ":") - if len(parts) == 1 { - // this is a volume declaration for Docker only, avoid it - continue - } - - volname := parts[0] - volepath := parts[1] + volname := vol.Source + volepath := vol.Target isCM := false for _, cmVol := range configMapsVolumes { @@ -511,12 +496,12 @@ func prepareVolumes(deployment, name string, s *compose.Service, container *helm } // prepareInitContainers add the init containers of a service. -func prepareInitContainers(name string, s *compose.Service, container *helm.Container) []*helm.Container { +func prepareInitContainers(name string, s types.ServiceConfig, container *helm.Container) []*helm.Container { // We need to detect others services, but we probably not have parsed them yet, so // we will wait for them for a while. initContainers := make([]*helm.Container, 0) - for _, dp := range s.DependsOn { + for dp, _ := range s.DependsOn { c := helm.NewContainer("check-"+dp, "busybox", nil, s.Labels) command := strings.ReplaceAll(strings.TrimSpace(dependScript), "__service__", dp) @@ -549,79 +534,12 @@ func prepareInitContainers(name string, s *compose.Service, container *helm.Cont } // prepareProbes generate http/tcp/command probes for a service. -func prepareProbes(name string, s *compose.Service, container *helm.Container) { +func prepareProbes(name string, s types.ServiceConfig, container *helm.Container) { - // manage the healthcheck property, if any - if s.HealthCheck != nil { - if s.HealthCheck.Interval == "" { - s.HealthCheck.Interval = "10s" - } - interval, err := time.ParseDuration(s.HealthCheck.Interval) - - if err != nil { - log.Fatal(err) - } - if s.HealthCheck.StartPeriod == "" { - s.HealthCheck.StartPeriod = "0s" - } - - initialDelaySeconds, err := time.ParseDuration(s.HealthCheck.StartPeriod) - if err != nil { - log.Fatal(err) - } - - probe := helm.NewProbe(int(interval.Seconds()), int(initialDelaySeconds.Seconds()), 1, s.HealthCheck.Retries) - - healthCheckLabel := s.Labels[helm.LABEL_HEALTHCHECK] - - if healthCheckLabel != "" { - - path := "/" - port := 80 - - u, err := url.Parse(healthCheckLabel) - if err == nil { - path = u.Path - port, _ = strconv.Atoi(u.Port()) - } else { - path = "/" - port = 80 - } - - if strings.HasPrefix(healthCheckLabel, "http://") { - probe.HttpGet = &helm.HttpGet{ - Path: path, - Port: port, - } - } else if strings.HasPrefix(healthCheckLabel, "tcp://") { - if err != nil { - log.Fatal(err) - } - probe.TCP = &helm.TCP{ - Port: port, - } - } else { - c, _ := shlex.Split(healthCheckLabel) - probe.Exec = &helm.Exec{ - - Command: c, - } - } - } else if s.HealthCheck.Test[0] == "CMD" || s.HealthCheck.Test[0] == "CMD-SHELL" { - probe.Exec = &helm.Exec{ - Command: s.HealthCheck.Test[1:], - } - } else { - probe.Exec = &helm.Exec{ - Command: s.HealthCheck.Test, - } - } - container.LivenessProbe = probe - } } // prepareEnvFromFiles generate configMap or secrets from environment files. -func prepareEnvFromFiles(name string, s *compose.Service, container *helm.Container, ret chan interface{}) { +func prepareEnvFromFiles(name string, s types.ServiceConfig, container *helm.Container, ret chan interface{}) { // prepare secrets secretsFiles := make([]string, 0) @@ -630,7 +548,7 @@ func prepareEnvFromFiles(name string, s *compose.Service, container *helm.Contai } // manage environment files (env_file in compose) - for _, envfile := range s.EnvFiles { + for _, envfile := range s.EnvFile { f := strings.ReplaceAll(envfile, "_", "-") f = strings.ReplaceAll(f, ".env", "") f = strings.ReplaceAll(f, ".", "") diff --git a/generator/main_test.go b/generator/main_test.go index 583f0b0..dcd4bfc 100644 --- a/generator/main_test.go +++ b/generator/main_test.go @@ -117,7 +117,8 @@ func TestCommand(t *testing.T) { tmp, p := setUp(t) defer os.RemoveAll(tmp) - for name := range p.Data.Services { + for _, service := range p.Data.Services { + name := service.Name if name == "web2" { // Ensure that the command is correctly set // The command should be a string array @@ -161,7 +162,8 @@ func TestEnvs(t *testing.T) { tmp, p := setUp(t) defer os.RemoveAll(tmp) - for name := range p.Data.Services { + for _, service := range p.Data.Services { + name := service.Name if name == "php" { // the "DB_HOST" environment variable inside the template must be set to '{{ .Release.Name }}-database' @@ -197,7 +199,8 @@ func TestSamePod(t *testing.T) { tmp, p := setUp(t) defer os.RemoveAll(tmp) - for name, service := range p.Data.Services { + for _, service := range p.Data.Services { + name := service.Name path := filepath.Join(tmp, "templates", name+".deployment.yaml") if _, found := service.Labels[helm.LABEL_SAMEPOD]; found { @@ -222,7 +225,8 @@ func TestPorts(t *testing.T) { tmp, p := setUp(t) defer os.RemoveAll(tmp) - for name, service := range p.Data.Services { + for _, service := range p.Data.Services { + name := service.Name path := "" // if the service has a port found in helm.LABEL_PORT or ports, so the service file should exist @@ -249,7 +253,8 @@ func TestPVC(t *testing.T) { tmp, p := setUp(t) defer os.RemoveAll(tmp) - for name := range p.Data.Services { + for _, service := range p.Data.Services { + name := service.Name path := filepath.Join(tmp, "templates", name+"-data.pvc.yaml") // the "database" service should have a pvc file in templates (name-data.pvc.yaml) @@ -269,7 +274,8 @@ func TestIngress(t *testing.T) { tmp, p := setUp(t) defer os.RemoveAll(tmp) - for name := range p.Data.Services { + for _, service := range p.Data.Services { + name := service.Name path := filepath.Join(tmp, "templates", name+".ingress.yaml") // the "web" service should have a ingress file in templates (name.ingress.yaml) @@ -289,7 +295,8 @@ func TestUnmappedVolumes(t *testing.T) { tmp, p := setUp(t) defer os.RemoveAll(tmp) - for name := range p.Data.Services { + for _, service := range p.Data.Services { + name := service.Name if name == "novol" { path := filepath.Join(tmp, "templates", name+".deployment.yaml") fp, _ := os.Open(path) @@ -310,7 +317,8 @@ func TestEqualSignOnEnv(t *testing.T) { defer os.RemoveAll(tmp) // if the name is eqenv, the service should habe environment - for name, _ := range p.Data.Services { + for _, service := range p.Data.Services { + name := service.Name if name == "eqenv" { path := filepath.Join(tmp, "templates", name+".deployment.yaml") fp, _ := os.Open(path) diff --git a/generator/writer.go b/generator/writer.go index 01f5e14..c0e40e5 100644 --- a/generator/writer.go +++ b/generator/writer.go @@ -10,6 +10,7 @@ import ( "strings" "time" + "github.com/compose-spec/compose-go/types" "gopkg.in/yaml.v3" ) @@ -32,13 +33,15 @@ func Generate(p *compose.Parser, katernayVersion, appName, appVersion, composeFi // list avoided services avoids := make(map[string]bool) - for n, service := range p.Data.Services { + for _, service := range p.Data.Services { + n := service.Name if _, ok := service.Labels[helm.LABEL_SAMEPOD]; ok { avoids[n] = true } } - for name, s := range p.Data.Services { + for _, s := range p.Data.Services { + name := s.Name // Manage emptyDir volumes if empty, ok := s.Labels[helm.LABEL_EMPTYDIRS]; ok { @@ -49,11 +52,12 @@ func Generate(p *compose.Parser, katernayVersion, appName, appVersion, composeFi } // fetch corresponding service in "links" - linked := make(map[string]*compose.Service, 0) + linked := make(map[string]types.ServiceConfig, 0) // find service linked to this one - for n, service := range p.Data.Services { - if _, ok := service.Labels[helm.LABEL_SAMEPOD]; ok { - if service.Labels[helm.LABEL_SAMEPOD] == name { + for _, service := range p.Data.Services { + n := service.Name + for _, label := range service.Labels { + if label == helm.LABEL_SAMEPOD { linked[n] = service } } diff --git a/go.mod b/go.mod index edf4df7..f5e777e 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module katenary go 1.16 require ( + github.com/compose-spec/compose-go v1.2.2 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/kr/pretty v0.2.0 // indirect github.com/spf13/cobra v1.4.0 diff --git a/go.sum b/go.sum index 75b2588..1638ead 100644 --- a/go.sum +++ b/go.sum @@ -1,34 +1,191 @@ +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/aws/aws-sdk-go v1.34.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/compose-spec/compose-go v1.2.2 h1:y1dwl3KUTBnWPVur6EZno9zUIum6Q87/F5keljnGQB4= +github.com/compose-spec/compose-go v1.2.2/go.mod h1:pAy7Mikpeft4pxkFU565/DRHEbDfR84G6AQuiL+Hdg8= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/distribution/distribution/v3 v3.0.0-20210316161203-a01c71e2477e h1:n81KvOMrLZa+VWHwST7dun9f0G98X3zREHS1ztYzZKU= +github.com/distribution/distribution/v3 v3.0.0-20210316161203-a01c71e2477e/go.mod h1:xpWTC2KnJMiDLkoawhsPQcXjvwATEBcbq0xevG2YR9M= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.1.0 h1:rVV8Tcg/8jHUkPUorwjaMTtemIMVXfIPKiOqnhEhakk= +gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= diff --git a/helm/deployment.go b/helm/deployment.go index 9d6f28b..172871d 100644 --- a/helm/deployment.go +++ b/helm/deployment.go @@ -1,6 +1,10 @@ package helm -import "strings" +import ( + "strings" + + "github.com/compose-spec/compose-go/types" +) // Deployment is a k8s deployment. type Deployment struct { @@ -82,7 +86,7 @@ func NewProbe(period, initialDelaySeconds, success, failure int) *Probe { } } -func NewContainer(name, image string, environment, labels map[string]string) *Container { +func NewContainer(name, image string, environment types.MappingWithEquals, labels map[string]string) *Container { container := &Container{ Image: image, Name: name, @@ -100,7 +104,7 @@ func NewContainer(name, image string, environment, labels map[string]string) *Co for n, v := range environment { for _, name := range toServices { if name == n { - v = RELEASE_NAME + "-" + v + *v = RELEASE_NAME + "-" + *v } } container.Env[idx] = Value{Name: n, Value: v}