-
Notifications
You must be signed in to change notification settings - Fork 80
Expand file tree
/
Copy pathutil.go
More file actions
124 lines (104 loc) · 3.94 KB
/
util.go
File metadata and controls
124 lines (104 loc) · 3.94 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
package util
import (
"context"
"fmt"
"os"
"reflect"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
apiextensionsClientSetv1 "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
v1core "github.com/rancher/wrangler/v3/pkg/generated/controllers/core/v1"
"github.com/sirupsen/logrus"
k8sv1 "k8s.io/apimachinery/pkg/apis/meta/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/server/options/encryptionconfig"
"k8s.io/apiserver/pkg/storage/value"
"k8s.io/apiserver/pkg/storage/value/encrypt/identity"
)
const (
WorkerThreads = 25
S3Backup = "S3"
PVBackup = "PV"
encryptionProviderConfigKey = "encryption-provider-config.yaml"
)
var ChartNamespace string
func GetEncryptionTransformersFromSecret(encryptionConfigSecretName string, secrets v1core.SecretController) (map[schema.GroupResource]value.Transformer, error) {
// EncryptionConfig secret ns is hardcoded to ns of controller in chart's ns
// kubectl create secret generic test-encryptionconfig --from-file=./encryption-provider-config.yaml
logrus.Infof("Get encryption config from namespace %v", ChartNamespace)
encryptionConfigSecret, err := secrets.Get(ChartNamespace, encryptionConfigSecretName, k8sv1.GetOptions{})
if err != nil {
return nil, err
}
encryptionConfigBytes, ok := encryptionConfigSecret.Data[encryptionProviderConfigKey]
if !ok {
return nil, fmt.Errorf("no encryptionConfig provided")
}
err = os.WriteFile(encryptionProviderConfigKey, encryptionConfigBytes, os.ModePerm)
defer os.Remove(encryptionProviderConfigKey)
if err != nil {
return nil, err
}
return PrepareEncryptionTransformersFromConfig(context.Background(), encryptionProviderConfigKey)
}
func PrepareEncryptionTransformersFromConfig(ctx context.Context, encryptionProviderPath string) (map[schema.GroupResource]value.Transformer, error) {
apiServerID := ""
encryptionConfig, err := encryptionconfig.LoadEncryptionConfig(ctx, encryptionProviderPath, false, apiServerID)
if err != nil {
return nil, err
}
return encryptionConfig.Transformers, nil
}
func GetObjectQueue(l interface{}, capacity int) chan interface{} {
s := reflect.ValueOf(l)
c := make(chan interface{}, capacity)
for i := 0; i < s.Len(); i++ {
c <- s.Index(i).Interface()
}
return c
}
func IsDefaultEncryptionTransformer(transformer value.Transformer) bool {
return transformer == identity.NewEncryptCheckTransformer()
}
func ErrList(e []error) error {
if len(e) > 0 {
return fmt.Errorf("%v", e)
}
return nil
}
func FetchClusterUID(namespaces v1core.NamespaceController) (string, error) {
kubesystemNamespace, err := namespaces.Get("kube-system", k8sv1.GetOptions{})
if err != nil {
return "", err
}
return string(kubesystemNamespace.UID), nil
}
// Define the GroupVersionResource for CRDs
var crdGVR = schema.GroupVersionResource{
Group: "apiextensions.k8s.io",
Version: "v1",
Resource: "customresourcedefinitions",
}
func getCRDDefinition(dynamicClient apiextensionsClientSetv1.ApiextensionsV1Interface, crdName string) (*apiextensionsv1.CustomResourceDefinition, error) {
crd, err := dynamicClient.CustomResourceDefinitions().Get(context.TODO(), crdName, metav1.GetOptions{})
if err != nil {
return nil, err
}
return crd, nil
}
func VerifyBackupCrdHasClusterStatus(client apiextensionsClientSetv1.ApiextensionsV1Interface) bool {
crdName := "backups.resources.cattle.io"
crd, err := getCRDDefinition(client, crdName)
if err != nil {
logrus.Infof("Error fetching CRD: %v", err)
return false
}
// Inspect the status schema, for example
_, found := crd.Spec.Versions[0].Schema.OpenAPIV3Schema.Properties["status"].Properties["originCluster"]
if found {
logrus.Debugf("Status schema contains `originCluster` on CRD `%s`.\n", crdName)
return true
}
logrus.Debugf("`originCluster` not found on status schema for CRD `%s`.\n", crdName)
return false
}