Add dev_id_override to unifi_user

Reimplementation of #147
This commit is contained in:
Joshua Spence
2021-08-25 08:52:09 -04:00
committed by Paul Tyng
parent 3a122dcdd7
commit 166600cac3
5 changed files with 117 additions and 11 deletions

View File

@@ -245,6 +245,12 @@ func (c *lazyClient) UnblockUserByMAC(ctx context.Context, site, mac string) err
}
return c.inner.UnblockUserByMAC(ctx, site, mac)
}
func (c *lazyClient) OverrideUserFingerprint(ctx context.Context, site, mac string, devIdOveride int) error {
if err := c.init(ctx); err != nil {
return err
}
return c.inner.OverrideUserFingerprint(ctx, site, mac, devIdOveride)
}
func (c *lazyClient) ListFirewallGroup(ctx context.Context, site string) ([]unifi.FirewallGroup, error) {
if err := c.init(ctx); err != nil {
return nil, err

View File

@@ -3,9 +3,10 @@ package provider
import (
"context"
"fmt"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"strings"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/go-version"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/paultyng/go-unifi/unifi"
@@ -173,6 +174,7 @@ type unifiClient interface {
CreateUser(ctx context.Context, site string, d *unifi.User) (*unifi.User, error)
BlockUserByMAC(ctx context.Context, site, mac string) error
UnblockUserByMAC(ctx context.Context, site, mac string) error
OverrideUserFingerprint(ctx context.Context, site, mac string, devIdOveride int) error
UpdateUser(ctx context.Context, site string, d *unifi.User) (*unifi.User, error)
DeleteUserByMAC(ctx context.Context, site, mac string) error

View File

@@ -12,7 +12,7 @@ import (
)
func TestAccNetwork_basic(t *testing.T) {
name := acctest.RandomWithPrefix("tfacc")
name := acctest.RandomWithPrefix("tfacc")
vlanID1 := getTestVLAN(t)
vlanID2 := getTestVLAN(t)
@@ -50,7 +50,7 @@ func TestAccNetwork_basic(t *testing.T) {
}
func TestAccNetwork_weird_cidr(t *testing.T) {
name := acctest.RandomWithPrefix("tfacc")
name := acctest.RandomWithPrefix("tfacc")
vlanID := getTestVLAN(t)
resource.ParallelTest(t, resource.TestCase{
@@ -70,7 +70,7 @@ func TestAccNetwork_weird_cidr(t *testing.T) {
}
func TestAccNetwork_dhcp_dns(t *testing.T) {
name := acctest.RandomWithPrefix("tfacc")
name := acctest.RandomWithPrefix("tfacc")
vlanID := getTestVLAN(t)
resource.ParallelTest(t, resource.TestCase{
@@ -110,7 +110,7 @@ func TestAccNetwork_dhcp_dns(t *testing.T) {
}
func TestAccNetwork_dhcp_boot(t *testing.T) {
name := acctest.RandomWithPrefix("tfacc")
name := acctest.RandomWithPrefix("tfacc")
vlanID := getTestVLAN(t)
resource.ParallelTest(t, resource.TestCase{
@@ -130,7 +130,7 @@ func TestAccNetwork_dhcp_boot(t *testing.T) {
}
func TestAccNetwork_v6(t *testing.T) {
name := acctest.RandomWithPrefix("tfacc")
name := acctest.RandomWithPrefix("tfacc")
vlanID1 := getTestVLAN(t)
vlanID2 := getTestVLAN(t)
@@ -161,7 +161,7 @@ func TestAccNetwork_v6(t *testing.T) {
}
func TestAccNetwork_wan(t *testing.T) {
name := acctest.RandomWithPrefix("tfacc")
name := acctest.RandomWithPrefix("tfacc")
resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { preCheck(t) },
@@ -203,7 +203,7 @@ func TestAccNetwork_wan(t *testing.T) {
}
func TestAccNetwork_differentSite(t *testing.T) {
name := acctest.RandomWithPrefix("tfacc")
name := acctest.RandomWithPrefix("tfacc")
vlanID1 := getTestVLAN(t)
vlanID2 := getTestVLAN(t)
@@ -241,7 +241,7 @@ func TestAccNetwork_differentSite(t *testing.T) {
}
func TestAccNetwork_importByName(t *testing.T) {
name := acctest.RandomWithPrefix("tfacc")
name := acctest.RandomWithPrefix("tfacc")
vlanID1 := getTestVLAN(t)
vlanID2 := getTestVLAN(t)
vlanID3 := getTestVLAN(t)

View File

@@ -3,6 +3,7 @@ package provider
import (
"context"
"errors"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -78,6 +79,11 @@ func resourceUser() *schema.Resource {
Type: schema.TypeBool,
Optional: true,
},
"dev_id_override": {
Description: "Override the device fingerprint.",
Type: schema.TypeInt,
Optional: true,
},
// these are "meta" attributes that control TF UX
"allow_existing": {
@@ -155,6 +161,18 @@ func resourceUserCreate(ctx context.Context, d *schema.ResourceData, meta interf
}
}
if d.HasChange("dev_id_override") {
mac := d.Get("mac").(string)
device := d.Get("dev_id_override").(int)
err := c.c.OverrideUserFingerprint(context.TODO(), site, mac, device)
if err != nil {
return diag.FromErr(err)
}
resp.DevIdOverride = device
}
return resourceUserSetResourceData(resp, d, site)
}
@@ -170,7 +188,8 @@ func resourceUserGetResourceData(d *schema.ResourceData) (*unifi.User, error) {
UseFixedIP: fixedIP != "",
NetworkID: d.Get("network_id").(string),
// not sure if this matters/works
Blocked: d.Get("blocked").(bool),
Blocked: d.Get("blocked").(bool),
DevIdOverride: d.Get("dev_id_override").(int),
}, nil
}
@@ -224,6 +243,8 @@ func resourceUserRead(ctx context.Context, d *schema.ResourceData, meta interfac
return diag.FromErr(err)
}
// TODO: should this read the override fingerprint?
resp.IP = macResp.IP
return resourceUserSetResourceData(resp, d, site)
@@ -252,6 +273,20 @@ func resourceUserUpdate(ctx context.Context, d *schema.ResourceData, meta interf
}
}
if d.HasChange("dev_id_override") {
mac := d.Get("mac").(string)
device := d.Get("dev_id_override").(int)
err := c.c.OverrideUserFingerprint(context.TODO(), site, mac, device)
if err != nil {
return diag.FromErr(err)
}
if !d.HasChangesExcept("dev_id_override") {
return nil
}
}
req, err := resourceUserGetResourceData(d)
if err != nil {
return diag.FromErr(err)

View File

@@ -59,7 +59,7 @@ func TestAccUser_basic(t *testing.T) {
}
func TestAccUser_fixed_ip(t *testing.T) {
mac := generateTestMac()
mac := generateTestMac()
vlanID := 301
resource.ParallelTest(t, resource.TestCase{
@@ -200,6 +200,59 @@ func TestAccUser_existing_mac_deny(t *testing.T) {
})
}
func TestAccUser_fingerprint(t *testing.T) {
testMAC := generateTestMac()
resource.ParallelTest(t, resource.TestCase{
ProviderFactories: providerFactories,
CheckDestroy: testCheckUserDestroy,
Steps: []resource.TestStep{
{
Config: testAccUserConfig_fingerprint(testMAC, "tfacc", 123),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("unifi_user.test", "dev_id_override", "123"),
),
},
userImportStep("unifi_user.test"),
{
Config: testAccUserConfig_fingerprint(testMAC, "tfacc", 456),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("unifi_user.test", "dev_id_override", "456"),
),
},
userImportStep("unifi_user.test"),
{
Config: testAccUserConfig(testMAC, "tfacc", ""),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("unifi_user.test", "dev_id_override", "0"),
),
},
userImportStep("unifi_user.test"),
},
})
}
func testCheckUserDestroy(s *terraform.State) error {
for _, rs := range s.RootModule().Resources {
if rs.Type != "unifi_user" {
continue
}
_, err := testClient.GetUser(context.Background(), "default", rs.Primary.ID)
if err == nil {
return fmt.Errorf("User still exists: %s", rs.Primary.ID)
}
if _, ok := err.(*unifi.NotFoundError); ok {
continue
}
return err
}
return nil
}
func testAccUserConfig(mac, name, note string) string {
return fmt.Sprintf(`
resource "unifi_user" "test" {
@@ -266,3 +319,13 @@ resource "unifi_user" "test" {
}
`, mac, name, note, allow, skip)
}
func testAccUserConfig_fingerprint(mac, name string, devIdOverride int) string {
return fmt.Sprintf(`
resource "unifi_user" "test" {
mac = "%s"
name = "%s"
dev_id_override = %d
}
`, mac, name, devIdOverride)
}