// Package edgesql makes calls into an edge SQL db // in order to gather data about an edge cluster. package edgesql import ( "database/sql" "fmt" "edge-infra.dev/pkg/lib/gcp/cloudsql" ) // EdgeCluster represents cluster data that's combined // from the clusters and banners sql table. type EdgeCluster struct { ClusterEdgeID string ClusterName string ProjectID string BannerEdgeID string BannerName string } type SQLConfig struct { Host string User string DbName string DbPassword string } var ( GetClusterByID = ` SELECT clusters.cluster_edge_id, clusters.cluster_name, clusters.project_id, banners.banner_edge_id, banners.banner_name FROM clusters JOIN banners ON banners.banner_edge_id = clusters.banner_edge_id WHERE clusters.cluster_edge_id = $1 ` ) // createSQLDBConnection creates a db connection. func (s *SQLConfig) createSQLDBConnection() (*sql.DB, error) { return cloudsql.GCPPostgresConnection(s.Host). DBName(s.DbName). Password(s.DbPassword). Username(s.User). NewConnection() } func (s *SQLConfig) CheckConnection() (*sql.DB, error) { db, err := s.createSQLDBConnection() if err != nil { panic(err) } return db, err } // ClusterByClusterID takes a cluster edge id and joins the // clusters and banners tables to get details about that // cluster. func ClusterByClusterID(db *sql.DB, clusterID string) (EdgeCluster, error) { cluster := EdgeCluster{} rows, err := db.Query(GetClusterByID, clusterID) if err != nil { return cluster, fmt.Errorf("error getting cluster by clusterID using id %s: %v", clusterID, err) } defer rows.Close() var clusterEdgeID, clusterName, projectID, bannerEdgeID, bannerName string for rows.Next() { err := rows.Scan(&clusterEdgeID, &clusterName, &projectID, &bannerEdgeID, &bannerName) if err != nil { return cluster, err } cluster.ClusterEdgeID = clusterEdgeID cluster.ClusterName = clusterName cluster.ProjectID = projectID cluster.BannerEdgeID = bannerEdgeID cluster.BannerName = bannerName // Rows.Err will report the last error encountered by Rows.Scan. if err := rows.Err(); err != nil { return cluster, err } } return cluster, nil }