-
Notifications
You must be signed in to change notification settings - Fork 0
/
ingress-builder.go
133 lines (117 loc) · 3.54 KB
/
ingress-builder.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// Copyright (c) 2024 Benjamin Borbe All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package k8s
import (
"context"
"github.com/bborbe/errors"
"github.com/bborbe/validation"
v1 "k8s.io/api/networking/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
//counterfeiter:generate -o mocks/k8s-ingress-builder.go --fake-name K8sIngressBuilder . IngressBuilder
type IngressBuilder interface {
Build(ctx context.Context) (*v1.Ingress, error)
SetObjectMetaBuilder(objectMetaBuilder ObjectMetaBuilder) IngressBuilder
SetHost(host string) IngressBuilder
SetServiceName(serviceName string) IngressBuilder
SetPath(path string) IngressBuilder
SetIngressClassName(ingressClassName string) IngressBuilder
}
func NewIngressBuilder() IngressBuilder {
return &ingressBuilder{
serverPortName: "http",
ingressClassName: "traefik",
pathType: v1.PathTypePrefix,
path: "/",
}
}
type ingressBuilder struct {
serviceName string
host string
ingressClassName string
serverPortName string
pathType v1.PathType
path string
objectMetaBuilder ObjectMetaBuilder
}
func (i *ingressBuilder) SetHost(host string) IngressBuilder {
i.host = host
return i
}
func (i *ingressBuilder) SetServiceName(serviceName string) IngressBuilder {
i.serviceName = serviceName
return i
}
func (i *ingressBuilder) SetServerPortName(serverPortName string) IngressBuilder {
i.serverPortName = serverPortName
return i
}
func (i *ingressBuilder) SetPath(path string) IngressBuilder {
i.path = path
return i
}
func (i *ingressBuilder) SetPathType(pathType v1.PathType) IngressBuilder {
i.pathType = pathType
return i
}
func (i *ingressBuilder) SetObjectMetaBuilder(objectMetaBuilder ObjectMetaBuilder) IngressBuilder {
i.objectMetaBuilder = objectMetaBuilder
return i
}
func (i *ingressBuilder) SetIngressClassName(ingressClassName string) IngressBuilder {
i.ingressClassName = ingressClassName
return i
}
func (i *ingressBuilder) Validate(ctx context.Context) error {
return validation.All{
validation.Name("Host", NotEmptyString(i.host)),
validation.Name("IngressClassName", NotEmptyString(i.ingressClassName)),
validation.Name("Path", NotEmptyString(i.path)),
validation.Name("ServerPortName", NotEmptyString(i.serverPortName)),
validation.Name("ServiceName", NotEmptyString(i.serviceName)),
validation.Name("ObjectMetaBuilder", validation.NotNilAndValid(i.objectMetaBuilder)),
}.Validate(ctx)
}
func (i *ingressBuilder) Build(ctx context.Context) (*v1.Ingress, error) {
if err := i.Validate(ctx); err != nil {
return nil, errors.Wrapf(ctx, err, "validate ingressBuilder failed")
}
objectMeta, err := i.objectMetaBuilder.Build(ctx)
if err != nil {
return nil, errors.Wrapf(ctx, err, "build objectMeta failed")
}
return &v1.Ingress{
TypeMeta: metav1.TypeMeta{
Kind: "Ingress",
APIVersion: "networking.k8s.io/v1",
},
ObjectMeta: *objectMeta,
Spec: v1.IngressSpec{
IngressClassName: &i.ingressClassName,
Rules: []v1.IngressRule{
{
Host: i.host,
IngressRuleValue: v1.IngressRuleValue{
HTTP: &v1.HTTPIngressRuleValue{
Paths: []v1.HTTPIngressPath{
{
Path: "/",
PathType: &i.pathType,
Backend: v1.IngressBackend{
Service: &v1.IngressServiceBackend{
Name: i.serviceName,
Port: v1.ServiceBackendPort{
Name: i.serverPortName,
},
},
},
},
},
},
},
},
},
},
}, nil
}