-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig.go
More file actions
109 lines (92 loc) · 3.05 KB
/
config.go
File metadata and controls
109 lines (92 loc) · 3.05 KB
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
package cloud
import (
"errors"
"fmt"
"io"
"os"
"github.com/UpCloudLtd/upcloud-cloud-controller-manager/internal/loadbalancer"
"go.yaml.in/yaml/v2"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
)
const (
apiUserEnv string = "UPCLOUD_API_USER"
apiPasswordEnv string = "UPCLOUD_API_PASSWORD"
)
type ConfigData struct {
ClusterDeploymentMode string `yaml:"clusterDeploymentMode"`
APICredentials Credentials `yaml:"apiCredentials"`
NodeScopeSelector LabelSelector `yaml:"nodeScopeSelector"`
ClusterName string `yaml:"clusterName"`
ClusterID string `yaml:"clusterID"`
LoadBalancerPlan string `yaml:"loadBalancerPlan"`
LoadBalancerMaxBackendMembers int `yaml:"loadBalancerMaxBackendMembers"`
nodeScopeLabelSelector labels.Selector
}
type Credentials struct {
User string `yaml:"user"`
Password string `yaml:"password"`
}
type LabelSelector struct {
MatchLabels map[string]string `yaml:"matchLabels,omitempty"`
MatchExpressions []LabelSelectorRequirement `yaml:"matchExpressions,omitempty"`
}
type LabelSelectorRequirement struct {
Key string `yaml:"key"`
Operator metav1.LabelSelectorOperator `yaml:"operator"`
Values []string `yaml:"values,omitempty"`
}
type config struct {
metav1.TypeMeta `yaml:",inline"`
metav1.ObjectMeta `yaml:"metadata,omitempty"`
Data ConfigData `yaml:"data"`
}
func newConfig(f io.Reader) (config, error) {
c := config{
TypeMeta: metav1.TypeMeta{},
ObjectMeta: metav1.ObjectMeta{},
Data: ConfigData{
ClusterDeploymentMode: "",
APICredentials: Credentials{
User: os.Getenv(apiUserEnv),
Password: os.Getenv(apiPasswordEnv),
},
NodeScopeSelector: LabelSelector{},
ClusterName: "",
ClusterID: "",
LoadBalancerPlan: loadbalancer.DefaultPlan,
nodeScopeLabelSelector: labels.Everything(),
},
}
if f == nil {
return c, nil
}
decoder := yaml.NewDecoder(f)
if err := decoder.Decode(&c); err != nil {
return c, fmt.Errorf("can't read config file: %w", err)
}
// metav1.LabelSelector doesn't have YAML tags so we need to do some type juggling here.
labelSelector, err := labelSelectorAsSelector(c.Data.NodeScopeSelector)
if err != nil {
return c, fmt.Errorf("can't parse nodeScopeSelector: %w", err)
}
c.Data.nodeScopeLabelSelector = labelSelector
if c.Data.APICredentials.User == "" || c.Data.APICredentials.Password == "" {
return c, errors.New("UpCloud user credentials not set")
}
return c, nil
}
func labelSelectorAsSelector(s LabelSelector) (labels.Selector, error) {
me := make([]metav1.LabelSelectorRequirement, len(s.MatchExpressions))
for i := range s.MatchExpressions {
me[i] = metav1.LabelSelectorRequirement{
Key: s.MatchExpressions[i].Key,
Operator: s.MatchExpressions[i].Operator,
Values: s.MatchExpressions[i].Values,
}
}
return metav1.LabelSelectorAsSelector(&metav1.LabelSelector{
MatchLabels: s.MatchLabels,
MatchExpressions: me,
})
}