From 236c7831885ae897e39db79a9938e920e015b49e Mon Sep 17 00:00:00 2001 From: Patrice Ferlet Date: Wed, 1 Dec 2021 11:53:10 +0100 Subject: [PATCH] Add possibility to use env file --- .gitignore | 1 + compose/types.go | 1 + generator/main.go | 15 +++++++++++++++ helm/configMap.go | 47 ++++++++++++++++++++++++++++++++++++++++++++++ helm/deployment.go | 20 +++++++++++--------- helm/types.go | 2 +- 6 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 helm/configMap.go diff --git a/.gitignore b/.gitignore index 4cff4f9..c3bc3b1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ chart/* docker-compose.yaml katenary +example.env diff --git a/compose/types.go b/compose/types.go index b84fc17..38deff1 100644 --- a/compose/types.go +++ b/compose/types.go @@ -24,4 +24,5 @@ type Service struct { DependsOn []string `yaml:"depends_on"` Volumes []string `yaml:"volumes"` Expose []int `yaml:"expose"` + EnvFiles []string `yaml:"env_file"` } diff --git a/generator/main.go b/generator/main.go index f56e8f5..b2a36a3 100644 --- a/generator/main.go +++ b/generator/main.go @@ -42,6 +42,21 @@ func CreateReplicaObject(name string, s compose.Service) (ret []interface{}) { container := helm.NewContainer(name, s.Image, s.Environment, s.Labels) + for _, envfile := range s.EnvFiles { + configMap := helm.NewConfigMap(name) + if err := configMap.AddEnvFile(envfile); err != nil { + Red(err.Error()) + os.Exit(2) + } + container.EnvFrom = append(container.EnvFrom, map[string]map[string]string{ + "configMapRef": { + "name": configMap.Metadata.Name, + }, + }) + + ret = append(ret, configMap) + } + container.Image = "{{ .Values." + name + ".image }}" Values[name] = map[string]interface{}{ "image": s.Image, diff --git a/helm/configMap.go b/helm/configMap.go new file mode 100644 index 0000000..254d43a --- /dev/null +++ b/helm/configMap.go @@ -0,0 +1,47 @@ +package helm + +import ( + "errors" + "io/ioutil" + "log" + "strings" +) + +type ConfigMap struct { + *K8sBase `yaml:",inline"` + Data map[string]string `yaml:"data"` +} + +func NewConfigMap(name string) *ConfigMap { + base := NewBase() + base.Kind = "ConfigMap" + base.Metadata.Name = "{{ .Release.Name }}-" + name + return &ConfigMap{ + K8sBase: base, + Data: make(map[string]string), + } +} + +func (c *ConfigMap) AddEnvFile(file string) error { + content, err := ioutil.ReadFile(file) + if err != nil { + return err + } + + lines := strings.Split(string(content), "\n") + for _, l := range lines { + l = strings.TrimSpace(l) + if len(l) == 0 { + continue + } + parts := strings.SplitN(l, "=", 2) + log.Printf("%d %v\n", len(parts), parts) + if len(parts) < 2 { + return errors.New("The environment file " + file + " is not valid") + } + c.Data[parts[0]] = parts[1] + } + + return nil + +} diff --git a/helm/deployment.go b/helm/deployment.go index 033ca58..655e3b6 100644 --- a/helm/deployment.go +++ b/helm/deployment.go @@ -38,19 +38,21 @@ type ContainerPort struct { } type Container struct { - Name string `yaml:"name,omitempty"` - Image string `yaml:"image"` - Ports []*ContainerPort `yaml:"ports,omitempty"` - Env []Value `yaml:"env,omitempty"` - Command []string `yaml:"command,omitempty"` - VolumeMounts []interface{} `yaml:"volumeMounts,omitempty"` + Name string `yaml:"name,omitempty"` + Image string `yaml:"image"` + Ports []*ContainerPort `yaml:"ports,omitempty"` + Env []Value `yaml:"env,omitempty"` + EnvFrom []map[string]map[string]string `yaml:"envFrom,omitempty"` + Command []string `yaml:"command,omitempty"` + VolumeMounts []interface{} `yaml:"volumeMounts,omitempty"` } func NewContainer(name, image string, environment, labels map[string]string) *Container { container := &Container{ - Image: image, - Name: name, - Env: make([]Value, len(environment)), + Image: image, + Name: name, + Env: make([]Value, len(environment)), + EnvFrom: make([]map[string]map[string]string, 0), } toServices := make([]string, 0) diff --git a/helm/types.go b/helm/types.go index ac0d13c..6cca7d8 100644 --- a/helm/types.go +++ b/helm/types.go @@ -7,7 +7,7 @@ import ( const K = "katenary.io" -var Version = "1.0" +var Version = "1.0" // should be set from main.Version type Kinded interface { Get() string