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
73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
package proxy
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/hashicorp/consul/api"
|
|
"github.com/hashicorp/consul/connect/proxy"
|
|
)
|
|
|
|
// FlagUpstreams implements the flag.Value interface and allows specifying
|
|
// the -upstream flag multiple times and keeping track of the name of the
|
|
// upstream and the local port.
|
|
//
|
|
// The syntax of the value is "name:addr" where addr can be "port" or
|
|
// "host:port". Examples: "db:8181", "db:127.0.0.10:8282", etc.
|
|
type FlagUpstreams map[string]proxy.UpstreamConfig
|
|
|
|
func (f *FlagUpstreams) String() string {
|
|
return fmt.Sprintf("%v", *f)
|
|
}
|
|
|
|
func (f *FlagUpstreams) Set(value string) error {
|
|
idx := strings.Index(value, ":")
|
|
if idx == -1 {
|
|
return fmt.Errorf("Upstream value should be name:addr in %q", value)
|
|
}
|
|
|
|
addr := ""
|
|
name := value[:idx]
|
|
portRaw := value[idx+1:]
|
|
if idx := strings.Index(portRaw, ":"); idx != -1 {
|
|
addr = portRaw[:idx]
|
|
portRaw = portRaw[idx+1:]
|
|
}
|
|
|
|
destinationType := "service"
|
|
if idx := strings.Index(name, "."); idx != -1 {
|
|
typ := name[idx+1:]
|
|
name = name[:idx]
|
|
switch typ {
|
|
case "", "service":
|
|
destinationType = "service"
|
|
|
|
case "query":
|
|
destinationType = "prepared_query"
|
|
|
|
default:
|
|
return fmt.Errorf(
|
|
"Upstream type must be blank, 'service', or 'query'. Got: %q", typ)
|
|
}
|
|
}
|
|
|
|
port, err := strconv.ParseInt(portRaw, 0, 0)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if *f == nil {
|
|
*f = make(map[string]proxy.UpstreamConfig)
|
|
}
|
|
|
|
(*f)[name] = proxy.UpstreamConfig{
|
|
LocalBindAddress: addr,
|
|
LocalBindPort: int(port),
|
|
DestinationName: name,
|
|
DestinationType: api.UpstreamDestType(destinationType),
|
|
}
|
|
|
|
return nil
|
|
}
|