1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-12 10:55:20 +02:00
sap-jenkins-library/cmd/getConfig.go
Oliver Nocon a46b57e6b4
Persisted pipeline environment for golang library (#1091)
* Use commonPipelineEnvironment in go binary

* Update groovy part incl. tests

* Rework structure and naming

* Support influx resources in steps

* Update tests and some cleanups

* Add correct defer handling

* Address PR feedback

* Fix test

* Update resources.go

Co-authored-by: Sven Merk <33895725+nevskrem@users.noreply.github.com>
2020-01-15 12:16:25 +01:00

132 lines
4.0 KiB
Go

package cmd
import (
"fmt"
"io"
"os"
"github.com/SAP/jenkins-library/pkg/config"
"github.com/SAP/jenkins-library/pkg/piperutils"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
type configCommandOptions struct {
output string //output format, so far only JSON
parametersJSON string //parameters to be considered in JSON format
stepMetadata string //metadata to be considered, can be filePath or ENV containing JSON in format 'ENV:MY_ENV_VAR'
stepName string
contextConfig bool
openFile func(s string) (io.ReadCloser, error)
}
var configOptions configCommandOptions
// ConfigCommand is the entry command for loading the configuration of a pipeline step
func ConfigCommand() *cobra.Command {
configOptions.openFile = config.OpenPiperFile
var createConfigCmd = &cobra.Command{
Use: "getConfig",
Short: "Loads the project 'Piper' configuration respecting defaults and parameters.",
RunE: func(cmd *cobra.Command, _ []string) error {
return generateConfig()
},
}
addConfigFlags(createConfigCmd)
return createConfigCmd
}
func generateConfig() error {
var myConfig config.Config
var stepConfig config.StepConfig
var metadata config.StepData
metadataFile, err := configOptions.openFile(configOptions.stepMetadata)
if err != nil {
return errors.Wrap(err, "metadata: open failed")
}
err = metadata.ReadPipelineStepData(metadataFile)
if err != nil {
return errors.Wrap(err, "metadata: read failed")
}
resourceParams := metadata.GetResourceParameters(GeneralConfig.EnvRootPath, "commonPipelineEnvironment")
var customConfig io.ReadCloser
{
exists, e := piperutils.FileExists(GeneralConfig.CustomConfig)
if e != nil {
return e
}
if exists {
customConfig, err = configOptions.openFile(GeneralConfig.CustomConfig)
if err != nil {
return errors.Wrap(err, "config: open failed")
}
}
}
defaultConfig, paramFilter, err := defaultsAndFilters(&metadata, metadata.Metadata.Name)
if err != nil {
return errors.Wrap(err, "defaults: retrieving step defaults failed")
}
for _, f := range GeneralConfig.DefaultConfig {
fc, err := configOptions.openFile(f)
// only create error for non-default values
if err != nil && f != ".pipeline/defaults.yaml" {
return errors.Wrapf(err, "config: getting defaults failed: '%v'", f)
}
defaultConfig = append(defaultConfig, fc)
}
var flags map[string]interface{}
params := []config.StepParameters{}
if !configOptions.contextConfig {
params = metadata.Spec.Inputs.Parameters
}
stepConfig, err = myConfig.GetStepConfig(flags, GeneralConfig.ParametersJSON, customConfig, defaultConfig, paramFilter, params, resourceParams, GeneralConfig.StageName, metadata.Metadata.Name)
if err != nil {
return errors.Wrap(err, "getting step config failed")
}
myConfigJSON, _ := config.GetJSON(stepConfig.Config)
fmt.Println(myConfigJSON)
return nil
}
func addConfigFlags(cmd *cobra.Command) {
//ToDo: support more output options, like https://kubernetes.io/docs/reference/kubectl/overview/#formatting-output
cmd.Flags().StringVar(&configOptions.output, "output", "json", "Defines the output format")
cmd.Flags().StringVar(&configOptions.parametersJSON, "parametersJSON", os.Getenv("PIPER_parametersJSON"), "Parameters to be considered in JSON format")
cmd.Flags().StringVar(&configOptions.stepMetadata, "stepMetadata", "", "Step metadata, passed as path to yaml")
cmd.Flags().BoolVar(&configOptions.contextConfig, "contextConfig", false, "Defines if step context configuration should be loaded instead of step config")
cmd.MarkFlagRequired("stepMetadata")
}
func defaultsAndFilters(metadata *config.StepData, stepName string) ([]io.ReadCloser, config.StepFilters, error) {
if configOptions.contextConfig {
defaults, err := metadata.GetContextDefaults(stepName)
if err != nil {
return nil, config.StepFilters{}, errors.Wrap(err, "metadata: getting context defaults failed")
}
return []io.ReadCloser{defaults}, metadata.GetContextParameterFilters(), nil
}
//ToDo: retrieve default values from metadata
return nil, metadata.GetParameterFilters(), nil
}