/
catalog.go
116 lines (107 loc) · 3.77 KB
/
catalog.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package presto
import (
"fmt"
"github.com/falarica/steerd-presto-operator/pkg/apis/falarica/v1alpha1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"strings"
)
func createCatalogConfig(presto *v1alpha1.Presto, r *ReconcilePresto,
lbls map[string]string) (bool, error) {
catalogConfigName := getCatalogConfigMapName(presto.Status.Uuid)
configMap, err := buildCatalogConfigMap(presto, catalogConfigName, lbls)
if err != nil {
return false, err
}
return createConfigMap(catalogConfigName, presto, r.client, configMap, lbls)
}
func getCatalogVolumeMount(presto *v1alpha1.Presto, podSpec *corev1.PodSpec) *corev1.VolumeMount {
numOfVolProjections := len(presto.Spec.Catalogs.CatalogSecrets) + 1
volumeProjectionsCatalogs := make([]corev1.VolumeProjection, numOfVolProjections)
volumeProjectionsCatalogs[0] = corev1.VolumeProjection{
ConfigMap: &corev1.ConfigMapProjection{
LocalObjectReference: corev1.LocalObjectReference{
Name: getCatalogConfigMapName(presto.Status.Uuid),
},
},
}
for i ,catalogSecret := range presto.Spec.Catalogs.CatalogSecrets {
catalogFileNames := make([]corev1.KeyToPath, 1)
catalogFileNames[0] = corev1.KeyToPath{
Key: catalogSecret.SecretKey,
Path: catalogSecret.SecretKey + catalogFileSuffix,
}
volumeProjectionsCatalogs[i + 1] = corev1.VolumeProjection{
Secret: &corev1.SecretProjection{
LocalObjectReference: corev1.LocalObjectReference{Name: catalogSecret.SecretName},
Items: catalogFileNames,
},
}
}
catalogVolume := corev1.Volume{
Name: getCatalogVolName(presto.Status.Uuid),
VolumeSource: corev1.VolumeSource{
Projected: &corev1.ProjectedVolumeSource{
Sources: volumeProjectionsCatalogs,
},
},
}
podSpec.Volumes = append(podSpec.Volumes, catalogVolume)
return &corev1.VolumeMount{
Name: getCatalogVolName(presto.Status.Uuid),
ReadOnly: true,
//TODO: this depends on the docker file. Needs to be seen if it remains same
MountPath: getPrestoPath(presto) + catalogMountPath,
}
}
func getDefaultCatalogs(presto *v1alpha1.Presto) map[string]string{
var defaultCatalogs = map[string]string {
"jmx" : "connector.name=jmx\n",
"tpch" : "connector.name=tpch\n",
"tpcds" : "connector.name=tpcds\n",
}
// add default catalog if catalogs with same name are are not already added
prunedDefaultCatalog := make(map[string]string)
for catalogName, content := range defaultCatalogs {
catalogPresentInSpec := false
for _, specCatalog := range presto.Spec.Catalogs.CatalogSpec {
if specCatalog.Name == catalogName {
catalogPresentInSpec = true
}
}
for _, specCatalogSecret := range presto.Spec.Catalogs.CatalogSecrets {
if specCatalogSecret.SecretKey == catalogName {
catalogPresentInSpec = true
}
}
if !catalogPresentInSpec {
prunedDefaultCatalog[catalogName] = content
}
}
return prunedDefaultCatalog
}
func buildCatalogConfigMap(presto *v1alpha1.Presto,
catalogConfigName string, labels map[string]string) (*corev1.ConfigMap, error) {
catalogData := make(map[string]string)
for _, catalog := range presto.Spec.Catalogs.CatalogSpec {
var sb strings.Builder
for key, value := range catalog.Content {
sb.WriteString(fmt.Sprintf("%s=%s\n", key, value))
}
catalogData[catalog.Name + catalogFileSuffix] = sb.String()
}
defaultCatalogs := getDefaultCatalogs(presto)
for k, v := range defaultCatalogs {
// add .properties to the catalog name. as we are not asking that as part of catalog name
catalogData[k + catalogFileSuffix] = v
}
return &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: catalogConfigName,
Namespace: presto.Namespace,
Labels: labels,
OwnerReferences: []metav1.OwnerReference{*getOwnerReference(presto)},
},
Data: catalogData,
}, nil
}