1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-12 10:55:20 +02:00
sap-jenkins-library/cmd/getDefaults.go
Jordi van Liempt eb73cae888
feat(getDefaults): add parameter for CRD-style config (#3736)
* export LoadConditionsV1() in config pkg

* getDefaults: read stage conditions as PipelineDefinitionV1

* add getDefaults useV1 tests

* add comment (pointed out by code climate analysis)

* small addition to comment (from previous commit)

Co-authored-by: I557621 <jordi.van.liempt@sap.com>
Co-authored-by: Christopher Fenner <26137398+CCFenner@users.noreply.github.com>
2022-04-19 12:34:40 +02:00

148 lines
4.2 KiB
Go

package cmd
import (
"encoding/json"
"fmt"
"io"
"os"
"github.com/SAP/jenkins-library/pkg/config"
"github.com/SAP/jenkins-library/pkg/log"
"github.com/SAP/jenkins-library/pkg/piperutils"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
type defaultsCommandOptions struct {
output string //output format of default configs, currently only YAML
outputFile string //if set: path to file where the output should be written to
defaultsFiles []string
useV1 bool
openFile func(s string, t map[string]string) (io.ReadCloser, error)
}
var defaultsOptions defaultsCommandOptions
type getDefaultsUtils interface {
FileExists(filename string) (bool, error)
DirExists(path string) (bool, error)
FileWrite(path string, content []byte, perm os.FileMode) error
}
type getDefaultsUtilsBundle struct {
*piperutils.Files
}
func newGetDefaultsUtilsUtils() getDefaultsUtils {
utils := getDefaultsUtilsBundle{
Files: &piperutils.Files{},
}
return &utils
}
// DefaultsCommand is the entry command for loading the configuration of a pipeline step
func DefaultsCommand() *cobra.Command {
defaultsOptions.openFile = config.OpenPiperFile
var createDefaultsCmd = &cobra.Command{
Use: "getDefaults",
Short: "Retrieves multiple default configurations and outputs them embedded into a JSON object.",
PreRun: func(cmd *cobra.Command, args []string) {
path, _ := os.Getwd()
fatalHook := &log.FatalHook{CorrelationID: GeneralConfig.CorrelationID, Path: path}
log.RegisterHook(fatalHook)
initStageName(false)
GeneralConfig.GitHubAccessTokens = ResolveAccessTokens(GeneralConfig.GitHubTokens)
},
Run: func(cmd *cobra.Command, _ []string) {
utils := newGetDefaultsUtilsUtils()
_, err := generateDefaults(utils)
if err != nil {
log.SetErrorCategory(log.ErrorConfiguration)
log.Entry().WithError(err).Fatal("failed to retrieve default configurations")
}
},
}
addDefaultsFlags(createDefaultsCmd)
return createDefaultsCmd
}
func getDefaults() ([]map[string]string, error) {
var yamlDefaults []map[string]string
for _, f := range defaultsOptions.defaultsFiles {
fc, err := defaultsOptions.openFile(f, GeneralConfig.GitHubAccessTokens)
if err != nil {
return yamlDefaults, errors.Wrapf(err, "defaults: retrieving defaults file failed: '%v'", f)
}
if err == nil {
var yamlContent string
if !defaultsOptions.useV1 {
var c config.Config
c.ReadConfig(fc)
yamlContent, err = config.GetYAML(c)
if err != nil {
return yamlDefaults, errors.Wrapf(err, "defaults: could not marshal YAML default file: '%v", f)
}
} else {
var rc config.RunConfigV1
rc.StageConfigFile = fc
rc.LoadConditionsV1()
yamlContent, err = config.GetYAML(rc.PipelineConfig)
if err != nil {
return yamlDefaults, errors.Wrapf(err, "defaults: could not marshal YAML default file: '%v", f)
}
}
yamlDefaults = append(yamlDefaults, map[string]string{"content": yamlContent, "filepath": f})
}
}
return yamlDefaults, nil
}
func generateDefaults(utils getDefaultsUtils) ([]byte, error) {
var jsonOutput []byte
yamlDefaults, err := getDefaults()
if err != nil {
return jsonOutput, err
}
if len(yamlDefaults) > 1 {
jsonOutput, err = json.Marshal(yamlDefaults)
} else {
jsonOutput, err = json.Marshal(yamlDefaults[0])
}
if err != nil {
return jsonOutput, errors.Wrapf(err, "defaults: could not embed YAML defaults into JSON")
}
if len(defaultsOptions.outputFile) > 0 {
err := utils.FileWrite(defaultsOptions.outputFile, []byte(jsonOutput), 0666)
if err != nil {
return jsonOutput, fmt.Errorf("failed to write output file %v: %w", configOptions.outputFile, err)
}
return jsonOutput, nil
}
fmt.Println(string(jsonOutput))
return jsonOutput, nil
}
func addDefaultsFlags(cmd *cobra.Command) {
cmd.Flags().StringVar(&defaultsOptions.output, "output", "yaml", "Defines the format of the configs embedded into a JSON object")
cmd.Flags().StringVar(&defaultsOptions.outputFile, "outputFile", "", "Defines the output filename")
cmd.Flags().StringArrayVar(&defaultsOptions.defaultsFiles, "defaultsFile", []string{}, "Defines the input defaults file(s)")
cmd.Flags().BoolVar(&defaultsOptions.useV1, "useV1", false, "Input files are CRD-style stage configuration")
cmd.MarkFlagRequired("defaultsFile")
}