diff --git a/rabbithole_test.go b/rabbithole_test.go index db2f0c0..ab94a75 100644 --- a/rabbithole_test.go +++ b/rabbithole_test.go @@ -989,6 +989,35 @@ var _ = Describe("RabbitMQ HTTP API client", func() { }) }) + Context("vhost-limits", func() { + maxConnections := 1 + It("returns an empty list of limits", func() { + xs, err := rmqc.GetVhostLimits("rabbit/hole") + Ω(err).Should(BeNil()) + Ω(xs).Should(HaveLen(0)) + }) + It("sets the max-connections limit", func() { + _, err := rmqc.PutVhostLimitsMaxConnections("rabbit/hole", maxConnections) + Ω(err).Should(BeNil()) + }) + It("returns the max-connections limit", func() { + xs, err := rmqc.GetVhostLimits("rabbit/hole") + Ω(err).Should(BeNil()) + Ω(xs).Should(HaveLen(1)) + Ω(xs[0].Vhost).Should(Equal("rabbit/hole")) + Ω(xs[0].Value.MaxConnections).Should(Equal(maxConnections)) + }) + It("deletes the max-connections limit", func() { + _, err := rmqc.DeleteVhostLimitsMaxConnections("rabbit/hole") + Ω(err).Should(BeNil()) + }) + It("returns the max-connections limit", func() { + xs, err := rmqc.GetVhostLimits("rabbit/hole") + Ω(err).Should(BeNil()) + Ω(xs).Should(HaveLen(0)) + }) + }) + Context("GET /bindings", func() { It("returns decoded response", func() { conn := openConnection("/") diff --git a/vhost_limits.go b/vhost_limits.go new file mode 100644 index 0000000..78cce2d --- /dev/null +++ b/vhost_limits.go @@ -0,0 +1,66 @@ +package rabbithole + +import ( + "encoding/json" + "net/http" + "net/url" +) + +// VhostLimitsValue are properties used to modify virtual hosts limits. +type VhostLimitsValue struct { + // Maximum number of connections + MaxConnections int `json:"max-connections"` +} + +type VhostLimitsInfo struct { + Vhost string `json:"vhost"` + Value VhostLimitsValue `json:"value"` +} + +type VhostLimitsMaxConnections struct { + Value int `json:"value"` +} + +func (c *Client) GetVhostLimits(vhostname string) (rec []VhostLimitsInfo, err error) { + req, err := newGETRequest(c, "vhost-limits/"+url.PathEscape(vhostname)) + if err != nil { + return nil, err + } + + if err = executeAndParseRequest(c, req, &rec); err != nil { + return nil, err + } + + return rec, nil +} + +func (c *Client) PutVhostLimitsMaxConnections(vhostname string, maxConnections int) (res *http.Response, err error) { + body, err := json.Marshal(VhostLimitsMaxConnections{Value: maxConnections}) + if err != nil { + return nil, err + } + + req, err := newRequestWithBody(c, "PUT", "vhost-limits/"+url.PathEscape(vhostname)+"/max-connections", body) + if err != nil { + return nil, err + } + + if res, err = executeRequest(c, req); err != nil { + return nil, err + } + + return res, nil +} + +func (c *Client) DeleteVhostLimitsMaxConnections(vhostname string) (res *http.Response, err error) { + req, err := newRequestWithBody(c, "DELETE", "vhost-limits/"+url.PathEscape(vhostname)+"/max-connections", nil) + if err != nil { + return nil, err + } + + if res, err = executeRequest(c, req); err != nil { + return nil, err + } + + return res, nil +}