Skip to content

Commit

Permalink
tailscale: use V2 client for dns split nameservers resource
Browse files Browse the repository at this point in the history
Updates tailscale/corp#21867

Signed-off-by: Percy Wegmann <percy@tailscale.com>
  • Loading branch information
oxtoacart committed Aug 26, 2024
1 parent 548482c commit dd8a686
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 24 deletions.
2 changes: 1 addition & 1 deletion docs/resources/dns_split_nameservers.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ resource "tailscale_dns_split_nameservers" "sample_split_nameservers" {

### Required

- `domain` (String) Domain to configure split DNS for. Requests for this domain will be resolved using the provided nameservers.
- `domain` (String) Domain to configure split DNS for. Requests for this domain will be resolved using the provided nameservers. Changing this will force the resource to be recreated.
- `nameservers` (Set of String) Devices on your network will use these nameservers to resolve DNS names. IPv4 or IPv6 addresses are accepted.

### Read-Only
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ require (
github.com/stretchr/testify v1.9.0
github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a
github.com/tailscale/tailscale-client-go v1.17.1-0.20240729175651-90a1e935cc19
github.com/tailscale/tailscale-client-go/v2 v2.0.0-20240819223802-3a9fb56052db
github.com/tailscale/tailscale-client-go/v2 v2.0.0-20240821114300-27aa0bfb4219
golang.org/x/tools v0.24.0
tailscale.com v1.72.0
)
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,10 @@ github.com/tailscale/tailscale-client-go v1.17.1-0.20240729175651-90a1e935cc19 h
github.com/tailscale/tailscale-client-go v1.17.1-0.20240729175651-90a1e935cc19/go.mod h1:jbwJyHniK3nyLttwcDTXnfdDQEnADvc4VMOP8hZWnR0=
github.com/tailscale/tailscale-client-go/v2 v2.0.0-20240819223802-3a9fb56052db h1:sckiiaymnxDtxozA8jGc2cAU1X/0vEmKULvAP8fTS1o=
github.com/tailscale/tailscale-client-go/v2 v2.0.0-20240819223802-3a9fb56052db/go.mod h1:i/MSgQ71kdyh1Wdp50XxrIgtsyO4uZ2SZSPd83lGKHM=
github.com/tailscale/tailscale-client-go/v2 v2.0.0-20240820184537-d8366c1105f5 h1:4KAE8ArCbcmTWCn1jMnhos+G4jMhGAJt76rVAWIO6D4=
github.com/tailscale/tailscale-client-go/v2 v2.0.0-20240820184537-d8366c1105f5/go.mod h1:i/MSgQ71kdyh1Wdp50XxrIgtsyO4uZ2SZSPd83lGKHM=
github.com/tailscale/tailscale-client-go/v2 v2.0.0-20240821114300-27aa0bfb4219 h1:j51CReIxNS/7ZrFmn5zm5IYoIBg8Or8BL6G3jFC/ZgY=
github.com/tailscale/tailscale-client-go/v2 v2.0.0-20240821114300-27aa0bfb4219/go.mod h1:i/MSgQ71kdyh1Wdp50XxrIgtsyO4uZ2SZSPd83lGKHM=
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI=
github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
Expand Down
37 changes: 15 additions & 22 deletions tailscale/resource_dns_split_nameservers.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,25 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"

"github.com/tailscale/tailscale-client-go/tailscale"
tsclient "github.com/tailscale/tailscale-client-go/v2"
)

func resourceDNSSplitNameservers() *schema.Resource {
return &schema.Resource{
Description: "The dns_split_nameservers resource allows you to configure split DNS nameservers for your Tailscale network. See https://tailscale.com/kb/1054/dns for more information.",
ReadContext: resourceSplitDNSNameserversRead,
CreateContext: resourceSplitDNSNameserversCreate,
UpdateContext: resourceSplitDNSNameserversUpdate,
CreateContext: resourceSplitDNSNameserversCreateOrUpdate,
UpdateContext: resourceSplitDNSNameserversCreateOrUpdate,
DeleteContext: resourceSplitDNSNameserversDelete,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
Schema: map[string]*schema.Schema{
"domain": {
Type: schema.TypeString,
Description: "Domain to configure split DNS for. Requests for this domain will be resolved using the provided nameservers.",
Description: "Domain to configure split DNS for. Requests for this domain will be resolved using the provided nameservers. Changing this will force the resource to be recreated.",
Required: true,
ForceNew: true,
},
"nameservers": {
Type: schema.TypeSet,
Expand All @@ -38,8 +39,8 @@ func resourceDNSSplitNameservers() *schema.Resource {
}

func resourceSplitDNSNameserversRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
client := m.(*Clients).V1
splitDNS, err := client.SplitDNS(ctx)
client := m.(*Clients).V2
splitDNS, err := client.DNS().SplitDNS(ctx)
if err != nil {
return diagnosticsError(err, "Failed to fetch split DNS configs")
}
Expand All @@ -59,47 +60,39 @@ func resourceSplitDNSNameserversRead(ctx context.Context, d *schema.ResourceData
return nil
}

func resourceSplitDNSNameserversCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
client := m.(*Clients).V1
func resourceSplitDNSNameserversCreateOrUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
client := m.(*Clients).V2
nameserversSet := d.Get("nameservers").(*schema.Set)
domain := d.Get("domain").(string)

nameserversList := nameserversSet.List()

req := make(tailscale.SplitDnsRequest)
req := make(tsclient.SplitDNSRequest)
var nameservers []string
for _, nameserver := range nameserversList {
nameservers = append(nameservers, nameserver.(string))
}
req[domain] = nameservers

// Return value is not useful to us here, ignore.
if _, err := client.UpdateSplitDNS(ctx, req); err != nil {
if _, err := client.DNS().UpdateSplitDNS(ctx, req); err != nil {
return diagnosticsError(err, "Failed to set dns split nameservers")
}

d.SetId(domain)
return resourceSplitDNSNameserversRead(ctx, d, m)
}

func resourceSplitDNSNameserversUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
if !d.HasChange("nameservers") {
return resourceSplitDNSNameserversRead(ctx, d, m)
}

return resourceSplitDNSNameserversCreate(ctx, d, m)
}

func resourceSplitDNSNameserversDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
client := m.(*Clients).V1
client := m.(*Clients).V2
domain := d.Get("domain").(string)

req := make(tailscale.SplitDnsRequest)
req := make(tsclient.SplitDNSRequest)
req[domain] = []string{}

// Return value is not useful to us here, ignore.
if _, err := client.UpdateSplitDNS(ctx, req); err != nil {
return diagnosticsError(err, "Failed to set dns split nameservers")
if _, err := client.DNS().UpdateSplitDNS(ctx, req); err != nil {
return diagnosticsError(err, "Failed to delete dns split nameservers")
}

return nil
Expand Down
94 changes: 94 additions & 0 deletions tailscale/resource_dns_split_nameservers_test.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package tailscale_test

import (
"context"
"fmt"
"net/http"
"testing"

"github.com/google/go-cmp/cmp"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"

tsclient "github.com/tailscale/tailscale-client-go/v2"
)

const testSplitNameservers = `
Expand All @@ -27,3 +33,91 @@ func TestProvider_TailscaleSplitDNSNameservers(t *testing.T) {
},
})
}

func TestAccTailscaleDNSSplitNameservers(t *testing.T) {
const resourceName = "tailscale_dns_split_nameservers.test_nameservers"

const testSplitNameserversCreate = `
resource "tailscale_dns_split_nameservers" "test_nameservers" {
domain = "example.com"
nameservers = ["1.2.3.4", "4.5.6.7"]
}`

const testSplitNameserversUpdate = `
resource "tailscale_dns_split_nameservers" "test_nameservers" {
domain = "sub.example.com"
nameservers = ["8.8.9.9"]
}`

const testSplitNameserversUpdateSameDomain = `
resource "tailscale_dns_split_nameservers" "test_nameservers" {
domain = "sub.example.com"
nameservers = ["8.8.7.7", "8.8.9.9"]
}`

checkProperties := func(expected tsclient.SplitDNSResponse) func(client *tsclient.Client, rs *terraform.ResourceState) error {
return func(client *tsclient.Client, rs *terraform.ResourceState) error {
actual, err := client.DNS().SplitDNS(context.Background())
if err != nil {
return err
}

if diff := cmp.Diff(actual, expected); diff != "" {
return fmt.Errorf("wrong split dns: (-got+want) \n%s", diff)
}

return nil
}
}

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProviderFactories: testAccProviderFactories(t),
CheckDestroy: checkResourceDestroyed(resourceName, checkProperties(tsclient.SplitDNSResponse{})),
Steps: []resource.TestStep{
{
Config: testSplitNameserversCreate,
Check: resource.ComposeTestCheckFunc(
checkResourceRemoteProperties(resourceName,
checkProperties(tsclient.SplitDNSResponse{
"example.com": []string{"1.2.3.4", "4.5.6.7"},
}),
),
resource.TestCheckResourceAttr(resourceName, "domain", "example.com"),
resource.TestCheckTypeSetElemAttr(resourceName, "nameservers.*", "1.2.3.4"),
resource.TestCheckTypeSetElemAttr(resourceName, "nameservers.*", "4.5.6.7"),
),
},
{
Config: testSplitNameserversUpdate,
Check: resource.ComposeTestCheckFunc(
checkResourceRemoteProperties(resourceName,
checkProperties(tsclient.SplitDNSResponse{
"sub.example.com": []string{"8.8.9.9"},
}),
),
resource.TestCheckResourceAttr(resourceName, "domain", "sub.example.com"),
resource.TestCheckTypeSetElemAttr(resourceName, "nameservers.*", "8.8.9.9"),
),
},
{
Config: testSplitNameserversUpdateSameDomain,
Check: resource.ComposeTestCheckFunc(
checkResourceRemoteProperties(resourceName,
checkProperties(tsclient.SplitDNSResponse{
"sub.example.com": []string{"8.8.7.7", "8.8.9.9"},
}),
),
resource.TestCheckResourceAttr(resourceName, "domain", "sub.example.com"),
resource.TestCheckTypeSetElemAttr(resourceName, "nameservers.*", "8.8.7.7"),
resource.TestCheckTypeSetElemAttr(resourceName, "nameservers.*", "8.8.9.9"),
),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

0 comments on commit dd8a686

Please sign in to comment.