/* How to use: eyede useDatabase --databaseHost=localhost --databaseName=dev0 --databaseUser=postgres --databasePassword=**** --topLevelProjectID=ret-edge-dev0-foreman --chariotTopic=chariot-rides */ package usedatabase import ( "context" "database/sql" "fmt" "os" "github.com/lib/pq" eyedeUtils "edge-infra.dev/hack/tools/eyede/utils" "edge-infra.dev/pkg/edge/api/graph/model" query "edge-infra.dev/pkg/edge/api/sql" "edge-infra.dev/pkg/edge/api/utils" clusterType "edge-infra.dev/pkg/edge/constants/api/cluster" fleetType "edge-infra.dev/pkg/edge/constants/api/fleet" "edge-infra.dev/pkg/edge/info" ) const ( getBannerName = "SELECT banner_name from banners WHERE banner_edge_id = $1" getTenantEdgeID = "SELECT tenant_edge_id from banners WHERE banner_edge_id = $1" getBSLOrgName = "SELECT org_name from tenants WHERE tenant_edge_id = $1" ) // CreateEdgeInfoConfigMap calls getClusters which queries the database and creates the edge-info configmaps func CreateEdgeInfoConfigMap(ctx context.Context, db *sql.DB, projectID, foremanProjectID, topic, edgeAPIURL string, dryRun bool) bool { return getClusters(ctx, db, projectID, foremanProjectID, topic, edgeAPIURL, dryRun) } // getClusters gets all the clusters for the associated project_id, fetches the banner // and also the bsl organization, fleet and store type. Creates a new edge-info configmap // and sends the configmap to chariot with the correct folder location func getClusters(ctx context.Context, db *sql.DB, projectID, foremanProjectID, topic, edgeAPIURL string, dryRun bool) bool { rows, err := db.QueryContext(ctx, eyedeUtils.GetClustersForBanner, projectID) if err != nil { fmt.Println("error getting banner's clusters", err) return true } for rows.Next() { var cluster model.Cluster location := "" storeType := "" organization := "" banner := "" fleet := "" err := rows.Scan(&cluster.ClusterEdgeID, &cluster.Name, &cluster.ProjectID, &cluster.BslSiteID, &location, &cluster.BannerEdgeID) if err != nil { fmt.Println("error scanning cluster vars", err) continue } //fetch banner name result := db.QueryRowContext(ctx, getBannerName, cluster.BannerEdgeID) err = result.Scan(&banner) if err != nil { fmt.Println("error getting banner name with banner_edge_id", err) continue } //fetch bsl organization tenantEdgeID := "" res := db.QueryRowContext(ctx, getTenantEdgeID, cluster.BannerEdgeID) err = res.Scan(&tenantEdgeID) if err != nil { fmt.Println("error getting tenant_edge_id with banner_edge_id", err) continue } resp := db.QueryRowContext(ctx, getBSLOrgName, tenantEdgeID) err = resp.Scan(&organization) if err != nil { fmt.Println("error getting bsl organization with tenant_edge_id", err) continue } //get the fleet type and storetype resp = db.QueryRowContext(ctx, query.SelectEdgeLabelKeys, cluster.ClusterEdgeID) var labels []string err = resp.Scan(pq.Array(&labels)) if err != nil { fmt.Println("error scanning fleet and store types", err) continue } if len(labels) == 2 { if err := fleetType.IsValid(labels[0]); err != nil { temp := labels[0] fleet = labels[1] storeType = temp if err := clusterType.Type(storeType).IsValid(); err != nil { storeType = "" } } else { fleet = labels[0] storeType = labels[1] } } //build configmap cm := info.EdgeInfo{ BannerName: banner, ProjectID: projectID, ClusterEdgeID: cluster.ClusterEdgeID, Store: cluster.Name, ClusterType: storeType, Location: location, Fleet: fleet, ForemanProjectID: foremanProjectID, BannerEdgeID: cluster.BannerEdgeID, EdgeAPIEndpoint: edgeAPIURL, }.ToConfigMap() edgeInfoCMString, err := info.ConfigMapToString(cm) if err != nil { fmt.Println("error converting configmap to string", err) continue } fmt.Println(string(edgeInfoCMString)) fmt.Println("") if !dryRun { configMap := utils.ToBase64(edgeInfoCMString) chariotMessage := eyedeUtils.CreateChariotMessage(cluster.ProjectID, cluster.ClusterEdgeID, eyedeUtils.Filter, configMap) err = eyedeUtils.InvokeChariot(ctx, foremanProjectID, topic, chariotMessage) if err != nil { fmt.Println("failed to send configmap to chariot", err) os.Exit(1) } } } return true }