From 2e88c5a23cd5eb23a8cb8ea72fde2cf4444b5d9c Mon Sep 17 00:00:00 2001 From: Suhrit Rimal Date: Sun, 13 Feb 2022 22:58:30 -0500 Subject: [PATCH 1/2] Added devices datasource --- .changelog/1445.txt | 3 + cloudflare/data_source_cloudflare_devices.go | 56 ++++++++++++ cloudflare/provider.go | 1 + cloudflare/schema_cloudflare_devices.go | 92 ++++++++++++++++++++ website/cloudflare.erb | 3 + website/docs/d/devices.html.md | 49 +++++++++++ 6 files changed, 204 insertions(+) create mode 100644 .changelog/1445.txt create mode 100644 cloudflare/data_source_cloudflare_devices.go create mode 100644 cloudflare/schema_cloudflare_devices.go create mode 100644 website/docs/d/devices.html.md diff --git a/.changelog/1445.txt b/.changelog/1445.txt new file mode 100644 index 0000000000..a62324269d --- /dev/null +++ b/.changelog/1445.txt @@ -0,0 +1,3 @@ +```release-note:new-data-source +cloudflare_devices +``` \ No newline at end of file diff --git a/cloudflare/data_source_cloudflare_devices.go b/cloudflare/data_source_cloudflare_devices.go new file mode 100644 index 0000000000..a2523c58ef --- /dev/null +++ b/cloudflare/data_source_cloudflare_devices.go @@ -0,0 +1,56 @@ +package cloudflare + +import ( + "context" + "fmt" + + cloudflare "github.com/cloudflare/cloudflare-go" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func dataSourceCloudflareDevices() *schema.Resource { + return &schema.Resource{ + Schema: resoureceCloudflareDevicesSchema(), + Read: dataResourceCloudflareDevicesRead, + } +} + +func dataResourceCloudflareDevicesRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*cloudflare.API) + accountID := d.Get("account_id").(string) + d.SetId(accountID) + + devices, err := client.ListTeamsDevices(context.Background(), accountID) + + if err != nil { + return fmt.Errorf("error finding devices in account %q: %w", accountID, err) + } + + deviceDetails := make([]interface{}, 0) + + for _, device := range devices { + deviceDetails = append(deviceDetails, map[string]interface{}{ + "id": device.ID, + "key": device.Key, + "device_type": device.DeviceType, + "name": device.Name, + "version": device.Version, + "updated": device.Updated, + "created": device.Created, + "last_seen": device.LastSeen, + "model": device.Model, + "os_version": device.OSVersion, + "ip": device.IP, + "user_id": device.User.ID, + "user_email": device.User.Email, + "user_name": device.User.Name, + }) + } + + err = d.Set("devices", deviceDetails) + if err != nil { + return fmt.Errorf("error setting device details: %w", err) + } + + return nil +} diff --git a/cloudflare/provider.go b/cloudflare/provider.go index 652b0664d6..d052a68bd5 100644 --- a/cloudflare/provider.go +++ b/cloudflare/provider.go @@ -109,6 +109,7 @@ func Provider() *schema.Provider { "cloudflare_access_identity_provider": dataSourceCloudflareAccessIdentityProvider(), "cloudflare_account_roles": dataSourceCloudflareAccountRoles(), "cloudflare_api_token_permission_groups": dataSourceCloudflareApiTokenPermissionGroups(), + "cloudflare_devices": dataSourceCloudflareDevices(), "cloudflare_ip_ranges": dataSourceCloudflareIPRanges(), "cloudflare_origin_ca_root_certificate": dataSourceCloudflareOriginCARootCertificate(), "cloudflare_waf_groups": dataSourceCloudflareWAFGroups(), diff --git a/cloudflare/schema_cloudflare_devices.go b/cloudflare/schema_cloudflare_devices.go new file mode 100644 index 0000000000..02e56d03d0 --- /dev/null +++ b/cloudflare/schema_cloudflare_devices.go @@ -0,0 +1,92 @@ +package cloudflare + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func resoureceCloudflareDevicesSchema() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeString, + Required: true, + }, + "devices": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": { + Type: schema.TypeString, + Optional: true, + Description: "Device ID.", + }, + "key": { + Type: schema.TypeString, + Optional: true, + Description: "The device's public key.", + }, + "device_type": { + Type: schema.TypeString, + Optional: true, + Description: "The type of the device.", + }, + "name": { + Type: schema.TypeString, + Optional: true, + Description: "The device name.", + }, + "version": { + Type: schema.TypeString, + Optional: true, + Description: "The WARP client version.", + }, + "model": { + Type: schema.TypeString, + Optional: true, + Description: "The device model name.", + }, + "os_version": { + Type: schema.TypeString, + Optional: true, + Description: "The operating system version.", + }, + "ip": { + Type: schema.TypeString, + Optional: true, + Description: "IPv4 or IPv6 address.", + }, + "last_seen": { + Type: schema.TypeString, + Optional: true, + Description: "When the device was last seen.", + }, + "created": { + Type: schema.TypeString, + Optional: true, + Description: "When the device was created.", + }, + "updated": { + Type: schema.TypeString, + Optional: true, + Description: "When the device was updated", + }, + "user_id": { + Type: schema.TypeString, + Optional: true, + Description: "User's ID", + }, + "user_email": { + Type: schema.TypeString, + Optional: true, + Description: "User's email", + }, + "user_name": { + Type: schema.TypeString, + Optional: true, + Description: "User's Name", + }, + }, + }, + }, + } +} diff --git a/website/cloudflare.erb b/website/cloudflare.erb index d59ece8506..f5b0026c49 100644 --- a/website/cloudflare.erb +++ b/website/cloudflare.erb @@ -34,6 +34,9 @@ > cloudflare_api_token_permission_groups + > + cloudflare_devices + > cloudflare_ip_ranges diff --git a/website/docs/d/devices.html.md b/website/docs/d/devices.html.md new file mode 100644 index 0000000000..d107ead3b9 --- /dev/null +++ b/website/docs/d/devices.html.md @@ -0,0 +1,49 @@ +--- +layout: "cloudflare" +page_title: "Cloudflare: cloudflare_devices" +sidebar_current: "docs-cloudflare-datasource-devices" +description: |- + Get information on a Cloudflare Account Devices. +--- + +# cloudflare_devices + +Use this data source to lookup [Account Devices][1]. + +## Example usage + +```hcl +data "cloudflare_devices" "devices" { + account_id = var.cloudflare_account_id +} +``` + +## Argument Reference + +* `account_id` - (Required) The account for which to list the devices. + +## Attributes Reference + +- `devices` - A list of device object. See below for nested attributes. + +**devices** + +- `id` - Device ID. +- `key` - The device's public key. +- `device_type` - The type of the device. +- `name` - The device name. +- `version` - The WARP client version. +- `model` - The device model name. +- `os_version` - The operating system version. +- `ip` - IPv4 or IPv6 address. +- `last_seen` - When the device was last seen. +- `created` - When the device was created. +- `updated` - When the device was updated. +- `user_id` - User's ID. +- `user_email` - User's email. +- `user_name` - User's Name. + + + + +[1]: https://api.cloudflare.com/#account-roles-properties From 057ec3cc5ef60927ab6e1d13fe90868f5890f476 Mon Sep 17 00:00:00 2001 From: Jacob Bednarz Date: Mon, 14 Feb 2022 15:24:17 +1100 Subject: [PATCH 2/2] minor formatting fixes --- .changelog/{1445.txt => 1453.txt} | 0 ..._cloudflare_devices.go => data_source_devices.go} | 3 +-- cloudflare/schema_cloudflare_devices.go | 8 ++++---- website/docs/d/devices.html.md | 12 ++++-------- 4 files changed, 9 insertions(+), 14 deletions(-) rename .changelog/{1445.txt => 1453.txt} (100%) rename cloudflare/{data_source_cloudflare_devices.go => data_source_devices.go} (96%) diff --git a/.changelog/1445.txt b/.changelog/1453.txt similarity index 100% rename from .changelog/1445.txt rename to .changelog/1453.txt diff --git a/cloudflare/data_source_cloudflare_devices.go b/cloudflare/data_source_devices.go similarity index 96% rename from cloudflare/data_source_cloudflare_devices.go rename to cloudflare/data_source_devices.go index a2523c58ef..16509609fd 100644 --- a/cloudflare/data_source_cloudflare_devices.go +++ b/cloudflare/data_source_devices.go @@ -47,8 +47,7 @@ func dataResourceCloudflareDevicesRead(d *schema.ResourceData, meta interface{}) }) } - err = d.Set("devices", deviceDetails) - if err != nil { + if err = d.Set("devices", deviceDetails); err != nil { return fmt.Errorf("error setting device details: %w", err) } diff --git a/cloudflare/schema_cloudflare_devices.go b/cloudflare/schema_cloudflare_devices.go index 02e56d03d0..ee576e9aaa 100644 --- a/cloudflare/schema_cloudflare_devices.go +++ b/cloudflare/schema_cloudflare_devices.go @@ -68,22 +68,22 @@ func resoureceCloudflareDevicesSchema() map[string]*schema.Schema { "updated": { Type: schema.TypeString, Optional: true, - Description: "When the device was updated", + Description: "When the device was updated.", }, "user_id": { Type: schema.TypeString, Optional: true, - Description: "User's ID", + Description: "User's ID.", }, "user_email": { Type: schema.TypeString, Optional: true, - Description: "User's email", + Description: "User's email.", }, "user_name": { Type: schema.TypeString, Optional: true, - Description: "User's Name", + Description: "User's Name.", }, }, }, diff --git a/website/docs/d/devices.html.md b/website/docs/d/devices.html.md index d107ead3b9..21b58a0abd 100644 --- a/website/docs/d/devices.html.md +++ b/website/docs/d/devices.html.md @@ -2,19 +2,18 @@ layout: "cloudflare" page_title: "Cloudflare: cloudflare_devices" sidebar_current: "docs-cloudflare-datasource-devices" -description: |- - Get information on a Cloudflare Account Devices. +description: Get information on Cloudflare Devices. --- # cloudflare_devices -Use this data source to lookup [Account Devices][1]. +Use this data source to lookup [Devices][1]. ## Example usage ```hcl data "cloudflare_devices" "devices" { - account_id = var.cloudflare_account_id + account_id = "c68973221045fe805dfb9aa520153148" } ``` @@ -43,7 +42,4 @@ data "cloudflare_devices" "devices" { - `user_email` - User's email. - `user_name` - User's Name. - - - -[1]: https://api.cloudflare.com/#account-roles-properties +[1]: https://api.cloudflare.com/#devices-list-devices