Skip to content

Commit cdb9d5d

Browse files
Merge pull request #136 from SumoLogic/aayu_AddRoleDataSource
Adding Role Data Source
2 parents 3ee8f9f + f15be58 commit cdb9d5d

File tree

5 files changed

+194
-0
lines changed

5 files changed

+194
-0
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package sumologic
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"log"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
9+
)
10+
11+
func dataSourceSumologicRole() *schema.Resource {
12+
return &schema.Resource{
13+
Read: dataSourceSumologicRoleRead,
14+
15+
Schema: map[string]*schema.Schema{
16+
"id": {
17+
Type: schema.TypeString,
18+
Optional: true,
19+
Computed: true,
20+
},
21+
"name": {
22+
Type: schema.TypeString,
23+
Optional: true,
24+
Computed: true,
25+
},
26+
"description": {
27+
Type: schema.TypeString,
28+
Computed: true,
29+
},
30+
"filter_predicate": {
31+
Type: schema.TypeString,
32+
Computed: true,
33+
},
34+
"capabilities": {
35+
Type: schema.TypeList,
36+
Computed: true,
37+
Elem: &schema.Schema{
38+
Type: schema.TypeString,
39+
},
40+
},
41+
},
42+
}
43+
}
44+
45+
func dataSourceSumologicRoleRead(d *schema.ResourceData, meta interface{}) error {
46+
c := meta.(*Client)
47+
48+
var role *Role
49+
var err error
50+
if rid, ok := d.GetOk("id"); ok {
51+
id := rid.(string)
52+
role, err = c.GetRole(id)
53+
if err != nil {
54+
return fmt.Errorf("role with id %v not found: %v", id, err)
55+
}
56+
} else {
57+
if rname, ok := d.GetOk("name"); ok {
58+
name := rname.(string)
59+
role, err = c.GetRoleName(name)
60+
if err != nil {
61+
return fmt.Errorf("role with name %s not found: %v", name, err)
62+
}
63+
if role == nil {
64+
return fmt.Errorf("role with name %s not found", name)
65+
}
66+
} else {
67+
return errors.New("please specify either id or name")
68+
}
69+
}
70+
71+
d.SetId(role.ID)
72+
d.Set("name", role.Name)
73+
d.Set("description", role.Description)
74+
d.Set("filter_predicate", role.FilterPredicate)
75+
if err := d.Set("capabilities", role.Capabilities); err != nil {
76+
return fmt.Errorf("error setting capabilities for datasource %s: %s", d.Id(), err)
77+
}
78+
79+
log.Printf("[DEBUG] data_source_sumologic_role: retrieved %v", role)
80+
return nil
81+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package sumologic
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
7+
)
8+
9+
func TestAccDataSourcSumologicRole_basic(t *testing.T) {
10+
resource.Test(t, resource.TestCase{
11+
Providers: testAccProviders,
12+
Steps: []resource.TestStep{
13+
{
14+
Config: testDataSourceAccSumologicRoleConfig,
15+
Check: resource.ComposeTestCheckFunc(
16+
testAccDataSourceRoleCheck("data.sumologic_role.by_name", "sumologic_role.test"),
17+
testAccDataSourceRoleCheck("data.sumologic_role.by_id", "sumologic_role.test"),
18+
),
19+
},
20+
},
21+
})
22+
}
23+
24+
func testAccDataSourceRoleCheck(name, reference string) resource.TestCheckFunc {
25+
return resource.ComposeTestCheckFunc(
26+
resource.TestCheckResourceAttrSet(name, "id"),
27+
resource.TestCheckResourceAttrPair(name, "id", reference, "id"),
28+
resource.TestCheckResourceAttrPair(name, "name", reference, "name"),
29+
resource.TestCheckResourceAttrPair(name, "description", reference, "description"),
30+
resource.TestCheckResourceAttrPair(name, "filter_predicate", reference, "filter_predicate"),
31+
resource.TestCheckResourceAttrPair(name, "capabilities", reference, "capabilities"),
32+
)
33+
}
34+
35+
var testDataSourceAccSumologicRoleConfig = `
36+
resource "sumologic_role" "test" {
37+
name = "My_SumoRole"
38+
description = "My_SumoRoleDesc"
39+
filter_predicate = "_sourceCategory=Test"
40+
capabilities = ["viewCollectors"]
41+
}
42+
43+
data "sumologic_role" "by_name" {
44+
name = "${sumologic_role.test.name}"
45+
}
46+
47+
data "sumologic_role" "by_id" {
48+
id = "${sumologic_role.test.id}"
49+
}
50+
`

sumologic/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ func Provider() terraform.ResourceProvider {
7676
"sumologic_http_source": dataSourceSumologicHTTPSource(),
7777
"sumologic_personal_folder": dataSourceSumologicPersonalFolder(),
7878
"sumologic_my_user_id": dataSourceSumologicMyUserId(),
79+
"sumologic_role": dataSourceSumologicRole(),
7980
},
8081
ConfigureFunc: providerConfigure,
8182
}

sumologic/role.html.markdown

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
layout: "sumologic"
3+
page_title: "SumoLogic: sumologic_role"
4+
description: |-
5+
Provides a way to retrieve Sumo Logic role details (id, names, etc) for a role managed by another terraform stack.
6+
---
7+
8+
# sumologic_role
9+
10+
Provides a way to retrieve Sumo Logic role details (id, names, etc) for a role
11+
managed by another terraform stack.
12+
13+
14+
## Example Usage
15+
```hcl
16+
data "sumologic_role" "this" {
17+
name = "MyRole"
18+
}
19+
```
20+
21+
```hcl
22+
data "sumologic_role" "that" {
23+
id = "1234567890"
24+
}
25+
```
26+
27+
A role can be looked up by either `id` or `name`. One of those attributes needs to be specified.
28+
29+
If both `id` and `name` have been specified, `id` takes precedence.
30+
31+
## Attributes reference
32+
33+
The following attributes are exported:
34+
35+
- `id` - The internal ID of the role. This can be used to create users having that role.
36+
- `name` - The name of the role.
37+
- `description` - The description of the role.
38+
- `filter_predicate` - The search filter to restrict access to specific logs.
39+
- `capabilities` - The list of capabilities associated with the role.

sumologic/sumologic_role.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,25 @@ func (s *Client) GetRole(id string) (*Role, error) {
5353
return &role, nil
5454
}
5555

56+
func (s *Client) GetRoleName(name string) (*Role, error) {
57+
data, _, err := s.Get(fmt.Sprintf("v1/roles?name=%s", name))
58+
if err != nil {
59+
return nil, err
60+
}
61+
62+
if data == nil {
63+
return nil, fmt.Errorf("role with name '%s' does not exist", name)
64+
}
65+
66+
var response RoleResponse
67+
err = json.Unmarshal(data, &response)
68+
if err != nil {
69+
return nil, err
70+
}
71+
72+
return &response.Roles[0], nil
73+
}
74+
5675
func (s *Client) UpdateRole(role Role) error {
5776
url := fmt.Sprintf("v1/roles/%s", role.ID)
5877

@@ -62,6 +81,10 @@ func (s *Client) UpdateRole(role Role) error {
6281
return err
6382
}
6483

84+
type RoleResponse struct {
85+
Roles []Role `json:"data"`
86+
}
87+
6588
// models
6689
type Role struct {
6790
ID string `json:"id,omitempty"`

0 commit comments

Comments
 (0)