Commit Diff


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
 	}