Skip to content

Commit b9945bf

Browse files
authored
Merge pull request #27 from netdata/feat/node-room-member
feat: add netdata_node_room_member
2 parents b2b1ddb + cd65265 commit b9945bf

File tree

10 files changed

+565
-0
lines changed

10 files changed

+565
-0
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 0.2.0
2+
3+
FEATURES:
4+
5+
- add `netdata_node_room_member` resource
6+
17
## 0.1.3
28

39
FEATURES:

docs/resources/node_room_member.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "netdata_node_room_member Resource - terraform-provider-netdata"
4+
subcategory: ""
5+
description: |-
6+
Provides a Netdata Cloud Node Room Member resource. Use this resource to manage node membership to the room in the selected space, only reachable nodes can be added to the room.
7+
This resource is useful in the case of Netdata Streaming and Replication https://learn.netdata.cloud/docs/observability-centralization-points/metrics-centralization-points/ when you want to spread
8+
the Netdata child agents across different rooms because by default all of them end in the same room like the Netdata parent.
9+
---
10+
11+
# netdata_node_room_member (Resource)
12+
13+
Provides a Netdata Cloud Node Room Member resource. Use this resource to manage node membership to the room in the selected space, only reachable nodes can be added to the room.
14+
This resource is useful in the case of [Netdata Streaming and Replication](https://learn.netdata.cloud/docs/observability-centralization-points/metrics-centralization-points/) when you want to spread
15+
the Netdata child agents across different rooms because by default all of them end in the same room like the Netdata parent.
16+
17+
## Example Usage
18+
19+
```terraform
20+
resource "netdata_node_room_member" "test" {
21+
space_id = "<space_id>"
22+
room_id = "<room_id>"
23+
node_names = [
24+
"node1",
25+
"node2"
26+
]
27+
}
28+
```
29+
30+
<!-- schema generated by tfplugindocs -->
31+
## Schema
32+
33+
### Required
34+
35+
- `node_names` (List of String) List of node names to add to the room
36+
- `room_id` (String) The Room ID of the space
37+
- `space_id` (String) Space ID of the member
38+
39+
## Import
40+
41+
Import is supported using the following syntax:
42+
43+
```shell
44+
#!/bin/sh
45+
46+
terraform import netdata_node_room_member.test space_id,room_id
47+
```

examples/complete/main.tf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ resource "netdata_room_member" "test" {
3232
space_member_id = netdata_space_member.test.id
3333
}
3434

35+
resource "netdata_node_room_member" "test" {
36+
room_id = netdata_room.test.id
37+
space_id = netdata_space.test.id
38+
node_names = [
39+
"node1",
40+
"node2"
41+
]
42+
}
43+
3544
resource "netdata_notification_slack_channel" "test" {
3645
name = "slack"
3746

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/sh
2+
3+
terraform import netdata_node_room_member.test space_id,room_id
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
resource "netdata_node_room_member" "test" {
2+
space_id = "<space_id>"
3+
room_id = "<room_id>"
4+
node_names = [
5+
"node1",
6+
"node2"
7+
]
8+
}

internal/client/client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ var (
1515
ErrChannelIDRequired = errors.New("channelID is required")
1616
ErrRoomIDRequired = errors.New("roomID is required")
1717
ErrMemberIDRequired = errors.New("memberID is required")
18+
ErrNodeID = errors.New("nodeID is required")
1819
)
1920

2021
type Client struct {

internal/client/models.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,13 @@ type Invitation struct {
7272
ID string `json:"id"`
7373
Email string `json:"email"`
7474
}
75+
76+
type RoomNodes struct {
77+
Nodes []RoomNode `json:"nodes"`
78+
}
79+
80+
type RoomNode struct {
81+
NodeID string `json:"nd"`
82+
NodeName string `json:"nm"`
83+
State string `json:"state"`
84+
}

internal/client/node_room_member.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package client
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"fmt"
7+
"net/http"
8+
)
9+
10+
func (c *Client) GetRoomNodes(spaceID, roomID string) (*RoomNodes, error) {
11+
if spaceID == "" {
12+
return nil, ErrSpaceIDRequired
13+
}
14+
if roomID == "" {
15+
return nil, ErrRoomIDRequired
16+
}
17+
18+
reqBody := []byte(`{"scope":{"nodes":[]}}`)
19+
20+
req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("%s/api/v3/spaces/%s/rooms/%s/nodes", c.HostURL, spaceID, roomID), bytes.NewReader(reqBody))
21+
if err != nil {
22+
return nil, err
23+
}
24+
25+
var roomNodes RoomNodes
26+
27+
err = c.doRequestUnmarshal(req, &roomNodes)
28+
if err != nil {
29+
return nil, err
30+
}
31+
32+
return &roomNodes, nil
33+
}
34+
35+
func (c *Client) GetAllNodes(spaceID string) (*RoomNodes, error) {
36+
if spaceID == "" {
37+
return nil, ErrSpaceIDRequired
38+
}
39+
40+
allRooms, err := c.GetRooms(spaceID)
41+
if err != nil {
42+
return nil, err
43+
}
44+
45+
var allNodesRoomID string
46+
for _, room := range *allRooms {
47+
if room.Name == "All nodes" {
48+
allNodesRoomID = room.ID
49+
break
50+
}
51+
}
52+
53+
roomNodes, err := c.GetRoomNodes(spaceID, allNodesRoomID)
54+
if err != nil {
55+
return nil, err
56+
}
57+
58+
return roomNodes, nil
59+
}
60+
61+
func (c *Client) CreateNodeRoomMember(spaceID, roomID, nodeID string) error {
62+
if spaceID == "" {
63+
return ErrSpaceIDRequired
64+
}
65+
if roomID == "" {
66+
return ErrRoomIDRequired
67+
}
68+
if nodeID == "" {
69+
return ErrNodeID
70+
}
71+
72+
reqBody, err := json.Marshal([]string{nodeID})
73+
if err != nil {
74+
return err
75+
}
76+
77+
req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("%s/api/v1/spaces/%s/rooms/%s/claimed-nodes", c.HostURL, spaceID, roomID), bytes.NewReader(reqBody))
78+
if err != nil {
79+
return err
80+
}
81+
82+
_, err = c.doRequest(req)
83+
if err != nil {
84+
return err
85+
}
86+
87+
return nil
88+
89+
}
90+
91+
func (c *Client) DeleteNodeRoomMember(spaceID, roomID, nodeID string) error {
92+
if spaceID == "" {
93+
return ErrSpaceIDRequired
94+
}
95+
if roomID == "" {
96+
return ErrRoomIDRequired
97+
}
98+
if nodeID == "" {
99+
return ErrNodeID
100+
}
101+
102+
req, err := http.NewRequest(http.MethodDelete, fmt.Sprintf("%s/api/v1/spaces/%s/rooms/%s/claimed-nodes?node_ids=%s", c.HostURL, spaceID, roomID, nodeID), nil)
103+
if err != nil {
104+
return err
105+
}
106+
107+
_, err = c.doRequest(req)
108+
if err != nil {
109+
return err
110+
}
111+
112+
return nil
113+
}

0 commit comments

Comments
 (0)