cloudflare.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package cloudflare
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/cloudflare/cloudflare-go"
  6. "github.com/porter-dev/porter/internal/integrations/dns"
  7. )
  8. // RecordType strongly types cloudflare dns entry types
  9. type RecordType string
  10. const (
  11. // RecordType_A declares an A record type for cloudflare
  12. RecordType_A RecordType = "A"
  13. // RecordType_CNAME declares an CNME record type for cloudflare
  14. RecordType_CNAME = "CNAME"
  15. )
  16. // TTL sets the TTL for Cloudflare DNS records
  17. const TTL = 300
  18. // Client is a struct wrapper around the cloudflare client
  19. type Client struct {
  20. zoneID string
  21. client *cloudflare.API
  22. }
  23. // NewClient creates a new cloudflare API client
  24. func NewClient(apiToken string, runDomain string) (Client, error) {
  25. client, err := cloudflare.NewWithAPIToken(apiToken)
  26. if err != nil {
  27. return Client{}, err
  28. }
  29. zoneID, err := client.ZoneIDByName(runDomain)
  30. if err != nil {
  31. return Client{}, err
  32. }
  33. return Client{client: client, zoneID: zoneID}, nil
  34. }
  35. // CreateCNAMERecord creates a new CNAME record for the nameserver
  36. //
  37. // The method ignores record.RootDomain in favor of the zoneID derived from c.runDomain
  38. func (c Client) CreateCNAMERecord(record dns.Record) error {
  39. proxy := false
  40. cloudflareRecord := cloudflare.CreateDNSRecordParams{
  41. Name: record.Name,
  42. Type: string(RecordType_CNAME),
  43. Content: record.Value,
  44. TTL: TTL,
  45. Proxied: &proxy,
  46. }
  47. _, err := c.client.CreateDNSRecord(context.Background(), cloudflare.ZoneIdentifier(c.zoneID), cloudflareRecord)
  48. if err != nil {
  49. return fmt.Errorf("failed to create CNAME dns record: %w", err)
  50. }
  51. return err
  52. }
  53. // CreateARecord creates a new A record for the nameserver
  54. //
  55. // The method ignores record.RootDomain in favor of the zoneID derived from c.runDomain
  56. func (c Client) CreateARecord(record dns.Record) error {
  57. proxy := false
  58. cloudflareRecord := cloudflare.CreateDNSRecordParams{
  59. Name: record.Name,
  60. Type: string(RecordType_A),
  61. Content: record.Value,
  62. TTL: TTL,
  63. Proxied: &proxy,
  64. }
  65. _, err := c.client.CreateDNSRecord(context.Background(), cloudflare.ZoneIdentifier(c.zoneID), cloudflareRecord)
  66. if err != nil {
  67. return fmt.Errorf("failed to create A dns record: %w", err)
  68. }
  69. return nil
  70. }