/
service.go
100 lines (82 loc) · 3.05 KB
/
service.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
package applicationcontroller
import (
"context"
skiperatorv1alpha1 "github.com/kartverket/skiperator/api/v1alpha1"
"github.com/kartverket/skiperator/api/v1alpha1/podtypes"
"github.com/kartverket/skiperator/pkg/util"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
ctrlutil "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)
var defaultPrometheusPort = corev1.ServicePort{
Name: util.IstioMetricsPortName.StrVal,
Protocol: corev1.ProtocolTCP,
Port: util.IstioMetricsPortNumber.IntVal,
TargetPort: util.IstioMetricsPortNumber,
}
func (r *ApplicationReconciler) reconcileService(ctx context.Context, application *skiperatorv1alpha1.Application) (reconcile.Result, error) {
controllerName := "Service"
r.SetControllerProgressing(ctx, application, controllerName)
service := corev1.Service{ObjectMeta: metav1.ObjectMeta{Namespace: application.Namespace, Name: application.Name}}
shouldReconcile, err := r.ShouldReconcile(ctx, &service)
if err != nil || !shouldReconcile {
r.SetControllerFinishedOutcome(ctx, application, controllerName, err)
return reconcile.Result{}, err
}
_, err = ctrlutil.CreateOrPatch(ctx, r.GetClient(), &service, func() error {
// Set application as owner of the service
err := ctrlutil.SetControllerReference(application, &service, r.GetScheme())
if err != nil {
r.SetControllerError(ctx, application, controllerName, err)
return err
}
r.SetLabelsFromApplication(&service, *application)
util.SetCommonAnnotations(&service)
// ServiceMonitor requires labels to be set on service to select it
labels := service.GetLabels()
if len(labels) == 0 {
labels = make(map[string]string)
}
labels["app"] = application.Name
service.SetLabels(labels)
ports := append(getAdditionalPorts(application.Spec.AdditionalPorts), getServicePort(application.Spec.Port))
if r.IsIstioEnabledForNamespace(ctx, application.Namespace) && application.Spec.Prometheus != nil {
ports = append(ports, defaultPrometheusPort)
}
service.Spec = corev1.ServiceSpec{
Selector: util.GetPodAppSelector(application.Name),
Type: corev1.ServiceTypeClusterIP,
Ports: ports,
}
return nil
})
r.SetControllerFinishedOutcome(ctx, application, controllerName, err)
return reconcile.Result{}, err
}
func getAdditionalPorts(additionalPorts []podtypes.InternalPort) []corev1.ServicePort {
var ports []corev1.ServicePort
for _, p := range additionalPorts {
ports = append(ports, corev1.ServicePort{
Name: p.Name,
Port: p.Port,
Protocol: p.Protocol,
TargetPort: intstr.FromInt(int(p.Port)),
})
}
return ports
}
func getServicePort(applicationPort int) corev1.ServicePort {
nameAndProtocol := "http"
// TODO: Should not be hardcoded
if applicationPort == 5432 {
nameAndProtocol = "tcp"
}
return corev1.ServicePort{
Name: nameAndProtocol,
AppProtocol: &nameAndProtocol,
Port: int32(applicationPort),
TargetPort: intstr.FromInt(applicationPort),
}
}