Skip to content

Commit

Permalink
feat(resource/node): impl update
Browse files Browse the repository at this point in the history
  • Loading branch information
IndexDoge authored and IndexDoge committed Mar 21, 2022
1 parent c03133e commit 3be6250
Show file tree
Hide file tree
Showing 6 changed files with 120 additions and 23 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.16
go-version: 1.18
-
name: Import GPG key
id: import_gpg
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
- name: Set up Go
uses: actions/[email protected]
with:
go-version: '1.16'
go-version: '1.18'
id: go

- name: Check out code into the Go module directory
Expand Down
79 changes: 59 additions & 20 deletions sspanel/resource_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"encoding/json"
"fmt"
"github.com/IndexDoge/terraform-provider-sspanel/sspanel/types"
"github.com/hashicorp/terraform-plugin-log/tflog"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
Expand Down Expand Up @@ -111,11 +112,16 @@ func resourceNode() *schema.Resource {
}
}

func resourceNodeCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) (diags diag.Diagnostics) {
// use the meta value to retrieve your client from the provider configure method
type createNodeResponse struct {
types.ApiResponse
NodeId int64 `json:"node_id"`
}

func generatePostNodeResourceData(d *schema.ResourceData) map[string]interface{} {
body := map[string]interface{}{
"name": d.Get("name"),
"server": d.Get("server"),
"node_ip": d.Get("node_ip"),
"mu_only": d.Get("mu_only"),
"rate": d.Get("rate"),
"info": d.Get("info"),
Expand All @@ -129,6 +135,13 @@ func resourceNodeCreate(ctx context.Context, d *schema.ResourceData, meta interf
"bandwidthlimit_resetday": d.Get("bandwidth_reset_day"),
}

return body
}

func resourceNodeCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) (diags diag.Diagnostics) {
// use the meta value to retrieve your client from the provider configure method
body := generatePostNodeResourceData(d)

client := meta.(*apiClient)
res, err := client.http.R().
SetBody(body).
Expand All @@ -138,21 +151,21 @@ func resourceNodeCreate(ctx context.Context, d *schema.ResourceData, meta interf
return diag.FromErr(err)
}

responseJson := make(map[string]interface{}, 0)
responseJson := createNodeResponse{}

err = json.NewDecoder(strings.NewReader(res.String())).Decode(&responseJson)
if err != nil {
return diag.FromErr(err)
}

if responseJson["ret"].(float64) != 1 {
return diag.Errorf("Create node failure: %s", responseJson["msg"].(string))
if responseJson.StatusCode != types.StatusOk {
return diag.Errorf("Create node failure: %s", responseJson.Msg)
}
tflog.Trace(ctx, "created a resource")

d.SetId(strconv.FormatInt(int64(responseJson["node_id"].(float64)), 10))
d.SetId(strconv.FormatInt(responseJson.NodeId, 10))

return
return resourceNodeRead(ctx, d, meta)
}

func resourceNodeRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
Expand All @@ -166,31 +179,57 @@ func resourceNodeRead(ctx context.Context, d *schema.ResourceData, meta interfac
return diag.FromErr(err)
}

responseJson := make(map[string]interface{}, 0)
responseJson := types.ReadNodeInfoResponse{}

err = json.NewDecoder(strings.NewReader(res.String())).Decode(&responseJson)

if responseJson["ret"].(float64) != 1 {
return diag.Errorf("Read node info failure: %s", responseJson["msg"].(string))
if responseJson.StatusCode != types.StatusOk {
return diag.Errorf("Read node info failure: %s", responseJson.Msg)
}

node := responseJson["node"].(map[string]interface{})
node := responseJson.Node

// Set Node Id
d.SetId(strconv.FormatInt(int64(node["id"].(float64)), 10))
d.SetId(strconv.FormatInt(node.Id, 10))

d.Set("name", node.Name)
d.Set("server", node.Server)
d.Set("mu_only", node.MuType)
d.Set("rate", node.TrafficRate)
d.Set("info", node.Info)
d.Set("type", node.Type)
d.Set("speedlimit", node.SpeedLimit)
d.Set("sort", node.Sort)
d.Set("node_ip", node.IP)
d.Set("status", node.Status)
d.Set("class", node.Class)
d.Set("bandwidth_limit", node.BandwidthLimit)
d.Set("bandwidth_reset_day", node.BandwidthResetDay)

d.Set("server", node["server"])
d.Set("name", node["name"])
d.Set("status", node["status"])

return nil
}

func resourceNodeUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
// use the meta value to retrieve your client from the provider configure method
// client := meta.(*apiClient)
body := generatePostNodeResourceData(d)
client := meta.(*apiClient)
res, err := client.http.R().
SetBody(body).
Put(fmt.Sprintf("node/%s", d.Id()))
if err != nil {
return diag.FromErr(err)
}

responseJson := types.ApiResponse{}

err = json.NewDecoder(strings.NewReader(res.String())).Decode(&responseJson)

if responseJson.StatusCode != types.StatusOk {
return diag.Errorf("Update node failure: %s", responseJson.Msg)
}

return diag.Errorf("not implemented")
return resourceNodeRead(ctx, d, meta)
}

func resourceNodeDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
Expand All @@ -204,12 +243,12 @@ func resourceNodeDelete(ctx context.Context, d *schema.ResourceData, meta interf
return diag.FromErr(err)
}

responseJson := make(map[string]interface{}, 0)
responseJson := types.ApiResponse{}

err = json.NewDecoder(strings.NewReader(res.String())).Decode(&responseJson)

if responseJson["ret"].(float64) != 1 {
return diag.Errorf("Delete node failure: %s", responseJson["msg"].(string))
if responseJson.StatusCode != types.StatusOk {
return diag.Errorf("Delete node failure: %s", responseJson.Msg)
}

return nil
Expand Down
17 changes: 16 additions & 1 deletion sspanel/resource_node_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,29 @@ func TestAccResourceNode(t *testing.T) {
"sspanel_node.foo", "id", regexp.MustCompile("^[0-9]*")),
),
},
{
Config: testAccResourceNodeUpdateNodeIp,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("sspanel_node.foo", "node_ip", "1.1.1.1")),
},
},
})
}

const testAccResourceNode = `
resource "sspanel_node" "foo" {
name = "Test node"
server = "test.trojan.one;port=443"
server = "1.1.1.1.nip.io;port=443"
node_ip = "127.0.0.1"
sort = 14
}
`

const testAccResourceNodeUpdateNodeIp = `
resource "sspanel_node" "foo" {
name = "Test node"
server = "1.1.1.1.nip.io;port=443"
node_ip = "1.1.1.1"
sort = 14
}
`
27 changes: 27 additions & 0 deletions sspanel/types/node.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package types

type NodeModal struct {
Id int64 `json:"id"`
Name string `json:"name"`
Type bool `json:"type"`
Server string `json:"server"`
Info string `json:"info"`
Status string `json:"status"`
Sort int `json:"sort"`
TrafficRate float64 `json:"traffic_rate"`
Class int64 `json:"node_class"`
SpeedLimit int64 `json:"node_speedlimit"`
Connector int64 `json:"node_connector"`
Bandwidth int64 `json:"node_bandwidth"`
BandwidthLimit int64 `json:"node_bandwidth_limit"`
BandwidthResetDay int `json:"bandwidthlimit_resetday"`
Heartbeat int `json:"node_heartbeat"`
IP string `json:"node_ip"`
Group int64 `json:"node_group"`
MuType int `json:"mu_only"`
Online int `json:"online"`
GFWBlock int `json:"gfw_block"`

// String stored JSON
CustomConfig string `json:"custom_config"`
}
16 changes: 16 additions & 0 deletions sspanel/types/sspanel.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package types

const (
StatusFailure int = 0
StatusOk = 1
)

type ApiResponse struct {
StatusCode int `json:"ret"`
Msg string `json:"msg"`
}

type ReadNodeInfoResponse struct {
ApiResponse
Node NodeModal `json:"node"`
}

0 comments on commit 3be6250

Please sign in to comment.