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  }