Skip to content

Commit afe6fc3

Browse files
authored
Add support for CSE Network block (#271)
* Adding support for CSE Network block
1 parent 3555895 commit afe6fc3

File tree

7 files changed

+367
-0
lines changed

7 files changed

+367
-0
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
FEATURES:
44

55
* **New Resource:** sumologic_hierarchy (GH-260)
6+
* **New Resource:** sumologic_cse_network_block (GH-271)
7+
=======
68
DEPRECATIONS:
79

810
* resource/sumologic_monitor: Deprecated `triggers` in favor of `trigger_conditions` (GH-267)

sumologic/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ func Provider() terraform.ResourceProvider {
3838
},
3939
},
4040
ResourcesMap: map[string]*schema.Resource{
41+
"sumologic_cse_network_block": resourceSumologicCSENetworkBlock(),
4142
"sumologic_collector": resourceSumologicCollector(),
4243
"sumologic_http_source": resourceSumologicHTTPSource(),
4344
"sumologic_gcp_source": resourceSumologicGCPSource(),
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package sumologic
2+
3+
import (
4+
"errors"
5+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
6+
"log"
7+
)
8+
9+
func resourceSumologicCSENetworkBlock() *schema.Resource {
10+
return &schema.Resource{
11+
Create: resourceSumologicCSENetworkBlockCreate,
12+
Read: resourceSumologicCSENetworkBlockRead,
13+
Delete: resourceSumologicCSENetworkBlockDelete,
14+
Update: resourceSumologicCSENetworkBlockUpdate,
15+
Importer: &schema.ResourceImporter{
16+
State: schema.ImportStatePassthrough,
17+
},
18+
19+
Schema: map[string]*schema.Schema{
20+
"address_block": {
21+
Type: schema.TypeString,
22+
Required: true,
23+
ForceNew: false,
24+
},
25+
"label": {
26+
Type: schema.TypeString,
27+
Optional: true,
28+
ForceNew: false,
29+
},
30+
"internal": {
31+
Type: schema.TypeBool,
32+
Optional: true,
33+
ForceNew: false,
34+
Default: true,
35+
},
36+
"suppresses_signals": {
37+
Type: schema.TypeBool,
38+
Optional: true,
39+
ForceNew: false,
40+
Default: false,
41+
},
42+
},
43+
}
44+
}
45+
46+
func resourceSumologicCSENetworkBlockRead(d *schema.ResourceData, meta interface{}) error {
47+
c := meta.(*Client)
48+
49+
var cseNetworkBlock *CSENetworkBlock
50+
id := d.Id()
51+
52+
cseNetworkBlock, err := c.GetCSENetworkBlock(id)
53+
if err != nil {
54+
log.Printf("[WARN] CSE Network Block not found when looking by id: %s, err: %v", id, err)
55+
56+
}
57+
58+
if cseNetworkBlock == nil {
59+
log.Printf("[WARN] CSE Network Block not found, removing from state: %v - %v", id, err)
60+
d.SetId("")
61+
return nil
62+
}
63+
64+
d.Set("address_block", cseNetworkBlock.AddressBlock)
65+
d.Set("label", cseNetworkBlock.Label)
66+
d.Set("internal", cseNetworkBlock.Internal)
67+
d.Set("suppresses_signals", cseNetworkBlock.SuppressesSignals)
68+
69+
return nil
70+
}
71+
72+
func resourceSumologicCSENetworkBlockDelete(d *schema.ResourceData, meta interface{}) error {
73+
c := meta.(*Client)
74+
75+
id := d.Id()
76+
return c.DeleteCSENetworkBlock(id)
77+
78+
}
79+
80+
func resourceSumologicCSENetworkBlockCreate(d *schema.ResourceData, meta interface{}) error {
81+
c := meta.(*Client)
82+
83+
if d.Id() == "" {
84+
id, err := c.CreateCSENetworkBlock(CSENetworkBlock{
85+
AddressBlock: d.Get("address_block").(string),
86+
Label: d.Get("label").(string),
87+
Internal: d.Get("internal").(bool),
88+
SuppressesSignals: d.Get("suppresses_signals").(bool),
89+
})
90+
91+
if err != nil {
92+
return err
93+
}
94+
log.Printf("[INFO] got id: %s", id)
95+
d.SetId(id)
96+
}
97+
98+
return resourceSumologicCSENetworkBlockUpdate(d, meta)
99+
}
100+
101+
func resourceSumologicCSENetworkBlockUpdate(d *schema.ResourceData, meta interface{}) error {
102+
cseNetworkBlock, err := resourceToCSENetworkBlock(d)
103+
if err != nil {
104+
return err
105+
}
106+
107+
c := meta.(*Client)
108+
if err = c.UpdateCSENetworkBlock(cseNetworkBlock); err != nil {
109+
return err
110+
}
111+
112+
return resourceSumologicCSENetworkBlockRead(d, meta)
113+
}
114+
115+
func resourceToCSENetworkBlock(d *schema.ResourceData) (CSENetworkBlock, error) {
116+
id := d.Id()
117+
if id == "" {
118+
return CSENetworkBlock{}, errors.New("network block id not specified")
119+
}
120+
121+
return CSENetworkBlock{
122+
ID: id,
123+
AddressBlock: d.Get("address_block").(string),
124+
Label: d.Get("label").(string),
125+
Internal: d.Get("internal").(bool),
126+
SuppressesSignals: d.Get("suppresses_signals").(bool),
127+
}, nil
128+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package sumologic
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
8+
"github.com/hashicorp/terraform-plugin-sdk/terraform"
9+
)
10+
11+
func TestAccSumologicSCENetworkBlock_create(t *testing.T) {
12+
var networkBlock CSENetworkBlock
13+
nAddressBlock := "10.0.1.0/26"
14+
nLabel := "network block test"
15+
nInternal := true
16+
nSuppressesSignals := false
17+
resourceName := "sumologic_cse_network_block.network_block"
18+
resource.Test(t, resource.TestCase{
19+
PreCheck: func() { testAccPreCheck(t) },
20+
Providers: testAccProviders,
21+
CheckDestroy: testAccCSENetworkBlockDestroy,
22+
Steps: []resource.TestStep{
23+
{
24+
Config: testCreateCSENetworkBlockConfig(nAddressBlock, nLabel, nInternal, nSuppressesSignals),
25+
Check: resource.ComposeTestCheckFunc(
26+
testCheckNetworkBlockExists(resourceName, &networkBlock),
27+
testCheckNetworkBlockValues(&networkBlock, nAddressBlock, nLabel, nInternal, nSuppressesSignals),
28+
resource.TestCheckResourceAttrSet(resourceName, "id"),
29+
),
30+
},
31+
},
32+
})
33+
}
34+
35+
func testAccCSENetworkBlockDestroy(s *terraform.State) error {
36+
client := testAccProvider.Meta().(*Client)
37+
38+
for _, rs := range s.RootModule().Resources {
39+
if rs.Type != "sumologic_cse_network_block" {
40+
continue
41+
}
42+
43+
if rs.Primary.ID == "" {
44+
return fmt.Errorf("CSE Network Block destruction check: CSE Network Block ID is not set")
45+
}
46+
47+
networkBlockID := rs.Primary.Attributes["id"]
48+
49+
s, err := client.GetCSENetworkBlock(networkBlockID)
50+
if err != nil {
51+
return fmt.Errorf("Encountered an error: " + err.Error())
52+
}
53+
if s != nil {
54+
return fmt.Errorf("network Block still exists")
55+
}
56+
}
57+
return nil
58+
}
59+
60+
func testCreateCSENetworkBlockConfig(nAddressBlock string, nLabel string, nInternal bool, nSuppressesSignals bool) string {
61+
return fmt.Sprintf(`
62+
resource "sumologic_cse_network_block" "network_block" {
63+
address_block = "%s"
64+
label = "%s"
65+
internal = "%t"
66+
suppresses_signals = "%t"
67+
}
68+
`, nAddressBlock, nLabel, nInternal, nSuppressesSignals)
69+
}
70+
71+
func testCheckNetworkBlockExists(n string, networkBlock *CSENetworkBlock) resource.TestCheckFunc {
72+
return func(s *terraform.State) error {
73+
rs, ok := s.RootModule().Resources[n]
74+
if !ok {
75+
return fmt.Errorf("not found: %s", n)
76+
}
77+
78+
if rs.Primary.ID == "" {
79+
return fmt.Errorf("network Block ID is not set")
80+
}
81+
82+
networkBlockID := rs.Primary.Attributes["id"]
83+
84+
c := testAccProvider.Meta().(*Client)
85+
networkBlockResp, err := c.GetCSENetworkBlock(networkBlockID)
86+
if err != nil {
87+
return err
88+
}
89+
90+
*networkBlock = *networkBlockResp
91+
92+
return nil
93+
}
94+
}
95+
96+
func testCheckNetworkBlockValues(networkBlock *CSENetworkBlock, nAddressBlock string, nLabel string, nInternal bool, nSuppressesSignals bool) resource.TestCheckFunc {
97+
return func(s *terraform.State) error {
98+
if networkBlock.AddressBlock != nAddressBlock {
99+
return fmt.Errorf("bad address block, expected \"%s\", got: %#v", nAddressBlock, networkBlock.AddressBlock)
100+
}
101+
if networkBlock.Label != nLabel {
102+
return fmt.Errorf("bad label, expected \"%s\", got: %#v", nLabel, networkBlock.Label)
103+
}
104+
if networkBlock.Internal != nInternal {
105+
return fmt.Errorf("bad internal flag, expected \"%t\", got: %#v", nInternal, networkBlock.Internal)
106+
}
107+
if networkBlock.SuppressesSignals != nSuppressesSignals {
108+
return fmt.Errorf("bad suppressesSignals flag, expected \"%t\", got: %#v", nSuppressesSignals, networkBlock.SuppressesSignals)
109+
}
110+
return nil
111+
}
112+
}
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+
"encoding/json"
5+
"fmt"
6+
)
7+
8+
func (s *Client) GetCSENetworkBlock(id string) (*CSENetworkBlock, error) {
9+
data, _, err := s.Get(fmt.Sprintf("sec/v1/network-blocks/%s", id), false)
10+
if err != nil {
11+
return nil, err
12+
}
13+
14+
if data == nil {
15+
return nil, nil
16+
}
17+
18+
var response CSENetworkBlockResponse
19+
err = json.Unmarshal(data, &response)
20+
if err != nil {
21+
return nil, err
22+
}
23+
24+
return &response.CSENetworkBlock, nil
25+
}
26+
27+
func (s *Client) DeleteCSENetworkBlock(id string) error {
28+
_, err := s.Delete(fmt.Sprintf("sec/v1/network-blocks/%s", id))
29+
30+
return err
31+
}
32+
33+
func (s *Client) CreateCSENetworkBlock(cseNetworkBlock CSENetworkBlock) (string, error) {
34+
35+
request := CSENetworkBlockRequest{
36+
CSENetworkBlock: cseNetworkBlock,
37+
}
38+
39+
var response CSENetworkBlockResponse
40+
41+
responseBody, err := s.Post("sec/v1/network-blocks", request, false)
42+
if err != nil {
43+
return "", err
44+
}
45+
46+
err = json.Unmarshal(responseBody, &response)
47+
48+
if err != nil {
49+
return "", err
50+
}
51+
52+
return response.CSENetworkBlock.ID, nil
53+
}
54+
55+
func (s *Client) UpdateCSENetworkBlock(cseNetworkBlock CSENetworkBlock) error {
56+
url := fmt.Sprintf("sec/v1/network-blocks/%s", cseNetworkBlock.ID)
57+
cseNetworkBlock.ID = ""
58+
request := CSENetworkBlockRequest{
59+
CSENetworkBlock: cseNetworkBlock,
60+
}
61+
62+
_, err := s.Put(url, request, false)
63+
64+
return err
65+
}
66+
67+
type CSENetworkBlockRequest struct {
68+
CSENetworkBlock CSENetworkBlock `json:"fields"`
69+
}
70+
71+
type CSENetworkBlockResponse struct {
72+
CSENetworkBlock CSENetworkBlock `json:"data"`
73+
}
74+
75+
type CSENetworkBlock struct {
76+
ID string `json:"id,omitempty"`
77+
AddressBlock string `json:"addressBlock"`
78+
Label string `json:"label"`
79+
Internal bool `json:"internal"`
80+
SuppressesSignals bool `json:"suppressesSignals"`
81+
}

website/docs/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@
3535
+ [sumologic_monitor][46]
3636
+ [sumologic_monitor_folder][47]
3737

38+
##### Cloud SIEM Enterprise (CSE)
39+
+ [sumologic_cse_network_block][50]
40+
3841
#### Common Source Properties
3942

4043
The following properties are common to ALL sources and can be used to configure each source.
@@ -85,3 +88,4 @@ resource "sumologic_http_source" "instrumentation-logs" {
8588
[45]: r/connection.html.markdown
8689
[46]: r/monitor.html.markdown
8790
[47]: r/monitor_folder.html.markdown
91+
[50]: r/cse_network_block.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_network_block"
4+
description: |-
5+
Provides a CSE Network Block
6+
---
7+
8+
# sumologic_network_block
9+
Provides a Sumo Logic CSE Network Block.
10+
11+
## Example Usage
12+
```hcl
13+
resource "sumologic_network_block" "network_block" {
14+
address_block = "10.0.1.0/26"
15+
label = "network block from terraform"
16+
internal = "true"
17+
suppresses_signals = "false"
18+
}
19+
```
20+
21+
## Argument reference
22+
23+
The following arguments are supported:
24+
25+
- `address_block` - (Required) The address block.
26+
- `label` - (Required) The displayable label of the address block.
27+
- `internal` - (Required) Internal flag.
28+
- `suppresses_signals` - (Required) Suppresses signal flag.
29+
30+
The following attributes are exported:
31+
32+
- `id` - The internal ID of the network block.
33+
34+
## Import
35+
36+
Network Block can be imported using the field id, e.g.:
37+
```hcl
38+
terraform import sumologic_network_block.network_block id
39+
```

0 commit comments

Comments
 (0)