-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
reader_memory.go
99 lines (82 loc) · 2.67 KB
/
reader_memory.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
/*
Copyright 2021 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package config
import (
"github.com/pkg/errors"
"sigs.k8s.io/yaml"
clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3"
)
// MemoryReader provides a reader implementation backed by a map.
// This is to be used by the operator to place config from a secret
// and the ProviderSpec.Fetchconfig.
type MemoryReader struct {
variables map[string]string
providers []configProvider
}
var _ Reader = &MemoryReader{}
// NewMemoryReader return a new MemoryReader.
func NewMemoryReader() *MemoryReader {
return &MemoryReader{
variables: map[string]string{},
providers: []configProvider{},
}
}
// Init initialize the reader.
func (f *MemoryReader) Init(_ string) error {
data, err := yaml.Marshal(f.providers)
if err != nil {
return err
}
f.variables["providers"] = string(data)
// images is not used by the operator, but it is read by the clusterctrl
// code, so we need a correct empty "images".
data, err = yaml.Marshal(map[string]imageMeta{})
if err != nil {
return err
}
f.variables["images"] = string(data)
return nil
}
// Get gets a value for the given key.
func (f *MemoryReader) Get(key string) (string, error) {
if val, ok := f.variables[key]; ok {
return val, nil
}
return "", errors.Errorf("value for variable %q is not set", key)
}
// Set sets a value for the given key.
func (f *MemoryReader) Set(key, value string) {
f.variables[key] = value
}
// UnmarshalKey gets a value for the given key, then unmarshal it.
func (f *MemoryReader) UnmarshalKey(key string, rawval interface{}) error {
data, err := f.Get(key)
if err != nil {
return nil //nolint:nilerr // We expect to not error if the key is not present
}
return yaml.Unmarshal([]byte(data), rawval)
}
// AddProvider adds the given provider to the "providers" map entry and returns any errors.
func (f *MemoryReader) AddProvider(name string, ttype clusterctlv1.ProviderType, url string) (*MemoryReader, error) {
f.providers = append(f.providers, configProvider{
Name: name,
URL: url,
Type: ttype,
})
yaml, err := yaml.Marshal(f.providers)
if err != nil {
return f, err
}
f.variables["providers"] = string(yaml)
return f, nil
}