1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-14 11:03:09 +02:00
sap-jenkins-library/pkg/transportrequest/rfc/upload.go
Roland Stengel e2fa05587d
RFC Upload GO (#2903)
* RFC Upload GO
- yaml review
- add cpe
- harmonize with solman
2021-07-01 13:11:21 +02:00

159 lines
5.0 KiB
Go

package rfc
import (
"fmt"
"github.com/SAP/jenkins-library/pkg/command"
"github.com/SAP/jenkins-library/pkg/config/validation"
"github.com/SAP/jenkins-library/pkg/log"
"github.com/pkg/errors"
"strconv"
)
const (
eq = "="
)
// Exec Everything we need for calling an executable
type Exec interface {
command.ExecRunner
GetExitCode() int
}
// Upload ...
type Upload interface {
Perform(Exec) error
WithConnection(Connection)
WithConfiguration(UploadConfig)
WithApplication(Application)
WithTransportRequestID(string)
WithApplicationURL(string)
}
// Connection Everything we need for connecting to the ABAP system
type Connection struct {
// The endpoint in for form <protocol>://<host>:<port>, no path
Endpoint string
// The ABAP client, like e.g. "001"
Client string
// The ABAP instance, like e.g. "DEV", "QA"
Instance string
User string
Password string
}
// Application Application specific properties
type Application struct {
Name string
Description string
AbapPackage string
}
// UploadConfig additional configuration properties
type UploadConfig struct {
AcceptUnixStyleEndOfLine bool
CodePage string
FailUploadOnWarning bool
Verbose bool
}
// UploadAction Collects all the properties we need for the deployment
type UploadAction struct {
Connection Connection
Application Application
Configuration UploadConfig
TransportRequestID string
ApplicationURL string
}
// WithApplicationURL The location of the deployable
func (action *UploadAction) WithApplicationURL(z string) {
action.ApplicationURL = z
}
// WithTransportRequestID The transport request ID for the upload
func (action *UploadAction) WithTransportRequestID(t string) {
action.TransportRequestID = t
}
// WithApplication Everything we need to know about the application
func (action *UploadAction) WithApplication(a Application) {
action.Application = a
}
// WithConfiguration Everything we need to know in order to perform the upload
func (action *UploadAction) WithConfiguration(c UploadConfig) {
action.Configuration = c
}
// WithConnection Everything we need to know about the connection
func (action *UploadAction) WithConnection(c Connection) {
action.Connection = c
}
// Perform Performs the upload
func (action *UploadAction) Perform(command Exec) error {
log.Entry().Infof("Deploying artifact '%s' to '%s', client: '%s', instance: '%s'.",
action.ApplicationURL, action.Connection.Endpoint, action.Connection.Client, action.Connection.Instance,
)
parametersWithMissingValues, err := validation.FindEmptyStringsInConfigStruct(*action)
if err != nil {
return fmt.Errorf("invalid configuration parameters detected. SOLMAN upload parameter may be missing : %w", err)
}
if len(parametersWithMissingValues) != 0 {
return fmt.Errorf("cannot perform artifact upload. The following parameters are not available %s", parametersWithMissingValues)
}
command.SetEnv([]string{
"ABAP_DEVELOPMENT_SERVER" + eq + action.Connection.Endpoint,
"ABAP_DEVELOPMENT_USER" + eq + action.Connection.User,
"ABAP_DEVELOPMENT_PASSWORD" + eq + action.Connection.Password,
"ABAP_DEVELOPMENT_INSTANCE" + eq + action.Connection.Instance,
"ABAP_DEVELOPMENT_CLIENT" + eq + action.Connection.Client,
"ABAP_APPLICATION_NAME" + eq + action.Application.Name,
"ABAP_APPLICATION_DESC" + eq + action.Application.Description,
"ABAP_PACKAGE" + eq + action.Application.AbapPackage,
"ZIP_FILE_URL" + eq + action.ApplicationURL,
"CODE_PAGE" + eq + action.Configuration.CodePage,
"ABAP_ACCEPT_UNIX_STYLE_EOL" + eq + toAbapBool(action.Configuration.AcceptUnixStyleEndOfLine),
"FAIL_UPLOAD_ON_WARNING" + eq + strconv.FormatBool(action.Configuration.FailUploadOnWarning),
"VERBOSE" + eq + strconv.FormatBool(action.Configuration.Verbose),
})
err = command.RunExecutable("cts", fmt.Sprintf("uploadToABAP:%s", action.TransportRequestID))
exitCode := command.GetExitCode()
if exitCode != 0 {
message := fmt.Sprintf("upload command returned with exit code '%d'", exitCode)
if err != nil {
// Using the wrapping here is to some extend an abuse, since it is not really
// error chaining (the other error is not necessaryly a "predecessor" of this one).
// But it is a pragmatic approach for not loosing information for trouble shooting. There
// is no possibility to have something like suppressed errors.
err = errors.Wrap(err, message)
} else {
err = errors.New(message)
}
}
if err == nil {
log.Entry().Infof("Deploying artifact '%s' to '%s', client: '%s', instance: '%s' succeeded.",
action.ApplicationURL, action.Connection.Endpoint, action.Connection.Client, action.Connection.Instance,
)
} else {
log.Entry().Warnf("Deploying artifact '%s' to '%s', client: '%s', instance: '%s' failed.",
action.ApplicationURL, action.Connection.Endpoint, action.Connection.Client, action.Connection.Instance,
)
}
return errors.Wrap(err, "cannot upload artifact")
}
func toAbapBool(b bool) string {
abapBool := "-"
if b {
abapBool = "X"
}
return abapBool
}