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 }