1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-12 10:55:20 +02:00
sap-jenkins-library/cmd/abapEnvironmentCreateTag.go
Daniel Mieg 0a738e882c
[ABAP] Refactor steps to allow API migration (#4687)
* Initial API Manager

* Intermediate part

* Intermediate step

* Fix utils tests

* Adapt pull

* Migrate Checkout

* Refactor createTags

* Refactoring

* Setup tests for SAP_COM_0510

* Add tests

* Refactor parsing

* Add retry to clone

* refactor

* Refactor and tests

* Fix function call

* Adapt create tag tests

* Adapt tests

* Add tests

* Fix tests

* Fix test

* Fix client mock

* Add unit test comments

* Add missing parameters

* Branch not mandatory for clone

* Improve switch branch trigger

---------

Co-authored-by: tiloKo <70266685+tiloKo@users.noreply.github.com>
2023-11-28 13:26:31 +01:00

172 lines
6.0 KiB
Go

package cmd
import (
"fmt"
"strings"
"time"
"github.com/SAP/jenkins-library/pkg/abaputils"
"github.com/SAP/jenkins-library/pkg/command"
piperhttp "github.com/SAP/jenkins-library/pkg/http"
"github.com/SAP/jenkins-library/pkg/log"
"github.com/SAP/jenkins-library/pkg/telemetry"
"github.com/pkg/errors"
)
func abapEnvironmentCreateTag(config abapEnvironmentCreateTagOptions, _ *telemetry.CustomData) {
c := command.Command{}
c.Stdout(log.Writer())
c.Stderr(log.Writer())
var autils = abaputils.AbapUtils{
Exec: &c,
}
apiManager := abaputils.SoftwareComponentApiManager{
Client: &piperhttp.Client{},
PollIntervall: 5 * time.Second,
}
if err := runAbapEnvironmentCreateTag(&config, &autils, &apiManager); err != nil {
log.Entry().WithError(err).Fatal("step execution failed")
}
}
func runAbapEnvironmentCreateTag(config *abapEnvironmentCreateTagOptions, com abaputils.Communication, apiManager abaputils.SoftwareComponentApiManagerInterface) error {
connectionDetails, errorGetInfo := com.GetAbapCommunicationArrangementInfo(convertTagConfig(config), "")
if errorGetInfo != nil {
return errors.Wrap(errorGetInfo, "Parameters for the ABAP Connection not available")
}
backlog, errorPrepare := prepareBacklog(config)
if errorPrepare != nil {
return fmt.Errorf("Something failed during the tag creation: %w", errorPrepare)
}
return createTags(backlog, connectionDetails, apiManager)
}
func createTags(backlog []abaputils.CreateTagBacklog, con abaputils.ConnectionDetailsHTTP, apiManager abaputils.SoftwareComponentApiManagerInterface) (err error) {
errorOccurred := false
for _, item := range backlog {
err = createTagsForSingleItem(item, con, apiManager)
if err != nil {
errorOccurred = true
}
}
if errorOccurred {
message := "At least one tag has not been created"
log.Entry().Errorf(message)
return errors.New(message)
}
return nil
}
func createTagsForSingleItem(item abaputils.CreateTagBacklog, con abaputils.ConnectionDetailsHTTP, apiManager abaputils.SoftwareComponentApiManagerInterface) (err error) {
errorOccurred := false
for index := range item.Tags {
err = createSingleTag(item, index, con, apiManager)
if err != nil {
errorOccurred = true
}
}
if errorOccurred {
message := "At least one tag has not been created"
err = errors.New(message)
}
return err
}
func createSingleTag(item abaputils.CreateTagBacklog, index int, con abaputils.ConnectionDetailsHTTP, apiManager abaputils.SoftwareComponentApiManagerInterface) (err error) {
api, errGetAPI := apiManager.GetAPI(con, abaputils.Repository{Name: item.RepositoryName, CommitID: item.CommitID})
if errGetAPI != nil {
return errors.Wrap(errGetAPI, "Could not initialize the connection to the system")
}
createTagError := api.CreateTag(item.Tags[index])
if createTagError != nil {
return errors.Wrapf(err, "Creation of Tag failed on the ABAP system")
}
status, errorPollEntity := abaputils.PollEntity(api, apiManager.GetPollIntervall())
if errorPollEntity == nil && status == "S" {
log.Entry().Info("Created tag " + item.Tags[index].TagName + " for repository " + item.RepositoryName + " with commitID " + item.CommitID)
} else {
log.Entry().Error("NOT created: Tag " + item.Tags[index].TagName + " for repository " + item.RepositoryName + " with commitID " + item.CommitID)
err = errors.New("Creation of Tag failed on the ABAP system")
}
return err
}
func prepareBacklog(config *abapEnvironmentCreateTagOptions) (backlog []abaputils.CreateTagBacklog, err error) {
if config.Repositories != "" && config.RepositoryName != "" {
return nil, errors.New("Configuring the parameter repositories and the parameter repositoryName at the same time is not allowed")
}
if config.RepositoryName != "" && config.CommitID != "" {
backlog = append(backlog, abaputils.CreateTagBacklog{RepositoryName: config.RepositoryName, CommitID: config.CommitID})
}
if config.Repositories != "" {
descriptor, err := abaputils.ReadAddonDescriptor(config.Repositories) //config.Repositories should contain a file name
if err != nil {
return nil, err
}
for _, repo := range descriptor.Repositories {
backlogInstance := abaputils.CreateTagBacklog{RepositoryName: repo.Name, CommitID: repo.CommitID}
if config.GenerateTagForAddonComponentVersion && repo.VersionYAML != "" {
tag := abaputils.Tag{TagName: "v" + repo.VersionYAML, TagDescription: "Generated by the ABAP Environment Pipeline"}
backlogInstance.Tags = append(backlogInstance.Tags, tag)
}
backlog = append(backlog, backlogInstance)
}
if config.GenerateTagForAddonProductVersion {
if descriptor.AddonProduct != "" && descriptor.AddonVersionYAML != "" {
addonProductDash := strings.Replace(descriptor.AddonProduct, "/", "-", 2)
backlog = addTagToList(backlog, addonProductDash+"-"+descriptor.AddonVersionYAML, "Generated by the ABAP Environment Pipeline")
} else {
log.Entry().WithField("generateTagForAddonProductVersion", config.GenerateTagForAddonProductVersion).WithField("AddonProduct", descriptor.AddonProduct).WithField("AddonVersion", descriptor.AddonVersionYAML).Infof("Not all required values are provided to create an addon product version tag")
}
}
}
if config.TagName != "" {
backlog = addTagToList(backlog, config.TagName, config.TagDescription)
}
return backlog, nil
}
func addTagToList(backlog []abaputils.CreateTagBacklog, tag string, description string) []abaputils.CreateTagBacklog {
for i, item := range backlog {
tag := abaputils.Tag{TagName: tag, TagDescription: description}
backlog[i].Tags = append(item.Tags, tag)
}
return backlog
}
func convertTagConfig(config *abapEnvironmentCreateTagOptions) abaputils.AbapEnvironmentOptions {
subOptions := abaputils.AbapEnvironmentOptions{}
subOptions.CfAPIEndpoint = config.CfAPIEndpoint
subOptions.CfServiceInstance = config.CfServiceInstance
subOptions.CfServiceKeyName = config.CfServiceKeyName
subOptions.CfOrg = config.CfOrg
subOptions.CfSpace = config.CfSpace
subOptions.Host = config.Host
subOptions.Password = config.Password
subOptions.Username = config.Username
return subOptions
}