92fe8c8e89
* Refactor Service Definition ProxyDestination. This includes: - Refactoring all internal structs used - Updated tests for both deprecated and new input for: - Agent Services endpoint response - Agent Service endpoint response - Agent Register endpoint - Unmanaged deprecated field - Unmanaged new fields - Managed deprecated upstreams - Managed new - Catalog Register - Unmanaged deprecated field - Unmanaged new fields - Managed deprecated upstreams - Managed new - Catalog Services endpoint response - Catalog Node endpoint response - Catalog Service endpoint response - Updated API tests for all of the above too (both deprecated and new forms of register) TODO: - config package changes for on-disk service definitions - proxy config endpoint - built-in proxy support for new fields * Agent proxy config endpoint updated with upstreams * Config file changes for upstreams. * Add upstream opaque config and update all tests to ensure it works everywhere. * Built in proxy working with new Upstreams config * Command fixes and deprecations * Fix key translation, upstream type defaults and a spate of other subtele bugs found with ned to end test scripts... TODO: tests still failing on one case that needs a fix. I think it's key translation for upstreams nested in Managed proxy struct. * Fix translated keys in API registration. ≈ * Fixes from docs - omit some empty undocumented fields in API - Bring back ServiceProxyDestination in Catalog responses to not break backwards compat - this was removed assuming it was only used internally. * Documentation updates for Upstreams in service definition * Fixes for tests broken by many refactors. * Enable travis on f-connect branch in this branch too. * Add consistent Deprecation comments to ProxyDestination uses * Update version number on deprecation notices, and correct upstream datacenter field with explanation in docs
55 lines
1.5 KiB
Go
55 lines
1.5 KiB
Go
package state
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/hashicorp/consul/agent/structs"
|
|
)
|
|
|
|
// IndexConnectService indexes a *struct.ServiceNode for querying by
|
|
// services that support Connect to some target service. This will
|
|
// properly index the proxy destination for proxies and the service name
|
|
// for native services.
|
|
type IndexConnectService struct{}
|
|
|
|
func (idx *IndexConnectService) 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)
|
|
}
|
|
|
|
var result []byte
|
|
switch {
|
|
case sn.ServiceKind == structs.ServiceKindConnectProxy:
|
|
// For proxies, this service supports Connect for the destination
|
|
result = []byte(strings.ToLower(sn.ServiceProxy.DestinationServiceName))
|
|
|
|
case sn.ServiceConnect.Native:
|
|
// For native, this service supports Connect directly
|
|
result = []byte(strings.ToLower(sn.ServiceName))
|
|
|
|
default:
|
|
// Doesn't support Connect at all
|
|
return false, nil, nil
|
|
}
|
|
|
|
// Return the result with the null terminator appended so we can
|
|
// differentiate prefix vs. non-prefix matches.
|
|
return true, append(result, '\x00'), nil
|
|
}
|
|
|
|
func (idx *IndexConnectService) 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 string: %#v", args[0])
|
|
}
|
|
|
|
// Add the null character as a terminator
|
|
return append([]byte(strings.ToLower(arg)), '\x00'), nil
|
|
}
|