fix: user ip in user datasource is populated with localDnsRecord (#57)

* fix: user `ip` in user datasource is populated with `localDnsRecord`

* add test
This commit is contained in:
Mateusz Filipowicz
2025-03-16 14:08:54 +01:00
committed by GitHub
parent e9600c6e06
commit ff14bd365f
4 changed files with 71 additions and 11 deletions

View File

@@ -3,7 +3,9 @@ package acctest
import (
"context"
"fmt"
"github.com/apparentlymart/go-cidr/cidr"
"github.com/hashicorp/terraform-plugin-testing/helper/acctest"
"net"
"testing"
"github.com/filipowm/go-unifi/unifi"
@@ -30,7 +32,63 @@ func TestAccDataUser_default(t *testing.T) {
Steps: []resource.TestStep{
{
Config: testAccDataUserConfig_default(mac),
Check: resource.ComposeTestCheckFunc(),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("data.unifi_user.test", "id"),
resource.TestCheckResourceAttr("data.unifi_user.test", "mac", mac),
resource.TestCheckResourceAttr("data.unifi_user.test", "name", name),
),
},
},
})
}
func TestAccDataUser_localDnsRecord(t *testing.T) {
mac, unallocateTestMac := pt.AllocateTestMac(t)
defer unallocateTestMac()
name := acctest.RandomWithPrefix("tfacc")
ctx := context.Background()
n, err := testClient.ListNetwork(ctx, "default")
if err != nil {
t.Fatal(err)
}
if len(n) == 0 {
t.Fatal("no networks found, but default should exist")
}
_, subnet, err := net.ParseCIDR(n[0].IPSubnet)
if err != nil {
t.Fatal(err)
}
ip, err := cidr.Host(subnet, 1)
if err != nil {
t.Fatal(err)
}
AcceptanceTest(t, AcceptanceTestCase{
VersionConstraint: ">= 7.3",
PreCheck: func() {
_, err = testClient.CreateUser(ctx, "default", &unifi.User{
MAC: mac,
Name: name,
UseFixedIP: true,
NetworkID: n[0].ID,
FixedIP: ip.String(),
LocalDNSRecord: "myuser.example.com",
LocalDNSRecordEnabled: true,
Note: name,
})
if err != nil {
t.Fatal(err)
}
},
Steps: []resource.TestStep{
{
Config: testAccDataUserConfig_default(mac),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("data.unifi_user.test", "id"),
resource.TestCheckResourceAttr("data.unifi_user.test", "mac", mac),
resource.TestCheckResourceAttr("data.unifi_user.test", "name", name),
resource.TestCheckResourceAttr("data.unifi_user.test", "local_dns_record", "myuser.example.com"),
resource.TestCheckResourceAttr("data.unifi_user.test", "fixed_ip", ip.String()),
),
},
},
})

View File

@@ -66,7 +66,7 @@ var (
dnsDataSourceFilterErrorRegex = regexp.MustCompile(`[filter.name,filter.record]`)
)
func TestDNSRecordDataSource_failWithoutFilter(t *testing.T) {
func TestDNSRecordDataSource_errorWithoutFilter(t *testing.T) {
AcceptanceTest(t, AcceptanceTestCase{
MinVersion: base.ControllerVersionDnsRecords,

View File

@@ -54,7 +54,7 @@ func DataUser() *schema.Resource {
Computed: true,
},
"fixed_ip": {
Description: "fixed IPv4 address set for this user.",
Description: "Fixed IPv4 address set for this user.",
Type: schema.TypeString,
Computed: true,
},
@@ -123,18 +123,18 @@ func dataUserRead(ctx context.Context, d *schema.ResourceData, meta interface{})
localDnsRecord = resp.LocalDNSRecord
}
d.SetId(resp.ID)
d.Set("site", site)
d.Set("mac", resp.MAC)
d.Set("name", resp.Name)
d.Set("user_group_id", resp.UserGroupID)
d.Set("note", resp.Note)
d.Set("fixed_ip", fixedIP)
d.Set("network_id", resp.NetworkID)
d.Set("blocked", resp.Blocked)
d.Set("dev_id_override", resp.DevIdOverride)
d.Set("fixed_ip", fixedIP)
d.Set("hostname", resp.Hostname)
d.Set("ip", resp.IP)
d.Set("ip", localDnsRecord)
d.Set("local_dns_record", localDnsRecord)
d.Set("mac", resp.MAC)
d.Set("name", resp.Name)
d.Set("network_id", resp.NetworkID)
d.Set("note", resp.Note)
d.Set("site", site)
d.Set("user_group_id", resp.UserGroupID)
return nil
}

View File

@@ -12,6 +12,8 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
// TODO add validation: api.err.LocalDnsRecordRequiresFixedIp
// TODO require v7.3+ for local dns record
func ResourceUser() *schema.Resource {
return &schema.Resource{
Description: "The `unifi_user` resource manages network clients in the UniFi controller, which are identified by their unique MAC addresses.\n\n" +