-
Notifications
You must be signed in to change notification settings - Fork 586
/
productVersionHeader.go
147 lines (127 loc) · 5.26 KB
/
productVersionHeader.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package aakaas
import (
"encoding/json"
abapbuild "github.com/SAP/jenkins-library/pkg/abap/build"
"github.com/SAP/jenkins-library/pkg/abaputils"
"github.com/pkg/errors"
)
type jsonProductVersionHeader struct {
Pvh *ProductVersionHeader `json:"d"`
}
type ProductVersionHeader struct {
ProductName string
SemanticProductVersion string `json:"SemProductVersion"`
ProductVersion string
SpsLevel string
PatchLevel string
Vendor string
VendorType string
Content []ProductVersionContent `json:"-"` //for developer access
JsonContent ProductVersionContents `json:"Content"` //for json (Un)Marshaling
}
type ProductVersionContents struct {
Content []ProductVersionContent `json:"results"`
}
type ProductVersionContent struct {
ProductName string
SemanticProductVersion string `json:"SemProductVersion"`
SoftwareComponentName string `json:"ScName"`
SemanticSoftwareComponentVersion string `json:"SemScVersion"`
SoftwareComponentVersion string `json:"ScVersion"`
SpLevel string
PatchLevel string
Vendor string
VendorType string
}
func NewProductVersionHeader(addonDescriptor *abaputils.AddonDescriptor, conn *abapbuild.Connector) (*ProductVersionHeader, error) {
productVersion := new(ProductVersion)
if err := productVersion.ConstructProductversion(*addonDescriptor, *conn); err != nil {
return nil, err
}
pvh := ProductVersionHeader{
ProductName: productVersion.Name,
SemanticProductVersion: productVersion.Version,
Content: []ProductVersionContent{},
}
for _, repo := range addonDescriptor.Repositories {
componentVersion := new(ComponentVersion)
if err := componentVersion.ConstructComponentVersion(repo, *conn); err != nil {
return nil, err
}
pvc := ProductVersionContent{
ProductName: pvh.ProductName,
SemanticProductVersion: pvh.SemanticProductVersion,
SoftwareComponentName: componentVersion.Name,
SemanticSoftwareComponentVersion: componentVersion.Version,
}
pvh.Content = append(pvh.Content, pvc)
}
if len(pvh.Content) == 0 {
return nil, errors.New("addonDescriptor must contain at least one software component repository")
}
return &pvh, nil
}
func (pv *ProductVersionHeader) CheckAndResolveVersion(conn *abapbuild.Connector) error {
conn.GetToken("/odata/aas_ocs_package")
pv.JsonContent = ProductVersionContents{
Content: pv.Content,
}
requestJson, err := json.Marshal(pv)
if err != nil {
return err
}
appendum := "/odata/aas_ocs_package/ProductVersionHeaderSet"
responseBody, err := conn.Post(appendum, string(requestJson))
if err != nil {
return errors.Wrap(err, "Checking Product Modeling in AAkaaS failed")
}
var resultPv jsonProductVersionHeader
if err := json.Unmarshal(responseBody, &resultPv); err != nil {
return errors.Wrap(err, "Unexpected AAKaaS response for checking Product Modeling "+string(responseBody))
}
pv.ProductVersion = resultPv.Pvh.ProductVersion
pv.SpsLevel = resultPv.Pvh.SpsLevel
pv.PatchLevel = resultPv.Pvh.PatchLevel
for pvc_index, pvc := range pv.Content {
foundPvc := ProductVersionContent{}
for _, resultPvc := range resultPv.Pvh.JsonContent.Content {
if pvc.SoftwareComponentName == resultPvc.SoftwareComponentName && foundPvc.SoftwareComponentName == "" {
foundPvc = resultPvc
} else if pvc.SoftwareComponentName == resultPvc.SoftwareComponentName {
return errors.New("Software Component Name must be unique in the ProductVersionContent")
}
}
if foundPvc.SoftwareComponentName == "" {
return errors.New("Software Component Name not found in the ProductVersionContent")
}
pv.Content[pvc_index].PatchLevel = foundPvc.PatchLevel
pv.Content[pvc_index].SpLevel = foundPvc.SpLevel
pv.Content[pvc_index].SoftwareComponentVersion = foundPvc.SoftwareComponentVersion
}
pv.JsonContent = ProductVersionContents{}
return nil
}
func (pv *ProductVersionHeader) SyncAddonDescriptorVersionFields(addonDescriptor *abaputils.AddonDescriptor) error {
addonDescriptor.AddonVersion = pv.ProductVersion
addonDescriptor.AddonSpsLevel = pv.SpsLevel
addonDescriptor.AddonPatchLevel = pv.PatchLevel
//in NewPvh function pvh was build up 1:1 based on addonDescriptor
//in checkAndResolve pvh was synced from AAKaaS reply assuming it does not contain more content than before(if it does it is ignored)
for repo_index, repo := range addonDescriptor.Repositories {
foundPvc := ProductVersionContent{}
for _, pvc := range pv.Content {
if pvc.SoftwareComponentName == repo.Name && foundPvc.SoftwareComponentName == "" {
foundPvc = pvc
} else if pvc.SoftwareComponentName == repo.Name {
return errors.New("Software Component Name must be unique in addon descriptor(aka addon.yml)")
}
}
if foundPvc.SoftwareComponentName == "" {
return errors.New("ProductVersionContent & addon descriptor (aka addon.yml) out of sync")
}
addonDescriptor.Repositories[repo_index].PatchLevel = foundPvc.PatchLevel
addonDescriptor.Repositories[repo_index].SpLevel = foundPvc.SpLevel
addonDescriptor.Repositories[repo_index].Version = foundPvc.SoftwareComponentVersion
}
return nil
}