Skip to content

Commit c5de62a

Browse files
committed
Add provider for custom fields
1 parent 7cc57d2 commit c5de62a

File tree

3 files changed

+377
-0
lines changed

3 files changed

+377
-0
lines changed
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package sumologic
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
7+
)
8+
9+
func resourceSumologicField() *schema.Resource {
10+
return &schema.Resource{
11+
Create: resourceSumologicFieldCreate,
12+
Read: resourceSumologicFieldRead,
13+
Update: resourceSumologicFieldUpdate,
14+
Delete: resourceSumologicFieldDelete,
15+
Importer: &schema.ResourceImporter{
16+
State: resourceSumologicFieldImport,
17+
},
18+
19+
Schema: map[string]*schema.Schema{
20+
21+
"field_name": {
22+
Type: schema.TypeString,
23+
Required: true,
24+
ForceNew: false,
25+
},
26+
27+
"field_id": {
28+
Type: schema.TypeString,
29+
Computed: true,
30+
ForceNew: false,
31+
},
32+
33+
"data_type": {
34+
Type: schema.TypeString,
35+
Required: true,
36+
ForceNew: false,
37+
},
38+
39+
"state": {
40+
Type: schema.TypeString,
41+
Required: true,
42+
ForceNew: false,
43+
},
44+
},
45+
}
46+
}
47+
48+
func resourceSumologicFieldRead(d *schema.ResourceData, meta interface{}) error {
49+
c := meta.(*Client)
50+
51+
id := d.Get("field_id").(string)
52+
name := d.Get("field_name").(string)
53+
if id == "" {
54+
newId, err := c.FindFieldId(name)
55+
if err != nil {
56+
return err
57+
}
58+
id = newId
59+
}
60+
61+
field, err := c.GetField(id)
62+
if err != nil {
63+
return err
64+
}
65+
66+
if field == nil {
67+
fmt.Printf("[WARN] Field not found, removing from state: %v - %v\n", id, err)
68+
d.SetId("")
69+
return nil
70+
}
71+
72+
d.Set("field_name", field.FieldName)
73+
d.Set("field_id", field.FieldId)
74+
d.Set("data_type", field.DataType)
75+
d.Set("state", field.State)
76+
77+
return nil
78+
}
79+
80+
func resourceSumologicFieldDelete(d *schema.ResourceData, meta interface{}) error {
81+
c := meta.(*Client)
82+
83+
id := d.Get("field_id").(string)
84+
name := d.Get("field_name").(string)
85+
if id == "" {
86+
newId, err := c.FindFieldId(name)
87+
if err != nil {
88+
return err
89+
}
90+
id = newId
91+
}
92+
93+
return c.DeleteField(id)
94+
}
95+
96+
func resourceSumologicFieldUpdate(d *schema.ResourceData, meta interface{}) error {
97+
return nil
98+
}
99+
100+
func resourceSumologicFieldCreate(d *schema.ResourceData, meta interface{}) error {
101+
c := meta.(*Client)
102+
103+
if d.Id() == "" {
104+
field := resourceToField(d)
105+
id, err := c.CreateField(field)
106+
if err != nil {
107+
return err
108+
}
109+
110+
d.SetId(id)
111+
}
112+
113+
return resourceSumologicFieldRead(d, meta)
114+
}
115+
116+
func resourceSumologicFieldImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
117+
if d.Get("field_id").(string) == "" {
118+
d.Set("field_id", d.Id())
119+
}
120+
121+
return []*schema.ResourceData{d}, nil
122+
}
123+
124+
func resourceToField(d *schema.ResourceData) Field {
125+
return Field{
126+
DataType: d.Get("data_type").(string),
127+
FieldId: d.Get("field_id").(string),
128+
State: d.Get("state").(string),
129+
FieldName: d.Get("field_name").(string),
130+
}
131+
}
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package sumologic
2+
3+
import (
4+
"fmt"
5+
"math/rand"
6+
"strconv"
7+
"strings"
8+
"testing"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
11+
"github.com/hashicorp/terraform-plugin-sdk/terraform"
12+
)
13+
14+
func TestAccSumologicField_basic(t *testing.T) {
15+
var field Field
16+
testFieldName := "fields_provider_test"
17+
testDataType := "String"
18+
testState := "Enabled"
19+
resource.Test(t, resource.TestCase{
20+
PreCheck: func() { testAccPreCheck(t) },
21+
Providers: testAccProviders,
22+
CheckDestroy: testAccCheckFieldDestroy(field),
23+
Steps: []resource.TestStep{
24+
{
25+
Config: testAccCheckSumologicFieldConfigImported(testFieldName, testDataType, testState),
26+
},
27+
{
28+
ResourceName: "sumologic_field.foo",
29+
ImportState: true,
30+
ImportStateVerify: true,
31+
},
32+
},
33+
})
34+
}
35+
36+
func TestAccField_create(t *testing.T) {
37+
var field Field
38+
testFieldName := "fields_provider_test"
39+
testDataType := "String"
40+
testState := "Enabled"
41+
resource.Test(t, resource.TestCase{
42+
PreCheck: func() { testAccPreCheck(t) },
43+
Providers: testAccProviders,
44+
CheckDestroy: testAccCheckFieldDestroy(field),
45+
Steps: []resource.TestStep{
46+
{
47+
Config: testAccSumologicField(testFieldName, testDataType, testState),
48+
Check: resource.ComposeTestCheckFunc(
49+
testAccCheckFieldExists("sumologic_field.test", &field, t),
50+
testAccCheckFieldAttributes("sumologic_field.test"),
51+
resource.TestCheckResourceAttr("sumologic_field.test", "field_name", testFieldName),
52+
resource.TestCheckResourceAttr("sumologic_field.test", "data_type", testDataType),
53+
resource.TestCheckResourceAttr("sumologic_field.test", "state", testState),
54+
),
55+
},
56+
},
57+
})
58+
}
59+
60+
func testAccCheckFieldDestroy(field Field) resource.TestCheckFunc {
61+
return func(s *terraform.State) error {
62+
client := testAccProvider.Meta().(*Client)
63+
for _, r := range s.RootModule().Resources {
64+
id := r.Primary.ID
65+
u, err := client.GetField(id)
66+
if err != nil {
67+
return fmt.Errorf("Encountered an error: " + err.Error())
68+
}
69+
if u != nil {
70+
return fmt.Errorf("Field %s still exists", id)
71+
}
72+
}
73+
return nil
74+
}
75+
}
76+
77+
func testAccCheckFieldExists(name string, field *Field, t *testing.T) resource.TestCheckFunc {
78+
return func(s *terraform.State) error {
79+
rs, ok := s.RootModule().Resources[name]
80+
if !ok {
81+
//need this so that we don't get an unused import error for strconv in some cases
82+
return fmt.Errorf("Error = %s. Field not found: %s", strconv.FormatBool(ok), name)
83+
}
84+
85+
//need this so that we don't get an unused import error for strings in some cases
86+
if strings.EqualFold(rs.Primary.ID, "") {
87+
return fmt.Errorf("Field ID is not set")
88+
}
89+
90+
id := rs.Primary.ID
91+
client := testAccProvider.Meta().(*Client)
92+
newField, err := client.GetField(id)
93+
if err != nil {
94+
return fmt.Errorf("Field %s not found", id)
95+
}
96+
field = newField
97+
return nil
98+
}
99+
}
100+
func testAccCheckSumologicFieldConfigImported(fieldName string, dataType string, state string) string {
101+
return fmt.Sprintf(`
102+
resource "sumologic_field" "foo" {
103+
field_name = "%s"
104+
data_type = "%s"
105+
state = "%s"
106+
}
107+
`, fieldName, dataType, state)
108+
}
109+
110+
func testAccSumologicField(fieldName string, dataType string, state string) string {
111+
return fmt.Sprintf(`
112+
resource "sumologic_field" "test" {
113+
field_name = "%s"
114+
data_type = "%s"
115+
state = "%s"
116+
}
117+
`, fieldName, dataType, state)
118+
}
119+
120+
func testAccSumologicFieldUpdate(fieldName string, dataType string, state string) string {
121+
return fmt.Sprintf(`
122+
resource "sumologic_field" "test" {
123+
field_name = "%s"
124+
data_type = "%s"
125+
state = "%s"
126+
}
127+
`, fieldName, dataType, state)
128+
}
129+
130+
func testAccCheckFieldAttributes(name string) resource.TestCheckFunc {
131+
return func(s *terraform.State) error {
132+
f := resource.ComposeTestCheckFunc(
133+
resource.TestCheckResourceAttrSet(name, "field_name"),
134+
resource.TestCheckResourceAttrSet(name, "field_id"),
135+
resource.TestCheckResourceAttrSet(name, "data_type"),
136+
resource.TestCheckResourceAttrSet(name, "state"),
137+
)
138+
return f(s)
139+
}
140+
}

sumologic/sumologic_field.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package sumologic
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"fmt"
7+
)
8+
9+
func (s *Client) GetField(id string) (*Field, error) {
10+
urlWithoutParams := "v1/fields/%s"
11+
paramString := ""
12+
sprintfArgs := []interface{}{}
13+
sprintfArgs = append(sprintfArgs, id)
14+
15+
urlWithParams := fmt.Sprintf(urlWithoutParams+paramString, sprintfArgs...)
16+
17+
data, _, err := s.Get(urlWithParams)
18+
if err != nil {
19+
return nil, err
20+
}
21+
if data == nil {
22+
return nil, nil
23+
}
24+
25+
var field Field
26+
27+
err = json.Unmarshal(data, &field)
28+
if err != nil {
29+
return nil, err
30+
}
31+
32+
return &field, nil
33+
34+
}
35+
36+
func (s *Client) DeleteField(id string) error {
37+
urlWithoutParams := "v1/fields/%s"
38+
paramString := ""
39+
sprintfArgs := []interface{}{}
40+
sprintfArgs = append(sprintfArgs, id)
41+
42+
urlWithParams := fmt.Sprintf(urlWithoutParams+paramString, sprintfArgs...)
43+
44+
_, err := s.Delete(urlWithParams)
45+
46+
return err
47+
}
48+
49+
func (s *Client) CreateField(field Field) (string, error) {
50+
urlWithoutParams := "v1/fields"
51+
52+
data, err := s.Post(urlWithoutParams, field)
53+
if err != nil {
54+
return "", err
55+
}
56+
57+
var createdField Field
58+
59+
err = json.Unmarshal(data, &createdField)
60+
if err != nil {
61+
return "", err
62+
}
63+
64+
return createdField.FieldId, nil
65+
}
66+
67+
func (s *Client) FindFieldId(name string) (string, error) {
68+
urlWithoutParams := "v1/fields"
69+
70+
body, _, err := s.Get(urlWithoutParams)
71+
if err != nil {
72+
return "", err
73+
}
74+
75+
var prettyJSON bytes.Buffer
76+
error := json.Indent(&prettyJSON, body, "", "\t")
77+
if error != nil {
78+
return "", error
79+
}
80+
81+
var fields FieldsResponse
82+
83+
err = json.Unmarshal(body, &fields)
84+
if err != nil {
85+
return "", err
86+
}
87+
88+
for _, f := range fields.Data {
89+
if f.FieldName == name {
90+
return f.FieldId, nil
91+
}
92+
}
93+
94+
return "", fmt.Errorf("Field \"%s\" not found", name)
95+
}
96+
97+
type Field struct {
98+
FieldId string `json:"fieldId"`
99+
DataType string `json:"dataType"`
100+
State string `json:"state"`
101+
FieldName string `json:"fieldName"`
102+
}
103+
104+
type FieldsResponse struct {
105+
Data []Field `json:"data"`
106+
}

0 commit comments

Comments
 (0)