/
jobbuilder.go
106 lines (99 loc) · 3.48 KB
/
jobbuilder.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
package probe
import (
"github.com/mattfenwick/cyclonus/pkg/generator"
"github.com/pkg/errors"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/intstr"
)
type JobBuilder struct {
TimeoutSeconds int
}
func (j *JobBuilder) GetJobsForProbeConfig(resources *Resources, config *generator.ProbeConfig) *Jobs {
if config.AllAvailable {
return j.GetJobsAllAvailableServers(resources, config.Mode)
} else if config.PortProtocol != nil {
return j.GetJobsForNamedPortProtocol(resources, config.PortProtocol.Port, config.PortProtocol.Protocol, config.Mode)
} else {
panic(errors.Errorf("invalid ProbeConfig %+v", config))
}
}
func (j *JobBuilder) GetJobsForNamedPortProtocol(resources *Resources, port intstr.IntOrString, protocol v1.Protocol, mode generator.ProbeMode) *Jobs {
jobs := &Jobs{}
for _, podFrom := range resources.Pods {
for _, podTo := range resources.Pods {
job := &Job{
FromKey: podFrom.PodString().String(),
FromNamespace: podFrom.Namespace,
FromNamespaceLabels: resources.Namespaces[podFrom.Namespace],
FromPod: podFrom.Name,
FromPodLabels: podFrom.Labels,
FromContainer: podFrom.Containers[0].Name,
FromIP: podFrom.IP,
ToKey: podTo.PodString().String(),
ToHost: podTo.Host(mode),
ToNamespace: podTo.Namespace,
ToNamespaceLabels: resources.Namespaces[podTo.Namespace],
ToPodLabels: podTo.Labels,
ToIP: podTo.IP,
ResolvedPort: -1,
ResolvedPortName: "",
Protocol: protocol,
TimeoutSeconds: j.TimeoutSeconds,
}
switch port.Type {
case intstr.String:
job.ResolvedPortName = port.StrVal
// TODO what about protocol?
portInt, err := podTo.ResolveNamedPort(port.StrVal)
if err != nil {
jobs.BadNamedPort = append(jobs.BadNamedPort, job)
continue
}
job.ResolvedPort = portInt
case intstr.Int:
job.ResolvedPort = int(port.IntVal)
// TODO what about protocol?
portName, err := podTo.ResolveNumberedPort(int(port.IntVal))
if err != nil {
jobs.BadPortProtocol = append(jobs.BadPortProtocol, job)
continue
}
job.ResolvedPortName = portName
default:
panic(errors.Errorf("invalid IntOrString value %+v", port))
}
jobs.Valid = append(jobs.Valid, job)
}
}
return jobs
}
func (j *JobBuilder) GetJobsAllAvailableServers(resources *Resources, mode generator.ProbeMode) *Jobs {
var jobs []*Job
for _, podFrom := range resources.Pods {
for _, podTo := range resources.Pods {
for _, contTo := range podTo.Containers {
jobs = append(jobs, &Job{
FromKey: podFrom.PodString().String(),
FromNamespace: podFrom.Namespace,
FromNamespaceLabels: resources.Namespaces[podFrom.Namespace],
FromPod: podFrom.Name,
FromPodLabels: podFrom.Labels,
FromContainer: podFrom.Containers[0].Name,
FromIP: podFrom.IP,
ToKey: podTo.PodString().String(),
ToHost: podTo.Host(mode),
ToNamespace: podTo.Namespace,
ToNamespaceLabels: resources.Namespaces[podTo.Namespace],
ToPodLabels: podTo.Labels,
ToContainer: contTo.Name,
ToIP: podTo.IP,
ResolvedPort: contTo.Port,
ResolvedPortName: contTo.PortName,
Protocol: contTo.Protocol,
TimeoutSeconds: j.TimeoutSeconds,
})
}
}
}
return &Jobs{Valid: jobs}
}