220 lines
5.1 KiB
Go
220 lines
5.1 KiB
Go
|
package rabbithole
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"net/http"
|
||
|
"net/url"
|
||
|
)
|
||
|
|
||
|
//
|
||
|
// GET /api/exchanges
|
||
|
//
|
||
|
|
||
|
type IngressEgressStats struct {
|
||
|
PublishIn int `json:"publish_in"`
|
||
|
PublishInDetails RateDetails `json:"publish_in_details"`
|
||
|
|
||
|
PublishOut int `json:"publish_out"`
|
||
|
PublishOutDetails RateDetails `json:"publish_out_details"`
|
||
|
}
|
||
|
|
||
|
type ExchangeInfo struct {
|
||
|
Name string `json:"name"`
|
||
|
Vhost string `json:"vhost"`
|
||
|
Type string `json:"type"`
|
||
|
Durable bool `json:"durable"`
|
||
|
AutoDelete bool `json:"auto_delete"`
|
||
|
Internal bool `json:"internal"`
|
||
|
Arguments map[string]interface{} `json:"arguments"`
|
||
|
|
||
|
MessageStats IngressEgressStats `json:"message_stats"`
|
||
|
}
|
||
|
|
||
|
type ExchangeSettings struct {
|
||
|
Type string `json:"type"`
|
||
|
Durable bool `json:"durable"`
|
||
|
AutoDelete bool `json:"auto_delete"`
|
||
|
Arguments map[string]interface{} `json:"arguments"`
|
||
|
}
|
||
|
|
||
|
func (c *Client) ListExchanges() (rec []ExchangeInfo, err error) {
|
||
|
req, err := newGETRequest(c, "exchanges")
|
||
|
if err != nil {
|
||
|
return []ExchangeInfo{}, err
|
||
|
}
|
||
|
|
||
|
if err = executeAndParseRequest(c, req, &rec); err != nil {
|
||
|
return []ExchangeInfo{}, err
|
||
|
}
|
||
|
|
||
|
return rec, nil
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// GET /api/exchanges/{vhost}
|
||
|
//
|
||
|
|
||
|
func (c *Client) ListExchangesIn(vhost string) (rec []ExchangeInfo, err error) {
|
||
|
req, err := newGETRequest(c, "exchanges/"+url.QueryEscape(vhost))
|
||
|
if err != nil {
|
||
|
return []ExchangeInfo{}, err
|
||
|
}
|
||
|
|
||
|
if err = executeAndParseRequest(c, req, &rec); err != nil {
|
||
|
return []ExchangeInfo{}, err
|
||
|
}
|
||
|
|
||
|
return rec, nil
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// GET /api/exchanges/{vhost}/{name}
|
||
|
//
|
||
|
|
||
|
// Example response:
|
||
|
//
|
||
|
// {
|
||
|
// "incoming": [
|
||
|
// {
|
||
|
// "stats": {
|
||
|
// "publish": 2760,
|
||
|
// "publish_details": {
|
||
|
// "rate": 20
|
||
|
// }
|
||
|
// },
|
||
|
// "channel_details": {
|
||
|
// "name": "127.0.0.1:46928 -> 127.0.0.1:5672 (2)",
|
||
|
// "number": 2,
|
||
|
// "connection_name": "127.0.0.1:46928 -> 127.0.0.1:5672",
|
||
|
// "peer_port": 46928,
|
||
|
// "peer_host": "127.0.0.1"
|
||
|
// }
|
||
|
// }
|
||
|
// ],
|
||
|
// "outgoing": [
|
||
|
// {
|
||
|
// "stats": {
|
||
|
// "publish": 1280,
|
||
|
// "publish_details": {
|
||
|
// "rate": 20
|
||
|
// }
|
||
|
// },
|
||
|
// "queue": {
|
||
|
// "name": "amq.gen-7NhO_yRr4lDdp-8hdnvfuw",
|
||
|
// "vhost": "rabbit\/hole"
|
||
|
// }
|
||
|
// }
|
||
|
// ],
|
||
|
// "message_stats": {
|
||
|
// "publish_in": 2760,
|
||
|
// "publish_in_details": {
|
||
|
// "rate": 20
|
||
|
// },
|
||
|
// "publish_out": 1280,
|
||
|
// "publish_out_details": {
|
||
|
// "rate": 20
|
||
|
// }
|
||
|
// },
|
||
|
// "name": "amq.fanout",
|
||
|
// "vhost": "rabbit\/hole",
|
||
|
// "type": "fanout",
|
||
|
// "durable": true,
|
||
|
// "auto_delete": false,
|
||
|
// "internal": false,
|
||
|
// "arguments": {
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
type ExchangeIngressDetails struct {
|
||
|
Stats MessageStats `json:"stats"`
|
||
|
ChannelDetails PublishingChannel `json:"channel_details"`
|
||
|
}
|
||
|
|
||
|
type PublishingChannel struct {
|
||
|
Number int `json:"number"`
|
||
|
Name string `json:"name"`
|
||
|
ConnectionName string `json:"connection_name"`
|
||
|
PeerPort Port `json:"peer_port"`
|
||
|
PeerHost string `json:"peer_host"`
|
||
|
}
|
||
|
|
||
|
type NameAndVhost struct {
|
||
|
Name string `json:"name"`
|
||
|
Vhost string `json:"vhost"`
|
||
|
}
|
||
|
|
||
|
type ExchangeEgressDetails struct {
|
||
|
Stats MessageStats `json:"stats"`
|
||
|
Queue NameAndVhost `json:"queue"`
|
||
|
}
|
||
|
|
||
|
type DetailedExchangeInfo struct {
|
||
|
Name string `json:"name"`
|
||
|
Vhost string `json:"vhost"`
|
||
|
Type string `json:"type"`
|
||
|
Durable bool `json:"durable"`
|
||
|
AutoDelete bool `json:"auto_delete"`
|
||
|
Internal bool `json:"internal"`
|
||
|
Arguments map[string]interface{} `json:"arguments"`
|
||
|
|
||
|
Incoming []ExchangeIngressDetails `json:"incoming"`
|
||
|
Outgoing []ExchangeEgressDetails `json:"outgoing"`
|
||
|
}
|
||
|
|
||
|
func (c *Client) GetExchange(vhost, exchange string) (rec *DetailedExchangeInfo, err error) {
|
||
|
req, err := newGETRequest(c, "exchanges/"+url.QueryEscape(vhost)+"/"+exchange)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if err = executeAndParseRequest(c, req, &rec); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return rec, nil
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// PUT /api/exchanges/{vhost}/{exchange}
|
||
|
//
|
||
|
|
||
|
func (c *Client) DeclareExchange(vhost, exchange string, info ExchangeSettings) (res *http.Response, err error) {
|
||
|
if info.Arguments == nil {
|
||
|
info.Arguments = make(map[string]interface{})
|
||
|
}
|
||
|
body, err := json.Marshal(info)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
req, err := newRequestWithBody(c, "PUT", "exchanges/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(exchange), body)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
res, err = executeRequest(c, req)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return res, nil
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// DELETE /api/exchanges/{vhost}/{name}
|
||
|
//
|
||
|
|
||
|
func (c *Client) DeleteExchange(vhost, exchange string) (res *http.Response, err error) {
|
||
|
req, err := newRequestWithBody(c, "DELETE", "exchanges/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(exchange), nil)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
res, err = executeRequest(c, req)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return res, nil
|
||
|
}
|