node_groups.go 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package cluster
  2. import (
  3. "net/http"
  4. "connectrpc.com/connect"
  5. porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
  6. "github.com/porter-dev/porter/internal/telemetry"
  7. "github.com/porter-dev/porter/api/server/authz"
  8. "github.com/porter-dev/porter/api/server/handlers"
  9. "github.com/porter-dev/porter/api/server/shared"
  10. "github.com/porter-dev/porter/api/server/shared/apierrors"
  11. "github.com/porter-dev/porter/api/server/shared/config"
  12. "github.com/porter-dev/porter/api/types"
  13. "github.com/porter-dev/porter/internal/models"
  14. )
  15. // NodeGroupsHandler is the handler for the /node-groups endpoint
  16. type NodeGroupsHandler struct {
  17. handlers.PorterHandlerWriter
  18. authz.KubernetesAgentGetter
  19. }
  20. // NewNodeGroupsHandler returns a handler for handling node group requests
  21. func NewNodeGroupsHandler(
  22. config *config.Config,
  23. writer shared.ResultWriter,
  24. ) *NodeGroupsHandler {
  25. return &NodeGroupsHandler{
  26. PorterHandlerWriter: handlers.NewDefaultPorterHandler(config, nil, writer),
  27. KubernetesAgentGetter: authz.NewOutOfClusterAgentGetter(config),
  28. }
  29. }
  30. // NodeGroupsResponse represents the response to a list node groups request
  31. type NodeGroupsResponse struct {
  32. NodeGroups []NodeGroup `json:"node_groups"`
  33. }
  34. // NodeGroup represents a node group managed by a user
  35. type NodeGroup struct {
  36. Name string `json:"name"`
  37. Id string `json:"id"`
  38. InstanceType string `json:"instance_type"`
  39. RamMb int32 `json:"ram_mb"`
  40. CpuCores float32 `json:"cpu_cores"`
  41. GpuCores int32 `json:"gpu_cores"`
  42. }
  43. // ServeHTTP handles GET requests to list node groups
  44. func (c *NodeGroupsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  45. ctx, span := telemetry.NewSpan(r.Context(), "serve-list-nodes")
  46. defer span.End()
  47. project, _ := r.Context().Value(types.ProjectScope).(*models.Project)
  48. cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
  49. userNodeGroupReq := connect.NewRequest(&porterv1.UserNodeGroupsRequest{
  50. ProjectId: int64(project.ID),
  51. ClusterId: int64(cluster.ID),
  52. })
  53. ccpResp, err := c.Config().ClusterControlPlaneClient.UserNodeGroups(ctx, userNodeGroupReq)
  54. if err != nil {
  55. err := telemetry.Error(ctx, span, err, "error creating deployment target")
  56. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
  57. return
  58. }
  59. if ccpResp == nil || ccpResp.Msg == nil {
  60. err := telemetry.Error(ctx, span, err, "ccp resp msg is nil")
  61. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
  62. return
  63. }
  64. var nodeGroups []NodeGroup
  65. for _, ng := range ccpResp.Msg.UserNodeGroups {
  66. nodeGroups = append(nodeGroups, NodeGroup{
  67. Name: ng.Name,
  68. Id: ng.Id,
  69. InstanceType: ng.InstanceType,
  70. RamMb: ng.RamMb,
  71. CpuCores: ng.CpuCores,
  72. GpuCores: ng.GpuCores,
  73. })
  74. }
  75. res := &NodeGroupsResponse{
  76. NodeGroups: nodeGroups,
  77. }
  78. c.WriteResult(w, r, res)
  79. }