...

Source file src/edge-infra.dev/pkg/edge/monitoring/billman/edgesql/edgesql.go

Documentation: edge-infra.dev/pkg/edge/monitoring/billman/edgesql

     1  // Package edgesql makes calls into an edge SQL db
     2  // in order to gather data about an edge cluster.
     3  package edgesql
     4  
     5  import (
     6  	"database/sql"
     7  	"fmt"
     8  
     9  	"edge-infra.dev/pkg/lib/gcp/cloudsql"
    10  )
    11  
    12  // EdgeCluster represents cluster data that's combined
    13  // from the clusters and banners sql table.
    14  type EdgeCluster struct {
    15  	ClusterEdgeID string
    16  	ClusterName   string
    17  	ProjectID     string
    18  	BannerEdgeID  string
    19  	BannerName    string
    20  }
    21  type SQLConfig struct {
    22  	Host       string
    23  	User       string
    24  	DbName     string
    25  	DbPassword string
    26  }
    27  
    28  var (
    29  	GetClusterByID = `
    30  		SELECT clusters.cluster_edge_id,
    31  			   clusters.cluster_name,
    32  			   clusters.project_id,
    33  			   banners.banner_edge_id,
    34  		   	   banners.banner_name
    35  		FROM clusters
    36  		JOIN banners ON banners.banner_edge_id = clusters.banner_edge_id
    37  		WHERE clusters.cluster_edge_id = $1
    38  	`
    39  )
    40  
    41  // createSQLDBConnection creates a db connection.
    42  func (s *SQLConfig) createSQLDBConnection() (*sql.DB, error) {
    43  	return cloudsql.GCPPostgresConnection(s.Host).
    44  		DBName(s.DbName).
    45  		Password(s.DbPassword).
    46  		Username(s.User).
    47  		NewConnection()
    48  }
    49  
    50  func (s *SQLConfig) CheckConnection() (*sql.DB, error) {
    51  	db, err := s.createSQLDBConnection()
    52  	if err != nil {
    53  		panic(err)
    54  	}
    55  	return db, err
    56  }
    57  
    58  // ClusterByClusterID takes a cluster edge id and joins the
    59  // clusters and banners tables to get details about that
    60  // cluster.
    61  func ClusterByClusterID(db *sql.DB, clusterID string) (EdgeCluster, error) {
    62  	cluster := EdgeCluster{}
    63  	rows, err := db.Query(GetClusterByID, clusterID)
    64  	if err != nil {
    65  		return cluster, fmt.Errorf("error getting cluster by clusterID using id %s: %v", clusterID, err)
    66  	}
    67  	defer rows.Close()
    68  
    69  	var clusterEdgeID, clusterName, projectID, bannerEdgeID, bannerName string
    70  
    71  	for rows.Next() {
    72  		err := rows.Scan(&clusterEdgeID, &clusterName, &projectID, &bannerEdgeID, &bannerName)
    73  		if err != nil {
    74  			return cluster, err
    75  		}
    76  		cluster.ClusterEdgeID = clusterEdgeID
    77  		cluster.ClusterName = clusterName
    78  		cluster.ProjectID = projectID
    79  		cluster.BannerEdgeID = bannerEdgeID
    80  		cluster.BannerName = bannerName
    81  
    82  		// Rows.Err will report the last error encountered by Rows.Scan.
    83  		if err := rows.Err(); err != nil {
    84  			return cluster, err
    85  		}
    86  	}
    87  
    88  	return cluster, nil
    89  }
    90  

View as plain text