provisioner.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package provisioner
  2. import (
  3. "fmt"
  4. "github.com/porter-dev/porter/api/types"
  5. "github.com/porter-dev/porter/internal/kubernetes/provisioner/aws/ecr"
  6. "github.com/porter-dev/porter/internal/kubernetes/provisioner/aws/eks"
  7. "github.com/porter-dev/porter/internal/kubernetes/provisioner/do/docr"
  8. "github.com/porter-dev/porter/internal/kubernetes/provisioner/do/doks"
  9. "github.com/porter-dev/porter/internal/kubernetes/provisioner/gcp/gcr"
  10. "github.com/porter-dev/porter/internal/kubernetes/provisioner/gcp/gke"
  11. "github.com/porter-dev/porter/internal/models"
  12. batchv1 "k8s.io/api/batch/v1"
  13. v1 "k8s.io/api/core/v1"
  14. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  15. )
  16. type ProvisionerOperation string
  17. const (
  18. Apply ProvisionerOperation = "apply"
  19. Destroy ProvisionerOperation = "destroy"
  20. )
  21. type ProvisionCredentialExchange struct {
  22. CredExchangeEndpoint string
  23. CredExchangeToken string
  24. CredExchangeID uint
  25. VaultToken string
  26. }
  27. type ProvisionOpts struct {
  28. DryRun bool
  29. Infra *models.Infra
  30. ProvImageTag string
  31. ProvJobNamespace string
  32. ProvImagePullSecret string
  33. TFHTTPBackendURL string
  34. CredentialExchange *ProvisionCredentialExchange
  35. OperationKind ProvisionerOperation
  36. // resource-specific opts
  37. ECR *ecr.Conf
  38. EKS *eks.Conf
  39. GCR *gcr.Conf
  40. GKE *gke.Conf
  41. DOCR *docr.Conf
  42. DOKS *doks.Conf
  43. }
  44. func GetProvisionerJobTemplate(opts *ProvisionOpts) (*batchv1.Job, error) {
  45. labels := map[string]string{
  46. "app": "provisioner",
  47. }
  48. ttl := int32(3600)
  49. backoffLimit := int32(1)
  50. imagePullSecrets := []v1.LocalObjectReference{}
  51. if opts.ProvImagePullSecret != "" {
  52. imagePullSecrets = append(imagePullSecrets, v1.LocalObjectReference{
  53. Name: opts.ProvImagePullSecret,
  54. })
  55. }
  56. env := GetTFEnv(opts)
  57. // add resource-specific env
  58. switch opts.Infra.Kind {
  59. case types.InfraECR:
  60. env = opts.ECR.AttachECREnv(env)
  61. case types.InfraEKS:
  62. env = opts.EKS.AttachEKSEnv(env)
  63. case types.InfraGCR:
  64. env = opts.GCR.AttachGCREnv(env)
  65. case types.InfraGKE:
  66. env = opts.GKE.AttachGKEEnv(env)
  67. case types.InfraDOCR:
  68. env = opts.DOCR.AttachDOCREnv(env)
  69. case types.InfraDOKS:
  70. env = opts.DOKS.AttachDOKSEnv(env)
  71. }
  72. return &batchv1.Job{
  73. ObjectMeta: metav1.ObjectMeta{
  74. Name: fmt.Sprintf("%s-%s", string(opts.OperationKind), opts.Infra.GetUniqueName()),
  75. Namespace: opts.ProvJobNamespace,
  76. Labels: labels,
  77. },
  78. Spec: batchv1.JobSpec{
  79. TTLSecondsAfterFinished: &ttl,
  80. BackoffLimit: &backoffLimit,
  81. Template: v1.PodTemplateSpec{
  82. ObjectMeta: metav1.ObjectMeta{
  83. Labels: labels,
  84. },
  85. Spec: v1.PodSpec{
  86. RestartPolicy: v1.RestartPolicyNever,
  87. ImagePullSecrets: imagePullSecrets,
  88. Containers: []v1.Container{
  89. {
  90. Name: "provisioner",
  91. Image: "gcr.io/porter-dev-273614/provisioner:" + opts.ProvImageTag,
  92. ImagePullPolicy: v1.PullAlways,
  93. Args: []string{
  94. string(opts.OperationKind),
  95. string(opts.Infra.Kind),
  96. },
  97. Env: env,
  98. },
  99. },
  100. },
  101. },
  102. },
  103. }, nil
  104. }
  105. func GetTFEnv(opts *ProvisionOpts) []v1.EnvVar {
  106. env := make([]v1.EnvVar, 0)
  107. env = append(env, v1.EnvVar{
  108. Name: "TF_DIR",
  109. Value: "./terraform",
  110. })
  111. env = append(env, v1.EnvVar{
  112. Name: "TF_ORG_ID",
  113. Value: opts.Infra.GetUniqueName(),
  114. })
  115. env = append(env, v1.EnvVar{
  116. Name: "TF_BACKEND_URL",
  117. Value: opts.TFHTTPBackendURL,
  118. })
  119. env = append(env, v1.EnvVar{
  120. Name: "CRED_EXCHANGE_ENDPOINT",
  121. Value: opts.CredentialExchange.CredExchangeEndpoint,
  122. })
  123. env = append(env, v1.EnvVar{
  124. Name: "CRED_EXCHANGE_ID",
  125. Value: fmt.Sprintf("%d", opts.CredentialExchange.CredExchangeID),
  126. })
  127. env = append(env, v1.EnvVar{
  128. Name: "CRED_EXCHANGE_TOKEN",
  129. Value: opts.CredentialExchange.CredExchangeToken,
  130. })
  131. env = append(env, v1.EnvVar{
  132. Name: "VAULT_TOKEN",
  133. Value: opts.CredentialExchange.VaultToken,
  134. })
  135. return env
  136. }