internal/servicedeployer/variants.go (73 lines of code) (raw):

// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. package servicedeployer import ( "errors" "fmt" "os" "path/filepath" "strings" "gopkg.in/yaml.v3" ) // VariantsFile describes different variants of the service under test. type VariantsFile struct { Default string `yaml:"default"` Variants map[string]Environment } // Environment is a key-value map storing environment variables. type Environment map[string]string // ServiceVariant describes a variant of the service using Environment variables. type ServiceVariant struct { Name string Env []string // Environment variables in format of pairs: key=value } // String method returns a string representation of the service variant. func (sv *ServiceVariant) String() string { return fmt.Sprintf("ServiceVariant{Name: %s, Env: %s}", sv.Name, strings.Join(sv.Env, ",")) } func (sv *ServiceVariant) active() bool { return sv.Name != "" } // ReadVariantsFile function reads available service variants. func ReadVariantsFile(devDeployPath string) (*VariantsFile, error) { variantsYmlPath := filepath.Join(devDeployPath, "variants.yml") _, err := os.Stat(variantsYmlPath) if errors.Is(err, os.ErrNotExist) { return nil, os.ErrNotExist } if err != nil { return nil, fmt.Errorf("can't stat variants file: %w", err) } content, err := os.ReadFile(variantsYmlPath) if err != nil { return nil, fmt.Errorf("can't read variants file: %w", err) } var f VariantsFile err = yaml.Unmarshal(content, &f) if err != nil { return nil, fmt.Errorf("can't unmarshal variants file: %w", err) } return &f, nil } func useServiceVariant(devDeployPath, selected string) (ServiceVariant, error) { f, err := ReadVariantsFile(devDeployPath) if errors.Is(err, os.ErrNotExist) { return ServiceVariant{}, nil // no "variants.yml" present } else if err != nil { return ServiceVariant{}, err } if selected == "" { selected = f.Default } if f.Default == "" { return ServiceVariant{}, errors.New("default variant is undefined") } env, ok := f.Variants[selected] if !ok { return ServiceVariant{}, fmt.Errorf(`variant "%s" is missing`, selected) } return ServiceVariant{ Name: selected, Env: asEnvVarPairs(env), }, nil } func asEnvVarPairs(env Environment) []string { var pairs []string for k, v := range env { pairs = append(pairs, fmt.Sprintf("%s=%s", k, v)) } return pairs }