blob: c300c56c1e9a9cd4038275755c650c179ac729bc [file] [log] [blame]
package lbpools
import (
"github.com/rackspace/gophercloud"
"github.com/rackspace/gophercloud/pagination"
)
// List returns all load balancer pools that are associated with RackConnect.
func List(c *gophercloud.ServiceClient) pagination.Pager {
url := listURL(c)
createPage := func(r pagination.PageResult) pagination.Page {
return PoolPage{pagination.SinglePageBase(r)}
}
return pagination.NewPager(c, url, createPage)
}
// Get retrieves a specific load balancer pool (that is associated with RackConnect)
// based on its unique ID.
func Get(c *gophercloud.ServiceClient, id string) GetResult {
var res GetResult
_, res.Err = c.Get(getURL(c, id), &res.Body, nil)
return res
}
// ListNodes returns all load balancer pool nodes that are associated with RackConnect
// for the given LB pool ID.
func ListNodes(c *gophercloud.ServiceClient, id string) pagination.Pager {
url := listNodesURL(c, id)
createPage := func(r pagination.PageResult) pagination.Page {
return NodePage{pagination.SinglePageBase(r)}
}
return pagination.NewPager(c, url, createPage)
}
// CreateNode adds the cloud server with the given serverID to the load balancer
// pool with the given poolID.
func CreateNode(c *gophercloud.ServiceClient, poolID, serverID string) CreateNodeResult {
var res CreateNodeResult
reqBody := map[string]interface{}{
"cloud_server": map[string]string{
"id": serverID,
},
}
_, res.Err = c.Post(createNodeURL(c, poolID), reqBody, &res.Body, nil)
return res
}
// ListNodesDetails returns all load balancer pool nodes that are associated with RackConnect
// for the given LB pool ID with all their details.
func ListNodesDetails(c *gophercloud.ServiceClient, id string) pagination.Pager {
url := listNodesDetailsURL(c, id)
createPage := func(r pagination.PageResult) pagination.Page {
return NodeDetailsPage{pagination.SinglePageBase(r)}
}
return pagination.NewPager(c, url, createPage)
}
// GetNode retrieves a specific LB pool node (that is associated with RackConnect)
// based on its unique ID and the LB pool's unique ID.
func GetNode(c *gophercloud.ServiceClient, poolID, nodeID string) GetNodeResult {
var res GetNodeResult
_, res.Err = c.Get(nodeURL(c, poolID, nodeID), &res.Body, nil)
return res
}
// DeleteNode removes the node with the given nodeID from the LB pool with the
// given poolID.
func DeleteNode(c *gophercloud.ServiceClient, poolID, nodeID string) DeleteNodeResult {
var res DeleteNodeResult
_, res.Err = c.Delete(deleteNodeURL(c, poolID, nodeID), nil)
return res
}
// GetNodeDetails retrieves a specific LB pool node's details based on its unique
// ID and the LB pool's unique ID.
func GetNodeDetails(c *gophercloud.ServiceClient, poolID, nodeID string) GetNodeDetailsResult {
var res GetNodeDetailsResult
_, res.Err = c.Get(nodeDetailsURL(c, poolID, nodeID), &res.Body, nil)
return res
}
// NodeOpts are options for bulk adding/deleting nodes to LB pools.
type NodeOpts struct {
ServerID string
PoolID string
}
// NodesOpts are a slice of NodeOpts, passed as options for bulk operations.
type NodesOpts []NodeOpts
// ToLBPoolCreateNodesMap serializes a NodesOpts into a map to send in the request.
func (o NodesOpts) ToLBPoolCreateNodesMap() ([]map[string]interface{}, error) {
m := make([]map[string]interface{}, len(o))
for i := range o {
m[i] = map[string]interface{}{
"cloud_server": map[string]string{
"id": o[i].ServerID,
},
"load_balancer_pool": map[string]string{
"id": o[i].PoolID,
},
}
}
return m, nil
}
// CreateNodes adds the cloud servers with the given serverIDs to the corresponding
// load balancer pools with the given poolIDs.
func CreateNodes(c *gophercloud.ServiceClient, opts NodesOpts) CreateNodesResult {
var res CreateNodesResult
reqBody, err := opts.ToLBPoolCreateNodesMap()
if err != nil {
res.Err = err
return res
}
_, res.Err = c.Post(createNodesURL(c), reqBody, &res.Body, nil)
return res
}
// DeleteNodes removes the cloud servers with the given serverIDs to the corresponding
// load balancer pools with the given poolIDs.
func DeleteNodes(c *gophercloud.ServiceClient, opts NodesOpts) DeleteNodesResult {
var res DeleteNodesResult
reqBody, err := opts.ToLBPoolCreateNodesMap()
if err != nil {
res.Err = err
return res
}
_, res.Err = c.Request("DELETE", createNodesURL(c), gophercloud.RequestOpts{
JSONBody: &reqBody,
OkCodes: []int{204},
})
return res
}
// ListNodesDetailsForServer is similar to ListNodesDetails but only returns nodes
// for the given serverID.
func ListNodesDetailsForServer(c *gophercloud.ServiceClient, serverID string) pagination.Pager {
url := listNodesForServerURL(c, serverID)
createPage := func(r pagination.PageResult) pagination.Page {
return NodeDetailsForServerPage{pagination.SinglePageBase(r)}
}
return pagination.NewPager(c, url, createPage)
}