clustermeta.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package types
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "github.com/opencost/opencost/pkg/env"
  6. )
  7. var createTableStatements = []string{
  8. `CREATE TABLE IF NOT EXISTS names (
  9. cluster_id VARCHAR(255) NOT NULL,
  10. cluster_name VARCHAR(255) NULL,
  11. PRIMARY KEY (cluster_id)
  12. );`,
  13. }
  14. // TODO: these don't really fit in this package, should they move
  15. // somewhere else?
  16. func UpdateClusterMeta(cluster_id, cluster_name string) error {
  17. pw := env.GetRemotePW()
  18. address := env.GetSQLAddress()
  19. connStr := fmt.Sprintf("postgres://postgres:%s@%s:5432?sslmode=disable", pw, address)
  20. db, err := sql.Open("postgres", connStr)
  21. if err != nil {
  22. return err
  23. }
  24. defer db.Close()
  25. updateStmt := `UPDATE names SET cluster_name = $1 WHERE cluster_id = $2;`
  26. _, err = db.Exec(updateStmt, cluster_name, cluster_id)
  27. if err != nil {
  28. return err
  29. }
  30. return nil
  31. }
  32. func CreateClusterMeta(cluster_id, cluster_name string) error {
  33. pw := env.GetRemotePW()
  34. address := env.GetSQLAddress()
  35. connStr := fmt.Sprintf("postgres://postgres:%s@%s:5432?sslmode=disable", pw, address)
  36. db, err := sql.Open("postgres", connStr)
  37. if err != nil {
  38. return err
  39. }
  40. defer db.Close()
  41. for _, stmt := range createTableStatements {
  42. _, err := db.Exec(stmt)
  43. if err != nil {
  44. return err
  45. }
  46. }
  47. insertStmt := `INSERT INTO names (cluster_id, cluster_name) VALUES ($1, $2);`
  48. _, err = db.Exec(insertStmt, cluster_id, cluster_name)
  49. if err != nil {
  50. return err
  51. }
  52. return nil
  53. }
  54. func GetClusterMeta(cluster_id string) (string, string, error) {
  55. pw := env.GetRemotePW()
  56. address := env.GetSQLAddress()
  57. connStr := fmt.Sprintf("postgres://postgres:%s@%s:5432?sslmode=disable", pw, address)
  58. db, err := sql.Open("postgres", connStr)
  59. if err != nil {
  60. return "", "", err
  61. }
  62. defer db.Close()
  63. query := `SELECT cluster_id, cluster_name
  64. FROM names
  65. WHERE cluster_id = ?`
  66. rows, err := db.Query(query, cluster_id)
  67. if err != nil {
  68. return "", "", err
  69. }
  70. defer rows.Close()
  71. var (
  72. sql_cluster_id string
  73. cluster_name string
  74. )
  75. for rows.Next() {
  76. if err := rows.Scan(&sql_cluster_id, &cluster_name); err != nil {
  77. return "", "", err
  78. }
  79. }
  80. return sql_cluster_id, cluster_name, nil
  81. }
  82. func GetOrCreateClusterMeta(cluster_id, cluster_name string) (string, string, error) {
  83. id, name, err := GetClusterMeta(cluster_id)
  84. if err != nil {
  85. err := CreateClusterMeta(cluster_id, cluster_name)
  86. if err != nil {
  87. return "", "", err
  88. }
  89. }
  90. if id == "" {
  91. err := CreateClusterMeta(cluster_id, cluster_name)
  92. if err != nil {
  93. return "", "", err
  94. }
  95. }
  96. return id, name, nil
  97. }