mirror of
https://github.com/kemko/nomad.git
synced 2026-01-01 16:05:42 +03:00
Add structs and fields to support the Nomad Pools Governance Enterprise feature of controlling node pool access via namespaces. Nomad Enterprise allows users to specify a default node pool to be used by jobs that don't specify one. In order to accomplish this, it's necessary to distinguish between a job that explicitly uses the `default` node pool and one that did not specify any. If the `default` node pool is set during job canonicalization it's impossible to do this, so this commit allows a job to have an empty node pool value during registration but sets to `default` at the admission controller mutator. In order to guarantee state consistency the state store validates that the job node pool is set and exists before inserting it.
113 lines
3.0 KiB
Go
113 lines
3.0 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package api
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
)
|
|
|
|
// Namespaces is used to query the namespace endpoints.
|
|
type Namespaces struct {
|
|
client *Client
|
|
}
|
|
|
|
// Namespaces returns a new handle on the namespaces.
|
|
func (c *Client) Namespaces() *Namespaces {
|
|
return &Namespaces{client: c}
|
|
}
|
|
|
|
// List is used to dump all of the namespaces.
|
|
func (n *Namespaces) List(q *QueryOptions) ([]*Namespace, *QueryMeta, error) {
|
|
var resp []*Namespace
|
|
qm, err := n.client.query("/v1/namespaces", &resp, q)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
sort.Sort(NamespaceIndexSort(resp))
|
|
return resp, qm, nil
|
|
}
|
|
|
|
// PrefixList is used to do a PrefixList search over namespaces
|
|
func (n *Namespaces) PrefixList(prefix string, q *QueryOptions) ([]*Namespace, *QueryMeta, error) {
|
|
if q == nil {
|
|
q = &QueryOptions{Prefix: prefix}
|
|
} else {
|
|
q.Prefix = prefix
|
|
}
|
|
|
|
return n.List(q)
|
|
}
|
|
|
|
// Info is used to query a single namespace by its name.
|
|
func (n *Namespaces) Info(name string, q *QueryOptions) (*Namespace, *QueryMeta, error) {
|
|
var resp Namespace
|
|
qm, err := n.client.query("/v1/namespace/"+name, &resp, q)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return &resp, qm, nil
|
|
}
|
|
|
|
// Register is used to register a namespace.
|
|
func (n *Namespaces) Register(namespace *Namespace, q *WriteOptions) (*WriteMeta, error) {
|
|
wm, err := n.client.put("/v1/namespace", namespace, nil, q)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return wm, nil
|
|
}
|
|
|
|
// Delete is used to delete a namespace
|
|
func (n *Namespaces) Delete(namespace string, q *WriteOptions) (*WriteMeta, error) {
|
|
wm, err := n.client.delete(fmt.Sprintf("/v1/namespace/%s", namespace), nil, nil, q)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return wm, nil
|
|
}
|
|
|
|
// Namespace is used to serialize a namespace.
|
|
type Namespace struct {
|
|
Name string
|
|
Description string
|
|
Quota string
|
|
Capabilities *NamespaceCapabilities `hcl:"capabilities,block"`
|
|
NodePoolConfiguration *NamespaceNodePoolConfiguration `hcl:"node_pool_config,block"`
|
|
Meta map[string]string
|
|
CreateIndex uint64
|
|
ModifyIndex uint64
|
|
}
|
|
|
|
// NamespaceCapabilities represents a set of capabilities allowed for this
|
|
// namespace, to be checked at job submission time.
|
|
type NamespaceCapabilities struct {
|
|
EnabledTaskDrivers []string `hcl:"enabled_task_drivers"`
|
|
DisabledTaskDrivers []string `hcl:"disabled_task_drivers"`
|
|
}
|
|
|
|
// NamespaceNodePoolConfiguration stores configuration about node pools for a
|
|
// namespace.
|
|
type NamespaceNodePoolConfiguration struct {
|
|
Default string
|
|
Allowed []string
|
|
Denied []string
|
|
}
|
|
|
|
// NamespaceIndexSort is a wrapper to sort Namespaces by CreateIndex. We
|
|
// reverse the test so that we get the highest index first.
|
|
type NamespaceIndexSort []*Namespace
|
|
|
|
func (n NamespaceIndexSort) Len() int {
|
|
return len(n)
|
|
}
|
|
|
|
func (n NamespaceIndexSort) Less(i, j int) bool {
|
|
return n[i].CreateIndex > n[j].CreateIndex
|
|
}
|
|
|
|
func (n NamespaceIndexSort) Swap(i, j int) {
|
|
n[i], n[j] = n[j], n[i]
|
|
}
|