...

Source file src/edge-infra.dev/hack/tools/eyede/use-database/use-database.go

Documentation: edge-infra.dev/hack/tools/eyede/use-database

     1  /*
     2  How to use:
     3  eyede useDatabase --databaseHost=localhost --databaseName=dev0 --databaseUser=postgres --databasePassword=****
     4  --topLevelProjectID=ret-edge-dev0-foreman --chariotTopic=chariot-rides
     5  */
     6  package usedatabase
     7  
     8  import (
     9  	"context"
    10  	"database/sql"
    11  	"fmt"
    12  	"os"
    13  
    14  	"github.com/lib/pq"
    15  
    16  	eyedeUtils "edge-infra.dev/hack/tools/eyede/utils"
    17  	"edge-infra.dev/pkg/edge/api/graph/model"
    18  	query "edge-infra.dev/pkg/edge/api/sql"
    19  	"edge-infra.dev/pkg/edge/api/utils"
    20  	clusterType "edge-infra.dev/pkg/edge/constants/api/cluster"
    21  	fleetType "edge-infra.dev/pkg/edge/constants/api/fleet"
    22  	"edge-infra.dev/pkg/edge/info"
    23  )
    24  
    25  const (
    26  	getBannerName   = "SELECT banner_name from banners WHERE banner_edge_id = $1"
    27  	getTenantEdgeID = "SELECT tenant_edge_id from banners WHERE banner_edge_id = $1"
    28  	getBSLOrgName   = "SELECT org_name from tenants WHERE tenant_edge_id = $1"
    29  )
    30  
    31  // CreateEdgeInfoConfigMap calls getClusters which queries the database and creates the edge-info configmaps
    32  func CreateEdgeInfoConfigMap(ctx context.Context, db *sql.DB, projectID, foremanProjectID, topic, edgeAPIURL string, dryRun bool) bool {
    33  	return getClusters(ctx, db, projectID, foremanProjectID, topic, edgeAPIURL, dryRun)
    34  }
    35  
    36  // getClusters gets all the clusters for the associated project_id, fetches the banner
    37  // and also the bsl organization, fleet and store type. Creates a new edge-info configmap
    38  // and sends the configmap to chariot with the correct folder location
    39  func getClusters(ctx context.Context, db *sql.DB, projectID, foremanProjectID, topic, edgeAPIURL string, dryRun bool) bool {
    40  	rows, err := db.QueryContext(ctx, eyedeUtils.GetClustersForBanner, projectID)
    41  	if err != nil {
    42  		fmt.Println("error getting banner's clusters", err)
    43  		return true
    44  	}
    45  	for rows.Next() {
    46  		var cluster model.Cluster
    47  		location := ""
    48  		storeType := ""
    49  		organization := ""
    50  		banner := ""
    51  		fleet := ""
    52  		err := rows.Scan(&cluster.ClusterEdgeID, &cluster.Name, &cluster.ProjectID, &cluster.BslSiteID, &location, &cluster.BannerEdgeID)
    53  		if err != nil {
    54  			fmt.Println("error scanning cluster vars", err)
    55  			continue
    56  		}
    57  		//fetch banner name
    58  		result := db.QueryRowContext(ctx, getBannerName, cluster.BannerEdgeID)
    59  		err = result.Scan(&banner)
    60  		if err != nil {
    61  			fmt.Println("error getting banner name with banner_edge_id", err)
    62  			continue
    63  		}
    64  		//fetch bsl organization
    65  		tenantEdgeID := ""
    66  		res := db.QueryRowContext(ctx, getTenantEdgeID, cluster.BannerEdgeID)
    67  		err = res.Scan(&tenantEdgeID)
    68  		if err != nil {
    69  			fmt.Println("error getting tenant_edge_id with banner_edge_id", err)
    70  			continue
    71  		}
    72  		resp := db.QueryRowContext(ctx, getBSLOrgName, tenantEdgeID)
    73  		err = resp.Scan(&organization)
    74  		if err != nil {
    75  			fmt.Println("error getting bsl organization with tenant_edge_id", err)
    76  			continue
    77  		}
    78  		//get the fleet type and storetype
    79  		resp = db.QueryRowContext(ctx, query.SelectEdgeLabelKeys, cluster.ClusterEdgeID)
    80  		var labels []string
    81  		err = resp.Scan(pq.Array(&labels))
    82  		if err != nil {
    83  			fmt.Println("error scanning fleet and store types", err)
    84  			continue
    85  		}
    86  		if len(labels) == 2 {
    87  			if err := fleetType.IsValid(labels[0]); err != nil {
    88  				temp := labels[0]
    89  				fleet = labels[1]
    90  				storeType = temp
    91  				if err := clusterType.Type(storeType).IsValid(); err != nil {
    92  					storeType = ""
    93  				}
    94  			} else {
    95  				fleet = labels[0]
    96  				storeType = labels[1]
    97  			}
    98  		}
    99  		//build configmap
   100  		cm := info.EdgeInfo{
   101  			BannerName:       banner,
   102  			ProjectID:        projectID,
   103  			ClusterEdgeID:    cluster.ClusterEdgeID,
   104  			Store:            cluster.Name,
   105  			ClusterType:      storeType,
   106  			Location:         location,
   107  			Fleet:            fleet,
   108  			ForemanProjectID: foremanProjectID,
   109  			BannerEdgeID:     cluster.BannerEdgeID,
   110  			EdgeAPIEndpoint:  edgeAPIURL,
   111  		}.ToConfigMap()
   112  		edgeInfoCMString, err := info.ConfigMapToString(cm)
   113  		if err != nil {
   114  			fmt.Println("error converting configmap to string", err)
   115  			continue
   116  		}
   117  		fmt.Println(string(edgeInfoCMString))
   118  		fmt.Println("")
   119  		if !dryRun {
   120  			configMap := utils.ToBase64(edgeInfoCMString)
   121  			chariotMessage := eyedeUtils.CreateChariotMessage(cluster.ProjectID, cluster.ClusterEdgeID, eyedeUtils.Filter, configMap)
   122  			err = eyedeUtils.InvokeChariot(ctx, foremanProjectID, topic, chariotMessage)
   123  			if err != nil {
   124  				fmt.Println("failed to send configmap to chariot", err)
   125  				os.Exit(1)
   126  			}
   127  		}
   128  	}
   129  	return true
   130  }
   131  

View as plain text