Blob


1 package icinga_test
3 import (
4 "crypto/tls"
5 "errors"
6 "math/rand"
7 "net/http"
8 "reflect"
9 "sort"
10 "testing"
11 "time"
13 "olowe.co/icinga"
14 )
16 func init() {
17 rand.Seed(time.Now().Unix())
18 }
20 func randomHostname(suffix string) string {
21 var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
22 b := make([]rune, 8)
23 for i := range b {
24 b[i] = letters[rand.Intn(len(letters))]
25 }
26 return string(b) + suffix
27 }
29 func createTestHosts(c *icinga.Client) ([]icinga.Host, error) {
30 hostgroup := icinga.HostGroup{Name: "test", DisplayName: "Test Group"}
31 if err := c.CreateHostGroup(hostgroup); err != nil && !errors.Is(err, icinga.ErrExist) {
32 return nil, err
33 }
35 var hosts []icinga.Host
36 for i := 0; i < 5; i++ {
37 h := icinga.Host{
38 Name: randomHostname(".example.org"),
39 CheckCommand: "random",
40 Groups: []string{hostgroup.Name},
41 }
42 hosts = append(hosts, h)
43 if err := c.CreateHost(h); err != nil && !errors.Is(err, icinga.ErrExist) {
44 return nil, err
45 }
46 }
47 return hosts, nil
48 }
50 func newTestClient() (*icinga.Client, error) {
51 tp := http.DefaultTransport.(*http.Transport)
52 tp.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
53 c := http.DefaultClient
54 c.Transport = tp
55 return icinga.Dial("127.0.0.1:5665", "root", "icinga", c)
56 }
58 func compareStringSlice(a, b []string) bool {
59 if len(a) != len(b) {
60 return false
61 }
62 for i := range a {
63 if a[i] != b[i] {
64 return false
65 }
66 }
67 return true
68 }
70 func TestFilter(t *testing.T) {
71 client, err := newTestClient()
72 if err != nil {
73 t.Skipf("no local test icinga? got: %v", err)
74 }
76 var want, got []string
77 hosts, err := createTestHosts(client)
78 if err != nil {
79 t.Fatal(err)
80 }
81 for _, h := range hosts {
82 want = append(want, h.Name)
83 }
84 defer func() {
85 for _, h := range hosts {
86 if err := client.DeleteHost(h.Name, true); err != nil {
87 t.Log(err)
88 }
89 }
90 }()
91 hosts, err = client.Hosts("match(\"*example.org\", host.name)")
92 if err != nil {
93 t.Fatal(err)
94 }
95 for _, h := range hosts {
96 got = append(got, h.Name)
97 }
98 sort.Strings(want)
99 sort.Strings(got)
100 if !compareStringSlice(want, got) {
101 t.Fail()
103 t.Logf("want %+v got %+v", want, got)
106 func TestUserRoundTrip(t *testing.T) {
107 client, err := newTestClient()
108 if err != nil {
109 t.Skipf("no local test icinga? got: %v", err)
111 want := icinga.User{Name: "olly", Email: "olly@example.com", Groups: []string{}}
112 if err := client.CreateUser(want); err != nil && !errors.Is(err, icinga.ErrExist) {
113 t.Fatal(err)
115 defer func() {
116 if err := client.DeleteUser(want.Name, false); err != nil {
117 t.Error(err)
119 }()
120 got, err := client.LookupUser(want.Name)
121 if err != nil {
122 t.Fatal(err)
124 if !reflect.DeepEqual(want, got) {
125 t.Errorf("want %+v, got %+v", want, got)
129 func TestChecker(t *testing.T) {
130 client, err := newTestClient()
131 if err != nil {
132 t.Skipf("no local test icinga? got: %v", err)
135 h := icinga.Host{
136 Name: randomHostname(".checker.example.com"),
137 CheckCommand: "hostalive",
139 if err := client.CreateHost(h); err != nil {
140 t.Fatal(err)
143 s := icinga.Service{
144 Name: h.Name + "!http",
145 CheckCommand: "http",
147 if err := client.CreateService(s); err != nil {
148 t.Fatal(err)
150 if err := s.Check(client); err != nil {
151 t.Fatal(err)
153 s, err = client.LookupService(h.Name + "!http")
154 if err != nil {
155 t.Fatal(err)
157 t.Logf("%+v\n", s)
160 func TestCheckHostGroup(t *testing.T) {
161 client, err := newTestClient()
162 if err != nil {
163 t.Skipf("no local test icinga? got: %v", err)
165 hosts, err := createTestHosts(client)
166 if err != nil {
167 t.Fatal(err)
169 defer func() {
170 for _, h := range hosts {
171 if err := client.DeleteHost(h.Name, true); err != nil {
172 t.Error(err)
175 }()
176 hostgroup, err := client.LookupHostGroup("test")
177 if err != nil {
178 t.Fatal(err)
180 if err := hostgroup.Check(client); err != nil {
181 t.Fatal(err)
185 func TestCreateService(t *testing.T) {
186 client, err := newTestClient()
187 if err != nil {
188 t.Skipf("no local test icinga? got: %v", err)
191 h := icinga.Host{
192 Name: "example.com",
193 Address: "example.com",
194 CheckCommand: "dummy",
195 DisplayName: "RFC 2606 example host",
197 if err := client.CreateHost(h); err != nil {
198 t.Error(err)
200 defer client.DeleteHost(h.Name, true)
201 s := icinga.Service{
202 Name: h.Name + "!http",
203 CheckCommand: "http",
204 DisplayName: "RFC 2606 example website",
206 if err := client.CreateService(s); err != nil {
207 t.Error(err)
211 func TestNonExistentService(t *testing.T) {
212 client, err := newTestClient()
213 if err != nil {
214 t.Skipf("no local test icinga? got: %v", err)
217 filter := `match("blablabla", service.name)`
218 service, err := client.Services(filter)
219 if err == nil {
220 t.Fail()
222 t.Log(err)
223 t.Logf("%+v", service)