@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user