github.com/jaylevin/jenkins-library@v1.230.4/cmd/abapAddonAssemblyKitCheckPV.go (about) 1 package cmd 2 3 import ( 4 "encoding/json" 5 "net/url" 6 7 "github.com/SAP/jenkins-library/pkg/abap/aakaas" 8 abapbuild "github.com/SAP/jenkins-library/pkg/abap/build" 9 "github.com/SAP/jenkins-library/pkg/abaputils" 10 "github.com/SAP/jenkins-library/pkg/log" 11 "github.com/SAP/jenkins-library/pkg/piperutils" 12 "github.com/SAP/jenkins-library/pkg/telemetry" 13 "github.com/pkg/errors" 14 ) 15 16 func abapAddonAssemblyKitCheckPV(config abapAddonAssemblyKitCheckPVOptions, telemetryData *telemetry.CustomData, cpe *abapAddonAssemblyKitCheckPVCommonPipelineEnvironment) { 17 utils := aakaas.NewAakBundle() 18 // error situations should stop execution through log.Entry().Fatal() call which leads to an os.Exit(1) in the end 19 if err := runAbapAddonAssemblyKitCheckPV(&config, telemetryData, &utils, cpe); err != nil { 20 log.Entry().WithError(err).Fatal("step execution failed") 21 } 22 } 23 func runAbapAddonAssemblyKitCheckPV(config *abapAddonAssemblyKitCheckPVOptions, telemetryData *telemetry.CustomData, utils *aakaas.AakUtils, cpe *abapAddonAssemblyKitCheckPVCommonPipelineEnvironment) error { 24 25 conn := new(abapbuild.Connector) 26 if err := conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, *utils); err != nil { 27 return err 28 } 29 30 log.Entry().Infof("Reading Product Version Information from addonDescriptor (aka addon.yml) file: %s", config.AddonDescriptorFileName) 31 addonDescriptor, err := (*utils).ReadAddonDescriptor(config.AddonDescriptorFileName) 32 if err != nil { 33 return err 34 } 35 36 pv := new(productVersion).init(addonDescriptor, *conn) 37 err = pv.validateAndResolveVersionFields() 38 if err != nil { 39 return err 40 } 41 pv.transferVersionFields(&addonDescriptor) 42 43 // now Product Version fields are valid, but maybe Component Versions (Repositories) were checked before, so copy that part from CPE 44 // we don't care for errors 45 // scenario 1: config.AddonDescriptor is empty since checkPV is the first step in the pipeline, then the empty result is fine anyway 46 // scenario 2: for some reason config.AddonDescriptor is corrupt - then we insert the valid data but delete the repositories which will ensure issue is found later on 47 addonDescriptorCPE, _ := abaputils.ConstructAddonDescriptorFromJSON([]byte(config.AddonDescriptor)) 48 if len(addonDescriptorCPE.Repositories) == 0 { 49 log.Entry().Info("No Software Component Information present yet in the addonDescriptor of CommonPipelineEnvironment") 50 } else { 51 log.Entry().Infof("Information for %v Software Component Repositories taken from addonDescriptor of CommonPipelineEnvironment", len(addonDescriptorCPE.Repositories)) 52 } 53 addonDescriptor.SetRepositories(addonDescriptorCPE.Repositories) 54 cpe.abap.addonDescriptor = string(addonDescriptor.AsJSON()) 55 log.Entry().Info("Wrote addonDescriptor to CommonPipelineEnvironment") 56 57 var filesToPublish []piperutils.Path 58 log.Entry().Infof("Add %s to be published", config.AddonDescriptorFileName) 59 filesToPublish = append(filesToPublish, piperutils.Path{Target: config.AddonDescriptorFileName, Name: "AddonDescriptor", Mandatory: true}) 60 log.Entry().Infof("Publsihing %v files", len(filesToPublish)) 61 piperutils.PersistReportsAndLinks("abapAddonAssemblyKitCheckPV", "", filesToPublish, nil) 62 63 return nil 64 } 65 66 func (p *productVersion) init(desc abaputils.AddonDescriptor, conn abapbuild.Connector) *productVersion { 67 p.Connector = conn 68 p.Name = desc.AddonProduct 69 p.VersionYAML = desc.AddonVersionYAML 70 71 return p 72 } 73 74 func (p *productVersion) transferVersionFields(initialAddonDescriptor *abaputils.AddonDescriptor) { 75 initialAddonDescriptor.AddonVersion = p.Version 76 initialAddonDescriptor.AddonSpsLevel = p.SpsLevel 77 initialAddonDescriptor.AddonPatchLevel = p.PatchLevel 78 } 79 80 func (p *productVersion) validateAndResolveVersionFields() error { 81 log.Entry().Infof("Validate product '%s' version '%s' and resolve version", p.Name, p.VersionYAML) 82 appendum := "/odata/aas_ocs_package/ValidateProductVersion?Name='" + url.QueryEscape(p.Name) + "'&Version='" + url.QueryEscape(p.VersionYAML) + "'" 83 body, err := p.Connector.Get(appendum) 84 if err != nil { 85 return err 86 } 87 var jPV jsonProductVersion 88 if err := json.Unmarshal(body, &jPV); err != nil { 89 return errors.Wrap(err, "Unexpected AAKaaS response for Validate Product Version: "+string(body)) 90 } 91 p.Name = jPV.ProductVersion.Name 92 p.Version = jPV.ProductVersion.Version 93 p.SpsLevel = jPV.ProductVersion.SpsLevel 94 p.PatchLevel = jPV.ProductVersion.PatchLevel 95 log.Entry().Infof("Resolved version %s, spslevel %s, patchlevel %s", p.Version, p.SpsLevel, p.PatchLevel) 96 return nil 97 } 98 99 type jsonProductVersion struct { 100 ProductVersion *productVersion `json:"d"` 101 } 102 103 type productVersion struct { 104 abapbuild.Connector 105 Name string `json:"Name"` 106 VersionYAML string 107 Version string `json:"Version"` 108 SpsLevel string `json:"SpsLevel"` 109 PatchLevel string `json:"PatchLevel"` 110 TargetVectorID string 111 }