forked from kyma-project/kyma
-
Notifications
You must be signed in to change notification settings - Fork 0
/
plan_converter.go
126 lines (102 loc) · 3.58 KB
/
plan_converter.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
package servicecatalog
import (
"encoding/base64"
"encoding/json"
"github.com/kubernetes-incubator/service-catalog/pkg/apis/servicecatalog/v1beta1"
"github.com/kyma-project/kyma/components/ui-api-layer/internal/gqlschema"
"github.com/kyma-project/kyma/components/ui-api-layer/internal/resource"
"github.com/pkg/errors"
)
type planConverter struct{}
func (p *planConverter) ToGQL(item *v1beta1.ClusterServicePlan) (*gqlschema.ServicePlan, error) {
if item == nil {
return nil, nil
}
var externalMetadata map[string]interface{}
var err error
if item.Spec.ExternalMetadata != nil {
externalMetadata, err = resource.ExtractRawToMap("ExternalMetadata", item.Spec.ExternalMetadata.Raw)
if err != nil {
return nil, p.wrapConversionError(err, item.Name)
}
}
var instanceCreateParameterSchema *gqlschema.JSON
if item.Spec.ServiceInstanceCreateParameterSchema != nil {
unpackedSchema, err := p.unpackInstanceCreateParameterSchema(item.Spec.ServiceInstanceCreateParameterSchema.Raw)
if err != nil {
return nil, p.wrapConversionError(err, item.Name)
}
instanceCreateParameterSchema = &unpackedSchema
}
displayName := resource.ToStringPtr(externalMetadata["displayName"])
plan := gqlschema.ServicePlan{
Name: item.Name,
ExternalName: item.Spec.ExternalName,
DisplayName: displayName,
Description: item.Spec.Description,
RelatedServiceClassName: item.Spec.ClusterServiceClassRef.Name,
InstanceCreateParameterSchema: instanceCreateParameterSchema,
}
return &plan, nil
}
func (c *planConverter) ToGQLs(in []*v1beta1.ClusterServicePlan) ([]gqlschema.ServicePlan, error) {
var result []gqlschema.ServicePlan
for _, u := range in {
converted, err := c.ToGQL(u)
if err != nil {
return nil, err
}
if converted != nil {
result = append(result, *converted)
}
}
return result, nil
}
func (p *planConverter) wrapConversionError(err error, name string) error {
return errors.Wrapf(err, "while converting item %s to ServicePlan", name)
}
func (p *planConverter) unpackInstanceCreateParameterSchema(raw []byte) (gqlschema.JSON, error) {
if len(raw) == 0 {
return nil, nil
}
//TODO: Change it when fix for helm broker will be ready
encoded := p.omitQuotationMarksIfShould(raw)
if len(encoded) == 0 {
return nil, nil
}
decoded := make([]byte, base64.StdEncoding.DecodedLen(len(encoded)))
_, err := base64.StdEncoding.Decode(decoded, encoded)
if err != nil {
return p.extractInstanceCreateSchema(raw)
}
decoded = p.removeNullCharactersFromEndOfArray(decoded)
return p.extractInstanceCreateSchema(decoded)
}
// TODO: Figure out why the instanceCreateParameterSchema has quotation marks
func (p *planConverter) omitQuotationMarksIfShould(input []byte) []byte {
const quotationMarkChar byte = 34
inputLength := len(input)
var result []byte
if input[inputLength-1] != quotationMarkChar {
return input
}
result = append(result, input[1:len(input)-1]...)
return result
}
// TODO: Investigate why instanceCreateParameterSchema has null character at the end
func (p *planConverter) removeNullCharactersFromEndOfArray(input []byte) []byte {
const nullChar byte = 0
sliceEnd := len(input)
for i := sliceEnd - 1; input[i] == nullChar; i-- {
sliceEnd = i
}
return input[:sliceEnd]
}
func (p *planConverter) extractInstanceCreateSchema(raw []byte) (map[string]interface{}, error) {
extracted := make(map[string]interface{})
err := json.Unmarshal(raw, &extracted)
if err != nil {
return nil, errors.Wrap(err, "while extracting instance creation parameter schema")
}
return extracted, nil
}