848e45c22c
Co-authored-by: Julien Salleyron <julien@containo.us>
232 lines
4.4 KiB
Go
232 lines
4.4 KiB
Go
package kubernetes
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
corev1 "k8s.io/api/core/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/types"
|
|
)
|
|
|
|
func buildService(opts ...func(*corev1.Service)) *corev1.Service {
|
|
s := &corev1.Service{}
|
|
for _, opt := range opts {
|
|
opt(s)
|
|
}
|
|
return s
|
|
}
|
|
|
|
func sNamespace(value string) func(*corev1.Service) {
|
|
return func(i *corev1.Service) {
|
|
i.Namespace = value
|
|
}
|
|
}
|
|
|
|
func sName(value string) func(*corev1.Service) {
|
|
return func(i *corev1.Service) {
|
|
i.Name = value
|
|
}
|
|
}
|
|
|
|
func sUID(value types.UID) func(*corev1.Service) {
|
|
return func(i *corev1.Service) {
|
|
i.UID = value
|
|
}
|
|
}
|
|
|
|
func sAnnotation(name string, value string) func(*corev1.Service) {
|
|
return func(s *corev1.Service) {
|
|
if s.Annotations == nil {
|
|
s.Annotations = make(map[string]string)
|
|
}
|
|
s.Annotations[name] = value
|
|
}
|
|
}
|
|
|
|
func sSpec(opts ...func(*corev1.ServiceSpec)) func(*corev1.Service) {
|
|
return func(s *corev1.Service) {
|
|
spec := &corev1.ServiceSpec{}
|
|
for _, opt := range opts {
|
|
opt(spec)
|
|
}
|
|
s.Spec = *spec
|
|
}
|
|
}
|
|
|
|
func sLoadBalancerStatus(opts ...func(*corev1.LoadBalancerStatus)) func(service *corev1.Service) {
|
|
return func(s *corev1.Service) {
|
|
loadBalancer := &corev1.LoadBalancerStatus{}
|
|
for _, opt := range opts {
|
|
if opt != nil {
|
|
opt(loadBalancer)
|
|
}
|
|
}
|
|
s.Status = corev1.ServiceStatus{
|
|
LoadBalancer: *loadBalancer,
|
|
}
|
|
}
|
|
}
|
|
|
|
func sLoadBalancerIngress(ip string, hostname string) func(*corev1.LoadBalancerStatus) {
|
|
return func(status *corev1.LoadBalancerStatus) {
|
|
ingress := corev1.LoadBalancerIngress{
|
|
IP: ip,
|
|
Hostname: hostname,
|
|
}
|
|
status.Ingress = append(status.Ingress, ingress)
|
|
}
|
|
}
|
|
|
|
func clusterIP(ip string) func(*corev1.ServiceSpec) {
|
|
return func(spec *corev1.ServiceSpec) {
|
|
spec.ClusterIP = ip
|
|
}
|
|
}
|
|
|
|
func sType(value corev1.ServiceType) func(*corev1.ServiceSpec) {
|
|
return func(spec *corev1.ServiceSpec) {
|
|
spec.Type = value
|
|
}
|
|
}
|
|
|
|
func sExternalName(name string) func(*corev1.ServiceSpec) {
|
|
return func(spec *corev1.ServiceSpec) {
|
|
spec.ExternalName = name
|
|
}
|
|
}
|
|
|
|
func sPorts(opts ...func(*corev1.ServicePort)) func(*corev1.ServiceSpec) {
|
|
return func(spec *corev1.ServiceSpec) {
|
|
for _, opt := range opts {
|
|
p := &corev1.ServicePort{}
|
|
opt(p)
|
|
spec.Ports = append(spec.Ports, *p)
|
|
}
|
|
}
|
|
}
|
|
|
|
func sPort(port int32, name string) func(*corev1.ServicePort) {
|
|
return func(sp *corev1.ServicePort) {
|
|
sp.Port = port
|
|
sp.Name = name
|
|
}
|
|
}
|
|
|
|
// Test
|
|
|
|
func TestBuildService(t *testing.T) {
|
|
actual1 := buildService(
|
|
sName("service1"),
|
|
sNamespace("testing"),
|
|
sUID("1"),
|
|
sSpec(
|
|
clusterIP("10.0.0.1"),
|
|
sPorts(sPort(80, "")),
|
|
),
|
|
)
|
|
|
|
assert.EqualValues(t, sampleService1(), actual1)
|
|
|
|
actual2 := buildService(
|
|
sName("service2"),
|
|
sNamespace("testing"),
|
|
sUID("2"),
|
|
sSpec(
|
|
clusterIP("10.0.0.2"),
|
|
sType("ExternalName"),
|
|
sExternalName("example.com"),
|
|
sPorts(
|
|
sPort(80, "http"),
|
|
sPort(443, "https"),
|
|
),
|
|
),
|
|
)
|
|
|
|
assert.EqualValues(t, sampleService2(), actual2)
|
|
|
|
actual3 := buildService(
|
|
sName("service3"),
|
|
sNamespace("testing"),
|
|
sUID("3"),
|
|
sSpec(
|
|
clusterIP("10.0.0.3"),
|
|
sType("ExternalName"),
|
|
sExternalName("example.com"),
|
|
sPorts(
|
|
sPort(8080, "http"),
|
|
sPort(8443, "https"),
|
|
),
|
|
),
|
|
)
|
|
|
|
assert.EqualValues(t, sampleService3(), actual3)
|
|
}
|
|
|
|
func sampleService1() *corev1.Service {
|
|
return &corev1.Service{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "service1",
|
|
UID: "1",
|
|
Namespace: "testing",
|
|
},
|
|
Spec: corev1.ServiceSpec{
|
|
ClusterIP: "10.0.0.1",
|
|
Ports: []corev1.ServicePort{
|
|
{
|
|
Port: 80,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func sampleService2() *corev1.Service {
|
|
return &corev1.Service{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "service2",
|
|
UID: "2",
|
|
Namespace: "testing",
|
|
},
|
|
Spec: corev1.ServiceSpec{
|
|
ClusterIP: "10.0.0.2",
|
|
Type: "ExternalName",
|
|
ExternalName: "example.com",
|
|
Ports: []corev1.ServicePort{
|
|
{
|
|
Name: "http",
|
|
Port: 80,
|
|
},
|
|
{
|
|
Name: "https",
|
|
Port: 443,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func sampleService3() *corev1.Service {
|
|
return &corev1.Service{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "service3",
|
|
UID: "3",
|
|
Namespace: "testing",
|
|
},
|
|
Spec: corev1.ServiceSpec{
|
|
ClusterIP: "10.0.0.3",
|
|
Type: "ExternalName",
|
|
ExternalName: "example.com",
|
|
Ports: []corev1.ServicePort{
|
|
{
|
|
Name: "http",
|
|
Port: 8080,
|
|
},
|
|
{
|
|
Name: "https",
|
|
Port: 8443,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
}
|