|
|
|
@ -757,75 +757,8 @@ func (s *HTTPServer) AgentHealthServiceByName(resp http.ResponseWriter, req *htt
|
|
|
|
|
func (s *HTTPServer) AgentRegisterService(resp http.ResponseWriter, req *http.Request) (interface{}, error) { |
|
|
|
|
var args structs.ServiceDefinition |
|
|
|
|
// Fixup the type decode of TTL or Interval if a check if provided.
|
|
|
|
|
decodeCB := func(raw interface{}) error { |
|
|
|
|
rawMap, ok := raw.(map[string]interface{}) |
|
|
|
|
if !ok { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// see https://github.com/hashicorp/consul/pull/3557 why we need this
|
|
|
|
|
// and why we should get rid of it.
|
|
|
|
|
lib.TranslateKeys(rawMap, map[string]string{ |
|
|
|
|
"enable_tag_override": "EnableTagOverride", |
|
|
|
|
// Proxy Upstreams
|
|
|
|
|
"destination_name": "DestinationName", |
|
|
|
|
"destination_type": "DestinationType", |
|
|
|
|
"destination_namespace": "DestinationNamespace", |
|
|
|
|
"local_bind_port": "LocalBindPort", |
|
|
|
|
"local_bind_address": "LocalBindAddress", |
|
|
|
|
// Proxy Config
|
|
|
|
|
"destination_service_name": "DestinationServiceName", |
|
|
|
|
"destination_service_id": "DestinationServiceID", |
|
|
|
|
"local_service_port": "LocalServicePort", |
|
|
|
|
"local_service_address": "LocalServiceAddress", |
|
|
|
|
// SidecarService
|
|
|
|
|
"sidecar_service": "SidecarService", |
|
|
|
|
// Expose Config
|
|
|
|
|
"local_path_port": "LocalPathPort", |
|
|
|
|
"listener_port": "ListenerPort", |
|
|
|
|
|
|
|
|
|
// DON'T Recurse into these opaque config maps or we might mangle user's
|
|
|
|
|
// keys. Note empty canonical is a special sentinel to prevent recursion.
|
|
|
|
|
"Meta": "", |
|
|
|
|
|
|
|
|
|
"tagged_addresses": "TaggedAddresses", |
|
|
|
|
|
|
|
|
|
// upstreams is an array but this prevents recursion into config field of
|
|
|
|
|
// any item in the array.
|
|
|
|
|
"Proxy.Config": "", |
|
|
|
|
"Proxy.Upstreams.Config": "", |
|
|
|
|
"Connect.Proxy.Config": "", |
|
|
|
|
"Connect.Proxy.Upstreams.Config": "", |
|
|
|
|
|
|
|
|
|
// Same exceptions as above, but for a nested sidecar_service note we use
|
|
|
|
|
// the canonical form SidecarService since that is translated by the time
|
|
|
|
|
// the lookup here happens.
|
|
|
|
|
"Connect.SidecarService.Meta": "", |
|
|
|
|
"Connect.SidecarService.Proxy.Config": "", |
|
|
|
|
"Connect.SidecarService.Proxy.Upstreams.config": "", |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
for k, v := range rawMap { |
|
|
|
|
switch strings.ToLower(k) { |
|
|
|
|
case "check": |
|
|
|
|
if err := FixupCheckType(v); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
case "checks": |
|
|
|
|
chkTypes, ok := v.([]interface{}) |
|
|
|
|
if !ok { |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
for _, chkType := range chkTypes { |
|
|
|
|
if err := FixupCheckType(chkType); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
if err := decodeBody(req, &args, decodeCB); err != nil { |
|
|
|
|
if err := decodeBody(req, &args, registerServiceDecodeCB); err != nil { |
|
|
|
|
resp.WriteHeader(http.StatusBadRequest) |
|
|
|
|
fmt.Fprintf(resp, "Request decode failed: %v", err) |
|
|
|
|
return nil, nil |
|
|
|
@ -961,6 +894,76 @@ func (s *HTTPServer) AgentRegisterService(resp http.ResponseWriter, req *http.Re
|
|
|
|
|
return nil, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// registerServiceDecodeCB is used in AgentRegisterService for request body decoding
|
|
|
|
|
func registerServiceDecodeCB(raw interface{}) error { |
|
|
|
|
rawMap, ok := raw.(map[string]interface{}) |
|
|
|
|
if !ok { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// see https://github.com/hashicorp/consul/pull/3557 why we need this
|
|
|
|
|
// and why we should get rid of it.
|
|
|
|
|
lib.TranslateKeys(rawMap, map[string]string{ |
|
|
|
|
"enable_tag_override": "EnableTagOverride", |
|
|
|
|
// Proxy Upstreams
|
|
|
|
|
"destination_name": "DestinationName", // string
|
|
|
|
|
"destination_type": "DestinationType", // string
|
|
|
|
|
"destination_namespace": "DestinationNamespace", // string
|
|
|
|
|
"local_bind_port": "LocalBindPort", // int
|
|
|
|
|
"local_bind_address": "LocalBindAddress", // string
|
|
|
|
|
// Proxy Config
|
|
|
|
|
"destination_service_name": "DestinationServiceName", // string (Proxy.)
|
|
|
|
|
"destination_service_id": "DestinationServiceID", // string
|
|
|
|
|
"local_service_port": "LocalServicePort", // int
|
|
|
|
|
"local_service_address": "LocalServiceAddress", // string
|
|
|
|
|
// SidecarService
|
|
|
|
|
"sidecar_service": "SidecarService", // ServiceDefinition (Connect.)
|
|
|
|
|
// Expose Config
|
|
|
|
|
"local_path_port": "LocalPathPort", // int (Proxy.Expose.Paths.)
|
|
|
|
|
"listener_port": "ListenerPort", // int
|
|
|
|
|
|
|
|
|
|
// DON'T Recurse into these opaque config maps or we might mangle user's
|
|
|
|
|
// keys. Note empty canonical is a special sentinel to prevent recursion.
|
|
|
|
|
"Meta": "", |
|
|
|
|
|
|
|
|
|
"tagged_addresses": "TaggedAddresses", // map[string]structs.ServiceAddress{Address string; Port int}
|
|
|
|
|
|
|
|
|
|
// upstreams is an array but this prevents recursion into config field of
|
|
|
|
|
// any item in the array.
|
|
|
|
|
"Proxy.Config": "", |
|
|
|
|
"Proxy.Upstreams.Config": "", |
|
|
|
|
"Connect.Proxy.Config": "", |
|
|
|
|
"Connect.Proxy.Upstreams.Config": "", |
|
|
|
|
|
|
|
|
|
// Same exceptions as above, but for a nested sidecar_service note we use
|
|
|
|
|
// the canonical form SidecarService since that is translated by the time
|
|
|
|
|
// the lookup here happens.
|
|
|
|
|
"Connect.SidecarService.Meta": "", |
|
|
|
|
"Connect.SidecarService.Proxy.Config": "", |
|
|
|
|
"Connect.SidecarService.Proxy.Upstreams.config": "", |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
for k, v := range rawMap { |
|
|
|
|
switch strings.ToLower(k) { |
|
|
|
|
case "check": |
|
|
|
|
if err := FixupCheckType(v); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
case "checks": |
|
|
|
|
chkTypes, ok := v.([]interface{}) |
|
|
|
|
if !ok { |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
for _, chkType := range chkTypes { |
|
|
|
|
if err := FixupCheckType(chkType); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (s *HTTPServer) AgentDeregisterService(resp http.ResponseWriter, req *http.Request) (interface{}, error) { |
|
|
|
|
serviceID := strings.TrimPrefix(req.URL.Path, "/v1/agent/service/deregister/") |
|
|
|
|
|
|
|
|
|