config.go 3.5 KB

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