mirror of https://github.com/status-im/consul.git
agent/cache: ConnectCA roots caching type
This commit is contained in:
parent
975be337a9
commit
b0db5657c4
|
@ -1,6 +1,5 @@
|
||||||
package cache
|
package cache
|
||||||
|
|
||||||
/*
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
@ -36,4 +35,3 @@ func (c *TypeCARoot) Fetch(opts FetchOptions, req Request) (FetchResult, error)
|
||||||
result.Index = reply.QueryMeta.Index
|
result.Index = reply.QueryMeta.Index
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
package cache
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/hashicorp/consul/agent/structs"
|
||||||
|
"github.com/stretchr/testify/mock"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestTypeCARoot(t *testing.T) {
|
||||||
|
require := require.New(t)
|
||||||
|
rpc := TestRPC(t)
|
||||||
|
defer rpc.AssertExpectations(t)
|
||||||
|
typ := &TypeCARoot{RPC: rpc}
|
||||||
|
|
||||||
|
// Expect the proper RPC call. This also sets the expected value
|
||||||
|
// since that is return-by-pointer in the arguments.
|
||||||
|
var resp *structs.IndexedCARoots
|
||||||
|
rpc.On("RPC", "ConnectCA.Roots", mock.Anything, mock.Anything).Return(nil).
|
||||||
|
Run(func(args mock.Arguments) {
|
||||||
|
req := args.Get(1).(*structs.DCSpecificRequest)
|
||||||
|
require.Equal(uint64(24), req.QueryOptions.MinQueryIndex)
|
||||||
|
require.Equal(1*time.Second, req.QueryOptions.MaxQueryTime)
|
||||||
|
|
||||||
|
reply := args.Get(2).(*structs.IndexedCARoots)
|
||||||
|
reply.QueryMeta.Index = 48
|
||||||
|
resp = reply
|
||||||
|
})
|
||||||
|
|
||||||
|
// Fetch
|
||||||
|
result, err := typ.Fetch(FetchOptions{
|
||||||
|
MinIndex: 24,
|
||||||
|
Timeout: 1 * time.Second,
|
||||||
|
}, &structs.DCSpecificRequest{Datacenter: "dc1"})
|
||||||
|
require.Nil(err)
|
||||||
|
require.Equal(FetchResult{
|
||||||
|
Value: resp,
|
||||||
|
Index: 48,
|
||||||
|
}, result)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTypeCARoot_badReqType(t *testing.T) {
|
||||||
|
require := require.New(t)
|
||||||
|
rpc := TestRPC(t)
|
||||||
|
defer rpc.AssertExpectations(t)
|
||||||
|
typ := &TypeCARoot{RPC: rpc}
|
||||||
|
|
||||||
|
// Fetch
|
||||||
|
_, err := typ.Fetch(FetchOptions{}, TestRequest(t, "foo", 64))
|
||||||
|
require.NotNil(err)
|
||||||
|
require.Contains(err.Error(), "wrong type")
|
||||||
|
|
||||||
|
}
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -14,6 +15,7 @@ import (
|
||||||
"github.com/hashicorp/go-msgpack/codec"
|
"github.com/hashicorp/go-msgpack/codec"
|
||||||
"github.com/hashicorp/go-multierror"
|
"github.com/hashicorp/go-multierror"
|
||||||
"github.com/hashicorp/serf/coordinate"
|
"github.com/hashicorp/serf/coordinate"
|
||||||
|
"github.com/mitchellh/hashstructure"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MessageType uint8
|
type MessageType uint8
|
||||||
|
@ -276,6 +278,24 @@ func (r *DCSpecificRequest) RequestDatacenter() string {
|
||||||
return r.Datacenter
|
return r.Datacenter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *DCSpecificRequest) CacheKey() string {
|
||||||
|
// To calculate the cache key we only hash the node filters. The
|
||||||
|
// datacenter is handled by the cache framework. The other fields are
|
||||||
|
// not, but should not be used in any cache types.
|
||||||
|
v, err := hashstructure.Hash(r.NodeMetaFilters, nil)
|
||||||
|
if err != nil {
|
||||||
|
// Empty string means do not cache. If we have an error we should
|
||||||
|
// just forward along to the server.
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return strconv.FormatUint(v, 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *DCSpecificRequest) CacheMinIndex() uint64 {
|
||||||
|
return r.QueryOptions.MinQueryIndex
|
||||||
|
}
|
||||||
|
|
||||||
// ServiceSpecificRequest is used to query about a specific service
|
// ServiceSpecificRequest is used to query about a specific service
|
||||||
type ServiceSpecificRequest struct {
|
type ServiceSpecificRequest struct {
|
||||||
Datacenter string
|
Datacenter string
|
||||||
|
|
Loading…
Reference in New Issue