Fix cli custom output and charts conflict error

This commit is contained in:
Hang Yan 2018-02-27 15:44:24 +08:00
parent f857afad1c
commit 0f3d368215
2 changed files with 58 additions and 50 deletions

View File

@ -51,14 +51,11 @@ import (
/** /**
* Generate Helm Chart configuration * Generate Helm Chart configuration
*/ */
func generateHelm(filenames []string, outFiles []string) error { func generateHelm(dirName string) error {
type ChartDetails struct { type ChartDetails struct {
Name string Name string
} }
// Let assume all the docker-compose files are in the same directory
filename := filenames[0]
extension := filepath.Ext(filename)
dirName := filename[0 : len(filename)-len(extension)]
details := ChartDetails{dirName} details := ChartDetails{dirName}
manifestDir := dirName + string(os.PathSeparator) + "templates" manifestDir := dirName + string(os.PathSeparator) + "templates"
dir, err := os.Open(dirName) dir, err := os.Open(dirName)
@ -78,6 +75,7 @@ func generateHelm(filenames []string, outFiles []string) error {
if err != nil { if err != nil {
return err return err
} }
}
/* Create the readme file */ /* Create the readme file */
readme := "This chart was created by Kompose\n" readme := "This chart was created by Kompose\n"
@ -107,31 +105,11 @@ home:
if err != nil { if err != nil {
return err return err
} }
}
/* Copy all related json/yaml files into the newly created manifests directory */ log.Infof("chart created in %q\n", dirName+string(os.PathSeparator))
for _, filename := range outFiles {
if err = cpFileToChart(manifestDir, filename); err != nil {
log.Warningln(err)
}
if err = os.Remove(filename); err != nil {
log.Warningln(err)
}
}
log.Infof("chart created in %q\n", "."+string(os.PathSeparator)+dirName+string(os.PathSeparator))
return nil return nil
} }
func cpFileToChart(manifestDir, filename string) error {
infile, err := ioutil.ReadFile(filename)
if err != nil {
log.Warningf("Error reading %s: %s\n", filename, err)
return err
}
return ioutil.WriteFile(manifestDir+string(os.PathSeparator)+filename, infile, 0644)
}
// Check if given path is a directory // Check if given path is a directory
func isDir(name string) (bool, error) { func isDir(name string) (bool, error) {
@ -155,20 +133,37 @@ func isDir(name string) (bool, error) {
return false, nil return false, nil
} }
func getDirName(opt kobject.ConvertOptions) string {
dirName := opt.OutFile
if dirName == "" {
// Let assume all the docker-compose files are in the same directory
if opt.CreateChart {
filename := opt.InputFiles[0]
extension := filepath.Ext(filename)
dirName = filename[0 : len(filename)-len(extension)]
} else {
dirName = "."
}
}
return dirName
}
// PrintList will take the data converted and decide on the commandline attributes given // PrintList will take the data converted and decide on the commandline attributes given
func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error { func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error {
var f *os.File var f *os.File
var dirName string dirName := getDirName(opt)
log.Debugf("Target Dir: %s", dirName)
// Check if output file is a directory // Check if output file is a directory
isDirVal, err := isDir(opt.OutFile) isDirVal, err := isDir(opt.OutFile)
if err != nil { if err != nil {
return errors.Wrap(err, "isDir failed") return errors.Wrap(err, "isDir failed")
} }
if isDirVal { if opt.CreateChart {
dirName = opt.OutFile isDirVal = true
} else { }
if !isDirVal {
f, err = transformer.CreateOutFile(opt.OutFile) f, err = transformer.CreateOutFile(opt.OutFile)
if err != nil { if err != nil {
return errors.Wrap(err, "transformer.CreateOutFile failed") return errors.Wrap(err, "transformer.CreateOutFile failed")
@ -200,7 +195,7 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error {
} }
data, err := marshal(convertedList, opt.GenerateJSON) data, err := marshal(convertedList, opt.GenerateJSON)
if err != nil { if err != nil {
return fmt.Errorf("Error in marshalling the List: %v", err) return fmt.Errorf("error in marshalling the List: %v", err)
} }
printVal, err := transformer.Print("", dirName, "", data, opt.ToStdout, opt.GenerateJSON, f, opt.Provider) printVal, err := transformer.Print("", dirName, "", data, opt.ToStdout, opt.GenerateJSON, f, opt.Provider)
if err != nil { if err != nil {
@ -208,6 +203,15 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error {
} }
files = append(files, printVal) files = append(files, printVal)
} else { } else {
finalDirName := dirName
if opt.CreateChart {
finalDirName = dirName + string(os.PathSeparator) + "templates"
}
if err := os.MkdirAll(finalDirName, 0755); err != nil {
return err
}
var file string var file string
// create a separate file for each provider // create a separate file for each provider
for _, v := range objects { for _, v := range objects {
@ -229,7 +233,7 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error {
// cast it to correct type - api.ObjectMeta // cast it to correct type - api.ObjectMeta
objectMeta := val.FieldByName("ObjectMeta").Interface().(api.ObjectMeta) objectMeta := val.FieldByName("ObjectMeta").Interface().(api.ObjectMeta)
file, err = transformer.Print(objectMeta.Name, dirName, strings.ToLower(typeMeta.Kind), data, opt.ToStdout, opt.GenerateJSON, f, opt.Provider) file, err = transformer.Print(objectMeta.Name, finalDirName, strings.ToLower(typeMeta.Kind), data, opt.ToStdout, opt.GenerateJSON, f, opt.Provider)
if err != nil { if err != nil {
return errors.Wrap(err, "transformer.Print failed") return errors.Wrap(err, "transformer.Print failed")
} }
@ -238,7 +242,7 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error {
} }
} }
if opt.CreateChart { if opt.CreateChart {
err = generateHelm(opt.InputFiles, files) err = generateHelm(dirName)
if err != nil { if err != nil {
return errors.Wrap(err, "generateHelm failed") return errors.Wrap(err, "generateHelm failed")
} }

View File

@ -362,6 +362,10 @@ convert::check_artifacts_generated "kompose -f $KOMPOSE_ROOT/script/test/fixture
# Behavior with -o <dirname>/<filename> # Behavior with -o <dirname>/<filename>
convert::check_artifacts_generated "kompose -f $KOMPOSE_ROOT/script/test/fixtures/redis-example/docker-compose.yml convert -o $TEMP_DIR/output_file -j" "$TEMP_DIR/output_file" convert::check_artifacts_generated "kompose -f $KOMPOSE_ROOT/script/test/fixtures/redis-example/docker-compose.yml convert -o $TEMP_DIR/output_file -j" "$TEMP_DIR/output_file"
######
# Test charts generate with custom dir
convert::check_artifacts_generated "kompose -f $KOMPOSE_ROOT/script/test/fixtures/redis-example/docker-compose.yml convert -o $TEMP_DIR -j -c" "$TEMP_DIR/Chart.yaml" "$TEMP_DIR/README.md" "$TEMP_DIR/templates/redis-deployment.json" "$TEMP_DIR/templates/redis-service.json" "$TEMP_DIR/templates/web-deployment.json" "$TEMP_DIR/templates/web-service.json"
#### ####
# Test regarding build context (running kompose from various directories) # Test regarding build context (running kompose from various directories)
# Replacing variables with current branch and uri # Replacing variables with current branch and uri