|
|
@ -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) {
|
|
|
|
func (s *HTTPServer) AgentRegisterService(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
|
|
|
|
var args structs.ServiceDefinition
|
|
|
|
var args structs.ServiceDefinition
|
|
|
|
// Fixup the type decode of TTL or Interval if a check if provided.
|
|
|
|
// 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
|
|
|
|
if err := decodeBody(req, &args, registerServiceDecodeCB); err != nil {
|
|
|
|
// 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 {
|
|
|
|
|
|
|
|
resp.WriteHeader(http.StatusBadRequest)
|
|
|
|
resp.WriteHeader(http.StatusBadRequest)
|
|
|
|
fmt.Fprintf(resp, "Request decode failed: %v", err)
|
|
|
|
fmt.Fprintf(resp, "Request decode failed: %v", err)
|
|
|
|
return nil, nil
|
|
|
|
return nil, nil
|
|
|
@ -961,6 +894,76 @@ func (s *HTTPServer) AgentRegisterService(resp http.ResponseWriter, req *http.Re
|
|
|
|
return nil, nil
|
|
|
|
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) {
|
|
|
|
func (s *HTTPServer) AgentDeregisterService(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
|
|
|
|
serviceID := strings.TrimPrefix(req.URL.Path, "/v1/agent/service/deregister/")
|
|
|
|
serviceID := strings.TrimPrefix(req.URL.Path, "/v1/agent/service/deregister/")
|
|
|
|
|
|
|
|
|
|
|
|