Skip to content

Commit 1cd97eb

Browse files
author
Werberson Silva
committed
# Conflicts: # src/client/client.go
2 parents afbdb8f + 8636ed8 commit 1cd97eb

File tree

4 files changed

+169
-31
lines changed

4 files changed

+169
-31
lines changed

samples/client/client.go

+16-10
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,14 @@ func addRecord(w http.ResponseWriter, r *http.Request) {
2121
client, err := hookClient.New(new(hookClient.BindmanHTTPHelper))
2222
if err == nil {
2323
result, err := client.AddRecord(vars["name"], "A", "0.0.0.0")
24-
if err == nil {
25-
w.Header().Set("Content-Type", "application/json")
26-
w.WriteHeader(200)
27-
json.NewEncoder(w).Encode(result)
28-
return
24+
if err == nil && result {
25+
records, err := client.GetRecords()
26+
if err == nil {
27+
w.Header().Set("Content-Type", "application/json")
28+
w.WriteHeader(200)
29+
json.NewEncoder(w).Encode(records)
30+
return
31+
}
2932
}
3033
}
3134
http.Error(w, err.Error(), 500)
@@ -36,11 +39,14 @@ func removeRecord(w http.ResponseWriter, r *http.Request) {
3639
client, err := hookClient.New(new(hookClient.BindmanHTTPHelper))
3740
if err == nil {
3841
result, err := client.RemoveRecord(vars["name"])
39-
if err == nil {
40-
w.Header().Set("Content-Type", "application/json")
41-
w.WriteHeader(200)
42-
json.NewEncoder(w).Encode(result)
43-
return
42+
if err == nil && result {
43+
records, err := client.GetRecords()
44+
if err == nil {
45+
w.Header().Set("Content-Type", "application/json")
46+
w.WriteHeader(200)
47+
json.NewEncoder(w).Encode(records)
48+
return
49+
}
4450
}
4551
}
4652
http.Error(w, err.Error(), 500)

samples/docker-compose.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ version: '3.5'
44
services:
55

66
bindman-dns-manager:
7-
image: abilioesteves/bindman-dns-webhook-hook-sample:0.0.5
7+
image: abilioesteves/bindman-dns-webhook-hook-sample:0.0.6
88
build: ./hook
99
ports:
1010
- 7070:7070
1111
environment:
1212
- BINDMAN_DNS_TTL=1200
1313

1414
bindman-dns-listener:
15-
image: abilioesteves/bindman-dns-webhook-client-sample:0.0.5
15+
image: abilioesteves/bindman-dns-webhook-client-sample:0.0.6
1616
build: ./client
1717
ports:
1818
- 7071:7071

src/client/client.go

+31-17
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import (
88
"path"
99
"strings"
1010

11-
"github.com/sirupsen/logrus"
12-
1311
"github.com/labbsr0x/bindman-dns-webhook/src/types"
1412
)
1513

@@ -39,35 +37,51 @@ func New(httpHelper HTTPHelper) (*DNSWebhookClient, error) {
3937
}, nil
4038
}
4139

40+
// GetRecords communicates with the dns manager and gets the DNS Records
41+
func (l *DNSWebhookClient) GetRecords() (result []types.DNSRecord, err error) {
42+
_, resp, err := l.http.Get(getRecordAPI(l.ManagerAddress, ""))
43+
if err == nil {
44+
err = json.Unmarshal(resp, &result)
45+
}
46+
return
47+
}
48+
49+
// GetRecord communicates with the dns manager and gets a DNS Record
50+
func (l *DNSWebhookClient) GetRecord(name string) (result types.DNSRecord, err error) {
51+
_, resp, err := l.http.Get(getRecordAPI(l.ManagerAddress, name))
52+
if err == nil {
53+
err = json.Unmarshal(resp, &result)
54+
}
55+
return
56+
}
57+
4258
// AddRecord adds a DNS record
4359
func (l *DNSWebhookClient) AddRecord(name string, recordType string, value string) (result bool, err error) {
60+
var resp []byte
4461
record := &types.DNSRecord{Value: value, Name: name, Type: recordType}
4562
ok, errs := record.Check()
4663
if ok {
47-
record, _ := json.Marshal(record)
48-
_, resp, err := l.http.Post(getRecordAPI(l.ManagerAddress, ""), record)
49-
if err != nil {
50-
logrus.Errorf("ERR: %s", err)
51-
return false, err
64+
mr, _ := json.Marshal(record)
65+
_, resp, err = l.http.Post(getRecordAPI(l.ManagerAddress, ""), mr)
66+
if err == nil {
67+
err = json.Unmarshal(resp, &result)
5268
}
53-
54-
err = json.Unmarshal(resp, &result)
55-
return result, err
69+
return
5670
}
57-
return false, fmt.Errorf("Invalid DNS Record: %v", strings.Join(errs, ", "))
71+
err = fmt.Errorf("Invalid DNS Record: %v", strings.Join(errs, ", "))
72+
return
5873
}
5974

6075
// RemoveRecord is a function that calls the defined webhook to remove a specific dns record
6176
func (l *DNSWebhookClient) RemoveRecord(name string) (result bool, err error) {
62-
_, resp, err := l.http.Delete(getRecordAPI(l.ManagerAddress, name))
77+
var resp []byte
78+
_, resp, err = l.http.Delete(getRecordAPI(l.ManagerAddress, name))
6379

64-
if err != nil {
65-
logrus.Errorf("ERR: %s", err)
66-
return false, err
80+
if err == nil {
81+
err = json.Unmarshal(resp, &result)
6782
}
6883

69-
json.Unmarshal(resp, &result)
70-
return result, err
84+
return
7185
}
7286

7387
// getRecordAPI builds the url for consuming the api

src/client/client_test.go

+120-2
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,141 @@
11
package client
22

3-
import "testing"
3+
import (
4+
"encoding/json"
5+
"net/http"
6+
"os"
7+
"testing"
8+
9+
"github.com/labbsr0x/bindman-dns-webhook/src/types"
10+
)
11+
12+
func initClient() (*DNSWebhookClient, *MockHTTPHelper) {
13+
env := "BINDMAN_DNS_MANAGER_ADDRESS"
14+
mockHelper := new(MockHTTPHelper)
15+
os.Setenv(env, "0.0.0.0")
16+
c, _ := New(mockHelper)
17+
18+
return c, mockHelper
19+
}
420

521
func TestNew(t *testing.T) {
22+
env := "BINDMAN_DNS_MANAGER_ADDRESS"
23+
mockHelper := new(MockHTTPHelper)
24+
os.Setenv(env, "0.0.0.0")
25+
_, err := New(mockHelper)
26+
if err != nil {
27+
t.Errorf("Expecting client.New to succeed. Got error instead: '%v'", err)
28+
}
29+
30+
c, err := New(nil)
31+
if err == nil {
32+
t.Errorf("Expecting client.New to fail. Got success instead: '%v'", c)
33+
}
34+
35+
os.Setenv(env, "")
36+
c, err = New(mockHelper)
37+
if err == nil {
38+
t.Errorf("Expecting client.New to fail. Got success instead: '%v'", c)
39+
}
40+
}
41+
42+
func TestGetRecords(t *testing.T) {
43+
c, mockHelper := initClient()
44+
expected := []types.DNSRecord{types.DNSRecord{}, types.DNSRecord{}}
45+
mockHelper.GetData, _ = json.Marshal(expected)
46+
47+
records, err := c.GetRecords()
48+
if err != nil {
49+
t.Errorf("Expecting successfull execution of GetRecords. Got error instead: '%v'", err)
50+
}
51+
if len(records) != len(expected) {
52+
t.Errorf("Expecting the number of records to be exactly the ")
53+
}
54+
}
55+
56+
func TestGetRecord(t *testing.T) {
57+
c, mockHelper := initClient()
58+
expected := types.DNSRecord{Name: "teste"}
59+
mockHelper.GetData, _ = json.Marshal(expected)
60+
61+
record, err := c.GetRecord(expected.Name)
62+
if err != nil {
63+
t.Errorf("Expecting successfull execution of GetRecord. Got error instead: '%v'", err)
64+
}
665

66+
if record.Name != expected.Name {
67+
t.Errorf("Expecting the recovered record name to match exactly the expected record. Got '%v' instead", record.Name)
68+
}
769
}
870

971
func TestAddRecord(t *testing.T) {
72+
c, mockHelper := initClient()
73+
expectedRecord := types.DNSRecord{Name: "teste", Value: "0.0.0.0", Type: "A"}
74+
expetectedResult := true
1075

76+
mockHelper.PostData, _ = json.Marshal(expetectedResult)
77+
result, err := c.AddRecord(expectedRecord.Name, expectedRecord.Type, expectedRecord.Value)
78+
if err != nil {
79+
t.Errorf("Expecting to successfully add the record. Got error instead: %v", err)
80+
}
81+
82+
if result != expetectedResult {
83+
t.Errorf("Expecting to successfully add the record. Got failure instead.")
84+
}
1185
}
1286

1387
func TestRemoveRecord(t *testing.T) {
88+
c, mockHelper := initClient()
89+
expetectedResult := true
90+
91+
mockHelper.DeleteData, _ = json.Marshal(expetectedResult)
92+
result, err := c.RemoveRecord("teste")
93+
if err != nil {
94+
t.Errorf("Expecting to successfully add the record. Got error instead: %v", err)
95+
}
1496

97+
if result != expetectedResult {
98+
t.Errorf("Expecting to successfully add the record. Got failure instead.")
99+
}
15100
}
16101

17102
func TestGetRecordAPI(t *testing.T) {
18-
103+
api := getRecordAPI("manager.test.com", "test.test.com")
104+
expected := "http://manager.test.com/records/test.test.com"
105+
if api != expected {
106+
t.Errorf("Expecting '%v'; Got '%v'", expected, api)
107+
}
19108
}
20109

21110
func TestGetAddress(t *testing.T) {
111+
env := "BINDMAN_TEST_ADDRESS"
112+
os.Setenv(env, "test.com")
113+
114+
addr, err := getAddress(env)
115+
if addr == "" || err != nil {
116+
t.Errorf("Expecting the getAddress func to succeed. Got err instead: '%v'", err)
117+
}
118+
119+
os.Setenv(env, "http://test.com")
120+
addr, err = getAddress(env)
121+
if err == nil {
122+
t.Errorf("Expecting the getAddress func to return error. Got success instead: '%v'", addr)
123+
}
124+
}
22125

126+
type MockHTTPHelper struct {
127+
PostData []byte
128+
GetData []byte
129+
DeleteData []byte
130+
}
131+
132+
func (m *MockHTTPHelper) Post(url string, data []byte) (http.Response, []byte, error) {
133+
return http.Response{}, m.PostData, nil
134+
}
135+
136+
func (m *MockHTTPHelper) Get(url string) (http.Response, []byte, error) {
137+
return http.Response{}, m.GetData, nil
138+
}
139+
func (m *MockHTTPHelper) Delete(url string) (http.Response, []byte, error) {
140+
return http.Response{}, m.DeleteData, nil
23141
}

0 commit comments

Comments
 (0)