diff --git a/examples/data-sources/netbox_dcim_device_role/data-source.tf b/examples/data-sources/netbox_dcim_device_role/data-source.tf new file mode 100644 index 000000000..a65645946 --- /dev/null +++ b/examples/data-sources/netbox_dcim_device_role/data-source.tf @@ -0,0 +1,3 @@ +data "netbox_dcim_device_role" "device_role_test" { + slug = "TestDeviceRole" +} diff --git a/netbox/dcim/data_netbox_dcim_device_role.go b/netbox/dcim/data_netbox_dcim_device_role.go new file mode 100644 index 000000000..41bf4be44 --- /dev/null +++ b/netbox/dcim/data_netbox_dcim_device_role.go @@ -0,0 +1,66 @@ +package dcim + +import ( + "context" + "regexp" + "strconv" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + netboxclient "github.com/smutel/go-netbox/v3/netbox/client" + "github.com/smutel/go-netbox/v3/netbox/client/dcim" + "github.com/smutel/terraform-provider-netbox/v7/netbox/internal/util" +) + +func DataNetboxDcimDeviceRole() *schema.Resource { + return &schema.Resource{ + Description: "Get info about rack role (dcim module) from netbox.", + ReadContext: dataNetboxDcimDeviceRoleRead, + + Schema: map[string]*schema.Schema{ + "content_type": { + Type: schema.TypeString, + Computed: true, + Description: "The content type of this rack role (dcim module).", + }, + "slug": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringMatch( + regexp.MustCompile("^[-a-zA-Z0-9_]{1,50}$"), + "Must be like ^[-a-zA-Z0-9_]{1,50}$"), + Description: "The slug of the rack role (dcim module).", + }, + }, + } +} + +func dataNetboxDcimDeviceRoleRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + client := m.(*netboxclient.NetBoxAPI) + + slug := d.Get("slug").(string) + + p := dcim.NewDcimDeviceRolesListParams().WithSlug(&slug) + + list, err := client.Dcim.DcimDeviceRolesList(p, nil) + if err != nil { + return diag.FromErr(err) + } + + if *list.Payload.Count < 1 { + return diag.Errorf("Your query returned no results. " + + "Please change your search criteria and try again.") + } else if *list.Payload.Count > 1 { + return diag.Errorf("Your query returned more than one result. " + + "Please try a more specific search criteria.") + } + + r := list.Payload.Results[0] + d.SetId(strconv.FormatInt(r.ID, 10)) + if err = d.Set("content_type", util.ConvertURIContentType(r.URL)); err != nil { + return diag.FromErr(err) + } + + return nil +} diff --git a/netbox/provider.go b/netbox/provider.go index fe97f3eef..2d2442902 100644 --- a/netbox/provider.go +++ b/netbox/provider.go @@ -150,6 +150,7 @@ func Provider() *schema.Provider { "netbox_json_wireless_wireless_lan_groups_list": json.DataNetboxJSONWirelessWirelessLanGroupsList(), "netbox_json_wireless_wireless_lans_list": json.DataNetboxJSONWirelessWirelessLansList(), "netbox_json_wireless_wireless_links_list": json.DataNetboxJSONWirelessWirelessLinksList(), + "netbox_dcim_device_role": dcim.DataNetboxDcimDeviceRole(), "netbox_dcim_location": dcim.DataNetboxDcimLocation(), "netbox_dcim_platform": dcim.DataNetboxDcimPlatform(), "netbox_dcim_rack": dcim.DataNetboxDcimRack(),