-
Notifications
You must be signed in to change notification settings - Fork 2k
/
job.go
116 lines (100 loc) · 3.7 KB
/
job.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package structs
import (
"github.com/hashicorp/go-set"
)
const (
// JobServiceRegistrationsRPCMethod is the RPC method for listing all
// service registrations assigned to a specific namespaced job.
//
// Args: JobServiceRegistrationsRequest
// Reply: JobServiceRegistrationsResponse
JobServiceRegistrationsRPCMethod = "Job.GetServiceRegistrations"
)
// JobServiceRegistrationsRequest is the request object used to list all
// service registrations belonging to the specified Job.ID.
type JobServiceRegistrationsRequest struct {
JobID string
QueryOptions
}
// JobServiceRegistrationsResponse is the response object when performing a
// listing of services belonging to a namespaced job.
type JobServiceRegistrationsResponse struct {
Services []*ServiceRegistration
QueryMeta
}
// NativeServiceDiscoveryUsage tracks which groups make use of the nomad service
// discovery provider, and also which of those groups make use of checks. This
// information will be used to configure implicit constraints on the job.
type NativeServiceDiscoveryUsage struct {
Basic *set.Set[string] // implies v1.3.0 + ${attr.nomad.service_discovery}
Checks *set.Set[string] // implies v1.4.0
}
// Empty returns true if no groups are using native service discovery.
func (u *NativeServiceDiscoveryUsage) Empty() bool {
return u.Basic.Size() == 0 && u.Checks.Size() == 0
}
// RequiredNativeServiceDiscovery identifies which task groups, if any, within
// the job are utilising Nomad native service discovery.
func (j *Job) RequiredNativeServiceDiscovery() *NativeServiceDiscoveryUsage {
basic := set.New[string](10)
checks := set.New[string](10)
for _, tg := range j.TaskGroups {
// It is possible for services using the Nomad provider to be
// configured at the group level, so check here first.
requiresNativeServiceDiscovery(tg.Name, tg.Services, basic, checks)
// Iterate the tasks within the task group to check the services
// configured at this more traditional level.
for _, task := range tg.Tasks {
requiresNativeServiceDiscovery(tg.Name, task.Services, basic, checks)
}
}
return &NativeServiceDiscoveryUsage{
Basic: basic,
Checks: checks,
}
}
// requiresNativeServiceDiscovery identifies whether any of the services passed
// to the function are utilising Nomad native service discovery.
func requiresNativeServiceDiscovery(group string, services []*Service, basic, checks *set.Set[string]) {
for _, tgService := range services {
if tgService.Provider == ServiceProviderNomad {
basic.Insert(group)
if len(tgService.Checks) > 0 {
checks.Insert(group)
}
}
}
}
// RequiredConsulServiceDiscovery identifies which task groups, if any, within
// the job are utilising Consul service discovery.
func (j *Job) RequiredConsulServiceDiscovery() map[string]bool {
groups := make(map[string]bool)
for _, tg := range j.TaskGroups {
// It is possible for services using the Consul provider to be
// configured at the task group level, so check here first. This is
// a requirement for Consul Connect services.
if requiresConsulServiceDiscovery(tg.Services) {
groups[tg.Name] = true
continue
}
// Iterate the tasks within the task group to check the services
// configured at this more traditional level.
for _, task := range tg.Tasks {
if requiresConsulServiceDiscovery(task.Services) {
groups[tg.Name] = true
continue
}
}
}
return groups
}
// requiresConsulServiceDiscovery identifies whether any of the services passed
// to the function are utilising Consul service discovery.
func requiresConsulServiceDiscovery(services []*Service) bool {
for _, tgService := range services {
if tgService.Provider == ServiceProviderConsul || tgService.Provider == "" {
return true
}
}
return false
}