in pkg/transformer/kubernetes/k8sutils.go [162:283]
func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error {
var f *os.File
dirName := getDirName(opt)
log.Debugf("Target Dir: %s", dirName)
// Create a directory if "out" ends with "/" and does not exist.
if !transformer.Exists(opt.OutFile) && strings.HasSuffix(opt.OutFile, "/") {
if err := os.MkdirAll(opt.OutFile, os.ModePerm); err != nil {
return errors.Wrap(err, "failed to create a directory")
}
}
// Check if output file is a directory
isDirVal, err := isDir(opt.OutFile)
if err != nil {
return errors.Wrap(err, "isDir failed")
}
if opt.CreateChart {
isDirVal = true
}
if !isDirVal {
f, err = transformer.CreateOutFile(opt.OutFile)
if err != nil {
return errors.Wrap(err, "transformer.CreateOutFile failed")
}
if len(opt.OutFile) != 0 {
log.Printf("Kubernetes file %q created", opt.OutFile)
}
defer f.Close()
}
var files []string
// if asked to print to stdout or to put in single file
// we will create a list
if opt.ToStdout || f != nil {
list := &api.List{}
// convert objects to versioned and add them to list
for _, object := range objects {
versionedObject, err := convertToVersion(object)
if err != nil {
return err
}
list.Items = append(list.Items, objectToRaw(versionedObject))
}
// version list itself
list.Kind = "List"
list.APIVersion = "v1"
convertedList, err := convertToVersion(list)
if err != nil {
return err
}
data, err := marshal(convertedList, opt.GenerateJSON, opt.YAMLIndent)
if err != nil {
return fmt.Errorf("error in marshalling the List: %v", err)
}
printVal, err := transformer.Print("", dirName, "", data, opt.ToStdout, opt.GenerateJSON, f, opt.Provider)
if err != nil {
return errors.Wrap(err, "transformer.Print failed")
}
files = append(files, printVal)
} 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
// create a separate file for each provider
for _, v := range objects {
versionedObject, err := convertToVersion(v)
if err != nil {
return err
}
data, err := marshal(versionedObject, opt.GenerateJSON, opt.YAMLIndent)
if err != nil {
return err
}
var typeMeta metav1.TypeMeta
var objectMeta metav1.ObjectMeta
if us, ok := v.(*unstructured.Unstructured); ok {
typeMeta = metav1.TypeMeta{
Kind: us.GetKind(),
APIVersion: us.GetAPIVersion(),
}
objectMeta = metav1.ObjectMeta{
Name: us.GetName(),
}
} else {
val := reflect.ValueOf(v).Elem()
// Use reflect to access TypeMeta struct inside runtime.Object.
// cast it to correct type - metav1.TypeMeta
typeMeta = val.FieldByName("TypeMeta").Interface().(metav1.TypeMeta)
// Use reflect to access ObjectMeta struct inside runtime.Object.
// cast it to correct type - api.ObjectMeta
objectMeta = val.FieldByName("ObjectMeta").Interface().(metav1.ObjectMeta)
}
file, err = transformer.Print(objectMeta.Name, finalDirName, strings.ToLower(typeMeta.Kind), data, opt.ToStdout, opt.GenerateJSON, f, opt.Provider)
if err != nil {
return errors.Wrap(err, "transformer.Print failed")
}
files = append(files, file)
}
}
if opt.CreateChart {
err = generateHelm(dirName)
if err != nil {
return errors.Wrap(err, "generateHelm failed")
}
}
return nil
}