clustersendpoints.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package clustermanager
  2. import (
  3. "errors"
  4. "io/ioutil"
  5. "net/http"
  6. "github.com/julienschmidt/httprouter"
  7. "github.com/kubecost/cost-model/pkg/util/json"
  8. "k8s.io/klog"
  9. )
  10. // DataEnvelope is a generic wrapper struct for http response data
  11. type DataEnvelope struct {
  12. Code int `json:"code"`
  13. Status string `json:"status"`
  14. Data interface{} `json:"data"`
  15. }
  16. type ClusterManagerEndpoints struct {
  17. manager *ClusterManager
  18. }
  19. func NewClusterManagerEndpoints(manager *ClusterManager) *ClusterManagerEndpoints {
  20. return &ClusterManagerEndpoints{
  21. manager: manager,
  22. }
  23. }
  24. func (cme *ClusterManagerEndpoints) GetAllClusters(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
  25. w.Header().Set("Content-Type", "application/json")
  26. w.Header().Set("Access-Control-Allow-Origin", "*")
  27. clusters := cme.manager.GetAll()
  28. w.Write(wrapData(clusters, nil))
  29. }
  30. func (cme *ClusterManagerEndpoints) PutCluster(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
  31. w.Header().Set("Content-Type", "application/json")
  32. w.Header().Set("Access-Control-Allow-Origin", "*")
  33. data, err := ioutil.ReadAll(r.Body)
  34. if err != nil {
  35. w.Write(wrapData(nil, err))
  36. return
  37. }
  38. var clusterDef ClusterDefinition
  39. err = json.Unmarshal(data, &clusterDef)
  40. if err != nil {
  41. w.Write(wrapData(nil, err))
  42. return
  43. }
  44. cd, err := cme.manager.AddOrUpdate(clusterDef)
  45. if err != nil {
  46. w.Write(wrapData(nil, err))
  47. return
  48. }
  49. w.Write(wrapData(cd, nil))
  50. }
  51. func (cme *ClusterManagerEndpoints) DeleteCluster(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
  52. w.Header().Set("Content-Type", "application/json")
  53. w.Header().Set("Access-Control-Allow-Origin", "*")
  54. clusterID := ps.ByName("id")
  55. if clusterID == "" {
  56. w.Write(wrapData(nil, errors.New("Failed to locate cluster with empty id.")))
  57. return
  58. }
  59. err := cme.manager.Remove(clusterID)
  60. if err != nil {
  61. w.Write(wrapData(nil, err))
  62. return
  63. }
  64. w.Write(wrapData("success", nil))
  65. }
  66. func wrapData(data interface{}, err error) []byte {
  67. var resp []byte
  68. if err != nil {
  69. klog.V(1).Infof("Error returned to client: %s", err.Error())
  70. resp, _ = json.Marshal(&DataEnvelope{
  71. Code: http.StatusInternalServerError,
  72. Status: "error",
  73. Data: err.Error(),
  74. })
  75. } else {
  76. resp, _ = json.Marshal(&DataEnvelope{
  77. Code: http.StatusOK,
  78. Status: "success",
  79. Data: data,
  80. })
  81. }
  82. return resp
  83. }