commit 02a1a10065dd3be4f89f30756adc670b1a8ab468 from: Oliver Lowe date: Tue Jan 18 11:40:39 2022 UTC Support cascading delete of objects commit - da19a2fd0fbbf44bc5495e68c7f24103d025b3b6 commit + 02a1a10065dd3be4f89f30756adc670b1a8ab468 blob - 0acd1fe2636f1eb7ea85326e2fdf0fabab991ccb blob + ef0c13cb27a60a4050375907a86d2a293651657c --- crud.go +++ crud.go @@ -46,10 +46,11 @@ func (c *Client) CreateHost(host Host) error { return nil } -// DeleteHost deletes the Host identified by name. -// If no Host is found, error wraps ErrNotExist. -func (c *Client) DeleteHost(name string) error { - if err := c.deleteObject("/objects/hosts/" + name); err != nil { +// DeleteHost deletes the Host identified by name. If cascade is true, objects +// depending on the Host are also deleted. If no Host is found, error wraps +// ErrNotExist. +func (c *Client) DeleteHost(name string, cascade bool) error { + if err := c.deleteObject("/objects/hosts/"+name, cascade); err != nil { return fmt.Errorf("delete host %s: %w", name, err) } return nil @@ -97,10 +98,11 @@ func (c *Client) CreateService(service Service) error return nil } -// DeleteService deletes the Service identified by name. -// If no Service is found, error wraps ErrNotExist. -func (c *Client) DeleteService(name string) error { - if err := c.deleteObject("/objects/services/" + name); err != nil { +// DeleteService deletes the Service identified by name. If cascade is true, objects +// depending on the Service are also deleted. If no Service is found, error wraps +// ErrNotExist. +func (c *Client) DeleteService(name string, cascade bool) error { + if err := c.deleteObject("/objects/services/"+name, cascade); err != nil { return fmt.Errorf("delete service %s: %w", name, err) } return nil @@ -148,10 +150,11 @@ func (c *Client) CreateUser(user User) error { return nil } -// DeleteUser deletes the User identified by name. -// If no User is found, error wraps ErrNotExist. -func (c *Client) DeleteUser(name string) error { - if err := c.deleteObject("/objects/users/" + name); err != nil { +// DeleteUser deletes the User identified by name. If cascade is true, objects +// depending on the User are also deleted. If no User is found, error wraps +// ErrNotExist. +func (c *Client) DeleteUser(name string, cascade bool) error { + if err := c.deleteObject("/objects/users/"+name, cascade); err != nil { return fmt.Errorf("delete user %s: %w", name, err) } return nil @@ -199,10 +202,11 @@ func (c *Client) CreateHostGroup(hostgroup HostGroup) return nil } -// DeleteHostGroup deletes the HostGroup identified by name. -// If no HostGroup is found, error wraps ErrNotExist. -func (c *Client) DeleteHostGroup(name string) error { - if err := c.deleteObject("/objects/hostgroups/" + name); err != nil { +// DeleteHostGroup deletes the HostGroup identified by name. If cascade is true, objects +// depending on the HostGroup are also deleted. If no HostGroup is found, error wraps +// ErrNotExist. +func (c *Client) DeleteHostGroup(name string, cascade bool) error { + if err := c.deleteObject("/objects/hostgroups/"+name, cascade); err != nil { return fmt.Errorf("delete hostgroup %s: %w", name, err) } return nil blob - 422a47b223a6e1bcd865ee64d48cc324a1e12465 blob + ae632700bfed2ae9da2abec5f19be31065e895b8 --- crud.skel +++ crud.skel @@ -40,12 +40,12 @@ func (c *Client) CreateTYPE(LOWER TYPE) error { return nil } -// DeleteTYPE deletes the TYPE identified by name. -// If no TYPE is found, error wraps ErrNotExist. -func (c *Client) DeleteTYPE(name string) error { - if err := c.deleteObject("/objects/PLURAL/" + name); err != nil { +// DeleteTYPE deletes the TYPE identified by name. If cascade is true, objects +// depending on the TYPE are also deleted. If no TYPE is found, error wraps +// ErrNotExist. +func (c *Client) DeleteTYPE(name string, cascade bool) error { + if err := c.deleteObject("/objects/PLURAL/" + name, cascade); err != nil { return fmt.Errorf("delete LOWER %s: %w", name, err) } return nil } - blob - 9c097b2fca4ad21d3d698825365fcc4e4799791f blob + 7c35d24aaef3e10d308c0e2cd9547e15b25d392c --- http.go +++ http.go @@ -64,11 +64,19 @@ func (c *Client) put(path string, body io.Reader) (*ht return c.Do(req) } -func (c *Client) delete(path string) (*http.Response, error) { - url := "https://" + c.addr + versionPrefix + path - req, err := NewRequest(http.MethodDelete, url, c.username, c.password, nil) +func (c *Client) delete(path string, cascade bool) (*http.Response, error) { + u, err := url.Parse("https://" + c.addr + versionPrefix + path) if err != nil { return nil, err } + if cascade { + v := url.Values{} + v.Set("cascade", "1") + u.RawQuery = v.Encode() + } + req, err := NewRequest(http.MethodDelete, u.String(), c.username, c.password, nil) + if err != nil { + return nil, err + } return c.Do(req) } blob - d6de04aa780b601ace52aa53f0fdb4d82850dcdd blob + 61b38ff5a9a35520693db11b03b0607ab7b557e5 --- icinga_test.go +++ icinga_test.go @@ -55,7 +55,7 @@ func TestFilter(t *testing.T) { if err != nil { t.Error(err) } - defer client.DeleteHostGroup(hostgroup.Name) + defer client.DeleteHostGroup(hostgroup.Name, false) var want, got []string for i := 0; i < 5; i++ { @@ -75,7 +75,7 @@ func TestFilter(t *testing.T) { } defer func() { for _, name := range want { - if err := client.DeleteHost(name); err != nil { + if err := client.DeleteHost(name, false); err != nil { t.Log(err) } } @@ -105,7 +105,7 @@ func TestUserRoundTrip(t *testing.T) { t.Fatal(err) } defer func() { - if err := client.DeleteUser(want.Name); err != nil { + if err := client.DeleteUser(want.Name, false); err != nil { t.Error(err) } }() @@ -134,3 +134,29 @@ func TestChecker(t *testing.T) { } t.Logf("%+v\n", s) } + +func TestCreateService(t *testing.T) { + client, err := newTestClient() + if err != nil { + t.Skipf("no local test icinga? got: %v", err) + } + + h := icinga.Host{ + Name: "example.com", + Address: "example.com", + CheckCommand: "dummy", + DisplayName: "RFC 2606 example host", + } + if err := client.CreateHost(h); err != nil { + t.Error(err) + } + defer client.DeleteHost(h.Name, true) + s := icinga.Service{ + Name: h.Name + "!http", + CheckCommand: "http", + DisplayName: "RFC 2606 example website", + } + if err := client.CreateService(s); err != nil { + t.Error(err) + } +} blob - 4dbab0014688cbda7091bfcd4ddcb5868f987c39 blob + fef3e9de2d177ab3cfb246a54ca271d1a65bf22f --- object.go +++ object.go @@ -85,8 +85,8 @@ func (c *Client) createObject(obj object) error { return iresp.Error } -func (c *Client) deleteObject(objpath string) error { - resp, err := c.delete(objpath) +func (c *Client) deleteObject(objpath string, cascade bool) error { + resp, err := c.delete(objpath, cascade) if err != nil { return err }