132 lines
3.6 KiB
Go
132 lines
3.6 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package api
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net/url"
|
|
)
|
|
|
|
const (
|
|
// NodePoolAll is the node pool that always includes all nodes.
|
|
NodePoolAll = "all"
|
|
|
|
// NodePoolDefault is the default node pool.
|
|
NodePoolDefault = "default"
|
|
)
|
|
|
|
// NodePools is used to access node pools endpoints.
|
|
type NodePools struct {
|
|
client *Client
|
|
}
|
|
|
|
// NodePools returns a handle on the node pools endpoints.
|
|
func (c *Client) NodePools() *NodePools {
|
|
return &NodePools{client: c}
|
|
}
|
|
|
|
// List is used to list all node pools.
|
|
func (n *NodePools) List(q *QueryOptions) ([]*NodePool, *QueryMeta, error) {
|
|
var resp []*NodePool
|
|
qm, err := n.client.query("/v1/node/pools", &resp, q)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return resp, qm, nil
|
|
}
|
|
|
|
// PrefixList is used to list node pools that match a given prefix.
|
|
func (n *NodePools) PrefixList(prefix string, q *QueryOptions) ([]*NodePool, *QueryMeta, error) {
|
|
if q == nil {
|
|
q = &QueryOptions{}
|
|
}
|
|
q.Prefix = prefix
|
|
return n.List(q)
|
|
}
|
|
|
|
// Info is used to fetch details of a specific node pool.
|
|
func (n *NodePools) Info(name string, q *QueryOptions) (*NodePool, *QueryMeta, error) {
|
|
if name == "" {
|
|
return nil, nil, errors.New("missing node pool name")
|
|
}
|
|
|
|
var resp NodePool
|
|
qm, err := n.client.query("/v1/node/pool/"+url.PathEscape(name), &resp, q)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return &resp, qm, nil
|
|
}
|
|
|
|
// Register is used to create or update a node pool.
|
|
func (n *NodePools) Register(pool *NodePool, w *WriteOptions) (*WriteMeta, error) {
|
|
if pool == nil {
|
|
return nil, errors.New("missing node pool")
|
|
}
|
|
if pool.Name == "" {
|
|
return nil, errors.New("missing node pool name")
|
|
}
|
|
|
|
wm, err := n.client.put("/v1/node/pools", pool, nil, w)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return wm, nil
|
|
}
|
|
|
|
// Delete is used to delete a node pool.
|
|
func (n *NodePools) Delete(name string, w *WriteOptions) (*WriteMeta, error) {
|
|
if name == "" {
|
|
return nil, errors.New("missing node pool name")
|
|
}
|
|
|
|
wm, err := n.client.delete("/v1/node/pool/"+url.PathEscape(name), nil, nil, w)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return wm, nil
|
|
}
|
|
|
|
// ListJobs is used to list all the jobs in a node pool.
|
|
func (n *NodePools) ListJobs(poolName string, q *QueryOptions) ([]*JobListStub, *QueryMeta, error) {
|
|
var resp []*JobListStub
|
|
qm, err := n.client.query(
|
|
fmt.Sprintf("/v1/node/pool/%s/jobs", url.PathEscape(poolName)),
|
|
&resp, q)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return resp, qm, nil
|
|
}
|
|
|
|
// ListNodes is used to list all the nodes in a node pool.
|
|
func (n *NodePools) ListNodes(poolName string, q *QueryOptions) ([]*NodeListStub, *QueryMeta, error) {
|
|
var resp []*NodeListStub
|
|
qm, err := n.client.query(
|
|
fmt.Sprintf("/v1/node/pool/%s/nodes", url.PathEscape(poolName)),
|
|
&resp, q)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return resp, qm, nil
|
|
}
|
|
|
|
// NodePool is used to serialize a node pool.
|
|
type NodePool struct {
|
|
Name string `hcl:"name,label"`
|
|
Description string `hcl:"description,optional"`
|
|
Meta map[string]string `hcl:"meta,block"`
|
|
SchedulerConfiguration *NodePoolSchedulerConfiguration `hcl:"scheduler_config,block"`
|
|
CreateIndex uint64
|
|
ModifyIndex uint64
|
|
}
|
|
|
|
// NodePoolSchedulerConfiguration is used to serialize the scheduler
|
|
// configuration of a node pool.
|
|
type NodePoolSchedulerConfiguration struct {
|
|
SchedulerAlgorithm SchedulerAlgorithm `hcl:"scheduler_algorithm,optional"`
|
|
MemoryOversubscriptionEnabled *bool `hcl:"memory_oversubscription_enabled,optional"`
|
|
}
|