github.com/zoomfoo/nomad@v0.8.5-0.20180907175415-f28fd3a1a056/nomad/mock/acl.go (about)

     1  package mock
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  	"strings"
     7  
     8  	"github.com/hashicorp/nomad/nomad/structs"
     9  	"github.com/mitchellh/go-testing-interface"
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  // StateStore defines the methods required from state.StateStore but avoids a
    14  // circular dependency.
    15  type StateStore interface {
    16  	UpsertACLPolicies(index uint64, policies []*structs.ACLPolicy) error
    17  	UpsertACLTokens(index uint64, tokens []*structs.ACLToken) error
    18  }
    19  
    20  // NamespacePolicy is a helper for generating the policy hcl for a given
    21  // namespace. Either policy or capabilities may be nil but not both.
    22  func NamespacePolicy(namespace string, policy string, capabilities []string) string {
    23  	policyHCL := fmt.Sprintf("namespace %q {", namespace)
    24  	if policy != "" {
    25  		policyHCL += fmt.Sprintf("\n\tpolicy = %q", policy)
    26  	}
    27  	if len(capabilities) != 0 {
    28  		for i, s := range capabilities {
    29  			if !strings.HasPrefix(s, "\"") {
    30  				capabilities[i] = strconv.Quote(s)
    31  			}
    32  		}
    33  
    34  		policyHCL += fmt.Sprintf("\n\tcapabilities = [%v]", strings.Join(capabilities, ","))
    35  	}
    36  	policyHCL += "\n}"
    37  	return policyHCL
    38  }
    39  
    40  // AgentPolicy is a helper for generating the hcl for a given agent policy.
    41  func AgentPolicy(policy string) string {
    42  	return fmt.Sprintf("agent {\n\tpolicy = %q\n}\n", policy)
    43  }
    44  
    45  // NodePolicy is a helper for generating the hcl for a given node policy.
    46  func NodePolicy(policy string) string {
    47  	return fmt.Sprintf("node {\n\tpolicy = %q\n}\n", policy)
    48  }
    49  
    50  // QuotaPolicy is a helper for generating the hcl for a given quota policy.
    51  func QuotaPolicy(policy string) string {
    52  	return fmt.Sprintf("quota {\n\tpolicy = %q\n}\n", policy)
    53  }
    54  
    55  // CreatePolicy creates a policy with the given name and rule.
    56  func CreatePolicy(t testing.T, state StateStore, index uint64, name, rule string) {
    57  	t.Helper()
    58  
    59  	// Create the ACLPolicy
    60  	policy := &structs.ACLPolicy{
    61  		Name:  name,
    62  		Rules: rule,
    63  	}
    64  	policy.SetHash()
    65  	assert.Nil(t, state.UpsertACLPolicies(index, []*structs.ACLPolicy{policy}))
    66  }
    67  
    68  // CreateToken creates a local, client token for the given policies
    69  func CreateToken(t testing.T, state StateStore, index uint64, policies []string) *structs.ACLToken {
    70  	t.Helper()
    71  
    72  	// Create the ACLToken
    73  	token := ACLToken()
    74  	token.Policies = policies
    75  	token.SetHash()
    76  	assert.Nil(t, state.UpsertACLTokens(index, []*structs.ACLToken{token}))
    77  	return token
    78  }
    79  
    80  // CreatePolicyAndToken creates a policy and then returns a token configured for
    81  // just that policy. CreatePolicyAndToken uses the given index and index+1.
    82  func CreatePolicyAndToken(t testing.T, state StateStore, index uint64, name, rule string) *structs.ACLToken {
    83  	CreatePolicy(t, state, index, name, rule)
    84  	return CreateToken(t, state, index+1, []string{name})
    85  }