65 lines
2 KiB
Go
65 lines
2 KiB
Go
|
package taskenv
|
||
|
|
||
|
import (
|
||
|
"github.com/hashicorp/nomad/nomad/structs"
|
||
|
)
|
||
|
|
||
|
// InterpolateServices returns an interpolated copy of services and checks with
|
||
|
// values from the task's environment.
|
||
|
func InterpolateServices(taskEnv *TaskEnv, services []*structs.Service) []*structs.Service {
|
||
|
// Guard against not having a valid taskEnv. This can be the case if the
|
||
|
// PreKilling or Exited hook is run before Poststart.
|
||
|
if taskEnv == nil || len(services) == 0 {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
interpolated := make([]*structs.Service, len(services))
|
||
|
|
||
|
for i, origService := range services {
|
||
|
// Create a copy as we need to reinterpolate every time the
|
||
|
// environment changes
|
||
|
service := origService.Copy()
|
||
|
|
||
|
for _, check := range service.Checks {
|
||
|
check.Name = taskEnv.ReplaceEnv(check.Name)
|
||
|
check.Type = taskEnv.ReplaceEnv(check.Type)
|
||
|
check.Command = taskEnv.ReplaceEnv(check.Command)
|
||
|
check.Args = taskEnv.ParseAndReplace(check.Args)
|
||
|
check.Path = taskEnv.ReplaceEnv(check.Path)
|
||
|
check.Protocol = taskEnv.ReplaceEnv(check.Protocol)
|
||
|
check.PortLabel = taskEnv.ReplaceEnv(check.PortLabel)
|
||
|
check.InitialStatus = taskEnv.ReplaceEnv(check.InitialStatus)
|
||
|
check.Method = taskEnv.ReplaceEnv(check.Method)
|
||
|
check.GRPCService = taskEnv.ReplaceEnv(check.GRPCService)
|
||
|
if len(check.Header) > 0 {
|
||
|
header := make(map[string][]string, len(check.Header))
|
||
|
for k, vs := range check.Header {
|
||
|
newVals := make([]string, len(vs))
|
||
|
for i, v := range vs {
|
||
|
newVals[i] = taskEnv.ReplaceEnv(v)
|
||
|
}
|
||
|
header[taskEnv.ReplaceEnv(k)] = newVals
|
||
|
}
|
||
|
check.Header = header
|
||
|
}
|
||
|
}
|
||
|
|
||
|
service.Name = taskEnv.ReplaceEnv(service.Name)
|
||
|
service.PortLabel = taskEnv.ReplaceEnv(service.PortLabel)
|
||
|
service.Tags = taskEnv.ParseAndReplace(service.Tags)
|
||
|
service.CanaryTags = taskEnv.ParseAndReplace(service.CanaryTags)
|
||
|
|
||
|
if len(service.Meta) > 0 {
|
||
|
meta := make(map[string]string, len(service.Meta))
|
||
|
for k, v := range service.Meta {
|
||
|
meta[k] = taskEnv.ReplaceEnv(v)
|
||
|
}
|
||
|
service.Meta = meta
|
||
|
}
|
||
|
|
||
|
interpolated[i] = service
|
||
|
}
|
||
|
|
||
|
return interpolated
|
||
|
}
|