diff --git a/internal/provider/acctest/resource_setting_network_optimization_test.go b/internal/provider/acctest/resource_setting_network_optimization_test.go new file mode 100644 index 0000000..7a26417 --- /dev/null +++ b/internal/provider/acctest/resource_setting_network_optimization_test.go @@ -0,0 +1,47 @@ +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 settingNetworkOptimizationLock = &sync.Mutex{} + +func TestAccSettingNetworkOptimization(t *testing.T) { + AcceptanceTest(t, AcceptanceTestCase{ + Lock: settingNetworkOptimizationLock, + Steps: []resource.TestStep{ + { + Config: testAccSettingNetworkOptimizationConfig(true), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("unifi_setting_network_optimization.test", "id"), + resource.TestCheckResourceAttr("unifi_setting_network_optimization.test", "site", "default"), + resource.TestCheckResourceAttr("unifi_setting_network_optimization.test", "enabled", "true"), + ), + ConfigPlanChecks: pt.CheckResourceActions("unifi_setting_network_optimization.test", plancheck.ResourceActionCreate), + }, + pt.ImportStepWithSite("unifi_setting_network_optimization.test"), + { + Config: testAccSettingNetworkOptimizationConfig(false), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("unifi_setting_network_optimization.test", "id"), + resource.TestCheckResourceAttr("unifi_setting_network_optimization.test", "site", "default"), + resource.TestCheckResourceAttr("unifi_setting_network_optimization.test", "enabled", "false"), + ), + ConfigPlanChecks: pt.CheckResourceActions("unifi_setting_network_optimization.test", plancheck.ResourceActionUpdate), + }, + }, + }) +} + +func testAccSettingNetworkOptimizationConfig(enabled bool) string { + return fmt.Sprintf(` +resource "unifi_setting_network_optimization" "test" { + enabled = %t +} +`, enabled) +} diff --git a/internal/provider/provider_v2.go b/internal/provider/provider_v2.go index 54ec7fb..42a7473 100644 --- a/internal/provider/provider_v2.go +++ b/internal/provider/provider_v2.go @@ -178,6 +178,7 @@ func (p *unifiProvider) Resources(_ context.Context) []func() resource.Resource settings.NewCountryResource, settings.NewLocaleResource, settings.NewMagicSiteToSiteVpnResource, + settings.NewNetworkOptimizationResource, settings.NewNtpResource, } } diff --git a/internal/provider/settings/resource_setting_network_optimization.go b/internal/provider/settings/resource_setting_network_optimization.go new file mode 100644 index 0000000..1e5a762 --- /dev/null +++ b/internal/provider/settings/resource_setting_network_optimization.go @@ -0,0 +1,84 @@ +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 networkOptimizationModel struct { + base.Model + Enabled types.Bool `tfsdk:"enabled"` +} + +func (d *networkOptimizationModel) AsUnifiModel() (interface{}, diag.Diagnostics) { + diags := diag.Diagnostics{} + + model := &unifi.SettingNetworkOptimization{ + ID: d.ID.ValueString(), + Enabled: d.Enabled.ValueBool(), + } + + return model, diags +} + +func (d *networkOptimizationModel) Merge(other interface{}) diag.Diagnostics { + diags := diag.Diagnostics{} + + model, ok := other.(*unifi.SettingNetworkOptimization) + if !ok { + diags.AddError("Cannot merge", "Cannot merge type that is not *unifi.SettingNetworkOptimization") + return diags + } + + d.ID = types.StringValue(model.ID) + d.Enabled = types.BoolValue(model.Enabled) + + return diags +} + +var ( + _ base.ResourceModel = &networkOptimizationModel{} + _ resource.Resource = &networkOptimizationResource{} + _ resource.ResourceWithConfigure = &networkOptimizationResource{} + _ resource.ResourceWithImportState = &networkOptimizationResource{} +) + +type networkOptimizationResource struct { + *BaseSettingResource[*networkOptimizationModel] +} + +func (r *networkOptimizationResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { + resp.Schema = schema.Schema{ + MarkdownDescription: "Manages Network Optimization settings for a UniFi site. UniFi network optimization is a feature designed to automatically enhance the performance of a UniFi network" + + " by making automatic adjustments to various settings such as channel selection, transmit power, or frequency usage", + Attributes: map[string]schema.Attribute{ + "id": base.ID(), + "site": base.SiteAttribute(), + "enabled": schema.BoolAttribute{ + MarkdownDescription: "Whether the Network Optimization is enabled.", + Required: true, + }, + }, + } +} + +func NewNetworkOptimizationResource() resource.Resource { + r := &networkOptimizationResource{} + r.BaseSettingResource = NewBaseSettingResource( + "unifi_setting_network_optimization", + func() *networkOptimizationModel { return &networkOptimizationModel{} }, + func(ctx context.Context, client *base.Client, site string) (interface{}, error) { + return client.GetSettingNetworkOptimization(ctx, site) + }, + func(ctx context.Context, client *base.Client, site string, body interface{}) (interface{}, error) { + return client.UpdateSettingNetworkOptimization(ctx, site, body.(*unifi.SettingNetworkOptimization)) + }, + ) + return r +}