utils.go 2.6 KB

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