/
rookceph.go
92 lines (75 loc) · 2.57 KB
/
rookceph.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
package manila
import (
"context"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"sigs.k8s.io/controller-runtime/pkg/client"
openstackv1beta1 "github.com/ianunruh/openstack-operator/api/v1beta1"
"github.com/ianunruh/openstack-operator/pkg/rookceph"
)
type cephClientKey struct {
Name, Namespace string
}
func RookCephResources(instance *openstackv1beta1.Manila) []*unstructured.Unstructured {
backends := filterRookCephBackends(instance.Spec.Backends)
clients := make(map[cephClientKey]bool)
for _, backend := range backends {
cephSpec := backend.Ceph
key := cephClientKey{cephSpec.ClientName, cephSpec.Rook.Namespace}
clients[key] = true
}
var resources []*unstructured.Unstructured
for client := range clients {
resources = append(resources, rookceph.Client(client.Namespace, rookceph.ClientOptions{
Name: client.Name,
Caps: map[string]string{
"mgr": "allow rw",
// TODO need to reduce this
"mon": "allow *",
"osd": "allow rw",
},
}))
}
return resources
}
func RookCephSecrets(ctx context.Context, c client.Client, instance *openstackv1beta1.Manila) ([]*corev1.Secret, error) {
backends := filterRookCephBackends(instance.Spec.Backends)
namespaces := make(map[string]bool)
clientsBySecrets := make(map[string]cephClientKey)
for _, backend := range backends {
cephSpec := backend.Ceph
namespaces[cephSpec.Rook.Namespace] = true
// TODO validate that all backends with this secret name are compatible
clientsBySecrets[cephSpec.Secret] = cephClientKey{cephSpec.ClientName, cephSpec.Rook.Namespace}
}
// collect mon addrs for each Rook namespace
monsByNamespace := make(map[string][]string)
for ns := range namespaces {
addrs, err := rookceph.GetCephMonitorAddrs(ctx, c, ns)
if err != nil {
return nil, err
}
monsByNamespace[ns] = addrs
}
// collect client secrets
var secrets []*corev1.Secret
for secretName, client := range clientsBySecrets {
keyring, err := rookceph.GetCephClientSecret(ctx, c, client.Name, client.Namespace)
if err != nil {
return nil, err
}
monHosts := monsByNamespace[client.Namespace]
secrets = append(secrets, rookceph.ClientSecret(secretName, instance.Namespace, client.Name, keyring, monHosts))
}
return secrets, nil
}
func filterRookCephBackends(allBackends []openstackv1beta1.ManilaBackendSpec) []openstackv1beta1.ManilaBackendSpec {
var backends []openstackv1beta1.ManilaBackendSpec
for _, backend := range allBackends {
if backend.Ceph == nil || backend.Ceph.Rook == nil {
continue
}
backends = append(backends, backend)
}
return backends
}