Skip to content

Commit 80c0547

Browse files
committed
Gcp Metrics source
1 parent 0680c23 commit 80c0547

File tree

5 files changed

+456
-13
lines changed

5 files changed

+456
-13
lines changed

sumologic/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ func Provider() terraform.ResourceProvider {
6868
"sumologic_cloudtrail_source": resourceSumologicGenericPollingSource(),
6969
"sumologic_elb_source": resourceSumologicGenericPollingSource(),
7070
"sumologic_cloudfront_source": resourceSumologicGenericPollingSource(),
71+
"sumologic_gcp_metrics_source": resourceSumologicGenericPollingSource(),
7172
"sumologic_cloud_to_cloud_source": resourceSumologicCloudToCloudSource(),
7273
"sumologic_metadata_source": resourceSumologicMetadataSource(),
7374
"sumologic_cloudsyslog_source": resourceSumologicCloudsyslogSource(),
Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
package sumologic
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io/ioutil"
7+
"os"
8+
"strconv"
9+
"testing"
10+
11+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
12+
"github.com/hashicorp/terraform-plugin-sdk/terraform"
13+
)
14+
15+
func TestAccSumologicGcpMetricsSource_create(t *testing.T) {
16+
var GcpMetricsSource PollingSource
17+
var collector Collector
18+
cName, cDescription, cCategory := getRandomizedParams()
19+
sName, sDescription, sCategory := getRandomizedParams()
20+
GcpMetricsResourceName := "sumologic_gcp_metrics_source.gcp_metrics_source"
21+
resource.Test(t, resource.TestCase{
22+
PreCheck: func() { getServiceAccountCreds(t) },
23+
Providers: testAccProviders,
24+
CheckDestroy: testAccCheckGcpMetricsSourceDestroy,
25+
Steps: []resource.TestStep{
26+
{
27+
Config: testAccSumologicGcpMetricsSourceConfig(t, cName, cDescription, cCategory, sName, sDescription, sCategory),
28+
Check: resource.ComposeTestCheckFunc(
29+
testAccCheckGcpMetricsSourceExists(GcpMetricsResourceName, &GcpMetricsSource),
30+
testAccCheckGcpMetricsSourceValues(&GcpMetricsSource, sName, sDescription, sCategory),
31+
testAccCheckCollectorExists("sumologic_collector.test", &collector),
32+
testAccCheckCollectorValues(&collector, cName, cDescription, cCategory, "Etc/UTC", ""),
33+
resource.TestCheckResourceAttrSet(GcpMetricsResourceName, "id"),
34+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "name", sName),
35+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "description", sDescription),
36+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "category", sCategory),
37+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "content_type", "GcpMetrics"),
38+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "path.0.type", "GcpMetricsPath"),
39+
),
40+
},
41+
},
42+
})
43+
}
44+
45+
func TestAccSumologicGcpMetricsSource_update(t *testing.T) {
46+
var GcpMetricsSource PollingSource
47+
cName, cDescription, cCategory := getRandomizedParams()
48+
sName, sDescription, sCategory := getRandomizedParams()
49+
sNameUpdated, sDescriptionUpdated, sCategoryUpdated := getRandomizedParams()
50+
GcpMetricsResourceName := "sumologic_gcp_metrics_source.gcp_metrics_source"
51+
resource.Test(t, resource.TestCase{
52+
PreCheck: func() { getServiceAccountCreds(t) },
53+
Providers: testAccProviders,
54+
CheckDestroy: testAccCheckHTTPSourceDestroy,
55+
Steps: []resource.TestStep{
56+
{
57+
Config: testAccSumologicGcpMetricsSourceConfig(t, cName, cDescription, cCategory, sName, sDescription, sCategory),
58+
Check: resource.ComposeTestCheckFunc(
59+
testAccCheckGcpMetricsSourceExists(GcpMetricsResourceName, &GcpMetricsSource),
60+
testAccCheckGcpMetricsSourceValues(&GcpMetricsSource, sName, sDescription, sCategory),
61+
resource.TestCheckResourceAttrSet(GcpMetricsResourceName, "id"),
62+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "name", sName),
63+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "description", sDescription),
64+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "category", sCategory),
65+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "content_type", "GcpMetrics"),
66+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "path.0.type", "GcpMetricsPath"),
67+
),
68+
},
69+
{
70+
Config: testAccSumologicGcpMetricsSourceConfig(t, cName, cDescription, cCategory, sNameUpdated, sDescriptionUpdated, sCategoryUpdated),
71+
Check: resource.ComposeTestCheckFunc(
72+
testAccCheckGcpMetricsSourceExists(GcpMetricsResourceName, &GcpMetricsSource),
73+
testAccCheckGcpMetricsSourceValues(&GcpMetricsSource, sNameUpdated, sDescriptionUpdated, sCategoryUpdated),
74+
resource.TestCheckResourceAttrSet(GcpMetricsResourceName, "id"),
75+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "name", sNameUpdated),
76+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "description", sDescriptionUpdated),
77+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "category", sCategoryUpdated),
78+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "content_type", "GcpMetrics"),
79+
resource.TestCheckResourceAttr(GcpMetricsResourceName, "path.0.type", "GcpMetricsPath"),
80+
),
81+
},
82+
},
83+
})
84+
}
85+
86+
func testAccCheckGcpMetricsSourceDestroy(s *terraform.State) error {
87+
client := testAccProvider.Meta().(*Client)
88+
for _, rs := range s.RootModule().Resources {
89+
if rs.Type != "sumologic_gcp_metrics_source" {
90+
continue
91+
}
92+
if rs.Primary.ID == "" {
93+
return fmt.Errorf("HTTP Source destruction check: HTTP Source ID is not set")
94+
}
95+
id, err := strconv.Atoi(rs.Primary.ID)
96+
if err != nil {
97+
return fmt.Errorf("Encountered an error: " + err.Error())
98+
}
99+
collectorID, err := strconv.Atoi(rs.Primary.Attributes["collector_id"])
100+
if err != nil {
101+
return fmt.Errorf("Encountered an error: " + err.Error())
102+
}
103+
s, err := client.GetPollingSource(collectorID, id)
104+
if err != nil {
105+
return fmt.Errorf("Encountered an error: " + err.Error())
106+
}
107+
if s != nil {
108+
return fmt.Errorf("Polling Source still exists")
109+
}
110+
}
111+
return nil
112+
}
113+
114+
func testAccCheckGcpMetricsSourceExists(n string, pollingSource *PollingSource) resource.TestCheckFunc {
115+
return func(s *terraform.State) error {
116+
rs, ok := s.RootModule().Resources[n]
117+
if !ok {
118+
return fmt.Errorf("not found: %s", n)
119+
}
120+
if rs.Primary.ID == "" {
121+
return fmt.Errorf("Polling Source ID is not set")
122+
}
123+
id, err := strconv.Atoi(rs.Primary.ID)
124+
if err != nil {
125+
return fmt.Errorf("Polling Source id should be int; got %s", rs.Primary.ID)
126+
}
127+
collectorID, err := strconv.Atoi(rs.Primary.Attributes["collector_id"])
128+
if err != nil {
129+
return fmt.Errorf("Encountered an error: " + err.Error())
130+
}
131+
c := testAccProvider.Meta().(*Client)
132+
pollingSourceResp, err := c.GetPollingSource(collectorID, id)
133+
if err != nil {
134+
return err
135+
}
136+
*pollingSource = *pollingSourceResp
137+
return nil
138+
}
139+
}
140+
141+
func testAccCheckGcpMetricsSourceValues(pollingSource *PollingSource, name, description, category string) resource.TestCheckFunc {
142+
return func(s *terraform.State) error {
143+
if pollingSource.Name != name {
144+
return fmt.Errorf("bad name, expected \"%s\", got: %#v", name, pollingSource.Name)
145+
}
146+
if pollingSource.Description != description {
147+
return fmt.Errorf("bad description, expected \"%s\", got: %#v", description, pollingSource.Description)
148+
}
149+
if pollingSource.Category != category {
150+
return fmt.Errorf("bad category, expected \"%s\", got: %#v", category, pollingSource.Category)
151+
}
152+
return nil
153+
}
154+
}
155+
156+
type ServiceAccountCreds struct {
157+
Type string `json:"type"`
158+
ProjectId string `json:"project_id"`
159+
PrivateKeyId string `json:"private_key_id"`
160+
PrivateKey string `json:"private_key"`
161+
ClientEmail string `json:"client_email"`
162+
ClientId string `json:"client_id"`
163+
AuthUri string `json:"auth_uri"`
164+
TokenUri string `json:"token_uri"`
165+
AuthProviderX509CertUrl string `json:"auth_provider_x509_cert_url"`
166+
ClientX509CertUrl string `json:"client_x509_cert_url"`
167+
}
168+
169+
func getServiceAccountCreds(t *testing.T) ServiceAccountCreds {
170+
var err error
171+
contentBytes := []byte("")
172+
serviceAccountDetailsFileEnvName := "SUMOLOGIC_GOOGLE_APPLICATION_CREDENTIALS"
173+
174+
serviceAccountDetailsFile, isEnvVarDefined := os.LookupEnv(serviceAccountDetailsFileEnvName)
175+
if !isEnvVarDefined {
176+
t.Fatal(fmt.Sprintf("Environment variable %#v has to be defined", serviceAccountDetailsFileEnvName))
177+
} else if len(serviceAccountDetailsFile) == 0 {
178+
t.Fatal(fmt.Sprintf("Environment variable %#v can not be empty string", serviceAccountDetailsFileEnvName))
179+
} else if _, statErr := os.Stat(serviceAccountDetailsFile); statErr != nil {
180+
t.Fatal(fmt.Sprintf("Environment variable %#v points to non-existing file %#v", serviceAccountDetailsFileEnvName, serviceAccountDetailsFile))
181+
} else {
182+
contentBytes, err = ioutil.ReadFile(serviceAccountDetailsFile)
183+
}
184+
if err != nil {
185+
t.Fatal(fmt.Sprintf("Failed to read %#v", serviceAccountDetailsFile))
186+
}
187+
var serviceAccountCreds ServiceAccountCreds
188+
json.Unmarshal(contentBytes, &serviceAccountCreds)
189+
return serviceAccountCreds
190+
}
191+
192+
func testAccSumologicGcpMetricsSourceConfig(t *testing.T, cName, cDescription, cCategory, sName, sDescription, sCategory string) string {
193+
cred := getServiceAccountCreds(t)
194+
srcStr := fmt.Sprintf(`
195+
resource "sumologic_collector" "test" {
196+
name = "%s"
197+
description = "%s"
198+
category = "%s"
199+
}
200+
resource "sumologic_gcp_metrics_source" "gcp_metrics_source" {
201+
name = "%s"
202+
description = "%s"
203+
category = "%s"
204+
content_type = "GcpMetrics"
205+
scan_interval = 300000
206+
paused = false
207+
collector_id = "${sumologic_collector.test.id}"
208+
authentication {
209+
type = "%s"
210+
project_id = "%s"
211+
private_key_id = "%s"
212+
private_key = <<EOPK
213+
%sEOPK
214+
client_email = "%s"
215+
client_id = "%s"
216+
auth_uri = "%s"
217+
token_uri = "%s"
218+
auth_provider_x509_cert_url = "%s"
219+
client_x509_cert_url = "%s"
220+
}
221+
path {
222+
type = "GcpMetricsPath"
223+
limit_to_regions = ["asia-south1"]
224+
limit_to_services = ["Compute Engine", "CloudSQL"]
225+
}
226+
lifecycle {
227+
ignore_changes = [authentication[0].private_key]
228+
}
229+
}
230+
`, cName, cDescription, cCategory, sName, sDescription, sCategory,
231+
cred.Type, cred.ProjectId, cred.PrivateKeyId, cred.PrivateKey, cred.ClientEmail, cred.ClientId, cred.AuthUri, cred.TokenUri, cred.AuthProviderX509CertUrl, cred.ClientX509CertUrl)
232+
return srcStr
233+
}

0 commit comments

Comments
 (0)