1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-16 11:09:33 +02:00
sap-jenkins-library/pkg/abaputils/addonDescriptor.go

128 lines
3.8 KiB
Go

package abaputils
import (
"encoding/json"
"fmt"
"io/ioutil"
"path/filepath"
"reflect"
"github.com/ghodss/yaml"
"github.com/pkg/errors"
)
// AddonDescriptor contains fields about the addonProduct
type AddonDescriptor struct {
AddonProduct string `json:"addonProduct"`
AddonVersionYAML string `json:"addonVersion"`
AddonVersion string `json:"addonVersionAAK"`
AddonUniqueID string `json:"addonUniqueID"`
CustomerID interface{} `json:"customerID"`
AddonSpsLevel string
AddonPatchLevel string
TargetVectorID string
Repositories []Repository `json:"repositories"`
}
// Repository contains fields for the repository/component version
type Repository struct {
Name string `json:"name"`
Tag string `json:"tag"`
Branch string `json:"branch"`
VersionYAML string `json:"version"`
Version string `json:"versionAAK"`
PackageName string
PackageType string
SpLevel string
PatchLevel string
PredecessorCommitID string
Status string
Namespace string
SarXMLFilePath string
}
// ReadAddonDescriptorType is the type for ReadAddonDescriptor for mocking
type ReadAddonDescriptorType func(FileName string) (AddonDescriptor, error)
// ReadAddonDescriptor parses AddonDescriptor YAML file
func ReadAddonDescriptor(FileName string) (AddonDescriptor, error) {
var addonDescriptor AddonDescriptor
err := addonDescriptor.initFromYmlFile(FileName)
return addonDescriptor, err
}
// ConstructAddonDescriptorFromJSON : Create new AddonDescriptor filled with data from JSON
func ConstructAddonDescriptorFromJSON(JSON []byte) (AddonDescriptor, error) {
var addonDescriptor AddonDescriptor
err := addonDescriptor.initFromJSON(JSON)
return addonDescriptor, err
}
// initFromYmlFile : Reads from file
func (me *AddonDescriptor) initFromYmlFile(FileName string) error {
filelocation, err := filepath.Glob(FileName)
if err != nil || len(filelocation) != 1 {
return errors.New(fmt.Sprintf("Could not find %v", FileName))
}
filename, err := filepath.Abs(filelocation[0])
if err != nil {
return errors.New(fmt.Sprintf("Could not get path of %v", FileName))
}
var yamlBytes []byte
yamlBytes, err = ioutil.ReadFile(filename)
if err != nil {
return errors.New(fmt.Sprintf("Could not read %v", FileName))
}
var jsonBytes []byte
jsonBytes, err = yaml.YAMLToJSON(yamlBytes)
if err != nil {
return errors.New(fmt.Sprintf("Could not parse %v", FileName))
}
err = me.initFromJSON(jsonBytes)
if err != nil {
return errors.New(fmt.Sprintf("Could not unmarshal %v", FileName))
}
return nil
}
// CheckAddonDescriptorForRepositories checks AddonDescriptor struct if it contains any repositories. If not it will return an error
func CheckAddonDescriptorForRepositories(addonDescriptor AddonDescriptor) error {
//checking if parsing went wrong
if len(addonDescriptor.Repositories) == 0 {
return errors.New(fmt.Sprintf("AddonDescriptor doesn't contain any repositories"))
}
//
emptyRepositoryCounter := 0
for counter, repo := range addonDescriptor.Repositories {
if reflect.DeepEqual(Repository{}, repo) {
emptyRepositoryCounter++
}
if counter+1 == len(addonDescriptor.Repositories) && emptyRepositoryCounter == len(addonDescriptor.Repositories) {
return errors.New(fmt.Sprintf("AddonDescriptor doesn't contain any repositories"))
}
}
return nil
}
// initFromJSON : Init from json
func (me *AddonDescriptor) initFromJSON(JSON []byte) error {
return json.Unmarshal(JSON, me)
}
// AsJSON : dito
func (me *AddonDescriptor) AsJSON() []byte {
//hopefully no errors should happen here or they are covered by the users unit tests
jsonBytes, _ := json.Marshal(me)
return jsonBytes
}
// SetRepositories : dito
func (me *AddonDescriptor) SetRepositories(Repositories []Repository) {
me.Repositories = Repositories
}