diff --git a/internal/provider/base/base.go b/internal/provider/base/base.go index 51e0371..143b928 100644 --- a/internal/provider/base/base.go +++ b/internal/provider/base/base.go @@ -10,6 +10,18 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" ) +type SiteAware interface { + GetSite() string + SetSite(string) + GetRawSite() types.String +} + +type Identifiable interface { + GetID() string + SetID(string) + GetRawID() types.String +} + type Resource interface { SetClient(client *Client) SetVersionValidator(validator ControllerVersionValidator) @@ -17,14 +29,10 @@ type Resource interface { // ResourceModel defines the interface that all setting models must implement type ResourceModel interface { - GetSite() string - GetRawSite() types.String - SetSite(string) - GetID() string - GetRawID() types.String - SetID(string) - AsUnifiModel(context.Context) (interface{}, diag.Diagnostics) + Identifiable + SiteAware Merge(context.Context, interface{}) diag.Diagnostics + AsUnifiModel(context.Context) (interface{}, diag.Diagnostics) } type Model struct { diff --git a/internal/provider/base/client.go b/internal/provider/base/client.go index 6f85a26..6a9b155 100644 --- a/internal/provider/base/client.go +++ b/internal/provider/base/client.go @@ -2,38 +2,16 @@ package base import ( "crypto/tls" - "errors" "fmt" "github.com/filipowm/go-unifi/unifi" "github.com/hashicorp/go-version" + "github.com/hashicorp/terraform-plugin-framework/diag" "log" "net" "net/http" - "strings" "time" ) -func IsServerErrorContains(err error, messageContains string) bool { - if err == nil { - return false - } - var se *unifi.ServerError - if errors.As(err, &se) { - if strings.Contains(se.Message, messageContains) { - return true - } - // check details - if se.Details != nil { - for _, m := range se.Details { - if strings.Contains(m.Message, messageContains) { - return true - } - } - } - } - return false -} - type ClientConfig struct { Username string Password string @@ -80,7 +58,7 @@ type Client struct { Version *version.Version } -func (c *Client) ResolveSite(res ResourceModel) string { +func (c *Client) ResolveSite(res SiteAware) string { if res == nil || IsEmptyString(res.GetRawSite()) { return c.Site } @@ -104,3 +82,14 @@ func CreateHttpTransport(insecure bool) http.RoundTripper { }, } } + +func checkClientConfigured(client *Client) diag.Diagnostics { + diags := diag.Diagnostics{} + if client == nil { + diags.AddError( + "Client Not Configured", + "Expected configured client. Please report this issue to the provider developers.", + ) + } + return diags +} diff --git a/internal/provider/base/errors.go b/internal/provider/base/errors.go index 6c24558..b07c2e4 100644 --- a/internal/provider/base/errors.go +++ b/internal/provider/base/errors.go @@ -1,8 +1,11 @@ package base import ( + "errors" + "github.com/filipowm/go-unifi/unifi" "github.com/hashicorp/terraform-plugin-framework/diag" "reflect" + "strings" ) func ErrorInvalidModelMergeTarget(expectedType, actualType interface{}) diag.Diagnostic { @@ -10,3 +13,24 @@ func ErrorInvalidModelMergeTarget(expectedType, actualType interface{}) diag.Dia a := reflect.TypeOf(&actualType).Elem().String() return diag.NewErrorDiagnostic("Invalid model merge target", "Expected target type to be the same a receiver: "+e+". Was : "+a) } + +func IsServerErrorContains(err error, messageContains string) bool { + if err == nil { + return false + } + var se *unifi.ServerError + if errors.As(err, &se) { + if strings.Contains(se.Message, messageContains) { + return true + } + // check details + if se.Details != nil { + for _, m := range se.Details { + if strings.Contains(m.Message, messageContains) { + return true + } + } + } + } + return false +} diff --git a/internal/provider/base/generic_resource.go b/internal/provider/base/generic_resource.go new file mode 100644 index 0000000..2efc311 --- /dev/null +++ b/internal/provider/base/generic_resource.go @@ -0,0 +1,215 @@ +package base + +import ( + "context" + "errors" + "fmt" + "github.com/filipowm/go-unifi/unifi" + "github.com/hashicorp/terraform-plugin-framework/diag" + "github.com/hashicorp/terraform-plugin-framework/resource" +) + +type ResourceFunctions struct { + Read func(ctx context.Context, client *Client, site string, id string) (interface{}, error) + Create func(ctx context.Context, client *Client, site string, body interface{}) (interface{}, error) + Update func(ctx context.Context, client *Client, site string, body interface{}) (interface{}, error) + Delete func(ctx context.Context, client *Client, site string, id string) error +} + +// GenericResource provides common functionality for all resources +type GenericResource[T ResourceModel] struct { + ControllerVersionValidator + client *Client + typeName string + modelFactory func() T + Handlers ResourceFunctions +} + +// NewGenericResource creates a new base resource +func NewGenericResource[T ResourceModel]( + typeName string, + modelFactory func() T, + handlers ResourceFunctions, +) *GenericResource[T] { + return &GenericResource[T]{ + typeName: typeName, + modelFactory: modelFactory, + Handlers: handlers, + } +} + +// GetClient returns the UniFi client +func (b *GenericResource[T]) GetClient() *Client { + return b.client +} + +// SetClient sets the UniFi client +func (b *GenericResource[T]) SetClient(client *Client) { + b.client = client +} + +func (b *GenericResource[T]) SetVersionValidator(validator ControllerVersionValidator) { + b.ControllerVersionValidator = validator +} + +func (b *GenericResource[T]) Configure(_ context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { + ConfigureResource(b, req, resp) +} + +func (b *GenericResource[T]) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { + resp.TypeName = b.typeName +} + +func (b *GenericResource[T]) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { + resp.Diagnostics.Append(checkClientConfigured(b.client)...) + if resp.Diagnostics.HasError() { + return + } + id, site := ImportIDWithSite(req, resp) + if resp.Diagnostics.HasError() { + return + } + state := b.modelFactory() + state.SetID(id) + state.SetSite(site) + + b.read(ctx, site, state, &resp.Diagnostics) + if resp.Diagnostics.HasError() { + return + } + resp.Diagnostics.Append(resp.State.Set(ctx, &state)...) +} + +func (b *GenericResource[T]) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { + if b.Handlers.Create == nil { + // Create is not supported + return + } + resp.Diagnostics.Append(checkClientConfigured(b.client)...) + if resp.Diagnostics.HasError() { + return + } + + var plan T + resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...) + if resp.Diagnostics.HasError() { + return + } + site := b.client.ResolveSite(plan) + + body, diags := plan.AsUnifiModel(ctx) + + if diags.HasError() { + resp.Diagnostics.Append(diags...) + return + } + + res, err := b.Handlers.Create(ctx, b.client, site, body) + if err != nil { + resp.Diagnostics.AddError("Error creating resource", err.Error()) + return + } + if res == nil { + resp.Diagnostics.AddError("Error creating resource", fmt.Sprintf("No %[1]s resource returned from the UniFi controller. %[1]s might not be supported on this controller", b.typeName)) + return + } + plan.Merge(ctx, res) + plan.SetSite(site) + resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...) +} + +func (b *GenericResource[T]) read(ctx context.Context, site string, state T, diag *diag.Diagnostics) { + res, err := b.Handlers.Read(ctx, b.client, site, state.GetID()) + if err != nil { + if errors.Is(err, unifi.ErrNotFound) { + diag.AddError("Resource not found", "The resource was not found in the UniFi controller") + } else { + diag.AddError("Error reading resource", err.Error()) + } + return + } + if res != nil { + state.Merge(ctx, res) + } +} + +func (b *GenericResource[T]) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { + if b.Handlers.Read == nil { + resp.Diagnostics.AddError("Read Not Supported", "Read operation is not supported for this resource. Please report this issue to the provider developers cause this is unexpected issue.") + return + } + resp.Diagnostics.Append(checkClientConfigured(b.client)...) + if resp.Diagnostics.HasError() { + return + } + + var state T + resp.Diagnostics.Append(req.State.Get(ctx, &state)...) + if resp.Diagnostics.HasError() { + return + } + + site := b.client.ResolveSite(state) + b.read(ctx, site, state, &resp.Diagnostics) + + if resp.Diagnostics.HasError() { + return + } + state.SetSite(site) + resp.Diagnostics.Append(resp.State.Set(ctx, &state)...) +} + +func (b *GenericResource[T]) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { + if b.Handlers.Update == nil { + // Update is not supported + return + } + resp.Diagnostics.Append(checkClientConfigured(b.client)...) + if resp.Diagnostics.HasError() { + return + } + + var plan, state T + resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...) + resp.Diagnostics.Append(req.State.Get(ctx, &state)...) + if resp.Diagnostics.HasError() { + return + } + body, diags := plan.AsUnifiModel(ctx) + if diags.HasError() { + resp.Diagnostics.Append(diags...) + return + } + site := b.client.ResolveSite(plan) + + res, err := b.Handlers.Update(ctx, b.client, site, body) + if err != nil { + resp.Diagnostics.AddError("Error updating resource", err.Error()) + return + } + state.Merge(ctx, res) + state.SetSite(site) + resp.Diagnostics.Append(resp.State.Set(ctx, &state)...) +} + +func (b *GenericResource[T]) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { + if b.Handlers.Delete == nil { + // Delete is not supported + return + } + resp.Diagnostics.Append(checkClientConfigured(b.client)...) + if resp.Diagnostics.HasError() { + return + } + var state T + resp.Diagnostics.Append(req.State.Get(ctx, &state)...) + if resp.Diagnostics.HasError() { + return + } + site := b.client.ResolveSite(state) + err := b.Handlers.Delete(ctx, b.client, site, state.GetID()) + if err != nil { + resp.Diagnostics.AddError("Error deleting resource", err.Error()) + return + } +} diff --git a/internal/provider/settings/base_setting_resource.go b/internal/provider/settings/base_setting_resource.go index 98632b7..e3b3803 100644 --- a/internal/provider/settings/base_setting_resource.go +++ b/internal/provider/settings/base_setting_resource.go @@ -2,194 +2,24 @@ package settings import ( "context" - "errors" - "fmt" - - "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" ) -// BaseSettingResource provides common functionality for all setting resources -type BaseSettingResource[T base.ResourceModel] struct { - base.ControllerVersionValidator - client *base.Client - typeName string - modelFactory func() T - getter func(context.Context, *base.Client, string) (interface{}, error) - updater func(context.Context, *base.Client, string, interface{}) (interface{}, error) -} - -// NewBaseSettingResource creates a new base setting resource -func NewBaseSettingResource[T base.ResourceModel]( +// NewSettingResource creates a new base setting resource +func NewSettingResource[T base.ResourceModel]( typeName string, modelFactory func() T, getter func(context.Context, *base.Client, string) (interface{}, error), updater func(context.Context, *base.Client, string, interface{}) (interface{}, error), -) *BaseSettingResource[T] { - return &BaseSettingResource[T]{ - typeName: typeName, - modelFactory: modelFactory, - getter: getter, - updater: updater, - } -} - -// GetClient returns the UniFi client -func (b *BaseSettingResource[T]) GetClient() *base.Client { - return b.client -} - -// SetClient sets the UniFi client -func (b *BaseSettingResource[T]) SetClient(client *base.Client) { - b.client = client -} - -func (b *BaseSettingResource[T]) SetVersionValidator(validator base.ControllerVersionValidator) { - b.ControllerVersionValidator = validator -} - -func (b *BaseSettingResource[T]) Configure(_ context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - base.ConfigureResource(b, req, resp) -} - -func (b *BaseSettingResource[T]) Metadata(_ context.Context, _ resource.MetadataRequest, resp *resource.MetadataResponse) { - resp.TypeName = b.typeName -} - -func (b *BaseSettingResource[T]) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { - id, site := base.ImportIDWithSite(req, resp) - if resp.Diagnostics.HasError() { - return - } - state := b.modelFactory() - state.SetID(id) - state.SetSite(site) - b.read(ctx, site, state, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - resp.Diagnostics.Append(resp.State.Set(ctx, &state)...) -} - -func (b *BaseSettingResource[T]) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { - if b.client == nil { - resp.Diagnostics.AddError( - "Client Not Configured", - "Expected configured client. Please report this issue to the provider developers.", - ) - return - } - - var plan T - resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...) - if resp.Diagnostics.HasError() { - return - } - site := b.client.ResolveSite(plan) - - body, diags := plan.AsUnifiModel(ctx) - - if diags.HasError() { - resp.Diagnostics.Append(diags...) - return - } - - res, err := b.updater(ctx, b.client, site, body) - if err != nil { - resp.Diagnostics.AddError("Error creating settings", err.Error()) - return - } - if res == nil { - resp.Diagnostics.AddError("Error creating settings", fmt.Sprintf("No %[1]s settings returned from the UniFi controller. %[1]s might not be supported on this controller", b.typeName)) - return - } - plan.Merge(ctx, res) - plan.SetSite(site) - resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...) -} - -func (b *BaseSettingResource[T]) read(ctx context.Context, site string, state T, diag *diag.Diagnostics) { - if b.client == nil { - diag.AddError( - "Client Not Configured", - "Expected configured client. Please report this issue to the provider developers.", - ) - return - } - - res, err := b.getter(ctx, b.client, site) - if err != nil { - if errors.Is(err, unifi.ErrNotFound) { - diag.AddError("Settings not found", "The settings were not found in the UniFi controller") - } else { - diag.AddError("Error reading settings", err.Error()) - } - return - } - if res != nil { - state.Merge(ctx, res) - } -} - -func (b *BaseSettingResource[T]) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { - if b.client == nil { - resp.Diagnostics.AddError( - "Client Not Configured", - "Expected configured client. Please report this issue to the provider developers.", - ) - return - } - - var state T - resp.Diagnostics.Append(req.State.Get(ctx, &state)...) - if resp.Diagnostics.HasError() { - return - } - - site := b.client.ResolveSite(state) - b.read(ctx, site, state, &resp.Diagnostics) - - if resp.Diagnostics.HasError() { - return - } - state.SetSite(site) - resp.Diagnostics.Append(resp.State.Set(ctx, &state)...) -} - -func (b *BaseSettingResource[T]) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { - if b.client == nil { - resp.Diagnostics.AddError( - "Client Not Configured", - "Expected configured client. Please report this issue to the provider developers.", - ) - return - } - - var plan, state T - resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...) - resp.Diagnostics.Append(req.State.Get(ctx, &state)...) - if resp.Diagnostics.HasError() { - return - } - body, diags := plan.AsUnifiModel(ctx) - if diags.HasError() { - resp.Diagnostics.Append(diags...) - return - } - site := b.client.ResolveSite(plan) - - res, err := b.updater(ctx, b.client, site, body) - if err != nil { - resp.Diagnostics.AddError("Error updating settings", err.Error()) - return - } - state.Merge(ctx, res) - state.SetSite(site) - resp.Diagnostics.Append(resp.State.Set(ctx, &state)...) -} - -func (b *BaseSettingResource[T]) Delete(_ context.Context, _ resource.DeleteRequest, _ *resource.DeleteResponse) { - // Not supported +) *base.GenericResource[T] { + return base.NewGenericResource( + typeName, + modelFactory, + base.ResourceFunctions{ + Read: func(ctx context.Context, client *base.Client, site, _ string) (interface{}, error) { + return getter(ctx, client, site) + }, + Create: updater, + Update: updater, + }) } diff --git a/internal/provider/settings/resource_setting_auto_speedtest.go b/internal/provider/settings/resource_setting_auto_speedtest.go index 4039ed8..2d1d191 100644 --- a/internal/provider/settings/resource_setting_auto_speedtest.go +++ b/internal/provider/settings/resource_setting_auto_speedtest.go @@ -42,7 +42,7 @@ func (d *autoSpeedtestModel) Merge(_ context.Context, other interface{}) diag.Di } type autoSpeedtestResource struct { - *BaseSettingResource[*autoSpeedtestModel] + *base.GenericResource[*autoSpeedtestModel] } func checkAutoSpeedtestUnsupportedError(err error) error { @@ -54,7 +54,7 @@ func checkAutoSpeedtestUnsupportedError(err error) error { func NewAutoSpeedtestResource() resource.Resource { r := &autoSpeedtestResource{} - r.BaseSettingResource = NewBaseSettingResource( + r.GenericResource = NewSettingResource( "unifi_setting_auto_speedtest", func() *autoSpeedtestModel { return &autoSpeedtestModel{} }, func(ctx context.Context, client *base.Client, site string) (interface{}, error) { diff --git a/internal/provider/settings/resource_setting_country.go b/internal/provider/settings/resource_setting_country.go index 2628c44..09db483 100644 --- a/internal/provider/settings/resource_setting_country.go +++ b/internal/provider/settings/resource_setting_country.go @@ -45,12 +45,12 @@ func (d *countryModel) Merge(_ context.Context, other interface{}) diag.Diagnost } type countryResource struct { - *BaseSettingResource[*countryModel] + *base.GenericResource[*countryModel] } func NewCountryResource() resource.Resource { r := &countryResource{} - r.BaseSettingResource = NewBaseSettingResource( + r.GenericResource = NewSettingResource( "unifi_setting_country", func() *countryModel { return &countryModel{} }, func(ctx context.Context, client *base.Client, site string) (interface{}, error) { diff --git a/internal/provider/settings/resource_setting_dpi.go b/internal/provider/settings/resource_setting_dpi.go index 4141241..62e8d00 100644 --- a/internal/provider/settings/resource_setting_dpi.go +++ b/internal/provider/settings/resource_setting_dpi.go @@ -53,7 +53,7 @@ var ( ) type dpiResource struct { - *BaseSettingResource[*dpiModel] + *base.GenericResource[*dpiModel] } func (r *dpiResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { @@ -76,7 +76,7 @@ func (r *dpiResource) Schema(_ context.Context, _ resource.SchemaRequest, resp * func NewDpiResource() resource.Resource { r := &dpiResource{} - r.BaseSettingResource = NewBaseSettingResource( + r.GenericResource = NewSettingResource( "unifi_setting_dpi", func() *dpiModel { return &dpiModel{} }, func(ctx context.Context, client *base.Client, site string) (interface{}, error) { diff --git a/internal/provider/settings/resource_setting_lcm.go b/internal/provider/settings/resource_setting_lcm.go index 0db0f9b..86eec85 100644 --- a/internal/provider/settings/resource_setting_lcm.go +++ b/internal/provider/settings/resource_setting_lcm.go @@ -89,7 +89,7 @@ var ( ) type lcmResource struct { - *BaseSettingResource[*lcmModel] + *base.GenericResource[*lcmModel] } func (r *lcmResource) ConfigValidators(_ context.Context) []resource.ConfigValidator { @@ -136,7 +136,7 @@ func (r *lcmResource) Schema(_ context.Context, _ resource.SchemaRequest, resp * func NewLcmResource() resource.Resource { r := &lcmResource{} - r.BaseSettingResource = NewBaseSettingResource( + r.GenericResource = NewSettingResource( "unifi_setting_lcd_monitor", func() *lcmModel { return &lcmModel{} }, func(ctx context.Context, client *base.Client, site string) (interface{}, error) { diff --git a/internal/provider/settings/resource_setting_locale.go b/internal/provider/settings/resource_setting_locale.go index fe3cba2..8546048 100644 --- a/internal/provider/settings/resource_setting_locale.go +++ b/internal/provider/settings/resource_setting_locale.go @@ -52,7 +52,7 @@ var ( ) type localeResource struct { - *BaseSettingResource[*localeModel] + *base.GenericResource[*localeModel] } func (r *localeResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { @@ -74,7 +74,7 @@ func (r *localeResource) Schema(_ context.Context, _ resource.SchemaRequest, res func NewLocaleResource() resource.Resource { r := &localeResource{} - r.BaseSettingResource = NewBaseSettingResource( + r.GenericResource = NewSettingResource( "unifi_setting_locale", func() *localeModel { return &localeModel{} }, func(ctx context.Context, client *base.Client, site string) (interface{}, error) { 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 index 379b184..315c902 100644 --- a/internal/provider/settings/resource_setting_magic_site_to_site_vpn.go +++ b/internal/provider/settings/resource_setting_magic_site_to_site_vpn.go @@ -50,7 +50,7 @@ var ( ) type magicSiteToSiteVpnResource struct { - *BaseSettingResource[*magicSiteToSiteVpnModel] + *base.GenericResource[*magicSiteToSiteVpnModel] } func (r *magicSiteToSiteVpnResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { @@ -69,7 +69,7 @@ func (r *magicSiteToSiteVpnResource) Schema(_ context.Context, _ resource.Schema func NewMagicSiteToSiteVpnResource() resource.Resource { r := &magicSiteToSiteVpnResource{} - r.BaseSettingResource = NewBaseSettingResource( + r.GenericResource = NewSettingResource( "unifi_setting_magic_site_to_site_vpn", func() *magicSiteToSiteVpnModel { return &magicSiteToSiteVpnModel{} }, func(ctx context.Context, client *base.Client, site string) (interface{}, error) { diff --git a/internal/provider/settings/resource_setting_network_optimization.go b/internal/provider/settings/resource_setting_network_optimization.go index e4e9ab2..19e3b96 100644 --- a/internal/provider/settings/resource_setting_network_optimization.go +++ b/internal/provider/settings/resource_setting_network_optimization.go @@ -50,7 +50,7 @@ var ( ) type networkOptimizationResource struct { - *BaseSettingResource[*networkOptimizationModel] + *base.GenericResource[*networkOptimizationModel] } func (r *networkOptimizationResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { @@ -70,7 +70,7 @@ func (r *networkOptimizationResource) Schema(_ context.Context, _ resource.Schem func NewNetworkOptimizationResource() resource.Resource { r := &networkOptimizationResource{} - r.BaseSettingResource = NewBaseSettingResource( + r.GenericResource = NewSettingResource( "unifi_setting_network_optimization", func() *networkOptimizationModel { return &networkOptimizationModel{} }, func(ctx context.Context, client *base.Client, site string) (interface{}, error) { diff --git a/internal/provider/settings/resource_setting_ntp.go b/internal/provider/settings/resource_setting_ntp.go index 01e7ada..4f9539e 100644 --- a/internal/provider/settings/resource_setting_ntp.go +++ b/internal/provider/settings/resource_setting_ntp.go @@ -92,7 +92,7 @@ var ( ) type ntpResource struct { - *BaseSettingResource[*ntpModel] + *base.GenericResource[*ntpModel] } func (r *ntpResource) ConfigValidators(_ context.Context) []resource.ConfigValidator { @@ -164,7 +164,7 @@ func (r *ntpResource) Schema(_ context.Context, _ resource.SchemaRequest, resp * // NewNtpResource creates a new instance of the NTP resource. func NewNtpResource() resource.Resource { r := &ntpResource{} - r.BaseSettingResource = NewBaseSettingResource( + r.GenericResource = NewSettingResource( "unifi_setting_ntp", func() *ntpModel { return &ntpModel{} }, func(ctx context.Context, client *base.Client, site string) (interface{}, error) { diff --git a/internal/provider/settings/resource_setting_rsyslogd.go b/internal/provider/settings/resource_setting_rsyslogd.go index 7de5118..82dc590 100644 --- a/internal/provider/settings/resource_setting_rsyslogd.go +++ b/internal/provider/settings/resource_setting_rsyslogd.go @@ -149,7 +149,7 @@ var ( ) type rsyslogdResource struct { - *BaseSettingResource[*rsyslogdModel] + *base.GenericResource[*rsyslogdModel] } func (r *rsyslogdResource) ModifyPlan(_ context.Context, _ resource.ModifyPlanRequest, resp *resource.ModifyPlanResponse) { @@ -260,7 +260,7 @@ func (r *rsyslogdResource) Schema(_ context.Context, _ resource.SchemaRequest, r func NewRsyslogdResource() resource.Resource { r := &rsyslogdResource{} - r.BaseSettingResource = NewBaseSettingResource( + r.GenericResource = NewSettingResource( "unifi_setting_rsyslogd", func() *rsyslogdModel { return &rsyslogdModel{} }, func(ctx context.Context, client *base.Client, site string) (interface{}, error) { diff --git a/internal/provider/settings/resource_setting_ssl_inspection.go b/internal/provider/settings/resource_setting_ssl_inspection.go index 846ca11..f61e1d4 100644 --- a/internal/provider/settings/resource_setting_ssl_inspection.go +++ b/internal/provider/settings/resource_setting_ssl_inspection.go @@ -52,7 +52,7 @@ var ( ) type sslInspectionResource struct { - *BaseSettingResource[*sslInspectionModel] + *base.GenericResource[*sslInspectionModel] } func (r *sslInspectionResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { @@ -74,7 +74,7 @@ func (r *sslInspectionResource) Schema(_ context.Context, _ resource.SchemaReque func NewSslInspectionResource() resource.Resource { r := &sslInspectionResource{} - r.BaseSettingResource = NewBaseSettingResource( + r.GenericResource = NewSettingResource( "unifi_setting_ssl_inspection", func() *sslInspectionModel { return &sslInspectionModel{} }, func(ctx context.Context, client *base.Client, site string) (interface{}, error) { diff --git a/internal/provider/settings/resource_setting_teleport.go b/internal/provider/settings/resource_setting_teleport.go index 251ff82..42dcfbc 100644 --- a/internal/provider/settings/resource_setting_teleport.go +++ b/internal/provider/settings/resource_setting_teleport.go @@ -56,7 +56,7 @@ var ( ) type teleportResource struct { - *BaseSettingResource[*teleportModel] + *base.GenericResource[*teleportModel] } func (r *teleportResource) ModifyPlan(_ context.Context, _ resource.ModifyPlanRequest, resp *resource.ModifyPlanResponse) { @@ -87,7 +87,7 @@ func (r *teleportResource) Schema(_ context.Context, _ resource.SchemaRequest, r func NewTeleportResource() resource.Resource { r := &teleportResource{} - r.BaseSettingResource = NewBaseSettingResource( + r.GenericResource = NewSettingResource( "unifi_setting_teleport", func() *teleportModel { return &teleportModel{} }, func(ctx context.Context, client *base.Client, site string) (interface{}, error) { diff --git a/internal/provider/settings/resource_setting_usg.go b/internal/provider/settings/resource_setting_usg.go index 940f03a..eb280d8 100644 --- a/internal/provider/settings/resource_setting_usg.go +++ b/internal/provider/settings/resource_setting_usg.go @@ -1220,7 +1220,7 @@ func (r *usgResource) Schema(_ context.Context, _ resource.SchemaRequest, resp * // NewUsgResource creates a new instance of the USG resource. func NewUsgResource() resource.Resource { r := &usgResource{} - r.BaseSettingResource = NewBaseSettingResource( + r.GenericResource = NewSettingResource( "unifi_setting_usg", func() *usgModel { return &usgModel{} }, func(ctx context.Context, client *base.Client, site string) (interface{}, error) { @@ -1243,7 +1243,7 @@ var ( ) type usgResource struct { - *BaseSettingResource[*usgModel] + *base.GenericResource[*usgModel] } func (r *usgResource) ConfigValidators(ctx context.Context) []resource.ConfigValidator {