github.com/SAP/jenkins-library@v1.362.0/cmd/abapAddonAssemblyKitRegisterPackages.go (about)

     1  package cmd
     2  
     3  import (
     4  	"encoding/json"
     5  	"os"
     6  	"path/filepath"
     7  
     8  	"github.com/SAP/jenkins-library/pkg/abap/aakaas"
     9  	abapbuild "github.com/SAP/jenkins-library/pkg/abap/build"
    10  	"github.com/SAP/jenkins-library/pkg/abaputils"
    11  	"github.com/SAP/jenkins-library/pkg/command"
    12  	piperhttp "github.com/SAP/jenkins-library/pkg/http"
    13  	"github.com/SAP/jenkins-library/pkg/log"
    14  	"github.com/SAP/jenkins-library/pkg/telemetry"
    15  	"github.com/pkg/errors"
    16  )
    17  
    18  func abapAddonAssemblyKitRegisterPackages(config abapAddonAssemblyKitRegisterPackagesOptions, telemetryData *telemetry.CustomData, cpe *abapAddonAssemblyKitRegisterPackagesCommonPipelineEnvironment) {
    19  	// for command execution use Command
    20  	c := command.Command{}
    21  	// reroute command output to logging framework
    22  	c.Stdout(log.Writer())
    23  	c.Stderr(log.Writer())
    24  
    25  	client := piperhttp.Client{}
    26  
    27  	// error situations should stop execution through log.Entry().Fatal() call which leads to an os.Exit(1) in the end
    28  	err := runAbapAddonAssemblyKitRegisterPackages(&config, telemetryData, &client, cpe, reader)
    29  	if err != nil {
    30  		log.Entry().WithError(err).Fatal("step execution failed")
    31  	}
    32  }
    33  
    34  func runAbapAddonAssemblyKitRegisterPackages(config *abapAddonAssemblyKitRegisterPackagesOptions, telemetryData *telemetry.CustomData, client piperhttp.Sender,
    35  	cpe *abapAddonAssemblyKitRegisterPackagesCommonPipelineEnvironment, fileReader readFile) error {
    36  
    37  	var addonDescriptor abaputils.AddonDescriptor
    38  	if err := json.Unmarshal([]byte(config.AddonDescriptor), &addonDescriptor); err != nil {
    39  		return err
    40  	}
    41  
    42  	conn := new(abapbuild.Connector)
    43  	if err := conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client, config.AbapAddonAssemblyKitOriginHash, config.AbapAddonAssemblyKitCertificateFile, config.AbapAddonAssemblyKitCertificatePass); err != nil {
    44  		return err
    45  	}
    46  
    47  	if err := uploadSarFiles(addonDescriptor.Repositories, *conn, fileReader); err != nil {
    48  		return err
    49  	}
    50  
    51  	conn2 := new(abapbuild.Connector) // we need a second connector without the added Header
    52  	if err := conn2.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client, config.AbapAddonAssemblyKitOriginHash, config.AbapAddonAssemblyKitCertificateFile, config.AbapAddonAssemblyKitCertificatePass); err != nil {
    53  		return err
    54  	}
    55  
    56  	var err error
    57  	addonDescriptor.Repositories, err = registerPackages(addonDescriptor.Repositories, *conn2)
    58  	if err != nil {
    59  		return err
    60  	}
    61  
    62  	log.Entry().Info("Writing package status to CommonPipelineEnvironment")
    63  	cpe.abap.addonDescriptor = addonDescriptor.AsJSONstring()
    64  
    65  	return nil
    66  }
    67  
    68  func uploadSarFiles(repos []abaputils.Repository, conn abapbuild.Connector, readFileFunc readFile) error {
    69  	for i := range repos {
    70  		if repos[i].Status == string(aakaas.PackageStatusPlanned) {
    71  			if repos[i].SarXMLFilePath == "" {
    72  				return errors.New("Parameter missing. Please provide the path to the SAR file")
    73  			}
    74  			filename := filepath.Base(repos[i].SarXMLFilePath)
    75  			log.Entry().Infof("Trying to read file %s", repos[i].SarXMLFilePath)
    76  			sarFile, err := readFileFunc(repos[i].SarXMLFilePath)
    77  			if err != nil {
    78  				return err
    79  			}
    80  			log.Entry().Infof("... %d bytes read", len(sarFile))
    81  			if len(sarFile) == 0 {
    82  				return errors.New("File has no content - 0 bytes")
    83  			}
    84  			log.Entry().Infof("Upload SAR file %s in chunks", filename)
    85  			err = conn.UploadSarFileInChunks("/odata/aas_file_upload", filename, sarFile)
    86  			if err != nil {
    87  				return err
    88  			}
    89  			log.Entry().Info("...done")
    90  		} else {
    91  			log.Entry().Infof("Package %s has status %s, cannot upload the SAR file of this package", repos[i].PackageName, repos[i].Status)
    92  		}
    93  	}
    94  	return nil
    95  }
    96  
    97  // for moocking
    98  type readFile func(path string) ([]byte, error)
    99  
   100  func reader(path string) ([]byte, error) {
   101  	return os.ReadFile(path)
   102  }
   103  
   104  func registerPackages(repos []abaputils.Repository, conn abapbuild.Connector) ([]abaputils.Repository, error) {
   105  	for i := range repos {
   106  		var pack aakaas.Package
   107  		pack.InitPackage(repos[i], conn)
   108  		if repos[i].Status == string(aakaas.PackageStatusPlanned) {
   109  			log.Entry().Infof("Trying to Register Package %s", pack.PackageName)
   110  			err := pack.Register()
   111  			if err != nil {
   112  				return repos, err
   113  			}
   114  			log.Entry().Info("...done, take over new status")
   115  			pack.ChangeStatus(&repos[i])
   116  			log.Entry().Info("...done")
   117  		} else {
   118  			log.Entry().Infof("Package %s has status %s, cannot register this package", pack.PackageName, pack.Status)
   119  		}
   120  	}
   121  	return repos, nil
   122  }