feat: add magic site-to-site VPN setting resource support with unifi_setting_magic_site_to_site_vpn resource (#35)

* feat: add magic site-to-site VPN setting resource support with `unifi_setting_magic_site_to_site_vpn` resource

* do not use default

* require controller version >=7.4 for magic site to site vpn tests
This commit is contained in:
Mateusz Filipowicz
2025-03-01 23:12:06 +01:00
committed by GitHub
parent f815ffef79
commit a78667e669
3 changed files with 134 additions and 2 deletions

View File

@@ -0,0 +1,48 @@
package acctest
import (
"fmt"
pt "github.com/filipowm/terraform-provider-unifi/internal/provider/testing"
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
"github.com/hashicorp/terraform-plugin-testing/plancheck"
"sync"
"testing"
)
var settingMagicSiteToSiteVpnLock = &sync.Mutex{}
func TestAccSettingMagicSiteToSiteVpn(t *testing.T) {
AcceptanceTest(t, AcceptanceTestCase{
VersionConstraint: ">= 7.4",
Lock: settingMagicSiteToSiteVpnLock,
Steps: []resource.TestStep{
{
Config: testAccSettingMagicSiteToSiteVpnConfig(true),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("unifi_setting_magic_site_to_site_vpn.test", "id"),
resource.TestCheckResourceAttr("unifi_setting_magic_site_to_site_vpn.test", "site", "default"),
resource.TestCheckResourceAttr("unifi_setting_magic_site_to_site_vpn.test", "enabled", "true"),
),
ConfigPlanChecks: pt.CheckResourceActions("unifi_setting_magic_site_to_site_vpn.test", plancheck.ResourceActionCreate),
},
pt.ImportStepWithSite("unifi_setting_magic_site_to_site_vpn.test"),
{
Config: testAccSettingMagicSiteToSiteVpnConfig(false),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("unifi_setting_magic_site_to_site_vpn.test", "id"),
resource.TestCheckResourceAttr("unifi_setting_magic_site_to_site_vpn.test", "site", "default"),
resource.TestCheckResourceAttr("unifi_setting_magic_site_to_site_vpn.test", "enabled", "false"),
),
ConfigPlanChecks: pt.CheckResourceActions("unifi_setting_magic_site_to_site_vpn.test", plancheck.ResourceActionUpdate),
},
},
})
}
func testAccSettingMagicSiteToSiteVpnConfig(enabled bool) string {
return fmt.Sprintf(`
resource "unifi_setting_magic_site_to_site_vpn" "test" {
enabled = %t
}
`, enabled)
}

View File

@@ -104,8 +104,8 @@ func (p *unifiProvider) Configure(ctx context.Context, req provider.ConfigureReq
path.Root("api_url"),
"Unknown UniFi Controller API URL",
"The provider cannot create the UniFi Controller API client as there is an unknown configuration value "+
"for the API endpoint. Either target apply the source of the value first, set the value statically in "+
"the configuration, or use the UNIFI_API environment variable.",
"for the API endpoint. Either target apply the source of the value first, set the value statically in "+
"the configuration, or use the UNIFI_API environment variable.",
)
}
@@ -177,6 +177,7 @@ func (p *unifiProvider) Resources(_ context.Context) []func() resource.Resource
settings.NewAutoSpeedtestResource,
settings.NewCountryResource,
settings.NewLocaleResource,
settings.NewMagicSiteToSiteVpnResource,
}
}

View File

@@ -0,0 +1,83 @@
package settings
import (
"context"
"github.com/filipowm/go-unifi/unifi"
"github.com/filipowm/terraform-provider-unifi/internal/provider/base"
"github.com/hashicorp/terraform-plugin-framework/diag"
"github.com/hashicorp/terraform-plugin-framework/resource"
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
"github.com/hashicorp/terraform-plugin-framework/types"
)
type magicSiteToSiteVpnModel struct {
base.Model
Enabled types.Bool `tfsdk:"enabled"`
}
func (d *magicSiteToSiteVpnModel) AsUnifiModel() (interface{}, diag.Diagnostics) {
diags := diag.Diagnostics{}
model := &unifi.SettingMagicSiteToSiteVpn{
ID: d.ID.ValueString(),
Enabled: d.Enabled.ValueBool(),
}
return model, diags
}
func (d *magicSiteToSiteVpnModel) Merge(other interface{}) diag.Diagnostics {
diags := diag.Diagnostics{}
model, ok := other.(*unifi.SettingMagicSiteToSiteVpn)
if !ok {
diags.AddError("Cannot merge", "Cannot merge type that is not *unifi.SettingMagicSiteToSiteVpn")
return diags
}
d.ID = types.StringValue(model.ID)
d.Enabled = types.BoolValue(model.Enabled)
return diags
}
var (
_ base.ResourceModel = &magicSiteToSiteVpnModel{}
_ resource.Resource = &magicSiteToSiteVpnResource{}
_ resource.ResourceWithConfigure = &magicSiteToSiteVpnResource{}
_ resource.ResourceWithImportState = &magicSiteToSiteVpnResource{}
)
type magicSiteToSiteVpnResource struct {
*BaseSettingResource[*magicSiteToSiteVpnModel]
}
func (r *magicSiteToSiteVpnResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) {
resp.Schema = schema.Schema{
MarkdownDescription: "Manages Magic Site to Site VPN settings for a UniFi site.",
Attributes: map[string]schema.Attribute{
"id": base.ID(),
"site": base.SiteAttribute(),
"enabled": schema.BoolAttribute{
MarkdownDescription: "Whether the Magic Site to Site VPN is enabled.",
Required: true,
},
},
}
}
func NewMagicSiteToSiteVpnResource() resource.Resource {
r := &magicSiteToSiteVpnResource{}
r.BaseSettingResource = NewBaseSettingResource(
"unifi_setting_magic_site_to_site_vpn",
func() *magicSiteToSiteVpnModel { return &magicSiteToSiteVpnModel{} },
func(ctx context.Context, client *base.Client, site string) (interface{}, error) {
return client.GetSettingMagicSiteToSiteVpn(ctx, site)
},
func(ctx context.Context, client *base.Client, site string, body interface{}) (interface{}, error) {
return client.UpdateSettingMagicSiteToSiteVpn(ctx, site, body.(*unifi.SettingMagicSiteToSiteVpn))
},
)
return r
}