diff --git a/internal/provider/acctest/resource_setting_magic_site_to_site_vpn_test.go b/internal/provider/acctest/resource_setting_magic_site_to_site_vpn_test.go new file mode 100644 index 0000000..1fb7a5c --- /dev/null +++ b/internal/provider/acctest/resource_setting_magic_site_to_site_vpn_test.go @@ -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) +} diff --git a/internal/provider/provider_v2.go b/internal/provider/provider_v2.go index 70e5ee1..ab626a1 100644 --- a/internal/provider/provider_v2.go +++ b/internal/provider/provider_v2.go @@ -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, } } diff --git a/internal/provider/settings/resource_setting_magic_site_to_site_vpn.go b/internal/provider/settings/resource_setting_magic_site_to_site_vpn.go new file mode 100644 index 0000000..00331b3 --- /dev/null +++ b/internal/provider/settings/resource_setting_magic_site_to_site_vpn.go @@ -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 +}