* fix issue https://github.com/kubernetes/kompose/issues/1683

* add tests, die if inputfiles not specified

* fix GetComposeFileDir function and use it

* use fixed GetComposeFileDir instead of filepath.Dir

* return error instead of fatal

* add pod configmap creation to openshift
This commit is contained in:
Tomer Zait
2024-01-02 14:48:59 -05:00
committed by GitHub
parent 63f60e66fe
commit 92ca12ae5b
10 changed files with 241 additions and 11 deletions
+26
View File
@@ -18,6 +18,7 @@ package app
import (
"fmt"
"path/filepath"
"strings"
log "github.com/sirupsen/logrus"
@@ -224,6 +225,31 @@ func Convert(opt kobject.ConvertOptions) ([]runtime.Object, error) {
komposeObject.Namespace = opt.Namespace
// Get the directory of the compose file
workDir, err := transformer.GetComposeFileDir(opt.InputFiles)
if err != nil {
log.Fatalf("Unable to get compose file directory: %s", err)
}
// convert env_file from absolute to relative path
for _, service := range komposeObject.ServiceConfigs {
if len(service.EnvFile) <= 0 {
continue
}
for i, envFile := range service.EnvFile {
if !filepath.IsAbs(envFile) {
continue
}
relPath, err := filepath.Rel(workDir, envFile)
if err != nil {
log.Fatalf(err.Error())
}
service.EnvFile[i] = filepath.ToSlash(relPath)
}
}
// Get a transformer that maps komposeObject to provider's primitives
t := getTransformer(opt)
+18 -3
View File
@@ -220,7 +220,11 @@ func (k *Kubernetes) InitSvc(name string, service kobject.ServiceConfig) *api.Se
// InitConfigMapForEnv initializes a ConfigMap object
func (k *Kubernetes) InitConfigMapForEnv(name string, opt kobject.ConvertOptions, envFile string) *api.ConfigMap {
envs, err := GetEnvsFromFile(envFile)
workDir, err := transformer.GetComposeFileDir(opt.InputFiles)
if err != nil {
log.Fatalf("Unable to get compose file directory: %s", err)
}
envs, err := GetEnvsFromFile(filepath.Join(workDir, envFile))
if err != nil {
log.Fatalf("Unable to retrieve env file: %s", err)
}
@@ -1103,7 +1107,11 @@ func ConfigEnvs(service kobject.ServiceConfig, opt kobject.ConvertOptions) ([]ap
envName := FormatEnvName(file)
// Load environment variables from file
envLoad, err := GetEnvsFromFile(file)
workDir, err := transformer.GetComposeFileDir(opt.InputFiles)
if err != nil {
log.Fatalf("Unable to get compose file directory: %s", err)
}
envLoad, err := GetEnvsFromFile(filepath.Join(workDir, file))
if err != nil {
return envs, errors.Wrap(err, "Unable to read env_file")
}
@@ -1579,11 +1587,18 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
return nil, err
}
// Generate pod only and nothing more
// Generate pod and configmap objects
if (service.Restart == "no" || service.Restart == "on-failure") && !opt.IsPodController() {
log.Infof("Create kubernetes pod instead of pod controller due to restart policy: %s", service.Restart)
pod := k.InitPod(name, service)
objects = append(objects, pod)
if len(service.EnvFile) > 0 {
for _, envFile := range service.EnvFile {
configMap := k.InitConfigMapForEnv(name, opt, envFile)
objects = append(objects, configMap)
}
}
} else {
objects = k.CreateWorkloadAndConfigMapObjects(name, service, opt)
}
+8 -1
View File
@@ -325,7 +325,7 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
}
}
// Generate pod only and nothing more
// Generate pod and configmap objects
if service.Restart == "no" || service.Restart == "on-failure" {
// Error out if Controller Object is specified with restart: 'on-failure'
if opt.IsDeploymentConfigFlag {
@@ -333,6 +333,13 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
}
pod := o.InitPod(name, service)
objects = append(objects, pod)
if len(service.EnvFile) > 0 {
for _, envFile := range service.EnvFile {
configMap := o.InitConfigMapForEnv(name, opt, envFile)
objects = append(objects, configMap)
}
}
} else {
objects = o.CreateWorkloadAndConfigMapObjects(name, service, opt)
+8 -7
View File
@@ -336,14 +336,15 @@ func (env EnvSort) Swap(i, j int) {
// GetComposeFileDir returns compose file directory
func GetComposeFileDir(inputFiles []string) (string, error) {
// Check if input files are specified
if len(inputFiles) <= 0 {
return "", errors.New("No input files specified")
}
// Lets assume all the docker-compose files are in the same directory
inputFile := inputFiles[0]
if strings.Index(inputFile, "/") != 0 {
workDir, err := os.Getwd()
if err != nil {
return "", err
}
inputFile = filepath.Join(workDir, inputFile)
inputFile, err := filepath.Abs(inputFiles[0])
if err != nil {
return "", err
}
log.Debugf("Compose file dir: %s", filepath.Dir(inputFile))
return filepath.Dir(inputFile), nil