From 78c3f01867d23b4fb35584a8aa7b2b291986d1c9 Mon Sep 17 00:00:00 2001 From: Carlos Gajardo Date: Fri, 15 Mar 2024 13:30:11 -0300 Subject: [PATCH] Migrate data source priority --- pagerduty/data_source_pagerduty_priority.go | 1 + pagerduty/provider.go | 1 + .../data_source_pagerduty_priority.go | 97 +++++++++++++++++++ .../data_source_pagerduty_priority_test.go | 9 +- pagerdutyplugin/provider.go | 1 + 5 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 pagerdutyplugin/data_source_pagerduty_priority.go rename {pagerduty => pagerdutyplugin}/data_source_pagerduty_priority_test.go (82%) diff --git a/pagerduty/data_source_pagerduty_priority.go b/pagerduty/data_source_pagerduty_priority.go index e969be065..5c6f7b263 100644 --- a/pagerduty/data_source_pagerduty_priority.go +++ b/pagerduty/data_source_pagerduty_priority.go @@ -12,6 +12,7 @@ import ( "github.com/heimweh/go-pagerduty/pagerduty" ) +// Deprecated: Migrated to pagerdutyplugin.dataSourcePriority. Kept for testing purposes. func dataSourcePagerDutyPriority() *schema.Resource { return &schema.Resource{ Read: dataSourcePagerDutyPriorityRead, diff --git a/pagerduty/provider.go b/pagerduty/provider.go index ca29bec28..7e0c6be8e 100644 --- a/pagerduty/provider.go +++ b/pagerduty/provider.go @@ -155,6 +155,7 @@ func Provider(isMux bool) *schema.Provider { if isMux { delete(p.DataSourcesMap, "pagerduty_business_service") delete(p.DataSourcesMap, "pagerduty_licenses") + delete(p.DataSourcesMap, "pagerduty_priority") delete(p.DataSourcesMap, "pagerduty_service") delete(p.DataSourcesMap, "pagerduty_service_integration") diff --git a/pagerdutyplugin/data_source_pagerduty_priority.go b/pagerdutyplugin/data_source_pagerduty_priority.go new file mode 100644 index 000000000..37e99eb32 --- /dev/null +++ b/pagerdutyplugin/data_source_pagerduty_priority.go @@ -0,0 +1,97 @@ +package pagerduty + +import ( + "context" + "fmt" + "log" + "strings" + + "github.com/PagerDuty/go-pagerduty" + "github.com/PagerDuty/terraform-provider-pagerduty/util/apiutil" + "github.com/hashicorp/terraform-plugin-framework/datasource" + "github.com/hashicorp/terraform-plugin-framework/datasource/schema" + "github.com/hashicorp/terraform-plugin-framework/path" + "github.com/hashicorp/terraform-plugin-framework/types" +) + +type dataSourcePriority struct{ client *pagerduty.Client } + +var _ datasource.DataSourceWithConfigure = (*dataSourcePriority)(nil) + +func (*dataSourcePriority) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { + resp.TypeName = "pagerduty_priority" +} + +func (*dataSourcePriority) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { + resp.Schema = schema.Schema{ + Attributes: map[string]schema.Attribute{ + "id": schema.StringAttribute{Computed: true}, + "name": schema.StringAttribute{ + Required: true, + Description: "The name of the priority to find in the PagerDuty API", + }, + "description": schema.StringAttribute{Computed: true}, + }, + } +} + +func (d *dataSourcePriority) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { + resp.Diagnostics.Append(ConfigurePagerdutyClient(&d.client, req.ProviderData)...) +} + +func (d *dataSourcePriority) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { + log.Println("[INFO] Reading PagerDuty priority") + + var searchName types.String + resp.Diagnostics.Append(req.Config.GetAttribute(ctx, path.Root("name"), &searchName)...) + if resp.Diagnostics.HasError() { + return + } + + var found *pagerduty.Priority + err := apiutil.All(ctx, apiutil.AllFunc(func(offset int) (bool, error) { + list, err := d.client.ListPrioritiesWithContext(ctx, pagerduty.ListPrioritiesOptions{ + Limit: apiutil.Limit, + Offset: uint(offset), + }) + if err != nil { + return false, err + } + + for _, priority := range list.Priorities { + if strings.EqualFold(priority.Name, searchName.ValueString()) { + found = &priority + return false, nil + } + } + + return list.More, nil + })) + if err != nil { + resp.Diagnostics.AddError( + fmt.Sprintf("Error reading PagerDuty priority %s", searchName), + err.Error(), + ) + } + + if found == nil { + resp.Diagnostics.AddError( + fmt.Sprintf("Unable to locate any priority with the name: %s", searchName), + "", + ) + return + } + + model := dataSourcePriorityModel{ + ID: types.StringValue(found.ID), + Name: types.StringValue(found.Name), + Description: types.StringValue(found.Description), + } + resp.Diagnostics.Append(resp.State.Set(ctx, &model)...) +} + +type dataSourcePriorityModel struct { + ID types.String `tfsdk:"id"` + Name types.String `tfsdk:"name"` + Description types.String `tfsdk:"description"` +} diff --git a/pagerduty/data_source_pagerduty_priority_test.go b/pagerdutyplugin/data_source_pagerduty_priority_test.go similarity index 82% rename from pagerduty/data_source_pagerduty_priority_test.go rename to pagerdutyplugin/data_source_pagerduty_priority_test.go index 222160f0a..00dd8d709 100644 --- a/pagerduty/data_source_pagerduty_priority_test.go +++ b/pagerdutyplugin/data_source_pagerduty_priority_test.go @@ -9,8 +9,8 @@ import ( func TestAccDataSourcePagerDutyPriority_Basic(t *testing.T) { dataSourceName := "data.pagerduty_priority.p1" resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProtoV5ProviderFactories(), Steps: []resource.TestStep{ { Config: testAccDataSourcePagerDutyPriorityConfig, @@ -22,11 +22,12 @@ func TestAccDataSourcePagerDutyPriority_Basic(t *testing.T) { }, }) } + func TestAccDataSourcePagerDutyPriority_P2(t *testing.T) { dataSourceName := "data.pagerduty_priority.p2" resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { testAccPreCheck(t) }, + ProtoV5ProviderFactories: testAccProtoV5ProviderFactories(), Steps: []resource.TestStep{ { Config: testAccDataSourcePagerDutyP2Config, diff --git a/pagerdutyplugin/provider.go b/pagerdutyplugin/provider.go index eba69b028..44899e9a0 100644 --- a/pagerdutyplugin/provider.go +++ b/pagerdutyplugin/provider.go @@ -57,6 +57,7 @@ func (p *Provider) DataSources(_ context.Context) [](func() datasource.DataSourc func() datasource.DataSource { return &dataSourceIntegration{} }, func() datasource.DataSource { return &dataSourceLicense{} }, func() datasource.DataSource { return &dataSourceLicenses{} }, + func() datasource.DataSource { return &dataSourcePriority{} }, func() datasource.DataSource { return &dataSourceService{} }, func() datasource.DataSource { return &dataSourceStandardsResourceScores{} }, func() datasource.DataSource { return &dataSourceStandardsResourcesScores{} },