get_controllers.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package release
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strings"
  6. "github.com/porter-dev/porter/api/server/authz"
  7. "github.com/porter-dev/porter/api/server/handlers"
  8. "github.com/porter-dev/porter/api/server/shared"
  9. "github.com/porter-dev/porter/api/server/shared/apierrors"
  10. "github.com/porter-dev/porter/api/server/shared/config"
  11. "github.com/porter-dev/porter/api/types"
  12. "github.com/porter-dev/porter/internal/helm/grapher"
  13. "github.com/porter-dev/porter/internal/kubernetes"
  14. "github.com/porter-dev/porter/internal/models"
  15. "helm.sh/helm/v3/pkg/release"
  16. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  17. )
  18. type GetControllersHandler struct {
  19. handlers.PorterHandlerReadWriter
  20. authz.KubernetesAgentGetter
  21. }
  22. func NewGetControllersHandler(
  23. config *config.Config,
  24. writer shared.ResultWriter,
  25. ) *GetControllersHandler {
  26. return &GetControllersHandler{
  27. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, nil, writer),
  28. KubernetesAgentGetter: authz.NewOutOfClusterAgentGetter(config),
  29. }
  30. }
  31. func (c *GetControllersHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  32. helmRelease, _ := r.Context().Value(types.ReleaseScope).(*release.Release)
  33. cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
  34. agent, err := c.GetAgent(r, cluster)
  35. if err != nil {
  36. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  37. return
  38. }
  39. yamlArr := grapher.ImportMultiDocYAML([]byte(helmRelease.Manifest))
  40. controllers := grapher.ParseControllers(yamlArr)
  41. retrievedControllers := []interface{}{}
  42. // get current status of each controller
  43. for _, controller := range controllers {
  44. controller.Namespace = helmRelease.Namespace
  45. rc, _, err := getController(controller, agent)
  46. if err != nil {
  47. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  48. return
  49. }
  50. retrievedControllers = append(retrievedControllers, rc)
  51. }
  52. c.WriteResult(w, r, retrievedControllers)
  53. }
  54. func getController(controller grapher.Object, agent *kubernetes.Agent) (rc interface{}, selector *metav1.LabelSelector, err error) {
  55. switch strings.ToLower(controller.Kind) {
  56. case "deployment":
  57. obj, err := agent.GetDeployment(controller)
  58. if err != nil {
  59. return nil, nil, err
  60. }
  61. return obj, obj.Spec.Selector, nil
  62. case "statefulset":
  63. obj, err := agent.GetStatefulSet(controller)
  64. if err != nil {
  65. return nil, nil, err
  66. }
  67. return obj, obj.Spec.Selector, nil
  68. case "daemonset":
  69. obj, err := agent.GetDaemonSet(controller)
  70. if err != nil {
  71. return nil, nil, err
  72. }
  73. return obj, obj.Spec.Selector, nil
  74. case "replicaset":
  75. obj, err := agent.GetReplicaSet(controller)
  76. if err != nil {
  77. return nil, nil, err
  78. }
  79. return obj, obj.Spec.Selector, nil
  80. case "cronjob":
  81. obj, err := agent.GetCronJob(controller)
  82. if err != nil {
  83. return nil, nil, err
  84. }
  85. return obj, obj.Spec.JobTemplate.Spec.Selector, nil
  86. }
  87. return nil, nil, fmt.Errorf("not a valid controller")
  88. }