dns_record_handler.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package api
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "net/url"
  7. "github.com/porter-dev/porter/internal/forms"
  8. "github.com/porter-dev/porter/internal/kubernetes"
  9. "github.com/porter-dev/porter/internal/kubernetes/domain"
  10. )
  11. // HandleCreateDNSRecord creates a new DNS record
  12. func (app *App) HandleCreateDNSRecord(w http.ResponseWriter, r *http.Request) {
  13. vals, err := url.ParseQuery(r.URL.RawQuery)
  14. if err != nil {
  15. app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
  16. return
  17. }
  18. // get the filter options
  19. form := &forms.CreateDomainForm{
  20. K8sForm: &forms.K8sForm{
  21. OutOfClusterConfig: &kubernetes.OutOfClusterConfig{
  22. Repo: app.Repo,
  23. DigitalOceanOAuth: app.DOConf,
  24. },
  25. },
  26. }
  27. form.PopulateK8sOptionsFromQueryParams(vals, app.Repo.Cluster)
  28. if err := json.NewDecoder(r.Body).Decode(form); err != nil {
  29. app.handleErrorFormDecoding(err, ErrUserDecode, w)
  30. return
  31. }
  32. // validate the form
  33. if err := app.validator.Struct(form); err != nil {
  34. app.handleErrorFormValidation(err, ErrK8sValidate, w)
  35. return
  36. }
  37. // create a new agent
  38. var agent *kubernetes.Agent
  39. if app.ServerConf.IsTesting {
  40. agent = app.TestAgents.K8sAgent
  41. } else {
  42. agent, err = kubernetes.GetAgentOutOfClusterConfig(form.OutOfClusterConfig)
  43. }
  44. endpoint, found, err := domain.GetNGINXIngressServiceIP(agent.Clientset)
  45. if !found {
  46. app.handleErrorInternal(fmt.Errorf("target cluster does not have nginx ingress"), w)
  47. return
  48. }
  49. createDomain := domain.CreateDNSRecordConfig{
  50. ReleaseName: form.ReleaseName,
  51. RootDomain: app.ServerConf.AppRootDomain,
  52. Endpoint: endpoint,
  53. }
  54. record := createDomain.NewDNSRecordForEndpoint()
  55. record, err = app.Repo.DNSRecord.CreateDNSRecord(record)
  56. if err != nil {
  57. app.handleErrorDataWrite(err, w)
  58. return
  59. }
  60. _record := domain.DNSRecord(*record)
  61. err = _record.CreateDomain(app.IngressAgent.Clientset)
  62. if err != nil {
  63. app.handleErrorInternal(err, w)
  64. }
  65. w.WriteHeader(http.StatusCreated)
  66. if err := json.NewEncoder(w).Encode(record.Externalize()); err != nil {
  67. app.handleErrorFormDecoding(err, ErrK8sDecode, w)
  68. return
  69. }
  70. }