Blob


1 package icinga_test
3 import (
4 "crypto/tls"
5 "errors"
6 "math/rand"
7 "net/http"
8 "reflect"
9 "sort"
10 "testing"
12 "olowe.co/icinga"
13 )
15 func randomHostname() string {
16 var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
17 b := make([]rune, 8)
18 for i := range b {
19 b[i] = letters[rand.Intn(len(letters))]
20 }
21 return string(b) + ".example.org"
22 }
24 func newTestClient() (*icinga.Client, error) {
25 tp := http.DefaultTransport.(*http.Transport)
26 tp.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
27 c := http.DefaultClient
28 c.Transport = tp
29 return icinga.Dial("127.0.0.1:5665", "root", "icinga", c)
30 }
32 func compareStringSlice(a, b []string) bool {
33 if len(a) != len(b) {
34 return false
35 }
36 for i, v := range a {
37 if v != b[i] {
38 return false
39 }
40 }
41 return true
42 }
44 func TestFilter(t *testing.T) {
45 client, err := newTestClient()
46 if err != nil {
47 t.Skipf("no local test icinga? got: %v", err)
48 }
50 hostgroup := icinga.HostGroup{Name: "examples", DisplayName: "Test Group"}
51 if err := client.CreateHostGroup(hostgroup); err != nil {
52 t.Error(err)
53 }
54 hostgroup, err = client.LookupHostGroup(hostgroup.Name)
55 if err != nil {
56 t.Error(err)
57 }
58 defer client.DeleteHostGroup(hostgroup.Name)
60 var want, got []string
61 for i := 0; i < 5; i++ {
62 h := icinga.Host{
63 Name: randomHostname(),
64 CheckCommand: "hostalive",
65 Groups: []string{hostgroup.Name},
66 }
67 want = append(want, h.Name)
68 if err := client.CreateHost(h); err != nil {
69 if !errors.Is(err, icinga.ErrExist) {
70 t.Error(err)
71 }
72 continue
73 }
74 t.Logf("created host %s", h.Name)
75 }
76 defer func() {
77 for _, name := range want {
78 if err := client.DeleteHost(name); err != nil {
79 t.Log(err)
80 }
81 }
82 }()
83 hosts, err := client.Hosts("match(\"*example.org\", host.name)")
84 if err != nil {
85 t.Fatal(err)
86 }
87 for _, h := range hosts {
88 got = append(got, h.Name)
89 }
90 sort.Strings(want)
91 sort.Strings(got)
92 if !compareStringSlice(want, got) {
93 t.Fail()
94 }
95 t.Logf("want %+v got %+v", want, got)
96 }
98 func TestUserRoundTrip(t *testing.T) {
99 client, err := newTestClient()
100 if err != nil {
101 t.Skipf("no local test icinga? got: %v", err)
103 want := icinga.User{Name: "olly", Email: "olly@example.com", Groups: []string{}}
104 if err := client.CreateUser(want); err != nil && !errors.Is(err, icinga.ErrExist) {
105 t.Fatal(err)
107 defer func() {
108 if err := client.DeleteUser(want.Name); err != nil {
109 t.Error(err)
111 }()
112 got, err := client.LookupUser(want.Name)
113 if err != nil {
114 t.Fatal(err)
116 if !reflect.DeepEqual(want, got) {
117 t.Errorf("want %+v, got %+v", want, got)
121 func TestChecker(t *testing.T) {
122 client, err := newTestClient()
123 if err != nil {
124 t.Skipf("no local test icinga? got: %v", err)
127 s := icinga.Service{Name: "9p.io!http"}
128 if err := s.Check(client); err != nil {
129 t.Fatal(err)
131 s, err = client.LookupService("9p.io!http")
132 if err != nil {
133 t.Fatal(err)
135 t.Logf("%+v\n", s)