2017-10-04 22:08:10 +00:00
|
|
|
package mock
|
2017-09-11 23:31:37 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2018-01-31 20:13:57 +00:00
|
|
|
"strconv"
|
|
|
|
"strings"
|
2017-09-11 23:31:37 +00:00
|
|
|
|
2019-01-15 19:46:12 +00:00
|
|
|
testing "github.com/mitchellh/go-testing-interface"
|
|
|
|
|
2017-09-11 23:31:37 +00:00
|
|
|
"github.com/hashicorp/nomad/nomad/structs"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
2017-10-04 22:08:10 +00:00
|
|
|
// StateStore defines the methods required from state.StateStore but avoids a
|
|
|
|
// circular dependency.
|
|
|
|
type StateStore interface {
|
2020-12-01 16:11:34 +00:00
|
|
|
UpsertACLPolicies(msgType structs.MessageType, index uint64, policies []*structs.ACLPolicy) error
|
|
|
|
UpsertACLTokens(msgType structs.MessageType, index uint64, tokens []*structs.ACLToken) error
|
2017-10-04 22:08:10 +00:00
|
|
|
}
|
|
|
|
|
2017-09-11 23:31:37 +00:00
|
|
|
// NamespacePolicy is a helper for generating the policy hcl for a given
|
2018-03-11 18:29:24 +00:00
|
|
|
// namespace. Either policy or capabilities may be nil but not both.
|
2017-09-11 23:31:37 +00:00
|
|
|
func NamespacePolicy(namespace string, policy string, capabilities []string) string {
|
|
|
|
policyHCL := fmt.Sprintf("namespace %q {", namespace)
|
|
|
|
if policy != "" {
|
|
|
|
policyHCL += fmt.Sprintf("\n\tpolicy = %q", policy)
|
|
|
|
}
|
|
|
|
if len(capabilities) != 0 {
|
2018-01-31 20:13:57 +00:00
|
|
|
for i, s := range capabilities {
|
|
|
|
if !strings.HasPrefix(s, "\"") {
|
|
|
|
capabilities[i] = strconv.Quote(s)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
policyHCL += fmt.Sprintf("\n\tcapabilities = [%v]", strings.Join(capabilities, ","))
|
2017-09-11 23:31:37 +00:00
|
|
|
}
|
|
|
|
policyHCL += "\n}"
|
|
|
|
return policyHCL
|
|
|
|
}
|
|
|
|
|
2022-06-27 19:51:01 +00:00
|
|
|
// NamespacePolicy is a helper for generating the policy hcl for a given
|
|
|
|
// namespace. Either policy or capabilities may be nil but not both.
|
2022-08-26 18:03:56 +00:00
|
|
|
func NamespacePolicyWithVariables(namespace string, policy string, capabilities []string, svars map[string][]string) string {
|
2022-06-27 19:51:01 +00:00
|
|
|
policyHCL := fmt.Sprintf("namespace %q {", namespace)
|
|
|
|
if policy != "" {
|
|
|
|
policyHCL += fmt.Sprintf("\n\tpolicy = %q", policy)
|
|
|
|
}
|
|
|
|
if len(capabilities) != 0 {
|
|
|
|
for i, s := range capabilities {
|
|
|
|
if !strings.HasPrefix(s, "\"") {
|
|
|
|
capabilities[i] = strconv.Quote(s)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
policyHCL += fmt.Sprintf("\n\tcapabilities = [%v]", strings.Join(capabilities, ","))
|
|
|
|
}
|
|
|
|
|
2022-08-26 18:03:56 +00:00
|
|
|
policyHCL += VariablePolicy(svars)
|
2022-06-27 19:51:01 +00:00
|
|
|
policyHCL += "\n}"
|
|
|
|
return policyHCL
|
|
|
|
}
|
|
|
|
|
2022-08-26 18:03:56 +00:00
|
|
|
// VariablePolicy is a helper for generating the policy hcl for a given
|
|
|
|
// variable block inside of a namespace.
|
|
|
|
func VariablePolicy(svars map[string][]string) string {
|
2022-06-27 19:51:01 +00:00
|
|
|
policyHCL := ""
|
|
|
|
if len(svars) > 0 {
|
2022-08-26 18:03:56 +00:00
|
|
|
policyHCL = "\n\n\tvariables {"
|
2022-06-27 19:51:01 +00:00
|
|
|
for p, c := range svars {
|
|
|
|
for i, s := range c {
|
|
|
|
if !strings.HasPrefix(s, "\"") {
|
|
|
|
c[i] = strconv.Quote(s)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
policyHCL += fmt.Sprintf("\n\t\tpath %q { capabilities = [%v]}", p, strings.Join(c, ","))
|
|
|
|
}
|
|
|
|
policyHCL += "\n\t}"
|
|
|
|
}
|
|
|
|
return policyHCL
|
|
|
|
}
|
|
|
|
|
2019-07-25 14:32:19 +00:00
|
|
|
// HostVolumePolicy is a helper for generating the policy hcl for a given
|
|
|
|
// host-volume. Either policy or capabilities may be nil but not both.
|
|
|
|
func HostVolumePolicy(vol string, policy string, capabilities []string) string {
|
|
|
|
policyHCL := fmt.Sprintf("host_volume %q {", vol)
|
|
|
|
if policy != "" {
|
|
|
|
policyHCL += fmt.Sprintf("\n\tpolicy = %q", policy)
|
|
|
|
}
|
|
|
|
if len(capabilities) != 0 {
|
|
|
|
for i, s := range capabilities {
|
|
|
|
if !strings.HasPrefix(s, "\"") {
|
|
|
|
capabilities[i] = strconv.Quote(s)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
policyHCL += fmt.Sprintf("\n\tcapabilities = [%v]", strings.Join(capabilities, ","))
|
|
|
|
}
|
|
|
|
policyHCL += "\n}"
|
|
|
|
return policyHCL
|
|
|
|
}
|
|
|
|
|
2017-10-06 19:02:53 +00:00
|
|
|
// AgentPolicy is a helper for generating the hcl for a given agent policy.
|
|
|
|
func AgentPolicy(policy string) string {
|
|
|
|
return fmt.Sprintf("agent {\n\tpolicy = %q\n}\n", policy)
|
|
|
|
}
|
|
|
|
|
2017-09-15 03:33:12 +00:00
|
|
|
// NodePolicy is a helper for generating the hcl for a given node policy.
|
|
|
|
func NodePolicy(policy string) string {
|
|
|
|
return fmt.Sprintf("node {\n\tpolicy = %q\n}\n", policy)
|
|
|
|
}
|
|
|
|
|
2017-10-13 21:36:02 +00:00
|
|
|
// QuotaPolicy is a helper for generating the hcl for a given quota policy.
|
|
|
|
func QuotaPolicy(policy string) string {
|
|
|
|
return fmt.Sprintf("quota {\n\tpolicy = %q\n}\n", policy)
|
|
|
|
}
|
|
|
|
|
2020-03-17 21:32:39 +00:00
|
|
|
// PluginPolicy is a helper for generating the hcl for a given plugin policy.
|
|
|
|
func PluginPolicy(policy string) string {
|
|
|
|
return fmt.Sprintf("plugin {\n\tpolicy = %q\n}\n", policy)
|
|
|
|
}
|
|
|
|
|
2017-09-11 23:31:37 +00:00
|
|
|
// CreatePolicy creates a policy with the given name and rule.
|
2017-10-04 22:08:10 +00:00
|
|
|
func CreatePolicy(t testing.T, state StateStore, index uint64, name, rule string) {
|
2017-09-11 23:31:37 +00:00
|
|
|
t.Helper()
|
|
|
|
|
|
|
|
// Create the ACLPolicy
|
|
|
|
policy := &structs.ACLPolicy{
|
|
|
|
Name: name,
|
|
|
|
Rules: rule,
|
|
|
|
}
|
|
|
|
policy.SetHash()
|
2020-12-01 16:11:34 +00:00
|
|
|
assert.Nil(t, state.UpsertACLPolicies(structs.MsgTypeTestSetup, index, []*structs.ACLPolicy{policy}))
|
2017-09-11 23:31:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// CreateToken creates a local, client token for the given policies
|
2017-10-04 22:08:10 +00:00
|
|
|
func CreateToken(t testing.T, state StateStore, index uint64, policies []string) *structs.ACLToken {
|
2017-09-11 23:31:37 +00:00
|
|
|
t.Helper()
|
|
|
|
|
|
|
|
// Create the ACLToken
|
2017-10-04 22:08:10 +00:00
|
|
|
token := ACLToken()
|
2017-09-11 23:31:37 +00:00
|
|
|
token.Policies = policies
|
|
|
|
token.SetHash()
|
2020-12-01 16:11:34 +00:00
|
|
|
assert.Nil(t, state.UpsertACLTokens(structs.MsgTypeTestSetup, index, []*structs.ACLToken{token}))
|
2017-09-11 23:31:37 +00:00
|
|
|
return token
|
|
|
|
}
|
|
|
|
|
|
|
|
// CreatePolicyAndToken creates a policy and then returns a token configured for
|
|
|
|
// just that policy. CreatePolicyAndToken uses the given index and index+1.
|
2017-10-04 22:08:10 +00:00
|
|
|
func CreatePolicyAndToken(t testing.T, state StateStore, index uint64, name, rule string) *structs.ACLToken {
|
2017-09-11 23:31:37 +00:00
|
|
|
CreatePolicy(t, state, index, name, rule)
|
|
|
|
return CreateToken(t, state, index+1, []string{name})
|
|
|
|
}
|