96 lines
2.8 KiB
Go
96 lines
2.8 KiB
Go
|
package serviceregistration
|
||
|
|
||
|
import (
|
||
|
"github.com/hashicorp/nomad/client/allocrunner/taskrunner/interfaces"
|
||
|
"github.com/hashicorp/nomad/nomad/structs"
|
||
|
"github.com/hashicorp/nomad/plugins/drivers"
|
||
|
)
|
||
|
|
||
|
// WorkloadServices describes services defined in either a Task or TaskGroup
|
||
|
// that need to be syncronized with a service registration provider.
|
||
|
type WorkloadServices struct {
|
||
|
AllocID string
|
||
|
|
||
|
// Group in which the service belongs for a group-level service, or the
|
||
|
// group in which task belongs for a task-level service.
|
||
|
Group string
|
||
|
|
||
|
// Task in which the service belongs for task-level service. Will be empty
|
||
|
// for a group-level service.
|
||
|
Task string
|
||
|
|
||
|
// JobID provides additional context for providers regarding which job
|
||
|
// caused this registration.
|
||
|
JobID string
|
||
|
|
||
|
// Canary indicates whether, or not the allocation is a canary. This is
|
||
|
// used to build the correct tags mapping.
|
||
|
Canary bool
|
||
|
|
||
|
// Namespace is the provider namespace in which services will be
|
||
|
// registered, if the provider supports this functionality.
|
||
|
Namespace string
|
||
|
|
||
|
// Restarter allows restarting the task or task group depending on the
|
||
|
// check_restart stanzas.
|
||
|
Restarter WorkloadRestarter
|
||
|
|
||
|
// Services and checks to register for the task.
|
||
|
Services []*structs.Service
|
||
|
|
||
|
// Networks from the task's resources stanza.
|
||
|
// TODO: remove and use Ports
|
||
|
Networks structs.Networks
|
||
|
|
||
|
// NetworkStatus from alloc if network namespace is created.
|
||
|
// Can be nil.
|
||
|
NetworkStatus *structs.AllocNetworkStatus
|
||
|
|
||
|
// AllocatedPorts is the list of port mappings.
|
||
|
Ports structs.AllocatedPorts
|
||
|
|
||
|
// DriverExec is the script executor for the task's driver. For group
|
||
|
// services this is nil and script execution is managed by a tasklet in the
|
||
|
// taskrunner script_check_hook.
|
||
|
DriverExec interfaces.ScriptExecutor
|
||
|
|
||
|
// DriverNetwork is the network specified by the driver and may be nil.
|
||
|
DriverNetwork *drivers.DriverNetwork
|
||
|
}
|
||
|
|
||
|
// RegistrationProvider identifies the service registration provider for the
|
||
|
// WorkloadServices.
|
||
|
func (ws *WorkloadServices) RegistrationProvider() string {
|
||
|
|
||
|
// Protect against an empty array; it would be embarrassing to panic here.
|
||
|
if len(ws.Services) == 0 {
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
// Note(jrasell): a Nomad task group can only currently utilise a single
|
||
|
// service provider for all services included within it. In the event we
|
||
|
// remove this restriction, this will need to change along which a lot of
|
||
|
// other logic.
|
||
|
return ws.Services[0].Provider
|
||
|
}
|
||
|
|
||
|
// Copy method for easing tests.
|
||
|
func (ws *WorkloadServices) Copy() *WorkloadServices {
|
||
|
newTS := new(WorkloadServices)
|
||
|
*newTS = *ws
|
||
|
|
||
|
// Deep copy Services
|
||
|
newTS.Services = make([]*structs.Service, len(ws.Services))
|
||
|
for i := range ws.Services {
|
||
|
newTS.Services[i] = ws.Services[i].Copy()
|
||
|
}
|
||
|
return newTS
|
||
|
}
|
||
|
|
||
|
func (ws *WorkloadServices) Name() string {
|
||
|
if ws.Task != "" {
|
||
|
return ws.Task
|
||
|
}
|
||
|
return "group-" + ws.Group
|
||
|
}
|