...

Source file src/edge-infra.dev/hack/tools/hr/populate/populate.go

Documentation: edge-infra.dev/hack/tools/hr/populate

     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  		//update db
    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