1 package populate
2
3 import (
4 "context"
5 "database/sql"
6 "encoding/json"
7 "fmt"
8 "os"
9
10 "github.com/doug-martin/goqu/v9"
11 goext "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
12 helmApi "github.com/fluxcd/helm-controller/api/v2beta1"
13
14 "edge-infra.dev/pkg/edge/api/clients"
15 "edge-infra.dev/pkg/edge/api/graph/mapper"
16 "edge-infra.dev/pkg/edge/api/services"
17 )
18
19 const (
20 edgeInfoConfigMapMatcher = "{\"kind\":\"ConfigMap\",\"apiVersion\":\"v1\",\"metadata\":{\"name\":\"edge-info\""
21 createWorkload = "INSERT INTO helm_workloads (cluster_edge_id, workload_name, workload_namespace, helm_chart, helm_repo, helm_chart_version, helm_config, helm_repo_secret) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) ON CONFLICT DO NOTHING;"
22 getWorkload = "SELECT helm_edge_id from helm_workloads WHERE workload_name = $1 AND cluster_edge_id = $2"
23 createSecret = "INSERT INTO helm_secrets (secret_name, helm_edge_id) VALUES ($1, $2) ON CONFLICT DO NOTHING;"
24 )
25
26 func HelmWorkloadsTable(ctx context.Context, db *sql.DB, bqClient clients.BQClient, bqTableName string, clusterEdgeID string) bool {
27 var configValues *string
28 q, err := buildBQQuery(bqTableName, clusterEdgeID)
29 if err != nil {
30 fmt.Println("an error occurred", clusterEdgeID, err)
31 os.Exit(1)
32 }
33 results, err := bqClient.Read(ctx, q)
34 if err != nil {
35 fmt.Println("an error occurred", clusterEdgeID, err)
36 os.Exit(1)
37 }
38 hrs, err := services.ConvertToHelmReleases(ctx, results)
39 if err != nil {
40 fmt.Println("an error occurred", clusterEdgeID, err)
41 os.Exit(1)
42 }
43 for _, hr := range hrs {
44 fmt.Printf("processing helm release cluster edge id: %s, hr name: %s\n", clusterEdgeID, hr.Name)
45
46 if hr.Spec.Values == nil {
47 configValues = nil
48 } else {
49 hr := string(hr.Spec.Values.Raw)
50 configValues = &hr
51 }
52 _, err := db.ExecContext(ctx, createWorkload, clusterEdgeID, hr.Name, hr.Spec.TargetNamespace,
53 hr.Spec.Chart.Spec.Chart, hr.Spec.Chart.Spec.SourceRef.Name, hr.Spec.Chart.Spec.Version, configValues,
54 hr.Labels[mapper.SecretManagerSecretLabel])
55 if err != nil {
56 fmt.Println(fmt.Errorf("cluster edge id: %s, hr name: %s err: %w", clusterEdgeID, hr.Name, err))
57 }
58 addSecrets(ctx, db, bqTableName, clusterEdgeID, hr, bqClient)
59 }
60 return false
61 }
62
63 func addSecrets(ctx context.Context, db *sql.DB, bqTableName string, clusterEdgeID string, hr helmApi.HelmRelease, bqClient clients.BQClient) {
64 var helmEdgeID string
65 row := db.QueryRow(getWorkload, hr.Name, clusterEdgeID)
66 err := row.Scan(&helmEdgeID)
67 if err != nil {
68 fmt.Println("an error occurred", clusterEdgeID, err)
69 os.Exit(1)
70 }
71 q, err := buildSecretsBQQuery(bqTableName, clusterEdgeID, hr.Spec.TargetNamespace)
72 if err != nil {
73 fmt.Println("an error occurred", clusterEdgeID, err)
74 os.Exit(1)
75 }
76 results, err := bqClient.Read(ctx, q)
77 if err != nil {
78 fmt.Println("an error occurred", clusterEdgeID, err)
79 os.Exit(1)
80 }
81 for _, sec := range results {
82 externalSecret := &goext.ExternalSecret{}
83 err := json.Unmarshal([]byte(sec), externalSecret)
84 if err != nil {
85 fmt.Println("an error occurred", clusterEdgeID, err)
86 os.Exit(1)
87 }
88 _, err = db.ExecContext(ctx, createSecret, externalSecret.Name, helmEdgeID)
89 if err != nil {
90 fmt.Println(fmt.Errorf("cluster edge id: %s, hr name: %s err: %w", clusterEdgeID, hr.Name, err))
91 }
92 }
93 }
94
95 func buildBQQuery(bqTableName, clusterEdgeID string) (string, error) {
96 queryBuilder := goqu.Dialect("mysql").Select("resource").From(bqTableName).
97 Where(goqu.C("k8s_group").Eq("helm.toolkit.fluxcd.io")).
98 Where(goqu.C("version").Eq("v2beta1")).
99 Where(goqu.C("kind").Eq("HelmRelease")).
100 Where(goqu.C("operation").Neq("delete")).
101 Where(goqu.C("cluster_edge_id").Eq(clusterEdgeID))
102 q, _, err := queryBuilder.ToSQL()
103 return q, err
104 }
105
106 func buildSecretsBQQuery(bqTableName, clusterEdgeID, namespace string) (string, error) {
107 queryBuilder := goqu.Dialect("mysql").Select("resource").From(bqTableName).
108 Where(goqu.C("k8s_group").Eq("external-secrets.io")).
109 Where(goqu.C("version").Eq("v1beta1")).
110 Where(goqu.C("kind").Eq("ExternalSecret")).
111 Where(goqu.C("operation").Neq("delete")).
112 Where(goqu.C("namespace").Eq(namespace)).
113 Where(goqu.C("cluster_edge_id").Eq(clusterEdgeID))
114 q, _, err := queryBuilder.ToSQL()
115 return q, err
116 }
117
View as plain text