config.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package helm
  2. import (
  3. "errors"
  4. "io/ioutil"
  5. "github.com/porter-dev/porter/internal/kubernetes"
  6. "github.com/porter-dev/porter/internal/logger"
  7. "github.com/porter-dev/porter/internal/models"
  8. "github.com/porter-dev/porter/internal/repository"
  9. "helm.sh/helm/v3/pkg/action"
  10. "helm.sh/helm/v3/pkg/chartutil"
  11. "helm.sh/helm/v3/pkg/kube"
  12. kubefake "helm.sh/helm/v3/pkg/kube/fake"
  13. "helm.sh/helm/v3/pkg/storage"
  14. k8s "k8s.io/client-go/kubernetes"
  15. )
  16. // Form represents the options for connecting to a cluster and
  17. // creating a Helm agent
  18. type Form struct {
  19. Cluster *models.Cluster `form:"required"`
  20. Repo *repository.Repository
  21. Storage string `json:"storage" form:"oneof=secret configmap memory" default:"secret"`
  22. Namespace string `json:"namespace"`
  23. }
  24. // GetAgentOutOfClusterConfig creates a new Agent from outside the cluster using
  25. // the underlying kubernetes.GetAgentOutOfClusterConfig method
  26. func GetAgentOutOfClusterConfig(form *Form, l *logger.Logger) (*Agent, error) {
  27. // create a kubernetes agent
  28. conf := &kubernetes.OutOfClusterConfig{
  29. Cluster: form.Cluster,
  30. Repo: form.Repo,
  31. }
  32. k8sAgent, err := kubernetes.GetAgentOutOfClusterConfig(conf)
  33. if err != nil {
  34. return nil, err
  35. }
  36. return GetAgentFromK8sAgent(form.Storage, form.Namespace, l, k8sAgent)
  37. }
  38. // GetAgentFromK8sAgent creates a new Agent
  39. func GetAgentFromK8sAgent(stg string, ns string, l *logger.Logger, k8sAgent *kubernetes.Agent) (*Agent, error) {
  40. clientset, ok := k8sAgent.Clientset.(*k8s.Clientset)
  41. if !ok {
  42. return nil, errors.New("Agent Clientset was not of type *(k8s.io/client-go/kubernetes).Clientset")
  43. }
  44. // use k8s agent to create Helm agent
  45. return &Agent{&action.Configuration{
  46. RESTClientGetter: k8sAgent.RESTClientGetter,
  47. KubeClient: kube.New(k8sAgent.RESTClientGetter),
  48. Releases: StorageMap[stg](l, clientset.CoreV1(), ns),
  49. Log: l.Printf,
  50. }}, nil
  51. }
  52. // GetAgentInClusterConfig creates a new Agent from inside the cluster using
  53. // the underlying kubernetes.GetAgentInClusterConfig method
  54. func GetAgentInClusterConfig(form *Form, l *logger.Logger) (*Agent, error) {
  55. // create a kubernetes agent
  56. k8sAgent, err := kubernetes.GetAgentInClusterConfig()
  57. if err != nil {
  58. return nil, err
  59. }
  60. clientset, ok := k8sAgent.Clientset.(*k8s.Clientset)
  61. if !ok {
  62. return nil, errors.New("Agent Clientset was not of type *(k8s.io/client-go/kubernetes).Clientset")
  63. }
  64. // use k8s agent to create Helm agent
  65. return &Agent{&action.Configuration{
  66. RESTClientGetter: k8sAgent.RESTClientGetter,
  67. KubeClient: kube.New(k8sAgent.RESTClientGetter),
  68. Releases: StorageMap[form.Storage](l, clientset.CoreV1(), form.Namespace),
  69. Log: l.Printf,
  70. }}, nil
  71. }
  72. // GetAgentTesting creates a new Agent using an optional existing storage class
  73. func GetAgentTesting(form *Form, storage *storage.Storage, l *logger.Logger) *Agent {
  74. testStorage := storage
  75. if testStorage == nil {
  76. testStorage = StorageMap["memory"](nil, nil, "")
  77. }
  78. return &Agent{&action.Configuration{
  79. Releases: testStorage,
  80. KubeClient: &kubefake.FailingKubeClient{
  81. PrintingKubeClient: kubefake.PrintingKubeClient{
  82. Out: ioutil.Discard,
  83. },
  84. },
  85. Capabilities: chartutil.DefaultCapabilities,
  86. Log: l.Printf,
  87. }}
  88. }