-
Notifications
You must be signed in to change notification settings - Fork 34
/
generator.go
89 lines (82 loc) · 2.52 KB
/
generator.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
package core
import (
"fmt"
"github.com/viant/toolbox"
"github.com/viant/toolbox/data"
"gopkg.in/yaml.v2"
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
)
//GenerateRequest converts request with provided template and call handler with meta and request data.
func GenerateRequest(name string, templates map[string]string, templateParams interface{}, handler func(meta *ResourceMeta, data map[string]interface{}) error) error {
var templateParamMap = make(map[string]interface{})
err := converter.AssignConverted(&templateParamMap, templateParams)
if err != nil {
return err
}
templateData := data.Map(templateParamMap)
var spec map[string]interface{}
if spec, err = loadTemplate(podSpec); err != nil {
return err
}
templateData["Spec"] = toolbox.AsMap(templateData.Expand(spec))
template, ok := templates[name]
if !ok {
return fmt.Errorf("failed to lookup template: %v", name)
}
templateMap, err := loadTemplate(template)
if err != nil {
return err
}
requestData := toolbox.AsMap(templateData.Expand(templateMap))
meta := &ResourceMeta{}
if err = converter.AssignConverted(meta, requestData); err != nil {
return err
}
requestData = toolbox.DeleteEmptyKeys(requestData)
return handler(meta, requestData)
}
func loadTemplate(template string) (map[string]interface{}, error) {
var result = make(map[string]interface{})
if err := yaml.Unmarshal([]byte(template), &result); err != nil {
return nil, err
}
normalized, err := toolbox.NormalizeKVPairs(result)
if err != nil {
return nil, err
}
result = toolbox.AsMap(normalized)
return result, nil
}
func buildResourceRequirements(requests, limits map[string]string) (*v1.ResourceRequirements, error) {
hasRequests := len(requests) > 0
hasLimits := len(limits) > 0
if !hasRequests && !hasLimits {
return nil, nil
}
result := &v1.ResourceRequirements{
Limits: make(map[v1.ResourceName]resource.Quantity),
Requests: make(map[v1.ResourceName]resource.Quantity),
}
if hasLimits {
if err := applyResourceList(limits, result.Limits, "limits"); err != nil {
return nil, err
}
}
if hasLimits {
if err := applyResourceList(requests, result.Requests, "requests"); err != nil {
return nil, err
}
}
return result, nil
}
func applyResourceList(values map[string]string, resourceList v1.ResourceList, listType string) error {
for k, v := range values {
qty, err := resource.ParseQuantity(v)
if err != nil {
return fmt.Errorf("unable to parse %v %v: %v, %v", listType, k, v, err)
}
resourceList[v1.ResourceName(k)] = qty
}
return nil
}