|  | 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) | 
|  | } |