forked from rancher/fleet
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsecret.go
More file actions
134 lines (114 loc) · 3.7 KB
/
secret.go
File metadata and controls
134 lines (114 loc) · 3.7 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
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
package ocistorage
import (
"context"
"fmt"
"strconv"
corev1 "k8s.io/api/core/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/rancher/fleet/internal/config"
fleet "github.com/rancher/fleet/pkg/apis/fleet.cattle.io/v1alpha1"
)
const (
OCISecretUsername = "username"
OCISecretPassword = "password"
OCISecretAgentUsername = "agentUsername"
OCISecretAgentPassword = "agentPassword"
OCISecretReference = "reference"
OCISecretBasicHTTP = "basicHTTP"
OCISecretInsecureSkipTLS = "insecureSkipTLS"
OCISecretInsecure = "insecure" // legacy alias
OCISecretCABundle = "cacerts"
)
// ReadOptsFromSecret reads the secret identified by the given NamespacedName and
// returns an OCIOpts structure filled with the information obtained from that secret.
func ReadOptsFromSecret(ctx context.Context, c client.Reader, ns client.ObjectKey) (OCIOpts, error) {
// if no secret was specified, fallback to the default one
if ns.Name == "" {
ns.Name = config.DefaultOCIStorageSecretName
}
opts := OCIOpts{}
var secret corev1.Secret
err := c.Get(ctx, ns, &secret)
if err != nil {
return OCIOpts{}, err
}
if secret.Type != fleet.SecretTypeOCIStorage {
return OCIOpts{}, fmt.Errorf("unexpected secret type: got %q, want %q", secret.Type, fleet.SecretTypeOCIStorage)
}
// Fill the values from the secret.
// Only Reference is strictly required.
opts.Reference, err = getStringValueFromSecret(secret.Data, OCISecretReference, true)
if err != nil {
return OCIOpts{}, err
}
opts.Username, err = getStringValueFromSecret(secret.Data, OCISecretUsername, false)
if err != nil {
return OCIOpts{}, err
}
opts.Password, err = getStringValueFromSecret(secret.Data, OCISecretPassword, false)
if err != nil {
return OCIOpts{}, err
}
opts.AgentUsername, err = getStringValueFromSecret(secret.Data, OCISecretAgentUsername, false)
if err != nil {
return OCIOpts{}, err
}
opts.AgentPassword, err = getStringValueFromSecret(secret.Data, OCISecretAgentPassword, false)
if err != nil {
return OCIOpts{}, err
}
opts.BasicHTTP, err = getBoolValueFromSecret(secret.Data, OCISecretBasicHTTP, false)
if err != nil {
return OCIOpts{}, err
}
opts.InsecureSkipTLS, err = getBoolValueFromSecretWithFallback(
secret.Data,
false,
OCISecretInsecureSkipTLS,
OCISecretInsecure,
)
if err != nil {
return OCIOpts{}, err
}
// Read optional CA bundle
opts.CABundle = secret.Data[OCISecretCABundle]
return opts, nil
}
func getStringValueFromSecret(data map[string][]byte, key string, required bool) (string, error) {
value, ok := data[key]
if !ok {
if !required {
return "", nil
}
return "", fmt.Errorf("key %q not found in secret", key)
}
return string(value), nil
}
func getBoolValueFromSecret(data map[string][]byte, key string, required bool) (bool, error) {
value, ok := data[key]
if !ok {
if !required {
return false, nil
}
return false, fmt.Errorf("key %q not found in secret", key)
}
valueStr := string(value)
boolValue, err := strconv.ParseBool(valueStr)
if err != nil {
return false, fmt.Errorf("failed to parse %q as bool: %w", valueStr, err)
}
return boolValue, nil
}
// getBoolValueFromSecretWithFallback extracts a boolean value from data, using keys in the provided order of priority, and returns the first found value, if any.
// If no value is found, the function returns false, with an error if the value was required.
func getBoolValueFromSecretWithFallback(data map[string][]byte, required bool, keys ...string) (bool, error) {
for _, key := range keys {
if _, ok := data[key]; ok {
return getBoolValueFromSecret(data, key, true)
}
}
if !required {
return false, nil
}
return false, fmt.Errorf("key %q not found in secret", keys[0])
}