2019-06-20 19:04:39 +00:00
|
|
|
package state
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/hashicorp/consul/agent/structs"
|
|
|
|
)
|
|
|
|
|
|
|
|
// IndexServiceKind indexes a *struct.ServiceNode for querying by
|
|
|
|
// the services kind. We need a custom indexer because of the default
|
2019-06-18 00:52:01 +00:00
|
|
|
// kind being the empty string. The StringFieldIndex in memdb seems to
|
|
|
|
// treate the empty string as missing and doesn't work correctly when we actually
|
|
|
|
// want to index ""
|
2019-06-20 19:04:39 +00:00
|
|
|
type IndexServiceKind struct{}
|
|
|
|
|
|
|
|
func (idx *IndexServiceKind) FromObject(obj interface{}) (bool, []byte, error) {
|
|
|
|
sn, ok := obj.(*structs.ServiceNode)
|
|
|
|
if !ok {
|
|
|
|
return false, nil, fmt.Errorf("Object must be ServiceNode, got %T", obj)
|
|
|
|
}
|
|
|
|
|
|
|
|
return true, append([]byte(strings.ToLower(string(sn.ServiceKind))), '\x00'), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (idx *IndexServiceKind) FromArgs(args ...interface{}) ([]byte, error) {
|
|
|
|
if len(args) != 1 {
|
|
|
|
return nil, fmt.Errorf("must provide only a single argument")
|
|
|
|
}
|
|
|
|
|
|
|
|
arg, ok := args[0].(string)
|
|
|
|
if !ok {
|
|
|
|
return nil, fmt.Errorf("argument must be a structs.ServiceKind: %#v", args[0])
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add the null character as a terminator
|
|
|
|
return append([]byte(strings.ToLower(arg)), '\x00'), nil
|
|
|
|
}
|