github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/abap/aakaas/package.go (about) 1 package aakaas 2 3 import ( 4 "encoding/json" 5 "net/url" 6 7 abapbuild "github.com/SAP/jenkins-library/pkg/abap/build" 8 "github.com/SAP/jenkins-library/pkg/abaputils" 9 "github.com/SAP/jenkins-library/pkg/log" 10 "github.com/pkg/errors" 11 ) 12 13 // PackageStatus : Status of an ABAP delivery package 14 type PackageStatus string 15 16 const ( 17 // PackageStatusPlanned : Package is Planned 18 PackageStatusPlanned PackageStatus = "P" 19 // PackageStatusLocked : Package is Locked 20 PackageStatusLocked PackageStatus = "L" 21 // PackageStatusReleased : Package is Released 22 PackageStatusReleased PackageStatus = "R" 23 // PackageStatusCreationTriggered : Package was Released but Release procedure is not yet finished 24 PackageStatusCreationTriggered PackageStatus = "C" 25 ) 26 27 type jsonPackageDeterminePackageForScv struct { 28 DeterminePackage struct { 29 Package *Package `json:"DeterminePackageForScv"` 30 } `json:"d"` 31 } 32 33 type jsonPackage struct { 34 Package *Package `json:"d"` 35 } 36 37 // Package : ABAP delivery package 38 type Package struct { 39 abapbuild.Connector 40 ComponentName string 41 VersionYAML string 42 PackageName string `json:"Name"` 43 Type string `json:"Type"` 44 PredecessorCommitID string `json:"PredecessorCommitId"` 45 CommitID string `json:"CommitId"` 46 Status PackageStatus `json:"Status"` 47 Namespace string `json:"Namespace"` 48 } 49 50 // PackageWithRepository : pack'n repo 51 type PackageWithRepository struct { 52 Package Package 53 Repo abaputils.Repository 54 } 55 56 // InitPackage : initialize package attributes from the repository 57 func (p *Package) InitPackage(repo abaputils.Repository, conn abapbuild.Connector) { 58 p.Connector = conn 59 p.ComponentName = repo.Name 60 p.VersionYAML = repo.VersionYAML 61 p.PackageName = repo.PackageName 62 p.Status = PackageStatus(repo.Status) 63 } 64 65 // CopyFieldsToRepo : copy package attributes to the repository 66 func (p *Package) CopyFieldsToRepo(initialRepo *abaputils.Repository) { 67 initialRepo.PackageName = p.PackageName 68 initialRepo.PackageType = p.Type 69 initialRepo.PredecessorCommitID = p.PredecessorCommitID 70 initialRepo.Status = string(p.Status) 71 initialRepo.Namespace = p.Namespace 72 } 73 74 // ReserveNext : reserve next delivery package for this software component version 75 func (p *Package) ReserveNext() error { 76 if p.ComponentName == "" || p.VersionYAML == "" { 77 return errors.New("Parameters missing. Please provide the name and version of the component") 78 } 79 log.Entry().Infof("... determining package name and attributes for software component %s version %s", p.ComponentName, p.VersionYAML) 80 p.Connector.GetToken("/odata/aas_ocs_package") 81 appendum := "/odata/aas_ocs_package/DeterminePackageForScv?Name='" + url.QueryEscape(p.ComponentName) + "'&Version='" + url.QueryEscape(p.VersionYAML) + "'" 82 body, err := p.Connector.Post(appendum, "") 83 if err != nil { 84 return err 85 } 86 var jPck jsonPackageDeterminePackageForScv 87 if err := json.Unmarshal(body, &jPck); err != nil { 88 return errors.Wrap(err, "Unexpected AAKaaS response for reserve package: "+string(body)) 89 } 90 p.PackageName = jPck.DeterminePackage.Package.PackageName 91 p.Type = jPck.DeterminePackage.Package.Type 92 p.PredecessorCommitID = jPck.DeterminePackage.Package.PredecessorCommitID 93 p.Status = jPck.DeterminePackage.Package.Status 94 p.setNamespace(jPck.DeterminePackage.Package.Namespace) 95 p.CommitID = jPck.DeterminePackage.Package.CommitID 96 if p.Status == PackageStatusReleased { 97 log.Entry().Infof(" => Reservation of package %s not needed as status is already 'released'", p.PackageName) 98 } else { 99 log.Entry().Infof(" => Reservation of package %s started", p.PackageName) 100 } 101 return nil 102 } 103 104 // GetPackageAndNamespace : retrieve attributes of the package from AAKaaS 105 func (p *Package) GetPackageAndNamespace() error { 106 appendum := "/odata/aas_ocs_package/OcsPackageSet('" + url.QueryEscape(p.PackageName) + "')" 107 body, err := p.Connector.Get(appendum) 108 if err != nil { 109 return err 110 } 111 112 var jPck jsonPackage 113 if err := json.Unmarshal(body, &jPck); err != nil { 114 return errors.Wrap(err, "Unexpected AAKaaS response for check of package status: "+string(body)) 115 } 116 117 p.Status = jPck.Package.Status 118 p.setNamespace(jPck.Package.Namespace) 119 120 return nil 121 } 122 123 // ChangeStatus : change status of the package in the repository 124 func (p *Package) ChangeStatus(initialRepo *abaputils.Repository) { 125 initialRepo.Status = string(p.Status) 126 } 127 128 // Register : register package in AAKaaS 129 func (p *Package) Register() error { 130 if p.PackageName == "" { 131 return errors.New("Parameter missing. Please provide the name of the package which should be registered") 132 } 133 log.Entry().Infof("Register package %s", p.PackageName) 134 p.Connector.GetToken("/odata/aas_ocs_package") 135 appendum := "/odata/aas_ocs_package/RegisterPackage?Name='" + url.QueryEscape(p.PackageName) + "'" 136 body, err := p.Connector.Post(appendum, "") 137 if err != nil { 138 return err 139 } 140 141 var jPck jsonPackage 142 if err := json.Unmarshal(body, &jPck); err != nil { 143 return errors.Wrap(err, "Unexpected AAKaaS response for register package: "+string(body)) 144 } 145 p.Status = jPck.Package.Status 146 log.Entry().Infof("Package status %s", p.Status) 147 return nil 148 } 149 150 // Release : release package in AAKaaS 151 func (p *Package) Release() error { 152 var body []byte 153 var err error 154 log.Entry().Infof("Release package %s", p.PackageName) 155 p.Connector.GetToken("/odata/aas_ocs_package") 156 appendum := "/odata/aas_ocs_package/ReleasePackage?Name='" + url.QueryEscape(p.PackageName) + "'" 157 body, err = p.Connector.Post(appendum, "") 158 if err != nil { 159 return err 160 } 161 var jPck jsonPackage 162 if err := json.Unmarshal(body, &jPck); err != nil { 163 return errors.Wrap(err, "Unexpected AAKaaS response for release package: "+string(body)) 164 } 165 p.Status = jPck.Package.Status 166 return nil 167 } 168 169 // setNamespace 170 func (p *Package) setNamespace(namespace string) { 171 if namespace == "//" { 172 p.Namespace = "" 173 } else { 174 p.Namespace = namespace 175 } 176 }