Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement ori load balancers #591

Merged
merged 1 commit into from
Dec 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions broker/machinebroker/aliasprefixes/aliasprefixes.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ func (m *AliasPrefixes) getAliasPrefixByKey(ctx context.Context, key aliasPrefix

aliasPrefixes := m.filterAliasPrefixes(aliasPrefixList.Items)

switch len(aliasPrefixList.Items) {
switch len(aliasPrefixes) {
case 0:
return nil, nil, false, nil
case 1:
Expand Down Expand Up @@ -122,7 +122,7 @@ func (m *AliasPrefixes) createAliasPrefix(
}
apiutils.SetManagerLabel(aliasPrefix, machinebrokerv1alpha1.MachineBrokerManager)
apiutils.SetNetworkHandle(aliasPrefix, key.networkHandle)
apiutils.SetPrefix(aliasPrefix, key.prefix)
apiutils.SetPrefixLabel(aliasPrefix, key.prefix)

if err := m.cluster.Client().Create(ctx, aliasPrefix); err != nil {
return nil, nil, fmt.Errorf("error creating alias prefix: %w", err)
Expand All @@ -132,16 +132,16 @@ func (m *AliasPrefixes) createAliasPrefix(
aliasPrefixRouting := &networkingv1alpha1.AliasPrefixRouting{
ObjectMeta: metav1.ObjectMeta{
Namespace: m.cluster.Namespace(),
Name: m.cluster.IDGen().Generate(),
Name: aliasPrefix.Name,
},
NetworkRef: commonv1alpha1.LocalUIDReference{
Name: network.Name,
UID: network.UID,
},
}
apiutils.SetManagerLabel(aliasPrefix, machinebrokerv1alpha1.MachineBrokerManager)
apiutils.SetNetworkHandle(aliasPrefix, key.networkHandle)
apiutils.SetPrefix(aliasPrefix, key.prefix)
apiutils.SetManagerLabel(aliasPrefixRouting, machinebrokerv1alpha1.MachineBrokerManager)
apiutils.SetNetworkHandle(aliasPrefixRouting, key.networkHandle)
apiutils.SetPrefixLabel(aliasPrefixRouting, key.prefix)
if err := ctrl.SetControllerReference(aliasPrefix, aliasPrefixRouting, m.cluster.Scheme()); err != nil {
return nil, nil, fmt.Errorf("error setting alias prefix routing to be controlled by alias prefix: %w", err)
}
Expand Down Expand Up @@ -336,8 +336,8 @@ func (m *AliasPrefixes) joinAliasPrefixesAndRoutings(
for i := range aliasPrefixes {
aliasPrefix := &aliasPrefixes[i]

prefix := aliasPrefix.Status.Prefix
if prefix == nil {
prefixSrc := aliasPrefix.Spec.Prefix
if prefixSrc.Value == nil {
continue
}

Expand All @@ -360,7 +360,7 @@ func (m *AliasPrefixes) joinAliasPrefixesAndRoutings(

res = append(res, AliasPrefix{
NetworkHandle: networkHandle,
Prefix: *aliasPrefix.Status.Prefix,
Prefix: *prefixSrc.Value,
Destinations: destinations,
})
}
Expand Down
18 changes: 18 additions & 0 deletions broker/machinebroker/api/v1alpha1/common_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@

package v1alpha1

import (
commonv1alpha1 "github.com/onmetal/onmetal-api/api/common/v1alpha1"
corev1 "k8s.io/api/core/v1"
)

const (
LabelsAnnotation = "machinebroker.api.onmetal.de/labels"

Expand All @@ -32,6 +37,8 @@ const (
NetworkHandleLabel = "machinebrokerlet.api.onmetal.de/network-handle"

PrefixLabel = "machinebrokerlet.api.onmetal.de/prefix"

IPLabel = "machinebrokerlet.api.onmetal.de/ip"
)

const (
Expand All @@ -43,3 +50,14 @@ const (

NetworkInterfacePurpose = "network-interface"
)

type LoadBalancerTarget struct {
IP commonv1alpha1.IP
Ports []LoadBalancerTargetPort
}

type LoadBalancerTargetPort struct {
Protocol corev1.Protocol
Port int32
EndPort int32
}
60 changes: 56 additions & 4 deletions broker/machinebroker/apiutils/apiutils.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,44 @@ import (

"github.com/onmetal/controller-utils/metautils"
commonv1alpha1 "github.com/onmetal/onmetal-api/api/common/v1alpha1"
networkingv1alpha1 "github.com/onmetal/onmetal-api/api/networking/v1alpha1"
machinebrokerv1alpha1 "github.com/onmetal/onmetal-api/broker/machinebroker/api/v1alpha1"
orimeta "github.com/onmetal/onmetal-api/ori/apis/meta/v1alpha1"
"golang.org/x/exp/slices"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
)

func ConvertNetworkingLoadBalancerPort(port networkingv1alpha1.LoadBalancerPort) machinebrokerv1alpha1.LoadBalancerTargetPort {
protocol := port.Protocol
if protocol == nil {
tcpProtocol := corev1.ProtocolTCP
protocol = &tcpProtocol
}

endPort := port.EndPort
if endPort == nil {
endPort = &port.Port
}

return machinebrokerv1alpha1.LoadBalancerTargetPort{
Protocol: *protocol,
Port: port.Port,
EndPort: *endPort,
}
}

func ConvertNetworkingLoadBalancerPorts(ports []networkingv1alpha1.LoadBalancerPort) []machinebrokerv1alpha1.LoadBalancerTargetPort {
res := make([]machinebrokerv1alpha1.LoadBalancerTargetPort, len(ports))
for i, port := range ports {
res[i] = ConvertNetworkingLoadBalancerPort(port)
}
return res
}

func GetObjectMetadata(o metav1.Object) (*orimeta.ObjectMetadata, error) {
annotations, err := GetAnnotationsAnnotation(o)
if err != nil {
Expand Down Expand Up @@ -154,28 +183,51 @@ func GetAnnotationsAnnotation(o metav1.Object) (map[string]string, error) {
return annotations, nil
}

var (
ipAndPrefixReplacer = strings.NewReplacer("/", "-", ":", "_")
reverseIPAndPrefixReplacer = strings.NewReplacer("-", "/", "_", ":")
)

func SetNetworkHandle(o metav1.Object, handle string) {
metautils.SetLabel(o, machinebrokerv1alpha1.NetworkHandleLabel, handle)
}

func EscapePrefix(prefix commonv1alpha1.IPPrefix) string {
return strings.NewReplacer("/", "-").Replace(prefix.String())
return ipAndPrefixReplacer.Replace(prefix.String())
}

func UnescapePrefix(escapedPrefix string) (commonv1alpha1.IPPrefix, error) {
unescaped := strings.NewReplacer("-", "/").Replace(escapedPrefix)
unescaped := reverseIPAndPrefixReplacer.Replace(escapedPrefix)
return commonv1alpha1.ParseIPPrefix(unescaped)
}

func SetPrefix(o metav1.Object, prefix commonv1alpha1.IPPrefix) {
func SetPrefixLabel(o metav1.Object, prefix commonv1alpha1.IPPrefix) {
metautils.SetLabel(o, machinebrokerv1alpha1.PrefixLabel, EscapePrefix(prefix))
}

func GetPrefix(o metav1.Object) (commonv1alpha1.IPPrefix, error) {
func GetPrefixLabel(o metav1.Object) (commonv1alpha1.IPPrefix, error) {
escapedPrefix := o.GetLabels()[machinebrokerv1alpha1.PrefixLabel]
return UnescapePrefix(escapedPrefix)
}

func EscapeIP(ip commonv1alpha1.IP) string {
return ipAndPrefixReplacer.Replace(ip.String())
}

func UnescapeIP(escaped string) (commonv1alpha1.IP, error) {
unescaped := reverseIPAndPrefixReplacer.Replace(escaped)
return commonv1alpha1.ParseIP(unescaped)
}

func SetIPLabel(o metav1.Object, ip commonv1alpha1.IP) {
metautils.SetLabel(o, machinebrokerv1alpha1.IPLabel, EscapeIP(ip))
}

func GetIPLabel(o metav1.Object) (commonv1alpha1.IP, error) {
escaped := o.GetLabels()[machinebrokerv1alpha1.IPLabel]
return UnescapeIP(escaped)
}

func SetManagerLabel(o metav1.Object, manager string) {
metautils.SetLabel(o, machinebrokerv1alpha1.ManagerLabel, manager)
}
Expand Down
Loading